{"version":3,"file":"scripts.js","mappings":"AAAA;AACA,eAAe,aAAa,uGAAuG,2EAA2E,YAAY,MAAM,uDAAuD,aAAa,oEAAoE,uBAAuB,aAAa,6BAA6B,6BAA6B,sEAAsE,eAAe,mFAAmF,eAAe,6BAA6B,kBAAkB,qCAAqC,kBAAkB,2CAA2C,0FAA0F,gDAAgD,cAAc,6FAA6F,0CAA0C,4BAA4B,cAAc,yCAAyC,4EAA4E,iBAAiB,8DAA8D,oBAAoB,oDAAoD,qBAAqB,iBAAiB,6DAA6D,uBAAuB,qCAAqC,2BAA2B,kBAAkB,uBAAuB,iBAAiB,gDAAgD,qBAAqB,GAAG,kBAAkB,gDAAgD,kBAAkB,kBAAkB,iBAAiB,mBAAmB,iBAAiB,iDAAiD,cAAc,GAAG,gBAAgB,iDAAiD,WAAW,GAAG,gBAAgB,iCAAiC,8CAA8C,gBAAgB,2CAA2C,sCAAsC,mCAAmC,kCAAkC,6BAA6B,gDAAgD,qCAAqC,sBAAsB,IAAI,wLAAwL,mDAAmD,SAAS,YAAY,kFAAkF,mBAAmB,kBAAkB,2BAA2B,QAAQ,sIAAsI,2BAA2B,MAAM,oBAAoB,SAAS,4BAA4B,KAAK,iBAAiB,IAAI,oBAAoB,UAAU,SAAS,eAAe,IAAI,sCAAsC,kDAAkD,SAAS,kBAAkB,4BAA4B,mCAAmC,kGAAkG,yBAAyB,YAAY,kFAAkF,yBAAyB,iCAAiC,sBAAsB,kEAAkE,wCAAwC,qBAAqB,mCAAmC,IAAI,gBAAgB,oBAAoB,sBAAsB,iCAAiC,IAAI,iCAAiC,SAAS,qBAAqB,iBAAiB,uBAAuB,IAAI,qCAAqC,iDAAiD,YAAY,mBAAmB,kLAAkL,oCAAoC,EAAE,+HAA+H,0BAA0B,sBAAsB,6HAA6H,qDAAqD,gBAAgB,+FAA+F,8BAA8B,2BAA2B,cAAc,YAAY,0FAA0F,uBAAuB,sJAAsJ,IAAI,ucAAuc,8cAA8c,gIAAgI,IAAI,iDAAiD,4BAA4B,2FAA2F,cAAc,IAAI,iBAAiB,wCAAwC,EAAE,+BAA+B,EAAE,IAAI,mFAAmF,SAAS,GAAG,oBAAoB,uBAAuB,kBAAkB,mCAAmC,oBAAoB,wDAAwD,iEAAiE,wBAAwB,oCAAoC,UAAU,qCAAqC,iCAAiC,mFAAmF,KAAK,sDAAsD,sFAAsF,8BAA8B,0CAA0C,6IAA6I,8CAA8C,cAAc,IAAI,0CAA0C,SAAS,QAAQ,QAAQ,iCAAiC,oCAAoC,aAAa,SAAS,uBAAuB,oEAAoE,cAAc,iBAAiB,cAAc,kCAAkC,IAAI,aAAa,SAAS,SAAS,QAAQ,kDAAkD,cAAc,mBAAmB,kCAAkC,cAAc,mBAAmB,mDAAmD,cAAc,mBAAmB,qNAAqN,cAAc,qBAAqB,4BAA4B,oCAAoC,yCAAyC,EAAE,EAAE,cAAc,wDAAwD,cAAc,gCAAgC,uQAAuQ,oGAAoG,qCAAqC,qBAAqB,wBAAwB,oCAAoC,yBAAyB,IAAI,6CAA6C,SAAS,UAAU,sCAAsC,qBAAqB,mBAAmB,iCAAiC,yBAAyB,4CAA4C,0BAA0B,iBAAiB,2BAA2B,qBAAqB,mBAAmB,uEAAuE,uBAAuB,yBAAyB,4CAA4C,gCAAgC,MAAM,uDAAuD,6BAA6B,sEAAsE,UAAU,2BAA2B,iGAAiG,4BAA4B,sFAAsF,oBAAoB,MAAM,swBAAswB,gFAAgF,uBAAuB,4DAA4D,sRAAsR,IAAI,iCAAiC,wBAAwB,iCAAiC,2CAA2C,kBAAkB,0EAA0E,SAAS,QAAQ,gCAAgC,0BAA0B,qDAAqD,sBAAsB,8BAA8B,gGAAgG,sCAAsC,qBAAqB,6DAA6D,2BAA2B,mBAAmB,mEAAmE,uCAAuC,4BAA4B,gBAAgB,6BAA6B,qDAAqD,aAAa,mDAAmD,QAAQ,WAAW,KAAK,0BAA0B,MAAM,iBAAiB,MAAM,+BAA+B,MAAM,uBAAuB,YAAY,iBAAiB,qHAAqH,mBAAmB,+LAA+L,oBAAoB,oBAAoB,oLAAoL,SAAS,gBAAgB,mCAAmC,yBAAyB,SAAS,aAAa,gBAAgB,mBAAmB,eAAe,uEAAuE,0HAA0H,EAAE,sBAAsB,mBAAmB,kBAAkB,iQAAiQ,2BAA2B,kEAAkE,gCAAgC,qBAAqB,iBAAiB,iHAAiH,MAAM,MAAM,SAAS,IAAI,kDAAkD,kCAAkC,SAAS,wCAAwC,yBAAyB,oDAAoD,sEAAsE,aAAa,OAAO,oCAAoC,iIAAiI,0BAA0B,mCAAmC,sBAAsB,uFAAuF,uGAAuG,0BAA0B,4CAA4C,cAAc,gBAAgB,KAAK,UAAU,kBAAkB,uCAAuC,gCAAgC,kCAAkC,qCAAqC,kBAAkB,gDAAgD,oBAAoB,mBAAmB,wBAAwB,yBAAyB,oCAAoC,iDAAiD,qBAAqB,iGAAiG,MAAM,GAAG,qHAAqH,wCAAwC,UAAU,qBAAqB,oCAAoC,4BAA4B,kBAAkB,aAAa,mBAAmB,sBAAsB,IAAI,uBAAuB,WAAW,kDAAkD,kDAAkD,gEAAgE,sBAAsB,gEAAgE,mBAAmB,mBAAmB,EAAE,yCAAyC,SAAS,oBAAoB,0BAA0B,oBAAoB,0BAA0B,mBAAmB,0BAA0B,oBAAoB,wDAAwD,kBAAkB,MAAM,oGAAoG,oBAAoB,UAAU,uBAAuB,YAAY,uBAAuB,kBAAkB,uBAAuB,YAAY,IAAI,eAAe,SAAS,sBAAsB,YAAY,IAAI,eAAe,SAAS,uBAAuB,MAAM,sBAAsB,OAAO,WAAW,SAAS,uBAAuB,oBAAoB,MAAM,WAAW,SAAS,GAAG,4BAA4B,kDAAkD,mBAAmB,SAAS,mBAAmB,mBAAmB,cAAc,gBAAgB,6BAA6B,2BAA2B,uBAAuB,SAAS,mHAAmH,kCAAkC,4FAA4F,yBAAyB,uBAAuB,YAAY,+CAA+C,cAAc,4BAA4B,IAAI,kBAAkB,SAAS,kBAAkB,wDAAwD,+BAA+B,kDAAkD,SAAS,iBAAiB,gBAAgB,MAAM,uDAAuD,0DAA0D,uBAAuB,KAAK,iDAAiD,iCAAiC,UAAU,cAAc,kCAAkC,eAAe,mCAAmC,SAAS,MAAM,sBAAsB,wCAAwC,IAAI,uDAAuD,SAAS,yBAAyB,qEAAqE,sDAAsD,uBAAuB,IAAI,gBAAgB,SAAS,wDAAwD,0CAA0C,gCAAgC,2CAA2C,MAAM,SAAS,MAAM,gBAAgB,mCAAmC,iBAAiB,WAAW,kEAAkE,oEAAoE,EAAE,eAAe,8FAA8F,aAAa,uBAAuB,sBAAsB,0BAA0B,wDAAwD,gBAAgB,EAAE,IAAI,6CAA6C,KAAK,wDAAwD,UAAU,IAAI,mCAAmC,kDAAkD,+BAA+B,6EAA6E,UAAU,YAAY,iBAAiB,qCAAqC,OAAO,uBAAuB,8CAA8C,gEAAgE,2GAA2G,sBAAsB,sBAAsB,KAAK,SAAS,uCAAuC,+BAA+B,YAAY,MAAM,SAAS,iCAAiC,kBAAkB,IAAI,0BAA0B,MAAM,+CAA+C,OAAO,+DAA+D,sBAAsB,wBAAwB,SAAS,qBAAqB,iEAAiE,yBAAyB,oGAAoG,iEAAiE,sDAAsD,oCAAoC,WAAW,qCAAqC,0FAA0F,2DAA2D,QAAQ,iEAAiE,oIAAoI,gEAAgE,4PAA4P,GAAG,sBAAsB,sBAAsB,kDAAkD,wBAAwB,UAAU,SAAS,iBAAiB,aAAa,EAAE,iDAAiD,SAAS,kGAAkG,kBAAkB,oCAAoC,0BAA0B,mCAAmC,iBAAiB,2CAA2C,0BAA0B,mBAAmB,0BAA0B,WAAW,qIAAqI,sBAAsB,GAAG,eAAe,iBAAiB,6BAA6B,oEAAoE,QAAQ,IAAI,uCAAuC,GAAG,6BAA6B,IAAI,sBAAsB,8BAA8B,oBAAoB,wCAAwC,iBAAiB,wCAAwC,gBAAgB,qEAAqE,EAAE,8CAA8C,4BAA4B,QAAQ,kBAAkB,8BAA8B,qJAAqJ,SAAS,4LAA4L,YAAY,iEAAiE,6GAA6G,0BAA0B,0CAA0C,yCAAyC,gBAAgB,gCAAgC,SAAS,cAAc,gBAAgB,4BAA4B,8BAA8B,YAAY,IAAI,uCAAuC,EAAE,uBAAuB,yDAAyD,mBAAmB,IAAI,kBAAkB,SAAS,iGAAiG,UAAU,MAAM,qDAAqD,mBAAmB,8IAA8I,mBAAmB,mEAAmE,qBAAqB,oEAAoE,WAAW,mBAAmB,mBAAmB,iCAAiC,qBAAqB,yBAAyB,8BAA8B,2BAA2B,kBAAkB,0BAA0B,kBAAkB,8BAA8B,qBAAqB,0BAA0B,qBAAqB,8BAA8B,2BAA2B,4BAA4B,2BAA2B,gCAAgC,sBAAsB,0BAA0B,gBAAgB,sBAAsB,uBAAuB,sBAAsB,uIAAuI,eAAe,uBAAuB,uBAAuB,+JAA+J,EAAE,0BAA0B,cAAc,SAAS,cAAc,QAAQ,oBAAoB,MAAM,IAAI,sGAAsG,SAAS,qBAAqB,yBAAyB,QAAQ,8BAA8B,sCAAsC,QAAQ,iBAAiB,IAAI,wCAAwC,uBAAuB,SAAS,MAAM,YAAY,gFAAgF,qCAAqC,IAAI,eAAe,yDAAyD,wBAAwB,sEAAsE,EAAE,6BAA6B,mBAAmB,uCAAuC,MAAM,uDAAuD,OAAO,iBAAiB,uCAAuC,kBAAkB,sBAAsB,oBAAoB,0BAA0B,qBAAqB,SAAS,iBAAiB,kCAAkC,mBAAmB,UAAU,wBAAwB,oEAAoE,iBAAiB,uCAAuC,kBAAkB,YAAY,SAAS,YAAY,qBAAqB,4QAA4Q,iBAAiB,SAAS,mBAAmB,8CAA8C,qBAAqB,sBAAsB,iBAAiB,gBAAgB,+BAA+B,wBAAwB,0BAA0B,mBAAmB,iCAAiC,mHAAmH,EAAE,SAAS,YAAY,sBAAsB,QAAQ,oBAAoB,kBAAkB,oCAAoC,QAAQ,WAAW,kFAAkF,8MAA8M,kBAAkB,IAAI,IAAI,SAAS,sHAAsH,qJAAqJ,+BAA+B,oGAAoG,YAAY,qBAAqB,iCAAiC,MAAM,+BAA+B,kBAAkB,kCAAkC,IAAI,oGAAoG,2DAA2D,2BAA2B,gCAAgC,kBAAkB,yFAAyF,mBAAmB,iFAAiF,2GAA2G,gCAAgC,oBAAoB,EAAE,+DAA+D,wCAAwC,mHAAmH,+BAA+B,yBAAyB,QAAQ,GAAG,oBAAoB,aAAa,wFAAwF,wBAAwB,sCAAsC,qBAAqB,OAAO,YAAY,yCAAyC,kGAAkG,yMAAyM,8BAA8B,6BAA6B,wDAAwD,yFAAyF,uBAAuB,WAAW,IAAI,2CAA2C,qCAAqC,yBAAyB,gBAAgB,uBAAuB,cAAc,uCAAuC,kBAAkB,qDAAqD,aAAa,gCAAgC,qBAAqB,kBAAkB,sBAAsB,eAAe,2EAA2E,wBAAwB,MAAM,qBAAqB,sBAAsB,gCAAgC,6BAA6B,SAAS,mBAAmB,uEAAuE,wBAAwB,oGAAoG,sBAAsB,wBAAwB,eAAe,eAAe,uEAAuE,yBAAyB,+FAA+F,qBAAqB,sBAAsB,0CAA0C,6BAA6B,SAAS,2BAA2B,kBAAkB,QAAQ,mHAAmH,IAAI,wFAAwF,UAAU,aAAa,cAAc,SAAS,WAAW,oBAAoB,kCAAkC,sBAAsB,uBAAuB,0BAA0B,cAAc,uBAAuB,uBAAuB,2BAA2B,eAAe,gBAAgB,mBAAmB,sCAAsC,eAAe,uEAAuE,WAAW,kFAAkF,2BAA2B,SAAS,8CAA8C,cAAc,qBAAqB,MAAM,+EAA+E,qBAAqB,gBAAgB,EAAE,oCAAoC,wBAAwB,4BAA4B,iBAAiB,GAAG,aAAa,sBAAsB,MAAM,uHAAuH,uBAAuB,UAAU,iEAAiE,4GAA4G,gBAAgB,2BAA2B,2BAA2B,qBAAqB,iCAAiC,iDAAiD,0BAA0B,EAAE,GAAG,gBAAgB,oBAAoB,QAAQ,uHAAuH,yBAAyB,yEAAyE,EAAE,qBAAqB,4BAA4B,mBAAmB,EAAE,wBAAwB,8BAA8B,uBAAuB,4DAA4D,2BAA2B,6CAA6C,wEAAwE,yBAAyB,EAAE,0KAA0K,sCAAsC,IAAI,aAAa,8BAA8B,0EAA0E,EAAE,qBAAqB,iGAAiG,qBAAqB,4BAA4B,eAAe,YAAY,sBAAsB,+GAA+G,gBAAgB,uBAAuB,mEAAmE,+BAA+B,uFAAuF,UAAU,iBAAiB,0CAA0C,IAAI,gYAAgY,QAAQ,IAAI,0CAA0C,SAAS,cAAc,gBAAgB,mBAAmB,iBAAiB,gBAAgB,oBAAoB,yEAAyE,yCAAyC,GAAG,EAAE,iHAAiH,4aAA4a,QAAQ,oMAAoM,iBAAiB,MAAM,iMAAiM,iBAAiB,uBAAuB,IAAI,0DAA0D,gJAAgJ,iBAAiB,EAAE,uBAAuB,qEAAqE,IAAI,uEAAuE,oBAAoB,0JAA0J,wBAAwB,yDAAyD,iCAAiC,qBAAqB,qDAAqD,2DAA2D,IAAI,8CAA8C,SAAS,6BAA6B,cAAc,SAAS,cAAc,SAAS,yBAAyB,QAAQ,uBAAuB,mEAAmE,SAAS,iHAAiH,oBAAoB,kCAAkC,2CAA2C,qDAAqD,2BAA2B,EAAE,mBAAmB,mCAAmC,iCAAiC,sBAAsB,2BAA2B,6BAA6B,oCAAoC,uJAAuJ,uHAAuH,6CAA6C,UAAU,SAAS,yBAAyB,qCAAqC,SAAS,0LAA0L,sGAAsG,sCAAsC,mGAAmG,6DAA6D,cAAc,mIAAmI,kQAAkQ,4BAA4B,mDAAmD,oBAAoB,oCAAoC,4EAA4E,yBAAyB,0HAA0H,yMAAyM,yGAAyG,iDAAiD,kDAAkD,sBAAsB,yJAAyJ,eAAe,mBAAmB,sBAAsB,0EAA0E,uCAAuC,6CAA6C,2BAA2B,0MAA0M,oGAAoG,6DAA6D,wBAAwB,gDAAgD,wDAAwD,SAAS,6EAA6E,aAAa,KAAK,IAAI,sIAAsI,kBAAkB,kBAAkB,EAAE,kCAAkC,2BAA2B,IAAI,uBAAuB,4CAA4C,kDAAkD,mDAAmD,YAAY,mDAAmD,iBAAiB,8BAA8B,kDAAkD,GAAG,EAAE,iBAAiB,uCAAuC,UAAU,MAAM,YAAY,QAAQ,kBAAkB,cAAc,oEAAoE,qBAAqB,cAAc,iEAAiE,sBAAsB,eAAe,6EAA6E,eAAe,yBAAyB,8EAA8E,gCAAgC,kDAAkD,wBAAwB,wDAAwD,kYAAkY,qBAAqB,6IAA6I,yBAAyB,oEAAoE,4BAA4B,yBAAyB,uEAAuE,qCAAqC,yBAAyB,iHAAiH,UAAU,8VAA8V,4BAA4B,gCAAgC,eAAe,cAAc,mBAAmB,6CAA6C,gGAAgG,mDAAmD,qBAAqB,iBAAiB,MAAM,0CAA0C,qEAAqE,oBAAoB,qBAAqB,qBAAqB,MAAM,4BAA4B,qFAAqF,sBAAsB,yBAAyB,gBAAgB,sBAAsB,iBAAiB,mFAAmF,8FAA8F,qBAAqB,qFAAqF,4GAA4G,WAAW,kGAAkG,eAAe,qBAAqB,6CAA6C,sCAAsC,8GAA8G,gBAAgB,qBAAqB,wBAAwB,uBAAuB,0BAA0B,qBAAqB,QAAQ,+JAA+J,uBAAuB,8BAA8B,YAAY,uFAAuF,4BAA4B,GAAG,EAAE,sGAAsG,iBAAiB,6FAA6F,eAAe,2DAA2D,eAAe,2FAA2F,iBAAiB,gBAAgB,mBAAmB,kGAAkG,IAAI,8BAA8B,2CAA2C,iBAAiB,qBAAqB,OAAO,mDAAmD,oFAAoF,cAAc,8CAA8C,EAAE,8FAA8F,2CAA2C,IAAI,oFAAoF,wDAAwD,IAAI,wKAAwK,uCAAuC,yCAAyC,SAAS,mBAAmB,mCAAmC,eAAe,mHAAmH,SAAS,WAAW,0BAA0B,SAAS,uBAAuB,2CAA2C,4GAA4G,IAAI,kKAAkK,mDAAmD,IAAI,kBAAkB,aAAa,+DAA+D,uBAAuB,qCAAqC,kBAAkB,aAAa,mBAAmB,qFAAqF,oBAAoB,sCAAsC,gBAAgB,mBAAmB,qBAAqB,oBAAoB,kBAAkB,kBAAkB,0BAA0B,6DAA6D,+EAA+E,EAAE,0BAA0B,mBAAmB,qCAAqC,oFAAoF,EAAE,oBAAoB,qCAAqC,6DAA6D,iBAAiB,gCAAgC,EAAE,mBAAmB,qCAAqC,sDAAsD,EAAE,kBAAkB,qCAAqC,kEAAkE,EAAE,kBAAkB,cAAc,kBAAkB,8DAA8D,YAAY,qBAAqB,sDAAsD,0BAA0B,EAAE,kBAAkB,0BAA0B,iBAAiB,mBAAmB,iDAAiD,iFAAiF,sBAAsB,IAAI,KAAK,IAAI,sBAAsB,mDAAmD,IAAI,WAAW,0BAA0B,0BAA0B,wBAAwB,SAAS,qCAAqC,sBAAsB,yEAAyE,KAAK,WAAW,yGAAyG,eAAe,qBAAqB,wCAAwC,KAAK,kEAAkE,0BAA0B,EAAE,wEAAwE,kCAAkC,iDAAiD,oBAAoB,aAAa,2CAA2C,uCAAuC,SAAS,gCAAgC,mBAAmB,mCAAmC,6SAA6S,iBAAiB,OAAO,eAAe,iDAAiD,kBAAkB,YAAY,aAAa,MAAM,mCAAmC,cAAc,WAAW,eAAe,UAAU,6CAA6C,cAAc,sBAAsB,gBAAgB,YAAY,WAAW,YAAY,UAAU,wCAAwC,6BAA6B,6KAA6K,cAAc,iCAAiC,kEAAkE,+JAA+J,6BAA6B,aAAa,2BAA2B,aAAa,0BAA0B,aAAa,+BAA+B,aAAa,0BAA0B,aAAa,iCAAiC,YAAY,gIAAgI,cAAc,kEAAkE,yRAAyR,GAAG,GAAG,mEAAmE,eAAe,4BAA4B,uCAAuC,gDAAgD,uCAAuC,QAAQ,uCAAuC,wDAAwD,KAAK,oCAAoC,mBAAmB,gBAAgB,gDAAgD,yBAAyB,kCAAkC,uCAAuC,KAAK,IAAI,6RAA6R,sGAAsG,mBAAmB,+IAA+I,eAAe,eAAe,SAAS,6SAA6S,uBAAuB,wCAAwC,WAAW,UAAU,SAAS,kBAAkB,MAAM,sBAAsB,sBAAsB,YAAY,iYAAiY,YAAY,yBAAyB,+CAA+C,wCAAwC,mHAAmH,mSAAmS,uBAAuB,iBAAiB,mNAAmN,2CAA2C,gBAAgB,oBAAoB,kIAAkI,iBAAiB,EAAE,qBAAqB,qIAAqI,iMAAiM,gEAAgE,iFAAiF,aAAa,YAAY,sCAAsC,QAAQ,WAAW,oCAAoC,eAAe,kBAAkB,mBAAmB,gBAAgB,uCAAuC,IAAI,mCAAmC,UAAU,yCAAyC,gBAAgB,kBAAkB,8BAA8B,YAAY,KAAK,qBAAqB,uBAAuB,IAAI,gCAAgC,SAAS,8CAA8C,0BAA0B,4BAA4B,0CAA0C,0JAA0J,gBAAgB,8BAA8B,4DAA4D,iBAAiB,gCAAgC,2SAA2S,6CAA6C,UAAU,gBAAgB,MAAM,yIAAyI,iBAAiB,+KAA+K,qCAAqC,gBAAgB,4DAA4D,YAAY,mBAAmB,SAAS,mBAAmB,+BAA+B,kBAAkB,uCAAuC,6DAA6D,cAAc,yHAAyH,cAAc,gCAAgC,UAAU,gBAAgB,iBAAiB,aAAa,UAAU,YAAY,IAAI,6CAA6C,kCAAkC,mBAAmB,yEAAyE,IAAI,mCAAmC,mBAAmB,qEAAqE,cAAc,eAAe,cAAc,sGAAsG,IAAI,uBAAuB,6FAA6F,cAAc,yBAAyB,uBAAuB,gBAAgB,2BAA2B,sHAAsH,oEAAoE,0BAA0B,kBAAkB,8BAA8B,iBAAiB,SAAS,IAAI,uBAAuB,sFAAsF,YAAY,mBAAmB,cAAc,qMAAqM,YAAY,yBAAyB,IAAI,2HAA2H,6LAA6L,iCAAiC,KAAK,2BAA2B,UAAU,mBAAmB,4BAA4B,kCAAkC,EAAE,uBAAuB,gCAAgC,yBAAyB,IAAI,uEAAuE,6BAA6B,2DAA2D,mDAAmD,mHAAmH,gBAAgB,mCAAmC,oBAAoB,qDAAqD,EAAE,2BAA2B,wDAAwD,0CAA0C,KAAK,4BAA4B,wXAAwX,YAAY,4HAA4H,6EAA6E,kEAAkE,UAAU,mDAAmD,8DAA8D,0EAA0E,0BAA0B,kDAAkD,2BAA2B,wCAAwC,KAAK,gEAAgE,gPAAgP,6DAA6D,GAAG,eAAe,yBAAyB,8DAA8D,UAAU,QAAQ,2BAA2B,yDAAyD,0BAA0B,OAAO,uCAAuC,qEAAqE,sBAAsB,kBAAkB,aAAa,oBAAoB,4FAA4F,6DAA6D,8BAA8B,qDAAqD,eAAe,IAAI,mFAAmF,0BAA0B,EAAE,oBAAoB,+CAA+C,kFAAkF,+EAA+E,IAAI,sEAAsE,QAAQ,IAAI,8CAA8C,gBAAgB,GAAG,iDAAiD,eAAe,yBAAyB,0FAA0F,WAAW,yEAAyE,eAAe,UAAU,eAAe,aAAa,kBAAkB,eAAe,yBAAyB,8BAA8B,qCAAqC,sBAAsB,kBAAkB,WAAW,0CAA0C,iCAAiC,yBAAyB,gCAAgC,0CAA0C,iBAAiB,uBAAuB,QAAQ,eAAe,+BAA+B,2BAA2B,wEAAwE,yBAAyB,kBAAkB,oBAAoB,EAAE,6PAA6P,6BAA6B,cAAc,mBAAmB,8CAA8C,wBAAwB,4BAA4B,sBAAsB,GAAG,aAAa,qBAAqB,qBAAqB,8WAA8W,YAAY,MAAM,kBAAkB,+CAA+C,cAAc,oDAAoD,0BAA0B,0BAA0B,0DAA0D,MAAM,oBAAoB,uDAAuD,+DAA+D,0BAA0B,sBAAsB,0BAA0B,+DAA+D,EAAE,gEAAgE,eAAe,iCAAiC,eAAe,mDAAmD,eAAe,6DAA6D,cAAc,mBAAmB,8CAA8C,wBAAwB,4BAA4B,8BAA8B,GAAG,aAAa,qBAAqB,qBAAqB,mMAAmM,YAAY,UAAU,gBAAgB,iCAAiC,gFAAgF,UAAU,qCAAqC,0CAA0C,gBAAgB,mBAAmB,wDAAwD,iBAAiB,mBAAmB,+DAA+D,kJAAkJ,oCAAoC,gBAAgB,qBAAqB,gBAAgB,kCAAkC,2CAA2C,wCAAwC,kDAAkD,QAAQ,WAAW,8CAA8C,6CAA6C,OAAO,yBAAyB,gBAAgB,kCAAkC,8CAA8C,yDAAyD,kDAAkD,QAAQ,WAAW,KAAK,OAAO,yDAAyD,6CAA6C,6BAA6B,2BAA2B,wDAAwD,kCAAkC,kDAAkD,8FAA8F,wBAAwB,WAAW,wDAAwD,yKAAyK,GAAG,sBAAsB,YAAY,YAAY,gFAAgF,UAAU,EAAE,aAAa,cAAc,gBAAgB,oBAAoB,sDAAsD,MAAM,wIAAwI,uBAAuB,oIAAoI,kLAAkL,aAAa,UAAU,QAAQ,gBAAgB,8BAA8B,iCAAiC,SAAS,gBAAgB,6FAA6F,kBAAkB,IAAI,wGAAwG,4BAA4B,UAAU,SAAS,mBAAmB,iDAAiD,iFAAiF,oCAAoC,0CAA0C,mBAAmB,kBAAkB,mEAAmE,gDAAgD,mDAAmD,EAAE,EAAE,uBAAuB,gBAAgB,SAAS,wBAAwB,QAAQ,sCAAsC,IAAI,mDAAmD,UAAU,wHAAwH,qBAAqB,oBAAoB,wDAAwD,qBAAqB,oBAAoB,0BAA0B,6GAA6G,+bAA+b,4CAA4C,2BAA2B,uDAAuD,EAAE,6BAA6B,oEAAoE,IAAI,uPAAuP,gUAAgU,0BAA0B,gCAAgC,sBAAsB,EAAE,4BAA4B,gBAAgB,sBAAsB,4BAA4B,2BAA2B,EAAE,8BAA8B,cAAc,wCAAwC,EAAE,8GAA8G,qBAAqB,MAAM,4CAA4C,4EAA4E,EAAE,kCAAkC,yCAAyC,uBAAuB,2BAA2B,iBAAiB,wEAAwE,oBAAoB,yEAAyE,wBAAwB,EAAE,+BAA+B,mBAAmB,eAAe,qBAAqB,uCAAuC,2BAA2B,2BAA2B,+BAA+B,8BAA8B,oBAAoB,gBAAgB,8GAA8G,oBAAoB,qBAAqB,0DAA0D,OAAO,wCAAwC,GAAG,wCAAwC,SAAS,EAAE,+GAA+G,MAAM,6CAA6C,eAAe,qBAAqB,gCAAgC,yCAAyC,0GAA0G,qBAAqB,QAAQ,UAAU,cAAc,MAAM,8CAA8C,eAAe,mFAAmF,IAAI,0CAA0C,iBAAiB,0CAA0C,2CAA2C,YAAY,8BAA8B,2BAA2B,wBAAwB,QAAQ,eAAe,+LAA+L,wBAAwB,mHAAmH,WAAW,4CAA4C,iBAAiB,0DAA0D,aAAa,6EAA6E,cAAc,mBAAmB,yBAAyB,2DAA2D,8DAA8D,2CAA2C,yCAAyC,sIAAsI,KAAK,KAAK,iBAAiB,2CAA2C,MAAM,MAAM,OAAO,KAAK,0FAA0F,yBAAyB,iCAAiC,kCAAkC,gBAAgB,gCAAgC,yEAAyE,8BAA8B,oCAAoC,wBAAwB,MAAM,gCAAgC,iCAAiC,YAAY,mBAAmB,WAAW,mCAAmC,sMAAsM,uBAAuB,IAAI,0FAA0F,SAAS,kBAAkB,mHAAmH,k4BAAk4B,yEAAyE,qEAAqE,iFAAiF,4DAA4D,kDAAkD,mBAAmB,aAAa,IAAI,iBAAiB,SAAS,aAAa,SAAS,0BAA0B,oBAAoB,kBAAkB,oHAAoH,uCAAuC,2FAA2F,uCAAuC,aAAa,MAAM,mBAAmB,KAAK,YAAY,oCAAoC,IAAI,MAAM,SAAS,OAAO,wCAAwC,6HAA6H,sBAAsB,kBAAkB,uBAAuB,iEAAiE,YAAY,8IAA8I,wBAAwB,sGAAsG,kDAAkD,MAAM,mCAAmC,SAAS,OAAO,SAAS,OAAO,iEAAiE,OAAO,wBAAwB,8hBAA8hB,SAAS,yBAAyB,4BAA4B,yBAAyB,oCAAoC,uCAAuC,wBAAwB,sDAAsD,yCAAyC,2BAA2B,+BAA+B,MAAM,sFAAsF,8BAA8B,gBAAgB,2EAA2E,2BAA2B,wBAAwB,sBAAsB,EAAE,eAAe,oBAAoB,MAAM,sJAAsJ,WAAW,gDAAgD,SAAS,qBAAqB,uBAAuB,kCAAkC,mCAAmC,uBAAuB,8BAA8B,kCAAkC,EAAE,kBAAkB,WAAW,6BAA6B,qCAAqC,EAAE,oBAAoB,kDAAkD,sCAAsC,QAAQ,qCAAqC,kCAAkC,qCAAqC,mEAAmE,gCAAgC,IAAI,6BAA6B,YAAY,QAAQ,eAAe,0BAA0B,kFAAkF,QAAQ,sCAAsC,mBAAmB,gBAAgB,2GAA2G,oLAAoL,cAAc,kBAAkB,uRAAuR,kBAAkB,EAAE,oBAAoB,8BAA8B,gHAAgH,2CAA2C,OAAO,EAAE,cAAc,IAAI,mCAAmC,SAAS,cAAc,kBAAkB,SAAS,+BAA+B,sCAAsC,gBAAgB,SAAS,mGAAmG,WAAW,iCAAiC,aAAa,0BAA0B,4BAA4B,wCAAwC,6DAA6D,wCAAwC,QAAQ,uCAAuC,mBAAmB,uCAAuC,QAAQ,kCAAkC,gCAAgC,wDAAwD,2BAA2B,kBAAkB,SAAS,EAAE,oCAAoC,cAAc,0CAA0C,yCAAyC,qBAAqB,gDAAgD,wKAAwK,iPAAiP,6CAA6C,gDAAgD,YAAY,qBAAqB,uHAAuH,WAAW,yKAAyK,qUAAqU,UAAU,4BAA4B,kCAAkC,yHAAyH,2CAA2C,mBAAmB,oEAAoE,0BAA0B,kBAAkB,sCAAsC,EAAE,OAAO,sCAAsC,qCAAqC,kBAAkB,SAAS,YAAY,0BAA0B,oDAAoD,gQAAgQ,wHAAwH,eAAe,mBAAmB,iEAAiE,8BAA8B,EAAE,kBAAkB,+FAA+F,kDAAkD,GAAG,aAAa,QAAQ,qBAAqB,YAAY,uBAAuB,cAAc,8DAA8D,KAAK,sEAAsE,6FAA6F,yHAAyH,OAAO,wFAAwF,yBAAyB,2BAA2B,wBAAwB,0DAA0D,YAAY,GAAG,WAAW,iDAAiD,eAAe,wBAAwB,qBAAqB,8BAA8B,MAAM,4EAA4E,yDAAyD,wBAAwB,uCAAuC,iDAAiD,4DAA4D,EAAE,WAAW,8BAA8B,eAAe,SAAS,yCAAyC,eAAe,uBAAuB,yFAAyF,8BAA8B,MAAM,iQAAiQ,kBAAkB,EAAE,qGAAqG,qBAAqB,qBAAqB,gBAAgB,qBAAqB,2BAA2B,sBAAsB,0BAA0B,4BAA4B,wBAAwB,4BAA4B,mEAAmE,qBAAqB,sDAAsD,2NAA2N,uBAAuB,+DAA+D,EAAE,6DAA6D,uBAAuB,UAAU,yFAAyF,qDAAqD,kCAAkC,0BAA0B,8BAA8B,iKAAiK,iBAAiB,4DAA4D,qBAAqB,0CAA0C,sEAAsE,UAAU,EAAE,yBAAyB,iCAAiC,iEAAiE,+CAA+C;;CCDj5qF;AACA;AACA;AACA;AACA;AACA,eAAe,2NAA2N,WAAW,qBAAqB,aAAa,cAAc,+CAA+C,WAAW,WAAW,gBAAgB,YAAY,WAAW,KAAK,WAAW,+GAA+G,kBAAkB,0EAA0E,YAAY,IAAI,aAAa,wDAAwD,YAAY,mBAAmB,KAAK,mBAAmB,sEAAsE,SAAS,yBAAyB,gBAAgB,0EAA0E,uBAAuB,QAAQ,sBAAsB,OAAO,oDAAoD,GAAG,yBAAyB,kCAAkC,SAAS,oCAAoC,oCAAoC,gBAAgB,6BAA6B,yBAAyB,IAAI,wCAAwC,SAAS,aAAa,8CAA8C,eAAe,qHAAqH,sFAAsF,oBAAoB,sBAAsB,kCAAkC,wBAAwB,kCAAkC,kBAAkB,uBAAuB,yBAAyB,iCAAiC,6DAA6D,2FAA2F,wDAAwD,+HAA+H,MAAM,4BAA4B,sDAAsD,qCAAqC,sBAAsB,sCAAsC,kFAAkF,4BAA4B,uJAAuJ,mDAAmD,wJAAwJ,kEAAkE,gBAAgB,wDAAwD,KAAK,0BAA0B,6BAA6B,UAAU,4CAA4C,6CAA6C,mFAAmF,mDAAmD,cAAc,gBAAgB,kBAAkB,2BAA2B,oBAAoB,uGAAuG,sBAAsB,yDAAyD,+BAA+B,uCAAuC,mFAAmF,kCAAkC,wCAAwC,iCAAiC,8BAA8B,WAAW,mEAAmE,4CAA4C,+CAA+C,8BAA8B,2BAA2B,6BAA6B,+BAA+B,0DAA0D,gCAAgC,6BAA6B,kCAAkC,uDAAuD,GAAG,8BAA8B,mBAAmB,qCAAqC,YAAY,6BAA6B,eAAe,KAAK,GAAG,mNAAmN,gDAAgD,oIAAoI,cAAc,iDAAiD,kBAAkB,2BAA2B,+EAA+E,MAAM,qCAAqC,MAAM,2EAA2E,KAAK,iCAAiC,+BAA+B,2KAA2K,sNAAsN,sBAAsB,yDAAyD,kCAAkC,6BAA6B,kCAAkC,iFAAiF,GAAG,YAAY,6BAA6B,eAAe,KAAK,GAAG,iEAAiE,mBAAmB,oJAAoJ,KAAK,yBAAyB,oGAAoG,8GAA8G,wEAAwE,wCAAwC,8DAA8D,8DAA8D,kGAAkG,IAAI,KAAK,gCAAgC,8EAA8E,4FAA4F,IAAI,KAAK,WAAW,kFAAkF,sHAAsH,iDAAiD,kIAAkI,iEAAiE,IAAI,gIAAgI,IAAI,wBAAwB,cAAc,gBAAgB,wdAAwd,kBAAkB,yBAAyB,gCAAgC,8BAA8B,+BAA+B,gFAAgF,mBAAmB,gCAAgC,qBAAqB,yMAAyM,qBAAqB,mRAAmR,kBAAkB,WAAW,mDAAmD,8CAA8C,gGAAgG,eAAe,GAAG,KAAK,+CAA+C,cAAc,+BAA+B,sBAAsB,4PAA4P,0BAA0B,aAAa,iCAAiC,2BAA2B,iCAAiC,aAAa,yBAAyB,sDAAsD,iCAAiC,WAAW,sFAAsF,qBAAqB,mGAAmG,kBAAkB,4CAA4C,kBAAkB,sDAAsD,sCAAsC,WAAW,yBAAyB,kBAAkB,wKAAwK,eAAe,gQAAgQ,kBAAkB,4BAA4B,wGAAwG,0BAA0B,0FAA0F,YAAY,oEAAoE,YAAY,oHAAoH,YAAY,oEAAoE,mBAAmB,2HAA2H,IAAI,mEAAmE,YAAY,KAAK,wBAAwB,6DAA6D,uCAAuC,MAAM,wCAAwC,6BAA6B,4HAA4H,qCAAqC,mEAAmE,qDAAqD,0CAA0C,8DAA8D,oCAAoC,wHAAwH,wCAAwC,EAAE,6CAA6C,0CAA0C,4BAA4B,yEAAyE,4BAA4B,8DAA8D,6BAA6B,8BAA8B,0DAA0D,MAAM,mDAAmD,wLAAwL,wBAAwB,kKAAkK,4KAA4K,kEAAkE,4FAA4F,yBAAyB,wCAAwC,EAAE,+CAA+C,uFAAuF,4CAA4C,8CAA8C,iIAAiI,wCAAwC,KAAK,2BAA2B,iHAAiH,iBAAiB,gCAAgC,6BAA6B,oCAAoC,2BAA2B,2BAA2B,OAAO,mCAAmC,6EAA6E,4BAA4B,2EAA2E,OAAO,+CAA+C,GAAG,oCAAoC,qCAAqC,MAAM,sBAAsB,yCAAyC,UAAU,kFAAkF,8GAA8G,YAAY,6BAA6B,eAAe,EAAE,6BAA6B,UAAU,KAAK,GAAG,yKAAyK,4FAA4F,IAAI,KAAK,sBAAsB,qCAAqC,0GAA0G,6CAA6C,gJAAgJ,oBAAoB,IAAI,2CAA2C,cAAc,gBAAgB,qOAAqO,qEAAqE,IAAI,KAAK,2GAA2G,aAAa,GAAG,oEAAoE,iLAAiL,kBAAkB,2BAA2B,6DAA6D,mBAAmB,eAAe,+KAA+K,iHAAiH,4FAA4F,0CAA0C,gEAAgE,mGAAmG,2BAA2B,wMAAwM,mGAAmG,0DAA0D,gKAAgK,0EAA0E,mBAAmB,WAAW,iEAAiE,0CAA0C,gEAAgE,2BAA2B,+JAA+J,gCAAgC,mBAAmB,IAAI,KAAK,0DAA0D,kIAAkI,oDAAoD,wDAAwD,0DAA0D,sGAAsG,6BAA6B,gCAAgC,wBAAwB,sBAAsB,gJAAgJ,0BAA0B,aAAa,2DAA2D,4BAA4B,uDAAuD,yBAAyB,aAAa,kLAAkL,+GAA+G,wCAAwC,4DAA4D,KAAK,2CAA2C,+BAA+B,iEAAiE,qCAAqC,kCAAkC,wCAAwC,gCAAgC,6BAA6B,wCAAwC,sCAAsC,EAAE,6HAA6H,2EAA2E,QAAQ,GAAG,YAAY,6BAA6B,eAAe,EAAE,6BAA6B,UAAU,KAAK,GAAG,mEAAmE,kDAAkD,qGAAqG,8BAA8B,oDAAoD,6BAA6B,GAAG,0GAA0G,6CAA6C,2GAA2G,2CAA2C,WAAW,yDAAyD,SAAS,mCAAmC,SAAS,kBAAkB,mDAAmD,SAAS,KAAK,aAAa,SAAS,kBAAkB,gCAAgC,SAAS,QAAQ,cAAc,kCAAkC,kBAAkB,gBAAgB,2BAA2B,2DAA2D,gBAAgB,cAAc,iDAAiD,cAAc,2BAA2B,mBAAmB,kDAAkD,8BAA8B,oDAAoD,oDAAoD,cAAc,4CAA4C,0GAA0G,eAAe,8BAA8B,eAAe,sCAAsC,2DAA2D,4BAA4B,yCAAyC,oBAAoB,6KAA6K,eAAe,8CAA8C,iBAAiB,mEAAmE,6GAA6G,8BAA8B,oCAAoC,kHAAkH,YAAY,4CAA4C,eAAe,qHAAqH,2BAA2B,4EAA4E,YAAY,YAAY,iBAAiB,oGAAoG,2DAA2D,iBAAiB,yDAAyD,2EAA2E,qBAAqB,gOAAgO,eAAe,+DAA+D,OAAO,mDAAmD,qBAAqB,8EAA8E,eAAe,gBAAgB,YAAY,WAAW,KAAK,WAAW,+GAA+G,uBAAuB,wCAAwC,sBAAsB,yCAAyC,kDAAkD,WAAW,+BAA+B,YAAY,mBAAmB,KAAK,mBAAmB,sEAAsE,UAAU,eAAe,YAAY,IAAI,2CAA2C,EAAE,eAAe,SAAS,IAAI,WAAW,4BAA4B,iCAAiC,0CAA0C,iCAAiC,UAAU,OAAO,iEAAiE,6CAA6C,6GAA6G,SAAS,WAAW,iDAAiD,aAAa,iBAAiB,0LAA0L,0DAA0D,UAAU,qEAAqE,EAAE,uCAAuC,yDAAyD,+EAA+E,sEAAsE,eAAe,4OAA4O,qEAAqE,aAAa,eAAe,iBAAiB,mCAAmC,sCAAsC,WAAW,iBAAiB,eAAe,8DAA8D,0BAA0B,6BAA6B,mBAAmB,mCAAmC,qBAAqB,iEAAiE,aAAa,sBAAsB,4BAA4B,KAAK,aAAa,uIAAuI,gBAAgB,kCAAkC,KAAK,+CAA+C,wFAAwF,+BAA+B,qGAAqG,eAAe,wBAAwB,uBAAuB,+DAA+D,mCAAmC,qBAAqB,KAAK,iCAAiC,QAAQ,sCAAsC,SAAS,uCAAuC,OAAO,qCAAqC,mCAAmC,WAAW,MAAM,OAAO,cAAc,EAAE,uBAAuB,qBAAqB,2BAA2B,yBAAyB,2CAA2C,oDAAoD,sBAAsB,mBAAmB,uFAAuF,iBAAiB,eAAe,4KAA4K,OAAO,+CAA+C,eAAe,OAAO,qDAAqD,uDAAuD,YAAY,GAAG,mBAAmB,kBAAkB,eAAe,8BAA8B,gHAAgH,+DAA+D,iBAAiB,qDAAqD,mBAAmB,8CAA8C,6DAA6D,kBAAkB,GAAG,wBAAwB,kBAAkB,GAAG,oBAAoB,+BAA+B,kFAAkF,uBAAuB,8GAA8G,KAAK,cAAc,4BAA4B,OAAO,uBAAuB,eAAe,cAAc,wBAAwB,8kBAA8kB,iBAAiB,2BAA2B,aAAa,wBAAwB,GAAG,eAAe,kFAAkF,WAAW,KAAK,wBAAwB,uDAAuD,YAAY,cAAc,6aAA6a,eAAe,sBAAsB,8BAA8B,qBAAqB,4DAA4D,wBAAwB,WAAW,yCAAyC,qBAAqB,+DAA+D,WAAW,EAAE,WAAW,2FAA2F,cAAc,sGAAsG,cAAc,QAAQ,sMAAsM,8CAA8C,qFAAqF,eAAe,iDAAiD,iBAAiB,oCAAoC,SAAS,uGAAuG,GAAG,+CAA+C,mBAAmB,wBAAwB,kBAAkB,8BAA8B,8CAA8C,GAAG,OAAO,4BAA4B,gHAAgH,SAAS,yLAAyL,eAAe,oHAAoH,uBAAuB,QAAQ,6FAA6F,sBAAsB,YAAY,OAAO,oCAAoC,sDAAsD,MAAM,qHAAqH,WAAW,kBAAkB,oBAAoB,sBAAsB,SAAS,UAAU,SAAS,sCAAsC,sFAAsF,yCAAyC,qFAAqF,gBAAgB,iCAAiC,4BAA4B,IAAI,2HAA2H,mHAAmH,8BAA8B,yCAAyC,+BAA+B,qHAAqH,uBAAuB,yBAAyB,0DAA0D,wOAAwO,UAAU,GAAG,4BAA4B,yBAAyB,qCAAqC,GAAG,KAAK,kLAAkL,UAAU,kBAAkB,sCAAsC,iDAAiD,oCAAoC,wEAAwE,2BAA2B,6EAA6E,uCAAuC,uCAAuC,oBAAoB,WAAW,uEAAuE,MAAM,uBAAuB,sCAAsC,sGAAsG,QAAQ,8BAA8B,2DAA2D,OAAO,YAAY,wBAAwB,qFAAqF,eAAe,oCAAoC,gLAAgL,uGAAuG,QAAQ,sCAAsC,MAAM,6DAA6D,gBAAgB,uBAAuB,oDAAoD,8HAA8H,iNAAiN,wIAAwI,yIAAyI,iFAAiF,kCAAkC,qBAAqB,OAAO,sCAAsC,6CAA6C,yDAAyD,wKAAwK,mBAAmB,mBAAmB,MAAM,wBAAwB,MAAM,kCAAkC,MAAM,qBAAqB,gCAAgC,kCAAkC,oCAAoC,qlBAAqlB,8DAA8D,4CAA4C,sDAAsD,8GAA8G,KAAK,qGAAqG,QAAQ,oCAAoC,6IAA6I,sGAAsG,OAAO,oCAAoC,+DAA+D,iEAAiE,iCAAiC,cAAc,mEAAmE,wBAAwB,iDAAiD,KAAK,wBAAwB,iDAAiD,UAAU,eAAe,sCAAsC,0EAA0E,4BAA4B,mBAAmB,0JAA0J,4EAA4E,oBAAoB,iBAAiB,iFAAiF,SAAS,yIAAyI,OAAO,gGAAgG,gHAAgH,6PAA6P,KAAK,2CAA2C,wCAAwC,OAAO,2BAA2B,yBAAyB,+BAA+B,gCAAgC,kCAAkC,yCAAyC,aAAa,oCAAoC,QAAQ,6GAA6G,sDAAsD,yFAAyF,4BAA4B,oHAAoH,6CAA6C,4CAA4C,IAAI,0BAA0B,eAAe,gBAAgB,uEAAuE,0CAA0C,uCAAuC,yDAAyD,2BAA2B,6CAA6C,2FAA2F,kBAAkB,yDAAyD,4BAA4B,4BAA4B,8BAA8B,EAAE,uEAAuE,WAAW,OAAO,yBAAyB,uBAAuB,uBAAuB,uCAAuC,2EAA2E,iBAAiB,iCAAiC,0DAA0D,cAAc,8BAA8B,sBAAsB,EAAE,+BAA+B,sBAAsB,EAAE,4CAA4C,sBAAsB,EAAE,6CAA6C,sBAAsB,KAAK,GAAG,gGAAgG,8SAA8S,gGAAgG,KAAK,wJAAwJ,eAAe,gBAAgB,kKAAkK,kBAAkB,2BAA2B,oEAAoE,yCAAyC,kCAAkC,oBAAoB,4HAA4H,OAAO,4BAA4B,kFAAkF,oDAAoD,uBAAuB,8GAA8G,oBAAoB,kUAAkU,6VAA6V,mBAAmB,wGAAwG,OAAO,4BAA4B,kEAAkE,0LAA0L,sBAAsB,uLAAuL,qBAAqB,uFAAuF,iCAAiC,WAAW,6DAA6D,kDAAkD,GAAG,0BAA0B,aAAa,oHAAoH,8BAA8B,gBAAgB,6CAA6C,oCAAoC,kBAAkB,4BAA4B,2DAA2D,4NAA4N,4BAA4B,4DAA4D,yBAAyB,gBAAgB,8DAA8D,qBAAqB,qDAAqD,gCAAgC,+BAA+B,OAAO,0CAA0C,+BAA+B,0BAA0B,kBAAkB,2CAA2C,gEAAgE,WAAW,MAAM,8BAA8B,gCAAgC,6BAA6B,+BAA+B,+FAA+F,2EAA2E,QAAQ,GAAG,2BAA2B,0HAA0H,IAAI,KAAK,kEAAkE,oBAAoB,4CAA4C,cAAc,iKAAiK,4BAA4B,4UAA4U,qCAAqC,oCAAoC,wDAAwD,sCAAsC,kNAAkN,gEAAgE,oBAAoB,oLAAoL,2HAA2H,mCAAmC,GAAG,iBAAiB,0BAA0B,kFAAkF,YAAY,6BAA6B,eAAe,EAAE,6BAA6B,WAAW,EAAE,iCAAiC,WAAW,KAAK,GAAG,sKAAsK,0FAA0F,uCAAuC,oBAAoB,+GAA+G,gDAAgD,sUAAsU,yCAAyC,KAAK,8EAA8E,eAAe,gBAAgB,2OAA2O,kBAAkB,4BAA4B,8CAA8C,oBAAoB,WAAW,2CAA2C,0BAA0B,gBAAgB,EAAE,oUAAoU,iBAAiB,6CAA6C,kEAAkE,gEAAgE,GAAG,kCAAkC,yBAAyB,KAAK,oBAAoB,WAAW,gEAAgE,uCAAuC,+EAA+E,iBAAiB,4CAA4C,wNAAwN,wDAAwD,2DAA2D,uBAAuB,2BAA2B,yBAAyB,sBAAsB,yDAAyD,qCAAqC,qRAAqR,2BAA2B,qBAAqB,0BAA0B,aAAa,yCAAyC,yCAAyC,uDAAuD,gEAAgE,uEAAuE,4EAA4E,uDAAuD,yGAAyG,0FAA0F,8BAA8B,sCAAsC,kDAAkD,4BAA4B,iHAAiH,ofAAof,wCAAwC,gBAAgB,eAAe,4FAA4F,MAAM,uDAAuD,wEAAwE,SAAS,4BAA4B,WAAW,+CAA+C,+GAA+G,GAAG,8BAA8B,WAAW,0DAA0D,gIAAgI,mDAAmD,8BAA8B,WAAW,mDAAmD,yBAAyB,6BAA6B,yBAAyB,WAAW,0NAA0N,qHAAqH,GAAG,8BAA8B,yEAAyE,6BAA6B,yDAAyD,yCAAyC,2NAA2N,qJAAqJ,gFAAgF,sBAAsB,yDAAyD,0EAA0E,wCAAwC,0CAA0C,iBAAiB,4BAA4B,0CAA0C,yDAAyD,0EAA0E,SAAS,YAAY,4BAA4B,uEAAuE,mLAAmL,gCAAgC,uEAAuE,8BAA8B,4CAA4C,oHAAoH,4BAA4B,WAAW,4BAA4B,6GAA6G,iCAAiC,+DAA+D,+FAA+F,oCAAoC,6DAA6D,6FAA6F,GAAG,uFAAuF,8GAA8G,sCAAsC,8BAA8B,mDAAmD,iCAAiC,yCAAyC,oEAAoE,GAAG,8DAA8D,iCAAiC,wCAAwC,qFAAqF,GAAG,qDAAqD,4FAA4F,iCAAiC,oCAAoC,mEAAmE,oDAAoD,sCAAsC,kCAAkC,6BAA6B,qCAAqC,qDAAqD,EAAE,uEAAuE,2EAA2E,QAAQ,uBAAuB,GAAG,YAAY,6BAA6B,eAAe,EAAE,6BAA6B,WAAW,KAAK,GAAG,sFAAsF,8CAA8C,iCAAiC,yCAAyC,6CAA6C,8DAA8D,uCAAuC,6CAA6C,uCAAuC,GAAG,GAAG,8CAA8C,qHAAqH,kDAAkD,2QAA2Q,uBAAuB,mBAAmB,yBAAyB,uCAAuC,+IAA+I,sCAAsC,0FAA0F,mEAAmE,uBAAuB,eAAe,+BAA+B,mGAAmG,gCAAgC,2BAA2B,kBAAkB,IAAI,6BAA6B,SAAS,sCAAsC,GAAG,gBAAgB,IAAI,SAAS,wBAAwB,8MAA8M,gEAAgE,KAAK,qUAAqU,6TAA6T,mBAAmB,KAAK,gcAAgc,KAAK,4RAA4R,eAAe,gBAAgB,6GAA6G,6EAA6E,oGAAoG,kBAAkB,2BAA2B,mBAAmB,sBAAsB,mBAAmB,4BAA4B,iCAAiC,sBAAsB,yBAAyB,qEAAqE,sNAAsN,KAAK,mFAAmF,wBAAwB,sBAAsB,6cAA6c,mBAAmB,WAAW,0GAA0G,mDAAmD,0CAA0C,mCAAmC,8HAA8H,qCAAqC,6DAA6D,0IAA0I,8IAA8I,2BAA2B,2BAA2B,8cAA8c,iBAAiB,uCAAuC,oBAAoB,qGAAqG,qCAAqC,mDAAmD,oEAAoE,UAAU,oBAAoB,8FAA8F,sOAAsO,+DAA+D,6QAA6Q,4CAA4C,6DAA6D,SAAS,qBAAqB,qBAAqB,mDAAmD,4BAA4B,gCAAgC,kCAAkC,0DAA0D,4BAA4B,sEAAsE,yBAAyB,2BAA2B,8HAA8H,mCAAmC,6PAA6P,uBAAuB,uDAAuD,4GAA4G,gCAAgC,WAAW,WAAW,EAAE,uBAAuB,+BAA+B,uCAAuC,QAAQ,iBAAiB,kBAAkB,wCAAwC,sBAAsB,qEAAqE,sBAAsB,0CAA0C,2BAA2B,yBAAyB,gBAAgB,6DAA6D,qBAAqB,mDAAmD,+BAA+B,4BAA4B,mKAAmK,8BAA8B,2BAA2B,4BAA4B,WAAW,oDAAoD,gGAAgG,mBAAmB,GAAG,sBAAsB,6IAA6I,yDAAyD,mBAAmB,uCAAuC,mBAAmB,IAAI,qCAAqC,oBAAoB,2HAA2H,cAAc,6BAA6B,mBAAmB,wBAAwB,8DAA8D,oLAAoL,wBAAwB,gCAAgC,uYAAuY,6BAA6B,iCAAiC,wBAAwB,gCAAgC,mVAAmV,6BAA6B,iCAAiC,mCAAmC,oEAAoE,SAAS,0BAA0B,qCAAqC,2CAA2C,gCAAgC,0BAA0B,sDAAsD,oBAAoB,0BAA0B,8OAA8O,iCAAiC,SAAS,4GAA4G,SAAS,6BAA6B,kEAAkE,8CAA8C,4CAA4C,2GAA2G,6BAA6B,mDAAmD,8IAA8I,gCAAgC,6BAA6B,2DAA2D,yFAAyF,2EAA2E,QAAQ,GAAG,YAAY,6BAA6B,eAAe,EAAE,6BAA6B,WAAW,EAAE,0BAA0B,WAAW,EAAE,8BAA8B,WAAW,EAAE,2BAA2B,WAAW,EAAE,+BAA+B,qBAAqB,EAAE,iCAAiC,WAAW,KAAK,GAAG,wHAAwH,oDAAoD,8FAA8F,aAAa,4LAA4L,SAAS,iBAAiB,oCAAoC,MAAM,4RAA4R,gBAAgB,QAAQ,aAAa,qCAAqC,gFAAgF,kBAAkB,kCAAkC,2CAA2C,kCAAkC,0DAA0D,4BAA4B,sEAAsE,yBAAyB,sCAAsC,kEAAkE,yBAAyB,4HAA4H,0BAA0B,sEAAsE,6BAA6B,kEAAkE,gDAAgD,gCAAgC,6BAA6B,2DAA2D,uGAAuG,2EAA2E,QAAQ,GAAG,YAAY,6BAA6B,eAAe,EAAE,6BAA6B,WAAW,EAAE,0BAA0B,iBAAiB,EAAE,8BAA8B,WAAW,EAAE,2BAA2B,WAAW,EAAE,+BAA+B,qBAAqB,EAAE,iCAAiC,WAAW,KAAK,KAAK,wHAAwH,oDAAoD,8GAA8G,kCAAkC,KAAK,0DAA0D,eAAe,gBAAgB,WAAW,oXAAoX,qBAAqB,kCAAkC,kBAAkB,4BAA4B,+JAA+J,uJAAuJ,oCAAoC,uCAAuC,gCAAgC,uDAAuD,YAAY,uCAAuC,iBAAiB,wBAAwB,4CAA4C,GAAG,sBAAsB,mQAAmQ,0BAA0B,0BAA0B,8BAA8B,kCAAkC,qCAAqC,oEAAoE,oCAAoC,4BAA4B,kGAAkG,+BAA+B,oHAAoH,+BAA+B,0GAA0G,uBAAuB,yHAAyH,gDAAgD,4CAA4C,0CAA0C,KAAK,gHAAgH,+BAA+B,IAAI,+JAA+J,yBAAyB,mCAAmC,iDAAiD,qDAAqD,sEAAsE,6TAA6T,gBAAgB,EAAE,qBAAqB,6EAA6E,gCAAgC,wBAAwB,8BAA8B,GAAG,gCAAgC,6BAA6B,+BAA+B,2FAA2F,2EAA2E,QAAQ,GAAG,YAAY,6BAA6B,eAAe,EAAE,6BAA6B,WAAW,KAAK,GAAG,8DAA8D,qFAAqF,IAAI,EAAE,sBAAsB,sCAAsC,+GAA+G,gDAAgD,mHAAmH,cAAc,gBAAgB,kBAAkB,yBAAyB,WAAW,qNAAqN,6GAA6G,MAAM,iDAAiD,4DAA4D,qCAAqC,4BAA4B,mCAAmC,gBAAgB,EAAE,oHAAoH,iEAAiE,iBAAiB,uCAAuC,yBAAyB,oCAAoC,gBAAgB,EAAE,0DAA0D,yCAAyC,sBAAsB,0DAA0D,6BAA6B,0JAA0J,qCAAqC,SAAS,4CAA4C,6EAA6E,SAAS,uCAAuC,MAAM,6BAA6B,kEAAkE,mGAAmG,uJAAuJ,mBAAmB,qFAAqF,2CAA2C,MAAM,4DAA4D,0BAA0B,mCAAmC,OAAO,gCAAgC,6BAA6B,mCAAmC,uDAAuD,2EAA2E,QAAQ,GAAG,YAAY,6BAA6B,eAAe,KAAK,GAAG,8HAA8H,oEAAoE,+GAA+G,gDAAgD,yGAAyG,mCAAmC,KAAK,sDAAsD,eAAe,gBAAgB,wFAAwF,kBAAkB,yBAAyB,8CAA8C,gEAAgE,iFAAiF,iBAAiB,oKAAoK,SAAS,qBAAqB,sHAAsH,wDAAwD,yEAAyE,UAAU,mBAAmB,yCAAyC,uCAAuC,2EAA2E,sBAAsB,2MAA2M,0BAA0B,aAAa,8DAA8D,8DAA8D,4BAA4B,WAAW,oEAAoE,gBAAgB,GAAG,qBAAqB,wBAAwB,+EAA+E,8DAA8D,wDAAwD,yEAAyE,SAAS,4BAA4B,+CAA+C,gCAAgC,6BAA6B,mCAAmC,6EAA6E,2EAA2E,YAAY,GAAG,YAAY,6BAA6B,eAAe,EAAE,iCAAiC,WAAW,EAAE,6BAA6B,WAAW,KAAK,GAAG,kHAAkH,iDAAiD,qLAAqL,SAAS,EAAE;AAC/oiF,gD;CCNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,CAAC,6BAA6B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oBAAoB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF;AACtF;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG,aAAa;AAChB;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,iBAAiB;AACjB;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA,iCAAiC;AACjC;AACA,IAAI;AACJ;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA,IAAI;AACJ;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,gCAAgC;AAChC;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA,gEAAgE;AAChE,sCAAsC,wBAAwB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,gDAAgD;AAChD;AACA,4DAA4D;AAC5D;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,aAAa;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,8CAA8C,iBAAiB;AAC/D;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA,iFAAiF;AACjF,GAAG;AACH;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,kCAAkC,mBAAmB,mBAAmB,SAAS,UAAU,gBAAgB,4CAA4C,gBAAgB,mBAAmB;AAC1L;AACA;AACA;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,SAAS,WAAW;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,8CAA8C;AAC9C,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,QAAQ;AACR;AACA,QAAQ;AACR,MAAM;AACN;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qFAAqF;AACrF;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,gFAAgF,GAAG;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,6DAA6D;AAC7D;AACA,2CAA2C,yCAAyC;AACpF;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,0CAA0C,cAAc;AACxD;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,aAAa,yCAAyC,GAAG;AACzD;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C,uEAAuE;AACvE;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA,2FAA2F;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA,MAAM,KAAK;AACX;AACA,oCAAoC;AACpC,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qDAAqD;AACrD;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,iBAAiB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,eAAe;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,aAAa;AACb,aAAa;AACb,gBAAgB;AAChB,eAAe;AACf,eAAe;AACf;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,OAAO,UAAU;AACjB;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,sBAAsB,SAAS,kBAAkB,KAAK;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR,sBAAsB,YAAY,MAAM;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR,sBAAsB,YAAY,UAAU;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR,sBAAsB,UAAU,KAAK;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR,qBAAqB,IAAI;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA,YAAY;AACZ,WAAW;AACX;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA,YAAY;AACZ;AACA,QAAQ,GAAG;AACX;AACA;AACA;AACA,QAAQ,GAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,uBAAuB,4BAA4B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS,kBAAkB,KAAK;AACxD,wBAAwB,YAAY,MAAM;AAC1C,wBAAwB,YAAY,UAAU;AAC9C,wBAAwB,SAAS,KAAK;AACtC,uBAAuB,IAAI;AAC3B,8BAA8B;AAC9B;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA,OAAO;AACP,uEAAuE;AACvE;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,8DAA8D;AAC9D,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iDAAiD;AACjD,4DAA4D;AAC5D;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC,2BAA2B;AAC3B;AACA,sCAAsC;AACtC;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iBAAiB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK,uDAAuD,2EAA2E;AACvI;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,kCAAkC;AACpF;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,GAAG;AACL;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,6EAA6E;AAC7E,4CAA4C;AAC5C,IAAI;AACJ,cAAc;AACd,GAAG;AACH;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,mFAAmF;AACnF,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,oDAAoD;AAC7H,WAAW;AACX,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB,oBAAoB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,oBAAoB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,uEAAuE,6DAA6D;AACpI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO,sCAAsC;AAC7C,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,iDAAiD;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mBAAmB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,oEAAoE;AACpE;AACA,kEAAkE;AAClE;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,yEAAyE;AACzE,IAAI;AACJ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA,QAAQ,IAAI,IAAI;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ,8FAA8F,MAAM;AACpG;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ,mEAAmE,MAAM;AACzE;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,gBAAgB,gEAAgE,MAAM;AACtF;AACA,qBAAqB,eAAe;AACpC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,eAAe;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,2BAA2B,kBAAkB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kBAAkB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB;AAC/C;AACA;AACA,+BAA+B,kBAAkB;AACjD;AACA;AACA;AACA,YAAY;AACZ;AACA,oCAAoC;AACpC;AACA;AACA,uEAAuE,6EAA6E;AACpJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,sBAAsB;AACjD;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,gEAAgE;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,8DAA8D;AAC9D,OAAO;AACP;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD,IAAI;AACJ;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA,OAAO,gDAAgD;AACvD;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA,yDAAyD;AACzD,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,SAAS;AACf;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6GAA6G;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,uBAAuB;AACvB;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,EAAE;AACF,kDAAkD;AAClD;AACA;AACA;AACA,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,iFAAiF;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,+FAA+F;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,+CAA+C;AAC/C;AACA,2CAA2C;AAC3C;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,4EAA4E,gCAAgC,mCAAmC;AAC/I;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,uGAAuG;AACvG;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,oDAAoD,yBAAyB;AAC7E,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,QAAQ;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F;AAC/F;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,gGAAgG;AAChG,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,sBAAsB;AACtB;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,+DAA+D;AAC/D;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,kCAAkC;AAClC;AACA;AACA;AACA,IAAI;AACJ,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2GAA2G;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,oEAAoE;AACpE;AACA,mEAAmE;AACnE;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA,OAAO;AACP;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,uCAAuC;AACvC;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA,uCAAuC;AACvC;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,wFAAwF;AACxF;AACA,IAAI;AACJ;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC,yCAAyC,yCAAyC,qCAAqC,0CAA0C;AACjK;AACA;AACA,8DAA8D;AAC9D,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,yBAAyB,KAAK;AAC9B;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA,wFAAwF;AACxF;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA,uCAAuC;AACvC;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,kCAAkC,kBAAkB;AACpD;AACA;AACA,mDAAmD,mCAAmC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,oCAAoC;AACpC;AACA,mBAAmB,8BAA8B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,8BAA8B;AAC9B;AACA,8BAA8B;AAC9B;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,4CAA4C,8CAA8C;AAC1F;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,0DAA0D,uDAAuD;AACjH,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,4EAA4E;AAC5E,iDAAiD;AACjD;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA,oCAAoC;AACpC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,+BAA+B;AAC/B;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,kMAAkM,gCAAgC;AAClO;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,uBAAuB,gCAAgC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,sFAAsF;AACtF;AACA,qCAAqC;AACrC;AACA,qCAAqC;AACrC;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,cAAc;AAChD;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM,UAAU;AAChB;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,iCAAiC;AACjC;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA,+FAA+F;AAC/F;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,0BAA0B,OAAO;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,+FAA+F;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,GAAG;AACX;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gCAAgC,kCAAkC;AAClF;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA,MAAM;AACN;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,iGAAiG;AACjG;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC,wDAAwD;AACxD;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,qBAAqB,yBAAyB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,6FAA6F;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,GAAG;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA,mBAAmB,iBAAiB;AACpC,iBAAiB,eAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,oEAAoE;AACpE,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA,6GAA6G;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,iCAAiC;AACjC,aAAa;AACb,8BAA8B;AAC9B,aAAa;AACb,yDAAyD;AACzD;AACA;AACA,mDAAmD;AACnD;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G;AAC9G;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,wGAAwG;AACxG;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,4BAA4B;AAC5B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,2CAA2C,cAAc;AACzD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wDAAwD;AACxD,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,kGAAkG;AAClG;AACA,MAAM;AACN;AACA,8CAA8C;AAC9C;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,gEAAgE;AAChE;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU,GAAG;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,gDAAgD;AAChD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA,OAAO;AACP;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,iBAAiB;AACjB,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA,sBAAsB;AACtB;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,iKAAiK;AACjK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0FAA0F;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2HAA2H;AAC3H,IAAI;AACJ;AACA;AACA;AACA,yBAAyB;AACzB;AACA,gBAAgB,QAAQ,oCAAoC,SAAS;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM,EAAE;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,mCAAmC;AAC1C;AACA;AACA;AACA;AACA;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC,OAAO;AACP;AACA,8GAA8G;AAC9G;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE,IAAI;AACJ;AACA;AACA;AACA,4CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,mBAAmB;AACnB;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,4CAA4C;AAC5C;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,+HAA+H;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,oDAAoD;AACpD;AACA,sEAAsE;AACtE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,wCAAwC;AACxC;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,6BAA6B,SAAS;AACtC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,qDAAqD;AACrD,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,gDAAgD,uBAAuB;AACvE;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH;AACvH;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,yBAAyB,8BAA8B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA,4BAA4B;AAC5B;AACA,6CAA6C;AAC7C;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,eAAe;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,mCAAmC,iCAAiC;AACpE,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+IAA+I;AAC/I;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,sEAAsE;AACtE,IAAI;AACJ;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,6BAA6B;AAClD,sCAAsC;AACtC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;AACA;AACA,0BAA0B,uCAAuC;AACjE;AACA,6FAA6F;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA,2BAA2B,sBAAsB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,cAAc;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA,wCAAwC;AACxC;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ,wCAAwC;AACxC;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,wEAAwE;AAC/E;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,sBAAsB;AACjD;AACA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA;AACA,uBAAuB,8BAA8B;AACrD;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,gDAAgD,QAAQ;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,gDAAgD,iBAAiB;AACjE;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,sBAAsB;AACtB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV,SAAS;AACT;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN,qCAAqC;AACrC;AACA;AACA,MAAM;AACN,6CAA6C;AAC7C;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa;AACtB;AACA,MAAM;AACN,6CAA6C;AAC7C;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,EAAE;AACV;AACA,2BAA2B,oBAAoB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,uBAAuB;AAClC;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,QAAQ;AACR,MAAM;AACN,uCAAuC;AACvC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,EAAE;AACF;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM,qFAAqF;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA,6BAA6B;AAC7B;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO,aAAa;AACpB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU;AAChB;AACA;AACA;AACA,MAAM,UAAU;AAChB;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,4DAA4D;AAC5D;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB;AAC/C;AACA;AACA,OAAO;AACP,8BAA8B,SAAS;AACvC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,2DAA2D;AAC3D,yDAAyD;AACzD,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oBAAoB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO,oBAAoB;AAC3B;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA,uBAAuB,qBAAqB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,UAAU;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,kCAAkC,kBAAkB;AACpD;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,mCAAmC;AACpF;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,0BAA0B,YAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,2CAA2C,YAAY,aAAa,SAAS,SAAS;AACtF;AACA,oDAAoD;AACpD;AACA,uBAAuB;AACvB;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA,uEAAuE,qEAAqE;AAC5I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,qBAAqB,oBAAoB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,8BAA8B,qBAAqB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,4EAA4E;AACzH;AACA;AACA,oDAAoD;AACpD;AACA,2CAA2C;AAC3C;AACA;AACA;AACA,uDAAuD;AACvD,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qCAAqC,QAAQ;AAC7C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,cAAc;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ;AACd,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA,qBAAqB,cAAc;AACnC,6CAA6C;AAC7C;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA,IAAI;AACJ;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,oCAAoC;AACpC;AACA,gDAAgD;AAChD;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,kCAAkC;AAClC;AACA,uCAAuC;AACvC;AACA;AACA,uBAAuB,eAAe;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA,kHAAkH;AAClH;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,2EAA2E;AAC3E,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,SAAS;AACf;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA,MAAM;AACN;AACA;AACA;AACA,uCAAuC;AACvC;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kCAAkC;AAClC;AACA,gEAAgE;AAChE,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM,EAAE,kCAAkC;AAC1C;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,IAAI;AACJ,eAAe;AACf;AACA;AACA,IAAI;AACJ,uBAAuB,UAAU;AACjC;AACA;AACA,IAAI;AACJ,yBAAyB,UAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,sDAAsD,QAAQ,YAAY;AAC9E;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF;AACA;AACA,oHAAoH;AACpH;AACA,2HAA2H;AAC3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,EAAE;AACR;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,gHAAgH;AAChH;AACA;AACA;AACA,iHAAiH;AACjH;AACA,8HAA8H;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,eAAe;AACf;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,eAAe,mBAAmB;AAClC;AACA,wHAAwH;AACxH;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI,+BAA+B;AACnC;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAqB;AACpC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0FAA0F;AAC1F;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF;AACA;AACA,uEAAuE;AACvE;AACA,kIAAkI;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uBAAuB;AACtC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,WAAW;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA,eAAe,WAAW;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qJAAqJ;AACrJ;AACA;AACA,uEAAuE;AACvE;AACA,kIAAkI;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,eAAe;AACf;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE,IAAI;AACJ;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,sBAAsB,kBAAkB;AACxC,uBAAuB,qBAAqB;AAC5C;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA,2EAA2E;AAC3E;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4FAA4F;AAC5F;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,IAAI;AACJ;AACA;AACA;AACA,iCAAiC,mBAAmB;AACpD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA,qBAAqB,cAAc;AACnC,6CAA6C;AAC7C;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oBAAoB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,oBAAoB;AAC/C;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG;AAChG,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA,+BAA+B;AAC/B;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,8BAA8B,gBAAgB;AAC9C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,IAAI;AACJ;AACA;AACA,8BAA8B,gBAAgB;AAC9C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA,uBAAuB,eAAe;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA;AACA,IAAI;AACJ;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA,uBAAuB,mCAAmC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kEAAkE;AAClE,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,kBAAkB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,UAAU;AACV,SAAS;AACT;AACA;AACA;AACA,2BAA2B,oBAAoB;AAC/C;AACA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,kBAAkB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,iDAAiD,wBAAwB;AACzE;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,6BAA6B;AAC7B;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,oDAAoD,YAAY,gBAAgB;AAChF;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,4DAA4D;AAC5D;AACA,uDAAuD;AACvD;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA,gDAAgD;AAChD;AACA,2CAA2C;AAC3C;AACA,wDAAwD;AACxD;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,aAAa;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,eAAe;AAClC;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,KAAK;AACL,6CAA6C,mBAAmB;AAChE;AACA;AACA;AACA;AACA;AACA,QAAQ,mBAAmB;AAC3B;AACA;AACA;AACA;AACA;AACA,wDAAwD,QAAQ;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAsB;AAC5C;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,wCAAwC,UAAU;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM,EAAE;AACR;AACA,uBAAuB,4BAA4B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,EAAE;AACV;AACA,yBAAyB,qBAAqB;AAC9C,2IAA2I;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA,qBAAqB,UAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,WAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,6BAA6B;AAClD;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,GAAG,SAAS,KAAK;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,GAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,uDAAuD;AACvD;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,eAAe;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF,gFAAgF;AAChF;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG;AACP;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,uBAAuB,eAAe;AACtC;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,iBAAiB;AACpC,0BAA0B;AAC1B;AACA,qBAAqB,oBAAoB;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV,SAAS;AACT;AACA;AACA;AACA;AACA,MAAM;AACN,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;AACA;AACA,IAAI,gBAAgB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,SAAS;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,IAAI;AACjB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,6EAA6E,sDAAsD,0BAA0B;AAC7J;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,cAAc;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,cAAc;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA,8EAA8E;AAC9E;AACA;AACA,aAAa,6DAA6D,yEAAyE,wEAAwE,uDAAuD,iFAAiF,oFAAoF,oFAAoF,0CAA0C,0CAA0C,0CAA0C;AACzoB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,mDAAmD,4BAA4B;AAC/E;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA,8CAA8C;AAC9C,gCAAgC,0BAA0B;AAC1D,yCAAyC,4BAA4B;AACrE,wCAAwC;AACxC,qCAAqC;AACrC,gCAAgC,0BAA0B;AAC1D,oCAAoC;AACpC,oCAAoC;AACpC,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,0CAA0C,yBAAyB,2CAA2C;AAClL;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,mHAAmH;AACnH;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA,uGAAuG;AACvG;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG,sDAAsD,yCAAyC;AACvM;AACA,IAAI;AACJ;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA,iCAAiC;AACjC;AACA,qBAAqB,0BAA0B;AAC/C;AACA,oDAAoD;AACpD;AACA,iEAAiE;AACjE;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA,+EAA+E,4BAA4B;AAC3G,IAAI;AACJ;AACA,2CAA2C;AAC3C;AACA,qBAAqB,oBAAoB;AACzC,0EAA0E,4BAA4B;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,mCAAmC,QAAQ;AAC3C;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,qFAAqF;AACrF;AACA;AACA,IAAI;AACJ;AACA;AACA,uDAAuD;AACvD;AACA;AACA,qIAAqI;AACrI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,YAAY;AACZ;AACA,qFAAqF;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,gFAAgF;AAC/H;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA,OAAO,+CAA+C;AACtD;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA,uKAAuK;AACvK;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,oBAAoB;AACzC;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,YAAY,gDAAgD,6CAA6C,8CAA8C,4CAA4C,2CAA2C,MAAM;AACvR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA,0DAA0D,QAAQ;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,kBAAkB;AAC5C,IAAI;AACJ,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,QAAQ;AACR,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,OAAO,aAAa;AACpB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,iCAAiC;AAC/G,QAAQ;AACR;AACA;AACA;AACA;AACA,qBAAqB,qCAAqC;AAC1D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,2DAA2D,4CAA4C;AACvG,MAAM,uDAAuD;AAC7D;AACA;AACA,sBAAsB,sCAAsC;AAC5D;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,yBAAyB,qCAAqC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,wCAAwC;AACxC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,uBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA,0FAA0F;AAC1F;AACA,yDAAyD;AACzD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,mCAAmC;AACnC;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C,0GAA0G;AAC1G,6CAA6C;AAC7C,SAAS;AACT;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,iEAAiE,wBAAwB;AACzF;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,kBAAkB;AAClB,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,SAAS;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,wFAAwF,6CAA6C;AACrI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,uBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,uBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,yBAAyB,yBAAyB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF;AACtF;AACA,uBAAuB,yBAAyB;AAChD;AACA,OAAO;AACP;AACA;AACA,yGAAyG;AACzG;AACA,iCAAiC,2BAA2B;AAC5D;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,uBAAuB;AAC7B;AACA;AACA;AACA;AACA,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,OAAO;AACP,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,8CAA8C;AAC9C;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA,+CAA+C;AAC/C;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA,OAAO;AACP,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,wDAAwD;AACxD;AACA,sBAAsB;AACtB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,EAAE;AACF;AACA,sCAAsC;AACtC,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,6MAA6M;AAC7M;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,0CAA0C,aAAa,YAAY,YAAY,WAAW,iBAAiB,kBAAkB;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,cAAc;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI;AAClB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,IAAI;AACjB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,IAAI;AACnB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,IAAI;AACjB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,6BAA6B;AAC7B,6BAA6B;AAC7B,6BAA6B;AAC7B,6BAA6B;AAC7B,6BAA6B;AAC7B,6BAA6B;AAC7B,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,uDAAuD;AACvD;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,4FAA4F,uCAAuC;AACjM,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,oBAAoB;AAChE;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,uBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,mFAAmF;AACnF;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,kCAAkC;AAClC,yDAAyD;AACzD;AACA,yDAAyD,0BAA0B;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,wFAAwF,uDAAuD;AAC/I,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,OAAO;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,QAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0FAA0F,wEAAwE;AAClK,yFAAyF,wEAAwE;AACjK,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,uBAAuB,+BAA+B;AACtD,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,0EAA0E;AAC1E;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C,qFAAqF;AACrF;AACA;AACA,uBAAuB,yBAAyB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,4CAA4C;AAC5C;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA,qCAAqC;AACrC;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA,2BAA2B,OAAO;AAClC;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,0BAA0B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,oJAAoJ;AACpJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,6CAA6C;AAC7C;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,uEAAuE;AACvE;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,sFAAsF;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,6BAA6B;AAClD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB;AAC9C,yBAAyB,gCAAgC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,sBAAsB,QAAQ;AAC9B,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,YAAY;AACjC,uBAAuB,YAAY;AACnC;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,kCAAkC,kBAAkB;AACpD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,gCAAgC;AACrD;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA,uBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,UAAU;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,mDAAmD,+CAA+C;AAClG,8DAA8D;AAC9D,OAAO;AACP;AACA,uCAAuC,uBAAuB;AAC9D;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,+CAA+C,2CAA2C;AAC1F;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,uCAAuC,uBAAuB;AAC9D;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC,qCAAqC,cAAc;AACnD;AACA,SAAS;AACT;AACA;AACA,qCAAqC;AACrC;AACA,qCAAqC,oBAAoB;AACzD;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,iCAAiC;AACjC;AACA;AACA,IAAI;AACJ,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA,kFAAkF;AAClF;AACA,8CAA8C;AAC9C;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA,mCAAmC;AACnC;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,mEAAmE;AACnE,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,qEAAqE;AACrE,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,YAAY,aAAa,mBAAmB,0CAA0C;AAC1H,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,eAAe;AACpC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,eAAe;AACpC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,gEAAgE;AAChE,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA,+IAA+I;AAC/I;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB;AAC/C;AACA;AACA,OAAO;AACP,8BAA8B,SAAS;AACvC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,+CAA+C;AAC/C;AACA,qBAAqB,oCAAoC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,8BAA8B,gBAAgB;AAC9C;AACA;AACA;AACA,yHAAyH;AACzH;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,wDAAwD;AACnE;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,oCAAoC,yDAAyD;AAC7F,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,kOAAkO;AAClO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;AACA,oCAAoC;AACpC;AACA,oDAAoD;AACpD;AACA,qGAAqG;AACrG;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,oBAAoB;AACzC,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mBAAmB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,oSAAoS,6GAA6G;AACjZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,eAAe;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,kHAAkH,2FAA2F,6DAA6D,0GAA0G;AACpX;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,iHAAiH,kEAAkE,8DAA8D,4GAA4G;AAC7V;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,mHAAmH,6FAA6F,qFAAqF,2GAA2G;AAChZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,wGAAwG;AACxG;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA,oIAAoI;AACpI;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,8WAA8W,gDAAgD;AAC9Z;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,kXAAkX,gDAAgD;AACla;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kYAAkY;AAClY;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gJAAgJ;AAChJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,oCAAoC,yBAAyB,6BAA6B;AAC1F,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,kDAAkD;AAClD;AACA,oFAAoF,wFAAwF;AAC5K;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,YAAY,kBAAkB,QAAQ;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,wCAAwC,UAAU;AAClD,6CAA6C,UAAU;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+HAA+H;AAC/H;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,8BAA8B,yDAAyD;AACxI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,kBAAkB;AACpE;AACA;AACA,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF,2FAA2F,8CAA8C;AAChO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,QAAQ,kBAAkB,UAAU,GAAG,QAAQ,WAAW,GAAG,gBAAgB,QAAQ;AACnK;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,4EAA4E;AAC5E,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,8FAA8F;AAC9F;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qGAAqG,2EAA2E,mBAAmB,8BAA8B;AACjO,sJAAsJ,YAAY,8BAA8B;AAChM,wFAAwF,oDAAoD,mBAAmB,8BAA8B;AAC7L,2GAA2G,YAAY,8BAA8B;AACrJ,uFAAuF,mEAAmE;AAC1J,mGAAmG;AACnG,iFAAiF,QAAQ,kBAAkB;AAC3G,4HAA4H,QAAQ,kBAAkB;AACtJ,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,qBAAqB,qCAAqC;AAC1D;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA,yCAAyC;AACzC;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,8BAA8B;AAC9F;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,SAAS;AACT,gCAAgC;AAChC;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,wDAAwD;AACxD;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,2IAA2I;AAC3I;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6QAA6Q,wBAAwB,+BAA+B;AACpU;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,yCAAyC,gDAAgD;AACzF;AACA;AACA,6FAA6F,kCAAkC;AAC/H;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,sNAAsN,+BAA+B;AACrP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gGAAgG,qDAAqD,+EAA+E,8DAA8D;AAClS;AACA,0EAA0E;AAC1E;AACA;AACA,wLAAwL,8DAA8D;AACtP;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yHAAyH;AACzH;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,SAAS,qBAAqB,oBAAoB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,SAAS;AACT;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4FAA4F;AAC5F;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA,qFAAqF;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iIAAiI;AACjI;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mCAAmC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oFAAoF;AACpF;AACA,SAAS;AACT;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qCAAqC;AACrC;AACA,oCAAoC;AACpC;AACA,8CAA8C;AAC9C;AACA,2EAA2E;AAC3E;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,8CAA8C;AAC9C;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,2FAA2F;AAC3F,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,yDAAyD;AACzD,IAAI;AACJ;AACA;AACA,2FAA2F;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,sHAAsH,6CAA6C;AACnK,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,uCAAuC;AACvC;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0FAA0F;AAC1F;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,mEAAmE,kCAAkC,kCAAkC;AAC7K;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,8DAA8D,WAAW;AACzE;AACA,IAAI;AACJ,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,sBAAsB;AACtB;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,oBAAoB;AACzC;AACA;AACA;AACA,6DAA6D;AAC7D,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,8BAA8B,UAAU;AACxC;AACA,SAAS;AACT;AACA;AACA,+BAA+B,SAAS;AACxC;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,oBAAoB;AACzC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2GAA2G;AAC3G;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,yCAAyC,gDAAgD;AACzF;AACA,6FAA6F;AAC7F;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA,oDAAoD;AACpD,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F;AAC3F;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,2CAA2C,QAAQ;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,wLAAwL;AACxL;AACA;AACA;AACA;AACA,IAAI;AACJ,kBAAkB;AAClB;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA,gEAAgE,mBAAmB,kBAAkB,qBAAqB,QAAQ,sBAAsB,gBAAgB,IAAI,cAAc;AAC1L;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,+DAA+D,mBAAmB,kBAAkB,qBAAqB,QAAQ,sBAAsB,gBAAgB,IAAI,cAAc;AACzL,EAAE;AACF;AACA;AACA,uDAAuD,eAAe,SAAS,mBAAmB,kBAAkB,qBAAqB,QAAQ,sBAAsB,iBAAiB,mBAAmB,IAAI,kBAAkB;AACjO;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,oDAAoD,oCAAoC;AACxF;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,wBAAwB;AACvE;AACA;AACA,0FAA0F,yBAAyB,+BAA+B;AAClJ;AACA;AACA;AACA,kGAAkG,8DAA8D;AAChK,sGAAsG,oCAAoC,qFAAqF,4CAA4C;AAC3Q,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,oBAAoB;AAC/C;AACA,6FAA6F;AAC7F;AACA,WAAW;AACX,yFAAyF;AACzF;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,+CAA+C,sBAAsB,sBAAsB;AAC3F;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,4HAA4H;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gNAAgN;AAChN,wDAAwD;AACxD;AACA,kRAAkR;AAClR,4GAA4G;AAC5G;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0FAA0F;AAC1F;AACA;AACA;AACA;AACA,kFAAkF;AAClF;AACA,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA,+HAA+H;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG;AACtG;AACA,oFAAoF;AACpF;AACA,kHAAkH;AAClH;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,4FAA4F;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,0DAA0D;AAC1D;AACA,kDAAkD;AAClD;AACA,gDAAgD;AAChD,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,oCAAoC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,oBAAoB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA,IAAI;AACJ;AACA;AACA;AACA,2CAA2C;AAC3C;AACA,0FAA0F;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uKAAuK;AACvK,oKAAoK;AACpK,wOAAwO;AACxO;AACA,0DAA0D;AAC1D;AACA,sGAAsG;AACtG;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA,yBAAyB,OAAO;AAChC;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,2JAA2J,8BAA8B;AACzL;AACA,0BAA0B,QAAQ;AAClC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,+KAA+K;AAC/K;AACA,0EAA0E;AAC1E;AACA,uFAAuF;AACvF;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,OAAO;AAC5B;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,SAAS;AACT;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA,iYAAiY;AACjY;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F,iBAAiB;AAC5G,SAAS;AACT;AACA;AACA;AACA;AACA,wGAAwG,QAAQ;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,2BAA2B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,qBAAqB,6BAA6B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gIAAgI,WAAW;AAC3I;AACA;AACA;AACA;AACA,2KAA2K;AAC3K;AACA;AACA;AACA;AACA;AACA,iHAAiH,QAAQ;AACzH;AACA;AACA,wBAAwB;AACxB;AACA,gHAAgH;AAChH;AACA,2GAA2G,yCAAyC;AACpJ;AACA,8JAA8J;AAC9J;AACA,6GAA6G;AAC7G;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qQAAqQ,MAAM;AAC3Q;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,sEAAsE,8BAA8B;AACpG,sEAAsE,mBAAmB,mEAAmE,uBAAuB;AACnL,wEAAwE,WAAW,QAAQ,kBAAkB;AAC7G,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6FAA6F;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,qBAAqB,oBAAoB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAqB,iBAAiB,0CAA0C,kBAAkB;AACjH;AACA,mEAAmE,mBAAmB;AACtF;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,iDAAiD,oBAAoB,iBAAiB,kBAAkB;AACxG,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,2BAA2B;AAC3B,uCAAuC;AACvC,uCAAuC;AACvC;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oDAAoD,8BAA8B;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA,IAAI;AACJ,qDAAqD;AACrD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,uEAAuE;AACvE,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,gDAAgD,4EAA4E,wDAAwD;AACpL,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU,KAAK;AACf;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,2CAA2C;AAC3C;AACA,sDAAsD;AACtD;AACA,0DAA0D;AAC1D;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA,4BAA4B;AAC5B;AACA,2DAA2D;AAC3D;AACA;AACA,UAAU;AACV;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,mBAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,gFAAgF;AAChF;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,iBAAiB,oBAAoB;AACrC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,kCAAkC;AAClC;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,mDAAmD;AACnD;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6CAA6C;AACxD,SAAS;AACT;AACA;AACA;AACA,WAAW,6CAA6C;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,0CAA0C;AACrD,SAAS;AACT;AACA;AACA;AACA,WAAW,4CAA4C;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,8BAA8B,oBAAoB;AAClD;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;AACP,+BAA+B,SAAS;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,kCAAkC,oBAAoB;AACtD;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT,kCAAkC,UAAU;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,kBAAkB,kCAAkC,2CAA2C;AACxI;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,iDAAiD;AACtH;AACA,QAAQ,QAAQ;AAChB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B,sDAAsD;AACtD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA,6GAA6G;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,oBAAoB;AACnE;AACA;AACA;AACA,YAAY;AACZ,WAAW;AACX;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,4BAA4B;AAC5B,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,yBAAyB,gCAAgC;AACzD;AACA;AACA;AACA,0BAA0B,kCAAkC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA,uDAAuD,QAAQ;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,oCAAoC;AACpC;AACA,mCAAmC;AACnC;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU,EAAE;AACZ;AACA,QAAQ;AACR;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,sCAAsC,mBAAmB;AACzD;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,yBAAyB,iCAAiC;AAC1D;AACA;AACA;AACA,2BAA2B,kCAAkC;AAC7D;AACA;AACA;AACA;AACA,qCAAqC,mBAAmB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mBAAmB;AAC9C;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,yBAAyB,iCAAiC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,yFAAyF;AACzF;AACA;AACA,YAAY;AACZ;AACA,QAAQ;AACR;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mBAAmB;AAC9C;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kBAAkB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kBAAkB;AACvD,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,qBAAqB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,8CAA8C;AAC9C;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA,yCAAyC,kBAAkB;AAC3D,2CAA2C,kBAAkB;AAC7D;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,WAAW;AACzC;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA,iGAAiG;AACjG;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ,GAAG;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,mKAAmK;AACnK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,0BAA0B,kBAAkB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,iFAAiF;AACjF;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA,mGAAmG;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,4DAA4D,iBAAiB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAW;AAClC;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,yBAAyB,4BAA4B;AACrD;AACA;AACA;AACA;AACA,8CAA8C,2BAA2B;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,wDAAwD,YAAY,mBAAmB,mBAAmB,SAAS,UAAU,gBAAgB;AAC7I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,uCAAuC;AACvC;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,gBAAgB;AAChB;AACA,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD,OAAO;AACP;AACA,mGAAmG;AACnG;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,uBAAuB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,sBAAsB,kBAAkB;AACxC,uCAAuC;AACvC,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,gFAAgF;AAChF,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,2CAA2C,gBAAgB,iBAAiB;AAC5E;AACA;AACA,kDAAkD;AAClD;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA,yBAAyB,qCAAqC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C,kCAAkC,iBAAiB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,2BAA2B,UAAU;AACrC,mCAAmC,SAAS;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA,YAAY;AACZ,WAAW;AACX;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA,oCAAoC,SAAS;AAC7C,2DAA2D,cAAc;AACzE,wCAAwC;AACxC;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,qBAAqB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,sBAAsB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,eAAe;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA,uBAAuB,SAAS;AAChC;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,eAAe;AACzB;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,qGAAqG;AACrG;AACA;AACA;AACA,4IAA4I;AAC5I,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,2DAA2D,yDAAyD;AACpH;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qKAAqK;AACrK;AACA,8DAA8D,6DAA6D;AAC3H;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sDAAsD;AACtD;AACA;AACA,0CAA0C,oCAAoC;AAC9E;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2BAA2B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,+EAA+E;AAC/E;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+HAA+H;AAC/H,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,2BAA2B,mBAAmB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,8BAA8B;AACnD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,0BAA0B;AACnD;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,QAAQ;AACR,yEAAyE;AACzE;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,oBAAoB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,6FAA6F;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,WAAW;AACX;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA,kBAAkB;AAClB;AACA,qBAAqB,8BAA8B;AACnD;AACA;AACA,uBAAuB,oBAAoB;AAC3C,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,WAAW;AACX,2BAA2B,eAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,+DAA+D;AAC/D;AACA;AACA;AACA,iBAAiB;AACjB,sBAAsB;AACtB;AACA,UAAU;AACV;AACA,kEAAkE;AAClE;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF;AACtF;AACA;AACA;AACA,6EAA6E;AAC7E;AACA,wJAAwJ;AACxJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,mCAAmC;AACnC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,2EAA2E,oBAAoB,GAAG;AAClG;AACA,oGAAoG,qBAAqB;AACzH;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,QAAQ;AACR;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA,uFAAuF;AACvF,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,2DAA2D;AAC3D;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN,6DAA6D,aAAa,mBAAmB,mBAAmB,SAAS,UAAU,gBAAgB;AACnJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,gCAAgC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM,UAAU;AAChB;AACA;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,uBAAuB,eAAe;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,sDAAsD;AAC9F;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,uBAAuB,SAAS;AAChC;AACA;AACA;AACA;AACA;AACA,6BAA6B,SAAS;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ,iBAAiB;AACjB;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,mDAAmD,2CAA2C,iFAAiF,8DAA8D,QAAQ;AACrP,oDAAoD,iDAAiD,sDAAsD;AAC3J;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,iGAAiG;AACjG;AACA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,SAAS;AACT;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2BAA2B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uDAAuD,qBAAqB,aAAa;AACzF;AACA;AACA,wDAAwD;AACxD;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,UAAU;AACxC;AACA;AACA,OAAO;AACP;AACA;AACA,uBAAuB,4BAA4B;AACnD;AACA;AACA,wBAAwB,iBAAiB;AACzC,yDAAyD,qBAAqB;AAC9E;AACA;AACA,0DAA0D,sBAAsB;AAChF;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,uBAAuB,4BAA4B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,yBAAyB,SAAS;AAClC,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA,qBAAqB,WAAW;AAChC;AACA;AACA,6BAA6B,WAAW;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kHAAkH,6BAA6B;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD,yGAAyG,yDAAyD,iEAAiE;AACnO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,iFAAiF;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,sFAAsF;AACtF;AACA,kDAAkD;AAClD,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,GAAG;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,0BAA0B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,4BAA4B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,4BAA4B;AAC3D;AACA,0GAA0G;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,4FAA4F;AAC5F;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iCAAiC;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C,sCAAsC;AACtC;AACA,4HAA4H;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,WAAW;AACzD;AACA;AACA;AACA,6BAA6B,wBAAwB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,gCAAgC;AACvD;AACA;AACA;AACA,2BAA2B,aAAa;AACxC;AACA;AACA;AACA,sCAAsC,4BAA4B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mCAAmC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA,wBAAwB,sCAAsC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,6BAA6B;AAClD;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,+DAA+D,cAAc;AAC7E;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA,2FAA2F;AAC3F;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;AACA,mHAAmH;AACnH,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA,iHAAiH;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,mBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,cAAc;AACd;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,IAAI;AACJ;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,sDAAsD;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6DAA6D;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oEAAoE,yFAAyF;AAC7J;AACA;AACA;AACA;AACA;AACA,qBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iHAAiH;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,IAAI;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,iDAAiD,iDAAiD;AAClG,IAAI;AACJ;AACA;AACA,+CAA+C;AAC/C,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,QAAQ;AACR;AACA;AACA,IAAI;AACJ;AACA,qCAAqC;AACrC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F;AAC/F;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN,IAAI;AACJ;AACA,yDAAyD;AACzD,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA,uEAAuE;AACvE;AACA;AACA;AACA,oIAAoI;AACpI;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F;AAC/F,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,iKAAiK,mBAAmB,8VAA8V,kHAAkH,eAAe;AACnpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,SAAS;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sMAAsM;AACtM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,8BAA8B;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,kCAAkC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,8EAA8E;AAC9E;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,2EAA2E;AAC3E,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,gEAAgE;AAChE;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,qBAAqB,oBAAoB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,wLAAwL;AACxL;AACA;AACA;AACA;AACA,IAAI;AACJ,iBAAiB;AACjB,kBAAkB;AAClB;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA,WAAW;AACX,mGAAmG;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,uDAAuD;AACxH;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA,qBAAqB,cAAc;AACnC,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,sBAAsB;AAC/C,qDAAqD;AACrD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,4BAA4B;AAC1E,0CAA0C,wBAAwB;AAClE;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,uEAAuE,wBAAwB;AAC/F;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mBAAmB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,wCAAwC;AACxC;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA,eAAe;AACf,OAAO,qEAAqE;AAC5E;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,yBAAyB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6HAA6H;AAC7H;AACA;AACA,2HAA2H,oCAAoC,iBAAiB,EAAE,wBAAwB;AAC1M;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,qBAAqB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E;AAC1E;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA,8GAA8G;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,gCAAgC,0BAA0B,EAAE,wBAAwB;AAC9I;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAA8G;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,qBAAqB;AAC5B;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,iHAAiH;AAClK;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,UAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,qBAAqB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,yBAAyB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kHAAkH;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,uBAAuB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,0FAA0F;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,0IAA0I;AAC1I;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,mDAAmD;AACnD;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6GAA6G;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA,IAAI;AACJ;AACA;AACA,yDAAyD;AACzD;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,mBAAmB;AACpC;AACA;AACA;AACA,uHAAuH;AACvH;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4FAA4F;AAC5F;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,yDAAyD;AACzD;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,0FAA0F;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA,yCAAyC;AACzC;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iFAAiF;AACjF;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,kBAAkB;AAClB,oBAAoB;AACpB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA,yDAAyD;AACzD,yDAAyD;AACzD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,yBAAyB;AAC9C;AACA,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,aAAa;AACb,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,IAAI;AACvB;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,mBAAmB,IAAI;AACvB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,IAAI;AACJ;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,2GAA2G;AAC3G,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,UAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,oDAAoD,yBAAyB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,uCAAuC;AACvC;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,yBAAyB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA,OAAO,iBAAiB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wIAAwI;AACxI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,wBAAwB;AACzC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,yFAAyF;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,qDAAqD;AACrD,6DAA6D;AAC7D,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA,qBAAqB,yBAAyB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA,OAAO;AACP,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,iBAAiB,mBAAmB;AACpC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,iGAAiG;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,4BAA4B;AACjD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,+BAA+B;AACtD;AACA;AACA,2BAA2B,+BAA+B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,0LAA0L;AAC1L;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,mBAAmB,+BAA+B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,iBAAiB;AACjB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN,gEAAgE,mBAAmB,kBAAkB,qBAAqB,QAAQ,uBAAuB,gBAAgB,IAAI,cAAc;AAC3L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,oEAAoE,kDAAkD,gBAAgB,qDAAqD;AAC3L;AACA,MAAM;AACN;AACA;AACA,oEAAoE,oCAAoC,gBAAgB;AACxH;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,mBAAmB,eAAe;AAClC;AACA;AACA,OAAO;AACP,mBAAmB,eAAe;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D,WAAW;AACX;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN,gCAAgC,gBAAgB,iBAAiB;AACjE,iEAAiE,mBAAmB,IAAI,cAAc;AACtG;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,kFAAkF,6BAA6B;AAC/G;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA,wBAAwB,oBAAoB;AAC5C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oBAAoB;AACrC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,uLAAuL;AACvL;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ,kBAAkB;AAClB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,8CAA8C,4BAA4B;AAC1E,0CAA0C,wBAAwB;AAClE;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,wLAAwL;AACxL;AACA;AACA;AACA,IAAI;AACJ,kBAAkB;AAClB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,mHAAmH,gBAAgB;AACnI;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN,gEAAgE,mBAAmB,IAAI,eAAe,eAAe,aAAa,IAAI,QAAQ,cAAc,IAAI,YAAY,gBAAgB,IAAI,oBAAoB;AACpN,6BAA6B,kBAAkB;AAC/C,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,eAAe;AAChC;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,IAAI;AACJ;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,sBAAsB;AACtB;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,mCAAmC,eAAe;AAClD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN,0DAA0D,OAAO,0BAA0B,aAAa,eAAe,UAAU,GAAG,UAAU;AAC9I,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,6BAA6B;AAC7B;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM,YAAY;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,SAAS;AACjB;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,oBAAoB;AACpB;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,wBAAwB;AACxB;AACA,qCAAqC;AACrC;AACA,gGAAgG;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,GAAG;AACT;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA,yCAAyC;AACzC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA,QAAQ,kBAAkB;AAC1B;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,gCAAgC;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,+CAA+C,kDAAkD;AACjG;AACA;AACA,IAAI;AACJ,iBAAiB;AACjB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D,OAAO;AACP,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE,kBAAkB;AAClB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA,iHAAiH;AACjH,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB,gBAAgB,gBAAgB;AACtF;AACA;AACA,sHAAsH;AACtH;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,EAAE;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA,YAAY;AACZ,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,wBAAwB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uOAAuO;AACvO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,aAAa;AAC7D;AACA,CAAC;;CCpy8CD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,qEAAqE;AAC5F;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,QAAQ;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,4BAA4B;AAC5B,4BAA4B;AAC5B,8BAA8B;AAC9B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,CAAC,kC","sources":["node_modules\\jquery\\dist\\jquery.min.js","node_modules\\bootstrap\\dist\\js\\bootstrap.bundle.min.js","Cache\\lib\\webix\\codebase\\webix.js","Cache\\js\\webix-custom-editors.js"],"sourcesContent":["/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.1\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function z(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML=\"\",e.querySelectorAll(\"[selected]\").length||d.push(\"\\\\[\"+ge+\"*(?:value|\"+f+\")\"),e.querySelectorAll(\"[id~=\"+S+\"-]\").length||d.push(\"~=\"),e.querySelectorAll(\"a#\"+S+\"+*\").length||d.push(\".#.+[+~]\"),e.querySelectorAll(\":checked\").length||d.push(\":checked\"),(t=T.createElement(\"input\")).setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&d.push(\":enabled\",\":disabled\"),(t=T.createElement(\"input\")).setAttribute(\"name\",\"\"),e.appendChild(t),e.querySelectorAll(\"[name='']\").length||d.push(\"\\\\[\"+ge+\"*name\"+ge+\"*=\"+ge+\"*(?:''|\\\"\\\")\")}),le.cssHas||d.push(\":has\"),d=d.length&&new RegExp(d.join(\"|\")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+\" \"]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||\"\").replace(O,P),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+\" \"];return t||(t=new RegExp(\"(^|\"+ge+\")\"+e+\"(\"+ge+\"|$)\"))&&s(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?\"!=\"===r:!r||(t+=\"\",\"=\"===r?t===i:\"!=\"===r?t!==i:\"^=\"===r?i&&0===t.indexOf(i):\"*=\"===r?i&&-1:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):\"string\"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,\"string\"==typeof e){if(!(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\\x20\\t\\r\\n\\f]*)/i,Ce=/^$|^module$|\\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement(\"div\")),(be=C.createElement(\"input\")).setAttribute(\"type\",\"radio\"),be.setAttribute(\"checked\",\"checked\"),be.setAttribute(\"name\",\"t\"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML=\"\",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML=\"\",le.option=!!xe.lastChild;var ke={thead:[1,\"\",\"
\"],col:[2,\"\",\"
\"],tr:[2,\"\",\"
\"],td:[3,\"\",\"
\"],_default:[0,\"\",\"\"]};function Se(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n\",\"\"]);var je=/<|&#?\\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\\s*$/g;function Re(e,t){return fe(e,\"table\")&&fe(11!==t.nodeType?t:t.firstChild,\"tr\")&&ce(e).children(\"tbody\")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function We(e){return\"true/\"===(e.type||\"\").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute(\"type\"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,\"handle events\"),s)for(n=0,r=s[i].length;n\").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on(\"load error\",i=function(e){r.remove(),i=null,e&&t(\"error\"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\\?(?=&|$)|\\?\\?/;ce.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Kt.pop()||ce.expando+\"_\"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter(\"json jsonp\",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?\"url\":\"string\"==typeof e.data&&0===(e.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Zt.test(e.data)&&\"data\");if(a||\"jsonp\"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,\"$1\"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?\"&\":\"?\")+e.jsonp+\"=\"+r),e.converters[\"script json\"]=function(){return o||ce.error(r+\" was not called\"),o[0]},e.dataTypes[0]=\"json\",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),\"script\"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument(\"\").body).innerHTML=\"
\",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return\"string\"!=typeof e?[]:(\"boolean\"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(\" \");return-1\").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,\"position\"),c=ce(e),f={};\"static\"===l&&(e.style.position=\"relative\"),s=c.offset(),o=ce.css(e,\"top\"),u=ce.css(e,\"left\"),(\"absolute\"===l||\"fixed\"===l)&&-1<(o+u).indexOf(\"auto\")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),\"using\"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if(\"fixed\"===ce.css(r,\"position\"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&\"static\"===ce.css(e,\"position\"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,\"borderTopWidth\",!0),i.left+=ce.css(e,\"borderLeftWidth\",!0))}return{top:t.top-i.top-ce.css(r,\"marginTop\",!0),left:t.left-i.left-ce.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&\"static\"===ce.css(e,\"position\"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,i){var o=\"pageYOffset\"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each([\"top\",\"left\"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+\"px\":t})}),ce.each({Height:\"height\",Width:\"width\"},function(a,s){ce.each({padding:\"inner\"+a,content:s,\"\":\"outer\"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||\"boolean\"!=typeof e),i=r||(!0===e||!0===t?\"margin\":\"border\");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf(\"outer\")?e[\"inner\"+a]:e.document.documentElement[\"client\"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body[\"scroll\"+a],r[\"scroll\"+a],e.body[\"offset\"+a],r[\"offset\"+a],r[\"client\"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)},hover:function(e,t){return this.on(\"mouseenter\",e).on(\"mouseleave\",t||e)}}),ce.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,n){ce.fn[n]=function(e,t){return 0=4)throw new Error(\"Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0\")}};u.jQueryDetection(),i.default.fn.emulateTransitionEnd=function(t){var e=this,n=!1;return i.default(this).one(u.TRANSITION_END,(function(){n=!0})),setTimeout((function(){n||u.triggerTransitionEnd(e)}),t),this},i.default.event.special[u.TRANSITION_END]={bindType:l,delegateType:l,handle:function(t){if(i.default(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var f=\"bs.alert\",d=i.default.fn.alert,c=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){i.default.removeData(this._element,f),this._element=null},e._getRootElement=function(t){var e=u.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=i.default(t).closest(\".alert\")[0]),n},e._triggerCloseEvent=function(t){var e=i.default.Event(\"close.bs.alert\");return i.default(t).trigger(e),e},e._removeElement=function(t){var e=this;if(i.default(t).removeClass(\"show\"),i.default(t).hasClass(\"fade\")){var n=u.getTransitionDurationFromElement(t);i.default(t).one(u.TRANSITION_END,(function(n){return e._destroyElement(t,n)})).emulateTransitionEnd(n)}else this._destroyElement(t)},e._destroyElement=function(t){i.default(t).detach().trigger(\"closed.bs.alert\").remove()},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data(f);o||(o=new t(this),n.data(f,o)),\"close\"===e&&o[e](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},r(t,null,[{key:\"VERSION\",get:function(){return\"4.6.2\"}}]),t}();i.default(document).on(\"click.bs.alert.data-api\",'[data-dismiss=\"alert\"]',c._handleDismiss(new c)),i.default.fn.alert=c._jQueryInterface,i.default.fn.alert.Constructor=c,i.default.fn.alert.noConflict=function(){return i.default.fn.alert=d,c._jQueryInterface};var h=\"bs.button\",p=i.default.fn.button,m=\"active\",g='[data-toggle^=\"button\"]',_='input:not([type=\"hidden\"])',v=\".btn\",b=function(){function t(t){this._element=t,this.shouldAvoidTriggerChange=!1}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=i.default(this._element).closest('[data-toggle=\"buttons\"]')[0];if(n){var o=this._element.querySelector(_);if(o){if(\"radio\"===o.type)if(o.checked&&this._element.classList.contains(m))t=!1;else{var r=n.querySelector(\".active\");r&&i.default(r).removeClass(m)}t&&(\"checkbox\"!==o.type&&\"radio\"!==o.type||(o.checked=!this._element.classList.contains(m)),this.shouldAvoidTriggerChange||i.default(o).trigger(\"change\")),o.focus(),e=!1}}this._element.hasAttribute(\"disabled\")||this._element.classList.contains(\"disabled\")||(e&&this._element.setAttribute(\"aria-pressed\",!this._element.classList.contains(m)),t&&i.default(this._element).toggleClass(m))},e.dispose=function(){i.default.removeData(this._element,h),this._element=null},t._jQueryInterface=function(e,n){return this.each((function(){var o=i.default(this),r=o.data(h);r||(r=new t(this),o.data(h,r)),r.shouldAvoidTriggerChange=n,\"toggle\"===e&&r[e]()}))},r(t,null,[{key:\"VERSION\",get:function(){return\"4.6.2\"}}]),t}();i.default(document).on(\"click.bs.button.data-api\",g,(function(t){var e=t.target,n=e;if(i.default(e).hasClass(\"btn\")||(e=i.default(e).closest(v)[0]),!e||e.hasAttribute(\"disabled\")||e.classList.contains(\"disabled\"))t.preventDefault();else{var o=e.querySelector(_);if(o&&(o.hasAttribute(\"disabled\")||o.classList.contains(\"disabled\")))return void t.preventDefault();\"INPUT\"!==n.tagName&&\"LABEL\"===e.tagName||b._jQueryInterface.call(i.default(e),\"toggle\",\"INPUT\"===n.tagName)}})).on(\"focus.bs.button.data-api blur.bs.button.data-api\",g,(function(t){var e=i.default(t.target).closest(v)[0];i.default(e).toggleClass(\"focus\",/^focus(in)?$/.test(t.type))})),i.default(window).on(\"load.bs.button.data-api\",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle=\"buttons\"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=t.prototype;return e.next=function(){this._isSliding||this._slide(C)},e.nextWhenVisible=function(){var t=i.default(this._element);!document.hidden&&t.is(\":visible\")&&\"hidden\"!==t.css(\"visibility\")&&this.next()},e.prev=function(){this._isSliding||this._slide(S)},e.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(\".carousel-item-next, .carousel-item-prev\")&&(u.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(t){var e=this;this._activeElement=this._element.querySelector(D);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)i.default(this._element).one(N,(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var o=t>n?C:S;this._slide(o,this._items[t])}},e.dispose=function(){i.default(this._element).off(\".bs.carousel\"),i.default.removeData(this._element,E),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(t){return t=a({},A,t),u.typeCheckConfig(y,t,k),t},e._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&i.default(this._element).on(\"keydown.bs.carousel\",(function(e){return t._keydown(e)})),\"hover\"===this._config.pause&&i.default(this._element).on(\"mouseenter.bs.carousel\",(function(e){return t.pause(e)})).on(\"mouseleave.bs.carousel\",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var e=function(e){t._pointerEvent&&I[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},n=function(e){t._pointerEvent&&I[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),\"hover\"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};i.default(this._element.querySelectorAll(\".carousel-item img\")).on(\"dragstart.bs.carousel\",(function(t){return t.preventDefault()})),this._pointerEvent?(i.default(this._element).on(\"pointerdown.bs.carousel\",(function(t){return e(t)})),i.default(this._element).on(\"pointerup.bs.carousel\",(function(t){return n(t)})),this._element.classList.add(\"pointer-event\")):(i.default(this._element).on(\"touchstart.bs.carousel\",(function(t){return e(t)})),i.default(this._element).on(\"touchmove.bs.carousel\",(function(e){return function(e){t.touchDeltaX=e.originalEvent.touches&&e.originalEvent.touches.length>1?0:e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),i.default(this._element).on(\"touchend.bs.carousel\",(function(t){return n(t)})))}},e._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},e._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(\".carousel-item\")):[],this._items.indexOf(t)},e._getItemByDirection=function(t,e){var n=t===C,i=t===S,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var a=(o+(t===S?-1:1))%this._items.length;return-1===a?this._items[this._items.length-1]:this._items[a]},e._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),o=this._getItemIndex(this._element.querySelector(D)),r=i.default.Event(\"slide.bs.carousel\",{relatedTarget:t,direction:e,from:o,to:n});return i.default(this._element).trigger(r),r},e._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(\".active\"));i.default(e).removeClass(T);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&i.default(n).addClass(T)}},e._updateInterval=function(){var t=this._activeElement||this._element.querySelector(D);if(t){var e=parseInt(t.getAttribute(\"data-interval\"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}},e._slide=function(t,e){var n,o,r,a=this,s=this._element.querySelector(D),l=this._getItemIndex(s),f=e||s&&this._getItemByDirection(t,s),d=this._getItemIndex(f),c=Boolean(this._interval);if(t===C?(n=\"carousel-item-left\",o=\"carousel-item-next\",r=\"left\"):(n=\"carousel-item-right\",o=\"carousel-item-prev\",r=\"right\"),f&&i.default(f).hasClass(T))this._isSliding=!1;else if(!this._triggerSlideEvent(f,r).isDefaultPrevented()&&s&&f){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(f),this._activeElement=f;var h=i.default.Event(N,{relatedTarget:f,direction:r,from:l,to:d});if(i.default(this._element).hasClass(\"slide\")){i.default(f).addClass(o),u.reflow(f),i.default(s).addClass(n),i.default(f).addClass(n);var p=u.getTransitionDurationFromElement(s);i.default(s).one(u.TRANSITION_END,(function(){i.default(f).removeClass(n+\" \"+o).addClass(T),i.default(s).removeClass(\"active \"+o+\" \"+n),a._isSliding=!1,setTimeout((function(){return i.default(a._element).trigger(h)}),0)})).emulateTransitionEnd(p)}else i.default(s).removeClass(T),i.default(f).addClass(T),this._isSliding=!1,i.default(this._element).trigger(h);c&&this.cycle()}},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this).data(E),o=a({},A,i.default(this).data());\"object\"==typeof e&&(o=a({},o,e));var r=\"string\"==typeof e?e:o.slide;if(n||(n=new t(this,o),i.default(this).data(E,n)),\"number\"==typeof e)n.to(e);else if(\"string\"==typeof r){if(\"undefined\"==typeof n[r])throw new TypeError('No method named \"'+r+'\"');n[r]()}else o.interval&&o.ride&&(n.pause(),n.cycle())}))},t._dataApiClickHandler=function(e){var n=u.getSelectorFromElement(this);if(n){var o=i.default(n)[0];if(o&&i.default(o).hasClass(\"carousel\")){var r=a({},i.default(o).data(),i.default(this).data()),s=this.getAttribute(\"data-slide-to\");s&&(r.interval=!1),t._jQueryInterface.call(i.default(o),r),s&&i.default(o).data(E).to(s),e.preventDefault()}}},r(t,null,[{key:\"VERSION\",get:function(){return\"4.6.2\"}},{key:\"Default\",get:function(){return A}}]),t}();i.default(document).on(\"click.bs.carousel.data-api\",\"[data-slide], [data-slide-to]\",O._dataApiClickHandler),i.default(window).on(\"load.bs.carousel.data-api\",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride=\"carousel\"]')),e=0,n=t.length;e0&&(this._selector=a,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=t.prototype;return e.toggle=function(){i.default(this._element).hasClass(P)?this.hide():this.show()},e.show=function(){var e,n,o=this;if(!(this._isTransitioning||i.default(this._element).hasClass(P)||(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(\".show, .collapsing\")).filter((function(t){return\"string\"==typeof o._config.parent?t.getAttribute(\"data-parent\")===o._config.parent:t.classList.contains(F)}))).length&&(e=null),e&&(n=i.default(e).not(this._selector).data(j))&&n._isTransitioning))){var r=i.default.Event(\"show.bs.collapse\");if(i.default(this._element).trigger(r),!r.isDefaultPrevented()){e&&(t._jQueryInterface.call(i.default(e).not(this._selector),\"hide\"),n||i.default(e).data(j,null));var a=this._getDimension();i.default(this._element).removeClass(F).addClass(R),this._element.style[a]=0,this._triggerArray.length&&i.default(this._triggerArray).removeClass(B).attr(\"aria-expanded\",!0),this.setTransitioning(!0);var s=\"scroll\"+(a[0].toUpperCase()+a.slice(1)),l=u.getTransitionDurationFromElement(this._element);i.default(this._element).one(u.TRANSITION_END,(function(){i.default(o._element).removeClass(R).addClass(\"collapse show\"),o._element.style[a]=\"\",o.setTransitioning(!1),i.default(o._element).trigger(\"shown.bs.collapse\")})).emulateTransitionEnd(l),this._element.style[a]=this._element[s]+\"px\"}}},e.hide=function(){var t=this;if(!this._isTransitioning&&i.default(this._element).hasClass(P)){var e=i.default.Event(\"hide.bs.collapse\");if(i.default(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+\"px\",u.reflow(this._element),i.default(this._element).addClass(R).removeClass(\"collapse show\");var o=this._triggerArray.length;if(o>0)for(var r=0;r=0)return 1;return 0}(),Y=U&&window.Promise?function(t){var e=!1;return function(){e||(e=!0,window.Promise.resolve().then((function(){e=!1,t()})))}}:function(t){var e=!1;return function(){e||(e=!0,setTimeout((function(){e=!1,t()}),V))}};function z(t){return t&&\"[object Function]\"==={}.toString.call(t)}function K(t,e){if(1!==t.nodeType)return[];var n=t.ownerDocument.defaultView.getComputedStyle(t,null);return e?n[e]:n}function X(t){return\"HTML\"===t.nodeName?t:t.parentNode||t.host}function G(t){if(!t)return document.body;switch(t.nodeName){case\"HTML\":case\"BODY\":return t.ownerDocument.body;case\"#document\":return t.body}var e=K(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?t:G(X(t))}function $(t){return t&&t.referenceNode?t.referenceNode:t}var J=U&&!(!window.MSInputMethodContext||!document.documentMode),Z=U&&/MSIE 10/.test(navigator.userAgent);function tt(t){return 11===t?J:10===t?Z:J||Z}function et(t){if(!t)return document.documentElement;for(var e=tt(10)?document.body:null,n=t.offsetParent||null;n===e&&t.nextElementSibling;)n=(t=t.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&\"BODY\"!==i&&\"HTML\"!==i?-1!==[\"TH\",\"TD\",\"TABLE\"].indexOf(n.nodeName)&&\"static\"===K(n,\"position\")?et(n):n:t?t.ownerDocument.documentElement:document.documentElement}function nt(t){return null!==t.parentNode?nt(t.parentNode):t}function it(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.documentElement;var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?t:e,o=n?e:t,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var a,s,l=r.commonAncestorContainer;if(t!==l&&e!==l||i.contains(o))return\"BODY\"===(s=(a=l).nodeName)||\"HTML\"!==s&&et(a.firstElementChild)!==a?et(l):l;var u=nt(t);return u.host?it(u.host,e):it(t,nt(e).host)}function ot(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"top\",n=\"top\"===e?\"scrollTop\":\"scrollLeft\",i=t.nodeName;if(\"BODY\"===i||\"HTML\"===i){var o=t.ownerDocument.documentElement,r=t.ownerDocument.scrollingElement||o;return r[n]}return t[n]}function rt(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=ot(e,\"top\"),o=ot(e,\"left\"),r=n?-1:1;return t.top+=i*r,t.bottom+=i*r,t.left+=o*r,t.right+=o*r,t}function at(t,e){var n=\"x\"===e?\"Left\":\"Top\",i=\"Left\"===n?\"Right\":\"Bottom\";return parseFloat(t[\"border\"+n+\"Width\"])+parseFloat(t[\"border\"+i+\"Width\"])}function st(t,e,n,i){return Math.max(e[\"offset\"+t],e[\"scroll\"+t],n[\"client\"+t],n[\"offset\"+t],n[\"scroll\"+t],tt(10)?parseInt(n[\"offset\"+t])+parseInt(i[\"margin\"+(\"Height\"===t?\"Top\":\"Left\")])+parseInt(i[\"margin\"+(\"Height\"===t?\"Bottom\":\"Right\")]):0)}function lt(t){var e=t.body,n=t.documentElement,i=tt(10)&&getComputedStyle(n);return{height:st(\"Height\",e,n,i),width:st(\"Width\",e,n,i)}}var ut=function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")},ft=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2],i=tt(10),o=\"HTML\"===e.nodeName,r=pt(t),a=pt(e),s=G(t),l=K(e),u=parseFloat(l.borderTopWidth),f=parseFloat(l.borderLeftWidth);n&&o&&(a.top=Math.max(a.top,0),a.left=Math.max(a.left,0));var d=ht({top:r.top-a.top-u,left:r.left-a.left-f,width:r.width,height:r.height});if(d.marginTop=0,d.marginLeft=0,!i&&o){var c=parseFloat(l.marginTop),h=parseFloat(l.marginLeft);d.top-=u-c,d.bottom-=u-c,d.left-=f-h,d.right-=f-h,d.marginTop=c,d.marginLeft=h}return(i&&!n?e.contains(s):e===s&&\"BODY\"!==s.nodeName)&&(d=rt(d,e)),d}function gt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=t.ownerDocument.documentElement,i=mt(t,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),a=e?0:ot(n),s=e?0:ot(n,\"left\"),l={top:a-i.top+i.marginTop,left:s-i.left+i.marginLeft,width:o,height:r};return ht(l)}function _t(t){var e=t.nodeName;if(\"BODY\"===e||\"HTML\"===e)return!1;if(\"fixed\"===K(t,\"position\"))return!0;var n=X(t);return!!n&&_t(n)}function vt(t){if(!t||!t.parentElement||tt())return document.documentElement;for(var e=t.parentElement;e&&\"none\"===K(e,\"transform\");)e=e.parentElement;return e||document.documentElement}function bt(t,e,n,i){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},a=o?vt(t):it(t,$(e));if(\"viewport\"===i)r=gt(a,o);else{var s=void 0;\"scrollParent\"===i?\"BODY\"===(s=G(X(e))).nodeName&&(s=t.ownerDocument.documentElement):s=\"window\"===i?t.ownerDocument.documentElement:i;var l=mt(s,a,o);if(\"HTML\"!==s.nodeName||_t(a))r=l;else{var u=lt(t.ownerDocument),f=u.height,d=u.width;r.top+=l.top-l.marginTop,r.bottom=f+l.top,r.left+=l.left-l.marginLeft,r.right=d+l.left}}var c=\"number\"==typeof(n=n||0);return r.left+=c?n:n.left||0,r.top+=c?n:n.top||0,r.right-=c?n:n.right||0,r.bottom-=c?n:n.bottom||0,r}function yt(t){return t.width*t.height}function Et(t,e,n,i,o){var r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(-1===t.indexOf(\"auto\"))return t;var a=bt(n,i,r,o),s={top:{width:a.width,height:e.top-a.top},right:{width:a.right-e.right,height:a.height},bottom:{width:a.width,height:a.bottom-e.bottom},left:{width:e.left-a.left,height:a.height}},l=Object.keys(s).map((function(t){return ct({key:t},s[t],{area:yt(s[t])})})).sort((function(t,e){return e.area-t.area})),u=l.filter((function(t){var e=t.width,i=t.height;return e>=n.clientWidth&&i>=n.clientHeight})),f=u.length>0?u[0].key:l[0].key,d=t.split(\"-\")[1];return f+(d?\"-\"+d:\"\")}function wt(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o=i?vt(e):it(e,$(n));return mt(n,o,i)}function Tt(t){var e=t.ownerDocument.defaultView.getComputedStyle(t),n=parseFloat(e.marginTop||0)+parseFloat(e.marginBottom||0),i=parseFloat(e.marginLeft||0)+parseFloat(e.marginRight||0);return{width:t.offsetWidth+i,height:t.offsetHeight+n}}function Ct(t){var e={left:\"right\",right:\"left\",bottom:\"top\",top:\"bottom\"};return t.replace(/left|right|bottom|top/g,(function(t){return e[t]}))}function St(t,e,n){n=n.split(\"-\")[0];var i=Tt(t),o={width:i.width,height:i.height},r=-1!==[\"right\",\"left\"].indexOf(n),a=r?\"top\":\"left\",s=r?\"left\":\"top\",l=r?\"height\":\"width\",u=r?\"width\":\"height\";return o[a]=e[a]+e[l]/2-i[l]/2,o[s]=n===s?e[s]-i[u]:e[Ct(s)],o}function Nt(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}function Dt(t,e,n){return(void 0===n?t:t.slice(0,function(t,e,n){if(Array.prototype.findIndex)return t.findIndex((function(t){return t.name===n}));var i=Nt(t,(function(t){return t.name===n}));return t.indexOf(i)}(t,0,n))).forEach((function(t){t.function&&console.warn(\"`modifier.function` is deprecated, use `modifier.fn`!\");var n=t.function||t.fn;t.enabled&&z(n)&&(e.offsets.popper=ht(e.offsets.popper),e.offsets.reference=ht(e.offsets.reference),e=n(e,t))})),e}function At(){if(!this.state.isDestroyed){var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};t.offsets.reference=wt(this.state,this.popper,this.reference,this.options.positionFixed),t.placement=Et(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),t.originalPlacement=t.placement,t.positionFixed=this.options.positionFixed,t.offsets.popper=St(this.popper,t.offsets.reference,t.placement),t.offsets.popper.position=this.options.positionFixed?\"fixed\":\"absolute\",t=Dt(this.modifiers,t),this.state.isCreated?this.options.onUpdate(t):(this.state.isCreated=!0,this.options.onCreate(t))}}function kt(t,e){return t.some((function(t){var n=t.name;return t.enabled&&n===e}))}function It(t){for(var e=[!1,\"ms\",\"Webkit\",\"Moz\",\"O\"],n=t.charAt(0).toUpperCase()+t.slice(1),i=0;i1&&void 0!==arguments[1]&&arguments[1],n=Qt.indexOf(t),i=Qt.slice(n+1).concat(Qt.slice(0,n));return e?i.reverse():i}var Ut={placement:\"bottom\",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(t){var e=t.placement,n=e.split(\"-\")[0],i=e.split(\"-\")[1];if(i){var o=t.offsets,r=o.reference,a=o.popper,s=-1!==[\"bottom\",\"top\"].indexOf(n),l=s?\"left\":\"top\",u=s?\"width\":\"height\",f={start:dt({},l,r[l]),end:dt({},l,r[l]+r[u]-a[u])};t.offsets.popper=ct({},a,f[i])}return t}},offset:{order:200,enabled:!0,fn:function(t,e){var n,i=e.offset,o=t.placement,r=t.offsets,a=r.popper,s=r.reference,l=o.split(\"-\")[0];return n=Rt(+i)?[+i,0]:function(t,e,n,i){var o=[0,0],r=-1!==[\"right\",\"left\"].indexOf(i),a=t.split(/(\\+|\\-)/).map((function(t){return t.trim()})),s=a.indexOf(Nt(a,(function(t){return-1!==t.search(/,|\\s/)})));a[s]&&-1===a[s].indexOf(\",\")&&console.warn(\"Offsets separated by white space(s) are deprecated, use a comma (,) instead.\");var l=/\\s*,\\s*|\\s+/,u=-1!==s?[a.slice(0,s).concat([a[s].split(l)[0]]),[a[s].split(l)[1]].concat(a.slice(s+1))]:[a];return u=u.map((function(t,i){var o=(1===i?!r:r)?\"height\":\"width\",a=!1;return t.reduce((function(t,e){return\"\"===t[t.length-1]&&-1!==[\"+\",\"-\"].indexOf(e)?(t[t.length-1]=e,a=!0,t):a?(t[t.length-1]+=e,a=!1,t):t.concat(e)}),[]).map((function(t){return function(t,e,n,i){var o=t.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/),r=+o[1],a=o[2];return r?0===a.indexOf(\"%\")?ht(\"%p\"===a?n:i)[e]/100*r:\"vh\"===a||\"vw\"===a?(\"vh\"===a?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r:r:t}(t,o,e,n)}))})),u.forEach((function(t,e){t.forEach((function(n,i){Rt(n)&&(o[e]+=n*(\"-\"===t[i-1]?-1:1))}))})),o}(i,a,s,l),\"left\"===l?(a.top+=n[0],a.left-=n[1]):\"right\"===l?(a.top+=n[0],a.left+=n[1]):\"top\"===l?(a.left+=n[0],a.top-=n[1]):\"bottom\"===l&&(a.left+=n[0],a.top+=n[1]),t.popper=a,t},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(t,e){var n=e.boundariesElement||et(t.instance.popper);t.instance.reference===n&&(n=et(n));var i=It(\"transform\"),o=t.instance.popper.style,r=o.top,a=o.left,s=o[i];o.top=\"\",o.left=\"\",o[i]=\"\";var l=bt(t.instance.popper,t.instance.reference,e.padding,n,t.positionFixed);o.top=r,o.left=a,o[i]=s,e.boundaries=l;var u=e.priority,f=t.offsets.popper,d={primary:function(t){var n=f[t];return f[t]l[t]&&!e.escapeWithReference&&(i=Math.min(f[n],l[t]-(\"right\"===t?f.width:f.height))),dt({},n,i)}};return u.forEach((function(t){var e=-1!==[\"left\",\"top\"].indexOf(t)?\"primary\":\"secondary\";f=ct({},f,d[e](t))})),t.offsets.popper=f,t},priority:[\"left\",\"right\",\"top\",\"bottom\"],padding:5,boundariesElement:\"scrollParent\"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split(\"-\")[0],r=Math.floor,a=-1!==[\"top\",\"bottom\"].indexOf(o),s=a?\"right\":\"bottom\",l=a?\"left\":\"top\",u=a?\"width\":\"height\";return n[s]r(i[s])&&(t.offsets.popper[l]=r(i[s])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!Mt(t.instance.modifiers,\"arrow\",\"keepTogether\"))return t;var i=e.element;if(\"string\"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn(\"WARNING: `arrow.element` must be child of its popper element!\"),t;var o=t.placement.split(\"-\")[0],r=t.offsets,a=r.popper,s=r.reference,l=-1!==[\"left\",\"right\"].indexOf(o),u=l?\"height\":\"width\",f=l?\"Top\":\"Left\",d=f.toLowerCase(),c=l?\"left\":\"top\",h=l?\"bottom\":\"right\",p=Tt(i)[u];s[h]-pa[h]&&(t.offsets.popper[d]+=s[d]+p-a[h]),t.offsets.popper=ht(t.offsets.popper);var m=s[d]+s[u]/2-p/2,g=K(t.instance.popper),_=parseFloat(g[\"margin\"+f]),v=parseFloat(g[\"border\"+f+\"Width\"]),b=m-t.offsets.popper[d]-_-v;return b=Math.max(Math.min(a[u]-p,b),0),t.arrowElement=i,t.offsets.arrow=(dt(n={},d,Math.round(b)),dt(n,c,\"\"),n),t},element:\"[x-arrow]\"},flip:{order:600,enabled:!0,fn:function(t,e){if(kt(t.instance.modifiers,\"inner\"))return t;if(t.flipped&&t.placement===t.originalPlacement)return t;var n=bt(t.instance.popper,t.instance.reference,e.padding,e.boundariesElement,t.positionFixed),i=t.placement.split(\"-\")[0],o=Ct(i),r=t.placement.split(\"-\")[1]||\"\",a=[];switch(e.behavior){case\"flip\":a=[i,o];break;case\"clockwise\":a=Wt(i);break;case\"counterclockwise\":a=Wt(i,!0);break;default:a=e.behavior}return a.forEach((function(s,l){if(i!==s||a.length===l+1)return t;i=t.placement.split(\"-\")[0],o=Ct(i);var u=t.offsets.popper,f=t.offsets.reference,d=Math.floor,c=\"left\"===i&&d(u.right)>d(f.left)||\"right\"===i&&d(u.left)d(f.top)||\"bottom\"===i&&d(u.top)d(n.right),m=d(u.top)d(n.bottom),_=\"left\"===i&&h||\"right\"===i&&p||\"top\"===i&&m||\"bottom\"===i&&g,v=-1!==[\"top\",\"bottom\"].indexOf(i),b=!!e.flipVariations&&(v&&\"start\"===r&&h||v&&\"end\"===r&&p||!v&&\"start\"===r&&m||!v&&\"end\"===r&&g),y=!!e.flipVariationsByContent&&(v&&\"start\"===r&&p||v&&\"end\"===r&&h||!v&&\"start\"===r&&g||!v&&\"end\"===r&&m),E=b||y;(c||_||E)&&(t.flipped=!0,(c||_)&&(i=a[l+1]),E&&(r=function(t){return\"end\"===t?\"start\":\"start\"===t?\"end\":t}(r)),t.placement=i+(r?\"-\"+r:\"\"),t.offsets.popper=ct({},t.offsets.popper,St(t.instance.popper,t.offsets.reference,t.placement)),t=Dt(t.instance.modifiers,t,\"flip\"))})),t},behavior:\"flip\",padding:5,boundariesElement:\"viewport\",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split(\"-\")[0],i=t.offsets,o=i.popper,r=i.reference,a=-1!==[\"left\",\"right\"].indexOf(n),s=-1===[\"top\",\"left\"].indexOf(n);return o[a?\"left\":\"top\"]=r[n]-(s?o[a?\"width\":\"height\"]:0),t.placement=Ct(e),t.offsets.popper=ht(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!Mt(t.instance.modifiers,\"hide\",\"preventOverflow\"))return t;var e=t.offsets.reference,n=Nt(t.instance.modifiers,(function(t){return\"preventOverflow\"===t.name})).boundaries;if(e.bottomn.right||e.top>n.bottom||e.right2&&void 0!==arguments[2]?arguments[2]:{};ut(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(i.update)},this.update=Y(this.update.bind(this)),this.options=ct({},t.Defaults,o),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(ct({},t.Defaults.modifiers,o.modifiers)).forEach((function(e){i.options.modifiers[e]=ct({},t.Defaults.modifiers[e]||{},o.modifiers?o.modifiers[e]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(t){return ct({name:t},i.options.modifiers[t])})).sort((function(t,e){return t.order-e.order})),this.modifiers.forEach((function(t){t.enabled&&z(t.onLoad)&&t.onLoad(i.reference,i.popper,i.options,t,i.state)})),this.update();var r=this.options.eventsEnabled;r&&this.enableEventListeners(),this.state.eventsEnabled=r}return ft(t,[{key:\"update\",value:function(){return At.call(this)}},{key:\"destroy\",value:function(){return Ot.call(this)}},{key:\"enableEventListeners\",value:function(){return Pt.call(this)}},{key:\"disableEventListeners\",value:function(){return Ft.call(this)}}]),t}();Vt.Utils=(\"undefined\"!=typeof window?window:global).PopperUtils,Vt.placements=qt,Vt.Defaults=Ut;var Yt=Vt,zt=\"dropdown\",Kt=\"bs.dropdown\",Xt=i.default.fn[zt],Gt=new RegExp(\"38|40|27\"),$t=\"disabled\",Jt=\"show\",Zt=\"dropdown-menu-right\",te=\"hide.bs.dropdown\",ee=\"hidden.bs.dropdown\",ne=\"click.bs.dropdown.data-api\",ie=\"keydown.bs.dropdown.data-api\",oe='[data-toggle=\"dropdown\"]',re=\".dropdown-menu\",ae={offset:0,flip:!0,boundary:\"scrollParent\",reference:\"toggle\",display:\"dynamic\",popperConfig:null},se={offset:\"(number|string|function)\",flip:\"boolean\",boundary:\"(string|element)\",reference:\"(string|element)\",display:\"string\",popperConfig:\"(null|object)\"},le=function(){function t(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var e=t.prototype;return e.toggle=function(){if(!this._element.disabled&&!i.default(this._element).hasClass($t)){var e=i.default(this._menu).hasClass(Jt);t._clearMenus(),e||this.show(!0)}},e.show=function(e){if(void 0===e&&(e=!1),!(this._element.disabled||i.default(this._element).hasClass($t)||i.default(this._menu).hasClass(Jt))){var n={relatedTarget:this._element},o=i.default.Event(\"show.bs.dropdown\",n),r=t._getParentFromElement(this._element);if(i.default(r).trigger(o),!o.isDefaultPrevented()){if(!this._inNavbar&&e){if(\"undefined\"==typeof Yt)throw new TypeError(\"Bootstrap's dropdowns require Popper (https://popper.js.org)\");var a=this._element;\"parent\"===this._config.reference?a=r:u.isElement(this._config.reference)&&(a=this._config.reference,\"undefined\"!=typeof this._config.reference.jquery&&(a=this._config.reference[0])),\"scrollParent\"!==this._config.boundary&&i.default(r).addClass(\"position-static\"),this._popper=new Yt(a,this._menu,this._getPopperConfig())}\"ontouchstart\"in document.documentElement&&0===i.default(r).closest(\".navbar-nav\").length&&i.default(document.body).children().on(\"mouseover\",null,i.default.noop),this._element.focus(),this._element.setAttribute(\"aria-expanded\",!0),i.default(this._menu).toggleClass(Jt),i.default(r).toggleClass(Jt).trigger(i.default.Event(\"shown.bs.dropdown\",n))}}},e.hide=function(){if(!this._element.disabled&&!i.default(this._element).hasClass($t)&&i.default(this._menu).hasClass(Jt)){var e={relatedTarget:this._element},n=i.default.Event(te,e),o=t._getParentFromElement(this._element);i.default(o).trigger(n),n.isDefaultPrevented()||(this._popper&&this._popper.destroy(),i.default(this._menu).toggleClass(Jt),i.default(o).toggleClass(Jt).trigger(i.default.Event(ee,e)))}},e.dispose=function(){i.default.removeData(this._element,Kt),i.default(this._element).off(\".bs.dropdown\"),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},e.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},e._addEventListeners=function(){var t=this;i.default(this._element).on(\"click.bs.dropdown\",(function(e){e.preventDefault(),e.stopPropagation(),t.toggle()}))},e._getConfig=function(t){return t=a({},this.constructor.Default,i.default(this._element).data(),t),u.typeCheckConfig(zt,t,this.constructor.DefaultType),t},e._getMenuElement=function(){if(!this._menu){var e=t._getParentFromElement(this._element);e&&(this._menu=e.querySelector(re))}return this._menu},e._getPlacement=function(){var t=i.default(this._element.parentNode),e=\"bottom-start\";return t.hasClass(\"dropup\")?e=i.default(this._menu).hasClass(Zt)?\"top-end\":\"top-start\":t.hasClass(\"dropright\")?e=\"right-start\":t.hasClass(\"dropleft\")?e=\"left-start\":i.default(this._menu).hasClass(Zt)&&(e=\"bottom-end\"),e},e._detectNavbar=function(){return i.default(this._element).closest(\".navbar\").length>0},e._getOffset=function(){var t=this,e={};return\"function\"==typeof this._config.offset?e.fn=function(e){return e.offsets=a({},e.offsets,t._config.offset(e.offsets,t._element)),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return\"static\"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),a({},t,this._config.popperConfig)},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this).data(Kt);if(n||(n=new t(this,\"object\"==typeof e?e:null),i.default(this).data(Kt,n)),\"string\"==typeof e){if(\"undefined\"==typeof n[e])throw new TypeError('No method named \"'+e+'\"');n[e]()}}))},t._clearMenus=function(e){if(!e||3!==e.which&&(\"keyup\"!==e.type||9===e.which))for(var n=[].slice.call(document.querySelectorAll(oe)),o=0,r=n.length;o0&&a--,40===e.which&&adocument.documentElement.clientHeight;n||(this._element.style.overflowY=\"hidden\"),this._element.classList.add(pe);var o=u.getTransitionDurationFromElement(this._dialog);i.default(this._element).off(u.TRANSITION_END),i.default(this._element).one(u.TRANSITION_END,(function(){t._element.classList.remove(pe),n||i.default(t._element).one(u.TRANSITION_END,(function(){t._element.style.overflowY=\"\"})).emulateTransitionEnd(t._element,o)})).emulateTransitionEnd(o),this._element.focus()}},e._showElement=function(t){var e=this,n=i.default(this._element).hasClass(ce),o=this._dialog?this._dialog.querySelector(\".modal-body\"):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display=\"block\",this._element.removeAttribute(\"aria-hidden\"),this._element.setAttribute(\"aria-modal\",!0),this._element.setAttribute(\"role\",\"dialog\"),i.default(this._dialog).hasClass(\"modal-dialog-scrollable\")&&o?o.scrollTop=0:this._element.scrollTop=0,n&&u.reflow(this._element),i.default(this._element).addClass(he),this._config.focus&&this._enforceFocus();var r=i.default.Event(\"shown.bs.modal\",{relatedTarget:t}),a=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,i.default(e._element).trigger(r)};if(n){var s=u.getTransitionDurationFromElement(this._dialog);i.default(this._dialog).one(u.TRANSITION_END,a).emulateTransitionEnd(s)}else a()},e._enforceFocus=function(){var t=this;i.default(document).off(_e).on(_e,(function(e){document!==e.target&&t._element!==e.target&&0===i.default(t._element).has(e.target).length&&t._element.focus()}))},e._setEscapeEvent=function(){var t=this;this._isShown?i.default(this._element).on(ye,(function(e){t._config.keyboard&&27===e.which?(e.preventDefault(),t.hide()):t._config.keyboard||27!==e.which||t._triggerBackdropTransition()})):this._isShown||i.default(this._element).off(ye)},e._setResizeEvent=function(){var t=this;this._isShown?i.default(window).on(ve,(function(e){return t.handleUpdate(e)})):i.default(window).off(ve)},e._hideModal=function(){var t=this;this._element.style.display=\"none\",this._element.setAttribute(\"aria-hidden\",!0),this._element.removeAttribute(\"aria-modal\"),this._element.removeAttribute(\"role\"),this._isTransitioning=!1,this._showBackdrop((function(){i.default(document.body).removeClass(de),t._resetAdjustments(),t._resetScrollbar(),i.default(t._element).trigger(me)}))},e._removeBackdrop=function(){this._backdrop&&(i.default(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(t){var e=this,n=i.default(this._element).hasClass(ce)?ce:\"\";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement(\"div\"),this._backdrop.className=\"modal-backdrop\",n&&this._backdrop.classList.add(n),i.default(this._backdrop).appendTo(document.body),i.default(this._element).on(be,(function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&(\"static\"===e._config.backdrop?e._triggerBackdropTransition():e.hide())})),n&&u.reflow(this._backdrop),i.default(this._backdrop).addClass(he),!t)return;if(!n)return void t();var o=u.getTransitionDurationFromElement(this._backdrop);i.default(this._backdrop).one(u.TRANSITION_END,t).emulateTransitionEnd(o)}else if(!this._isShown&&this._backdrop){i.default(this._backdrop).removeClass(he);var r=function(){e._removeBackdrop(),t&&t()};if(i.default(this._element).hasClass(ce)){var a=u.getTransitionDurationFromElement(this._backdrop);i.default(this._backdrop).one(u.TRANSITION_END,r).emulateTransitionEnd(a)}else r()}else t&&t()},e._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+\"px\"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+\"px\")},e._resetAdjustments=function(){this._element.style.paddingLeft=\"\",this._element.style.paddingRight=\"\"},e._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:\"hover focus\",title:\"\",delay:0,html:!1,selector:!1,placement:\"top\",offset:0,container:!1,fallbackPlacement:\"flip\",boundary:\"scrollParent\",customClass:\"\",sanitize:!0,sanitizeFn:null,whiteList:{\"*\":[\"class\",\"dir\",\"id\",\"lang\",\"role\",/^aria-[\\w-]*$/i],a:[\"target\",\"href\",\"title\",\"rel\"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:[\"src\",\"srcset\",\"alt\",\"title\",\"width\",\"height\"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},We={animation:\"boolean\",template:\"string\",title:\"(string|element|function)\",trigger:\"string\",delay:\"(number|object)\",html:\"boolean\",selector:\"(string|boolean)\",placement:\"(string|function)\",offset:\"(number|string|function)\",container:\"(string|element|boolean)\",fallbackPlacement:\"(string|array)\",boundary:\"(string|element)\",customClass:\"(string|function)\",sanitize:\"boolean\",sanitizeFn:\"(null|function)\",whiteList:\"object\",popperConfig:\"(null|object)\"},Ue={HIDE:\"hide.bs.tooltip\",HIDDEN:\"hidden.bs.tooltip\",SHOW:\"show.bs.tooltip\",SHOWN:\"shown.bs.tooltip\",INSERTED:\"inserted.bs.tooltip\",CLICK:\"click.bs.tooltip\",FOCUSIN:\"focusin.bs.tooltip\",FOCUSOUT:\"focusout.bs.tooltip\",MOUSEENTER:\"mouseenter.bs.tooltip\",MOUSELEAVE:\"mouseleave.bs.tooltip\"},Ve=function(){function t(t,e){if(\"undefined\"==typeof Yt)throw new TypeError(\"Bootstrap's tooltips require Popper (https://popper.js.org)\");this._isEnabled=!0,this._timeout=0,this._hoverState=\"\",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=i.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(i.default(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),i.default.removeData(this.element,this.constructor.DATA_KEY),i.default(this.element).off(this.constructor.EVENT_KEY),i.default(this.element).closest(\".modal\").off(\"hide.bs.modal\",this._hideModalHandler),this.tip&&i.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if(\"none\"===i.default(this.element).css(\"display\"))throw new Error(\"Please use show on visible elements\");var e=i.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){i.default(this.element).trigger(e);var n=u.findShadowRoot(this.element),o=i.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!o)return;var r=this.getTipElement(),a=u.getUID(this.constructor.NAME);r.setAttribute(\"id\",a),this.element.setAttribute(\"aria-describedby\",a),this.setContent(),this.config.animation&&i.default(r).addClass(Pe);var s=\"function\"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,l=this._getAttachment(s);this.addAttachmentClass(l);var f=this._getContainer();i.default(r).data(this.constructor.DATA_KEY,this),i.default.contains(this.element.ownerDocument.documentElement,this.tip)||i.default(r).appendTo(f),i.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Yt(this.element,r,this._getPopperConfig(l)),i.default(r).addClass(Fe),i.default(r).addClass(this.config.customClass),\"ontouchstart\"in document.documentElement&&i.default(document.body).children().on(\"mouseover\",null,i.default.noop);var d=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,i.default(t.element).trigger(t.constructor.Event.SHOWN),e===Be&&t._leave(null,t)};if(i.default(this.tip).hasClass(Pe)){var c=u.getTransitionDurationFromElement(this.tip);i.default(this.tip).one(u.TRANSITION_END,d).emulateTransitionEnd(c)}else d()}},e.hide=function(t){var e=this,n=this.getTipElement(),o=i.default.Event(this.constructor.Event.HIDE),r=function(){e._hoverState!==Re&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute(\"aria-describedby\"),i.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(i.default(this.element).trigger(o),!o.isDefaultPrevented()){if(i.default(n).removeClass(Fe),\"ontouchstart\"in document.documentElement&&i.default(document.body).children().off(\"mouseover\",null,i.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,i.default(this.tip).hasClass(Pe)){var a=u.getTransitionDurationFromElement(n);i.default(n).one(u.TRANSITION_END,r).emulateTransitionEnd(a)}else r();this._hoverState=\"\"}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){i.default(this.getTipElement()).addClass(\"bs-tooltip-\"+t)},e.getTipElement=function(){return this.tip=this.tip||i.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(i.default(t.querySelectorAll(\".tooltip-inner\")),this.getTitle()),i.default(t).removeClass(\"fade show\")},e.setElementContent=function(t,e){\"object\"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=ke(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?i.default(e).parent().is(t)||t.empty().append(e):t.text(i.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute(\"data-original-title\");return t||(t=\"function\"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return a({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:\".arrow\"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return\"function\"==typeof this.config.offset?e.fn=function(e){return e.offsets=a({},e.offsets,t.config.offset(e.offsets,t.element)),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:u.isElement(this.config.container)?i.default(this.config.container):i.default(document).find(this.config.container)},e._getAttachment=function(t){return qe[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(\" \").forEach((function(e){if(\"click\"===e)i.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if(\"manual\"!==e){var n=e===He?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o=e===He?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;i.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},i.default(this.element).closest(\".modal\").on(\"hide.bs.modal\",this._hideModalHandler),this.config.selector?this.config=a({},this.config,{trigger:\"manual\",selector:\"\"}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute(\"data-original-title\");(this.element.getAttribute(\"title\")||\"string\"!==t)&&(this.element.setAttribute(\"data-original-title\",this.element.getAttribute(\"title\")||\"\"),this.element.setAttribute(\"title\",\"\"))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||i.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger[\"focusin\"===t.type?Me:He]=!0),i.default(e.getTipElement()).hasClass(Fe)||e._hoverState===Re?e._hoverState=Re:(clearTimeout(e._timeout),e._hoverState=Re,e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){e._hoverState===Re&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||i.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger[\"focusout\"===t.type?Me:He]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=Be,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){e._hoverState===Be&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=i.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Le.indexOf(t)&&delete e[t]})),\"number\"==typeof(t=a({},this.constructor.Default,e,\"object\"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),\"number\"==typeof t.title&&(t.title=t.title.toString()),\"number\"==typeof t.content&&(t.content=t.content.toString()),u.typeCheckConfig(Ie,t,this.constructor.DefaultType),t.sanitize&&(t.template=ke(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=i.default(this.getTipElement()),e=t.attr(\"class\").match(je);null!==e&&e.length&&t.removeClass(e.join(\"\"))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute(\"x-placement\")&&(i.default(t).removeClass(Pe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data(Oe),r=\"object\"==typeof e&&e;if((o||!/dispose|hide/.test(e))&&(o||(o=new t(this,r),n.data(Oe,o)),\"string\"==typeof e)){if(\"undefined\"==typeof o[e])throw new TypeError('No method named \"'+e+'\"');o[e]()}}))},r(t,null,[{key:\"VERSION\",get:function(){return\"4.6.2\"}},{key:\"Default\",get:function(){return Qe}},{key:\"NAME\",get:function(){return Ie}},{key:\"DATA_KEY\",get:function(){return Oe}},{key:\"Event\",get:function(){return Ue}},{key:\"EVENT_KEY\",get:function(){return\".bs.tooltip\"}},{key:\"DefaultType\",get:function(){return We}}]),t}();i.default.fn.tooltip=Ve._jQueryInterface,i.default.fn.tooltip.Constructor=Ve,i.default.fn.tooltip.noConflict=function(){return i.default.fn.tooltip=xe,Ve._jQueryInterface};var Ye=\"bs.popover\",ze=i.default.fn.popover,Ke=new RegExp(\"(^|\\\\s)bs-popover\\\\S+\",\"g\"),Xe=a({},Ve.Default,{placement:\"right\",trigger:\"click\",content:\"\",template:'

'}),Ge=a({},Ve.DefaultType,{content:\"(string|element|function)\"}),$e={HIDE:\"hide.bs.popover\",HIDDEN:\"hidden.bs.popover\",SHOW:\"show.bs.popover\",SHOWN:\"shown.bs.popover\",INSERTED:\"inserted.bs.popover\",CLICK:\"click.bs.popover\",FOCUSIN:\"focusin.bs.popover\",FOCUSOUT:\"focusout.bs.popover\",MOUSEENTER:\"mouseenter.bs.popover\",MOUSELEAVE:\"mouseleave.bs.popover\"},Je=function(t){var e,n;function o(){return t.apply(this,arguments)||this}n=t,(e=o).prototype=Object.create(n.prototype),e.prototype.constructor=e,s(e,n);var a=o.prototype;return a.isWithContent=function(){return this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){i.default(this.getTipElement()).addClass(\"bs-popover-\"+t)},a.getTipElement=function(){return this.tip=this.tip||i.default(this.config.template)[0],this.tip},a.setContent=function(){var t=i.default(this.getTipElement());this.setElementContent(t.find(\".popover-header\"),this.getTitle());var e=this._getContent();\"function\"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(\".popover-body\"),e),t.removeClass(\"fade show\")},a._getContent=function(){return this.element.getAttribute(\"data-content\")||this.config.content},a._cleanTipClass=function(){var t=i.default(this.getTipElement()),e=t.attr(\"class\").match(Ke);null!==e&&e.length>0&&t.removeClass(e.join(\"\"))},o._jQueryInterface=function(t){return this.each((function(){var e=i.default(this).data(Ye),n=\"object\"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new o(this,n),i.default(this).data(Ye,e)),\"string\"==typeof t)){if(\"undefined\"==typeof e[t])throw new TypeError('No method named \"'+t+'\"');e[t]()}}))},r(o,null,[{key:\"VERSION\",get:function(){return\"4.6.2\"}},{key:\"Default\",get:function(){return Xe}},{key:\"NAME\",get:function(){return\"popover\"}},{key:\"DATA_KEY\",get:function(){return Ye}},{key:\"Event\",get:function(){return $e}},{key:\"EVENT_KEY\",get:function(){return\".bs.popover\"}},{key:\"DefaultType\",get:function(){return Ge}}]),o}(Ve);i.default.fn.popover=Je._jQueryInterface,i.default.fn.popover.Constructor=Je,i.default.fn.popover.noConflict=function(){return i.default.fn.popover=ze,Je._jQueryInterface};var Ze=\"scrollspy\",tn=\"bs.scrollspy\",en=i.default.fn[Ze],nn=\"active\",on=\"position\",rn=\".nav, .list-group\",an={offset:10,method:\"auto\",target:\"\"},sn={offset:\"number\",method:\"string\",target:\"(string|element)\"},ln=function(){function t(t,e){var n=this;this._element=t,this._scrollElement=\"BODY\"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+\" .nav-link,\"+this._config.target+\" .list-group-item,\"+this._config.target+\" .dropdown-item\",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,i.default(this._scrollElement).on(\"scroll.bs.scrollspy\",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?\"offset\":on,n=\"auto\"===this._config.method?e:this._config.method,o=n===on?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,r=u.getSelectorFromElement(t);if(r&&(e=document.querySelector(r)),e){var a=e.getBoundingClientRect();if(a.width||a.height)return[i.default(e)[n]().top+o,r]}return null})).filter(Boolean).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){i.default.removeData(this._element,tn),i.default(this._scrollElement).off(\".bs.scrollspy\"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if(\"string\"!=typeof(t=a({},an,\"object\"==typeof t&&t?t:{})).target&&u.isElement(t.target)){var e=i.default(t.target).attr(\"id\");e||(e=u.getUID(Ze),i.default(t.target).attr(\"id\",e)),t.target=\"#\"+e}return u.typeCheckConfig(Ze,t,sn),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(\"undefined\"==typeof this._offsets[o+1]||t li > .active\",gn=function(){function t(t){this._element=t}var e=t.prototype;return e.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&i.default(this._element).hasClass(dn)||i.default(this._element).hasClass(\"disabled\")||this._element.hasAttribute(\"disabled\"))){var e,n,o=i.default(this._element).closest(\".nav, .list-group\")[0],r=u.getSelectorFromElement(this._element);if(o){var a=\"UL\"===o.nodeName||\"OL\"===o.nodeName?mn:pn;n=(n=i.default.makeArray(i.default(o).find(a)))[n.length-1]}var s=i.default.Event(\"hide.bs.tab\",{relatedTarget:this._element}),l=i.default.Event(\"show.bs.tab\",{relatedTarget:n});if(n&&i.default(n).trigger(s),i.default(this._element).trigger(l),!l.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,o);var f=function(){var e=i.default.Event(\"hidden.bs.tab\",{relatedTarget:t._element}),o=i.default.Event(\"shown.bs.tab\",{relatedTarget:n});i.default(n).trigger(e),i.default(t._element).trigger(o)};e?this._activate(e,e.parentNode,f):f()}}},e.dispose=function(){i.default.removeData(this._element,un),this._element=null},e._activate=function(t,e,n){var o=this,r=(!e||\"UL\"!==e.nodeName&&\"OL\"!==e.nodeName?i.default(e).children(pn):i.default(e).find(mn))[0],a=n&&r&&i.default(r).hasClass(cn),s=function(){return o._transitionComplete(t,r,n)};if(r&&a){var l=u.getTransitionDurationFromElement(r);i.default(r).removeClass(hn).one(u.TRANSITION_END,s).emulateTransitionEnd(l)}else s()},e._transitionComplete=function(t,e,n){if(e){i.default(e).removeClass(dn);var o=i.default(e.parentNode).find(\"> .dropdown-menu .active\")[0];o&&i.default(o).removeClass(dn),\"tab\"===e.getAttribute(\"role\")&&e.setAttribute(\"aria-selected\",!1)}i.default(t).addClass(dn),\"tab\"===t.getAttribute(\"role\")&&t.setAttribute(\"aria-selected\",!0),u.reflow(t),t.classList.contains(cn)&&t.classList.add(hn);var r=t.parentNode;if(r&&\"LI\"===r.nodeName&&(r=r.parentNode),r&&i.default(r).hasClass(\"dropdown-menu\")){var a=i.default(t).closest(\".dropdown\")[0];if(a){var s=[].slice.call(a.querySelectorAll(\".dropdown-toggle\"));i.default(s).addClass(dn)}t.setAttribute(\"aria-expanded\",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data(un);if(o||(o=new t(this),n.data(un,o)),\"string\"==typeof e){if(\"undefined\"==typeof o[e])throw new TypeError('No method named \"'+e+'\"');o[e]()}}))},r(t,null,[{key:\"VERSION\",get:function(){return\"4.6.2\"}}]),t}();i.default(document).on(\"click.bs.tab.data-api\",'[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',(function(t){t.preventDefault(),gn._jQueryInterface.call(i.default(this),\"show\")})),i.default.fn.tab=gn._jQueryInterface,i.default.fn.tab.Constructor=gn,i.default.fn.tab.noConflict=function(){return i.default.fn.tab=fn,gn._jQueryInterface};var _n=\"bs.toast\",vn=i.default.fn.toast,bn=\"hide\",yn=\"show\",En=\"showing\",wn=\"click.dismiss.bs.toast\",Tn={animation:!0,autohide:!0,delay:500},Cn={animation:\"boolean\",autohide:\"boolean\",delay:\"number\"},Sn=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=i.default.Event(\"show.bs.toast\");if(i.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add(\"fade\");var n=function(){t._element.classList.remove(En),t._element.classList.add(yn),i.default(t._element).trigger(\"shown.bs.toast\"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove(bn),u.reflow(this._element),this._element.classList.add(En),this._config.animation){var o=u.getTransitionDurationFromElement(this._element);i.default(this._element).one(u.TRANSITION_END,n).emulateTransitionEnd(o)}else n()}},e.hide=function(){if(this._element.classList.contains(yn)){var t=i.default.Event(\"hide.bs.toast\");i.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains(yn)&&this._element.classList.remove(yn),i.default(this._element).off(wn),i.default.removeData(this._element,_n),this._element=null,this._config=null},e._getConfig=function(t){return t=a({},Tn,i.default(this._element).data(),\"object\"==typeof t&&t?t:{}),u.typeCheckConfig(\"toast\",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;i.default(this._element).on(wn,'[data-dismiss=\"toast\"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add(bn),i.default(t._element).trigger(\"hidden.bs.toast\")};if(this._element.classList.remove(yn),this._config.animation){var n=u.getTransitionDurationFromElement(this._element);i.default(this._element).one(u.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data(_n);if(o||(o=new t(this,\"object\"==typeof e&&e),n.data(_n,o)),\"string\"==typeof e){if(\"undefined\"==typeof o[e])throw new TypeError('No method named \"'+e+'\"');o[e](this)}}))},r(t,null,[{key:\"VERSION\",get:function(){return\"4.6.2\"}},{key:\"DefaultType\",get:function(){return Cn}},{key:\"Default\",get:function(){return Tn}}]),t}();i.default.fn.toast=Sn._jQueryInterface,i.default.fn.toast.Constructor=Sn,i.default.fn.toast.noConflict=function(){return i.default.fn.toast=vn,Sn._jQueryInterface},t.Alert=c,t.Button=b,t.Carousel=O,t.Collapse=W,t.Dropdown=le,t.Modal=Se,t.Popover=Je,t.Scrollspy=ln,t.Tab=gn,t.Toast=Sn,t.Tooltip=Ve,t.Util=u,Object.defineProperty(t,\"__esModule\",{value:!0})}));\n//# sourceMappingURL=bootstrap.bundle.min.js.map","/**\r\n * @license\r\n * webix UI v.6.0.4\r\n * This software is covered by Webix Commercial License.\r\n * Usage without proper license is prohibited.\r\n * (c) XB Software Ltd.\r\n */\r\n\r\n(function (global, factory) {\r\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\r\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\r\n\t(factory((global.webix = {})));\r\n}(this, (function (exports) { 'use strict';\r\n\r\n\tvar state = {\r\n\t codebase: \"./\",\r\n\t cdn: \"//cdn.webix.com\",\r\n\t top_views: [],\r\n\t _global_collection: null,\r\n\t _child_sizing_active: null,\r\n\t _responsive_exception: null,\r\n\t _responsive_tinkery: null,\r\n\t _freeze_resize: null,\r\n\t _parent_cell: null,\r\n\t _focus_time: null,\r\n\t _ui_creation: 0,\r\n\t _edit_open_time: null,\r\n\t _final_destruction: null,\r\n\t _events: [],\r\n\t destructors: [],\r\n\t securityKey: \"\",\r\n\t _noselect_element: null,\r\n\t _modality: 0,\r\n\t _wait_animate: null,\r\n\t noanimate: false\r\n\t};\r\n\r\n\tvar env = {};\r\n\tenv.cdn = \"//cdn.webix.com/\";\r\n\tenv.codebase = \"\";\r\n\tenv.zIndexBase = 100;\r\n\tenv.scrollSize = 17;\r\n\tenv.strict = !!window.webix_strict;\r\n\tenv.https = document.location.protocol === \"https:\";\r\n\tvar agent = navigator.userAgent;\r\n\tenv.isMac = agent.indexOf(\"Mac\") != -1;\r\n\tif (agent.indexOf(\"Mobile\") != -1 || agent.indexOf(\"Windows Phone\") != -1) env.mobile = true;\r\n\tif (env.mobile || agent.indexOf(\"iPad\") != -1 || agent.indexOf(\"Android\") != -1) env.touch = true;\r\n\tif (agent.indexOf(\"Opera\") != -1) env.isOpera = true;else {\r\n\t //very rough detection, but it is enough for current goals\r\n\t env.isIE = !!document.all || agent.indexOf(\"Trident\") !== -1;\r\n\r\n\t if (env.isIE) {\r\n\t var version = parseFloat(navigator.appVersion.split(\"MSIE\")[1]);\r\n\t if (version == 8) env.isIE8 = true;\r\n\t }\r\n\r\n\t env.isEdge = agent.indexOf(\"Edge\") != -1;\r\n\t env.isFF = agent.indexOf(\"Firefox\") != -1;\r\n\t env.isWebKit = agent.indexOf(\"KHTML\") != -1;\r\n\t env.isSafari = env.isWebKit && env.isMac && agent.indexOf(\"Chrome\") == -1; //maximum height/width for HTML elements in pixels (rough), bigger values will be ignored by browser\r\n\r\n\t if (env.isIE || env.isEdge || env.isFF) env.maxHTMLElementSize = 10000000;\r\n\t if (env.isSafari) env.maxHTMLElementSize = 100000000;\r\n\t}\r\n\r\n\tif (agent.toLowerCase().indexOf(\"android\") != -1) {\r\n\t env.isAndroid = true;\r\n\r\n\t if (agent.toLowerCase().indexOf(\"trident\") != -1) {\r\n\t env.isAndroid = false;\r\n\t env.isIEMobile = true;\r\n\t }\r\n\t}\r\n\r\n\tenv.transform = false;\r\n\tenv.transition = false;\r\n\tvar found_index = -1;\r\n\tvar js_list = [\"\", \"webkit\", \"Moz\", \"O\", \"ms\"];\r\n\tvar css_list = [\"\", \"-webkit-\", \"-Moz-\", \"-o-\", \"-ms-\"];\r\n\tvar d = document.createElement(\"DIV\");\r\n\r\n\tfor (var j = 0; j < js_list.length; j++) {\r\n\t var name = js_list[j] ? js_list[j] + \"Transform\" : \"transform\";\r\n\r\n\t if (typeof d.style[name] != \"undefined\") {\r\n\t found_index = j;\r\n\t break;\r\n\t }\r\n\t}\r\n\r\n\tif (found_index > -1) {\r\n\t env.cssPrefix = css_list[found_index];\r\n\t var jp = env.jsPrefix = js_list[found_index];\r\n\t env.transform = jp ? jp + \"Transform\" : \"transform\";\r\n\t env.transition = jp ? jp + \"Transition\" : \"transition\";\r\n\t env.transitionDuration = jp ? jp + \"TransitionDuration\" : \"transitionDuration\";\r\n\t d.style[env.transform] = \"translate3d(0,0,0)\";\r\n\t env.translate = d.style[env.transform] ? \"translate3d\" : \"translate\";\r\n\t env.transitionEnd = env.cssPrefix == \"-Moz-\" ? \"transitionend\" : jp ? jp + \"TransitionEnd\" : \"transitionend\";\r\n\t}\r\n\r\n\tenv.pointerevents = !env.isIE || new RegExp(\"Trident/.*rv:11\").exec(agent) !== null; //touch events that can be prevented\r\n\r\n\tenv.passiveEventListeners = false;\r\n\r\n\ttry {\r\n\t var opts = Object.defineProperty({}, \"passive\", {\r\n\t get: function get() {\r\n\t // eslint-disable-line\r\n\t env.passiveEventListeners = true;\r\n\t }\r\n\t });\r\n\t window.addEventListener(\"testPassive\", null, opts);\r\n\t window.removeEventListener(\"testPassive\", null, opts);\r\n\t} catch (e) {} // eslint-disable-line\r\n\r\n\r\n\tenv.svg = function () {\r\n\t return document.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\", \"1.1\");\r\n\t}();\r\n\r\n\tenv.svganimation = function () {\r\n\t return document.implementation.hasFeature(\"https://www.w3.org/TR/SVG11/feature#SVG-animation\", \"1.1\");\r\n\t}();\r\n\r\n\tfunction _typeof(obj) {\r\n\t if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\r\n\t _typeof = function (obj) {\r\n\t return typeof obj;\r\n\t };\r\n\t } else {\r\n\t _typeof = function (obj) {\r\n\t return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\r\n\t };\r\n\t }\r\n\r\n\t return _typeof(obj);\r\n\t}\r\n\r\n\t// resolves circular dependencies\r\n\t// quick solution, must be removed in the next versions\r\n\tvar services = {};\r\n\tfunction define(name, value) {\r\n\t services[name] = value;\r\n\t}\r\n\tfunction use(name) {\r\n\t return services[name];\r\n\t}\r\n\r\n function assert(test, msg) {\r\n //Note - Disabled as webix seems to not like angular's html id population\r\n\t //if (!test) {\r\n\t // log(\"error\", msg);\r\n\t // var message = use(\"message\");\r\n\t // if (message && typeof msg == \"string\") message({\r\n\t // type: \"debug\",\r\n\t // text: msg,\r\n\t // expire: -1\r\n\t // });\r\n\t // debugger; // eslint-disable-line\r\n\t //}\r\n\t} //show log message\r\n\r\n\tfunction log(type, message, details) {\r\n\t if (arguments.length == 1) {\r\n\t message = type;\r\n\t type = \"log\";\r\n\t }\r\n\r\n\t if (window.console && window.console.log) {\r\n\t type = type.toLowerCase();\r\n\t if (window.console[type]) window.console[type](message || \"unknown error\");else window.console.log(type + \": \" + message);\r\n\t if (details) window.console.log(details);\r\n\t }\r\n\t}\r\n\tvar debug_mode = {};\r\n\tfunction debug(mode) {\r\n\t if (!mode) debug_mode = {};else if (_typeof(mode) !== \"object\") debug_mode = {\r\n\t events: true\r\n\t };else for (var key in mode) {\r\n\t debug_mode[key] = mode[key];\r\n\t }\r\n\t}\r\n\tvar debug_size_indent = 0;\r\n\r\n\tfunction debug_size_step() {\r\n\t var str = \"\";\r\n\r\n\t for (var i = 0; i < debug_size_indent; i++) {\r\n\t str += \"| \";\r\n\t }\r\n\r\n\t return str;\r\n\t}\r\n\r\n\tfunction debug_size_box_start(comp, get) {\r\n\t if (!debug_mode.size) return;\r\n\t if (!debug_size_indent) log(get ? \"--- get sizes ---\" : \"--- set sizes ---\");\r\n\t log(debug_size_step() + comp.name + \"@\" + comp.config.id);\r\n\t debug_size_indent++;\r\n\t}\r\n\tfunction debug_size_box_end(comp, sizes) {\r\n\t if (!debug_mode.size) return;\r\n\t debug_size_indent--;\r\n\t log(debug_size_step() + sizes.join(\",\"));\r\n\t}\r\n\tfunction debug_size_box(comp, sizes, get) {\r\n\t if (!debug_mode.size) return;\r\n\t if (!debug_size_indent) log(get ? \"--- get sizes ---\" : \"--- set sizes ---\");\r\n\t log(debug_size_step() + comp.name + \"@\" + comp.config.id + \" \" + sizes.join(\",\"));\r\n\t}\r\n\r\n\tvar level = 0;\r\n\tfunction level_in() {\r\n\t level++;\r\n\t assert(level !== 100, \"Attempt to copy object with self reference\");\r\n\t}\r\n\tfunction level_out() {\r\n\t level--;\r\n\t} //coding helpers\r\n\r\n\tfunction clone(source) {\r\n\t var f = clone._function;\r\n\t f.prototype = source;\r\n\t return new f();\r\n\t}\r\n\r\n\tclone._function = function () {}; //copies methods and properties from source to the target\r\n\r\n\r\n\texports.extend = function extend(base, source, force) {\r\n\t assert(base, \"Invalid mixing target\");\r\n\t assert(source, \"Invalid mixing source\");\r\n\r\n\t if (base.$protoWait) {\r\n\t PowerArray.insertAt.call(base.$protoWait, source, 1);\r\n\t return base;\r\n\t } //copy methods, overwrite existing ones in case of conflict\r\n\r\n\r\n\t for (var method in source) {\r\n\t if (!(method in base) || force) base[method] = source[method];\r\n\t } //in case of defaults - preffer top one\r\n\r\n\r\n\t if (source.defaults) exports.extend(base.defaults, source.defaults); //if source object has init code - call init against target\r\n\r\n\t if (source.$init) source.$init.call(base);\r\n\t return base;\r\n\t}; //copies methods and properties from source to the target from all levels\r\n\r\n\r\n\tfunction copy(source) {\r\n\t assert(source, \"Invalid mixing target\");\r\n\t level_in();\r\n\t var esModern = !!window.Map && !!window.Set && !!window.WeakMap && !!window.WeakSet;\r\n\t var target;\r\n\r\n\t if (arguments.length > 1) {\r\n\t target = arguments[0];\r\n\t source = arguments[1];\r\n\t } else target = isArray(source) ? [] : {};\r\n\r\n\t for (var method in source) {\r\n\t var from = source[method];\r\n\r\n\t if (from && _typeof(from) == \"object\" && !(from instanceof RegExp)) {\r\n\t if (isDate(from)) target[method] = new Date(from);\r\n\t /* jshint ignore:start */\r\n\t else if (esModern && (from instanceof Map || from instanceof Set || from instanceof WeakMap || from instanceof WeakSet)) target[method] = from;\r\n\t /* jshint ignore:end */\r\n\t else {\r\n\t target[method] = isArray(from) ? [] : {};\r\n\t copy(target[method], from);\r\n\t }\r\n\t } else {\r\n\t target[method] = from;\r\n\t }\r\n\t }\r\n\r\n\t level_out();\r\n\t return target;\r\n\t}\r\n\tfunction single(source) {\r\n\t var instance = null;\r\n\r\n\t var t = function t() {\r\n\t if (!instance) instance = new source({});\r\n\t if (instance._reinit) instance._reinit.apply(instance, arguments);\r\n\t return instance;\r\n\t };\r\n\r\n\t return t;\r\n\t} //creates function with specified \"this\" pointer\r\n\r\n\tfunction bind(functor, object) {\r\n\t return function () {\r\n\t return functor.apply(object, arguments);\r\n\t };\r\n\t} //evaluate javascript code in the global scoope\r\n\r\n\tfunction exec(code) {\r\n\t if (window.execScript) //special handling for IE\r\n\t window.execScript(code);else window.eval(code);\r\n\t}\r\n\tfunction wrap(code, wrap) {\r\n\t if (!code) return wrap;\r\n\t return function () {\r\n\t var result = code.apply(this, arguments);\r\n\t wrap.apply(this, arguments);\r\n\t return result;\r\n\t };\r\n\t} //check === undefined\r\n\r\n\tfunction isUndefined(a) {\r\n\t return typeof a == \"undefined\";\r\n\t} //delay call to after-render time\r\n\r\n\tfunction delay(method, obj, params, delay) {\r\n\t return window.setTimeout(function () {\r\n\t if (!(obj && obj.$destructed)) {\r\n\t var ret = method.apply(obj, params || []);\r\n\t method = obj = params = null;\r\n\t return ret;\r\n\t }\r\n\t }, delay || 1);\r\n\t}\r\n\tfunction once(method) {\r\n\t var flag = true;\r\n\t return function () {\r\n\t if (flag) {\r\n\t flag = false;\r\n\t method.apply(this, arguments);\r\n\t }\r\n\t };\r\n\t} //common helpers\r\n\t//generates unique ID (unique per window, nog GUID)\r\n\r\n\tvar _seed = new Date().valueOf();\r\n\r\n\tfunction uid() {\r\n\t _seed++;\r\n\t return _seed;\r\n\t} //resolve ID as html object\r\n\r\n\tfunction toNode(node) {\r\n\t if (typeof node == \"string\") return document.getElementById(node);\r\n\t return node;\r\n\t} //adds extra methods for the array\r\n\r\n\tfunction toArray(array) {\r\n\t return exports.extend(array || [], PowerArray, true);\r\n\t} //resolve function name\r\n\r\n\tfunction toFunctor(str, scope) {\r\n\t if (typeof str == \"string\") {\r\n\t var method = str.replace(\"()\", \"\");\r\n\t if (scope && scope[method]) return scope[method];\r\n\t return window[method] || window.eval(str);\r\n\t }\r\n\r\n\t return str;\r\n\t}\r\n\t/*checks where an object is instance of Array*/\r\n\r\n\tfunction isArray(obj) {\r\n\t return Array.isArray ? Array.isArray(obj) : Object.prototype.toString.call(obj) === \"[object Array]\";\r\n\t}\r\n\tfunction isDate(obj) {\r\n\t return obj instanceof Date;\r\n\t} //can be used by toArray()\r\n\r\n\tvar PowerArray = {\r\n\t //remove element at specified position\r\n\t removeAt: function removeAt(pos, len) {\r\n\t if (pos >= 0) this.splice(pos, len || 1);\r\n\t },\r\n\t //find element in collection and remove it \r\n\t remove: function remove(value) {\r\n\t this.removeAt(this.find(value));\r\n\t },\r\n\t //add element to collection at specific position\r\n\t insertAt: function insertAt(data, pos) {\r\n\t if (!pos && pos !== 0) //add to the end by default\r\n\t this.push(data);else {\r\n\t var b = this.splice(pos, this.length - pos);\r\n\t this[pos] = data;\r\n\t this.push.apply(this, b); //reconstruct array without loosing this pointer\r\n\t }\r\n\t },\r\n\t //return index of element, -1 if it doesn't exists\r\n\t find: function find(data) {\r\n\t for (var i = 0; i < this.length; i++) {\r\n\t if (data == this[i]) return i;\r\n\t }\r\n\r\n\t return -1;\r\n\t },\r\n\t //execute some method for each element of array\r\n\t each: function each(functor, master) {\r\n\t for (var i = 0; i < this.length; i++) {\r\n\t functor.call(master || this, this[i]);\r\n\t }\r\n\t },\r\n\t //create new array from source, by using results of functor \r\n\t map: function map(functor, master) {\r\n\t for (var i = 0; i < this.length; i++) {\r\n\t this[i] = functor.call(master || this, this[i]);\r\n\t }\r\n\r\n\t return this;\r\n\t },\r\n\t filter: function filter(functor, master) {\r\n\t for (var i = 0; i < this.length; i++) {\r\n\t if (!functor.call(master || this, this[i])) {\r\n\t this.splice(i, 1);\r\n\t i--;\r\n\t }\r\n\t }\r\n\r\n\t return this;\r\n\t }\r\n\t}; //hook for documentation generator\r\n\r\n\t{\r\n\t if (window.webix_on_core_ready) {\r\n\t exports.extend = window.webix_on_core_ready({\r\n\t extend: exports.extend\r\n\t }).extend;\r\n\t }\r\n\t}\r\n\r\n\tvar EventSystem = {\r\n\t $init: function $init() {\r\n\t if (!this._evs_events) {\r\n\t this._evs_events = {}; //hash of event handlers, name => handler\r\n\r\n\t this._evs_handlers = {}; //hash of event handlers, ID => handler\r\n\r\n\t this._evs_map = {};\r\n\t }\r\n\t },\r\n\t //temporary block event triggering\r\n\t blockEvent: function blockEvent() {\r\n\t this._evs_events._block = true;\r\n\t },\r\n\t //re-enable event triggering\r\n\t unblockEvent: function unblockEvent() {\r\n\t this._evs_events._block = false;\r\n\t },\r\n\t mapEvent: function mapEvent(map) {\r\n\t exports.extend(this._evs_map, map, true);\r\n\t },\r\n\t on_setter: function on_setter(config) {\r\n\t if (config) {\r\n\t for (var i in config) {\r\n\t var method = toFunctor(config[i], this.$scope);\r\n\t var sub = i.indexOf(\"->\");\r\n\r\n\t if (sub !== -1) {\r\n\t this[i.substr(0, sub)].attachEvent(i.substr(sub + 2), bind(method, this));\r\n\t } else this.attachEvent(i, method);\r\n\t }\r\n\t }\r\n\t },\r\n\t //trigger event\r\n\t callEvent: function callEvent(type, params) {\r\n\t var master = this._event_master || this;\r\n\t if (this._evs_events._block) return true;\r\n\t type = type.toLowerCase();\r\n\r\n\t var event_stack = this._evs_events[type.toLowerCase()]; //all events for provided name\r\n\r\n\r\n\t var return_value = true;\r\n\t if ((debug_mode.events || this.debug) && type !== \"onmousemoving\") //can slowdown a lot\r\n\t log(\"info\", \"[\" + this.name + \"@\" + (this._settings || {}).id + \"] event:\" + type, params);\r\n\t if (event_stack) for (var i = 0; i < event_stack.length; i++) {\r\n\t /*\r\n\t \tCall events one by one\r\n\t \tIf any event return false - result of whole event will be false\r\n\t \tHandlers which are not returning anything - counted as positive\r\n\t */\r\n\t if (event_stack[i].apply(master, params || []) === false) return_value = false;\r\n\t }\r\n\r\n\t if (this._evs_map[type]) {\r\n\t var target = this._evs_map[type];\r\n\t target.$eventSource = this;\r\n\t if (!target.callEvent(type, params)) return_value = false;\r\n\t target.$eventSource = null;\r\n\t }\r\n\r\n\t return return_value;\r\n\t },\r\n\t //assign handler for some named event\r\n\t attachEvent: function attachEvent(type, functor, id) {\r\n\t assert(functor, \"Invalid event handler for \" + type);\r\n\t type = type.toLowerCase();\r\n\t id = id || uid(); //ID can be used for detachEvent\r\n\r\n\t functor = toFunctor(functor, this.$scope); //functor can be a name of method\r\n\r\n\t var event_stack = this._evs_events[type] || toArray(); //save new event handler\r\n\r\n\t if (arguments[3]) event_stack.unshift(functor);else event_stack.push(functor);\r\n\t this._evs_events[type] = event_stack;\r\n\t this._evs_handlers[id] = {\r\n\t f: functor,\r\n\t t: type\r\n\t };\r\n\t return id;\r\n\t },\r\n\t //remove event handler\r\n\t detachEvent: function detachEvent(id) {\r\n\t if (!this._evs_handlers[id]) {\r\n\t var name = (id + \"\").toLowerCase();\r\n\r\n\t if (this._evs_events[name]) {\r\n\t this._evs_events[name] = toArray();\r\n\t }\r\n\r\n\t return;\r\n\t }\r\n\r\n\t var type = this._evs_handlers[id].t;\r\n\t var functor = this._evs_handlers[id].f; //remove from all collections\r\n\r\n\t var event_stack = this._evs_events[type];\r\n\t event_stack.remove(functor);\r\n\t delete this._evs_handlers[id];\r\n\t },\r\n\t hasEvent: function hasEvent(type) {\r\n\t type = type.toLowerCase();\r\n\t var stack = this._evs_events[type];\r\n\t if (stack && stack.length) return true;\r\n\t var parent = this._evs_map[type];\r\n\t if (parent) return parent.hasEvent(type);\r\n\t return false;\r\n\t }\r\n\t};\r\n\r\n\tvar evs = {};\r\n\texports.extend(evs, EventSystem, true);\r\n\tvar callEvent = function callEvent(a, b) {\r\n\t return evs.callEvent(a, b);\r\n\t};\r\n\tvar attachEvent = function attachEvent(a, b, c, d) {\r\n\t return evs.attachEvent(a, b, c, d);\r\n\t};\r\n\tvar detachEvent = function detachEvent(a) {\r\n\t return evs.detachEvent(a);\r\n\t};\r\n\tvar blockEvent = function blockEvent() {\r\n\t return evs.blockEvent();\r\n\t};\r\n\tvar unblockEvent = function unblockEvent() {\r\n\t return evs.unblockEvent();\r\n\t};\r\n\tvar mapEvent = function mapEvent(map) {\r\n\t return evs.mapEvent(map);\r\n\t};\r\n\tvar hasEvent = function hasEvent(type) {\r\n\t return evs.hasEvent(type);\r\n\t};\r\n\r\n\tvar _native_on_selectstart = 0;\r\n\tvar _style_element = {};\r\n\tvar _style_cache = {};\r\n\tfunction denySelect() {\r\n\t if (!_native_on_selectstart) _native_on_selectstart = document.onselectstart;\r\n\t document.onselectstart = stopEvent;\r\n\t}\r\n\tfunction allowSelect() {\r\n\t if (_native_on_selectstart !== 0) {\r\n\t document.onselectstart = _native_on_selectstart || null;\r\n\t }\r\n\r\n\t _native_on_selectstart = 0;\r\n\t}\r\n\tfunction index(node) {\r\n\t var k = 0; //must be =, it is not a comparation!\r\n\r\n\t while (node = node.previousSibling) {\r\n\t k++;\r\n\t }\r\n\r\n\t return k;\r\n\t}\r\n\tfunction createCss(rule, sufix) {\r\n\t var text = \"\";\r\n\t sufix = sufix || \"\";\r\n\r\n\t for (var key in rule) {\r\n\t text += key + \":\" + rule[key] + \";\";\r\n\t }\r\n\r\n\t var name = _style_cache[text + sufix];\r\n\r\n\t if (!name) {\r\n\t name = \"s\" + uid();\r\n\t addStyle(\".\" + name + (sufix || \"\") + \"{\" + text + \"}\");\r\n\t _style_cache[text + sufix] = name;\r\n\t }\r\n\r\n\t return name;\r\n\t}\r\n\tfunction addStyle(rule, group) {\r\n\t var style = group ? _style_element[group] : _style_element[\"default\"];\r\n\r\n\t if (!style) {\r\n\t style = document.createElement(\"style\");\r\n\t style.setAttribute(\"type\", \"text/css\");\r\n\t style.setAttribute(\"media\", \"screen,print\");\r\n\t document.getElementsByTagName(\"head\")[0].appendChild(style);\r\n\t if (group) _style_element[group] = style;else _style_element[\"default\"] = style;\r\n\t }\r\n\t /*IE8*/\r\n\r\n\r\n\t if (style.styleSheet) style.styleSheet.cssText += rule;else style.appendChild(document.createTextNode(rule));\r\n\t}\r\n\tfunction removeStyle(group) {\r\n\t var box = _style_element[group || \"default\"];\r\n\t if (box) box.innerHTML = \"\";\r\n\t}\r\n\tfunction create(name, attrs, html) {\r\n\t attrs = attrs || {};\r\n\t var node = document.createElement(name);\r\n\r\n\t for (var attr_name in attrs) {\r\n\t node.setAttribute(attr_name, attrs[attr_name]);\r\n\t }\r\n\r\n\t if (attrs.style) node.style.cssText = attrs.style;\r\n\t if (attrs[\"class\"]) node.className = attrs[\"class\"];\r\n\t if (html) node.innerHTML = html;\r\n\t return node;\r\n\t} //return node value, different logic for different html elements\r\n\r\n\tfunction getValue(node) {\r\n\t node = toNode(node);\r\n\t if (!node) return \"\";\r\n\t return isUndefined(node.value) ? node.innerHTML : node.value;\r\n\t} //remove html node, can process an array of nodes at once\r\n\r\n\tfunction remove(node) {\r\n\t if (node instanceof Array) for (var i = 0; i < node.length; i++) {\r\n\t remove(node[i]);\r\n\t } else if (node && node.parentNode) node.parentNode.removeChild(node);\r\n\t} //insert new node before sibling, or at the end if sibling doesn't exist\r\n\r\n\tfunction insertBefore(node, before, rescue) {\r\n\t if (!node) return;\r\n\t if (before && before.parentNode) before.parentNode.insertBefore(node, before);else rescue.appendChild(node);\r\n\t} //return custom ID from html element \r\n\t//will check all parents starting from event's target\r\n\r\n\tfunction locate(e, id) {\r\n\t var trg;\r\n\t if (e.tagName) trg = e;else {\r\n\t e = e || event;\r\n\t trg = e.target || e.srcElement;\r\n\t }\r\n\r\n\t while (trg) {\r\n\t if (trg.getAttribute) {\r\n\t //text nodes has not getAttribute\r\n\t var test = trg.getAttribute(id);\r\n\t if (test) return test;\r\n\t }\r\n\r\n\t trg = trg.parentNode;\r\n\t }\r\n\r\n\t return null;\r\n\t} //returns position of html element on the page\r\n\r\n\tfunction offset(elem) {\r\n\t if (elem.getBoundingClientRect) {\r\n\t //HTML5 method\r\n\t var box = elem.getBoundingClientRect();\r\n\t var body = document.body;\r\n\t var docElem = document.documentElement;\r\n\t var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;\r\n\t var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;\r\n\t var clientTop = docElem.clientTop || body.clientTop || 0;\r\n\t var clientLeft = docElem.clientLeft || body.clientLeft || 0;\r\n\t var top = box.top + scrollTop - clientTop;\r\n\t var left = box.left + scrollLeft - clientLeft;\r\n\t return {\r\n\t y: Math.round(top),\r\n\t x: Math.round(left),\r\n\t width: elem.offsetWidth,\r\n\t height: elem.offsetHeight\r\n\t };\r\n\t } else {\r\n\t //fallback to naive approach\r\n\t var _top = 0,\r\n\t _left = 0;\r\n\r\n\t while (elem) {\r\n\t _top = _top + parseInt(elem.offsetTop, 10);\r\n\t _left = _left + parseInt(elem.offsetLeft, 10);\r\n\t elem = elem.offsetParent;\r\n\t }\r\n\r\n\t return {\r\n\t y: _top,\r\n\t x: _left,\r\n\t width: elem.offsetHeight,\r\n\t height: elem.offsetWidth\r\n\t };\r\n\t }\r\n\t} //returns relative position of event\r\n\r\n\tfunction posRelative(ev) {\r\n\t ev = ev || event;\r\n\t if (!isUndefined(ev.offsetX)) return {\r\n\t x: ev.offsetX,\r\n\t y: ev.offsetY\r\n\t }; //ie, webkit\r\n\t else return {\r\n\t x: ev.layerX,\r\n\t y: ev.layerY\r\n\t }; //firefox\r\n\t} //returns position of event\r\n\r\n\tfunction pos(ev) {\r\n\t ev = ev || event;\r\n\t if (ev.touches && ev.touches[0]) ev = ev.touches[0];\r\n\t if (ev.pageX || ev.pageY) //FF, KHTML\r\n\t return {\r\n\t x: ev.pageX,\r\n\t y: ev.pageY\r\n\t }; //IE\r\n\r\n\t var d = env.isIE && document.compatMode != \"BackCompat\" ? document.documentElement : document.body;\r\n\t return {\r\n\t x: ev.clientX + d.scrollLeft - d.clientLeft,\r\n\t y: ev.clientY + d.scrollTop - d.clientTop\r\n\t };\r\n\t} //prevent event action\r\n\r\n\tfunction preventEvent(e) {\r\n\t if (e && e.preventDefault) e.preventDefault();\r\n\t if (e) e.returnValue = false;\r\n\t return stopEvent(e);\r\n\t} //stop event bubbling\r\n\r\n\tfunction stopEvent(e) {\r\n\t e = e || event;\r\n\t if (e.stopPropagation) e.stopPropagation();\r\n\t e.cancelBubble = true;\r\n\t return false;\r\n\t}\r\n\tfunction triggerEvent(node, type, name) {\r\n\t if (document.createEventObject) {\r\n\t var ev = document.createEventObject();\r\n\t if (node.fireEvent) node.fireEvent(\"on\" + name, ev);\r\n\t } else {\r\n\t var _ev = document.createEvent(type);\r\n\r\n\t _ev.initEvent(name, true, true);\r\n\r\n\t if (node.dispatchEvent) node.dispatchEvent(_ev);\r\n\t }\r\n\t} //add css class to the node\r\n\r\n\tfunction addCss(node, name, check) {\r\n\t if (!check || node.className.indexOf(name) === -1) node.className += \" \" + name;\r\n\t} //remove css class from the node\r\n\r\n\tfunction removeCss(node, name) {\r\n\t node.className = node.className.replace(RegExp(\" \" + name, \"g\"), \"\");\r\n\t}\r\n\tfunction getTextSize(text, css, basewidth) {\r\n\t var d = create(\"DIV\", {\r\n\t \"class\": \"webix_view webix_measure_size \" + (css || \"\")\r\n\t }, \"\");\r\n\t d.style.cssText = \"height:auto;visibility:hidden; position:absolute; top:0px; left:0px; overflow:hidden;\" + (basewidth ? \"width:\" + basewidth + \"px;\" : \"width:auto;white-space:nowrap;\");\r\n\t document.body.appendChild(d);\r\n\t var all = _typeof(text) !== \"object\" ? [text] : text;\r\n\t var width = 0;\r\n\t var height = 0;\r\n\r\n\t for (var i = 0; i < all.length; i++) {\r\n\t d.innerHTML = all[i];\r\n\t width = Math.max(width, d.offsetWidth);\r\n\t height = Math.max(height, d.offsetHeight);\r\n\t }\r\n\r\n\t remove(d);\r\n\t return {\r\n\t width: width,\r\n\t height: height\r\n\t };\r\n\t}\r\n\tfunction download(data, filename) {\r\n\t var objUrl = false;\r\n\r\n\t if (_typeof(data) == \"object\") {\r\n\t //blob\r\n\t if (window.navigator.msSaveBlob) return window.navigator.msSaveBlob(data, filename);else {\r\n\t data = window.URL.createObjectURL(data);\r\n\t objUrl = true;\r\n\t }\r\n\t } //data url or blob url\r\n\r\n\r\n\t var link = document.createElement(\"a\");\r\n\t link.href = data;\r\n\t link.download = filename;\r\n\t document.body.appendChild(link);\r\n\t link.click();\r\n\t delay(function () {\r\n\t if (objUrl) window.URL.revokeObjectURL(data);\r\n\t document.body.removeChild(link);\r\n\t link.remove();\r\n\t });\r\n\t}\r\n\tfunction _getClassName(node) {\r\n\t if (!node) return \"\";\r\n\t var className = node.className || \"\";\r\n\t if (className.baseVal) //'className' exist but not a string - IE svg element in DOM\r\n\t className = className.baseVal;\r\n\t if (!className.indexOf) className = \"\";\r\n\t return className;\r\n\t}\r\n\tfunction setSelectionRange(node, start, end) {\r\n\t start = start || 0;\r\n\t end = end || start;\r\n\t node.focus();\r\n\t if (node.setSelectionRange) node.setSelectionRange(start, end);else {\r\n\t //ie8\r\n\t var textRange = node.createTextRange();\r\n\t textRange.collapse(true);\r\n\t textRange.moveEnd(\"character\", end);\r\n\t textRange.moveStart(\"character\", start);\r\n\t textRange.select();\r\n\t }\r\n\t}\r\n\tfunction getSelectionRange(node) {\r\n\t if (\"selectionStart\" in node) return {\r\n\t start: node.selectionStart || 0,\r\n\t end: node.selectionEnd || 0\r\n\t };else {\r\n\t //ie8\r\n\t node.focus();\r\n\t var selection = document.selection.createRange();\r\n\t var bookmark = selection.getBookmark();\r\n\t var textRange = node.createTextRange();\r\n\t textRange.moveToBookmark(bookmark);\r\n\t var length = textRange.text.length;\r\n\t textRange.collapse(true);\r\n\t textRange.moveStart(\"character\", -node.value.length);\r\n\t var start = textRange.text.length;\r\n\t return {\r\n\t start: start,\r\n\t end: start + length\r\n\t };\r\n\t }\r\n\t}\r\n\tfunction addMeta(name, value) {\r\n\t document.getElementsByTagName(\"head\").item(0).appendChild(create(\"meta\", {\r\n\t name: name,\r\n\t content: value\r\n\t }));\r\n\t}\r\n\r\n\tvar html = /*#__PURE__*/Object.freeze({\r\n\t\tdenySelect: denySelect,\r\n\t\tallowSelect: allowSelect,\r\n\t\tindex: index,\r\n\t\tcreateCss: createCss,\r\n\t\taddStyle: addStyle,\r\n\t\tremoveStyle: removeStyle,\r\n\t\tcreate: create,\r\n\t\tgetValue: getValue,\r\n\t\tremove: remove,\r\n\t\tinsertBefore: insertBefore,\r\n\t\tlocate: locate,\r\n\t\toffset: offset,\r\n\t\tposRelative: posRelative,\r\n\t\tpos: pos,\r\n\t\tpreventEvent: preventEvent,\r\n\t\tstopEvent: stopEvent,\r\n\t\ttriggerEvent: triggerEvent,\r\n\t\taddCss: addCss,\r\n\t\tremoveCss: removeCss,\r\n\t\tgetTextSize: getTextSize,\r\n\t\tdownload: download,\r\n\t\t_getClassName: _getClassName,\r\n\t\tsetSelectionRange: setSelectionRange,\r\n\t\tgetSelectionRange: getSelectionRange,\r\n\t\taddMeta: addMeta\r\n\t});\r\n\r\n\tvar i18n = {\r\n\t parseFormat: \"%Y-%m-%d %H:%i\",\r\n\t parseTimeFormat: \"%H:%i\"\r\n\t};\r\n\r\n\tfunction stringify(obj) {\r\n\t var origin = Date.prototype.toJSON;\r\n\r\n\t Date.prototype.toJSON = function () {\r\n\t return i18n.parseFormatStr(this);\r\n\t };\r\n\r\n\t var result;\r\n\t if (obj instanceof Date) result = obj.toJSON();else result = JSON.stringify(obj);\r\n\t Date.prototype.toJSON = origin;\r\n\t return result;\r\n\t}\r\n\r\n\tvar global = window;\r\n\tvar queueId = 1;\r\n\tvar queue = {};\r\n\tvar isRunningTask = false;\r\n\tif (!global.setImmediate && global.addEventListener) global.addEventListener(\"message\", function (e) {\r\n\t if (e.source == global) {\r\n\t if (isRunningTask) nextTick(queue[e.data]);else {\r\n\t isRunningTask = true;\r\n\r\n\t try {\r\n\t queue[e.data]();\r\n\t } catch (e) {// eslint-disable-line\r\n\t }\r\n\r\n\t delete queue[e.data];\r\n\t isRunningTask = false;\r\n\t }\r\n\t }\r\n\t});\r\n\r\n\tfunction nextTick(fn) {\r\n\t /* global setImmediate */\r\n\t if (global.setImmediate) setImmediate(fn); // if inside of web worker\r\n\t else if (global.importScripts || !global.addEventListener) setTimeout(fn);else {\r\n\t queueId++;\r\n\t queue[queueId] = fn;\r\n\t global.postMessage(queueId, \"*\");\r\n\t }\r\n\t}\r\n\r\n\tDeferred.resolve = function (value) {\r\n\t if (!(this._d == 1)) throw TypeError();\r\n\t if (value instanceof Deferred) return value;\r\n\t return new Deferred(function (resolve) {\r\n\t resolve(value);\r\n\t });\r\n\t};\r\n\r\n\tDeferred.reject = function (value) {\r\n\t if (!(this._d == 1)) throw TypeError();\r\n\t return new Deferred(function (resolve, reject) {\r\n\t reject(value);\r\n\t });\r\n\t};\r\n\r\n\tDeferred.all = function (arr) {\r\n\t if (!(this._d == 1)) throw TypeError();\r\n\t if (!(arr instanceof Array)) return Deferred.reject(TypeError());\r\n\t var d = new Deferred();\r\n\r\n\t function done(e, v) {\r\n\t if (v) return d.resolve(v);\r\n\t if (e) return d.reject(e);\r\n\t var unresolved = arr.reduce(function (cnt, v) {\r\n\t if (v && v.then) return cnt + 1;\r\n\t return cnt;\r\n\t }, 0);\r\n\t if (unresolved == 0) d.resolve(arr);\r\n\t arr.map(function (v, i) {\r\n\t if (v && v.then) v.then(function (r) {\r\n\t arr[i] = r;\r\n\t done();\r\n\t return r;\r\n\t }, done);\r\n\t });\r\n\t }\r\n\r\n\t done();\r\n\t return d;\r\n\t};\r\n\r\n\tDeferred.race = function (arr) {\r\n\t if (!(this._d == 1)) throw TypeError();\r\n\t if (!(arr instanceof Array)) return Deferred.reject(TypeError());\r\n\t if (arr.length == 0) return new Deferred();\r\n\t var d = new Deferred();\r\n\r\n\t function done(e, v) {\r\n\t if (v) return d.resolve(v);\r\n\t if (e) return d.reject(e);\r\n\t var unresolved = arr.reduce(function (cnt, v) {\r\n\t if (v && v.then) return cnt + 1;\r\n\t return cnt;\r\n\t }, 0);\r\n\t if (unresolved == 0) d.resolve(arr);\r\n\t arr.map(function (v) {\r\n\t if (v && v.then) v.then(function (r) {\r\n\t done(null, r);\r\n\t }, done);\r\n\t });\r\n\t }\r\n\r\n\t done();\r\n\t return d;\r\n\t};\r\n\r\n\tDeferred._d = 1;\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\r\n\tfunction Deferred(resolver) {\r\n\r\n\t if (typeof resolver != \"function\" && resolver != undefined) throw TypeError();\r\n\t if (_typeof(this) != \"object\" || this && this.then) throw TypeError(); // states\r\n\t // 0: pending\r\n\t // 1: resolving\r\n\t // 2: rejecting\r\n\t // 3: resolved\r\n\t // 4: rejected\r\n\r\n\t var self = this,\r\n\t state = 0,\r\n\t val = 0,\r\n\t next = [],\r\n\t fn,\r\n\t er;\r\n\t self[\"promise\"] = self;\r\n\r\n\t self[\"resolve\"] = function (v) {\r\n\t fn = self.fn;\r\n\t er = self.er;\r\n\r\n\t if (!state) {\r\n\t val = v;\r\n\t state = 1;\r\n\t nextTick(fire);\r\n\t }\r\n\r\n\t return self;\r\n\t };\r\n\r\n\t self[\"reject\"] = function (v) {\r\n\t fn = self.fn;\r\n\t er = self.er;\r\n\r\n\t if (!state) {\r\n\t val = v;\r\n\t state = 2;\r\n\t nextTick(fire);\r\n\t }\r\n\r\n\t return self;\r\n\t };\r\n\r\n\t self[\"_d\"] = 1;\r\n\r\n\t self[\"then\"] = function (_fn, _er) {\r\n\t if (!(this._d == 1)) throw TypeError();\r\n\t var d = new Deferred();\r\n\t d.fn = _fn;\r\n\t d.er = _er;\r\n\r\n\t if (state == 3) {\r\n\t d.resolve(val);\r\n\t } else if (state == 4) {\r\n\t d.reject(val);\r\n\t } else {\r\n\t next.push(d);\r\n\t }\r\n\r\n\t return d;\r\n\t };\r\n\r\n\t self[\"catch\"] = function (_er) {\r\n\t return self[\"then\"](null, _er);\r\n\t }; //compatibility with old version of promiz lib\r\n\r\n\r\n\t self[\"fail\"] = function (_er) {\r\n\t return self[\"then\"](null, _er);\r\n\t };\r\n\r\n\t var finish = function finish(type) {\r\n\t state = type || 4;\r\n\r\n\t for (var i = 0; i < next.length; i++) {\r\n\t var p = next[i];\r\n\t state == 3 && p.resolve(val) || p.reject(val);\r\n\t }\r\n\t };\r\n\r\n\t try {\r\n\t if (typeof resolver == \"function\") resolver(self[\"resolve\"], self[\"reject\"]);\r\n\t } catch (e) {\r\n\t self[\"reject\"](e);\r\n\t }\r\n\r\n\t return self; // ref : reference to 'then' function\r\n\t // cb, ec, cn : successCallback, failureCallback, notThennableCallback\r\n\r\n\t function thennable(ref, cb, ec, cn) {\r\n\t // Promises can be rejected with other promises, which should pass through\r\n\t if (state == 2) {\r\n\t return cn();\r\n\t }\r\n\r\n\t if ((_typeof(val) == \"object\" || typeof val == \"function\") && typeof ref == \"function\") {\r\n\t try {\r\n\t // cnt protects against abuse calls from spec checker\r\n\t var cnt = 0;\r\n\t ref.call(val, function (v) {\r\n\t if (cnt++) return;\r\n\t val = v;\r\n\t cb();\r\n\t }, function (v) {\r\n\t if (cnt++) return;\r\n\t val = v;\r\n\t ec();\r\n\t });\r\n\t } catch (e) {\r\n\t val = e;\r\n\t ec();\r\n\t }\r\n\t } else {\r\n\t cn();\r\n\t }\r\n\t }\r\n\r\n\t function fire() {\r\n\t // check if it's a thenable\r\n\t var ref;\r\n\r\n\t try {\r\n\t ref = val && val.then;\r\n\t } catch (e) {\r\n\t val = e;\r\n\t state = 2;\r\n\t return fire();\r\n\t }\r\n\r\n\t thennable(ref, function () {\r\n\t state = 1;\r\n\t fire();\r\n\t }, function () {\r\n\t state = 2;\r\n\t fire();\r\n\t }, function () {\r\n\t try {\r\n\t if (state == 1 && typeof fn == \"function\") {\r\n\t val = fn(val);\r\n\t } else if (state == 2 && typeof er == \"function\") {\r\n\t val = er(val);\r\n\t state = 1;\r\n\t }\r\n\t } catch (e) {\r\n\t val = e;\r\n\t return finish();\r\n\t }\r\n\r\n\t if (val == self) {\r\n\t val = TypeError();\r\n\t finish();\r\n\t } else thennable(ref, function () {\r\n\t finish(3);\r\n\t }, finish, function () {\r\n\t finish(state == 1 && 3);\r\n\t });\r\n\t });\r\n\t }\r\n\t} // promise factory\r\n\r\n\r\n\tDeferred.defer = function () {\r\n\t return new Deferred(null);\r\n\t};\r\n\r\n\tvar xml = {\r\n\t _isValidXML: function _isValidXML(data) {\r\n\t if (!data || !data.documentElement) return null;\r\n\t if (data.getElementsByTagName(\"parsererror\").length) return null;\r\n\t return data;\r\n\t },\r\n\t //convert xml string to xml object if necessary\r\n\t toObject: function toObject(text, response) {\r\n\t var data = response ? response.rawxml ? response.rawxml() : response : null;\r\n\t if (this._isValidXML(data)) return data;\r\n\t if (typeof text == \"string\") data = this.fromString(text.replace(/^[\\s]+/, \"\"));else data = text;\r\n\t if (this._isValidXML(data)) return data;\r\n\t return null;\r\n\t },\r\n\t //get array of records\r\n\t getRecords: function getRecords(data) {\r\n\t return this.xpath(data, this.records);\r\n\t },\r\n\t records: \"/*/item\",\r\n\t child: \"item\",\r\n\t config: \"/*/config\",\r\n\t //get hash of properties for single record\r\n\t getDetails: function getDetails(data) {\r\n\t return this.tagToObject(data, {});\r\n\t },\r\n\t getOptions: function getOptions() {\r\n\t return false;\r\n\t },\r\n\t //get count of data and position at which new data_loading need to be inserted\r\n\t getInfo: function getInfo(data) {\r\n\t var config = this.xpath(data, this.config);\r\n\t if (config.length) config = this.assignTypes(this.tagToObject(config[0], {}));else config = null;\r\n\t return {\r\n\t size: data.documentElement.getAttribute(\"total_count\") || 0,\r\n\t from: data.documentElement.getAttribute(\"pos\"),\r\n\t parent: data.documentElement.getAttribute(\"parent\") || 0,\r\n\t config: config,\r\n\t key: data.documentElement.getAttribute(\"webix_security\") || null\r\n\t };\r\n\t },\r\n\t //xpath helper\r\n\t xpath: function xpath(xml, path) {\r\n\t if (window.XPathResult) {\r\n\t //FF, KHTML, Opera\r\n\t var node = xml;\r\n\t if (xml.nodeName.indexOf(\"document\") == -1) xml = xml.ownerDocument;\r\n\t var res = [];\r\n\t var col = xml.evaluate(path, node, null, XPathResult.ANY_TYPE, null);\r\n\t var temp = col.iterateNext();\r\n\r\n\t while (temp) {\r\n\t res.push(temp);\r\n\t temp = col.iterateNext();\r\n\t }\r\n\r\n\t return res;\r\n\t } else {\r\n\t var test = true;\r\n\r\n\t try {\r\n\t if (typeof xml.selectNodes == \"undefined\") test = false;\r\n\t } catch (e) {}\r\n\t /*IE7 and below can't operate with xml object*/\r\n\t //IE\r\n\r\n\r\n\t if (test) return xml.selectNodes(path);else {\r\n\t //there is no interface to do XPath\r\n\t //use naive approach\r\n\t var name = path.split(\"/\").pop();\r\n\t return xml.getElementsByTagName(name);\r\n\t }\r\n\t }\r\n\t },\r\n\t assignTypes: function assignTypes(obj) {\r\n\t for (var k in obj) {\r\n\t var test = obj[k];\r\n\t if (_typeof(test) == \"object\") this.assignTypes(test);else if (typeof test == \"string\") {\r\n\t if (test === \"\") continue;\r\n\t if (test == \"true\") obj[k] = true;else if (test == \"false\") obj[k] = false;else if (test == test * 1) obj[k] = obj[k] * 1;\r\n\t }\r\n\t }\r\n\r\n\t return obj;\r\n\t },\r\n\t //convert xml tag to js object, all subtags and attributes are mapped to the properties of result object\r\n\t tagToObject: function tagToObject(tag, z) {\r\n\t var isArray = tag.nodeType == 1 && tag.getAttribute(\"stack\");\r\n\t var hasSubTags = 0;\r\n\r\n\t if (!isArray) {\r\n\t z = z || {}; //map attributes\r\n\r\n\t var a = tag.attributes;\r\n\t if (a && a.length) for (var i = 0; i < a.length; i++) {\r\n\t z[a[i].name] = a[i].value;\r\n\t hasSubTags = 1;\r\n\t } //map subtags\r\n\r\n\t var b = tag.childNodes;\r\n\r\n\t for (var _i = 0; _i < b.length; _i++) {\r\n\t if (b[_i].nodeType == 1) {\r\n\t var name = b[_i].tagName;\r\n\r\n\t if (z[name]) {\r\n\t if (typeof z[name].push != \"function\") z[name] = [z[name]];\r\n\t z[name].push(this.tagToObject(b[_i], {}));\r\n\t } else z[name] = this.tagToObject(b[_i], {}); //sub-object for complex subtags\r\n\r\n\r\n\t hasSubTags = 2;\r\n\t }\r\n\t }\r\n\r\n\t if (!hasSubTags) return this.nodeValue(tag); //each object will have its text content as \"value\" property\r\n\t //only if has not sub tags\r\n\r\n\t if (hasSubTags < 2) z.value = z.value || this.nodeValue(tag);\r\n\t } else {\r\n\t z = [];\r\n\t var _b = tag.childNodes;\r\n\r\n\t for (var _i2 = 0; _i2 < _b.length; _i2++) {\r\n\t if (_b[_i2].nodeType == 1) z.push(this.tagToObject(_b[_i2], {}));\r\n\t }\r\n\t }\r\n\r\n\t return z;\r\n\t },\r\n\t //get value of xml node \r\n\t nodeValue: function nodeValue(node) {\r\n\t if (node.firstChild) {\r\n\t return node.firstChild.wholeText || node.firstChild.data;\r\n\t }\r\n\r\n\t return \"\";\r\n\t },\r\n\t //convert XML string to XML object\r\n\t fromString: function fromString(xmlString) {\r\n\t try {\r\n\t if (window.DOMParser) // FF, KHTML, Opera\r\n\t return new DOMParser().parseFromString(xmlString, \"text/xml\");\r\n\t /* global ActiveXObject */\r\n\r\n\t if (window.ActiveXObject) {\r\n\t // IE, utf-8 only \r\n\t var temp = new ActiveXObject(\"Microsoft.xmlDOM\");\r\n\t temp.loadXML(xmlString);\r\n\t return temp;\r\n\t }\r\n\t } catch (e) {\r\n\t assert(0, e);\r\n\t return null;\r\n\t }\r\n\r\n\t assert(0, \"Load from xml string is not supported\");\r\n\t }\r\n\t};\r\n\r\n\tvar json = {\r\n\t //convert json string to json object if necessary\r\n\t toObject: function toObject(data) {\r\n\t if (!data) return null;\r\n\r\n\t if (typeof data == \"string\") {\r\n\t try {\r\n\t if (this.parseDates) {\r\n\t var isodate = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(.\\d{1-3})?Z/;\r\n\t data = JSON.parse(data, function (key, value) {\r\n\t if (typeof value == \"string\") {\r\n\t if (isodate.test(value)) return new Date(value);\r\n\t }\r\n\r\n\t return value;\r\n\t });\r\n\t } else {\r\n\t data = JSON.parse(data);\r\n\t }\r\n\t } catch (e) {\r\n\t log(e);\r\n\t log(data);\r\n\t assert(0, \"Invalid JSON data for parsing\");\r\n\t return null;\r\n\t }\r\n\t }\r\n\r\n\t return data;\r\n\t },\r\n\t //get array of records\r\n\t getRecords: function getRecords(data) {\r\n\t if (data && data.data) data = data.data;\r\n\t if (data && !isArray(data)) return [data];\r\n\t return data;\r\n\t },\r\n\t //get hash of properties for single record\r\n\t getDetails: function getDetails(data) {\r\n\t if (typeof data == \"string\") return {\r\n\t id: data || uid(),\r\n\t value: data\r\n\t };\r\n\t return data;\r\n\t },\r\n\t getOptions: function getOptions(data) {\r\n\t return data.collections;\r\n\t },\r\n\t //get count of data and position at which new data need to be inserted\r\n\t getInfo: function getInfo(data) {\r\n\t return {\r\n\t size: data.total_count || 0,\r\n\t from: data.pos,\r\n\t parent: data.parent || 0,\r\n\t config: data.config,\r\n\t key: data.webix_security\r\n\t };\r\n\t },\r\n\t child: \"data\",\r\n\t parseDates: false\r\n\t};\r\n\r\n\tvar _xhr_aborted = toArray();\r\n\tfunction ajax(url, params, call) {\r\n\t //if parameters was provided - made fast call\r\n\t if (arguments.length !== 0) {\r\n\t return new ajax().get(url, params, call);\r\n\t }\r\n\r\n\t if (!this || !this.getXHR) return new ajax(); //allow to create new instance without direct new declaration\r\n\r\n\t return this;\r\n\t}\r\n\tajax.count = 0;\r\n\tajax.prototype = {\r\n\t master: null,\r\n\t //creates xmlHTTP object\r\n\t getXHR: function getXHR() {\r\n\t return new XMLHttpRequest();\r\n\t },\r\n\t stringify: function stringify$$1(obj) {\r\n\t return stringify(obj);\r\n\t },\r\n\r\n\t /*\r\n\t \tsend data to the server\r\n\t \tparams - hash of properties which will be added to the url\r\n\t \tcall - callback, can be an array of functions\r\n\t */\r\n\t _send: function _send(url, params, call, mode) {\r\n\t var master;\r\n\r\n\t if (params && (isArray(params) || typeof (params.success || params.error || params) == \"function\")) {\r\n\t master = call;\r\n\t call = params;\r\n\t params = null;\r\n\t }\r\n\r\n\t var defer = Deferred.defer();\r\n\t var x = this.getXHR();\r\n\t if (!isArray(call)) call = [call];\r\n\t call.push({\r\n\t success: function success(_, d) {\r\n\t defer.resolve(d);\r\n\t },\r\n\t error: function error() {\r\n\t defer.reject(x);\r\n\t }\r\n\t });\r\n\t var headers = this._header || {};\r\n\t if (!callEvent(\"onBeforeAjax\", [mode, url, params, x, headers, null, defer])) return; //add content-type to POST|PUT|DELETE\r\n\r\n\t var json_mode = false;\r\n\r\n\t if (mode !== \"GET\") {\r\n\t var found = false;\r\n\r\n\t for (var key in headers) {\r\n\t if (key.toString().toLowerCase() == \"content-type\") {\r\n\t found = true;\r\n\t if (headers[key] == \"application/json\") json_mode = true;\r\n\t }\r\n\t }\r\n\r\n\t if (!found && !(window.FormData && params instanceof window.FormData)) headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\r\n\t } //add extra params to the url\r\n\r\n\r\n\t if (_typeof(params) == \"object\" && !(window.FormData && params instanceof window.FormData)) {\r\n\t if (json_mode) params = this.stringify(params);else {\r\n\t var t = [];\r\n\r\n\t for (var a in params) {\r\n\t var value = params[a];\r\n\t if (value === null || value === undefined) value = \"\";\r\n\t if (_typeof(value) === \"object\") value = this.stringify(value);\r\n\t t.push(a + \"=\" + encodeURIComponent(value)); // utf-8 escaping\r\n\t }\r\n\r\n\t params = t.join(\"&\");\r\n\t }\r\n\t }\r\n\r\n\t if (params && mode === \"GET\") {\r\n\t url = url + (url.indexOf(\"?\") != -1 ? \"&\" : \"?\") + params;\r\n\t params = null;\r\n\t }\r\n\r\n\t x.open(mode, url, !this._sync);\r\n\t var type = this._response;\r\n\t if (type) x.responseType = type; //if header was provided - use it\r\n\r\n\t for (var _key in headers) {\r\n\t x.setRequestHeader(_key, headers[_key]);\r\n\t } //async mode, define loading callback\r\n\r\n\r\n\t var self = this;\r\n\t this.master = this.master || master;\r\n\r\n\t x.onreadystatechange = function () {\r\n\t if (!x.readyState || x.readyState == 4) {\r\n\t ajax.count++;\r\n\r\n\t if (call && self && !x.aborted) {\r\n\t //IE8 and IE9, handling .abort call\r\n\t if (_xhr_aborted.find(x) != -1) return _xhr_aborted.remove(x);\r\n\t var owner = self.master || self;\r\n\t var is_error = x.status >= 400 || x.status === 0;\r\n\t var text, data;\r\n\r\n\t if (x.responseType == \"blob\" || x.responseType == \"arraybuffer\") {\r\n\t text = \"\";\r\n\t data = x.response;\r\n\t } else {\r\n\t text = x.responseText || \"\";\r\n\t data = self._data(x);\r\n\t }\r\n\r\n\t ajax.$callback(owner, call, text, data, x, is_error);\r\n\t }\r\n\r\n\t if (self) self.master = null;\r\n\t call = self = master = null; //anti-leak\r\n\t }\r\n\t };\r\n\r\n\t if (this._timeout) x.timeout = this._timeout; //IE can use sync mode sometimes, fix it\r\n\r\n\t if (!this._sync) setTimeout(function () {\r\n\t if (!x.aborted) {\r\n\t //abort handling in IE9\r\n\t if (_xhr_aborted.find(x) != -1) _xhr_aborted.remove(x);else x.send(params || null);\r\n\t }\r\n\t }, 1);else x.send(params || null);\r\n\t if (this.master && this.master._ajax_queue) this.master._ajax_queue.push(x);\r\n\t return this._sync ? x : defer; //return XHR, which can be used in case of sync. mode\r\n\t },\r\n\t _data: function _data(x) {\r\n\t return {\r\n\t xml: function xml$$1() {\r\n\t try {\r\n\t return xml.tagToObject(xml.toObject(x.responseText, this));\r\n\t } catch (e) {\r\n\t log(x.responseText);\r\n\t log(e.toString());\r\n\t assert(0, \"Invalid xml data for parsing\");\r\n\t }\r\n\t },\r\n\t rawxml: function rawxml() {\r\n\t if (!window.XPathResult) return xml.fromString(x.responseText);\r\n\t return x.responseXML;\r\n\t },\r\n\t text: function text() {\r\n\t return x.responseText;\r\n\t },\r\n\t json: function json$$1() {\r\n\t return json.toObject(x.responseText, false);\r\n\t }\r\n\t };\r\n\t },\r\n\t //GET request\r\n\t get: function get(url, params, call) {\r\n\t return this._send(url, params, call, \"GET\");\r\n\t },\r\n\t //POST request\r\n\t post: function post(url, params, call) {\r\n\t return this._send(url, params, call, \"POST\");\r\n\t },\r\n\t //PUT request\r\n\t put: function put(url, params, call) {\r\n\t return this._send(url, params, call, \"PUT\");\r\n\t },\r\n\t //DELETE request\r\n\t del: function del(url, params, call) {\r\n\t return this._send(url, params, call, \"DELETE\");\r\n\t },\r\n\t //PATCH request\r\n\t patch: function patch(url, params, call) {\r\n\t return this._send(url, params, call, \"PATCH\");\r\n\t },\r\n\t sync: function sync() {\r\n\t this._sync = true;\r\n\t return this;\r\n\t },\r\n\t timeout: function timeout(num) {\r\n\t this._timeout = num;\r\n\t return this;\r\n\t },\r\n\t response: function response(value) {\r\n\t this._response = value;\r\n\t return this;\r\n\t },\r\n\t //deprecated, remove in 3.0\r\n\t //[DEPRECATED]\r\n\t header: function header(_header) {\r\n\t assert(false, \"ajax.header is deprecated in favor of ajax.headers\");\r\n\t this._header = _header;\r\n\t return this;\r\n\t },\r\n\t headers: function headers(header) {\r\n\t this._header = exports.extend(this._header || {}, header);\r\n\t return this;\r\n\t },\r\n\t bind: function bind$$1(master) {\r\n\t this.master = master;\r\n\t return this;\r\n\t }\r\n\t};\r\n\r\n\tajax.$callback = function (owner, call, text, data, x, is_error) {\r\n\t if (owner.$destructed) return;\r\n\t if (x === -1 && data && typeof data.json == \"function\") data = data.json();\r\n\t if (is_error) callEvent(\"onAjaxError\", [x]);\r\n\t if (!isArray(call)) call = [call];\r\n\t if (!is_error) for (var i = 0; i < call.length; i++) {\r\n\t if (call[i]) {\r\n\t var before = call[i].before;\r\n\t if (before) before.call(owner, text, data, x);\r\n\t }\r\n\t }\r\n\r\n\t for (var _i = 0; _i < call.length; _i++) {\r\n\t //there can be multiple callbacks\r\n\t if (call[_i]) {\r\n\t var method = call[_i].success || call[_i];\r\n\t if (is_error) method = call[_i].error;\r\n\t if (method && method.call) method.call(owner, text, data, x);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar CodeParser = {\r\n\t //converts a complex object into an object with primitives properties\r\n\t collapseNames: function collapseNames(base, prefix, data) {\r\n\t data = data || {};\r\n\t prefix = prefix || \"\";\r\n\t if (!base || _typeof(base) != \"object\") return null;\r\n\r\n\t for (var prop in base) {\r\n\t if (base[prop] && _typeof(base[prop]) == \"object\" && !isDate(base[prop]) && !isArray(base[prop])) {\r\n\t CodeParser.collapseNames(base[prop], prefix + prop + \".\", data);\r\n\t } else {\r\n\t data[prefix + prop] = base[prop];\r\n\t }\r\n\t }\r\n\r\n\t return data;\r\n\t },\r\n\t //converts an object with primitive properties into an object with complex properties\r\n\t expandNames: function expandNames(base) {\r\n\t var data = {},\r\n\t i,\r\n\t lastIndex,\r\n\t name,\r\n\t obj,\r\n\t prop;\r\n\r\n\t for (prop in base) {\r\n\t name = prop.split(\".\");\r\n\t lastIndex = name.length - 1;\r\n\t obj = data;\r\n\r\n\t for (i = 0; i < lastIndex; i++) {\r\n\t if (!obj[name[i]]) obj[name[i]] = {};\r\n\t obj = obj[name[i]];\r\n\t }\r\n\r\n\t obj[name[lastIndex]] = base[prop];\r\n\t }\r\n\r\n\t return data;\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t\tTemplate - handles html templates\r\n\t*/\r\n\tvar _cache = {};\r\n\tvar _csp_cache = {};\r\n\tvar newlines = new RegExp(\"(\\\\r\\\\n|\\\\n)\", \"g\");\r\n\tvar quotes = new RegExp(\"(\\\\\\\")\", \"g\");\r\n\tvar slashes = new RegExp(\"(\\\\\\\\)\", \"g\");\r\n\tvar escape$1 = {\r\n\t \"&\": \"&\",\r\n\t \"<\": \"<\",\r\n\t \">\": \">\",\r\n\t \"\\\"\": \""\",\r\n\t \"'\": \"'\",\r\n\t \"`\": \"`\"\r\n\t};\r\n\tvar badChars = /[&<>\"'`]/g;\r\n\r\n\tvar escapeChar = function escapeChar(chr) {\r\n\t return escape$1[chr] || \"&\";\r\n\t};\r\n\r\n\tfunction template(str) {\r\n\t if (typeof str == \"function\") return str;\r\n\t if (_cache[str]) return _cache[str];\r\n\t str = (str || \"\").toString();\r\n\r\n\t if (str.indexOf(\"->\") != -1) {\r\n\t var teststr = str.split(\"->\");\r\n\r\n\t switch (teststr[0]) {\r\n\t case \"html\":\r\n\t //load from some container on the page\r\n\t str = getValue(teststr[1]);\r\n\t break;\r\n\r\n\t case \"http\":\r\n\t //load from external file\r\n\t str = new ajax().sync().get(teststr[1], {\r\n\t uid: uid()\r\n\t }).responseText;\r\n\t break;\r\n\r\n\t default:\r\n\t //do nothing, will use template as is\r\n\t break;\r\n\t }\r\n\t } //supported idioms\r\n\t // {obj.attr} => named attribute or value of sub-tag in case of xml\r\n\r\n\r\n\t str = (str || \"\").toString(); // Content Security Policy enabled\r\n\r\n\t if (env.strict) {\r\n\t if (!_csp_cache[str]) {\r\n\t _csp_cache[str] = []; // get an array of objects (not sorted by position)\r\n\r\n\t var temp_res = [];\r\n\t str.replace(/\\{obj\\.([^}?]+)\\?([^:]*):([^}]*)\\}/g, function (search, s1, s2, s3, pos$$1) {\r\n\t temp_res.push({\r\n\t pos: pos$$1,\r\n\t str: search,\r\n\t fn: function fn(obj) {\r\n\t return obj[s1] ? s2 : s3;\r\n\t }\r\n\t });\r\n\t });\r\n\t str.replace(/\\{common\\.([^}(]*)\\}/g, function (search, s, pos$$1) {\r\n\t temp_res.push({\r\n\t pos: pos$$1,\r\n\t str: search,\r\n\t fn: function fn(_, common) {\r\n\t return common[s] || \"\";\r\n\t }\r\n\t });\r\n\t });\r\n\t str.replace(/\\{common\\.([^}(]*)\\(\\)\\}/g, function (search, s, pos$$1) {\r\n\t temp_res.push({\r\n\t pos: pos$$1,\r\n\t str: search,\r\n\t fn: function fn(obj, common) {\r\n\t return common[s] ? common[s].apply(this, arguments) : \"\";\r\n\t }\r\n\t });\r\n\t });\r\n\t str.replace(/\\{obj\\.([^:}]*)\\}/g, function (search, s, pos$$1) {\r\n\t temp_res.push({\r\n\t pos: pos$$1,\r\n\t str: search,\r\n\t fn: function fn(obj) {\r\n\t return obj[s];\r\n\t }\r\n\t });\r\n\t });\r\n\t str.replace(\"{obj}\", function (search, s, pos$$1) {\r\n\t temp_res.push({\r\n\t pos: pos$$1,\r\n\t str: search,\r\n\t fn: function fn(obj) {\r\n\t return obj;\r\n\t }\r\n\t });\r\n\t });\r\n\t str.replace(/#([^#'\";, ]+)#/gi, function (search, s, pos$$1) {\r\n\t if (s.charAt(0) == \"!\") {\r\n\t s = s.substr(1);\r\n\t temp_res.push({\r\n\t pos: pos$$1,\r\n\t str: search,\r\n\t fn: function fn(obj) {\r\n\t if (s.indexOf(\".\") != -1) obj = CodeParser.collapseNames(obj); // apply complex properties\r\n\r\n\t return template.escape(obj[s]);\r\n\t }\r\n\t });\r\n\t } else {\r\n\t temp_res.push({\r\n\t pos: pos$$1,\r\n\t str: search,\r\n\t fn: function fn(obj) {\r\n\t if (s.indexOf(\".\") != -1) obj = CodeParser.collapseNames(obj); // apply complex properties\r\n\r\n\t return obj[s];\r\n\t }\r\n\t });\r\n\t }\r\n\t }); // sort template parts by position\r\n\r\n\t temp_res.sort(function (a, b) {\r\n\t return a.pos > b.pos ? 1 : -1;\r\n\t }); // create an array of functions that return parts of html string\r\n\r\n\t if (temp_res.length) {\r\n\t var lastPos = 0;\r\n\r\n\t var addStr = function addStr(str, n0, n1) {\r\n\t _csp_cache[str].push(function () {\r\n\t return str.slice(n0, n1);\r\n\t });\r\n\t };\r\n\r\n\t for (var i = 0; i < temp_res.length; i++) {\r\n\t var pos$$1 = temp_res[i].pos;\r\n\t addStr(str, lastPos, pos$$1);\r\n\r\n\t _csp_cache[str].push(temp_res[i].fn);\r\n\r\n\t lastPos = pos$$1 + temp_res[i].str.length;\r\n\t }\r\n\r\n\t addStr(str, lastPos, str.length);\r\n\t } else _csp_cache[str].push(function () {\r\n\t return str;\r\n\t });\r\n\t }\r\n\r\n\t return function () {\r\n\t var s = \"\";\r\n\r\n\t for (var i = 0; i < _csp_cache[str].length; i++) {\r\n\t s += _csp_cache[str][i].apply(this, arguments);\r\n\t }\r\n\r\n\t return s;\r\n\t };\r\n\t }\r\n\r\n\t var helpers = false;\r\n\t str = str.replace(slashes, \"\\\\\\\\\");\r\n\t str = str.replace(newlines, \"\\\\n\");\r\n\t str = str.replace(quotes, \"\\\\\\\"\");\r\n\t str = str.replace(/\\{obj\\.([^}?]+)\\?([^:]*):([^}]*)\\}/g, \"\\\"+(obj.$1?\\\"$2\\\":\\\"$3\\\")+\\\"\");\r\n\t str = str.replace(/\\{common\\.([^}(]*)\\}/g, \"\\\"+(common.$1||'')+\\\"\");\r\n\t str = str.replace(/\\{common\\.([^}(]*)\\(\\)\\}/g, \"\\\"+(common.$1?common.$1.apply(this, arguments):\\\"\\\")+\\\"\");\r\n\t str = str.replace(/\\{obj\\.([^}]*)\\}/g, \"\\\"+(obj.$1)+\\\"\");\r\n\t str = str.replace(\"{obj}\", \"\\\"+obj+\\\"\");\r\n\t str = str.replace(/#([^#'\";, ]+)#/gi, function (str, key) {\r\n\t if (key.charAt(0) == \"!\") {\r\n\t helpers = true;\r\n\t return \"\\\"+template.escape(obj.\" + key.substr(1) + \")+\\\"\";\r\n\t } else return \"\\\"+(obj.\" + key + \")+\\\"\";\r\n\t });\r\n\r\n\t try {\r\n\t if (helpers) {\r\n\t var temp = Function(\"obj\", \"common\", \"marks\", \"value\", \"template\", \"return \\\"\" + str + \"\\\";\");\r\n\r\n\t _cache[str] = function (a, b, c, d) {\r\n\t return temp(a, b, c, d, template);\r\n\t };\r\n\t } else {\r\n\t _cache[str] = Function(\"obj\", \"common\", \"return \\\"\" + str + \"\\\";\");\r\n\t }\r\n\t } catch (e) {\r\n\t assert(0, \"Invalid template:\" + str);\r\n\t }\r\n\r\n\t return _cache[str];\r\n\t}\r\n\r\n\ttemplate.escape = function (str) {\r\n\t if (str === undefined || str === null) return \"\";\r\n\t return (str.toString() || \"\").replace(badChars, escapeChar);\r\n\t};\r\n\r\n\ttemplate.empty = function () {\r\n\t return \"\";\r\n\t};\r\n\r\n\t/*\r\n\t\tadds new template-type\r\n\t\tobj - object to which template will be added\r\n\t\tdata - properties of template\r\n\t*/\r\n\r\n\tfunction type(obj, data) {\r\n\t if (obj.$protoWait) {\r\n\t if (!obj._webix_type_wait) obj._webix_type_wait = [];\r\n\r\n\t obj._webix_type_wait.push(data);\r\n\r\n\t return;\r\n\t } //auto switch to prototype, if name of class was provided\r\n\r\n\r\n\t if (typeof obj == \"function\") obj = obj.prototype;\r\n\r\n\t if (!obj.types) {\r\n\t obj.types = {\r\n\t \"default\": obj.type\r\n\t };\r\n\t obj.type.name = \"default\";\r\n\t }\r\n\r\n\t var name = data.name;\r\n\t var type = obj.type;\r\n\t if (name) type = obj.types[name] = clone(data.baseType ? obj.types[data.baseType] : obj.type);\r\n\r\n\t for (var key in data) {\r\n\t if (key.indexOf(\"template\") === 0) type[key] = template(data[key]);else type[key] = data[key];\r\n\t }\r\n\r\n\t return name;\r\n\t}\r\n\r\n\tvar views = {};\r\n\r\n\tfunction ui(config, parent, id) {\r\n\t var res;\r\n\t state._ui_creation++;\r\n\r\n\t try {\r\n\t res = _ui_creator(config, parent, id);\r\n\t } finally {\r\n\t state._ui_creation--;\r\n\t }\r\n\r\n\t return res;\r\n\t}\r\n\r\n\tui.views = views;\r\n\r\n\tfunction _ui_creator(config, parent, id) {\r\n\t var multiset = isArray(config);\r\n\t var node = toNode(config.container || parent || document.body); // solve problem with non-unique ids\r\n\r\n\t if (node._settings) id = _correctId(node, multiset, id);\r\n\t var top_node;\r\n\t var moving = false;\r\n\t var body_child = node == document.body;\r\n\r\n\t if (config._settings || node && multiset) {\r\n\t top_node = config;\r\n\t moving = true;\r\n\t } else {\r\n\t if (node && body_child) config.$topView = true;\r\n\t if (!config._inner) config._inner = {};\r\n\r\n\t if (parent && parent.getParentView) {\r\n\t state._parent_cell = !id && id !== 0 ? parent.getParentView() : parent;\r\n\t }\r\n\r\n\t top_node = _view(config);\r\n\t }\r\n\r\n\t if (body_child && !top_node.setPosition && !top_node.$apiOnly) use(\"_fixHeight\")();\r\n\r\n\t if (top_node._settings && top_node._settings._hidden && !node.$view) {\r\n\t top_node._settings._container = node;\r\n\t } else if (!top_node.$apiOnly) {\r\n\t if (node.appendChild) _appendDom(node, top_node, config);else if (node.destructor) {\r\n\t var target = node; //addView or view moving with target id\r\n\r\n\t if (!id && id !== 0 && !isArray(top_node)) {\r\n\t id = node;\r\n\t node = node.getParentView();\r\n\t } //if target supports view adding\r\n\r\n\r\n\t if (node && node._replace) {\r\n\t if (moving && top_node.getParentView) {\r\n\t //if source supports view removing\r\n\t var _parent = top_node.getParentView();\r\n\r\n\t if (_parent && _parent._remove) {\r\n\t _parent._remove(top_node);\r\n\t } //adjust parent link and scope\r\n\r\n\r\n\t top_node._parent_cell = node;\r\n\t top_node.$scope = node.$scope;\r\n\t }\r\n\r\n\t node._replace(top_node, id);\r\n\t } else {\r\n\t var _parent2 = target.$view.parentNode;\r\n\t target.destructor();\r\n\r\n\t _appendDom(_parent2, top_node, config);\r\n\t }\r\n\t } else assert(0, \"Not existing parent:\" + config.container);\r\n\t }\r\n\r\n\t return top_node;\r\n\t}\r\n\r\n\tfunction _appendDom(node, top_node, config) {\r\n\t node.appendChild(top_node._viewobj);\r\n\t if (top_node.getParentView()) return; //resize window with position center or top\r\n\t //do not resize other windows and elements\r\n\t // which are attached to custom html containers\r\n\r\n\t if ((!top_node.setPosition || top_node._settings.fullscreen) && node == document.body || top_node._settings.position) state.top_views.push(top_node._destructor_handler);\r\n\t if (!config.skipResize) top_node.adjust();\r\n\t}\r\n\r\n\tfunction _correctId(target, multiset, id) {\r\n\t //replace view\r\n\t var views = [target]; //replace content of layout\r\n\r\n\t if (multiset) views = target.getChildViews(); //replace content of window\r\n\t else if (target._body_cell) views = [target._body_cell]; //add cell in layout by number\r\n\t else if (typeof id == \"number\") {\r\n\t return id; //replace cell in layout by id\r\n\t } else if (id) {\r\n\t views = [$$(id)];\r\n\r\n\t _deleteIds(views);\r\n\r\n\t return views[0].config.id;\r\n\t }\r\n\r\n\t _deleteIds(views);\r\n\r\n\t return id;\r\n\t}\r\n\r\n\tfunction _deleteIds(uis) {\r\n\t for (var i = uis.length - 1; i >= 0; i--) {\r\n\t var current = uis[i]; //remove original id\r\n\r\n\t delete views[current.config.id]; //create temp id\r\n\r\n\t current.config.id = \"x\" + uid();\r\n\t views[current.config.id] = current; //process childs\r\n\r\n\t _deleteIds(current.getChildViews());\r\n\t }\r\n\t}\r\n\r\n\tfunction hasMethod(view, method) {\r\n\t var obj = ui[view];\r\n\t if (!obj) return false;\r\n\t if (obj.$protoWait) obj = obj.call(-1);\r\n\t return !!ui[view].prototype[method];\r\n\t}\r\n\r\n\tfunction _view(config) {\r\n\t {\r\n\t // check for trailing comma\r\n\t var coll = config.cells || config.rows || config.elements || config.cols;\r\n\t if (coll) for (var i = 0; i < coll.length; i++) {\r\n\t if (coll[i] === null || typeof coll[i] === \"undefined\") assert(0, \"You have trailing comma or Null element in collection's configuration\");\r\n\t }\r\n\t }\r\n\r\n\t if (config.view) {\r\n\t var view = config.view;\r\n\t assert(ui[view], \"unknown view:\" + view);\r\n\t return new ui[view](config);\r\n\t } else if (config.rows || config.cols) {\r\n\t var cells = config.rows || config.cols;\r\n\t var accordion = false;\r\n\r\n\t for (var _i = 0; _i < cells.length; _i++) {\r\n\t if (cells[_i].body && !cells[_i].view && !cells[_i].align) accordion = true;\r\n\t }\r\n\r\n\t if (accordion) {\r\n\t return new ui.headerlayout(config);\r\n\t } else return new ui.layout(config);\r\n\t } else if (config.cells) return new ui.multiview(config);else if (config.template || config.content) return new ui.template(config);else if (config.align && config.body) {\r\n\t return new ui.align(config);\r\n\t } else return new ui.spacer(config);\r\n\t} //FIXME\r\n\r\n\r\n\tui._view = _view;\r\n\r\n\tfunction $$(id) {\r\n\t if (!id) return null;\r\n\t if (views[id]) return views[id];\r\n\t var name = id;\r\n\r\n\t if (_typeof(id) == \"object\") {\r\n\t if (id._settings) return id;\r\n\t name = id.target || id.srcElement || id;\r\n\t }\r\n\r\n\t return views[locate({\r\n\t target: toNode(name)\r\n\t }, \"view_id\")];\r\n\t}\r\n\r\n\tif (typeof window.$$ === \"undefined\") window.$$ = $$;\r\n\r\n\texports.protoUI = function protoUI() {\r\n\t var origins = arguments;\r\n\t var selfname = origins[0].name;\r\n\r\n\t var _t = function t(data) {\r\n\t if (!_t) return ui[selfname].prototype;\r\n\t var origins = _t.$protoWait;\r\n\r\n\t if (origins) {\r\n\t var params = [origins[0]];\r\n\r\n\t for (var i = 1; i < origins.length; i++) {\r\n\t params[i] = origins[i];\r\n\t if (params[i].$protoWait) params[i] = params[i].call(-1, params[i].name);\r\n\t if (params[i].prototype && params[i].prototype.name) ui[params[i].prototype.name] = params[i];\r\n\t }\r\n\r\n\t ui[selfname] = exports.proto.apply(-1, params);\r\n\t if (_t._webix_type_wait) for (var _i2 = 0; _i2 < _t._webix_type_wait.length; _i2++) {\r\n\t type(ui[selfname], _t._webix_type_wait[_i2]);\r\n\t }\r\n\t _t = origins = null;\r\n\t }\r\n\r\n\t if (this != -1) return new ui[selfname](data);else return ui[selfname];\r\n\t };\r\n\r\n\t _t.$protoWait = Array.prototype.slice.call(arguments, 0);\r\n\t return ui[selfname] = _t;\r\n\t};\r\n\r\n\texports.proto = function proto() {\r\n\t var origins = arguments;\r\n\t var compilation = origins[0];\r\n\t var has_constructor = !!compilation.$init;\r\n\t var construct = [];\r\n\t assert(compilation, \"Invalid mixing target\");\r\n\r\n\t for (var i = origins.length - 1; i > 0; i--) {\r\n\t assert(origins[i], \"Invalid mixing source\");\r\n\t if (typeof origins[i] == \"function\") origins[i] = origins[i].prototype;\r\n\t if (origins[i].$init) construct.push(origins[i].$init);\r\n\r\n\t if (origins[i].defaults) {\r\n\t var defaults = origins[i].defaults;\r\n\t if (!compilation.defaults) compilation.defaults = {};\r\n\r\n\t for (var def in defaults) {\r\n\t if (isUndefined(compilation.defaults[def])) compilation.defaults[def] = defaults[def];\r\n\t }\r\n\t }\r\n\r\n\t if (origins[i].type && compilation.type) {\r\n\t for (var _def in origins[i].type) {\r\n\t if (!compilation.type[_def]) compilation.type[_def] = origins[i].type[_def];\r\n\t }\r\n\t }\r\n\r\n\t for (var key in origins[i]) {\r\n\t if (!compilation[key] && compilation[key] !== false) compilation[key] = origins[i][key];\r\n\t }\r\n\t }\r\n\r\n\t if (has_constructor) construct.push(compilation.$init);\r\n\r\n\t compilation.$init = function () {\r\n\t for (var i = 0; i < construct.length; i++) {\r\n\t construct[i].apply(this, arguments);\r\n\t }\r\n\t };\r\n\r\n\t if (compilation.$skin) compilation.$skin();\r\n\r\n\t var result = function result(config) {\r\n\t this.$ready = [];\r\n\t assert(this.$init, \"object without init method\");\r\n\t this.$init(config);\r\n\t if (this._parseSettings) this._parseSettings(config, this.defaults);\r\n\r\n\t for (var i = 0; i < this.$ready.length; i++) {\r\n\t this.$ready[i].call(this);\r\n\t }\r\n\t };\r\n\r\n\t result.prototype = compilation;\r\n\t compilation = origins = null;\r\n\t return result;\r\n\t};\r\n\r\n\tattachEvent(\"onClick\", function (e) {\r\n\t var element = $$(e);\r\n\r\n\t if (element && element.touchable) {\r\n\t use(\"UIManager\").applyChanges(element); //for inline elements - restore pointer to the master element\r\n\r\n\t element.getNode(e); //reaction on custom css elements in buttons\r\n\r\n\t var trg = e.target || e.srcElement;\r\n\t if (trg.className == \"webix_disabled\") return;\r\n\t var css = \"\";\r\n\t if (trg.className && trg.className.toString().indexOf(\"webix_view\") === 0) return;\r\n\t if (element) use(\"UIManager\")._focus_action(element); //loop through all parents\r\n\r\n\t while (trg && trg.parentNode) {\r\n\t if (trg.getAttribute) {\r\n\t if (trg.getAttribute(\"view_id\")) break;\r\n\t css = trg.className;\r\n\r\n\t if (css) {\r\n\t css = css.toString().split(\" \");\r\n\r\n\t for (var i = 0; i < css.length; i++) {\r\n\t if (element.on_click[css[i]]) {\r\n\t var res = element.on_click[css[i]].call(element, e, element._settings.id, trg);\r\n\t if (res === false) return;\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t trg = trg.parentNode;\r\n\t }\r\n\r\n\t if (element._settings.click) {\r\n\t var code = toFunctor(element._settings.click, element.$scope);\r\n\t if (code && code.call) code.call(element, element._settings.id, e);\r\n\t }\r\n\r\n\t var popup = element._settings.popup;\r\n\r\n\t if (element._settings.popup && !element._settings.readonly) {\r\n\t if (_typeof(popup) == \"object\" && !popup.name) popup = element._settings.popup = ui(popup)._settings.id;\r\n\t popup = $$(popup);\r\n\t assert(popup, \"Unknown popup\");\r\n\r\n\t if (!popup.isVisible()) {\r\n\t popup._settings.master = element._settings.id;\r\n\t popup.show(element.getInputNode() || element.getNode(), null, true);\r\n\t }\r\n\t }\r\n\r\n\t element.callEvent(\"onItemClick\", [element._settings.id, e]);\r\n\t }\r\n\t}); //hook for documentation generator\r\n\r\n\t{\r\n\t if (window.webix_on_core_ready) {\r\n\t var mod = window.webix_on_core_ready({\r\n\t proto: exports.proto,\r\n\t protoUI: exports.protoUI\r\n\t });\r\n\t exports.proto = mod.proto;\r\n\t exports.protoUI = mod.protoUI;\r\n\t }\r\n\t}\r\n\r\n\tvar _events = {};\r\n\tfunction _events_final_destructor() {\r\n\t //detach all known DOM events\r\n\t for (var a in _events) {\r\n\t eventRemove(a);\r\n\t }\r\n\t} //private version of API, do not register ID for event detaching\r\n\r\n\tfunction _event(a, b, c, d) {\r\n\t d = d || {};\r\n\t d.inner = true;\r\n\t event$1(a, b, c, d);\r\n\t} //attach event to the DOM element\r\n\r\n\tfunction event$1(node, event, handler, context) {\r\n\t context = context || {};\r\n\t node = toNode(node);\r\n\t assert(node, \"Invalid node as target for webix.event\");\r\n\t var id = context.id || uid();\r\n\t if (context.bind) handler = bind(handler, context.bind);\r\n\t var info = [node, event, handler, context.capture];\r\n\t if (!context.inner) _events[id] = info; //store event info, for detaching\r\n\r\n\t var capture = !!context.capture;\r\n\t if (!isUndefined(context.passive) && env.passiveEventListeners) //blockable touch events\r\n\t capture = {\r\n\t passive: context.passive,\r\n\t capture: capture\r\n\t }; //use IE's of FF's way of event's attaching\r\n\r\n\t if (node.addEventListener) node.addEventListener(event, handler, capture);else if (node.attachEvent) node.attachEvent(\"on\" + event, info[2] = function () {\r\n\t return handler.apply(node, arguments); //IE8 fix\r\n\t });\r\n\t return id; //return id of newly created event, can be used in eventRemove\r\n\t} //remove previously attached event\r\n\r\n\tfunction eventRemove(id) {\r\n\t if (!id) return;\r\n\t assert(_events[id], \"Removing non-existing event\");\r\n\t var ev = _events[id]; //browser specific event removing\r\n\r\n\t if (ev[0].removeEventListener) ev[0].removeEventListener(ev[1], ev[2], !!ev[3]);else if (ev[0].detachEvent) ev[0].detachEvent(\"on\" + ev[1], ev[2]);\r\n\t delete _events[id]; //delete all traces\r\n\t}\r\n\r\n\tvar ActiveContent = {\r\n\t $init: function $init(config) {\r\n\t if (config.activeContent) {\r\n\t this.$ready.push(this._init_active_content_list);\r\n\t this._active_holders = {};\r\n\t this._active_holders_item = {};\r\n\t this._active_holders_values = {};\r\n\t this._active_references = {};\r\n\r\n\t for (var key in config.activeContent) {\r\n\t this[key] = this._bind_active_content(key);\r\n\r\n\t if (config.activeContent[key].earlyInit) {\r\n\t var temp = state._parent_cell;\r\n\t state._parent_cell = null;\r\n\t this[key].call(this, {}, this, config.activeContent);\r\n\t state._parent_cell = temp;\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _destructActiveContent: function _destructActiveContent() {\r\n\t for (var key in this._active_references) {\r\n\t var elem = this._active_references[key];\r\n\t if (elem.destructor) elem.destructor();\r\n\t }\r\n\t },\r\n\t _init_active_content_list: function _init_active_content_list() {\r\n\t this.attachEvent(\"onDestruct\", bind(this._destructActiveContent, this));\r\n\r\n\t _event(this.$view, \"blur\", function (ev) {\r\n\t var target = ev.target || ev.srcElement; // for inputs only\r\n\r\n\t if (target.tagName != \"BUTTON\") {\r\n\t var el = $$(ev);\r\n\r\n\t if (el && el !== this && el.getValue && el.setValue) {\r\n\t el.getNode(ev);\r\n\t var newvalue = el.getValue();\r\n\t if (newvalue != el._settings.value) el.setValue(newvalue);\r\n\t }\r\n\t }\r\n\t }, {\r\n\t bind: this,\r\n\t capture: true\r\n\t });\r\n\r\n\t if (this.filter) {\r\n\t for (var key in this._settings.activeContent) {\r\n\t this.type[key] = this[key];\r\n\t this[key] = this._locate_active_content_by_id(key);\r\n\t } //really bad!\r\n\r\n\r\n\t this.attachEvent(\"onBeforeRender\", function () {\r\n\t this.type.masterUI = this;\r\n\t });\r\n\t this.type.masterUI = this;\r\n\t }\r\n\t },\r\n\t _locate_active_content_by_id: function _locate_active_content_by_id(key) {\r\n\t return function (id) {\r\n\t var button = this._active_references[key];\r\n\t var button_id = button._settings.id;\r\n\t var html = this.getItemNode(id).getElementsByTagName(\"DIV\");\r\n\r\n\t for (var i = 0; i < html.length; i++) {\r\n\t if (html[i].getAttribute(\"view_id\") == button_id) {\r\n\t button._viewobj = button._dataobj = html[i];\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t return button;\r\n\t };\r\n\t },\r\n\t _get_active_node: function _get_active_node(el, key, master) {\r\n\t return function (e) {\r\n\t if (e) {\r\n\t var trg = e.target || e.srcElement;\r\n\r\n\t while (trg) {\r\n\t if (trg.getAttribute && trg.getAttribute(\"view_id\")) {\r\n\t master._setActiveContentView(el, trg);\r\n\r\n\t if (master.locate) {\r\n\t var id = master.locate(trg.parentNode);\r\n\t var value = master._active_holders_values[key][id];\r\n\t el._settings.value = value;\r\n\t el._settings.$masterId = id;\r\n\t }\r\n\r\n\t return trg;\r\n\t }\r\n\r\n\t trg = trg.parentNode;\r\n\t }\r\n\t }\r\n\r\n\t return el._viewobj;\r\n\t };\r\n\t },\r\n\t _set_new_active_value: function _set_new_active_value(key, master) {\r\n\t return function (value) {\r\n\t var data = master.data;\r\n\r\n\t if (master.filter) {\r\n\t var id = master.locate(this._viewobj.parentNode);\r\n\t data = master.getItem(id); //XMLSerializer - FF \"feature\"\r\n\r\n\t this.refresh();\r\n\t master._active_holders_item[key][id] = this._viewobj.outerHTML || new XMLSerializer().serializeToString(this._viewobj);\r\n\t master._active_holders_values[key][id] = value;\r\n\t }\r\n\r\n\t if (data) data[key] = value;\r\n\t };\r\n\t },\r\n\t _bind_active_content: function _bind_active_content(key) {\r\n\t return function (obj, common, active) {\r\n\t var object = common._active_holders ? common : common.masterUI;\r\n\r\n\t if (!object._active_holders[key]) {\r\n\t var d = document.createElement(\"DIV\");\r\n\t active = active || object._settings.activeContent;\r\n\t var el = ui(active[key], d);\r\n\r\n\t if (env.isIE8) {\r\n\t d.firstChild.setAttribute(\"onclick\", \"event.processed = true; event.srcElement.w_view = '\" + el._settings.id + \"';\");\r\n\t } else {\r\n\t d.firstChild.setAttribute(\"onclick\", \"event.processed = true; \");\r\n\t }\r\n\r\n\t el.getNode = object._get_active_node(el, key, object);\r\n\t el.attachEvent(\"onChange\", object._set_new_active_value(key, object));\r\n\t object._active_references[key] = el;\r\n\t object._active_holders[key] = d.innerHTML;\r\n\t object._active_holders_item[key] = {};\r\n\t object._active_holders_values[key] = {};\r\n\t el.$activeEl = el.$view;\r\n\t }\r\n\r\n\t if (object.filter && obj[key] != object._active_holders_values[key] && !isUndefined(obj[key])) {\r\n\t var _el = object._active_references[key];\r\n\r\n\t _el.blockEvent();\r\n\r\n\t object._setActiveContentView(_el, _el.$activeEl); //in IE we can lost content of active element during parent repainting\r\n\r\n\r\n\t if (!_el.$view.firstChild) _el.refresh();\r\n\r\n\t _el.setValue(obj[key]);\r\n\r\n\t _el.refresh();\r\n\r\n\t _el.unblockEvent();\r\n\r\n\t object._active_holders_values[key][obj.id] = obj[key];\r\n\t object._active_holders_item[key][obj.id] = _el._viewobj.outerHTML || new XMLSerializer().serializeToString(_el._viewobj);\r\n\t }\r\n\r\n\t return object._active_holders_item[key][obj.id] || object._active_holders[key];\r\n\t };\r\n\t },\r\n\t _setActiveContentView: function _setActiveContentView(el, view) {\r\n\t el._dataobj = el._viewobj = el.$view = view;\r\n\t }\r\n\t};\r\n\r\n\tvar proxy = {\r\n\t $proxy: true,\r\n\t load: function load(view, callback) {\r\n\t var parts = this.source.split(\"@\");\r\n\t var ext = parts[0].split(\".\").pop();\r\n\t return ajax().response(\"arraybuffer\").get(parts[0]).then(function (res) {\r\n\t var options = {\r\n\t ext: ext,\r\n\t dataurl: parts[1]\r\n\t };\r\n\t ajax.$callback(view, callback, \"\", {\r\n\t data: res,\r\n\t options: options\r\n\t }, -1);\r\n\t });\r\n\t }\r\n\t};\r\n\r\n\tvar proxy$1 = {\r\n\t $proxy: true,\r\n\t connectorName: \"!nativeeditor_status\",\r\n\t load: function load(view, callback) {\r\n\t ajax(this.source, callback, view);\r\n\t },\r\n\t saveAll: function saveAll(view, updates, dp, callback) {\r\n\t var url = this.source;\r\n\t var data = {};\r\n\t var ids = [];\r\n\r\n\t for (var i = 0; i < updates.length; i++) {\r\n\t var action = updates[i];\r\n\t ids.push(action.id);\r\n\r\n\t for (var j in action.data) {\r\n\t if (j.indexOf(\"$\") !== 0) data[action.id + \"_\" + j] = action.data[j];\r\n\t }\r\n\r\n\t data[action.id + \"_\" + this.connectorName] = action.operation;\r\n\t }\r\n\r\n\t data.ids = ids.join(\",\");\r\n\t data.webix_security = state.securityKey;\r\n\t url += url.indexOf(\"?\") == -1 ? \"?\" : \"&\";\r\n\t url += \"editing=true\";\r\n\t ajax().post(url, data, callback);\r\n\t },\r\n\t result: function result(state$$1, view, dp, text, data, loader) {\r\n\t data = data.xml();\r\n\t if (!data) return dp._processError(null, text, data, loader);\r\n\t var actions = data.data.action;\r\n\t if (!actions.length) actions = [actions];\r\n\t var hash = [];\r\n\r\n\t for (var i = 0; i < actions.length; i++) {\r\n\t var obj = actions[i];\r\n\t hash.push(obj);\r\n\t obj.status = obj.type;\r\n\t obj.id = obj.sid;\r\n\t obj.newid = obj.tid;\r\n\t dp.processResult(obj, obj, {\r\n\t text: text,\r\n\t data: data,\r\n\t loader: loader\r\n\t });\r\n\t }\r\n\r\n\t return hash;\r\n\t }\r\n\t};\r\n\r\n\tvar proxy$2 = {\r\n\t $proxy: true,\r\n\t load: function load() {},\r\n\t save: function save(v, u, d) {\r\n\t delay(function () {\r\n\t window.console.log(\"[DP] \" + u.id + \" -> \" + u.operation, u.data);\r\n\t var data = {\r\n\t id: u.data.id,\r\n\t newid: u.data.id,\r\n\t status: u.data.operation\r\n\t };\r\n\t d.processResult(data, data);\r\n\t });\r\n\t }\r\n\t};\r\n\r\n\tvar proxy$3 = {\r\n\t $proxy: true,\r\n\t init: function init() {\r\n\t this.clientId = this.clientId || uid();\r\n\t },\r\n\t load: function load(view) {\r\n\t var selfid = this.clientId;\r\n\t this.client.subscribe(this.source, function (update) {\r\n\t if (update.clientId == selfid) return;\r\n\t use(\"dp\")(view).ignore(function () {\r\n\t if (update.operation == \"delete\") view.remove(update.data.id);else if (update.operation == \"insert\") view.add(update.data);else if (update.operation == \"update\") {\r\n\t var item = view.getItem(update.data.id);\r\n\r\n\t if (item) {\r\n\t exports.extend(item, update.data, true);\r\n\t view.refresh(item.id);\r\n\t }\r\n\t }\r\n\t });\r\n\t });\r\n\t },\r\n\t save: function save(view, update) {\r\n\t update.clientId = this.clientId;\r\n\t this.client.publish(this.source, update);\r\n\t }\r\n\t};\r\n\r\n\tvar indexdb = {\r\n\t $proxy: true,\r\n\t create: function create(db, config, version, callback) {\r\n\t this.source = db + \"/\";\r\n\r\n\t this._get_db(callback, version, function (e) {\r\n\t var db = e.target.result;\r\n\r\n\t for (var key in config) {\r\n\t var data = config[key];\r\n\t var store = db.createObjectStore(key, {\r\n\t keyPath: \"id\",\r\n\t autoIncrement: true\r\n\t });\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t store.put(data[i]);\r\n\t }\r\n\t }\r\n\t });\r\n\t },\r\n\t _get_db: function _get_db(callback, version, upgrade) {\r\n\t if (this.source.indexOf(\"/\") != -1) {\r\n\t var parts = this.source.split(\"/\");\r\n\t this.source = parts[1];\r\n\t version = version || parts[2];\r\n\r\n\t var _index = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB;\r\n\r\n\t var db;\r\n\t if (version) db = _index.open(parts[0], version);else db = _index.open(parts[0]);\r\n\t if (upgrade) db.onupgradeneeded = upgrade;\r\n\r\n\t db.onerror = function () {};\r\n\r\n\t db.onblocked = function () {};\r\n\r\n\t db.onsuccess = bind(function (e) {\r\n\t this.db = e.target.result;\r\n\t if (callback) callback.call(this);\r\n\t }, this);\r\n\t } else if (this.db) callback.call(this);else delay(this._get_db, this, [callback], 50);\r\n\t },\r\n\t load: function load(view, callback) {\r\n\t this._get_db(function () {\r\n\t var store = this.db.transaction(this.source).objectStore(this.source);\r\n\t var data = [];\r\n\r\n\t store.openCursor().onsuccess = function (e) {\r\n\t var result = e.target.result;\r\n\r\n\t if (result) {\r\n\t data.push(result.value);\r\n\t result[\"continue\"]();\r\n\t } else {\r\n\t view.parse(data);\r\n\t ajax.$callback(view, callback, \"[]\", data);\r\n\t }\r\n\t };\r\n\t });\r\n\t },\r\n\t save: function save(view, update, dp) {\r\n\t this._get_db(function () {\r\n\t var mode = update.operation;\r\n\t var data = update.data;\r\n\t var id = update.id;\r\n\t var store = this.db.transaction([this.source], \"readwrite\").objectStore(this.source);\r\n\t var req;\r\n\t if (mode == \"delete\") req = store[\"delete\"](id);else if (mode == \"update\") req = store.put(data);else if (mode == \"insert\") {\r\n\t delete data.id;\r\n\t req = store.add(data);\r\n\t }\r\n\r\n\t req.onsuccess = function (e) {\r\n\t var result = {\r\n\t status: mode,\r\n\t id: update.id\r\n\t };\r\n\t if (mode == \"insert\") result.newid = e.target.result;\r\n\t dp.processResult(result, result);\r\n\t };\r\n\t });\r\n\t }\r\n\t};\r\n\r\n\tvar proxy$4 = {\r\n\t $proxy: true,\r\n\t load: function load(view, callback) {\r\n\t ajax(this.source, callback, view);\r\n\t },\r\n\t save: function save(view, update, dp, callback) {\r\n\t return proxy$4._save_logic.call(this, view, update, dp, callback, ajax());\r\n\t },\r\n\t _save_logic: function _save_logic(view, update, dp, callback, ajax$$1) {\r\n\t var url = this.source;\r\n\t var query = \"\";\r\n\t var mark = url.indexOf(\"?\");\r\n\r\n\t if (mark !== -1) {\r\n\t query = url.substr(mark);\r\n\t url = url.substr(0, mark);\r\n\t }\r\n\r\n\t url += url.charAt(url.length - 1) == \"/\" ? \"\" : \"/\";\r\n\t var mode = update.operation;\r\n\t var data = update.data;\r\n\t if (mode == \"insert\") delete data.id; //call rest URI\r\n\r\n\t if (mode == \"update\") {\r\n\t ajax$$1.put(url + data.id + query, data, callback);\r\n\t } else if (mode == \"delete\") {\r\n\t ajax$$1.del(url + data.id + query, data, callback);\r\n\t } else {\r\n\t ajax$$1.post(url + query, data, callback);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar proxy$5 = {\r\n\t $proxy: true,\r\n\t load: function load(view, callback) {\r\n\t ajax(this.source, callback, view);\r\n\t },\r\n\t save: function save(view, update, dp, callback) {\r\n\t var xhr = ajax().headers({\r\n\t \"Content-Type\": \"application/json\"\r\n\t });\r\n\t return proxy$4._save_logic.call(this, view, update, dp, callback, xhr);\r\n\t }\r\n\t};\r\n\r\n\tvar proxy$6 = {\r\n\t $proxy: true,\r\n\t load: function load(view, callback, params) {\r\n\t params = exports.extend(params || {}, this.params || {}, true);\r\n\t ajax().bind(view).post(this.source, params, callback);\r\n\t }\r\n\t};\r\n\r\n\tvar proxy$7 = {\r\n\t $proxy: true,\r\n\t load: function load(view, callback) {\r\n\t ajax().sync().bind(view).get(this.source, null, callback);\r\n\t }\r\n\t};\r\n\r\n\tvar proxy$8 = {\r\n\t $proxy: true,\r\n\t storage: env.local,\r\n\t cache: false,\r\n\t local: false,\r\n\t data: \"\",\r\n\t _is_offline: function _is_offline() {\r\n\t if (!this.cache && !env.offline) {\r\n\t callEvent(\"onOfflineMode\", []);\r\n\t env.offline = true;\r\n\t }\r\n\t },\r\n\t _is_online: function _is_online() {\r\n\t if (!this.cache && env.offline) {\r\n\t env.offline = false;\r\n\t callEvent(\"onOnlineMode\", []);\r\n\t }\r\n\t },\r\n\t load: function load(view, callback) {\r\n\t var mycallback = {\r\n\t error: function error() {\r\n\t //assuming offline mode\r\n\t var text = this.getCache() || this.data;\r\n\t var loader = {\r\n\t responseText: text\r\n\t };\r\n\r\n\t var data = ajax.prototype._data(loader);\r\n\r\n\t this._is_offline();\r\n\r\n\t ajax.$callback(view, callback, text, data, loader);\r\n\t },\r\n\t success: function success(text, data, loader) {\r\n\t this._is_online();\r\n\r\n\t ajax.$callback(view, callback, text, data, loader);\r\n\t this.setCache(text);\r\n\t }\r\n\t }; //in cache mode - always load data from cache\r\n\r\n\t if (this.cache && this.getCache()) mycallback.error.call(this);else {\r\n\t //else try to load actual data first\r\n\t if (this.source.$proxy) this.source.load(this, mycallback);else ajax(this.source, mycallback, this);\r\n\t }\r\n\t },\r\n\t getCache: function getCache() {\r\n\t return this.storage.get(this._data_name());\r\n\t },\r\n\t clearCache: function clearCache() {\r\n\t this.storage.remove(this._data_name());\r\n\t },\r\n\t setCache: function setCache(text) {\r\n\t this.storage.put(this._data_name(), text);\r\n\t },\r\n\t _data_name: function _data_name() {\r\n\t if (this.source.$proxy) return this.source.source + \"_$proxy$_data\";else return this.source + \"_$proxy$_data\";\r\n\t },\r\n\t save: function save(master, data, view, callback) {\r\n\t if (!env.offline && !this.cache) {\r\n\t if (this.source.$proxy) {\r\n\t this.source.save(master, data, view, callback);\r\n\t } else {\r\n\t ajax().post(this.source, data.data, callback);\r\n\t }\r\n\t }\r\n\t },\r\n\t saveAll: function saveAll(view, update, dp, callback) {\r\n\t this.setCache(view.serialize());\r\n\r\n\t if (this.cache || env.offline) {\r\n\t ajax.$callback(view, callback, \"\", update);\r\n\t }\r\n\t },\r\n\t result: function result(id, master, dp, text, data) {\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t dp.processResult({\r\n\t id: data[i].id,\r\n\t status: data[i].operation\r\n\t }, {}, {});\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar proxy$9 = {\r\n\t init: function init() {\r\n\t exports.extend(this, proxy$8);\r\n\t },\r\n\t cache: true\r\n\t};\r\n\r\n\tvar proxy$a = {\r\n\t init: function init() {\r\n\t exports.extend(this, proxy$8);\r\n\t },\r\n\t cache: true,\r\n\t local: true,\r\n\t data: []\r\n\t};\r\n\r\n\tfunction unbox(data) {\r\n\t if (!data || !_typeof(data) === \"object\" || Array.isArray(data)) return data;\r\n\t var lkey = \"\";\r\n\t var count = 0;\r\n\r\n\t for (var key in data) {\r\n\t count++;\r\n\t if (count == 2) return data;\r\n\t lkey = key;\r\n\t }\r\n\r\n\t return data[lkey];\r\n\t}\r\n\r\n\tvar GraphQL = {\r\n\t $proxy: true,\r\n\t save: function save(data) {\r\n\t return this.load(data);\r\n\t },\r\n\t load: function load(view, callback) {\r\n\t var params = {\r\n\t query: this.source\r\n\t };\r\n\r\n\t if (arguments.length === 1) {\r\n\t params.variables = view;\r\n\t view = this;\r\n\t }\r\n\r\n\t return ajax().bind(view).headers({\r\n\t \"Content-type\": \"application/json\"\r\n\t }).post(this.url, params).then(function (data) {\r\n\t var flat = unbox(data.json().data);\r\n\t if (callback) ajax.$callback(view, callback, \"\", flat, -1);\r\n\t return flat;\r\n\t });\r\n\t }\r\n\t};\r\n\r\n\tfunction proxy$b(name, source, extra) {\r\n\t assert(proxy$b[name], \"Invalid proxy name: \" + name);\r\n\t var copy$$1 = copy(proxy$b[name]);\r\n\t copy$$1.source = source;\r\n\t if (extra) exports.extend(copy$$1, extra, true);\r\n\t if (copy$$1.init) copy$$1.init();\r\n\t return copy$$1;\r\n\t}\r\n\r\n\tproxy$b.$parse = function (value) {\r\n\t if (typeof value == \"string\" && value.indexOf(\"->\") != -1) {\r\n\t var parts = value.split(\"->\");\r\n\t return proxy$b(parts[0], parts[1]);\r\n\t }\r\n\r\n\t return value;\r\n\t};\r\n\r\n\tproxy$b.binary = proxy;\r\n\tproxy$b.connector = proxy$1;\r\n\tproxy$b.debug = proxy$2;\r\n\tproxy$b.faye = proxy$3;\r\n\tproxy$b.indexdb = indexdb;\r\n\tproxy$b.json = proxy$5;\r\n\tproxy$b.post = proxy$6;\r\n\tproxy$b.rest = proxy$4;\r\n\tproxy$b.sync = proxy$7;\r\n\tproxy$b.offline = proxy$8;\r\n\tproxy$b.cache = proxy$9;\r\n\tproxy$b.local = proxy$a;\r\n\tproxy$b.local = proxy$a;\r\n\tproxy$b.GraphQL = GraphQL;\r\n\r\n\tvar jsarray = {\r\n\t //parse jsarray string to jsarray object if necessary\r\n\t toObject: function toObject(data) {\r\n\t if (typeof data == \"string\") return JSON.parse(data);\r\n\t return data;\r\n\t },\r\n\t //get array of records\r\n\t getRecords: function getRecords(data) {\r\n\t if (data && data.data) data = data.data;\r\n\t return data;\r\n\t },\r\n\t //get hash of properties for single record, in case of array they will have names as \"data{index}\"\r\n\t getDetails: function getDetails(data) {\r\n\t var result = {};\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t result[\"data\" + i] = data[i];\r\n\t }\r\n\r\n\t if (this.idColumn !== null) result.id = data[this.idColumn];\r\n\t return result;\r\n\t },\r\n\t getOptions: function getOptions() {\r\n\t return false;\r\n\t },\r\n\t //dyn loading is not supported by js-array data source\r\n\t getInfo: function getInfo() {\r\n\t return {\r\n\t size: 0\r\n\t };\r\n\t },\r\n\t idColumn: null\r\n\t};\r\n\r\n\tvar csv = {\r\n\t //incoming data always a string\r\n\t toObject: function toObject(data) {\r\n\t return data;\r\n\t },\r\n\t //get array of records\r\n\t getRecords: function getRecords(data) {\r\n\t return data.split(this.row);\r\n\t },\r\n\t //get hash of properties for single record, data named as \"data{index}\"\r\n\t getDetails: function getDetails(data) {\r\n\t data = this.stringToArray(data);\r\n\t var result = {};\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t result[\"data\" + i] = data[i];\r\n\t }\r\n\r\n\t if (this.idColumn !== null) result.id = data[this.idColumn];\r\n\t return result;\r\n\t },\r\n\t getOptions: function getOptions() {\r\n\t return false;\r\n\t },\r\n\t //dyn loading is not supported by csv data source\r\n\t getInfo: function getInfo() {\r\n\t return {\r\n\t size: 0\r\n\t };\r\n\t },\r\n\t //split string in array, takes string surrounding quotes in account\r\n\t stringToArray: function stringToArray(data) {\r\n\t data = data.split(this.cell);\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t data[i] = data[i].replace(/^[ \\t\\n\\r]*(\"|)/g, \"\").replace(/(\"|)[ \\t\\n\\r]*$/g, \"\");\r\n\t }\r\n\r\n\t return data;\r\n\t },\r\n\t idColumn: null,\r\n\t row: \"\\n\",\r\n\t //default row separator\r\n\t cell: \",\" //default cell separator\r\n\r\n\t};\r\n\r\n\tvar html$1 = {\r\n\t /*\r\n\t \tincoming data can be\r\n\t \t - ID of parent container\r\n\t \t - HTML text\r\n\t */\r\n\t toObject: function toObject(data) {\r\n\t if (typeof data == \"string\") {\r\n\t var t = null;\r\n\t if (data.indexOf(\"<\") == -1) //if no tags inside - probably its an ID\r\n\t t = toNode(data);\r\n\r\n\t if (!t) {\r\n\t t = document.createElement(\"DIV\");\r\n\t t.innerHTML = data;\r\n\t }\r\n\r\n\t return t.firstChild;\r\n\t }\r\n\r\n\t return data;\r\n\t },\r\n\t //get array of records\r\n\t getRecords: function getRecords(node) {\r\n\t return node.getElementsByTagName(this.tag);\r\n\t },\r\n\t //get hash of properties for single record\r\n\t getDetails: function getDetails(data) {\r\n\t return xml.tagToObject(data);\r\n\t },\r\n\t getOptions: function getOptions() {\r\n\t return false;\r\n\t },\r\n\t //dyn loading is not supported by HTML data source\r\n\t getInfo: function getInfo() {\r\n\t return {\r\n\t size: 0\r\n\t };\r\n\t },\r\n\t tag: \"LI\"\r\n\t};\r\n\r\n\tvar htmltable = {\r\n\t //convert json string to json object if necessary\r\n\t toObject: function toObject(data) {\r\n\t data = toNode(data);\r\n\t assert(data, \"table is not found\");\r\n\t assert(data.tagName.toLowerCase() === \"table\", \"Incorrect table object\");\r\n\t var tr = data.rows;\r\n\t remove(data);\r\n\t return tr;\r\n\t },\r\n\t //get array of records\r\n\t getRecords: function getRecords(data) {\r\n\t var new_data = []; //skip header rows if necessary\r\n\r\n\t var i = data[0] && data[0]._webix_skip ? 1 : 0;\r\n\r\n\t for (; i < data.length; i++) {\r\n\t new_data.push(data[i]);\r\n\t }\r\n\r\n\t return new_data;\r\n\t },\r\n\t //get hash of properties for single record\r\n\t getDetails: function getDetails(data) {\r\n\t var td = data.getElementsByTagName(\"td\");\r\n\t data = {}; //get hash of properties for single record, data named as \"data{index}\"\r\n\r\n\t for (var i = 0; i < td.length; i++) {\r\n\t data[\"data\" + i] = td[i].innerHTML;\r\n\t }\r\n\r\n\t return data;\r\n\t },\r\n\t //get count of data and position at which new data need to be inserted\r\n\t getInfo: function getInfo() {\r\n\t // dyn loading is not supported for htmltable\r\n\t return {\r\n\t size: 0\r\n\t };\r\n\t },\r\n\t getOptions: function getOptions() {},\r\n\r\n\t /*! gets header from first table row\r\n\t **/\r\n\t getConfig: function getConfig(data) {\r\n\t var columns = [];\r\n\t var td = data[0].getElementsByTagName(\"th\");\r\n\t if (td.length) data[0]._webix_skip = true;\r\n\r\n\t for (var i = 0; i < td.length; i++) {\r\n\t var col = {\r\n\t id: \"data\" + i,\r\n\t header: this._de_json(td[i].innerHTML)\r\n\t };\r\n\r\n\t var attrs = this._get_attrs(td[i]);\r\n\r\n\t col = exports.extend(col, attrs);\r\n\t columns.push(col);\r\n\t }\r\n\r\n\t return columns;\r\n\t },\r\n\t _de_json: function _de_json(str) {\r\n\t var pos$$1 = str.indexOf(\"json://\");\r\n\t if (pos$$1 != -1) str = JSON.parse(str.substr(pos$$1 + 7));\r\n\t return str;\r\n\t },\r\n\r\n\t /*! gets hash of html-element attributes\r\n\t **/\r\n\t _get_attrs: function _get_attrs(el) {\r\n\t var attr = el.attributes;\r\n\t var hash = {};\r\n\r\n\t for (var i = 0; i < attr.length; i++) {\r\n\t hash[attr[i].nodeName] = this._de_json(attr[i].nodeValue);\r\n\t }\r\n\r\n\t hash.width = parseInt(hash.width, 10);\r\n\t return hash;\r\n\t }\r\n\t};\r\n\r\n\tvar _modules = {}; //hash of already loaded modules\r\n\t//loads module from external js file\r\n\r\n\tfunction require(module, callback, master) {\r\n\t var promise = Deferred.defer();\r\n\t if (callback && callback !== true) promise = promise.then(function () {\r\n\t callback.call(master || this);\r\n\t });\r\n\r\n\t if (require.disabled) {\r\n\t promise.resolve();\r\n\t return promise;\r\n\t } //multiple files required at once\r\n\r\n\r\n\t if (typeof module != \"string\") {\r\n\t var count = module.length || 0;\r\n\r\n\t if (!count) {\r\n\t // { file: true, other: true }\r\n\t for (var file in module) {\r\n\t count++;\r\n\t } // eslint-disable-line\r\n\r\n\r\n\t var callback2 = function callback2() {\r\n\t count--;\r\n\t if (count === 0) promise.resolve();\r\n\t };\r\n\r\n\t for (var _file in module) {\r\n\t require(_file, callback2, master);\r\n\t }\r\n\t } else {\r\n\t // [ file, other ]\r\n\t var _callback = function _callback() {\r\n\t if (count) {\r\n\t count--;\r\n\r\n\t require(module[module.length - count - 1], _callback, master);\r\n\t } else {\r\n\t promise.resolve();\r\n\t }\r\n\t };\r\n\r\n\t _callback();\r\n\t }\r\n\r\n\t return promise;\r\n\t }\r\n\r\n\t if (_modules[module] !== true) {\r\n\t var fullpath = module; //css, async, no waiting\r\n\r\n\t if (module.substr(module.length - 4) == \".css\") {\r\n\t var link = create(\"LINK\", {\r\n\t type: \"text/css\",\r\n\t rel: \"stylesheet\",\r\n\t href: fullpath\r\n\t });\r\n\t document.getElementsByTagName(\"head\")[0].appendChild(link);\r\n\t promise.resolve();\r\n\t return promise;\r\n\t } //js, async, waiting\r\n\r\n\r\n\t if (callback === true) {\r\n\t //sync mode\r\n\t exec(ajax().sync().get(fullpath).responseText);\r\n\t _modules[module] = true;\r\n\t } else {\r\n\t if (!_modules[module]) {\r\n\t //first call\r\n\t _modules[module] = [promise];\r\n\t var newScript = document.createElement(\"script\");\r\n\t var calls = _modules[module]; //callbacks\r\n\r\n\t newScript.onerror = function () {\r\n\t _modules[module] = false;\r\n\r\n\t for (var i = 0; i < calls.length; i++) {\r\n\t calls[i].reject();\r\n\t }\r\n\t };\r\n\r\n\t newScript.onload = function () {\r\n\t _modules[module] = true;\r\n\r\n\t for (var i = 0; i < calls.length; i++) {\r\n\t calls[i].resolve();\r\n\t }\r\n\t };\r\n\r\n\t document.getElementsByTagName(\"head\")[0].appendChild(newScript);\r\n\t newScript.src = fullpath;\r\n\t } else //module already loading\r\n\t _modules[module].push(promise);\r\n\t }\r\n\t } else promise.resolve();\r\n\r\n\t return promise;\r\n\t}\r\n\r\n\tvar excel = exports.extend({\r\n\t toObject: function toObject(data) {\r\n\t if (!data.excel) {\r\n\t var opts = data.options || {};\r\n\t if (opts.dataurl) exports.extend(opts, this._urlToOptions(opts.dataurl));\r\n\t data = data.data || data;\r\n\t var promise = Deferred.defer();\r\n\r\n\t if (data.name) {\r\n\t //file\r\n\t opts.ext = data.name.split(\".\").pop();\r\n\t var reader = new FileReader();\r\n\t reader.onload = bind(function (e) {\r\n\t promise.resolve(this.parseData(e.target.result, opts));\r\n\t }, this);\r\n\t reader.readAsArrayBuffer(data);\r\n\t } else //arraybuffer\r\n\t promise.resolve(this.parseData(data, opts));\r\n\r\n\t return promise;\r\n\t } //plain jsarray or hash\r\n\r\n\r\n\t return data;\r\n\t },\r\n\t parseData: function parseData(data, options) {\r\n\t data = new Uint8Array(data);\r\n\t var arr = [];\r\n\r\n\t for (var i = 0; i != data.length; ++i) {\r\n\t arr[i] = String.fromCharCode(data[i]);\r\n\t }\r\n\r\n\t var ext = (options.ext || options).toLowerCase();\r\n\t if (ext != \"xls\") ext = \"xlsx\";\r\n\t return require(env.cdn + \"/extras/xlsx.core.styles.min.js\").then(bind(function () {\r\n\t /* global XLS, XLSX */\r\n\t var wb = ext == \"xls\" ? XLS.read(arr.join(\"\"), {\r\n\t type: \"binary\",\r\n\t cellStyles: true,\r\n\t cellDates: true\r\n\t }) : XLSX.read(arr.join(\"\"), {\r\n\t type: \"binary\",\r\n\t cellStyles: true,\r\n\t cellDates: true\r\n\t });\r\n\t var res = {\r\n\t sheets: wb.Sheets,\r\n\t names: wb.SheetNames,\r\n\t options: options,\r\n\t ranges: wb.Workbook ? wb.Workbook.Names || [] : []\r\n\t };\r\n\t return exports.extend(this.getSheet(res, options), res);\r\n\t }, this));\r\n\t },\r\n\t getSheet: function getSheet(data, options) {\r\n\t var name = options.name || data.names[0];\r\n\t data = this.sheetToArray(data.sheets[name], options);\r\n\t if (options.rows && options.rows.length) data.data = data.data.splice(options.rows[0], Math.min(options.rows[1], data.data.length) - options.rows[0]);\r\n\t return data;\r\n\t },\r\n\t sheetToArray: function sheetToArray(sheet, options) {\r\n\t var all = [];\r\n\t var spans = [];\r\n\t var styles = [];\r\n\t var sizes = [];\r\n\r\n\t if (sheet && sheet[\"!ref\"]) {\r\n\t var range = XLS.utils.decode_range(sheet[\"!ref\"]),\r\n\t row,\r\n\t col,\r\n\t cellCoord,\r\n\t cell,\r\n\t xCorrection = range.s.c,\r\n\t yCorrection = range.s.r + (options.rows ? options.rows[0] : 0);\r\n\r\n\t for (row = range.s.r; row <= range.e.r; row++) {\r\n\t var nrow = [];\r\n\r\n\t for (col = range.s.c; col <= range.e.c; col++) {\r\n\t cellCoord = XLS.utils.encode_cell({\r\n\t r: row,\r\n\t c: col\r\n\t });\r\n\t cell = sheet[cellCoord];\r\n\t if (!cell) nrow.push(\"\");else {\r\n\t var ncell = \"\";\r\n\t if (options.math && cell.f) // get formula\r\n\t ncell = cell.f.charAt(0) == \"=\" ? cell.f : \"=\" + cell.f;else if (cell.t == \"d\" && isDate(cell.v)) ncell = i18n.dateFormatStr(cell.v);else ncell = cell.v;\r\n\t nrow.push(ncell);\r\n\t if (cell.s) styles.push([row - yCorrection, col - xCorrection, cell.s]);\r\n\t }\r\n\t }\r\n\r\n\t all.push(nrow);\r\n\t }\r\n\r\n\t if (sheet[\"!merges\"]) {\r\n\t var merges = sheet[\"!merges\"];\r\n\r\n\t for (var i = 0; i < merges.length; i++) {\r\n\t var s = merges[i].s;\r\n\t var e = merges[i].e;\r\n\t if (!options.rows || s.r - yCorrection >= 0 && e.r - yCorrection <= options.rows[1]) spans.push([s.r - yCorrection, s.c - xCorrection, e.c - s.c + 1, e.r - s.r + 1]);\r\n\t }\r\n\t }\r\n\r\n\t if (sheet[\"!cols\"]) {\r\n\t var widths = sheet[\"!cols\"];\r\n\r\n\t for (var _i = 0; _i < widths.length; _i++) {\r\n\t if (widths[_i]) sizes.push([\"column\", _i - xCorrection, Math.round(widths[_i].wch / (8.43 / 70))]);\r\n\t } //mode, colind, value\r\n\r\n\t }\r\n\r\n\t if (sheet[\"!rows\"]) {\r\n\t var heights = sheet[\"!rows\"];\r\n\r\n\t for (var _i2 = 0; _i2 < heights.length; _i2++) {\r\n\t if (heights[_i2]) sizes.push([\"row\", _i2 - yCorrection, heights[_i2].hpx]);\r\n\t } //mode (\"row\", \"column\"), rowind, value\r\n\r\n\t }\r\n\t }\r\n\r\n\t return {\r\n\t data: all,\r\n\t spans: spans,\r\n\t styles: styles,\r\n\t sizes: sizes,\r\n\t excel: true\r\n\t };\r\n\t },\r\n\t _urlToOptions: function _urlToOptions(details) {\r\n\t var parts = details.split(\"[\");\r\n\t var options = {};\r\n\t options.name = parts[0];\r\n\r\n\t if (parts[1]) {\r\n\t var rows = parts[1].split(/[^0-9]+/g);\r\n\t rows[0] = rows[0] * 1 || 0;\r\n\t rows[1] = rows[1] * 1 || 9999999;\r\n\t options.rows = rows;\r\n\t }\r\n\r\n\t return options;\r\n\t }\r\n\t}, jsarray);\r\n\r\n\tvar DataDriver = {\r\n\t json: json,\r\n\t jsarray: jsarray,\r\n\t xml: xml,\r\n\t csv: csv,\r\n\t html: html$1,\r\n\t htmltable: htmltable,\r\n\t excel: excel\r\n\t};\r\n\r\n\tvar AtomDataLoader = {\r\n\t $init: function $init(config) {\r\n\t //prepare data store\r\n\t this.data = {};\r\n\t this.waitData = Deferred.defer();\r\n\t if (config) this._settings.datatype = config.datatype || \"json\";\r\n\t this.$ready.push(this._load_when_ready);\r\n\t },\r\n\t _load_when_ready: function _load_when_ready() {\r\n\t this._ready_for_data = true;\r\n\t if (this._settings.url) this.url_setter(this._settings.url);\r\n\t if (this._settings.data) this.data_setter(this._settings.data);\r\n\t },\r\n\t url_setter: function url_setter(value) {\r\n\t value = proxy$b.$parse(value);\r\n\t if (!this._ready_for_data) return value;\r\n\t this.load(value, this._settings.datatype);\r\n\t return value;\r\n\t },\r\n\t data_setter: function data_setter(value) {\r\n\t if (!this._ready_for_data) return value;\r\n\t this.parse(value, this._settings.datatype);\r\n\t return true;\r\n\t },\r\n\t //loads data from external URL\r\n\t load: function load(url, call) {\r\n\t var details = arguments[2] || null;\r\n\t if (!this.callEvent(\"onBeforeLoad\", [])) return Deferred.reject();\r\n\r\n\t if (typeof call == \"string\") {\r\n\t //second parameter can be a loading type or callback\r\n\t //we are not using setDriver as data may be a non-datastore here\r\n\t this.data.driver = DataDriver[call];\r\n\t call = arguments[2];\r\n\t } else if (!this.data.driver) this.data.driver = DataDriver.json; //load data by async ajax call\r\n\t //loading_key - can be set by component, to ignore data from old async requests\r\n\r\n\r\n\t var callback = [{\r\n\t success: this._onLoad,\r\n\t error: this._onLoadError\r\n\t }];\r\n\r\n\t if (call) {\r\n\t if (isArray(call)) callback.push.apply(callback, call);else callback.push(call);\r\n\t } //proxy\t\r\n\r\n\r\n\t url = proxy$b.$parse(url);\r\n\t if (url.$proxy && url.load) return url.load(this, callback, details); //promize\r\n\r\n\t if (typeof url === \"function\") {\r\n\t return url(details).then(bind(function (data) {\r\n\t ajax.$callback(this, callback, \"\", data, -1);\r\n\t }, this), bind(function (x) {\r\n\t ajax.$callback(this, callback, \"\", null, x, true);\r\n\t }, this));\r\n\t } //normal url\r\n\r\n\r\n\t return ajax(url, callback, this);\r\n\t },\r\n\t //loads data from object\r\n\t parse: function parse(data, type) {\r\n\t if (data && data.then && typeof data.then == \"function\") {\r\n\t return data.then(bind(function (data) {\r\n\t if (data && typeof data.json == \"function\") data = data.json();\r\n\t this.parse(data, type);\r\n\t }, this));\r\n\t } //loading data from other component\r\n\r\n\r\n\t if (data && data.sync && this.sync) return this._syncData(data);\r\n\t if (!this.callEvent(\"onBeforeLoad\", [])) return Deferred.reject();\r\n\t this.data.driver = DataDriver[type || \"json\"];\r\n\r\n\t this._onLoad(data, null);\r\n\t },\r\n\t _syncData: function _syncData(data) {\r\n\t if (this.data) this.data.attachEvent(\"onSyncApply\", bind(function () {\r\n\t if (this._call_onready) this._call_onready();\r\n\t }, this));\r\n\t this.sync(data);\r\n\t },\r\n\t _parse: function _parse(data) {\r\n\t var parsed,\r\n\t record,\r\n\t driver = this.data.driver;\r\n\t record = driver.getRecords(data)[0];\r\n\t parsed = record ? driver.getDetails(record) : {};\r\n\t if (this.setValues) this.setValues(parsed);else this.data = parsed;\r\n\t },\r\n\t _onLoadContinue: function _onLoadContinue(data, text, response, loader) {\r\n\t if (data) {\r\n\t if (!this.$onLoad || !this.$onLoad(data, this.data.driver)) {\r\n\t if (this.data && this.data._parse) this.data._parse(data); //datastore\r\n\t else this._parse(data);\r\n\t }\r\n\t } else this._onLoadError(text, response, loader); //data loaded, view rendered, call onready handler\r\n\r\n\r\n\t if (this._call_onready) this._call_onready();\r\n\t this.callEvent(\"onAfterLoad\", []);\r\n\t this.waitData.resolve();\r\n\t },\r\n\t //default after loading callback\r\n\t _onLoad: function _onLoad(text, response, loader) {\r\n\t var driver = this.data.driver;\r\n\t var data;\r\n\t if (loader === -1) data = driver.toObject(response);else {\r\n\t //ignore data loading command if data was reloaded \r\n\t if (this._ajax_queue) this._ajax_queue.remove(loader);\r\n\t data = driver.toObject(text, response);\r\n\t }\r\n\t if (!data || !data.then) this._onLoadContinue(data);else if (data.then && typeof data.then == \"function\") data.then(bind(this._onLoadContinue, this));\r\n\t },\r\n\t _onLoadError: function _onLoadError(text, xml, xhttp) {\r\n\t this.callEvent(\"onAfterLoad\", []);\r\n\t this.callEvent(\"onLoadError\", arguments);\r\n\t callEvent(\"onLoadError\", [text, xml, xhttp, this]);\r\n\t },\r\n\t _check_data_feed: function _check_data_feed(data) {\r\n\t if (!this._settings.dataFeed || this._ignore_feed || !data) return true;\r\n\t var url = this._settings.dataFeed;\r\n\t if (typeof url == \"function\") return url.call(this, data.id || data, data);\r\n\t url = url + (url.indexOf(\"?\") == -1 ? \"?\" : \"&\") + \"action=get&id=\" + encodeURIComponent(data.id || data);\r\n\t if (!this.callEvent(\"onBeforeLoad\", [])) return false;\r\n\t ajax(url, function (text, xml, loader) {\r\n\t this._ignore_feed = true;\r\n\t var driver = DataDriver.json;\r\n\t var data = driver.toObject(text, xml);\r\n\t if (data) this.setValues(driver.getDetails(driver.getRecords(data)[0]));else this._onLoadError(text, xml, loader);\r\n\t this._ignore_feed = false;\r\n\t this.callEvent(\"onAfterLoad\", []);\r\n\t }, this);\r\n\t return false;\r\n\t }\r\n\t};\r\n\r\n\tvar AtomRender = {\r\n\t //convert item to the HTML text\r\n\t _toHTML: function _toHTML(obj) {\r\n\t if (obj.$empty) return \"\";\r\n\t return this._settings.template(obj, this);\r\n\t },\r\n\t //render self, by templating data object\r\n\t render: function render() {\r\n\t var cfg = this._settings;\r\n\r\n\t if (this.isVisible(cfg.id)) {\r\n\t if (!this.callEvent || this.callEvent(\"onBeforeRender\", [this.data])) {\r\n\t if (this.data && !cfg.content) {\r\n\t //it is critical to have this as two commands\r\n\t //its prevent destruction race in Chrome\r\n\t this._dataobj.innerHTML = \"\";\r\n\t this._dataobj.innerHTML = this._toHTML(this.data);\r\n\t }\r\n\r\n\t if (this.callEvent) this.callEvent(\"onAfterRender\", []);\r\n\t }\r\n\r\n\t return true;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t sync: function sync(source) {\r\n\t this._backbone_sync = false;\r\n\r\n\t if (source.name != \"DataStore\") {\r\n\t if (source.data && source.name == \"DataStore\") {\r\n\t source = source.data;\r\n\t } else {\r\n\t this._backbone_sync = true;\r\n\t }\r\n\t }\r\n\r\n\t if (this._backbone_sync) source.bind(\"change\", bind(function (data) {\r\n\t if (data.id == this.data.id) {\r\n\t this.data = data.attributes;\r\n\t this.refresh();\r\n\t }\r\n\t }, this));else source.attachEvent(\"onStoreUpdated\", bind(function (id) {\r\n\t if (!id || id == this.data.id) {\r\n\t this.data = source.pull[id];\r\n\t this.refresh();\r\n\t }\r\n\t }, this));\r\n\t },\r\n\t template_setter: template\r\n\t};\r\n\r\n\tvar AutoScroll = {\r\n\t _auto_scroll: function _auto_scroll(pos$$1) {\r\n\t var yscroll = 1;\r\n\t var xscroll = 0;\r\n\t var mode = this._settings.dragscroll;\r\n\r\n\t if (typeof mode == \"string\") {\r\n\t xscroll = mode.indexOf(\"x\") != -1;\r\n\t yscroll = mode.indexOf(\"y\") != -1;\r\n\t }\r\n\r\n\t var data = this._body || this.$view;\r\n\t var box = offset(data);\r\n\t var top = box.y;\r\n\t var bottom = top + data.offsetHeight;\r\n\t var left = box.x;\r\n\t var right = left + data.offsetWidth;\r\n\t var scroll = this.getScrollState();\r\n\t var reset = false;\r\n\t var sense = Math.max(this.type && !isNaN(parseFloat(this.type.height)) ? this.type.height + 5 : 0, 40); //dnd auto-scroll sensivity\r\n\r\n\t if (yscroll) {\r\n\t var config = this._settings;\r\n\r\n\t if (config.topSplit) {\r\n\t var topSplitPos = this._cellPosition(this.getIdByIndex(config.topSplit - 1), this.columnId(0));\r\n\r\n\t top += topSplitPos.top + topSplitPos.height;\r\n\t }\r\n\r\n\t if (pos$$1.y < top + sense) {\r\n\t this._auto_scrollTo(scroll.x, scroll.y - sense * 2, pos$$1);\r\n\r\n\t reset = true;\r\n\t } else if (pos$$1.y > bottom - sense) {\r\n\t this._auto_scrollTo(scroll.x, scroll.y + sense * 2, pos$$1);\r\n\r\n\t reset = true;\r\n\t }\r\n\t }\r\n\r\n\t if (xscroll) {\r\n\t if (pos$$1.x < left + sense) {\r\n\t this._auto_scrollTo(scroll.x - sense * 2, scroll.y, pos$$1);\r\n\r\n\t reset = true;\r\n\t } else if (pos$$1.x > right - sense) {\r\n\t this._auto_scrollTo(scroll.x + sense * 2, scroll.y, pos$$1);\r\n\r\n\t reset = true;\r\n\t }\r\n\t }\r\n\r\n\t if (reset) this._auto_scroll_delay = delay(this._auto_scroll, this, [pos$$1], 100);\r\n\t },\r\n\t _auto_scrollTo: function _auto_scrollTo(x, y, pos$$1) {\r\n\t if (this.callEvent(\"onBeforeAutoScroll\", [pos$$1])) this.scrollTo(x, y);\r\n\t }\r\n\t};\r\n\r\n\tfunction ready(code) {\r\n\t if (_ready) code.call();else _ready_code.push(code);\r\n\t}\r\n\r\n\tvar _ready = false;\r\n\tvar _ready_code = []; //autodetect codebase folder\r\n\r\n\tvar temp = document.getElementsByTagName(\"SCRIPT\"); //current script, most probably\r\n\r\n\tassert(temp.length, \"Can't locate codebase\");\r\n\r\n\tif (temp.length) {\r\n\t //full path to script\r\n\t temp = (temp[temp.length - 1].getAttribute(\"src\") || \"\").split(\"/\"); //get folder name\r\n\r\n\t temp.splice(temp.length - 1, 1);\r\n\t env.codebase = temp.slice(0, temp.length).join(\"/\") + \"/\";\r\n\t}\r\n\r\n\tvar handler = function handler() {\r\n\t if (env.isIE) document.body.className += \" webix_ie\";\r\n\t callEvent(\"onReady\", []);\r\n\t};\r\n\r\n\tvar doit = function doit() {\r\n\t _ready = true;\r\n\t /* global webix_ready */\r\n\r\n\t if (window.webix_ready && isArray(webix_ready)) _ready_code = webix_ready.concat(_ready_code);\r\n\r\n\t for (var i = 0; i < _ready_code.length; i++) {\r\n\t _ready_code[i].call();\r\n\t }\r\n\r\n\t _ready_code = [];\r\n\t};\r\n\r\n\tattachEvent(\"onReady\", function (force) {\r\n\t if (force) doit();else delay(doit);\r\n\t});\r\n\tif (document.readyState == \"complete\") handler();else event$1(window, \"load\", handler);\r\n\tready(function () {\r\n\t event$1(document.body, \"click\", function (e) {\r\n\t callEvent(\"onClick\", [e || event$1]);\r\n\t });\r\n\t});\r\n\r\n\tvar Touch = {\r\n\t config: {\r\n\t longTouchDelay: 1000,\r\n\t scrollDelay: 150,\r\n\t gravity: 500,\r\n\t deltaStep: 30,\r\n\t speed: \"0ms\",\r\n\t finish: 1500,\r\n\t ellastic: true,\r\n\t fastClick: true\r\n\t },\r\n\t limit: function limit(value) {\r\n\t Touch._limited = value !== false;\r\n\t },\r\n\t disable: function disable() {\r\n\t Touch._disabled = true;\r\n\t },\r\n\t enable: function enable() {\r\n\t Touch._disabled = false;\r\n\t },\r\n\t $init: function $init() {\r\n\t Touch.$init = function () {};\r\n\r\n\t event$1(document.body, mouse.down, Touch._touchstart, {\r\n\t passive: false\r\n\t });\r\n\t event$1(document.body, mouse.move, Touch._touchmove, {\r\n\t passive: false\r\n\t });\r\n\t event$1(document.body, mouse.up, Touch._touchend);\r\n\t event$1(document.body, \"dragstart\", function (e) {\r\n\t if (Touch._disabled || Touch._limited) return;\r\n\t return preventEvent(e);\r\n\t });\r\n\t event$1(document.body, \"touchstart\", function (e) {\r\n\t if (Touch._disabled || Touch._limited || !Touch.config.fastClick) return; //fast click mode for iOS\r\n\t //To have working form elements Android must not block event - so there are no fast clicks for Android\r\n\t //Selects still don't work with fast clicks\r\n\r\n\t if (env.isSafari) {\r\n\t var tag = e.srcElement.tagName.toLowerCase();\r\n\t if (tag == \"input\" || tag == \"textarea\" || tag == \"select\" || tag == \"label\") return true;\r\n\t Touch._fire_fast_event = true;\r\n\t return preventEvent(e);\r\n\t }\r\n\t }, {\r\n\t passive: false\r\n\t });\r\n\r\n\t Touch._clear_artefacts();\r\n\r\n\t Touch._scroll = [null, null];\r\n\t Touch.$active = true;\r\n\t },\r\n\t _clear_artefacts: function _clear_artefacts() {\r\n\t Touch._start_context = Touch._current_context = Touch._prev_context = Touch._scroll_context = null;\r\n\t Touch._scroll_mode = Touch._scroll_node = Touch._scroll_stat = this._long_touched = null; //remove(Touch._scroll);\r\n\t //Touch._scroll = [null, null];\r\n\r\n\t Touch._delta = {\r\n\t _x_moment: 0,\r\n\t _y_moment: 0,\r\n\t _time: 0\r\n\t };\r\n\r\n\t if (Touch._css_button_remove) {\r\n\t removeCss(Touch._css_button_remove, \"webix_touch\");\r\n\t Touch._css_button_remove = null;\r\n\t }\r\n\r\n\t window.clearTimeout(Touch._long_touch_timer);\r\n\t Touch._was_not_moved = true;\r\n\t Touch._axis_x = true;\r\n\t Touch._axis_y = true;\r\n\t if (!Touch._active_transion) Touch._scroll_end();\r\n\t },\r\n\t _touchend: function _touchend(e) {\r\n\t if (Touch._start_context) {\r\n\t if (!Touch._scroll_mode) {\r\n\t if (!this._long_touched) {\r\n\t if (Touch._axis_y && !Touch._axis_x) {\r\n\t Touch._translate_event(\"onSwipeX\");\r\n\t } else if (Touch._axis_x && !Touch._axis_y) {\r\n\t Touch._translate_event(\"onSwipeY\");\r\n\t } else {\r\n\t if (env.isSafari && Touch._fire_fast_event) {\r\n\t //need to test for mobile ff and blackbery\r\n\t Touch._fire_fast_event = false;\r\n\t var target = Touch._start_context.target; //dark iOS magic, without delay it can skip repainting\r\n\r\n\t delay(function () {\r\n\t var click_event = document.createEvent(\"MouseEvents\");\r\n\t click_event.initEvent(\"click\", true, true);\r\n\t target.dispatchEvent(click_event);\r\n\t });\r\n\t }\r\n\t }\r\n\t }\r\n\t } else {\r\n\t var temp = Touch._get_matrix(Touch._scroll_node);\r\n\r\n\t var x = temp.e;\r\n\t var y = temp.f;\r\n\t var finish = Touch.config.finish;\r\n\r\n\t var delta = Touch._get_delta(e, true);\r\n\r\n\t var view = $$(Touch._scroll_node);\r\n\t var gravity = view && view.$scroll ? view.$scroll.gravity : Touch.config.gravity;\r\n\r\n\t if (delta._time) {\r\n\t var nx = x + gravity * delta._x_moment / delta._time;\r\n\t var ny = y + gravity * delta._y_moment / delta._time;\r\n\t var cnx = Touch._scroll[0] ? Touch._correct_minmax(nx, false, false, Touch._scroll_stat.dx, Touch._scroll_stat.px) : x;\r\n\t var cny = Touch._scroll[1] ? Touch._correct_minmax(ny, false, false, Touch._scroll_stat.dy, Touch._scroll_stat.py) : y;\r\n\t var size = Math.max(Math.abs(cnx - x), Math.abs(cny - y));\r\n\t if (size < 150) finish = finish * size / 150;\r\n\t if (cnx != x || cny != y) finish = Math.round(finish * Math.max((cnx - x) / (nx - x), (cny - y) / (ny - y)));\r\n\t var result = {\r\n\t e: cnx,\r\n\t f: cny\r\n\t };\r\n\t view = $$(Touch._scroll_node);\r\n\t if (view && view.adjustScroll) view.adjustScroll(result); //finish = Math.max(100,(Touch._fast_correction?100:finish));\r\n\r\n\t finish = Math.max(100, finish);\r\n\r\n\t if (x != result.e || y != result.f) {\r\n\t Touch._set_matrix(Touch._scroll_node, result.e, result.f, finish + \"ms\");\r\n\r\n\t if (Touch._scroll_master) Touch._scroll_master._sync_scroll(result.e, result.f, finish + \"ms\");\r\n\r\n\t Touch._set_scroll(result.e, result.f, finish + \"ms\");\r\n\t } else {\r\n\t Touch._scroll_end();\r\n\t }\r\n\t } else Touch._scroll_end();\r\n\t }\r\n\r\n\t Touch._translate_event(\"onTouchEnd\");\r\n\r\n\t Touch._clear_artefacts();\r\n\t }\r\n\t },\r\n\t _touchmove: function _touchmove(e) {\r\n\t if (!Touch._scroll_context || !Touch._start_context) return;\r\n\r\n\t var delta = Touch._get_delta(e);\r\n\r\n\t Touch._translate_event(\"onTouchMove\");\r\n\r\n\t if (Touch._scroll_mode) {\r\n\t Touch._set_scroll_pos(delta);\r\n\t } else {\r\n\t Touch._axis_x = Touch._axis_check(delta._x, \"x\", Touch._axis_x);\r\n\t Touch._axis_y = Touch._axis_check(delta._y, \"y\", Touch._axis_y);\r\n\r\n\t if (Touch._scroll_mode) {\r\n\t var view = Touch._get_event_view(\"onBeforeScroll\", true);\r\n\r\n\t if (view) {\r\n\t var data = {};\r\n\t view.callEvent(\"onBeforeScroll\", [data]);\r\n\r\n\t if (data.update) {\r\n\t Touch.config.speed = data.speed;\r\n\t Touch.config.scale = data.scale;\r\n\t }\r\n\t }\r\n\r\n\t Touch._init_scroller(delta); //apply scrolling\r\n\r\n\t }\r\n\t }\r\n\r\n\t return preventEvent(e);\r\n\t },\r\n\t _set_scroll_pos: function _set_scroll_pos() {\r\n\t if (!Touch._scroll_node) return;\r\n\r\n\t var temp = Touch._get_matrix(Touch._scroll_node);\r\n\r\n\t var prev = Touch._prev_context || Touch._start_context;\r\n\t var view = $$(Touch._scroll_node);\r\n\t var ellastic = view && view.$scroll ? view.$scroll.ellastic : Touch.config.ellastic;\r\n\t if (Touch._scroll[0]) temp.e = Touch._correct_minmax(temp.e - prev.x + Touch._current_context.x, ellastic, temp.e, Touch._scroll_stat.dx, Touch._scroll_stat.px);\r\n\t if (Touch._scroll[1]) temp.f = Touch._correct_minmax(temp.f - prev.y + Touch._current_context.y, ellastic, temp.f, Touch._scroll_stat.dy, Touch._scroll_stat.py);\r\n\r\n\t Touch._set_matrix(Touch._scroll_node, temp.e, temp.f, \"0ms\");\r\n\r\n\t if (Touch._scroll_master) Touch._scroll_master._sync_scroll(temp.e, temp.f, \"0ms\");\r\n\r\n\t Touch._set_scroll(temp.e, temp.f, \"0ms\");\r\n\t },\r\n\t _set_scroll: function _set_scroll(dx, dy, speed) {\r\n\t var edx = Touch._scroll_stat.px / Touch._scroll_stat.dx * -dx;\r\n\t var edy = Touch._scroll_stat.py / Touch._scroll_stat.dy * -dy;\r\n\t if (Touch._scroll[0]) Touch._set_matrix(Touch._scroll[0], edx, 0, speed);\r\n\t if (Touch._scroll[1]) Touch._set_matrix(Touch._scroll[1], 0, edy, speed);\r\n\t },\r\n\t scrollTo: function scrollTo(node, x, y, speed) {\r\n\t Touch._set_matrix(node, x, y, speed);\r\n\t },\r\n\t _set_matrix: function _set_matrix(node, xv, yv, speed) {\r\n\t if (!Touch._in_anim_frame && window.setAnimationFrame) {\r\n\t window.setAnimationFrame(function () {\r\n\t Touch._in_anim_frame = true;\r\n\t return Touch._set_matrix(node, xv, yv, speed);\r\n\t });\r\n\t }\r\n\r\n\t Touch._in_anim_frame = null;\r\n\t Touch._active_transion = true;\r\n\r\n\t if (node) {\r\n\t var trans = Touch.config.translate || env.translate;\r\n\t node.style[env.transform] = trans + \"(\" + Math.round(xv) + \"px, \" + Math.round(yv) + \"px\" + (trans == \"translate3d\" ? \", 0\" : \"\") + \")\";\r\n\t node.style[env.transitionDuration] = speed;\r\n\t }\r\n\t },\r\n\t _get_matrix: function _get_matrix(node) {\r\n\t var matrix = window.getComputedStyle(node)[env.transform];\r\n\t var tmatrix;\r\n\t if (matrix == \"none\") tmatrix = {\r\n\t e: 0,\r\n\t f: 0\r\n\t };else {\r\n\t if (window.WebKitCSSMatrix)\r\n\t /* global WebKitCSSMatrix */\r\n\t tmatrix = new WebKitCSSMatrix(matrix);else if (window.MSCSSMatrix)\r\n\t /* global MSCSSMatrix */\r\n\t tmatrix = new MSCSSMatrix(matrix);else {\r\n\t // matrix(1, 0, 0, 1, 0, 0) --> 1, 0, 0, 1, 0, 0\r\n\t var _tmatrix = matrix.replace(/(matrix\\()(.*)(\\))/gi, \"$2\"); // 1, 0, 0, 1, 0, 0 --> 1,0,0,1,0,0\r\n\r\n\r\n\t _tmatrix = _tmatrix.replace(/\\s/gi, \"\");\r\n\t _tmatrix = _tmatrix.split(\",\");\r\n\t tmatrix = {};\r\n\t var tkey = [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\"];\r\n\r\n\t for (var i = 0; i < tkey.length; i++) {\r\n\t tmatrix[tkey[i]] = parseInt(_tmatrix[i], 10);\r\n\t }\r\n\t }\r\n\t }\r\n\t if (Touch._scroll_master) Touch._scroll_master._sync_pos(tmatrix);\r\n\t return tmatrix;\r\n\t },\r\n\t _correct_minmax: function _correct_minmax(value, allow, current, dx, px) {\r\n\t if (value === current) return value;\r\n\t var delta = Math.abs(value - current);\r\n\t var sign = delta / (value - current); //\tTouch._fast_correction = true;\r\n\r\n\t if (value > 0) return allow ? current + sign * Math.sqrt(delta) : 0;\r\n\t var max = dx - px;\r\n\t if (max + value < 0) return allow ? current - Math.sqrt(-(value - current)) : -max; //\tTouch._fast_correction = false;\r\n\r\n\t return value;\r\n\t },\r\n\t _init_scroll_node: function _init_scroll_node(node) {\r\n\t if (!node.scroll_enabled) {\r\n\t node.scroll_enabled = true;\r\n\t node.parentNode.style.position = \"relative\";\r\n\t var prefix = env.cssPrefix;\r\n\t node.style.cssText += prefix + \"transition: \" + prefix + \"transform; \" + prefix + \"user-select:none; \" + prefix + \"transform-style:flat;\";\r\n\t node.addEventListener(env.transitionEnd, Touch._scroll_end, false);\r\n\t }\r\n\t },\r\n\t _init_scroller: function _init_scroller() {\r\n\t if (Touch._scroll_mode.indexOf(\"x\") != -1) Touch._scroll[0] = Touch._create_scroll(\"x\", Touch._scroll_stat.dx, Touch._scroll_stat.px, \"width\");\r\n\t if (Touch._scroll_mode.indexOf(\"y\") != -1) Touch._scroll[1] = Touch._create_scroll(\"y\", Touch._scroll_stat.dy, Touch._scroll_stat.py, \"height\");\r\n\r\n\t Touch._init_scroll_node(Touch._scroll_node);\r\n\r\n\t window.setTimeout(Touch._set_scroll_pos, 1);\r\n\t },\r\n\t _create_scroll: function _create_scroll(mode, dy, py, dim) {\r\n\t if (dy - py < 2) {\r\n\t var matrix = Touch._get_matrix(Touch._scroll_node);\r\n\r\n\t var e = mode == \"y\" ? matrix.e : 0;\r\n\t var f = mode == \"y\" ? 0 : matrix.f;\r\n\t if (!Touch._scroll_master) Touch._set_matrix(Touch._scroll_node, e, f, \"0ms\");\r\n\t Touch._scroll_mode = Touch._scroll_mode.replace(mode, \"\");\r\n\t return \"\";\r\n\t }\r\n\r\n\t var scroll = create(\"DIV\", {\r\n\t \"class\": \"webix_scroll_\" + mode\r\n\t }, \"\");\r\n\t scroll.style[dim] = Math.max(py * py / dy - 7, 10) + \"px\";\r\n\t if (Touch._scroll_stat.left) if (mode === \"x\") scroll.style.left = Touch._scroll_stat.left + \"px\";else scroll.style.right = -Touch._scroll_stat.left + \"px\";\r\n\t if (Touch._scroll_stat.hidden) scroll.style.visibility = \"hidden\";\r\n\r\n\t Touch._scroll_node.parentNode.appendChild(scroll);\r\n\r\n\t return scroll;\r\n\t },\r\n\t _axis_check: function _axis_check(value, mode, old) {\r\n\t if (value > Touch.config.deltaStep) {\r\n\t if (Touch._was_not_moved) {\r\n\t Touch._long_move(mode);\r\n\r\n\t Touch._locate(mode);\r\n\r\n\t if ((Touch._scroll_mode || \"\").indexOf(mode) == -1) Touch._scroll_mode = \"\";\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\r\n\t return old;\r\n\t },\r\n\t _scroll_end: function _scroll_end() {\r\n\t //sending event to the owner of the scroll only\r\n\t var result, state, view;\r\n\t view = $$(Touch._scroll_node || this);\r\n\r\n\t if (view) {\r\n\t if (Touch._scroll_node) result = Touch._get_matrix(Touch._scroll_node);else if (view.getScrollState) {\r\n\t state = view.getScrollState();\r\n\t result = {\r\n\t e: state.x,\r\n\t f: state.y\r\n\t };\r\n\t }\r\n\t callEvent(\"onAfterScroll\", [result]);\r\n\t if (view.callEvent) view.callEvent(\"onAfterScroll\", [result]);\r\n\t }\r\n\r\n\t if (!Touch._scroll_mode) {\r\n\t remove(Touch._scroll);\r\n\t Touch._scroll = [null, null];\r\n\t }\r\n\r\n\t Touch._active_transion = false;\r\n\t },\r\n\t _long_move: function _long_move() {\r\n\t window.clearTimeout(Touch._long_touch_timer);\r\n\t Touch._was_not_moved = false;\r\n\t },\r\n\t _stop_old_scroll: function _stop_old_scroll(e) {\r\n\t if (Touch._scroll[0] || Touch._scroll[1]) {\r\n\t Touch._stop_scroll(e, Touch._scroll[0] ? \"x\" : \"y\");\r\n\t } else return true;\r\n\t },\r\n\t _touchstart: function _touchstart(e) {\r\n\t var target = e.target || event$1.srcElement;\r\n\t if (Touch._disabled || target.tagName && target.tagName.toLowerCase() == \"textarea\" && target.offsetHeight < target.scrollHeight) return;\r\n\t Touch._long_touched = null;\r\n\t Touch._scroll_context = Touch._start_context = mouse.context(e); // in \"limited\" mode we should have possibility to use slider\r\n\r\n\t var element = $$(e);\r\n\r\n\t if (Touch._limited && !Touch._is_scroll() && !(element && element.$touchCapture)) {\r\n\t Touch._scroll_context = null;\r\n\t }\r\n\r\n\t Touch._translate_event(\"onTouchStart\");\r\n\r\n\t if (Touch._stop_old_scroll(e)) Touch._long_touch_timer = window.setTimeout(Touch._long_touch, Touch.config.longTouchDelay);\r\n\r\n\t if (element && element.touchable && (!target.className || target.className.indexOf(\"webix_view\") !== 0)) {\r\n\t Touch._css_button_remove = element.getNode(e);\r\n\t addCss(Touch._css_button_remove, \"webix_touch\");\r\n\t }\r\n\t },\r\n\t _long_touch: function _long_touch() {\r\n\t if (Touch._start_context) {\r\n\t Touch._translate_event(\"onLongTouch\");\r\n\r\n\t callEvent(\"onClick\", [Touch._start_context]);\r\n\t Touch._long_touched = true; //Touch._clear_artefacts();\r\n\t }\r\n\t },\r\n\t _stop_scroll: function _stop_scroll(e, stop_mode) {\r\n\t Touch._locate(stop_mode);\r\n\r\n\t var scroll = Touch._scroll[0] || Touch._scroll[1];\r\n\r\n\t if (scroll) {\r\n\t var view = Touch._get_event_view(\"onBeforeScroll\", true);\r\n\r\n\t if (view) view.callEvent(\"onBeforeScroll\", [Touch._start_context, Touch._current_context]);\r\n\t }\r\n\r\n\t if (scroll && (!Touch._scroll_node || scroll.parentNode != Touch._scroll_node.parentNode)) {\r\n\t Touch._clear_artefacts();\r\n\r\n\t Touch._scroll_end();\r\n\r\n\t Touch._start_context = mouse.context(e);\r\n\t }\r\n\r\n\t Touch._touchmove(e);\r\n\t },\r\n\t _get_delta: function _get_delta(e) {\r\n\t Touch._prev_context = Touch._current_context;\r\n\t Touch._current_context = mouse.context(e);\r\n\t Touch._delta._x = Math.abs(Touch._start_context.x - Touch._current_context.x);\r\n\t Touch._delta._y = Math.abs(Touch._start_context.y - Touch._current_context.y);\r\n\r\n\t if (Touch._prev_context) {\r\n\t if (Touch._current_context.time - Touch._prev_context.time < Touch.config.scrollDelay) {\r\n\t Touch._delta._x_moment = Touch._delta._x_moment / 1.3 + Touch._current_context.x - Touch._prev_context.x;\r\n\t Touch._delta._y_moment = Touch._delta._y_moment / 1.3 + Touch._current_context.y - Touch._prev_context.y;\r\n\t } else {\r\n\t Touch._delta._y_moment = Touch._delta._x_moment = 0;\r\n\t }\r\n\r\n\t Touch._delta._time = Touch._delta._time / 1.3 + (Touch._current_context.time - Touch._prev_context.time);\r\n\t }\r\n\r\n\t return Touch._delta;\r\n\t },\r\n\t _get_sizes: function _get_sizes(node) {\r\n\t Touch._scroll_stat = {\r\n\t dx: node.offsetWidth,\r\n\t dy: node.offsetHeight,\r\n\t px: node.parentNode.offsetWidth,\r\n\t py: node.parentNode.offsetHeight\r\n\t };\r\n\t },\r\n\t _is_scroll: function _is_scroll(locate_mode) {\r\n\t var node = Touch._start_context.target;\r\n\t if (!env.touch && !env.transition && !env.transform) return null;\r\n\r\n\t while (node && node.tagName != \"BODY\") {\r\n\t if (node.getAttribute) {\r\n\t var mode = node.getAttribute(\"touch_scroll\");\r\n\t if (mode && (!locate_mode || mode.indexOf(locate_mode) != -1)) return [node, mode];\r\n\t }\r\n\r\n\t node = node.parentNode;\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t _locate: function _locate(locate_mode) {\r\n\t var state = this._is_scroll(locate_mode);\r\n\r\n\t if (state) {\r\n\t Touch._scroll_mode = state[1];\r\n\t Touch._scroll_node = state[0];\r\n\r\n\t Touch._get_sizes(state[0]);\r\n\t }\r\n\r\n\t return state;\r\n\t },\r\n\t _translate_event: function _translate_event(name) {\r\n\t callEvent(name, [Touch._start_context, Touch._current_context]);\r\n\r\n\t var view = Touch._get_event_view(name);\r\n\r\n\t if (view) view.callEvent(name, [Touch._start_context, Touch._current_context]);\r\n\t },\r\n\t _get_event_view: function _get_event_view(name, active) {\r\n\t var view = $$(active ? Touch._scroll_node : Touch._start_context);\r\n\t if (!view) return null;\r\n\r\n\t while (view) {\r\n\t if (view.hasEvent && view.hasEvent(name)) return view;\r\n\t view = view.getParentView();\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t _get_context: function _get_context(e) {\r\n\t if (!e.touches[0]) {\r\n\t var temp = Touch._current_context;\r\n\t temp.time = new Date();\r\n\t return temp;\r\n\t }\r\n\r\n\t return {\r\n\t target: e.target,\r\n\t x: e.touches[0].pageX,\r\n\t y: e.touches[0].pageY,\r\n\t time: new Date()\r\n\t };\r\n\t },\r\n\t _get_context_m: function _get_context_m(e) {\r\n\t return {\r\n\t target: e.target || e.srcElement,\r\n\t x: e.pageX,\r\n\t y: e.pageY,\r\n\t time: new Date()\r\n\t };\r\n\t }\r\n\t};\r\n\r\n\tfunction touchInit() {\r\n\t if (env.touch) {\r\n\t Touch.$init(); //not full screen mode\r\n\r\n\t if (document.body.className.indexOf(\"webix_full_screen\") == -1) Touch.limit(true);\r\n\t if (window.MSCSSMatrix) addStyle(\".webix_view{ -ms-touch-action: none; }\");\r\n\t } else {\r\n\t var id = event$1(document.body, \"touchstart\", function (ev) {\r\n\t if (ev.touches.length && ev.touches[0].radiusX > 4) {\r\n\t env.touch = true;\r\n\t setMouse(mouse);\r\n\t touchInit();\r\n\r\n\t for (var key in ui.views) {\r\n\t var view = ui.views[key];\r\n\t if (view && view.$touch) view.$touch();\r\n\t }\r\n\t }\r\n\r\n\t eventRemove(id);\r\n\t }, {\r\n\t capture: true\r\n\t });\r\n\t }\r\n\t}\r\n\r\n\tfunction setMouse(mouse) {\r\n\t mouse.down = \"touchstart\";\r\n\t mouse.move = \"touchmove\";\r\n\t mouse.up = \"touchend\";\r\n\t mouse.context = Touch._get_context;\r\n\t}\r\n\r\n\tready(touchInit);\r\n\tvar mouse = env.mouse = {\r\n\t down: \"mousedown\",\r\n\t up: \"mouseup\",\r\n\t move: \"mousemove\",\r\n\t context: Touch._get_context_m\r\n\t};\r\n\r\n\tif (window.navigator.pointerEnabled) {\r\n\t mouse.down = \"pointerdown\";\r\n\t mouse.move = \"pointermove\";\r\n\t mouse.up = \"pointerup\";\r\n\t} else if (window.navigator.msPointerEnabled) {\r\n\t mouse.down = \"MSPointerDown\";\r\n\t mouse.move = \"MSPointerMove\";\r\n\t mouse.up = \"MSPointerUp\";\r\n\t} else if (env.touch) setMouse(mouse);\r\n\r\n\tfunction _uid(name) {\r\n\t return \"$\" + name + (_namecount[name] = (_namecount[name] || 0) + 1);\r\n\t}\r\n\tvar _namecount = {};\r\n\tvar _freeze_resize = false;\r\n\tfunction freeze(handler, trigger) {\r\n\t _freeze_resize = true;\r\n\t var res = handler();\r\n\r\n\t if (res && res.then) {\r\n\t res = res.then(function (any) {\r\n\t _freeze_resize = false;\r\n\t if (trigger !== false) resize();\r\n\t return any;\r\n\t });\r\n\t } else {\r\n\t _freeze_resize = false;\r\n\t if (trigger !== false) resize();\r\n\t }\r\n\r\n\t return res;\r\n\t}\r\n\tfunction resize() {\r\n\t use(\"UIManager\").applyChanges();\r\n\t callEvent(\"onClick\", []);\r\n\t state._force_resize = true;\r\n\t if (!_freeze_resize) for (var i = state.top_views.length - 1; i >= 0; i--) {\r\n\t if (state.top_views[i].obj) state.top_views[i].obj.resize();\r\n\t }\r\n\t state._force_resize = false;\r\n\t}\r\n\tfunction each(parent, logic, master, include) {\r\n\t if (parent) {\r\n\t var children = include ? [parent] : parent.getChildViews();\r\n\r\n\t for (var i = 0; i < children.length; i++) {\r\n\t if (logic.call(master, children[i]) !== false) each(children[i], logic, master);\r\n\t }\r\n\t }\r\n\t}\r\n\tfunction zIndex() {\r\n\t return env.zIndexBase++;\r\n\t}\r\n\tevent$1(window, \"resize\", function () {\r\n\t // check for virtual keyboard\r\n\t if (env.touch && (state._focus_time && new Date() - state._focus_time < 1000)) {\r\n\t return;\r\n\t } else {\r\n\t resize();\r\n\t }\r\n\t});\r\n\r\n\t/*\r\n\t\tBehavior:DND - low-level dnd handling\r\n\t\t@export\r\n\t\t\tgetContext\r\n\t\t\taddDrop\r\n\t\t\taddDrag\r\n\t\t\t\r\n\t\tDND master can define next handlers\r\n\t\t\tonCreateDrag\r\n\t\t\tonDragIng\r\n\t\t\tonDragOut\r\n\t\t\tonDrag\r\n\t\t\tonDrop\r\n\t\tall are optional\r\n\t*/\r\n\r\n\tvar DragControl = {\r\n\t //has of known dnd masters\r\n\t _drag_masters: toArray([\"dummy\"]),\r\n\r\n\t /*\r\n\t \tregister drop area\r\n\t \t@param node \t\t\thtml node or ID\r\n\t \t@param ctrl \t\t\toptions dnd master\r\n\t \t@param master_mode \t\ttrue if you have complex drag-area rules\r\n\t */\r\n\t addDrop: function addDrop(node, ctrl, master_mode) {\r\n\t node = toNode(node);\r\n\t node.webix_drop = this._getCtrl(ctrl);\r\n\t if (master_mode) node.webix_master = true;\r\n\t },\r\n\t //return index of master in collection\r\n\t //it done in such way to prevent dnd master duplication\r\n\t //probably useless, used only by addDrop and addDrag methods\r\n\t _getCtrl: function _getCtrl(ctrl) {\r\n\t ctrl = ctrl || DragControl;\r\n\r\n\t var index$$1 = this._drag_masters.find(ctrl);\r\n\r\n\t if (index$$1 < 0) {\r\n\t index$$1 = this._drag_masters.length;\r\n\r\n\t this._drag_masters.push(ctrl);\r\n\t }\r\n\r\n\t return index$$1;\r\n\t },\r\n\t _createTouchDrag: function _createTouchDrag(e) {\r\n\t var dragCtrl = DragControl;\r\n\r\n\t var master = this._getActiveDragMaster(); // for data items only\r\n\r\n\r\n\t if (master && master._getDragItemPos) {\r\n\t if (!dragCtrl._html) dragCtrl.createDrag(e);\r\n\t var ctx = dragCtrl._drag_context;\r\n\t dragCtrl._html.style.left = e.x + dragCtrl.left + (ctx.x_offset || 0) + \"px\";\r\n\t dragCtrl._html.style.top = e.y + dragCtrl.top + (ctx.y_offset || 0) + \"px\";\r\n\t }\r\n\t },\r\n\r\n\t /*\r\n\t \tregister drag area\r\n\t \t@param node \thtml node or ID\r\n\t \t@param ctrl \toptions dnd master\r\n\t */\r\n\t addDrag: function addDrag(node, ctrl) {\r\n\t node = toNode(node);\r\n\t node.webix_drag = this._getCtrl(ctrl);\r\n\r\n\t _event(node, env.mouse.down, this._preStart, {\r\n\t bind: node\r\n\t });\r\n\r\n\t _event(node, \"dragstart\", preventEvent);\r\n\t },\r\n\t //logic of drag - start, we are not creating drag immediately, instead of that we hears mouse moving\r\n\t _preStart: function _preStart(e) {\r\n\t if (DragControl._active) {\r\n\t //if we have nested drag areas, use the top one and ignore the inner one\r\n\t if (DragControl._saved_event == e) return;\r\n\r\n\t DragControl._preStartFalse();\r\n\r\n\t DragControl.destroyDrag(e);\r\n\t }\r\n\r\n\t DragControl._active = this;\r\n\t var evobj = env.mouse.context(e);\r\n\t DragControl._start_pos = evobj;\r\n\t DragControl._saved_event = e;\r\n\t DragControl._webix_drag_mm = event$1(document.body, env.mouse.move, DragControl._startDrag);\r\n\t DragControl._webix_drag_mu = event$1(document, env.mouse.up, DragControl._preStartFalse); //need to run here, or will not work in IE\r\n\r\n\t addCss(document.body, \"webix_noselect\", 1);\r\n\t },\r\n\t //if mouse was released before moving - this is not a dnd, remove event handlers\r\n\t _preStartFalse: function _preStartFalse() {\r\n\t DragControl._clean_dom_after_drag();\r\n\t },\r\n\t //mouse was moved without button released - dnd started, update event handlers\r\n\t _startDrag: function _startDrag(e) {\r\n\t //prevent unwanted dnd\r\n\t var pos$$1 = env.mouse.context(e);\r\n\r\n\t var master = DragControl._getActiveDragMaster(); // only long-touched elements can be dragged\r\n\r\n\r\n\t var longTouchLimit = master && env.touch && master._getDragItemPos && !Touch._long_touched;\r\n\t if (longTouchLimit || Math.abs(pos$$1.x - DragControl._start_pos.x) < 5 && Math.abs(pos$$1.y - DragControl._start_pos.y) < 5) return;\r\n\r\n\t DragControl._clean_dom_after_drag(true);\r\n\r\n\t if (!DragControl._html) if (!DragControl.createDrag(DragControl._saved_event)) return;\r\n\t DragControl.sendSignal(\"start\"); //useless for now\r\n\r\n\t DragControl._webix_drag_mm = event$1(document.body, env.mouse.move, DragControl._moveDrag);\r\n\t DragControl._webix_drag_mu = event$1(document, env.mouse.up, DragControl._stopDrag);\r\n\r\n\t DragControl._moveDrag(e);\r\n\r\n\t if (env.touch) return preventEvent(e);\r\n\t },\r\n\t //mouse was released while dnd is active - process target\r\n\t _stopDrag: function _stopDrag(e) {\r\n\t DragControl._clean_dom_after_drag();\r\n\r\n\t DragControl._saved_event = null;\r\n\r\n\t if (DragControl._last) {\r\n\t //if some drop target was confirmed\r\n\t DragControl.$drop(DragControl._active, DragControl._last, e);\r\n\t DragControl.$dragOut(DragControl._active, DragControl._last, null, e);\r\n\t }\r\n\r\n\t DragControl.destroyDrag(e);\r\n\t DragControl.sendSignal(\"stop\"); //useless for now\r\n\t },\r\n\t _clean_dom_after_drag: function _clean_dom_after_drag(still_drag) {\r\n\t this._webix_drag_mm = eventRemove(this._webix_drag_mm);\r\n\t this._webix_drag_mu = eventRemove(this._webix_drag_mu);\r\n\t if (!still_drag) removeCss(document.body, \"webix_noselect\");\r\n\t },\r\n\t //dnd is active and mouse position was changed\r\n\t _moveDrag: function _moveDrag(e) {\r\n\t var dragCtrl = DragControl;\r\n\t var pos$$1 = pos(e);\r\n\t var evobj = env.mouse.context(e); //give possibility to customize drag position\r\n\r\n\t var customPos = dragCtrl.$dragPos(pos$$1, e); //adjust drag marker position\r\n\r\n\t var ctx = dragCtrl._drag_context;\r\n\t dragCtrl._html.style.top = pos$$1.y + dragCtrl.top + (customPos || !ctx.y_offset ? 0 : ctx.y_offset) + \"px\";\r\n\t dragCtrl._html.style.left = pos$$1.x + dragCtrl.left + (customPos || !ctx.x_offset ? 0 : ctx.x_offset) + \"px\";\r\n\t if (dragCtrl._skip) dragCtrl._skip = false;else {\r\n\t var target = evobj.target = env.touch ? document.elementFromPoint(evobj.x, evobj.y) : evobj.target;\r\n\t var touch_event = env.touch ? evobj : e;\r\n\r\n\t dragCtrl._checkLand(target, touch_event);\r\n\t }\r\n\t return preventEvent(e);\r\n\t },\r\n\t //check if item under mouse can be used as drop landing\r\n\t _checkLand: function _checkLand(node, e) {\r\n\t while (node && node.tagName != \"BODY\") {\r\n\t if (node.webix_drop) {\r\n\t //if drop area registered\r\n\t if (this._last && (this._last != node || node.webix_master)) //if this area with complex dnd master\r\n\t this.$dragOut(this._active, this._last, node, e); //inform master about possible mouse-out\r\n\r\n\t if (!this._last || this._last != node || node.webix_master) {\r\n\t //if this is new are or area with complex dnd master\r\n\t this._last = null; //inform master about possible mouse-in\r\n\r\n\t this._landing = this.$dragIn(DragControl._active, node, e);\r\n\t if (this._landing) //landing was rejected\r\n\t this._last = node;\r\n\t return;\r\n\t }\r\n\r\n\t return;\r\n\t }\r\n\r\n\t node = node.parentNode;\r\n\t }\r\n\r\n\t if (this._last) //mouse was moved out of previous landing, and without finding new one \r\n\t this._last = this._landing = this.$dragOut(this._active, this._last, null, e);\r\n\t },\r\n\t //mostly useless for now, can be used to add cross-frame dnd\r\n\t sendSignal: function sendSignal(signal) {\r\n\t DragControl.active = signal == \"start\";\r\n\t },\r\n\t //return master for html area\r\n\t getMaster: function getMaster(t) {\r\n\t return this._drag_masters[t.webix_drag || t.webix_drop];\r\n\t },\r\n\t //return dhd-context object\r\n\t getContext: function getContext() {\r\n\t return this._drag_context;\r\n\t },\r\n\t getNode: function getNode() {\r\n\t return this._html;\r\n\t },\r\n\t //called when dnd is initiated, must create drag representation\r\n\t createDrag: function createDrag(e) {\r\n\t var dragCtl = DragControl;\r\n\t var a = dragCtl._active;\r\n\t dragCtl._drag_context = {};\r\n\t var master = this._drag_masters[a.webix_drag];\r\n\t var drag_container; //if custom method is defined - use it\r\n\r\n\t if (master.$dragCreate) {\r\n\t drag_container = master.$dragCreate(a, e);\r\n\t if (!drag_container) return false;\r\n\r\n\t this._setDragOffset(e);\r\n\r\n\t drag_container.style.position = \"absolute\";\r\n\t } else {\r\n\t //overvise use default one\r\n\t var text = dragCtl.$drag(a, e);\r\n\r\n\t dragCtl._setDragOffset(e);\r\n\r\n\t if (!text) return false;\r\n\t drag_container = document.createElement(\"DIV\");\r\n\t drag_container.innerHTML = text;\r\n\t drag_container.className = \"webix_drag_zone\";\r\n\t document.body.appendChild(drag_container);\r\n\t var context = dragCtl._drag_context;\r\n\r\n\t if (context.html && env.pointerevents) {\r\n\t context.x_offset = -Math.round(drag_container.offsetWidth * 0.5);\r\n\t context.y_offset = -Math.round(drag_container.offsetHeight * 0.75);\r\n\t }\r\n\t }\r\n\t /*\r\n\t \tdragged item must have topmost z-index\r\n\t \tin some cases item already have z-index\r\n\t \tso we will preserve it if possible\r\n\t */\r\n\r\n\r\n\t drag_container.style.zIndex = Math.max(drag_container.style.zIndex, zIndex());\r\n\t DragControl._skipDropH = event$1(drag_container, env.mouse.move, DragControl._skip_mark);\r\n\t if (!DragControl._drag_context.from) DragControl._drag_context = {\r\n\t source: a,\r\n\t from: a\r\n\t };\r\n\t DragControl._html = drag_container;\r\n\t return true;\r\n\t },\r\n\t //helper, prevents unwanted mouse-out events\r\n\t _skip_mark: function _skip_mark() {\r\n\t DragControl._skip = true;\r\n\t },\r\n\t //after dnd end, remove all traces and used html elements\r\n\t destroyDrag: function destroyDrag(e) {\r\n\t var a = DragControl._active;\r\n\t var master = this._drag_masters[a.webix_drag];\r\n\r\n\t if (master && master.$dragDestroy) {\r\n\t DragControl._skipDropH = eventRemove(DragControl._skipDropH);\r\n\t if (DragControl._html) master.$dragDestroy(a, DragControl._html, e);\r\n\t } else {\r\n\t remove(DragControl._html);\r\n\t }\r\n\r\n\t DragControl._landing = DragControl._active = DragControl._last = DragControl._html = null; //DragControl._x_offset = DragControl._y_offset = null;\r\n\t },\r\n\t _getActiveDragMaster: function _getActiveDragMaster() {\r\n\t return DragControl._drag_masters[DragControl._active.webix_drag];\r\n\t },\r\n\t top: 5,\r\n\t //relative position of drag marker to mouse cursor\r\n\t left: 5,\r\n\t _setDragOffset: function _setDragOffset(e) {\r\n\t var dragCtl = DragControl;\r\n\t var pos$$1 = dragCtl._start_pos;\r\n\t var ctx = dragCtl._drag_context;\r\n\t if (typeof ctx.x_offset != \"undefined\" && typeof ctx.y_offset != \"undefined\") return null;\r\n\t ctx.x_offset = ctx.y_offset = 0;\r\n\r\n\t if (env.pointerevents) {\r\n\t var m = DragControl._getActiveDragMaster();\r\n\r\n\t if (m._getDragItemPos && m !== this) {\r\n\t var itemPos = m._getDragItemPos(pos$$1, e);\r\n\r\n\t if (itemPos) {\r\n\t ctx.x_offset = itemPos.x - pos$$1.x;\r\n\t ctx.y_offset = itemPos.y - pos$$1.y;\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t $dragPos: function $dragPos(pos$$1, e) {\r\n\t var m = this._drag_masters[DragControl._active.webix_drag];\r\n\r\n\t if (m.$dragPos && m != this) {\r\n\t m.$dragPos(pos$$1, e, DragControl._html);\r\n\t return true;\r\n\t }\r\n\t },\r\n\t //called when mouse was moved in drop area\r\n\t $dragIn: function $dragIn(s, t, e) {\r\n\t var m = this._drag_masters[t.webix_drop];\r\n\t if (m.$dragIn && m != this) return m.$dragIn(s, t, e);\r\n\t t.className = t.className + \" webix_drop_zone\";\r\n\t return t;\r\n\t },\r\n\t //called when mouse was moved out drop area\r\n\t $dragOut: function $dragOut(s, t, n, e) {\r\n\t var m = this._drag_masters[t.webix_drop];\r\n\t if (m.$dragOut && m != this) return m.$dragOut(s, t, n, e);\r\n\t t.className = t.className.replace(\"webix_drop_zone\", \"\");\r\n\t return null;\r\n\t },\r\n\t //called when mouse was released over drop area\r\n\t $drop: function $drop(s, t, e) {\r\n\t var m = this._drag_masters[t.webix_drop];\r\n\t DragControl._drag_context.from = DragControl.getMaster(s);\r\n\t if (m.$drop && m != this) return m.$drop(s, t, e);\r\n\t t.appendChild(s);\r\n\t },\r\n\t //called when dnd just started\r\n\t $drag: function $drag(s, e) {\r\n\t var m = this._drag_masters[s.webix_drag];\r\n\t if (m.$drag && m != this) return m.$drag(s, e);\r\n\t return \"
\" + s.innerHTML + \"
\";\r\n\t }\r\n\t}; //global touch-drag handler\r\n\r\n\tattachEvent(\"onLongTouch\", function (ev) {\r\n\t if (DragControl._active) DragControl._createTouchDrag(ev);\r\n\t});\r\n\r\n\tvar UIManager = {\r\n\t _view: null,\r\n\t _hotkeys: {},\r\n\t _focus_time: 0,\r\n\t _tab_time: 0,\r\n\t _mouse_time: 0,\r\n\t _controls: {\r\n\t \"enter\": 13,\r\n\t \"tab\": 9,\r\n\t \"esc\": 27,\r\n\t \"escape\": 27,\r\n\t \"up\": 38,\r\n\t \"down\": 40,\r\n\t \"left\": 37,\r\n\t \"right\": 39,\r\n\t \"pgdown\": 34,\r\n\t \"pagedown\": 34,\r\n\t \"pgup\": 33,\r\n\t \"pageup\": 33,\r\n\t \"end\": 35,\r\n\t \"home\": 36,\r\n\t \"insert\": 45,\r\n\t \"delete\": 46,\r\n\t \"backspace\": 8,\r\n\t \"space\": 32,\r\n\t \"meta\": 91,\r\n\t \"win\": 91,\r\n\t \"mac\": 91,\r\n\t \"multiply\": 106,\r\n\t \"add\": 107,\r\n\t \"subtract\": 109,\r\n\t \"decimal\": 110,\r\n\t \"divide\": 111,\r\n\t \"scrollock\": 145,\r\n\t \"pausebreak\": 19,\r\n\t \"numlock\": 144,\r\n\t \"5numlocked\": 12,\r\n\t \"shift\": 16,\r\n\t \"capslock\": 20\r\n\t },\r\n\t _inputs: {\r\n\t \"input\": 1,\r\n\t \"button\": 1,\r\n\t \"textarea\": 1,\r\n\t \"select\": 1\r\n\t },\r\n\t _enable: function _enable() {\r\n\t // attaching events here\r\n\t event$1(document.body, \"click\", bind(this._focus_click, this));\r\n\t event$1(document, \"keydown\", bind(this._keypress, this));\r\n\r\n\t _event(document.body, \"mousedown\", bind(function () {\r\n\t this._mouse_time = new Date();\r\n\t }, this));\r\n\r\n\t if (document.body.addEventListener) event$1(document.body, \"focus\", this._focus_tab, {\r\n\t capture: true,\r\n\t bind: this\r\n\t });\r\n\t state.destructors.push({\r\n\t obj: this\r\n\t });\r\n\t },\r\n\t destructor: function destructor() {\r\n\t UIManager._view = null;\r\n\t },\r\n\t getFocus: function getFocus() {\r\n\t return this._view;\r\n\t },\r\n\t _focus_action: function _focus_action(view) {\r\n\t this._focus_was_there = this._focus_was_there || view._settings.id;\r\n\t },\r\n\t setFocus: function setFocus(view, only_api) {\r\n\t //view can be empty\r\n\t view = $$(view); //unfocus if view is hidden\r\n\r\n\t if (view && !view.$view) view = null; //store last click time, it is necessary to prevent refocusing\r\n\t //for example when user moves focus from onclick handler somewher\r\n\t //and we want to prevent autofocusing, when event will reach document.body\r\n\r\n\t this._focus_time = state._focus_time = new Date();\r\n\t if (this._view === view) return true;\r\n\t if (this._view && this._view.callEvent) this._view.callEvent(\"onBlur\", [this._view]);\r\n\t if (view && view.callEvent) view.callEvent(\"onFocus\", [view, this._view]);\r\n\t callEvent(\"onFocusChange\", [view, this._view]);\r\n\t if (this._view && this._view.blur && !only_api) this._view.blur();\r\n\t this._view = view;\r\n\t if (view && view.focus && !only_api) view.focus();\r\n\t return true;\r\n\t },\r\n\t applyChanges: function applyChanges(element) {\r\n\t var view = this.getFocus();\r\n\t if (view && view != element && view._applyChanges) view._applyChanges(element);\r\n\t },\r\n\t hasFocus: function hasFocus(view) {\r\n\t return view === this._view ? true : false;\r\n\t },\r\n\t _focus: function _focus(e, dont_clear) {\r\n\t var view = locate(e, \"view_id\") || this._focus_was_there; //if html was repainted we can miss the view, so checking last processed one\r\n\r\n\r\n\t view = $$(view);\r\n\t this._focus_was_there = null; //set timer, to fix issue with Android input focusin\r\n\r\n\t state._focus_time = new Date();\r\n\t if (view == this._view) return;\r\n\t if (!dont_clear) this._focus_was_there = null;\r\n\r\n\t if (view) {\r\n\t view = $$(view);\r\n\r\n\t if (this.canFocus(view)) {\r\n\t //[ACTIVECONTENT] focus operations for active content\r\n\t if (view.getNode) view.getNode(e);\r\n\t this.setFocus(view);\r\n\t }\r\n\t } else if (!dont_clear) this.setFocus(null);\r\n\r\n\t return true;\r\n\t },\r\n\t _focus_click: function _focus_click(e) {\r\n\t // if it was onfocus/onclick less then 100ms behore then we ignore it\r\n\t if (new Date() - this._focus_time < 100) {\r\n\t this._focus_was_there = null;\r\n\t return false;\r\n\t }\r\n\r\n\t return this._focus(e);\r\n\t },\r\n\t _focus_tab: function _focus_tab(e) {\r\n\t if (!this._inputs[e.target.nodeName.toLowerCase()]) return false;\r\n\t return this._focus(e, true);\r\n\t },\r\n\t canFocus: function canFocus(view) {\r\n\t return view.isVisible() && view.isEnabled();\r\n\t },\r\n\t _moveChildFocus: function _moveChildFocus(check_view) {\r\n\t var focus = this.getFocus(); //we have not focus inside of closing item\r\n\r\n\t if (check_view && !this._is_child_of(check_view, focus)) return false;\r\n\t if (!this._focus_logic(\"getPrev\", check_view)) this._view = null;\r\n\t },\r\n\t _translation_table: {},\r\n\t _is_child_of: function _is_child_of(parent, child) {\r\n\t if (!parent) return false;\r\n\t if (!child) return false;\r\n\r\n\t while (child) {\r\n\t if (child === parent) return true;\r\n\t child = child.getParentView();\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t _keypress_timed: function _keypress_timed() {\r\n\t if (this && this.callEvent) this.callEvent(\"onTimedKeyPress\", []);\r\n\t },\r\n\t _isNumPad: function _isNumPad(code) {\r\n\t return code < 112 && code > 105;\r\n\t },\r\n\t _keypress: function _keypress(e) {\r\n\t var code = e.which || e.keyCode;\r\n\t if (code > 95 && code < 106) code -= 48; //numpad support (numbers)\r\n\r\n\t code = this._translation_table[code] || code;\r\n\t var ctrl = e.ctrlKey;\r\n\t var shift = e.shiftKey;\r\n\t var alt = e.altKey;\r\n\t var meta = e.metaKey;\r\n\r\n\t var codeid = this._keycode(code, ctrl, shift, alt, meta);\r\n\r\n\t var view = this.getFocus();\r\n\r\n\t if (view && view.callEvent) {\r\n\t if (view.callEvent(\"onKeyPress\", [code, e]) === false) preventEvent(e);\r\n\r\n\t if (view.hasEvent(\"onTimedKeyPress\")) {\r\n\t clearTimeout(view._key_press_timeout);\r\n\t view._key_press_timeout = delay(this._keypress_timed, view, [], view._settings.keyPressTimeout || 250);\r\n\t }\r\n\t }\r\n\r\n\t if (!this._isNumPad(code)) codeid = this._keycode(String.fromCharCode(code), ctrl, shift, alt, meta); //flag, that some non-special key was pressed\r\n\r\n\t var is_any = !ctrl && !alt && !meta && code != 9 && code != 27 && code != 13;\r\n\r\n\t if (this._check_keycode(codeid, is_any, e) === false) {\r\n\t preventEvent(e);\r\n\t return false;\r\n\t }\r\n\t },\r\n\t // dir - getNext or getPrev\r\n\t _focus_logic: function _focus_logic(dir) {\r\n\t if (!this.getFocus()) return null;\r\n\t dir = dir || \"getNext\";\r\n\t var next = this.getFocus();\r\n\t var start = next;\r\n\t var marker = uid();\r\n\r\n\t while (true) {\r\n\t // eslint-disable-line\r\n\t next = this[dir](next); // view with focus ability\r\n\r\n\t if (next && this.canFocus(next)) return this.setFocus(next); // elements with focus ability not found\r\n\r\n\t if (next === start || next.$fmarker == marker) return null; //prevents infinity loop\r\n\r\n\t next.$fmarker = marker;\r\n\t }\r\n\t },\r\n\t _tab_logic: function _tab_logic(view, e) {\r\n\t var mode = !e.shiftKey;\r\n\t UIManager._tab_time = new Date();\r\n\t if (view && view._custom_tab_handler && !view._custom_tab_handler(mode, e)) return false;\r\n\r\n\t if (view && view._in_edit_mode) {\r\n\t if (view.editNext) return view.editNext(mode);else if (view.editStop) {\r\n\t view.editStop();\r\n\t return true;\r\n\t }\r\n\t } else delay(function () {\r\n\t UIManager.setFocus($$(document.activeElement), true);\r\n\t }, 1);\r\n\t },\r\n\t getTop: function getTop(id) {\r\n\t var next,\r\n\t view = $$(id);\r\n\r\n\t while (view && (next = view.getParentView())) {\r\n\t view = next;\r\n\t }\r\n\r\n\t return view;\r\n\t },\r\n\t getNext: function getNext(view, _inner_call) {\r\n\t var cells = view.getChildViews(); //tab to first children\r\n\r\n\t if (cells.length && !_inner_call) return cells[0]; //unique case - single view without child and parent\r\n\r\n\t var parent = view.getParentView();\r\n\t if (!parent) return view;\r\n\t var p_cells = parent.getChildViews();\r\n\r\n\t if (p_cells.length) {\r\n\t var index$$1 = PowerArray.find.call(p_cells, view) + 1;\r\n\r\n\t while (index$$1 < p_cells.length) {\r\n\t //next visible child\r\n\t if (this.canFocus(p_cells[index$$1])) return p_cells[index$$1];\r\n\t index$$1++;\r\n\t }\r\n\t } //sibling of parent\r\n\r\n\r\n\t return this.getNext(parent, true);\r\n\t },\r\n\t getPrev: function getPrev(view, _inner_call) {\r\n\t var cells = view.getChildViews(); //last child of last child\r\n\r\n\t if (cells.length && _inner_call) return this.getPrev(cells[cells.length - 1], true);\r\n\t if (_inner_call) return view; //fallback from top to bottom\r\n\r\n\t var parent = view.getParentView();\r\n\t if (!parent) return this.getPrev(view, true);\r\n\t var p_cells = parent.getChildViews();\r\n\r\n\t if (p_cells) {\r\n\t var index$$1 = PowerArray.find.call(p_cells, view) - 1;\r\n\r\n\t while (index$$1 >= 0) {\r\n\t if (this.canFocus(p_cells[index$$1])) return this.getPrev(p_cells[index$$1], true);\r\n\t index$$1--;\r\n\t }\r\n\t }\r\n\r\n\t return parent;\r\n\t },\r\n\t addHotKey: function addHotKey(keys, handler, view) {\r\n\t assert(handler, \"Hot key handler is not defined\");\r\n\r\n\t var pack = this._parse_keys(keys);\r\n\r\n\t assert(pack.letter, \"Unknown key code\");\r\n\t if (!view) view = null;\r\n\t pack.handler = handler;\r\n\t pack.view = view;\r\n\r\n\t var code = this._keycode(pack.letter, pack.ctrl, pack.shift, pack.alt, pack.meta);\r\n\r\n\t if (!this._hotkeys[code]) this._hotkeys[code] = [];\r\n\r\n\t this._hotkeys[code].push(pack);\r\n\r\n\t return keys;\r\n\t },\r\n\t removeHotKey: function removeHotKey(keys, func, view) {\r\n\t var pack = this._parse_keys(keys);\r\n\r\n\t var code = this._keycode(pack.letter, pack.ctrl, pack.shift, pack.alt, pack.meta);\r\n\r\n\t if (!func && !view) delete this._hotkeys[code];else {\r\n\t var t = this._hotkeys[code];\r\n\r\n\t if (t) {\r\n\t for (var i = t.length - 1; i >= 0; i--) {\r\n\t if (view && t[i].view !== view) continue;\r\n\t if (func && t[i].handler !== func) continue;\r\n\t t.splice(i, 1);\r\n\t }\r\n\r\n\t if (!t.length) delete this._hotkeys[code];\r\n\t }\r\n\t }\r\n\t },\r\n\t _keycode: function _keycode(code, ctrl, shift, alt, meta) {\r\n\t return code + \"_\" + [\"\", ctrl ? \"1\" : \"0\", shift ? \"1\" : \"0\", alt ? \"1\" : \"0\", meta ? \"1\" : \"0\"].join(\"\");\r\n\t },\r\n\t _check_keycode: function _check_keycode(code, is_any, e) {\r\n\t var focus = this.getFocus();\r\n\t if (this._hotkeys[code]) return this._process_calls(this._hotkeys[code], focus, e);else if (is_any && this._hotkeys[\"ANY_0000\"]) return this._process_calls(this._hotkeys[\"ANY_0000\"], focus, e);\r\n\t return true;\r\n\t },\r\n\t _process_calls: function _process_calls(calls, focus, e) {\r\n\t for (var i = 0; i < calls.length; i++) {\r\n\t var key = calls[i];\r\n\t if (key.view !== null && //common hot-key\r\n\t focus !== key.view && ( //hot-key for current view\r\n\t //hotkey for current type of view\r\n\t typeof key.view !== \"string\" || !focus || focus.name !== key.view)) continue;\r\n\t var temp_result = key.handler(focus, e);\r\n\t if (!!temp_result === temp_result) return temp_result;\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t _parse_keys: function _parse_keys(keys) {\r\n\t var controls = this._controls;\r\n\t var parts = keys.toLowerCase().split(/[+\\-_]/);\r\n\t var ctrl, shift, alt, meta;\r\n\t ctrl = shift = alt = meta = 0;\r\n\t var letter = \"\";\r\n\r\n\t for (var i = 0; i < parts.length; i++) {\r\n\t if (parts[i] === \"ctrl\") ctrl = 1;else if (parts[i] === \"shift\") shift = 1;else if (parts[i] === \"alt\") alt = 1;else if (parts[i] === \"command\") meta = 1;else {\r\n\t if (controls[parts[i]]) {\r\n\t var code = controls[parts[i]];\r\n\t if (this._isNumPad(code)) letter = code.toString();else letter = String.fromCharCode(code);\r\n\t } else {\r\n\t letter = parts[i];\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return {\r\n\t letter: letter.toUpperCase(),\r\n\t ctrl: ctrl,\r\n\t shift: shift,\r\n\t alt: alt,\r\n\t meta: meta,\r\n\t debug: keys\r\n\t };\r\n\t },\r\n\t getState: function getState(node, children) {\r\n\t children = children || false;\r\n\t node = $$(node);\r\n\t var state$$1 = {\r\n\t id: node.config.id,\r\n\t width: node.config.width,\r\n\t height: node.config.height,\r\n\t gravity: node.config.gravity\r\n\t };\r\n\t if (!isUndefined(node.config.collapsed)) state$$1.collapsed = node.config.collapsed;\r\n\t if (node.name === \"tabs\" || node.name === \"tabbar\") state$$1.activeCell = node.getValue();\r\n\r\n\t if (children) {\r\n\t state$$1 = [state$$1];\r\n\r\n\t if (node._cells) {\r\n\t for (var i = 0; i < node._cells.length; i++) {\r\n\t state$$1 = state$$1.concat(this.getState(node._cells[i], children));\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return state$$1;\r\n\t },\r\n\t setState: function setState(states) {\r\n\t if (!isArray(states)) states = [states];\r\n\r\n\t for (var i = 0; i < states.length; i++) {\r\n\t var state$$1 = states[i];\r\n\t var node = $$(state$$1.id);\r\n\t if (!node) continue;\r\n\t if (!isUndefined(state$$1.collapsed)) node.define(\"collapsed\", state$$1.collapsed);\r\n\t if (!isUndefined(state$$1.activeCell)) node.setValue(state$$1.activeCell);\r\n\t node.define(\"width\", state$$1.width);\r\n\t node.define(\"height\", state$$1.height);\r\n\t node.define(\"gravity\", state$$1.gravity);\r\n\t }\r\n\r\n\t var top = $$(states[0].id);\r\n\t if (top) top.resize();\r\n\t }\r\n\t};\r\n\tready(function () {\r\n\t UIManager._enable();\r\n\r\n\t UIManager.addHotKey(\"enter\", function (view, ev) {\r\n\t if (view && view.callEvent) view.callEvent(\"onEnter\", [ev]);\r\n\r\n\t if (view && view.editStop && view._in_edit_mode) {\r\n\t view.editStop();\r\n\t return true;\r\n\t } else if (view && view.touchable) {\r\n\t var form = view.getFormView();\r\n\t if (form && !view._skipSubmit) form.callEvent(\"onSubmit\", [view, ev]);\r\n\t }\r\n\t });\r\n\t UIManager.addHotKey(\"esc\", function (view) {\r\n\t if (view) {\r\n\t if (view.editCancel && view._in_edit_mode) {\r\n\t view.editCancel();\r\n\t return true;\r\n\t }\r\n\r\n\t var top = view.getTopParentView();\r\n\t if (top && top.setPosition) top._hide();\r\n\t }\r\n\t });\r\n\t UIManager.addHotKey(\"shift+tab\", UIManager._tab_logic);\r\n\t UIManager.addHotKey(\"tab\", UIManager._tab_logic);\r\n\t});\r\n\tdefine(\"UIManager\", UIManager);\r\n\r\n\tvar Settings = {\r\n\t $init: function $init() {\r\n\t /* \r\n\t \tproperty can be accessed as this.config.some\r\n\t \tin same time for inner call it have sense to use _settings\r\n\t \tbecause it will be minified in final version\r\n\t */\r\n\t this._settings = this.config = {};\r\n\t },\r\n\t define: function define(property, value) {\r\n\t if (_typeof(property) == \"object\") return this._parseSeetingColl(property);\r\n\t return this._define(property, value);\r\n\t },\r\n\t _define: function _define(property, value) {\r\n\t //method with name {prop}_setter will be used as property setter\r\n\t //setter is optional\r\n\t var setter = this[property + \"_setter\"];\r\n\t return this._settings[property] = setter ? setter.call(this, value, property) : value;\r\n\t },\r\n\t //process configuration object\r\n\t _parseSeetingColl: function _parseSeetingColl(coll) {\r\n\t if (coll) {\r\n\t for (var a in coll) {\r\n\t //for each setting\r\n\t this._define(a, coll[a]);\r\n\t } //set value through config\r\n\r\n\t }\r\n\t },\r\n\t //helper for object initialization\r\n\t _parseSettings: function _parseSettings(obj, initial) {\r\n\t //initial - set of default values\r\n\t var settings = {};\r\n\t if (initial) settings = exports.extend(settings, initial); //code below will copy all properties over default one\r\n\r\n\t if (_typeof(obj) == \"object\" && !obj.tagName) exports.extend(settings, obj, true); //call config for each setting\r\n\r\n\t this._parseSeetingColl(settings);\r\n\t },\r\n\t _mergeSettings: function _mergeSettings(config, defaults) {\r\n\t for (var key in defaults) {\r\n\t switch (_typeof(config[key])) {\r\n\t case \"object\":\r\n\t config[key] = this._mergeSettings(config[key] || {}, defaults[key]);\r\n\t break;\r\n\r\n\t case \"undefined\":\r\n\t config[key] = defaults[key];\r\n\t break;\r\n\r\n\t default:\r\n\t //do nothing\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t return config;\r\n\t }\r\n\t};\r\n\r\n\tvar Destruction = {\r\n\t $init: function $init() {\r\n\t //wrap in object to simplify removing self-reference\r\n\t var t = this._destructor_handler = {\r\n\t obj: this\r\n\t }; //register self in global list of destructors\r\n\r\n\t state.destructors.push(t);\r\n\t },\r\n\t //will be called automatically on unload, can be called manually\r\n\t //simplifies job of GC\r\n\t destructor: function destructor() {\r\n\t var config = this._settings;\r\n\t if (this._last_editor) this.editCancel();\r\n\t if (this.callEvent) this.callEvent(\"onDestruct\", []); //destructor can be called only once\r\n\r\n\t this.destructor = function () {}; //remove self reference from global destructions collection\r\n\r\n\r\n\t this._destructor_handler.obj = null; //destroy child and related cells\r\n\r\n\t if (this.getChildViews) {\r\n\t var cells = this.getChildViews();\r\n\t if (cells) for (var i = 0; i < cells.length; i++) {\r\n\t cells[i].destructor();\r\n\t }\r\n\t if (this._destroy_with_me) for (var _i = 0; _i < this._destroy_with_me.length; _i++) {\r\n\t this._destroy_with_me[_i].destructor();\r\n\t }\r\n\t }\r\n\r\n\t delete ui.views[config.id];\r\n\r\n\t if (config.$id) {\r\n\t var top = this.getTopParentView();\r\n\t if (top && top._destroy_child) top._destroy_child(config.$id);\r\n\t } //html collection\r\n\r\n\r\n\t this._htmlmap = null;\r\n\t this._htmlrows = null;\r\n\t this._html = null;\r\n\r\n\t if (this._contentobj) {\r\n\t this._contentobj.innerHTML = \"\";\r\n\t this._contentobj._htmlmap = null;\r\n\t } //removes view container\r\n\r\n\r\n\t if (this._viewobj && this._viewobj.parentNode) {\r\n\t this._viewobj.parentNode.removeChild(this._viewobj);\r\n\t }\r\n\r\n\t if (this.data && this.data.destructor) this.data.destructor();\r\n\t if (this.unbind) this.unbind();\r\n\t this.data = null;\r\n\t this._viewobj = this.$view = this._contentobj = this._dataobj = null;\r\n\t this._evs_events = this._evs_handlers = {}; //remove focus from destructed view\r\n\r\n\t if (UIManager._view == this) UIManager._view = null;\r\n\t var url = config.url;\r\n\t if (url && url.$proxy && url.release) url.release();\r\n\t this.$scope = null; // this flag is checked in delay method\r\n\r\n\t this.$destructed = true;\r\n\t }\r\n\t}; //global list of destructors\r\n\r\n\tevent$1(window, \"unload\", function () {\r\n\t callEvent(\"unload\", []);\r\n\t state._final_destruction = true; //call all registered destructors\r\n\r\n\t for (var i = 0; i < state.destructors.length; i++) {\r\n\t var obj = state.destructors[i].obj;\r\n\t if (obj) obj.destructor();\r\n\t }\r\n\r\n\t state.destructors = [];\r\n\t state._popups = toArray();\r\n\r\n\t _events_final_destructor();\r\n\t});\r\n\r\n\tvar CollectionBind = {\r\n\t $init: function $init() {\r\n\t this._cursor = null;\r\n\t this.attachEvent(\"onSelectChange\", function () {\r\n\t var sel = this.getSelectedId();\r\n\t this.setCursor(sel ? sel.id || sel : null);\r\n\t });\r\n\t this.attachEvent(\"onAfterCursorChange\", this._update_binds);\r\n\t this.attachEvent(\"onAfterDelete\", function (id) {\r\n\t if (id == this.getCursor()) this.setCursor(null);\r\n\t });\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(function (id, data, mode) {\r\n\t //paint - ignored\r\n\t //delete - handled by onAfterDelete above\r\n\t if (id && id == this.getCursor() && mode != \"paint\" && mode != \"delete\") this._update_binds();\r\n\t }, this));\r\n\t this.data.attachEvent(\"onClearAll\", bind(function () {\r\n\t this._cursor = null;\r\n\t }, this));\r\n\t this.data.attachEvent(\"onIdChange\", bind(function (oldid, newid) {\r\n\t if (this._cursor == oldid) {\r\n\t this._cursor = newid;\r\n\r\n\t this._update_binds();\r\n\t }\r\n\t }, this));\r\n\t },\r\n\t refreshCursor: function refreshCursor() {\r\n\t if (this._cursor) this.callEvent(\"onAfterCursorChange\", [this._cursor]);\r\n\t },\r\n\t setCursor: function setCursor(id) {\r\n\t if (id == this._cursor || id !== null && !this.getItem(id)) return;\r\n\t this.callEvent(\"onBeforeCursorChange\", [this._cursor]);\r\n\t this._cursor = id;\r\n\t this.callEvent(\"onAfterCursorChange\", [id]);\r\n\t },\r\n\t getCursor: function getCursor() {\r\n\t return this._cursor;\r\n\t },\r\n\t _bind_update: function _bind_update(target, rule, format) {\r\n\t if (rule == \"$level\" && this.data.getBranch) return (target.data || target).importData(this.data.getBranch(this.getCursor()));\r\n\t var data = this.getItem(this.getCursor()) || this._settings.defaultData || null;\r\n\r\n\t if (rule == \"$data\") {\r\n\t if (typeof format === \"function\") format.call(target, data, this);else target.data.importData(data ? data[format] : []);\r\n\t target.callEvent(\"onBindApply\", [data, rule, this]);\r\n\t } else {\r\n\t if (format) data = format(data);\r\n\r\n\t this._bind_update_common(target, rule, data);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar ValueBind = {\r\n\t $init: function $init() {\r\n\t this.attachEvent(\"onChange\", this._update_binds);\r\n\t },\r\n\t _bind_update: function _bind_update(target, rule, format) {\r\n\t rule = rule || \"value\";\r\n\t var data = this.getValue() || \"\";\r\n\t if (format) data = format(data);\r\n\t if (target.setValue) target.setValue(data);else if (!target.filter) {\r\n\t var pod = {};\r\n\t pod[rule] = data;\r\n\t if (target._check_data_feed(data)) target.setValues(pod);\r\n\t } else {\r\n\t target.data.silent(function () {\r\n\t this.filter(rule, data);\r\n\t });\r\n\t }\r\n\t target.callEvent(\"onBindApply\", [data, rule, this]);\r\n\t }\r\n\t};\r\n\r\n\tvar RecordBind = {\r\n\t $init: function $init() {\r\n\t this.attachEvent(\"onChange\", this._update_binds);\r\n\t },\r\n\t _bind_update: function _bind_update(target, rule, format) {\r\n\t var data = this.getValues() || null;\r\n\t if (format) data = format(data);\r\n\r\n\t this._bind_update_common(target, rule, data);\r\n\t }\r\n\t};\r\n\r\n\tvar BindSource = {\r\n\t $init: function $init() {\r\n\t this._bind_hash = {}; //rules per target\r\n\r\n\t this._bind_updated = {}; //update flags\r\n\r\n\t this._ignore_binds = {}; //apply specific bind extension\r\n\r\n\t this._bind_specific_rules(this);\r\n\t },\r\n\t saveBatch: function saveBatch(code) {\r\n\t this._do_not_update_binds = true;\r\n\t code.call(this);\r\n\t this._do_not_update_binds = false;\r\n\r\n\t this._update_binds();\r\n\t },\r\n\t setBindData: function setBindData(data, key) {\r\n\t //save called, updating master data\r\n\t if (key) this._ignore_binds[key] = true;\r\n\t if (this.setValue) this.setValue(data);else if (this.setValues) this.setValues(data);else {\r\n\t var id = this.getCursor();\r\n\t if (id) this.updateItem(id, data);else this.add(data);\r\n\t }\r\n\t this.callEvent(\"onBindUpdate\", [data, key]);\r\n\t if (this.save) this.save();\r\n\t if (key) this._ignore_binds[key] = false;\r\n\t },\r\n\t //fill target with data\r\n\t getBindData: function getBindData(key, update) {\r\n\t //fire only if we have data updates from the last time\r\n\t if (this._bind_updated[key]) return false;\r\n\t var target = $$(key); //fill target only when it visible\r\n\r\n\t if (target.isVisible(target._settings.id)) {\r\n\t this._bind_updated[key] = true;\r\n\r\n\t this._bind_update(target, this._bind_hash[key][0], this._bind_hash[key][1]); //trigger component specific updating logic\r\n\r\n\r\n\t if (update && target.filter) target.refresh();\r\n\t }\r\n\t },\r\n\t //add one more bind target\r\n\t addBind: function addBind(source, rule, format) {\r\n\t this._bind_hash[source] = [rule, format];\r\n\t },\r\n\t removeBind: function removeBind(source) {\r\n\t delete this._bind_hash[source];\r\n\t delete this._bind_updated[source];\r\n\t delete this._ignore_binds[source];\r\n\t },\r\n\t //returns true if object belong to \"collection\" type\r\n\t _bind_specific_rules: function _bind_specific_rules(obj) {\r\n\t if (obj.filter) exports.extend(this, CollectionBind);else if (obj.setValue) exports.extend(this, ValueBind);else exports.extend(this, RecordBind);\r\n\t },\r\n\t //inform all binded objects, that source data was updated\r\n\t _update_binds: function _update_binds() {\r\n\t if (!this._do_not_update_binds) for (var key in this._bind_hash) {\r\n\t if (this._ignore_binds[key]) continue;\r\n\t this._bind_updated[key] = false;\r\n\t this.getBindData(key, true);\r\n\t }\r\n\t },\r\n\t //copy data from source to the target\r\n\t _bind_update_common: function _bind_update_common(target, rule, data) {\r\n\t if (target.setValue) target.setValue(data && rule ? data[rule] : data);else if (!target.filter) {\r\n\t if (!data && target.clear) target.clear();else {\r\n\t if (target._check_data_feed(data)) target.setValues(clone(data));\r\n\t }\r\n\t } else {\r\n\t target.data.silent(function () {\r\n\t this.filter(rule, data);\r\n\t });\r\n\t }\r\n\t target.callEvent(\"onBindApply\", [data, rule, this]);\r\n\t }\r\n\t};\r\n\r\n\tvar BaseBind = {\r\n\t bind: function bind$$1(target, rule, format) {\r\n\t if (!this.attachEvent) exports.extend(this, EventSystem);\r\n\t if (typeof target == \"string\") target = $$(target);\r\n\t if (target._initBindSource) target._initBindSource();\r\n\t if (this._initBindSource) this._initBindSource();\r\n\t if (!target.getBindData) exports.extend(target, BindSource);\r\n\r\n\t this._bind_ready();\r\n\r\n\t target.addBind(this._settings.id, rule, format);\r\n\t this._bind_source = target._settings.id;\r\n\t var target_id = this._settings.id; //FIXME - check for touchable is not the best solution, to detect necessary event\r\n\r\n\t this._bind_refresh_handler = this.attachEvent(this.touchable ? \"onAfterRender\" : \"onBindRequest\", function () {\r\n\t return target.getBindData(target_id);\r\n\t });\r\n\t if (this.refresh && this.isVisible(this._settings.id)) this.refresh();\r\n\t },\r\n\t unbind: function unbind() {\r\n\t if (this._bind_source) {\r\n\t var target = $$(this._bind_source);\r\n\t if (target) target.removeBind(this._settings.id);\r\n\t this.detachEvent(this._bind_refresh_handler);\r\n\t this._bind_source = null;\r\n\t }\r\n\t },\r\n\t _bind_ready: function _bind_ready() {\r\n\t var config = this._settings;\r\n\r\n\t if (this.filter) {\r\n\t var key = config.id;\r\n\t this.data._on_sync = bind(function () {\r\n\t $$(this._bind_source)._bind_updated[key] = false;\r\n\t }, this);\r\n\t }\r\n\r\n\t var old_render = this.render;\r\n\r\n\t this.render = function () {\r\n\t if (this._in_bind_processing) return;\r\n\t this._in_bind_processing = true;\r\n\t var result = this.callEvent(\"onBindRequest\");\r\n\t this._in_bind_processing = false;\r\n\t return old_render.apply(this, result === false ? arguments : []);\r\n\t };\r\n\r\n\t if (this.getValue || this.getValues) this.save = function (data) {\r\n\t var source = $$(this._bind_source);\r\n\t if (data) source.setBindData(data);else {\r\n\t if (this.validate && !this.validate()) return false;\r\n\t var values = this.getValue ? this.getValue : this.getValues();\r\n\t source.setBindData(values, this._settings.id); //reset form, so it will be counted as saved\r\n\r\n\t if (this.setDirty) this.setDirty(false);\r\n\t }\r\n\t };\r\n\r\n\t this._bind_ready = function () {};\r\n\t }\r\n\t};\r\n\r\n\tvar UIExtension = window.webix_view || {};\r\n\tvar api = {\r\n\t name: \"baseview\",\r\n\t //attribute , which will be used for ID storing\r\n\t $init: function $init(config) {\r\n\t if (!config.id) config.id = _uid(this.name);\r\n\t this._parent_cell = state._parent_cell;\r\n\t state._parent_cell = null;\r\n\t this.$scope = config.$scope || (this._parent_cell ? this._parent_cell.$scope : null);\r\n\r\n\t if (!this._viewobj) {\r\n\t this._contentobj = this._viewobj = create(\"DIV\", {\r\n\t \"class\": \"webix_view\"\r\n\t });\r\n\t this.$view = this._viewobj;\r\n\t }\r\n\t },\r\n\t $skin: false,\r\n\t defaults: {\r\n\t width: 0,\r\n\t height: 0,\r\n\t gravity: 1\r\n\t },\r\n\t getNode: function getNode() {\r\n\t return this._viewobj;\r\n\t },\r\n\t getParentView: function getParentView() {\r\n\t return this._parent_cell || null;\r\n\t },\r\n\t getTopParentView: function getTopParentView() {\r\n\t var parent = this.getParentView();\r\n\t return parent ? parent.getTopParentView() : this;\r\n\t },\r\n\t getFormView: function getFormView() {\r\n\t var parent = this.getParentView();\r\n\t return !parent || parent.setValues ? parent : parent.getFormView();\r\n\t },\r\n\t getChildViews: function getChildViews() {\r\n\t return [];\r\n\t },\r\n\t queryView: function queryView(search, all) {\r\n\t var confirm;\r\n\r\n\t if (_typeof(search) === \"object\") {\r\n\t var keys = Object.keys(search);\r\n\t var values = [];\r\n\r\n\t for (var i = 0; i < keys.length; i++) {\r\n\t values[i] = search[keys[i]];\r\n\t }\r\n\r\n\t confirm = function confirm(test) {\r\n\t var config = test.config;\r\n\r\n\t for (var j = 0; j < keys.length; j++) {\r\n\t if (config[keys[j]] != values[j]) return false;\r\n\t }\r\n\r\n\t return true;\r\n\t };\r\n\t } else confirm = search;\r\n\r\n\t if (all === \"self\" && confirm(this)) return this;\r\n\t var results = all === \"all\" ? [] : false;\r\n\t var direction = all === \"parent\" ? this._queryGoUp : this._queryGoDown;\r\n\r\n\t var found = this._queryView(confirm, direction, results);\r\n\r\n\t return all === \"all\" ? results : found;\r\n\t },\r\n\t _queryGoDown: function _queryGoDown(node) {\r\n\t return node.getChildViews();\r\n\t },\r\n\t _queryGoUp: function _queryGoUp(node) {\r\n\t var parent = node.getParentView();\r\n\t return parent ? [parent] : [];\r\n\t },\r\n\t _queryView: function _queryView(confirm, next, all) {\r\n\t var kids = next(this);\r\n\r\n\t for (var i = 0; i < kids.length; i++) {\r\n\t if (confirm(kids[i])) {\r\n\t if (all) all.push(kids[i]);else return kids[i];\r\n\t } else {\r\n\t var sub = kids[i]._queryView(confirm, next, all);\r\n\r\n\t if (sub) return sub;\r\n\t }\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t isVisible: function isVisible(base_id) {\r\n\t if (this._settings.hidden) {\r\n\t if (base_id) {\r\n\t if (!this._hidden_render) {\r\n\t this._hidden_render = [];\r\n\t this._hidden_hash = {};\r\n\t }\r\n\r\n\t if (!this._hidden_hash[base_id]) {\r\n\t this._hidden_hash[base_id] = true;\r\n\r\n\t this._hidden_render.push(base_id);\r\n\t }\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\r\n\t var parent = this.getParentView();\r\n\t if (parent) return parent.isVisible(base_id, this._settings.id);\r\n\t return true;\r\n\t },\r\n\t isEnabled: function isEnabled() {\r\n\t if (this._disable_cover) return false;\r\n\t var parent = this.getParentView();\r\n\t if (parent) return parent.isEnabled();\r\n\t return true;\r\n\t },\r\n\t disable: function disable() {\r\n\t remove(this._disable_cover);\r\n\t this._settings.disabled = true;\r\n\t this._disable_cover = create(\"div\", {\r\n\t \"class\": \"webix_disabled\"\r\n\t });\r\n\r\n\t this._viewobj.appendChild(this._disable_cover);\r\n\r\n\t this._viewobj.setAttribute(\"aria-disabled\", \"true\");\r\n\r\n\t addCss(this._viewobj, \"webix_disabled_view\", true);\r\n\r\n\t UIManager._moveChildFocus(this);\r\n\t },\r\n\t enable: function enable() {\r\n\t this._settings.disabled = false;\r\n\r\n\t if (this._disable_cover) {\r\n\t remove(this._disable_cover);\r\n\t removeCss(this._viewobj, \"webix_disabled_view\");\r\n\r\n\t this._viewobj.removeAttribute(\"aria-disabled\");\r\n\r\n\t this._disable_cover = null;\r\n\t }\r\n\t },\r\n\t disabled_setter: function disabled_setter(value) {\r\n\t if (value) this.disable();else this.enable();\r\n\t return value;\r\n\t },\r\n\t container_setter: function container_setter(value) {\r\n\t assert(toNode(value), \"Invalid container\");\r\n\t return true;\r\n\t },\r\n\t css_setter: function css_setter(value) {\r\n\t if (_typeof(value) == \"object\") value = createCss(value);\r\n\t this._viewobj.className += \" \" + value;\r\n\t return value;\r\n\t },\r\n\t id_setter: function id_setter(value) {\r\n\t if (state._global_collection && (state._global_collection != this || this._prev_global_col)) {\r\n\t var oldvalue = this.config.$id = value;\r\n\t (this._prev_global_col || state._global_collection)._elements[value] = this;\r\n\t value = _uid(this.name);\r\n\t (this._prev_global_col || state._global_collection)._translate_ids[value] = oldvalue;\r\n\t }\r\n\r\n\t assert(!ui.views[value], \"Non unique view id: \" + value);\r\n\t ui.views[value] = this;\r\n\r\n\t this._viewobj.setAttribute(\"view_id\", value);\r\n\r\n\t return value;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t var last = this._last_size;\r\n\r\n\t if (last && last[0] == x && last[1] == y) {\r\n\t debug_size_box(this, [x, y, \"not changed\"]);\r\n\t return false;\r\n\t }\r\n\r\n\t debug_size_box(this, [x, y]);\r\n\t this._last_size = [x, y];\r\n\t this.$width = this._content_width = x - (this._scroll_y ? env.scrollSize : 0);\r\n\t this.$height = this._content_height = y - (this._scroll_x ? env.scrollSize : 0);\r\n\t var config = this._settings;\r\n\r\n\t if (!config.flex) {\r\n\t this._viewobj.style.width = x + \"px\";\r\n\t this._viewobj.style.height = y + \"px\";\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var s = this._settings;\r\n\t var size = [(s.width || s.minWidth || 0) * 1, (s.width || s.maxWidth || 100000) * 1, (s.height || s.minHeight || 0) * 1, (s.height || s.maxHeight || 100000) * 1, s.gravity];\r\n\r\n\t if (assert) {\r\n\t var check = isNaN(size[0]) || isNaN(size[1]) || isNaN(size[2]) || isNaN(size[3]);\r\n\r\n\t if (check) {\r\n\t assert(false, \"Size is not a number \" + this._settings.id);\r\n\t s.width = s.height = s.maxWidth = s.maxHeight = s.minWidth = s.minHeight = 0;\r\n\t size = [0, 0, 100000, 100000, 1];\r\n\t }\r\n\t }\r\n\r\n\t size[0] += dx;\r\n\t size[1] += dx;\r\n\t size[2] += dy;\r\n\t size[3] += dy;\r\n\t return size;\r\n\t },\r\n\t show: function show(force, animate_settings) {\r\n\t var parent = this.getParentView();\r\n\t var show = !arguments[2];\r\n\r\n\t if (parent) {\r\n\t if (!animate_settings && animate_settings !== false && this._settings.animate) if (parent._settings.animate) animate_settings = exports.extend(parent._settings.animate ? exports.extend({}, parent._settings.animate) : {}, this._settings.animate, true);\r\n\t if (show ? parent._show : parent._hide) (show ? parent._show : parent._hide).call(parent, this, animate_settings);\r\n\t if (show) this._render_hidden_views(); //force show of parent view\r\n\t //stop further processing is view is a part of isolated scope\r\n\r\n\t if (force && show) parent.show(parent.$$ ? false : force);\r\n\t } else {\r\n\t if (this._settings.hidden) {\r\n\t if (show) {\r\n\t var node = toNode(this._settings._container || document.body);\r\n\t node.appendChild(this._viewobj);\r\n\t this._settings.hidden = false;\r\n\t this.adjust();\r\n\r\n\t this._render_hidden_views();\r\n\t }\r\n\t } else {\r\n\t if (!show) {\r\n\t this._settings.hidden = this._settings._hidden = true;\r\n\r\n\t if (this._viewobj) {\r\n\t this._settings._container = this._viewobj.parentNode;\r\n\t remove(this._viewobj);\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _render_hidden_views: function _render_hidden_views() {\r\n\t if (this._hidden_render) {\r\n\t for (var i = 0; i < this._hidden_render.length; i++) {\r\n\t var ui_to_render = $$(this._hidden_render[i]);\r\n\t if (ui_to_render) ui_to_render.render();\r\n\t }\r\n\r\n\t this._hidden_render = [];\r\n\t this._hidden_hash = {};\r\n\t }\r\n\t },\r\n\t _onKeyPress: function _onKeyPress(code, e) {\r\n\t var target = e.srcElement || e.target,\r\n\t role = target.getAttribute(\"role\");\r\n\r\n\t if ((code === 13 || code === 32) && (role == \"button\" || role == \"tab\") && !this._settings.disabled) {\r\n\t triggerEvent(target, \"MouseEvents\", \"click\");\r\n\t preventEvent(e);\r\n\t }\r\n\t },\r\n\t hidden_setter: function hidden_setter(value) {\r\n\t if (value) this.hide();\r\n\t return this._settings.hidden;\r\n\t },\r\n\t hide: function hide() {\r\n\t this.show(null, null, true);\r\n\r\n\t UIManager._moveChildFocus(this);\r\n\t },\r\n\t adjust: function adjust() {\r\n\t if (!this._viewobj.parentNode) return false;\r\n\t var x = this._viewobj.parentNode.clientWidth || 0;\r\n\t var y = this._viewobj.parentNode.clientHeight || 0;\r\n\t var sizes = this.$getSize(0, 0);\r\n\t var fullscreen = this._viewobj.parentNode == document.body && !this.setPosition; //minWidth\r\n\r\n\t if (sizes[0] > x) x = sizes[0]; //minHeight\r\n\r\n\t if (sizes[2] > y) y = sizes[2]; //maxWidth rule\r\n\r\n\t if ((!fullscreen || this._settings.width) && x > sizes[1]) x = sizes[1]; //maxHeight rule\r\n\r\n\t if ((!fullscreen || this._settings.height) && y > sizes[3]) y = sizes[3];\r\n\t this.$setSize(x, y);\r\n\r\n\t if (state._responsive_exception) {\r\n\t state._responsive_exception = false;\r\n\t this.adjust();\r\n\t }\r\n\t },\r\n\t resize: function resize$$1() {\r\n\t if (state._child_sizing_active || state._freeze_resize || state._responsive_tinkery) return;\r\n\t var parent = this.getParentView();\r\n\r\n\t if (parent) {\r\n\t if (parent.resizeChildren) parent.resizeChildren();else parent.resize();\r\n\t } else {\r\n\t this.adjust();\r\n\t callEvent(\"onResize\", []);\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view = exports.protoUI(api, Settings, Destruction, BaseBind, UIExtension);\r\n\tvar baseview = {\r\n\t api: api,\r\n\t view: view\r\n\t};\r\n\r\n\tvar api$1 = {\r\n\t name: \"view\",\r\n\t $init: function $init(config) {\r\n\t this._set_inner(config);\r\n\t },\r\n\t //deside, will component use borders or not\r\n\t _set_inner: function _set_inner(config) {\r\n\t var border_not_set = isUndefined(config.borderless);\r\n\r\n\t if (border_not_set && !this.setPosition && config.$topView) {\r\n\t config.borderless = true;\r\n\t border_not_set = false;\r\n\t }\r\n\r\n\t if (border_not_set && this.defaults.borderless || config.borderless) {\r\n\t //button and custom borderless\r\n\t config._inner = {\r\n\t top: true,\r\n\t left: true,\r\n\t bottom: true,\r\n\t right: true\r\n\t };\r\n\t } else {\r\n\t //default borders\r\n\t if (!config._inner) config._inner = {};\r\n\t this._contentobj.style.borderWidth = \"1px\";\r\n\t }\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var _borders = this._settings._inner;\r\n\r\n\t if (_borders) {\r\n\t dx += (_borders.left ? 0 : 1) + (_borders.right ? 0 : 1);\r\n\t dy += (_borders.top ? 0 : 1) + (_borders.bottom ? 0 : 1);\r\n\t }\r\n\r\n\t var size = baseview.api.$getSize.call(this, dx, dy);\r\n\t debug_size_box(this, size, true);\r\n\t return size;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t debug_size_box(this, [x, y]);\r\n\t var _borders = this._settings._inner;\r\n\r\n\t if (_borders) {\r\n\t x -= (_borders.left ? 0 : 1) + (_borders.right ? 0 : 1);\r\n\t y -= (_borders.top ? 0 : 1) + (_borders.bottom ? 0 : 1);\r\n\t }\r\n\r\n\t return baseview.api.$setSize.call(this, x, y);\r\n\t }\r\n\t};\r\n\tvar view$1 = exports.protoUI(api$1, baseview.view);\r\n\tvar base = {\r\n\t api: api$1,\r\n\t view: view$1\r\n\t}; //not necessary anymore\r\n\t//preserving for backward compatibility\r\n\r\n\tview$1.call(-1);\r\n\r\n\t/*\r\n\t\tREnders single item. \r\n\t\tCan be used for elements without datastore, or with complex custom rendering logic\r\n\t\t\r\n\t\t@export\r\n\t\t\trender\r\n\t*/\r\n\r\n\tvar SingleRender = exports.proto({\r\n\t template_setter: function template_setter(value) {\r\n\t this.type.template = template(value);\r\n\t },\r\n\t //convert item to the HTML text\r\n\t _toHTML: function _toHTML(obj) {\r\n\t var type$$1 = this.type;\r\n\t return (type$$1.templateStart ? type$$1.templateStart(obj, type$$1) : \"\") + type$$1.template(obj, type$$1) + (type$$1.templateEnd ? type$$1.templateEnd(obj, type$$1) : \"\");\r\n\t },\r\n\t customize: function customize(obj) {\r\n\t type(this, obj);\r\n\t }\r\n\t}, AtomRender);\r\n\r\n\t/*\r\n\t\tUI: Tooltip\r\n\t\t\r\n\t\t@export\r\n\t\t\tshow\r\n\t\t\thide\r\n\t*/\r\n\t// #include core/template.js\r\n\t// #include core/single_render.js\r\n\r\n\tvar api$2 = {\r\n\t name: \"tooltip\",\r\n\t defaults: {\r\n\t dy: 0,\r\n\t dx: 20\r\n\t },\r\n\t $init: function $init(container) {\r\n\t if (typeof container == \"string\") {\r\n\t container = {\r\n\t template: container\r\n\t };\r\n\t }\r\n\r\n\t this.type = exports.extend({}, this.type); //create container for future tooltip\r\n\r\n\t this.$view = this._viewobj = this._contentobj = this._dataobj = create(\"DIV\", {\r\n\t role: \"alert\",\r\n\t \"aria-atomic\": \"true\"\r\n\t });\r\n\t this._contentobj.className = \"webix_tooltip\";\r\n\t insertBefore(this._contentobj, document.body.firstChild, document.body);\r\n\t this._hideHandler = attachEvent(\"onClick\", bind(function (e) {\r\n\t if (this._visible && $$(e) != this) this.hide();\r\n\t }, this)); //detach global event handler on destruction\r\n\r\n\t this.attachEvent(\"onDestruct\", function () {\r\n\t detachEvent(this._hideHandler);\r\n\t });\r\n\t },\r\n\t adjust: function adjust() {},\r\n\t //show tooptip\r\n\t //pos - object, pos.x - left, pox.y - top\r\n\t isVisible: function isVisible() {\r\n\t return true;\r\n\t },\r\n\t show: function show(data, pos$$1) {\r\n\t if (this._disabled) return; //render sefl only if new data was provided\r\n\r\n\t if (this.data != data) {\r\n\t this.data = exports.extend({}, data);\r\n\t this.render(data);\r\n\t }\r\n\r\n\t if (this._dataobj.firstChild) {\r\n\t //show at specified position\r\n\t var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\r\n\t var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\r\n\t var positionX = w - pos$$1.x;\r\n\t var positionY = h - pos$$1.y;\r\n\t this._contentobj.style.display = \"block\";\r\n\t if (positionX - this._settings.dx > this._contentobj.offsetWidth) positionX = pos$$1.x;else {\r\n\t positionX = pos$$1.x - this._settings.dx * 2 - this._contentobj.offsetWidth;\r\n\t if (positionX <= 0) positionX = 0;\r\n\t }\r\n\t if (positionY - this._settings.dy > this._contentobj.offsetHeight) positionY = pos$$1.y;else positionY = pos$$1.y - this._settings.dy - this._contentobj.offsetHeight;\r\n\t this._contentobj.style.left = positionX + this._settings.dx + \"px\";\r\n\t this._contentobj.style.top = positionY + this._settings.dy + \"px\";\r\n\t }\r\n\r\n\t this._visible = true;\r\n\t },\r\n\t //hide tooltip\r\n\t hide: function hide() {\r\n\t this.data = null; //nulify, to be sure that on next show it will be fresh-rendered\r\n\r\n\t this._contentobj.style.display = \"none\";\r\n\t this._visible = false;\r\n\t },\r\n\t disable: function disable() {\r\n\t this._disabled = true;\r\n\t },\r\n\t enable: function enable() {\r\n\t this._disabled = false;\r\n\t },\r\n\t type: {\r\n\t template: template(\"{obj.id}\"),\r\n\t templateStart: template.empty,\r\n\t templateEnd: template.empty\r\n\t }\r\n\t};\r\n\tvar view$2 = exports.protoUI(api$2, SingleRender, Settings, EventSystem, base.view);\r\n\r\n\t/*\r\n\t\tBehavior: AutoTooltip - links tooltip to data driven item\r\n\t*/\r\n\r\n\tvar AutoTooltip = {\r\n\t tooltip_setter: function tooltip_setter(value) {\r\n\t if (value) {\r\n\t if (typeof value == \"function\") value = {\r\n\t template: value\r\n\t };\r\n\t if (_typeof(value) !== \"object\") value = {};\r\n\t var col_mode = !value.template;\r\n\t var t = new ui.tooltip(value);\r\n\r\n\t this._enable_mouse_move();\r\n\r\n\t var showEvent = this.attachEvent(\"onMouseMove\", function (id, e) {\r\n\t //show tooltip on mousemove\r\n\t this._mouseEventX = e.clientX;\r\n\t this._mouseEventY = e.clientY;\r\n\r\n\t if (this.getColumnConfig) {\r\n\t var config = t.type.column = this.getColumnConfig(id.column);\r\n\r\n\t if (col_mode) {\r\n\t //empty tooltip - ignoring\r\n\t if (!config.tooltip && config.tooltip != undefined) return;\r\n\t var trg = e.target || e.srcElements;\r\n\r\n\t if (trg.getAttribute(\"webix_area\") && config.tooltip) {\r\n\t var area = trg.getAttribute(\"webix_area\");\r\n\r\n\t t.type.template = function (obj, common) {\r\n\t var values = obj[common.column.id];\r\n\t return template(config.tooltip).call(this, obj, common, values[area], area);\r\n\t };\r\n\t } else {\r\n\t if (config.tooltip) t.type.template = config.tooltip = template(config.tooltip);else {\r\n\t var text = this.getText(id.row, id.column);\r\n\r\n\t t.type.template = function () {\r\n\t return text;\r\n\t };\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (!DragControl.active) t.show(this.getItem(id.row || id), pos(e));\r\n\t }); // [[IMPROVE]] As we can can have only one instance of tooltip per page \r\n\t //\t\t\t\tthis handler can be attached once per page, not once per component\r\n\r\n\t var hideEvent = event$1(document.body, \"mousemove\", bind(function (e) {\r\n\t e = e || event$1;\r\n\t if (this._mouseEventX != e.clientX || this._mouseEventY != e.clientY) t.hide();\r\n\t }, this));\r\n\t this.attachEvent(\"onDestruct\", function () {\r\n\t if (this.config.tooltip) this.config.tooltip.destructor();\r\n\t });\r\n\t this.attachEvent(\"onAfterScroll\", function () {\r\n\t t.hide();\r\n\t });\r\n\t t.attachEvent(\"onDestruct\", bind(function () {\r\n\t this.detachEvent(showEvent);\r\n\t eventRemove(hideEvent);\r\n\t }, this));\r\n\t return t;\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Canvas = exports.proto({\r\n\t $init: function $init(container) {\r\n\t this._canvas_labels = [];\r\n\t this._canvas_series = !isUndefined(container.series) ? container.series : container.name;\r\n\t this._obj = toNode(container.container || container);\r\n\t var width = container.width * (window.devicePixelRatio || 1);\r\n\t var height = container.height * (window.devicePixelRatio || 1);\r\n\t var style = container.style || \"\";\r\n\t style += \";width:\" + container.width + \"px;height:\" + container.height + \"px;\";\r\n\r\n\t this._prepareCanvas(container.name, style, width, height, container.title);\r\n\t },\r\n\t _prepareCanvas: function _prepareCanvas(name, style, x, y, title) {\r\n\t //canvas has the same size as master object\r\n\t this._canvas = create(\"canvas\", {\r\n\t title: title,\r\n\t width: x,\r\n\t height: y,\r\n\t canvas_id: name,\r\n\t style: style || \"\"\r\n\t });\r\n\r\n\t this._obj.appendChild(this._canvas); //use excanvas in IE\r\n\r\n\r\n\t if (!this._canvas.getContext) {\r\n\t if (env.isIE) {\r\n\t require(\"legacy/excanvas/excanvas.js\", true); //sync loading\r\n\r\n\t /* global G_vmlCanvasManager */\r\n\r\n\r\n\t G_vmlCanvasManager.init_(document);\r\n\t G_vmlCanvasManager.initElement(this._canvas);\r\n\t } else //some other not supported browser\r\n\t assert(this._canvas.getContext, \"Canvas is not supported in the browser\");\r\n\t }\r\n\r\n\t return this._canvas;\r\n\t },\r\n\t getCanvas: function getCanvas(context) {\r\n\t var ctx = (this._canvas || this._prepareCanvas(this._contentobj)).getContext(context || \"2d\");\r\n\r\n\t if (!this._webixDevicePixelRatio) {\r\n\t this._webixDevicePixelRatio = true;\r\n\t ctx.scale(window.devicePixelRatio || 1, window.devicePixelRatio || 1);\r\n\t }\r\n\r\n\t return ctx;\r\n\t },\r\n\t _resizeCanvas: function _resizeCanvas(x, y) {\r\n\t if (this._canvas) {\r\n\t this._canvas.setAttribute(\"width\", x * (window.devicePixelRatio || 1));\r\n\r\n\t this._canvas.setAttribute(\"height\", y * (window.devicePixelRatio || 1));\r\n\r\n\t this._canvas.style.width = x + \"px\";\r\n\t this._canvas.style.height = y + \"px\";\r\n\t this._webixDevicePixelRatio = false;\r\n\t }\r\n\t },\r\n\t renderText: function renderText(x, y, text, css, w) {\r\n\t if (!text) return; //ignore empty text\r\n\r\n\t if (w) w = Math.max(w, 0);\r\n\t if (y) y = Math.max(y, 0);\r\n\t var t = create(\"DIV\", {\r\n\t \"class\": \"webix_canvas_text\" + (css ? \" \" + css : \"\"),\r\n\t \"style\": \"left:\" + x + \"px; top:\" + y + \"px;\",\r\n\t \"aria-hidden\": \"true\"\r\n\t }, text);\r\n\r\n\t this._obj.appendChild(t);\r\n\r\n\t this._canvas_labels.push(t); //destructor?\r\n\r\n\r\n\t if (w) t.style.width = w + \"px\";\r\n\t return t;\r\n\t },\r\n\t renderTextAt: function renderTextAt(valign, align, x, y, t, c, w) {\r\n\t var text = this.renderText.call(this, x, y, t, c, w);\r\n\r\n\t if (text) {\r\n\t if (valign) {\r\n\t if (valign == \"middle\") text.style.top = parseInt(y - text.offsetHeight / 2, 10) + \"px\";else text.style.top = y - text.offsetHeight + \"px\";\r\n\t }\r\n\r\n\t if (align) {\r\n\t if (align == \"left\") text.style.left = x - text.offsetWidth + \"px\";else text.style.left = parseInt(x - text.offsetWidth / 2, 10) + \"px\";\r\n\t }\r\n\t }\r\n\r\n\t return text;\r\n\t },\r\n\t clearCanvas: function clearCanvas(skipMap) {\r\n\t var areas = [];\r\n\t remove(this._canvas_labels);\r\n\t this._canvas_labels = [];\r\n\r\n\t if (!skipMap && this._obj._htmlmap) {\r\n\t //areas that correspond this canvas layer\r\n\t areas = this._getMapAreas(); //removes areas of this canvas\r\n\r\n\t while (areas.length) {\r\n\t areas[0].parentNode.removeChild(areas[0]);\r\n\t areas.splice(0, 1);\r\n\t }\r\n\r\n\t areas = null; //removes _htmlmap object if all its child nodes are removed\r\n\r\n\t if (!this._obj._htmlmap.getElementsByTagName(\"AREA\").length) {\r\n\t this._obj._htmlmap.parentNode.removeChild(this._obj._htmlmap);\r\n\r\n\t this._obj._htmlmap = null;\r\n\t }\r\n\t } //FF breaks, when we are using clear canvas and call clearRect without parameters\r\n\t //width|height are used insead of offsetWidth|offsetHeight for hidden canvas (series)\r\n\r\n\r\n\t this.getCanvas().clearRect(0, 0, this._canvas.offsetWidth || Math.floor(this._canvas.width / (window.devicePixelRatio || 1)), this._canvas.offsetHeight || Math.floor(this._canvas.height / (window.devicePixelRatio || 1)));\r\n\t },\r\n\t toggleCanvas: function toggleCanvas() {\r\n\t this._toggleCanvas(this._canvas.style.display == \"none\");\r\n\t },\r\n\t showCanvas: function showCanvas() {\r\n\t this._toggleCanvas(true);\r\n\t },\r\n\t hideCanvas: function hideCanvas() {\r\n\t this._toggleCanvas(false);\r\n\t },\r\n\t _toggleCanvas: function _toggleCanvas(show) {\r\n\t var areas, i;\r\n\r\n\t for (i = 0; i < this._canvas_labels.length; i++) {\r\n\t this._canvas_labels[i].style.display = show ? \"\" : \"none\";\r\n\t }\r\n\r\n\t if (this._obj._htmlmap) {\r\n\t areas = this._getMapAreas();\r\n\r\n\t for (i = 0; i < areas.length; i++) {\r\n\t if (show) areas[i].removeAttribute(\"disabled\");else areas[i].setAttribute(\"disabled\", \"true\");\r\n\t }\r\n\t } //FF breaks, when we are using clear canvas and call clearRect without parameters\r\n\r\n\r\n\t this._canvas.style.display = show ? \"\" : \"none\";\r\n\t },\r\n\t _getMapAreas: function _getMapAreas() {\r\n\t var res = [],\r\n\t areas,\r\n\t i;\r\n\t areas = this._obj._htmlmap.getElementsByTagName(\"AREA\");\r\n\r\n\t for (i = 0; i < areas.length; i++) {\r\n\t if (areas[i].getAttribute(\"userdata\") == this._canvas_series) {\r\n\t res.push(areas[i]);\r\n\t }\r\n\t }\r\n\r\n\t return res;\r\n\t }\r\n\t});\r\n\r\n\tvar animate = function animate(html_element, config) {\r\n\t var animation = config;\r\n\r\n\t if (isArray(html_element)) {\r\n\t for (var i = 0; i < html_element.length; i++) {\r\n\t if (isArray(config)) animation = config[i];\r\n\r\n\t if (animation.type == \"slide\") {\r\n\t if (animation.subtype == \"out\" && i === 0) {\r\n\t // next\r\n\t continue;\r\n\t }\r\n\r\n\t if (animation.subtype == \"in\" && i == 1) {\r\n\t // current\r\n\t continue;\r\n\t }\r\n\t }\r\n\r\n\t if (animation.type == \"flip\") {\r\n\t var animation_copy = clone(animation);\r\n\r\n\t if (i === 0) {\r\n\t // next\r\n\t animation_copy.type = \"flipback\";\r\n\t }\r\n\r\n\t if (i == 1) {\r\n\t // current\r\n\t animation_copy.callback = null;\r\n\t }\r\n\r\n\t animate(html_element[i], animation_copy);\r\n\t continue;\r\n\t }\r\n\r\n\t animate(html_element[i], animation);\r\n\t }\r\n\r\n\t return;\r\n\t }\r\n\r\n\t var node = toNode(html_element);\r\n\t if (node._has_animation) animate.end(node, animation);else animate.start(node, animation);\r\n\t};\r\n\r\n\tanimate.end = function (node, animation) {\r\n\t //stop animation\r\n\t node.style[env.transitionDuration] = \"1ms\";\r\n\t node._has_animation = null; //clear animation wait order, if any\r\n\r\n\t if (state._wait_animate) window.clearTimeout(state._wait_animate); //plan next animation, if any\r\n\r\n\t state._wait_animate = delay(animate, this, [node, animation], 10);\r\n\t};\r\n\r\n\tanimate.isSupported = function () {\r\n\t return !state.noanimate && env.transform && env.transition && !env.isOpera;\r\n\t};\r\n\r\n\tanimate.formLine = function (next, current, animation) {\r\n\t var direction = animation.direction; //sometimes user can initiate animation multiple times ( fast clicking )\r\n\t //as result animation may be called against already removed from the dom node\r\n\r\n\t if (current.parentNode) current.parentNode.style.position = \"relative\";\r\n\t current.style.position = \"absolute\";\r\n\t next.style.position = \"absolute\"; //this is initial shift of second view in animation\r\n\t //normally we need to have this value as 0\r\n\t //but FF has bug with animation initially invisible elements\r\n\t //so we are adjusting this value, to make 1px of second view visible\r\n\r\n\t var defAniPos = env.isFF ? direction == \"top\" || direction == \"left\" ? -1 : 1 : 0;\r\n\r\n\t if (direction == \"top\" || direction == \"bottom\") {\r\n\t next.style.left = \"0px\";\r\n\t next.style.top = (animation.top || defAniPos) + (direction == \"top\" ? 1 : -1) * current.offsetHeight + \"px\";\r\n\t } else {\r\n\t next.style.top = (animation.top || 0) + \"px\";\r\n\t next.style.left = defAniPos + (direction == \"left\" ? 1 : -1) * current.offsetWidth + \"px\";\r\n\t } // apply 'keepViews' mode, iframe, datatable with x scroll solution\r\n\t //( keepViews won't work in case of \"in\" and \"out\" subtypes )\r\n\r\n\r\n\t if (current.parentNode == next.parentNode && animation.keepViews) next.style.display = \"\";else insertBefore(next, current.nextSibling, current.parentNode);\r\n\r\n\t if (animation.type == \"slide\" && animation.subtype == \"out\") {\r\n\t next.style.left = \"0px\";\r\n\t next.style.top = (animation.top || 0) + \"px\";\r\n\t current.parentNode.removeChild(current);\r\n\t insertBefore(current, next.nextSibling, next.parentNode);\r\n\t }\r\n\r\n\t return [next, current];\r\n\t};\r\n\r\n\tanimate.breakLine = function (line) {\r\n\t if (arguments[1]) line[1].style.display = \"none\"; // 'keepViews' multiview mode\r\n\t else remove(line[1]); // 1 = current\r\n\r\n\t animate.clear(line[0]);\r\n\t animate.clear(line[1]);\r\n\t line[0].style.position = \"\";\r\n\t};\r\n\r\n\tanimate.clear = function (node) {\r\n\t node.style[env.transform] = \"none\";\r\n\t node.style[env.transition] = \"none\";\r\n\t node.style.top = node.style.left = \"\";\r\n\t};\r\n\r\n\tanimate.defaults = {\r\n\t type: \"slide\",\r\n\t delay: \"0\",\r\n\t duration: \"500\",\r\n\t timing: \"ease-in-out\",\r\n\t x: 0,\r\n\t y: 0\r\n\t};\r\n\r\n\tanimate.start = function (node, animation) {\r\n\t //getting config object by merging specified and default options\r\n\t if (typeof animation == \"string\") animation = {\r\n\t type: animation\r\n\t };\r\n\t animation = Settings._mergeSettings(animation, animate.defaults);\r\n\t var prefix = env.cssPrefix;\r\n\t var settings = node._has_animation = animation;\r\n\t var skew_options, scale_type; //jshint -W086:true\r\n\r\n\t switch (settings.type == \"slide\" && settings.direction) {\r\n\t // getting new x, y in case it is slide with direction\r\n\t case \"right\":\r\n\t settings.x = node.offsetWidth;\r\n\t break;\r\n\r\n\t case \"left\":\r\n\t settings.x = -node.offsetWidth;\r\n\t break;\r\n\r\n\t case \"top\":\r\n\t settings.y = -node.offsetHeight;\r\n\t break;\r\n\r\n\t case \"bottom\":\r\n\t default:\r\n\t settings.y = settings.y || node.offsetHeight;\r\n\t break;\r\n\t }\r\n\r\n\t if (settings.type == \"flip\" || settings.type == \"flipback\") {\r\n\t skew_options = [0, 0];\r\n\t scale_type = \"scaleX\";\r\n\r\n\t if (settings.subtype == \"vertical\") {\r\n\t skew_options[0] = 20;\r\n\t scale_type = \"scaleY\";\r\n\t } else skew_options[1] = 20;\r\n\r\n\t if (settings.direction == \"right\" || settings.direction == \"bottom\") {\r\n\t skew_options[0] *= -1;\r\n\t skew_options[1] *= -1;\r\n\t }\r\n\t }\r\n\r\n\t var duration = settings.duration + \"ms \" + settings.timing + \" \" + settings.delay + \"ms\";\r\n\t var css_general = prefix + \"TransformStyle: preserve-3d;\"; // general css rules\r\n\r\n\t var css_transition = \"\";\r\n\t var css_transform = \"\";\r\n\r\n\t switch (settings.type) {\r\n\t case \"fade\":\r\n\t // changes opacity to 0\r\n\t css_transition = \"opacity \" + duration;\r\n\t css_general = \"opacity: 0;\";\r\n\t break;\r\n\r\n\t case \"show\":\r\n\t // changes opacity to 1\r\n\t css_transition = \"opacity \" + duration;\r\n\t css_general = \"opacity: 1;\";\r\n\t break;\r\n\r\n\t case \"flip\":\r\n\t duration = settings.duration / 2 + \"ms \" + settings.timing + \" \" + settings.delay + \"ms\";\r\n\t css_transform = \"skew(\" + skew_options[0] + \"deg, \" + skew_options[1] + \"deg) \" + scale_type + \"(0.00001)\";\r\n\t css_transition = \"all \" + duration;\r\n\t break;\r\n\r\n\t case \"flipback\":\r\n\t settings.delay += settings.duration / 2;\r\n\t duration = settings.duration / 2 + \"ms \" + settings.timing + \" \" + settings.delay + \"ms\";\r\n\t node.style[env.transform] = \"skew(\" + -1 * skew_options[0] + \"deg, \" + -1 * skew_options[1] + \"deg) \" + scale_type + \"(0.00001)\";\r\n\t node.style.left = \"0\";\r\n\t css_transform = \"skew(0deg, 0deg) \" + scale_type + \"(1)\";\r\n\t css_transition = \"all \" + duration;\r\n\t break;\r\n\r\n\t case \"slide\":\r\n\t // moves object to specified location\r\n\t var x = settings.x + \"px\";\r\n\t var y = settings.y + \"px\"; // translate(x, y) OR translate3d(x, y, 0)\r\n\r\n\t css_transform = env.translate + \"(\" + x + \", \" + y + (env.translate == \"translate3d\" ? \", 0\" : \"\") + \")\";\r\n\t css_transition = prefix + \"transform \" + duration;\r\n\t break;\r\n\r\n\t default:\r\n\t break;\r\n\t } //set styles only after applying transition settings\r\n\r\n\r\n\t delay(function () {\r\n\t node.style[env.transition] = css_transition;\r\n\t delay(function () {\r\n\t if (css_general) node.style.cssText += css_general;\r\n\t if (css_transform) node.style[env.transform] = css_transform;\r\n\t var transitionEnded = false;\r\n\t var tid = event$1(node, env.transitionEnd, function (ev) {\r\n\t node._has_animation = null;\r\n\t if (settings.callback) settings.callback.call(settings.master || window, node, settings, ev);\r\n\t transitionEnded = true;\r\n\t eventRemove(tid);\r\n\t });\r\n\t window.setTimeout(function () {\r\n\t if (!transitionEnded) {\r\n\t node._has_animation = null;\r\n\t if (settings.callback) settings.callback.call(settings.master || window, node, settings);\r\n\t transitionEnded = true;\r\n\t eventRemove(tid);\r\n\t }\r\n\t }, (settings.duration * 1 + settings.delay * 1) * 1.3);\r\n\t });\r\n\t });\r\n\t};\r\n\r\n\tvar skin = {\r\n\t topLayout: \"space\",\r\n\t //bar in accordion\r\n\t barHeight: 44,\r\n\t //!!!Set the same in skin.less!!!\r\n\t tabbarHeight: 42,\r\n\t sidebarTitleHeight: 44,\r\n\t rowHeight: 36,\r\n\t toolbarHeight: 44,\r\n\t listItemHeight: 36,\r\n\t //list, grouplist, dataview, etc.\r\n\t inputHeight: 38,\r\n\t buttonHeight: 38,\r\n\t inputPadding: 3,\r\n\t menuHeight: 36,\r\n\t labelTopHeight: 22,\r\n\t propertyItemHeight: 28,\r\n\t unitHeaderHeight: 36,\r\n\t inputSpacing: 4,\r\n\t borderWidth: 1,\r\n\t sliderHandleWidth: 14,\r\n\t sliderPadding: 10,\r\n\t sliderBorder: 1,\r\n\t vSliderPadding: 15,\r\n\t vSliderHeight: 100,\r\n\t switchHeight: 22,\r\n\t switchWidth: 50,\r\n\t //margin - distance between cells\r\n\t layoutMargin: {\r\n\t space: 10,\r\n\t wide: 10,\r\n\t clean: 0,\r\n\t head: 4,\r\n\t line: -1,\r\n\t toolbar: 4,\r\n\t form: 8,\r\n\t accordion: 2\r\n\t },\r\n\t //padding - distance inside cell between cell border and cell content\r\n\t layoutPadding: {\r\n\t space: 10,\r\n\t wide: 0,\r\n\t clean: 0,\r\n\t head: 0,\r\n\t line: 0,\r\n\t toolbar: 2,\r\n\t form: 17,\r\n\t accordion: 0\r\n\t },\r\n\t //space between tabs in tabbar\r\n\t tabMargin: 0,\r\n\t tabOffset: 0,\r\n\t tabBottomOffset: 0,\r\n\t tabTopOffset: 0,\r\n\t tabBorder: true,\r\n\t customCheckbox: true,\r\n\t customRadio: true,\r\n\t sidebarMarkAll: true,\r\n\t popupNoPoint: true,\r\n\t borderlessPopup: true,\r\n\t popupPadding: 0,\r\n\t calendar: {\r\n\t timepickerHeight: 24\r\n\t },\r\n\t calendarHeight: 70,\r\n\t padding: 0,\r\n\t accordionType: \"accordion\",\r\n\t optionHeight: 32,\r\n\t organogramLineColor: \"#CCD7E6\"\r\n\t};\r\n\r\n\tvar skin$1 = {\r\n\t topLayout: \"space\",\r\n\t //bar in accordion\r\n\t barHeight: 36,\r\n\t //!!!Set the same in skin.less!!!\r\n\t tabbarHeight: 34,\r\n\t sidebarTitleHeight: 36,\r\n\t rowHeight: 28,\r\n\t toolbarHeight: 36,\r\n\t listItemHeight: 28,\r\n\t //list, grouplist, dataview, etc.\r\n\t inputHeight: 30,\r\n\t buttonHeight: 30,\r\n\t inputPadding: 3,\r\n\t menuHeight: 28,\r\n\t labelTopHeight: 16,\r\n\t propertyItemHeight: 24,\r\n\t unitHeaderHeight: 28,\r\n\t inputSpacing: 4,\r\n\t borderWidth: 1,\r\n\t sliderHandleWidth: 12,\r\n\t sliderPadding: 10,\r\n\t sliderBorder: 1,\r\n\t vSliderPadding: 13,\r\n\t vSliderHeight: 100,\r\n\t switchHeight: 20,\r\n\t switchWidth: 40,\r\n\t //margin - distance between cells\r\n\t layoutMargin: {\r\n\t space: 5,\r\n\t wide: 5,\r\n\t clean: 0,\r\n\t head: 4,\r\n\t line: -1,\r\n\t toolbar: 4,\r\n\t form: 8,\r\n\t accordion: 2\r\n\t },\r\n\t //padding - distance inside cell between cell border and cell content\r\n\t layoutPadding: {\r\n\t space: 5,\r\n\t wide: 0,\r\n\t clean: 0,\r\n\t head: 0,\r\n\t line: 0,\r\n\t toolbar: 2,\r\n\t form: 12,\r\n\t accordion: 0\r\n\t },\r\n\t //space between tabs in tabbar\r\n\t tabMargin: 0,\r\n\t tabOffset: 0,\r\n\t tabBottomOffset: 0,\r\n\t tabTopOffset: 0,\r\n\t tabBorder: true,\r\n\t customCheckbox: true,\r\n\t customRadio: true,\r\n\t sidebarMarkAll: true,\r\n\t popupNoPoint: true,\r\n\t borderlessPopup: true,\r\n\t popupPadding: 0,\r\n\t calendar: {\r\n\t timepickerHeight: 24\r\n\t },\r\n\t calendarHeight: 70,\r\n\t padding: 0,\r\n\t accordionType: \"accordion\",\r\n\t optionHeight: 24,\r\n\t organogramLineColor: \"#CCD7E6\"\r\n\t};\r\n\r\n\tvar skin$2 = {\r\n\t topLayout: \"space\",\r\n\t //bar in accordion\r\n\t barHeight: 46,\r\n\t //!!!Set the same in skin.less!!!\r\n\t tabbarHeight: 46,\r\n\t rowHeight: 34,\r\n\t toolbarHeight: 46,\r\n\t sidebarTitleHeight: 45,\r\n\t listItemHeight: 34,\r\n\t //list, grouplist, dataview, etc.\r\n\t inputHeight: 38,\r\n\t buttonHeight: 38,\r\n\t inputPadding: 3,\r\n\t menuHeight: 34,\r\n\t labelTopHeight: 22,\r\n\t unitHeaderHeight: 20,\r\n\t propertyItemHeight: 28,\r\n\t inputSpacing: 4,\r\n\t borderWidth: 1,\r\n\t sliderHandleWidth: 14,\r\n\t sliderPadding: 10,\r\n\t sliderBorder: 1,\r\n\t vSliderPadding: 15,\r\n\t vSliderHeight: 100,\r\n\t switchHeight: 22,\r\n\t switchWidth: 50,\r\n\t //margin - distance between cells\r\n\t layoutMargin: {\r\n\t space: 10,\r\n\t wide: 10,\r\n\t clean: 0,\r\n\t head: 4,\r\n\t line: -1,\r\n\t toolbar: 4,\r\n\t form: 8,\r\n\t accordion: 10\r\n\t },\r\n\t //padding - distance insede cell between cell border and cell content\r\n\t layoutPadding: {\r\n\t space: 10,\r\n\t wide: 0,\r\n\t clean: 0,\r\n\t head: 0,\r\n\t line: 0,\r\n\t toolbar: 4,\r\n\t form: 17,\r\n\t accordion: 0\r\n\t },\r\n\t //space between tabs in tabbar\r\n\t tabMargin: 4,\r\n\t tabOffset: 0,\r\n\t tabBottomOffset: 6,\r\n\t tabTopOffset: 1,\r\n\t customCheckbox: true,\r\n\t customRadio: true,\r\n\t popupPadding: 8,\r\n\t calendarHeight: 70,\r\n\t padding: 0,\r\n\t accordionType: \"accordion\",\r\n\t optionHeight: 32\r\n\t};\r\n\r\n\tvar skin$3 = {\r\n\t topLayout: \"space\",\r\n\t //bar in accordion\r\n\t barHeight: 34,\r\n\t //!!!Set the same in skin.less!!!\r\n\t tabbarHeight: 34,\r\n\t sidebarTitleHeight: 34,\r\n\t rowHeight: 24,\r\n\t toolbarHeight: 34,\r\n\t listItemHeight: 28,\r\n\t //list, grouplist, dataview, etc.\r\n\t unitHeaderHeight: 20,\r\n\t propertyItemHeight: 24,\r\n\t inputHeight: 30,\r\n\t buttonHeight: 30,\r\n\t inputPadding: 3,\r\n\t menuHeight: 28,\r\n\t labelTopHeight: 16,\r\n\t inputSpacing: 4,\r\n\t borderWidth: 1,\r\n\t sliderHandleWidth: 12,\r\n\t sliderPadding: 10,\r\n\t sliderBorder: 1,\r\n\t vSliderPadding: 13,\r\n\t vSliderHeight: 100,\r\n\t switchHeight: 20,\r\n\t switchWidth: 40,\r\n\t //margin - distance between cells\r\n\t layoutMargin: {\r\n\t space: 5,\r\n\t wide: 5,\r\n\t clean: 0,\r\n\t head: 4,\r\n\t line: -1,\r\n\t toolbar: 4,\r\n\t form: 4,\r\n\t accordion: 5\r\n\t },\r\n\t //padding - distance inside cell between cell border and cell content\r\n\t layoutPadding: {\r\n\t space: 5,\r\n\t wide: 0,\r\n\t clean: 0,\r\n\t head: 0,\r\n\t line: 0,\r\n\t toolbar: 2,\r\n\t form: 12,\r\n\t accordion: 0\r\n\t },\r\n\t //space between tabs in tabbar\r\n\t tabMargin: 3,\r\n\t tabOffset: 0,\r\n\t tabBottomOffset: 3,\r\n\t tabTopOffset: 1,\r\n\t customCheckbox: true,\r\n\t customRadio: true,\r\n\t popupPadding: 8,\r\n\t calendarHeight: 70,\r\n\t padding: 0,\r\n\t accordionType: \"accordion\",\r\n\t optionHeight: 23\r\n\t};\r\n\r\n\tvar skin$4 = {\r\n\t topLayout: \"space\",\r\n\t //bar in accordion\r\n\t barHeight: 46,\r\n\t // !!!Set the same in skin.less!!!\r\n\t tabbarHeight: 46,\r\n\t rowHeight: 34,\r\n\t toolbarHeight: 46,\r\n\t sidebarTitleHeight: 45,\r\n\t listItemHeight: 34,\r\n\t // list, grouplist, dataview, etc.\r\n\t unitHeaderHeight: 20,\r\n\t inputHeight: 38,\r\n\t buttonHeight: 38,\r\n\t inputPadding: 3,\r\n\t menuHeight: 34,\r\n\t labelTopHeight: 22,\r\n\t propertyItemHeight: 28,\r\n\t inputSpacing: 4,\r\n\t borderWidth: 1,\r\n\t sliderHandleWidth: 14,\r\n\t sliderPadding: 10,\r\n\t sliderBorder: 1,\r\n\t vSliderPadding: 15,\r\n\t vSliderHeight: 100,\r\n\t switchHeight: 22,\r\n\t switchWidth: 50,\r\n\t //margin - distance between cells\r\n\t layoutMargin: {\r\n\t space: 10,\r\n\t wide: 10,\r\n\t clean: 0,\r\n\t head: 4,\r\n\t line: -1,\r\n\t toolbar: 8,\r\n\t form: 8,\r\n\t accordion: 10\r\n\t },\r\n\t //padding - distance inside cell between cell border and cell content\r\n\t layoutPadding: {\r\n\t space: 10,\r\n\t wide: 0,\r\n\t clean: 0,\r\n\t head: 0,\r\n\t line: 0,\r\n\t toolbar: 4,\r\n\t form: 17,\r\n\t accordion: 0\r\n\t },\r\n\t //space between tabs in tabbar\r\n\t tabMargin: 4,\r\n\t tabOffset: 0,\r\n\t tabBottomOffset: 6,\r\n\t tabTopOffset: 1,\r\n\t customCheckbox: true,\r\n\t customRadio: true,\r\n\t popupPadding: 8,\r\n\t calendarHeight: 70,\r\n\t padding: 0,\r\n\t accordionType: \"accordion\",\r\n\t optionHeight: 32\r\n\t};\r\n\r\n\tvar skin$5 = {\r\n\t material: skin,\r\n\t mini: skin$1,\r\n\t flat: skin$2,\r\n\t compact: skin$3,\r\n\t contrast: skin$4\r\n\t};\r\n\tvar $active, $name;\r\n\tfunction set$1(name) {\r\n\t assert(skin$5[name], \"Incorrect skin name: \" + name);\r\n\t if ($name === name) return;\r\n\t $active = skin$5[name];\r\n\t $name = name;\r\n\r\n\t if (ui) {\r\n\t for (var key in ui) {\r\n\t var view = ui[key];\r\n\t if (view && view.prototype && view.prototype.$skin) view.prototype.$skin(view.prototype);\r\n\t }\r\n\t }\r\n\t}\r\n\tset$1(window.webix_skin || \"material\"); //necessary for skin builder\r\n\r\n\tvar skin$6 = /*#__PURE__*/Object.freeze({\r\n\t\tget $active () { return $active; },\r\n\t\tget $name () { return $name; },\r\n\t\tset: set$1,\r\n\t\tmaterial: skin,\r\n\t\tmini: skin$1,\r\n\t\tflat: skin$2,\r\n\t\tcompact: skin$3,\r\n\t\tcontrast: skin$4\r\n\t});\r\n\r\n\tvar Movable = {\r\n\t move_setter: function move_setter(value) {\r\n\t if (value) {\r\n\t this._move_admin = clone(this._move_admin);\r\n\t this._move_admin.master = this;\r\n\t DragControl.addDrag(this._headobj ? this._headobj : this.$view, this._move_admin);\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t _move_admin: {\r\n\t $dragCreate: function $dragCreate(object, e) {\r\n\t if (this.master.config.move) {\r\n\t var elOffset = offset(object);\r\n\t var elPos = pos(e);\r\n\t DragControl.top = elOffset.y - elPos.y;\r\n\t DragControl.left = elOffset.x - elPos.x;\r\n\t return toNode(this.master._viewobj);\r\n\t }\r\n\t },\r\n\t $dragDestroy: function $dragDestroy(node, drag) {\r\n\t var view = this.master;\r\n\r\n\t if (view._settings) {\r\n\t view._settings.top = parseInt(drag.style.top, 10);\r\n\t view._settings.left = parseInt(drag.style.left, 10);\r\n\t }\r\n\r\n\t DragControl.top = DragControl.left = 5;\r\n\t this.master.callEvent(\"onViewMoveEnd\", []);\r\n\t return;\r\n\t },\r\n\t $dragPos: function $dragPos(pos$$1, e) {\r\n\t this.master.callEvent(\"onViewMove\", [pos$$1, e]);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Modality = {\r\n\t _modal_set: function _modal_set(value) {\r\n\t if (value) {\r\n\t if (!this._modal_cover) {\r\n\t this._modal_cover = create(\"div\", {\r\n\t \"class\": \"webix_modal\"\r\n\t });\r\n\t /*\twith below code we will have the same zIndex for modal layer as for the previous \r\n\t \tabs positioned element, but because of attaching order modal layer will be on top anyway\r\n\t */\r\n\r\n\t var index$$1 = this._settings.zIndex || zIndex(); //set topmost modal layer\r\n\r\n\t this._previous_modality = state._modality;\r\n\t state._modality = index$$1;\r\n\t this._modal_cover.style.zIndex = index$$1 - 1;\r\n\t this._viewobj.style.zIndex = index$$1;\r\n\t document.body.appendChild(this._modal_cover);\r\n\t document.body.style.overflow = \"hidden\";\r\n\r\n\t _event(this._modal_cover, \"click\", bind(this._ignore_clicks, this));\r\n\t }\r\n\t } else {\r\n\t if (this._modal_cover) {\r\n\t remove(this._modal_cover);\r\n\t document.body.style.overflow = \"\"; //restore topmost modal layer\r\n\t //set delay, as current window closing may have not finished click event\r\n\t //need to wait while it is not fully processed\r\n\r\n\t var topmost = this._previous_modality;\r\n\t setTimeout(function () {\r\n\t state._modality = topmost;\r\n\t }, 1);\r\n\t this._modal_cover = null;\r\n\t }\r\n\t }\r\n\r\n\t return value;\r\n\t }\r\n\t};\r\n\r\n\tvar ResizeArea = {\r\n\t resize_setter: function resize_setter(value) {\r\n\t if (value && !this._resizeHandlers) this._renderResizeHandler();\r\n\t return value;\r\n\t },\r\n\t _renderResizeHandler: function _renderResizeHandler() {\r\n\t if (!this._rwHandle) {\r\n\t var rp = this._viewobj;\r\n\r\n\t if (rp.firstChild) {\r\n\t rp = rp.firstChild;\r\n\t rp.style.position = \"relative\";\r\n\t }\r\n\r\n\t this._rwHandle = create(\"DIV\", {\r\n\t \"class\": \"webix_resize_handle\",\r\n\t \"webix_disable_drag\": \"true\"\r\n\t });\r\n\t rp.appendChild(this._rwHandle);\r\n\r\n\t _event(this._rwHandle, env.mouse.down, this._wrDown, {\r\n\t bind: this\r\n\t });\r\n\t }\r\n\t },\r\n\t _showResizeFrame: function _showResizeFrame(width, height) {\r\n\t if (!this._resizeFrame) {\r\n\t this._resizeFrame = create(\"div\", {\r\n\t \"class\": \"webix_resize_frame\"\r\n\t }, \"\");\r\n\t document.body.appendChild(this._resizeFrame);\r\n\t var elPos = offset(this._viewobj);\r\n\t this._resizeFrame.style.left = elPos.x + \"px\";\r\n\t this._resizeFrame.style.top = elPos.y + \"px\";\r\n\t this._resizeFrame.style.zIndex = zIndex();\r\n\t }\r\n\r\n\t this._resizeFrame.style.width = width + \"px\";\r\n\t this._resizeFrame.style.height = height + \"px\";\r\n\t },\r\n\t _wrDown: function _wrDown() {\r\n\t if (this.config.resize) {\r\n\t addCss(document.body, \"webix_noselect webix_resize_cursor\");\r\n\t this._wsReady = offset(this._viewobj);\r\n\t this._resizeHandlersMove = event$1(document.body, env.mouse.move, this._wrMove, {\r\n\t bind: this\r\n\t });\r\n\t this._resizeHandlersUp = event$1(document.body, env.mouse.up, this._wrUp, {\r\n\t bind: this\r\n\t });\r\n\t }\r\n\t },\r\n\t _wrMove: function _wrMove(e) {\r\n\t if (this._wsReady !== false) {\r\n\t var elPos = pos(e);\r\n\t var progress = {\r\n\t x: elPos.x - this._wsReady.x + 10,\r\n\t y: elPos.y - this._wsReady.y + 10\r\n\t };\r\n\t if (this.$resizeMove) this.$resizeMove(progress);else {\r\n\t if (Math.abs(this._wsReady.x - elPos.x) < (this.config.minWidth || 100) || Math.abs(this._wsReady.y - elPos.y) < (this.config.minHeight || 100)) return;\r\n\t }\r\n\t this._wsProgress = progress;\r\n\r\n\t this._showResizeFrame(progress.x, progress.y);\r\n\t }\r\n\t },\r\n\t _wrUp: function _wrUp() {\r\n\t // remove resize frame and css styles\r\n\t if (this._resizeFrame) this._resizeFrame = remove(this._resizeFrame);\r\n\t removeCss(document.body, \"webix_resize_cursor\");\r\n\t removeCss(document.body, \"webix_noselect\");\r\n\t eventRemove(this._resizeHandlersMove);\r\n\t eventRemove(this._resizeHandlersUp); // set Window sizes\r\n\r\n\t if (this._wsProgress) {\r\n\t if (this.$resizeEnd) this.$resizeEnd(this._wsProgress);else {\r\n\t this.config.width = this._wsProgress.x;\r\n\t this.config.height = this._wsProgress.y;\r\n\t this.resize();\r\n\t }\r\n\t }\r\n\r\n\t this._wsReady = this._wsProgress = false;\r\n\t this.callEvent(\"onViewResize\", []);\r\n\t }\r\n\t};\r\n\r\n\tstate._popups = toArray();\r\n\tvar api$3 = {\r\n\t name: \"window\",\r\n\t $init: function $init(config) {\r\n\t this._viewobj.innerHTML = \"
\";\r\n\t this._contentobj = this._viewobj.firstChild;\r\n\t this._headobj = this._contentobj.childNodes[0];\r\n\t this._dataobj = this._bodyobj = this._contentobj.childNodes[1];\r\n\t this._viewobj.className += \" webix_window\";\r\n\r\n\t this._viewobj.setAttribute(\"role\", \"dialog\");\r\n\r\n\t this._viewobj.setAttribute(\"tabindex\", \"0\");\r\n\r\n\t this._head_cell = this._body_cell = null;\r\n\t this._settings._inner = {\r\n\t top: false,\r\n\t left: false,\r\n\t right: false,\r\n\t bottom: false\r\n\t }; //set border flags\r\n\r\n\t if (!config.id) config.id = uid();\r\n\r\n\t _event(this._contentobj, \"click\", bind(this._ignore_clicks, this)); // IE8 does not allow to define event capturing\r\n\r\n\r\n\t if (this._contentobj.addEventListener) _event(this._contentobj, \"click\", function () {\r\n\t // brings a window to the front of other windows\r\n\t if (!this._settings.zIndex && this._settings.toFront) {\r\n\t this._viewobj.style.zIndex = zIndex();\r\n\t }\r\n\t }, {\r\n\t bind: this,\r\n\t capture: true\r\n\t }); // hidden_setter handling\r\n\r\n\t if (config.modal) this._modal = true;\r\n\t this.attachEvent(\"onViewMoveEnd\", function () {\r\n\t if (this._settings.position) delete this._settings.position;\r\n\t });\r\n\t },\r\n\t _ignore_clicks: function _ignore_clicks(e) {\r\n\t var popups = state._popups;\r\n\t var index$$1 = popups.find(this);\r\n\t if (index$$1 == -1) index$$1 = popups.length - 1;\r\n\t e.click_view = index$$1;\r\n\t if (env.isIE8) e.srcElement.click_view = index$$1;\r\n\t },\r\n\t getChildViews: function getChildViews() {\r\n\t if (this._head_cell) return [this._head_cell, this._body_cell];else return [this._body_cell];\r\n\t },\r\n\t zIndex_setter: function zIndex_setter(value) {\r\n\t this._viewobj.style.zIndex = value;\r\n\t return value;\r\n\t },\r\n\t _remove: function _remove() {\r\n\t this._body_cell = {\r\n\t destructor: function destructor() {}\r\n\t };\r\n\t },\r\n\t _replace: function _replace(new_view) {\r\n\t this._body_cell.destructor();\r\n\r\n\t this._body_cell = new_view;\r\n\r\n\t this._bodyobj.appendChild(this._body_cell._viewobj);\r\n\r\n\t var cell = this._body_cell._viewobj.style;\r\n\t cell.borderTopWidth = cell.borderBottomWidth = cell.borderLeftWidth = cell.borderRightWidth = \"1px\";\r\n\t this._body_cell._settings._inner = clone(this._settings._inner);\r\n\t this.resize(true);\r\n\t },\r\n\t show: function show(node, mode, point) {\r\n\t if (node === true) {\r\n\t //recursive call from some child item\r\n\t if (!this._settings.hidden) return;\r\n\t node = null;\r\n\t }\r\n\r\n\t if (!this.callEvent(\"onBeforeShow\", arguments)) return false;\r\n\t this._settings.hidden = false;\r\n\t this._viewobj.style.zIndex = this._settings.zIndex || zIndex();\r\n\r\n\t if (this._settings.modal || this._modal) {\r\n\t this._modal_set(true);\r\n\r\n\t this._modal = null; // hidden_setter handling\r\n\t }\r\n\r\n\t var elPos, dx, dy;\r\n\t mode = mode || {};\r\n\t if (!mode.pos) mode.pos = this._settings.relative; //get position of source html node\r\n\t //we need to show popup which pointing to that node\r\n\r\n\t if (node) {\r\n\t //if event was provided - get node info from it\r\n\t if (_typeof(node) == \"object\" && !node.tagName) {\r\n\t /*below logic is far from ideal*/\r\n\t if (node.target || node.srcElement) {\r\n\t elPos = pos(node);\r\n\t dx = 20;\r\n\t dy = 5;\r\n\t } else elPos = node;\r\n\t } else {\r\n\t node = toNode(node);\r\n\t assert(node, \"Not existing target for window:show\");\r\n\t elPos = offset(node);\r\n\t } //size of body, we need to fit popup inside\r\n\r\n\r\n\t var x = Math.max(window.innerWidth || 0, document.body.offsetWidth);\r\n\t var y = Math.max(window.innerHeight || 0, document.body.offsetHeight); //size of node, near which popup will be rendered\r\n\r\n\t dx = dx || node.offsetWidth || 0;\r\n\t dy = dy || node.offsetHeight || 0; //size of popup element\r\n\r\n\t var size = this._last_size;\r\n\t var fin_x = elPos.x;\r\n\t var fin_y = elPos.y;\r\n\t var point_y = 0;\r\n\t var point_x = 0;\r\n\t var scrollLeft = 0,\r\n\t scrollTop = 0;\r\n\t var fit = this._settings.autofit;\r\n\r\n\t if (fit) {\r\n\t var nochange = fit === \"node\";\r\n\t var delta_x = 6;\r\n\t var delta_y = 6;\r\n\t var delta_point = 6;\r\n\t if (!this._settings.point) delta_x = delta_y = delta_point = 0; //default pointer position - top \r\n\r\n\t point = \"top\";\r\n\t fin_y = 0;\r\n\t fin_x = 0;\r\n\t scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft; //if we want to place menu at righ, but there is no place move it to left instead\r\n\r\n\t if (x - elPos.x - dx < size[0] && mode.pos == \"right\" && !nochange) mode.pos = \"left\";\r\n\r\n\t if (mode.pos == \"right\") {\r\n\t fin_x = elPos.x + delta_x + dx;\r\n\t delta_y = -dy;\r\n\t point = \"left\";\r\n\t point_y = Math.round(elPos.y + dy / 2);\r\n\t point_x = fin_x - delta_point;\r\n\t } else if (mode.pos == \"left\") {\r\n\t fin_x = elPos.x - delta_x - size[0] - 1;\r\n\t delta_y = -dy;\r\n\t point = \"right\";\r\n\t point_y = Math.round(elPos.y + dy / 2);\r\n\t point_x = fin_x + size[0] + 1;\r\n\t } else {\r\n\t //left border of screen\r\n\t if (elPos.x < scrollLeft) {\r\n\t fin_x = scrollLeft; //popup exceed the right border of screen\r\n\t } else if (x + scrollLeft - elPos.x > size[0]) {\r\n\t fin_x = elPos.x; //aligned\r\n\t } else {\r\n\t fin_x = x + scrollLeft - delta_x - size[0]; //not aligned\r\n\t }\r\n\r\n\t point_x = Math.round(elPos.x + dx / 2); //when we have a small popup, point need to be rendered at center of popup\r\n\r\n\t point_x = Math.min(point_x, fin_x + size[0] - delta_point * 3);\r\n\t } //if height is not fixed - use default position\r\n\r\n\r\n\t scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;\r\n\r\n\t if ((!size[1] || y + scrollTop - dy - elPos.y - delta_y > size[1] || nochange) && mode.pos != \"top\") {\r\n\t //bottom\t\r\n\t fin_y = dy + elPos.y + delta_y - (!this._settings.point ? 0 : 4);\r\n\r\n\t if (!point_y) {\r\n\t point = \"top\";\r\n\t point_y = fin_y - delta_point;\r\n\t }\r\n\t } else {\r\n\t //top\r\n\t fin_y = elPos.y - delta_y - size[1];\r\n\r\n\t if (fin_y < 0) {\r\n\t fin_y = 0; //left|right point can be used, but there is no place for top point\r\n\r\n\t if (point == \"top\") point = false;\r\n\t } else if (!point_y) {\r\n\t point = \"bottom\";\r\n\t fin_y--;\r\n\t point_y = fin_y + size[1] + 1;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t var deltax = mode.x || 0;\r\n\t var deltay = mode.y || 0;\r\n\r\n\t var fixed = this._checkFixedPosition();\r\n\r\n\t if (fixed) {\r\n\t fin_y = fin_y - scrollTop;\r\n\t point_y = point_y - scrollTop;\r\n\t }\r\n\r\n\t this.setPosition(fin_x + deltax, fin_y + deltay);\r\n\r\n\t if (this._set_point) {\r\n\t if (point && this._settings.point) this._set_point(point, point_x + deltax, point_y + deltay, fixed);else this._hide_point();\r\n\t }\r\n\t } else this._setPosition(this._settings.left, this._settings.top);\r\n\r\n\t this._viewobj.style.display = \"block\";\r\n\t this._hide_timer = 1;\r\n\t delay(function () {\r\n\t this._hide_timer = 0;\r\n\t }, this, [], env.touch ? 400 : 100);\r\n\r\n\t this._render_hidden_views();\r\n\r\n\t if (this.config.autofocus) {\r\n\t this._prev_focus = UIManager.getFocus();\r\n\t UIManager.setFocus(this);\r\n\t }\r\n\r\n\t if (-1 == state._popups.find(this)) state._popups.push(this);\r\n\t this.callEvent(\"onShow\", []);\r\n\t },\r\n\t _hide: function _hide(e) {\r\n\t //do not hide modal windows\r\n\t if (this._settings.hidden || this._settings.modal || this._hide_timer || e && e.showpopup) return; //do not hide popup, when we have modal layer above the popup\r\n\r\n\t if (state._modality && this._settings.zIndex <= state._modality) return; //ignore inside clicks and clicks in child-popups\r\n\r\n\t if (e) {\r\n\t var index$$1 = env.isIE8 ? e.srcElement.click_view : e.click_view;\r\n\t if (!index$$1 && index$$1 !== 0) index$$1 = -1;\r\n\r\n\t var myindex = state._popups.find(this);\r\n\r\n\t if (myindex <= index$$1) return;\r\n\t }\r\n\r\n\t this.hide();\r\n\t },\r\n\t hidden_setter: function hidden_setter(value) {\r\n\t if (value) this.hide();else this.show();\r\n\t return !!value;\r\n\t },\r\n\t hide: function hide(force) {\r\n\t if (this.$destructed) return;\r\n\t if (!force) if (this._settings.hidden) return;\r\n\t if (this._settings.modal) this._modal_set(false);\r\n\r\n\t if (this._settings.position == \"top\") {\r\n\t animate(this._viewobj, {\r\n\t type: \"slide\",\r\n\t x: 0,\r\n\t y: -(this._content_height + 20),\r\n\t duration: 300,\r\n\t callback: this._hide_callback,\r\n\t master: this\r\n\t });\r\n\t } else this._hide_callback();\r\n\r\n\t if (this._settings.autofocus) {\r\n\t var el = document.activeElement; //as result of hotkey, we can have a activeElement set to document.body\r\n\r\n\t if (el && this._viewobj && (this._viewobj.contains(el) || el === document.body)) {\r\n\t UIManager.setFocus(this._prev_focus);\r\n\t this._prev_focus = null;\r\n\t }\r\n\t }\r\n\r\n\t this._hide_sub_popups();\r\n\t },\r\n\t //hide all child-popups\r\n\t _hide_sub_popups: function _hide_sub_popups() {\r\n\t var order = state._popups;\r\n\t var index$$1 = order.find(this);\r\n\t var size = order.length - 1;\r\n\t if (index$$1 > -1) for (var i = size; i > index$$1; i--) {\r\n\t if (order[i]._hide_point) //hide only popups, skip windows\r\n\t order[i].hide();\r\n\t }\r\n\t order.removeAt(index$$1);\r\n\t },\r\n\t destructor: function destructor() {\r\n\t this._modal_set(false);\r\n\r\n\t remove(this._viewobj);\r\n\r\n\t if (this._settings.autofocus) {\r\n\t if (!state._final_destruction) UIManager.setFocus(this._prev_focus);\r\n\t this._prev_focus = null;\r\n\t }\r\n\r\n\t this._hide_sub_popups();\r\n\r\n\t if (this._hide_point) this._hide_point();\r\n\t Destruction.destructor.apply(this, []);\r\n\t },\r\n\t _hide_callback: function _hide_callback() {\r\n\t if (!this.$destructed) {\r\n\t this._viewobj.style.display = \"none\";\r\n\t this._settings.hidden = true;\r\n\t this.callEvent(\"onHide\", []);\r\n\t }\r\n\t },\r\n\t close: function close() {\r\n\t this.destructor();\r\n\t },\r\n\t _inner_body_set: function _inner_body_set(value) {\r\n\t if (typeof value.borderless == \"undefined\") value.borderless = true;\r\n\t },\r\n\t body_setter: function body_setter(value) {\r\n\t if (_typeof(value) != \"object\") value = {\r\n\t template: value\r\n\t };\r\n\r\n\t this._inner_body_set(value);\r\n\r\n\t state._parent_cell = this;\r\n\t this._body_cell = ui._view(value);\r\n\r\n\t this._bodyobj.appendChild(this._body_cell._viewobj);\r\n\r\n\t return value;\r\n\t },\r\n\t head_setter: function head_setter(value) {\r\n\t if (value === false) return value;\r\n\r\n\t if (_typeof(value) != \"object\") {\r\n\t this._viewobj.setAttribute(\"aria-label\", value);\r\n\r\n\t value = {\r\n\t template: value,\r\n\t padding: 0\r\n\t };\r\n\t }\r\n\r\n\t value.borderless = true;\r\n\t state._parent_cell = this;\r\n\t this._head_cell = ui._view(value);\r\n\r\n\t this._headobj.appendChild(this._head_cell._viewobj);\r\n\r\n\t return value;\r\n\t },\r\n\t getBody: function getBody() {\r\n\t return this._body_cell;\r\n\t },\r\n\t getHead: function getHead() {\r\n\t return this._head_cell;\r\n\t },\r\n\t adjust: function adjust() {\r\n\t return this.resize();\r\n\t },\r\n\t resizeChildren: function resizeChildren() {\r\n\t if (this._body_cell) this.resize();\r\n\t },\r\n\t resize: function resize$$1() {\r\n\t baseview.api.adjust.call(this);\r\n\r\n\t if (this.isVisible()) {\r\n\t this._setPosition(this._settings.left, this._settings.top);\r\n\t }\r\n\t },\r\n\t _checkFixedPosition: function _checkFixedPosition() {\r\n\t if (this._settings.master) {\r\n\t var top = $$(this._settings.master).getTopParentView().$view;\r\n\t return top && top.style.position === \"fixed\";\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t _setPosition: function _setPosition(x, y) {\r\n\t if (this._settings.position || this._checkFixedPosition()) {\r\n\t this.$view.style.position = \"fixed\";\r\n\t var width = this._content_width;\r\n\t var height = this._content_height;\r\n\t if (width <= 0 || height <= 0) return;\r\n\t var maxWidth = window.innerWidth || document.documentElement.offsetWidth;\r\n\t var maxHeight = window.innerHeight || document.documentElement.offsetHeight;\r\n\t var left = Math.round((maxWidth - width) / 2);\r\n\t var top = Math.round((maxHeight - height) / 2);\r\n\r\n\t if (typeof this._settings.position == \"function\") {\r\n\t var state$$1 = {\r\n\t left: left,\r\n\t top: top,\r\n\t width: width,\r\n\t height: height,\r\n\t maxWidth: maxWidth,\r\n\t maxHeight: maxHeight\r\n\t };\r\n\r\n\t this._settings.position.call(this, state$$1);\r\n\r\n\t if (state$$1.width != width || state$$1.height != height) this.$setSize(state$$1.width, state$$1.height);\r\n\t this.setPosition(state$$1.left, state$$1.top);\r\n\t } else {\r\n\t if (this._settings.position == \"top\") {\r\n\t if (animate.isSupported()) top = -1 * height;else top = 10;\r\n\t } //popup inside a fixed win\r\n\r\n\r\n\t if (!this._settings.position) {\r\n\t left = this._settings.left || left;\r\n\t top = this._settings.top || top;\r\n\t }\r\n\r\n\t this.setPosition(left, top);\r\n\t }\r\n\r\n\t if (this._settings.position == \"top\") animate(this._viewobj, {\r\n\t type: \"slide\",\r\n\t x: 0,\r\n\t y: height - (this._settings.padding || 0) * 2,\r\n\t duration: 300,\r\n\t callback: this._topPositionCallback,\r\n\t master: this\r\n\t });\r\n\t } else this.setPosition(x, y);\r\n\t },\r\n\t _topPositionCallback: function _topPositionCallback(node) {\r\n\t animate.clear(node);\r\n\t this._settings.top = -((this._settings.padding || 0) * 2);\r\n\t this.setPosition(this._settings.left, this._settings.top);\r\n\t },\r\n\t setPosition: function setPosition(x, y) {\r\n\t this._viewobj.style.top = y + \"px\";\r\n\t this._viewobj.style.left = x + \"px\";\r\n\t this._settings.left = x;\r\n\t this._settings.top = y;\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var _borders = this._settings._inner;\r\n\r\n\t if (_borders) {\r\n\t dx += (_borders.left ? 0 : 1) + (_borders.right ? 0 : 1);\r\n\t dy += (_borders.top ? 0 : 1) + (_borders.bottom ? 0 : 1);\r\n\t } //line between head and body\r\n\r\n\r\n\t if (this._settings.head) dy += 1;\r\n\r\n\t var size = this._body_cell.$getSize(0, 0);\r\n\r\n\t var headMinWidth = 0;\r\n\r\n\t if (this._head_cell) {\r\n\t var head_size = this._head_cell.$getSize(0, 0);\r\n\r\n\t if (head_size[3] == head_size[2]) this._settings.headHeight = head_size[3];\r\n\t dy += this._settings.headHeight;\r\n\t headMinWidth = head_size[0];\r\n\t }\r\n\r\n\t if (this._settings.fullscreen) {\r\n\t var width = window.innerWidth || document.body.clientWidth;\r\n\t var height = window.innerHeight || document.body.clientHeight;\r\n\t return [width, width, height, height];\r\n\t } //get layout sizes\r\n\r\n\r\n\t var self_size = base.api.$getSize.call(this, 0, 0); //use child settings if layout's one was not defined\r\n\r\n\t if (headMinWidth && size[1] > 100000) size[0] = Math.max(headMinWidth, size[0]);\r\n\t self_size[1] = Math.min(self_size[1], (size[1] >= 100000 && self_size[1] >= 100000 ? Math.max(size[0], self_size[0]) : size[1]) + dx);\r\n\t self_size[3] = Math.min(self_size[3], (size[3] >= 100000 && self_size[3] >= 100000 ? Math.max(size[2], self_size[2]) : size[3]) + dy);\r\n\t self_size[0] = Math.min(Math.max(self_size[0], size[0] + dx), self_size[1]);\r\n\t self_size[2] = Math.min(Math.max(self_size[2], size[2] + dy), self_size[3]);\r\n\t return self_size;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t base.api.$setSize.call(this, x, y);\r\n\t x = this._content_width;\r\n\t y = this._content_height;\r\n\r\n\t if (this._settings.head === false) {\r\n\t this._headobj.style.display = \"none\";\r\n\r\n\t this._body_cell.$setSize(x, y);\r\n\t } else {\r\n\t this._head_cell.$setSize(x, this._settings.headHeight);\r\n\r\n\t this._body_cell.$setSize(x, y - this._settings.headHeight);\r\n\t }\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.headHeight = $active.barHeight;\r\n\t },\r\n\t defaults: {\r\n\t top: 0,\r\n\t left: 0,\r\n\t autofit: true,\r\n\t relative: \"bottom\",\r\n\t body: \"\",\r\n\t head: \"\",\r\n\t hidden: true,\r\n\t autofocus: true,\r\n\t minWidth: 300,\r\n\t minHeight: 200\r\n\t }\r\n\t};\r\n\tvar view$3 = exports.protoUI(api$3, base.view, Movable, Modality, EventSystem, ResizeArea);\r\n\tvar window$1 = {\r\n\t api: api$3,\r\n\t view: view$3\r\n\t};\r\n\r\n\tvar ContextHelper = {\r\n\t defaults: {\r\n\t padding: \"4\",\r\n\t hidden: true\r\n\t },\r\n\t body_setter: function body_setter(value) {\r\n\t value = window$1.api.body_setter.call(this, value);\r\n\t this._body_cell._viewobj.style.borderWidth = \"0px\";\r\n\t return value;\r\n\t },\r\n\t attachTo: function attachTo(obj) {\r\n\t assert(obj, \"Invalid target for Context::attach\");\r\n\t var id;\r\n\t if (obj.on_context) id = obj.attachEvent(\"onAfterContextMenu\", bind(this._show_at_ui, this));else id = event$1(obj, \"contextmenu\", this._show_at_node, {\r\n\t bind: this\r\n\t });\r\n\t this.attachEvent(\"onDestruct\", function () {\r\n\t if (obj.callEvent) obj.detachEvent(id);else eventRemove(id);\r\n\t obj = null;\r\n\t });\r\n\t },\r\n\t getContext: function getContext() {\r\n\t return this._area;\r\n\t },\r\n\t setContext: function setContext(area) {\r\n\t this._area = area;\r\n\t },\r\n\t _show_at_node: function _show_at_node(e) {\r\n\t this._area = toNode(e || event$1);\r\n\t return this._show_at(e);\r\n\t },\r\n\t _show_at_ui: function _show_at_ui(id, e) {\r\n\t this._area = {\r\n\t obj: $$(e),\r\n\t id: id\r\n\t };\r\n\t return this._show_at(e);\r\n\t },\r\n\t _show_at: function _show_at(e) {\r\n\t var result = this.show(e, null, true);\r\n\t if (result === false) return result; //event forced to close other popups|context menus\r\n\r\n\t callEvent(\"onClick\", []);\r\n\t return preventEvent(e);\r\n\t },\r\n\t _show_on_mouse_out: true,\r\n\t master_setter: function master_setter(value) {\r\n\t this.attachTo(value);\r\n\t return null;\r\n\t }\r\n\t};\r\n\r\n\tvar clipbuffer = {\r\n\t _area: null,\r\n\t _blur_id: null,\r\n\t _ctrl: 0,\r\n\r\n\t /*! create textarea or returns existing\r\n\t **/\r\n\t init: function init() {\r\n\t // returns existing textarea\r\n\t if (this._area !== null) return this._area;\r\n\t state.destructors.push({\r\n\t obj: this\r\n\t }); // creates new textarea\r\n\r\n\t this._area = document.createElement(\"textarea\");\r\n\t this._area.className = \"webix_clipbuffer\";\r\n\r\n\t this._area.setAttribute(\"webixignore\", 1);\r\n\r\n\t this._area.setAttribute(\"spellcheck\", \"false\");\r\n\r\n\t this._area.setAttribute(\"autocapitalize\", \"off\");\r\n\r\n\t this._area.setAttribute(\"autocorrect\", \"off\");\r\n\r\n\t this._area.setAttribute(\"autocomplete\", \"off\");\r\n\r\n\t document.body.appendChild(this._area);\r\n\t event$1(document.body, \"keydown\", bind(function (e) {\r\n\t var key = e.keyCode;\r\n\t var ctrl = !!(e.ctrlKey || e.metaKey);\r\n\r\n\t if (key === 86 && ctrl) {\r\n\t this._area.value = \"\";\r\n\t delay(this._paste, this, [e], 100);\r\n\t }\r\n\t }, this));\r\n\t return this._area;\r\n\t },\r\n\t destructor: function destructor() {\r\n\t this._area = null;\r\n\t },\r\n\r\n\t /*! set text into buffer\r\n\t **/\r\n\t set: function set(text) {\r\n\t this.init();\r\n\t text = text === \"\" ? \"\\n\" : text;\r\n\t this._area.value = text;\r\n\t this.focus();\r\n\t },\r\n\r\n\t /*! select text in textarea\r\n\t **/\r\n\t focus: function focus() {\r\n\t // if there is native browser selection, skip focus\r\n\t if (!this._isSelectRange()) {\r\n\t this.init();\r\n\r\n\t this._area.focus();\r\n\r\n\t this._area.select();\r\n\t }\r\n\t },\r\n\r\n\t /*! checks document selection\r\n\t **/\r\n\t _isSelectRange: function _isSelectRange() {\r\n\t var text = \"\";\r\n\r\n\t if (typeof window.getSelection != \"undefined\") {\r\n\t text = window.getSelection().toString();\r\n\t } else if (typeof document.selection != \"undefined\" && document.selection.type == \"Text\") {\r\n\t text = document.selection.createRange().text;\r\n\t }\r\n\r\n\t return !!text;\r\n\t },\r\n\r\n\t /*! process ctrl+V pressing\r\n\t **/\r\n\t _paste: function _paste(e) {\r\n\t var trg = e.target || e.srcElement;\r\n\r\n\t if (trg === this._area) {\r\n\t var text = this._area.value;\r\n\t var last_active = UIManager.getFocus();\r\n\r\n\t if (last_active && (!last_active.getEditor || !last_active.getEditor())) {\r\n\t last_active.callEvent(\"onPaste\", [text]);\r\n\r\n\t this._area.select();\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar CopyPaste = {\r\n\t clipboard_setter: function clipboard_setter(value) {\r\n\t if (value === true || value === 1) value = \"modify\";\r\n\t this.attachEvent(\"onAfterSelect\", function (id) {\r\n\t var item = this.getItem(id);\r\n\t var text = this.type.templateCopy(item);\r\n\t clipbuffer.set(text, this);\r\n\t clipbuffer.focus();\r\n\t UIManager.setFocus(this);\r\n\t });\r\n\t this.attachEvent(\"onPaste\", function (text) {\r\n\t if (!isUndefined(this._paste[this._settings.clipboard])) this._paste[this._settings.clipboard].call(this, text);\r\n\t });\r\n\t this.attachEvent(\"onFocus\", function () {\r\n\t clipbuffer.focus();\r\n\t }); // solution for clicks on selected items\r\n\r\n\t this.attachEvent(\"onItemClick\", function (id) {\r\n\t if (!this._selected || this._selected.find(id) !== -1) {\r\n\t clipbuffer.focus();\r\n\t UIManager.setFocus(this);\r\n\t }\r\n\t });\r\n\t return value;\r\n\t },\r\n\t _paste: {\r\n\t // insert new item with pasted value\r\n\t insert: function insert(text) {\r\n\t this.add({\r\n\t value: text\r\n\t });\r\n\t },\r\n\t // change value of each selected item\r\n\t modify: function modify(text) {\r\n\t var sel = this.getSelectedId(true);\r\n\r\n\t for (var i = 0; i < sel.length; i++) {\r\n\t this.getItem(sel[i]).value = text;\r\n\t this.refresh(sel[i]);\r\n\t }\r\n\t },\r\n\t // do nothing\r\n\t custom: function custom() {}\r\n\t },\r\n\t templateCopy_setter: function templateCopy_setter(value) {\r\n\t this.type.templateCopy = template(value);\r\n\t },\r\n\t type: {\r\n\t templateCopy: function templateCopy(item) {\r\n\t return this.template(item);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar CustomPrint = {\r\n\t $customPrint: function $customPrint(options, htmlOnly) {\r\n\t if (this._prePrint(options, htmlOnly)) return true;\r\n\r\n\t var tableData = this._getTableArray(options);\r\n\r\n\t var table = this._getTableHTML(tableData, options);\r\n\r\n\t if (htmlOnly) return table;\r\n\t var doc = create(\"div\", {\r\n\t \"class\": \"webix_ui_print\"\r\n\t });\r\n\t doc.appendChild(table);\r\n\t insertBefore(doc, options.docFooter, document.body);\r\n\t window.print();\r\n\t remove(doc);\r\n\t },\r\n\t _prePrint: function _prePrint(options, htmlOnly) {\r\n\t if (!htmlOnly && (this.config.layout == \"y\" || options.scroll || this.config.prerender || this.config.autoheight)) return true;\r\n\t if (this.config.layout == \"x\") exports.extend(options || {}, {\r\n\t xCount: this.count(),\r\n\t nobreaks: true\r\n\t }, true);\r\n\t },\r\n\t _getPageWidth: function _getPageWidth(options) {\r\n\t if (options.fit == \"page\") return Infinity;\r\n\t var size = options.size;\r\n\t var width = size[options.mode == \"portrait\" ? \"width\" : \"height\"];\r\n\t return Math.min(width * env.printPPI - 2 * env.printMargin);\r\n\t },\r\n\t _getTableArray: function _getTableArray(options, base, start) {\r\n\t var maxWidth = this._getPageWidth(options);\r\n\r\n\t var xCount = options.xCount || this._getVisibleRange()._dx;\r\n\r\n\t var tableArray = [];\r\n\t var colrow = [];\r\n\t var width = 0;\r\n\t var newTableStart, rownum, colnum;\r\n\t start = start || 0;\r\n\t base = base || [];\r\n\r\n\t for (var i = 0; i < this.data.order.length;) {\r\n\t var obj = this.data.pull[this.data.order[i]];\r\n\t rownum = parseInt(i / xCount);\r\n\t colnum = i - rownum * xCount;\r\n\r\n\t if (obj && colnum >= start) {\r\n\t width += this.type.width; //start a new table, if cells do not fit page width\r\n\r\n\t if (width > maxWidth && colnum > start) {\r\n\t // 'colnum>start' ensures that a single long cell will have to fit the page\r\n\t newTableStart = colrow.length + start;\r\n\t tableArray.push(colrow);\r\n\t i = i + (xCount - colrow.length);\r\n\t colrow = [];\r\n\t width = 0;\r\n\t continue;\r\n\t }\r\n\r\n\t var cellValue = this.type.template(obj, this.type);\r\n\t var className = this._itemClassName;\r\n\t var style = {\r\n\t display: \"table-cell\",\r\n\t height: this.type.height + \"px\",\r\n\t width: this.type.width + \"px\"\r\n\t }; //push a cell to a row\r\n\r\n\t colrow.push({\r\n\t txt: cellValue,\r\n\t className: className + \" \" + (obj.$css || \"\"),\r\n\t style: style\r\n\t }); //push a row to a table and start a new row\r\n\r\n\t if ((i + 1) % xCount === 0) {\r\n\t tableArray.push(colrow);\r\n\t colrow = [];\r\n\t width = 0;\r\n\t }\r\n\t }\r\n\r\n\t i++;\r\n\t }\r\n\r\n\t base.push(tableArray);\r\n\t if (newTableStart) this._getTableArray(options, base, newTableStart);\r\n\t return base;\r\n\t },\r\n\t _getTableHTML: function _getTableHTML(tableData, options) {\r\n\t var container = create(\"div\");\r\n\t tableData.forEach(bind(function (table, i) {\r\n\t var tableHTML = create(\"table\", {\r\n\t \"class\": \"webix_table_print \" + this.$view.className,\r\n\t \"style\": \"border-collapse:collapse\"\r\n\t });\r\n\t table.forEach(function (row) {\r\n\t var tr = create(\"tr\");\r\n\t row.forEach(function (column) {\r\n\t var td = create(\"td\");\r\n\t if (column.txt) td.innerHTML = column.txt;\r\n\t if (column.className) td.className = column.className;\r\n\r\n\t if (column.style) {\r\n\t var keys = Object.keys(column.style);\r\n\t keys.forEach(function (key) {\r\n\t if (column.style[key]) td.style[key] = column.style[key];\r\n\t });\r\n\t }\r\n\r\n\t if (column.span) {\r\n\t if (column.span.colspan > 1) td.colSpan = column.span.colspan;\r\n\t if (column.span.rowspan > 1) td.rowSpan = column.span.rowspan;\r\n\t }\r\n\r\n\t tr.appendChild(td);\r\n\t });\r\n\t tableHTML.appendChild(tr);\r\n\t });\r\n\t container.appendChild(tableHTML);\r\n\r\n\t if (!options.nobreaks && i + 1 < tableData.length) {\r\n\t var br = create(\"DIV\", {\r\n\t \"class\": \"webix_print_pagebreak\"\r\n\t });\r\n\t container.appendChild(br);\r\n\t }\r\n\t }, this));\r\n\t return container;\r\n\t }\r\n\t};\r\n\r\n\tvar CustomScroll = {\r\n\t scrollStep: 40,\r\n\t init: function init() {\r\n\t this._init_once();\r\n\r\n\t env.$customScroll = true;\r\n\t env.scrollSize = 0;\r\n\t state.destructors.push({\r\n\t obj: {\r\n\t destructor: function destructor() {\r\n\t this._last_active_node = null;\r\n\t }\r\n\t }\r\n\t });\r\n\t attachEvent(\"onReconstruct\", CustomScroll._on_reconstruct);\r\n\t attachEvent(\"onResize\", CustomScroll._on_reconstruct); //adjusts scroll after view repainting\r\n\t //for example, opening a branch in the tree\r\n\t //it will be better to handle onAfterRender of the related view\r\n\r\n\t attachEvent(\"onClick\", CustomScroll._on_reconstruct);\r\n\t },\r\n\t resize: function resize() {\r\n\t this._on_reconstruct();\r\n\t },\r\n\t _enable_datatable: function _enable_datatable(view) {\r\n\t view._body._custom_scroll_view = view._settings.id;\r\n\t view.attachEvent(\"onAfterRender\", function () {\r\n\t var scroll = CustomScroll._get_datatable_sizes(this);\r\n\r\n\t var y = Math.max(scroll.dy - scroll.py, 0);\r\n\t var x = Math.max(scroll.dx - scroll.px, 0);\r\n\r\n\t if (this._y_scroll && this._scrollTop > y) {\r\n\t this._y_scroll.scrollTo(y);\r\n\t } else if (this._x_scroll && this._scrollLeft > x) {\r\n\t this._x_scroll.scrollTo(x);\r\n\t }\r\n\r\n\t if (CustomScroll._last_active_node == this._body) CustomScroll._on_reconstruct();\r\n\t });\r\n\r\n\t _event(view._body, \"mouseover\", CustomScroll._mouse_in);\r\n\r\n\t _event(view._body, \"mouseout\", CustomScroll._mouse_out);\r\n\t },\r\n\t enable: function enable(view, mode) {\r\n\t CustomScroll._init_once();\r\n\r\n\t if (view.mapCells) return this._enable_datatable(view);\r\n\t var node = view;\r\n\t if (view._dataobj) node = view._dataobj.parentNode;\r\n\t node._custom_scroll_mode = mode || \"xy\";\r\n\r\n\t _event(node, \"mouseover\", CustomScroll._mouse_in);\r\n\r\n\t _event(node, \"mouseout\", CustomScroll._mouse_out);\r\n\r\n\t _event(node, \"mousewheel\", CustomScroll._mouse_wheel);\r\n\r\n\t _event(node, \"DOMMouseScroll\", CustomScroll._mouse_wheel); // update scroll on data change\r\n\r\n\r\n\t this._setDataHandler(view);\r\n\t },\r\n\t _on_reconstruct: function _on_reconstruct() {\r\n\t var last = CustomScroll._last_active_node;\r\n\r\n\t if (last && last._custom_scroll_size) {\r\n\t CustomScroll._mouse_out_timed.call(last);\r\n\r\n\t CustomScroll._mouse_in.call(last);\r\n\t }\r\n\t },\r\n\t _init_once: function _init_once() {\r\n\t event$1(document.body, \"mousemove\", function (e) {\r\n\t if (CustomScroll._active_drag_area) CustomScroll._adjust_scroll(CustomScroll._active_drag_area, CustomScroll._active_drag_area._scroll_drag_pos, pos(e));\r\n\t });\r\n\r\n\t CustomScroll._init_once = function () {};\r\n\t },\r\n\t _mouse_in: function _mouse_in(e) {\r\n\t CustomScroll._last_active_node = this;\r\n\t clearTimeout(this._mouse_out_timer);\r\n\t if (this._custom_scroll_size || CustomScroll._active_drag_area) return;\r\n\t var view = $$(e);\r\n\t if (view && !view.isEnabled()) return;\r\n\t var sizes;\r\n\r\n\t if (this._custom_scroll_view) {\r\n\t //ger related view\r\n\t view = $$(this._custom_scroll_view); //if view was removed, we need not scroll anymore\r\n\r\n\t if (!view) return;\r\n\t sizes = CustomScroll._get_datatable_sizes(view);\r\n\t } else {\r\n\t sizes = {\r\n\t dx: this.scrollWidth,\r\n\t dy: this.scrollHeight,\r\n\t px: this.clientWidth,\r\n\t py: this.clientHeight\r\n\t };\r\n\t sizes._scroll_x = sizes.dx > sizes.px && this._custom_scroll_mode.indexOf(\"x\") != -1;\r\n\t sizes._scroll_y = sizes.dy > sizes.py && this._custom_scroll_mode.indexOf(\"y\") != -1;\r\n\t }\r\n\r\n\t this._custom_scroll_size = sizes;\r\n\r\n\t if (sizes._scroll_x) {\r\n\t sizes._scroll_x_node = CustomScroll._create_scroll(this, \"x\", sizes.dx, sizes.px, \"width\", \"height\");\r\n\t sizes._sx = sizes.px - sizes._scroll_x_node.offsetWidth - 4;\r\n\t sizes._vx = sizes.dx - sizes.px;\r\n\t if (CustomScroll.trackBar) sizes._bar_x = CustomScroll._create_bar(this, \"x\");\r\n\t }\r\n\r\n\t if (sizes._scroll_y) {\r\n\t sizes._scroll_y_node = CustomScroll._create_scroll(this, \"y\", sizes.dy, sizes.py, \"height\", \"width\");\r\n\t sizes._sy = sizes.py - sizes._scroll_y_node.offsetHeight - 4;\r\n\t sizes._vy = sizes.dy - sizes.py;\r\n\t if (CustomScroll.trackBar) sizes._bar_y = CustomScroll._create_bar(this, \"y\");\r\n\t }\r\n\r\n\t CustomScroll._update_scroll(this);\r\n\t },\r\n\t _create_bar: function _create_bar(node, mode) {\r\n\t var bar = create(\"DIV\", {\r\n\t \"webixignore\": \"1\",\r\n\t \"class\": \"webix_c_scroll_bar_\" + mode\r\n\t }, \"\");\r\n\t node.appendChild(bar);\r\n\t return bar;\r\n\t },\r\n\t _adjust_scroll: function _adjust_scroll(node, old, pos$$1) {\r\n\t var config = node._custom_scroll_size;\r\n\t var view = node._custom_scroll_view;\r\n\t if (view) view = $$(view);\r\n\r\n\t if (config._scroll_x_node == node._scroll_drag_enabled) {\r\n\t var next = (pos$$1.x - old.x) * config._vx / config._sx;\r\n\t if (view) view._x_scroll.scrollTo(view._scrollLeft + next);else CustomScroll._set_scroll_value(node, \"scrollLeft\", next);\r\n\t }\r\n\r\n\t if (config._scroll_y_node == node._scroll_drag_enabled) {\r\n\t var _next = (pos$$1.y - old.y) * config._vy / config._sy;\r\n\r\n\t if (view) view._y_scroll.scrollTo(view._scrollTop + _next);else CustomScroll._set_scroll_value(node, \"scrollTop\", _next);\r\n\t }\r\n\r\n\t node._scroll_drag_pos = pos$$1;\r\n\r\n\t CustomScroll._update_scroll(node);\r\n\t },\r\n\t _get_datatable_sizes: function _get_datatable_sizes(view) {\r\n\t var sizes = {};\r\n\r\n\t if (view._x_scroll && view._settings.scrollX) {\r\n\t sizes.dx = view._x_scroll.getSize();\r\n\t sizes.px = view._x_scroll._last_set_size || 1;\r\n\t sizes._scroll_x = sizes.dx - sizes.px > 1;\r\n\t }\r\n\r\n\t if (view._y_scroll && view._settings.scrollY) {\r\n\t sizes.dy = view._y_scroll.getSize();\r\n\t sizes.py = view._y_scroll._last_set_size || 1;\r\n\t sizes._scroll_y = sizes.dy - sizes.py > 1;\r\n\t }\r\n\r\n\t return sizes;\r\n\t },\r\n\t _mouse_out: function _mouse_out() {\r\n\t clearTimeout(this._mouse_out_timer);\r\n\t this._mouse_out_timer = delay(CustomScroll._mouse_out_timed, this, [], 200);\r\n\t },\r\n\t _removeScroll: function _removeScroll(scroll) {\r\n\t if (scroll) {\r\n\t remove(scroll);\r\n\r\n\t if (scroll._webix_event_sc1) {\r\n\t eventRemove(scroll._webix_event_sc1);\r\n\t eventRemove(scroll._webix_event_sc2);\r\n\t }\r\n\t }\r\n\t },\r\n\t _mouse_out_timed: function _mouse_out_timed() {\r\n\t if (this._custom_scroll_size) {\r\n\t if (this._scroll_drag_enabled) {\r\n\t this._scroll_drag_released = true;\r\n\t return;\r\n\t }\r\n\r\n\t var sizes = this._custom_scroll_size;\r\n\r\n\t CustomScroll._removeScroll(sizes._scroll_x_node);\r\n\r\n\t CustomScroll._removeScroll(sizes._scroll_y_node);\r\n\r\n\t removeCss(document.body, \"webix_noselect\");\r\n\r\n\t if (sizes._bar_x) {\r\n\t remove(sizes._bar_x);\r\n\t }\r\n\r\n\t if (sizes._bar_y) {\r\n\t remove(sizes._bar_y);\r\n\t }\r\n\r\n\t this._custom_scroll_size = null;\r\n\t }\r\n\t },\r\n\t _mouse_wheel: function _mouse_wheel(e) {\r\n\t var sizes = this._custom_scroll_size;\r\n\t var delta = e.wheelDelta / -40;\r\n\t var toblock = true;\r\n\t if (!delta && e.detail && isUndefined(e.wheelDelta)) delta = e.detail;\r\n\r\n\t if (sizes) {\r\n\t if (sizes._scroll_x_node && (e.wheelDeltaX || delta && !sizes._scroll_y_node)) {\r\n\t var x_dir = e.wheelDeltaX / -40 || delta; //see below\r\n\r\n\t toblock = CustomScroll._set_scroll_value(this, \"scrollLeft\", x_dir * CustomScroll.scrollStep);\r\n\t } else if (delta && sizes._scroll_y_node) {\r\n\t //lesser flickering of scroll in IE\r\n\t //also prevent scrolling outside of borders because of scroll-html-elements\r\n\t toblock = CustomScroll._set_scroll_value(this, \"scrollTop\", delta * CustomScroll.scrollStep);\r\n\t }\r\n\t }\r\n\r\n\t CustomScroll._update_scroll(this);\r\n\r\n\t if (toblock !== false) return preventEvent(e);\r\n\t },\r\n\t _set_scroll_value: function _set_scroll_value(node, pose, value) {\r\n\t var sizes = node._custom_scroll_size;\r\n\t var max_scroll = pose == \"scrollLeft\" ? sizes.dx - sizes.px : sizes.dy - sizes.py;\r\n\t var now = node[pose];\r\n\t if (now + value > max_scroll) value = max_scroll - now;\r\n\t if (!value || now + value < 0 && now === 0) return false;\r\n\r\n\t if (env.isIE) {\r\n\t CustomScroll._update_scroll(node, pose, value + now);\r\n\r\n\t node[pose] += value;\r\n\t } else node[pose] += value;\r\n\r\n\t return true;\r\n\t },\r\n\t _create_scroll: function _create_scroll(node, mode, dy, py, dim) {\r\n\t var scroll = create(\"DIV\", {\r\n\t \"webixignore\": \"1\",\r\n\t \"class\": \"webix_c_scroll_\" + mode\r\n\t }, \"
\");\r\n\t scroll.style[dim] = Math.max(py * py / dy - 7, 40) + \"px\";\r\n\t node.style.position = \"relative\";\r\n\t node.appendChild(scroll);\r\n\t node._webix_event_sc1 = event$1(scroll, \"mousedown\", CustomScroll._scroll_drag(node));\r\n\t node._webix_event_sc2 = event$1(document.body, \"mouseup\", bind(CustomScroll._scroll_drop, node));\r\n\t return scroll;\r\n\t },\r\n\t _scroll_drag: function _scroll_drag(node) {\r\n\t return function (e) {\r\n\t addCss(document.body, \"webix_noselect\", 1);\r\n\t this.className += \" webix_scroll_active\";\r\n\t CustomScroll._active_drag_area = node;\r\n\t node._scroll_drag_enabled = this;\r\n\t node._scroll_drag_pos = pos(e);\r\n\t };\r\n\t },\r\n\t _scroll_drop: function _scroll_drop() {\r\n\t if (this._scroll_drag_enabled) {\r\n\t removeCss(document.body, \"webix_noselect\");\r\n\t this._scroll_drag_enabled.className = this._scroll_drag_enabled.className.toString().replace(\" webix_scroll_active\", \"\");\r\n\t this._scroll_drag_enabled = false;\r\n\t CustomScroll._active_drag_area = 0;\r\n\r\n\t if (this._scroll_drag_released) {\r\n\t CustomScroll._mouse_out_timed.call(this);\r\n\r\n\t this._scroll_drag_released = false;\r\n\t }\r\n\t }\r\n\t },\r\n\t _update_scroll: function _update_scroll(node, pose, value) {\r\n\t var sizes = node._custom_scroll_size;\r\n\r\n\t if (sizes && (sizes._scroll_x_node || sizes._scroll_y_node)) {\r\n\t var view = node._custom_scroll_view;\r\n\t var left_scroll = pose == \"scrollLeft\" ? value : node.scrollLeft;\r\n\t var left = view ? $$(view)._scrollLeft : left_scroll;\r\n\t var shift_left = view ? 0 : left;\r\n\t var top_scroll = pose == \"scrollTop\" ? value : node.scrollTop;\r\n\t var top = view ? $$(view)._scrollTop : top_scroll;\r\n\t var shift_top = view ? 0 : top;\r\n\r\n\t if (sizes._scroll_x_node) {\r\n\t sizes._scroll_x_node.style.bottom = 1 - shift_top + \"px\";\r\n\t sizes._scroll_x_node.style.left = Math.round(sizes._sx * left / (sizes.dx - sizes.px)) + shift_left + 1 + \"px\";\r\n\r\n\t if (sizes._bar_x) {\r\n\t sizes._bar_x.style.bottom = 1 - shift_top + \"px\";\r\n\t sizes._bar_x.style.left = shift_left + \"px\";\r\n\t }\r\n\t }\r\n\r\n\t if (sizes._scroll_y_node) {\r\n\t sizes._scroll_y_node.style.right = 0 - shift_left + \"px\";\r\n\t sizes._scroll_y_node.style.top = Math.round(sizes._sy * top / (sizes.dy - sizes.py)) + shift_top + 1 + \"px\";\r\n\r\n\t if (sizes._bar_y) {\r\n\t sizes._bar_y.style.right = 0 - shift_left + \"px\";\r\n\t sizes._bar_y.style.top = shift_top + \"px\";\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _setDataHandler: function _setDataHandler(view) {\r\n\t if (view.data && view.data.attachEvent) view.data.attachEvent(\"onStoreUpdated\", function () {\r\n\t var node = CustomScroll._last_active_node;\r\n\t if (node && view.$view.contains(node)) CustomScroll.resize();\r\n\t });\r\n\t }\r\n\t};\r\n\r\n\tvar DataMarks = {\r\n\t addCss: function addCss(id, css, silent) {\r\n\t if (!this.addRowCss && !silent) {\r\n\t if (!this.hasCss(id, css)) {\r\n\t var node = this.getItemNode(id);\r\n\r\n\t if (node) {\r\n\t node.className += \" \" + css;\r\n\t silent = true;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return this.data.addMark(id, css, 1, 1, silent);\r\n\t },\r\n\t removeCss: function removeCss(id, css, silent) {\r\n\t if (!this.addRowCss && !silent) {\r\n\t if (this.hasCss(id, css)) {\r\n\t var node = this.getItemNode(id);\r\n\r\n\t if (node) {\r\n\t node.className = node.className.replace(css, \"\").replace(\" \", \" \");\r\n\t silent = true;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return this.data.removeMark(id, css, 1, silent);\r\n\t },\r\n\t hasCss: function hasCss(id, mark) {\r\n\t return this.data.getMark(id, mark);\r\n\t },\r\n\t clearCss: function clearCss(css, silent) {\r\n\t return this.data.clearMark(css, 1, silent);\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t\tBehavior:DataMove - allows to move and copy elements, heavily relays on DataStore.move\r\n\t\t@export\r\n\t\t\tcopy\r\n\t\t\tmove\r\n\t*/\r\n\r\n\tvar DataMove = {\r\n\t //creates a copy of the item\r\n\t copy: function copy$$1(sid, tindex, tobj, details) {\r\n\t details = details || {};\r\n\t var new_id = details.newId || sid;\r\n\t tobj = tobj || this;\r\n\t var data = this.getItem(sid);\r\n\t assert(data, \"Incorrect ID in DataMove::copy\"); //make data conversion between objects\r\n\r\n\t if (tobj) data = tobj._externalData(data); //adds new element same as original\r\n\r\n\t return tobj.data.add(tobj._externalData(data, new_id), tindex, details.parent || 0);\r\n\t },\r\n\t _next_move_index: function _next_move_index(nid, next, source) {\r\n\t if (next && nid) {\r\n\t var new_index = this.getIndexById(nid);\r\n\t return new_index + (source == this && source.getIndexById(next) < new_index ? 0 : 1);\r\n\t }\r\n\t },\r\n\t //move item to the new position\r\n\t move: function move(sid, tindex, tobj, details) {\r\n\t details = details || {};\r\n\t var new_id = details.newId || sid;\r\n\t tobj = tobj || this;\r\n\t assert(tobj.data, \"moving attempt to component without datastore\");\r\n\t if (!tobj.data) return; //can process an arrya - it allows to use it from onDrag \r\n\r\n\t if (isArray(sid)) {\r\n\t //block separate repaint operations\r\n\t if (sid.length > 3) //heuristic value, duplicated below\r\n\t this.$blockRender = tobj.$blockRender = true;\r\n\r\n\t for (var i = 0; i < sid.length; i++) {\r\n\t //increase index for each next item in the set, so order of insertion will be equal to order in the array\r\n\t var _nid = this.move(sid[i], tindex, tobj, details);\r\n\r\n\t tindex = tobj._next_move_index(_nid, sid[i + 1], this);\r\n\t }\r\n\r\n\t this.$blockRender = tobj.$blockRender = false;\r\n\r\n\t if (sid.length > 3) {\r\n\t //repaint whole component\r\n\t this.refresh();\r\n\t if (tobj != this) tobj.refresh();\r\n\t }\r\n\r\n\t return;\r\n\t }\r\n\r\n\t var nid = sid; //id after moving\r\n\r\n\t var data = this.getItem(sid);\r\n\t assert(data, \"Incorrect ID in DataMove::move\");\r\n\r\n\t if (!tobj || tobj == this) {\r\n\t if (tindex < 0) tindex = this.data.order.length - 1;\r\n\t this.data.move(this.getIndexById(sid), tindex); //move inside the same object\r\n\r\n\t this.data.callEvent(\"onDataMove\", [sid, tindex, null, this.data.order[tindex + 1]]);\r\n\t } else {\r\n\t //copy to the new object\r\n\t nid = tobj.data.add(tobj._externalData(data, new_id), tindex, details.parent || 0);\r\n\t this.data.remove(sid); //delete in old object\r\n\t }\r\n\r\n\t return nid; //return ID of item after moving\r\n\t },\r\n\t //move item on one position up\r\n\t moveUp: function moveUp(id, step) {\r\n\t return this.move(id, this.getIndexById(id) - (step || 1));\r\n\t },\r\n\t //move item on one position down\r\n\t moveDown: function moveDown(id, step) {\r\n\t return this.moveUp(id, (step || 1) * -1);\r\n\t },\r\n\t //move item to the first position\r\n\t moveTop: function moveTop(id) {\r\n\t return this.move(id, 0);\r\n\t },\r\n\t //move item to the last position\r\n\t moveBottom: function moveBottom(id) {\r\n\t return this.move(id, this.data.count() - 1);\r\n\t },\r\n\r\n\t /*\r\n\t \tthis is a stub for future functionality\r\n\t \tcurrently it just makes a copy of data object, which is enough for current situation\r\n\t */\r\n\t _externalData: function _externalData(data, id) {\r\n\t var newdata = exports.extend({}, data);\r\n\t newdata.id = !id || this.data.pull[id] ? uid() : id;\r\n\t newdata.$template = null;\r\n\t if (this._settings.externalData) newdata = this._settings.externalData.call(this, newdata, id, data);\r\n\t return newdata;\r\n\t }\r\n\t};\r\n\r\n\tvar rules = {\r\n\t isEmail: function isEmail(value) {\r\n\t return /\\S+@[^@\\s]+\\.[^@\\s]+$/.test((value || \"\").toString());\r\n\t },\r\n\t isNumber: function isNumber(value) {\r\n\t return parseFloat(value) == value;\r\n\t },\r\n\t isChecked: function isChecked(value) {\r\n\t return !!value || value === \"0\";\r\n\t },\r\n\t isNotEmpty: function isNotEmpty(value) {\r\n\t return value === 0 || value;\r\n\t }\r\n\t};\r\n\r\n\tvar ValidateData = {\r\n\t $init: function $init() {\r\n\t if (this._events) this.attachEvent(\"onChange\", this.clearValidation);\r\n\t },\r\n\t clearValidation: function clearValidation() {\r\n\t if (this.elements) {\r\n\t for (var id in this.elements) {\r\n\t this._clear_invalid(id);\r\n\t }\r\n\t }\r\n\t },\r\n\t validate: function validate(mode, obj) {\r\n\t assert(this.callEvent, \"using validate for eventless object\");\r\n\t this.callEvent(\"onBeforeValidate\", []);\r\n\t var failed = this._validate_details = {}; //optimistic by default :) \r\n\r\n\t var result = true;\r\n\t var rules$$1 = this._settings.rules;\r\n\t var isHidden = this.isVisible && !this.isVisible();\r\n\t var validateHidden = mode && mode.hidden;\r\n\t var validateDisabled = mode && mode.disabled; //prevent validation of hidden elements\r\n\r\n\t var elements = {},\r\n\t hidden = {};\r\n\r\n\t for (var i in this.elements) {\r\n\t var name = this.elements[i].config.name; //we are ignoring hidden and disabled fields during validation\r\n\t //if mode doesn not instruct us otherwise\r\n\t //if form itself is hidden, we can't separate hidden fiels,\r\n\t //so we will vaidate all fields\r\n\r\n\t if ((isHidden || this.elements[i].isVisible() || validateHidden) && (this.elements[i].isEnabled() || validateDisabled)) elements[name] = this.elements[i];else {\r\n\t hidden[name] = true;\r\n\t }\r\n\t }\r\n\r\n\t if (rules$$1 || elements) if (!obj && this.getValues) obj = this.getValues();\r\n\r\n\t if (rules$$1) {\r\n\t //complex rule, which may chcek all properties of object\r\n\t if (rules$$1.$obj) result = this._validate(rules$$1.$obj, obj, obj, \"\") && result; //all - applied to all fields\r\n\r\n\t var all = rules$$1.$all;\r\n\t var data = obj;\r\n\t if (this._settings.complexData) data = CodeParser.collapseNames(obj);\r\n\t if (all) for (var _key in obj) {\r\n\t if (hidden[_key]) continue;\r\n\r\n\t var subresult = this._validate(all, data[_key], obj, _key);\r\n\r\n\t if (!subresult) failed[_key] = true;\r\n\t result = subresult && result;\r\n\t } //per-field rules\r\n\r\n\t for (var _key2 in rules$$1) {\r\n\t if (hidden[_key2]) continue;\r\n\r\n\t if (_key2.indexOf(\"$\") !== 0 && !failed[_key2]) {\r\n\t assert(rules$$1[_key2], \"Invalid rule for:\" + _key2);\r\n\r\n\t var _subresult = this._validate(rules$$1[_key2], data[_key2], obj, _key2);\r\n\r\n\t if (!_subresult) failed[_key2] = true;\r\n\t result = _subresult && result;\r\n\t }\r\n\t }\r\n\t } //check personal validation rules\r\n\r\n\r\n\t if (elements) {\r\n\t for (var key in elements) {\r\n\t if (failed[key]) continue;\r\n\t var subview = elements[key];\r\n\r\n\t if (subview.validate) {\r\n\t var _subresult2 = subview.validate();\r\n\r\n\t result = _subresult2 && result;\r\n\t if (!_subresult2) failed[key] = true;\r\n\t } else {\r\n\t var input = subview._settings;\r\n\r\n\t if (input) {\r\n\t //ignore non webix inputs\r\n\t var validator = input.validate;\r\n\t if (!validator && input.required) validator = rules$$1.isNotEmpty;\r\n\r\n\t if (validator) {\r\n\t var _subresult3 = this._validate(validator, obj[key], obj, key);\r\n\r\n\t if (!_subresult3) failed[key] = true;\r\n\t result = _subresult3 && result;\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterValidation\", [result, this._validate_details]);\r\n\t return result;\r\n\t },\r\n\t _validate: function _validate(rule, data, obj, key) {\r\n\t if (typeof rule == \"string\") rule = rules[rule];\r\n\r\n\t if (rule.call(this, data, obj, key)) {\r\n\t if (this.callEvent(\"onValidationSuccess\", [key, obj]) && this._clear_invalid) this._clear_invalid(key);\r\n\t return true;\r\n\t } else {\r\n\t if (this.callEvent(\"onValidationError\", [key, obj]) && this._mark_invalid) this._mark_invalid(key);\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\t};\r\n\r\n\tvar _pull = {};\r\n\tfunction dp(name, getOnly) {\r\n\t if (_typeof(name) == \"object\" && name._settings) name = name._settings.id;\r\n\t if (_pull[name] || getOnly) return _pull[name];\r\n\t if (typeof name == \"string\" || typeof name == \"number\") name = {\r\n\t master: $$(name)\r\n\t };\r\n\t var dp = new DataProcessor(name);\r\n\t var masterId = dp._settings.master._settings.id;\r\n\t _pull[masterId] = dp;\r\n\t $$(masterId).attachEvent(\"onDestruct\", function () {\r\n\t _pull[this._settings.id] = null;\r\n\t delete _pull[this._settings.id];\r\n\t });\r\n\t return dp;\r\n\t}\r\n\tdefine(\"dp\", dp);\r\n\r\n\tdp.$$ = function (id) {\r\n\t return _pull[id];\r\n\t};\r\n\r\n\tvar DataProcessor = exports.proto({\r\n\t defaults: {\r\n\t autoupdate: true,\r\n\t updateFromResponse: false,\r\n\t mode: \"post\",\r\n\t operationName: \"webix_operation\",\r\n\t trackMove: false\r\n\t },\r\n\r\n\t /*! constructor\r\n\t **/\r\n\t $init: function $init() {\r\n\t this.reset();\r\n\t this._ignore = false;\r\n\t this.name = \"DataProcessor\";\r\n\t this.$ready.push(this._after_init_call);\r\n\t },\r\n\t reset: function reset() {\r\n\t this._updates = [];\r\n\t },\r\n\t url_setter: function url_setter(value) {\r\n\t /*\r\n\t \twe can use simple url or mode->url\r\n\t */\r\n\t var mode = \"\";\r\n\r\n\t if (typeof value == \"string\") {\r\n\t var parts = value.split(\"->\");\r\n\r\n\t if (parts.length > 1) {\r\n\t value = parts[1];\r\n\t mode = parts[0];\r\n\t }\r\n\t } else if (value && value.mode) {\r\n\t mode = value.mode;\r\n\t value = value.url;\r\n\t }\r\n\r\n\t if (mode) return proxy$b(mode, value);\r\n\t return value;\r\n\t },\r\n\t master_setter: function master_setter(value) {\r\n\t var store = value;\r\n\t if (value.name != \"DataStore\") store = value.data;\r\n\t this._settings.store = store;\r\n\t return value;\r\n\t },\r\n\r\n\t /*! attaching onStoreUpdated event\r\n\t **/\r\n\t _after_init_call: function _after_init_call() {\r\n\t assert(this._settings.store, \"store or master need to be defined for the dataprocessor\");\r\n\r\n\t this._settings.store.attachEvent(\"onStoreUpdated\", bind(this._onStoreUpdated, this));\r\n\r\n\t this._settings.store.attachEvent(\"onDataMove\", bind(this._onDataMove, this));\r\n\t },\r\n\t ignore: function ignore(code, master) {\r\n\t var temp = this._ignore;\r\n\t this._ignore = true;\r\n\t code.call(master || this);\r\n\t this._ignore = temp;\r\n\t },\r\n\t off: function off() {\r\n\t this._ignore = true;\r\n\t },\r\n\t on: function on() {\r\n\t this._ignore = false;\r\n\t },\r\n\t _copy_data: function _copy_data(source) {\r\n\t var obj = {};\r\n\r\n\t for (var key in source) {\r\n\t if (key.indexOf(\"$\") !== 0) obj[key] = source[key];\r\n\t }\r\n\r\n\t return obj;\r\n\t },\r\n\t save: function save(id, operation, obj) {\r\n\t operation = operation || \"update\";\r\n\r\n\t this._save_inner(id, obj || this._settings.store.getItem(id), operation);\r\n\t },\r\n\t _save_inner: function _save_inner(id, obj, operation) {\r\n\t if (_typeof(id) == \"object\") id = id.toString();\r\n\t if (!id || this._ignore === true || !operation || operation == \"paint\") return true;\r\n\t var store = this._settings.store;\r\n\t if (store && store._scheme_serialize) obj = store._scheme_serialize(obj);\r\n\t var update = {\r\n\t id: id,\r\n\t data: this._copy_data(obj),\r\n\t operation: operation\r\n\t }; //save parent id\r\n\r\n\t if (!isUndefined(obj.$parent)) update.data.parent = obj.$parent;\r\n\r\n\t if (update.operation != \"delete\") {\r\n\t //prevent saving of not-validated records\r\n\t var master = this._settings.master;\r\n\t if (master && master.data && master.data.getMark && master.data.getMark(id, \"webix_invalid\")) update._invalid = true;\r\n\t if (!this.validate(null, update.data)) update._invalid = true;\r\n\t }\r\n\r\n\t if (this._check_unique(update)) this._updates.push(update);\r\n\t if (this._settings.autoupdate) this.send();\r\n\t return true;\r\n\t },\r\n\t _onDataMove: function _onDataMove(sid, tindex, parent, targetid) {\r\n\t if (this._settings.trackMove) {\r\n\t var obj = copy(this._settings.store.getItem(sid));\r\n\t obj.webix_move_index = tindex;\r\n\t obj.webix_move_id = targetid;\r\n\t obj.webix_move_parent = parent;\r\n\r\n\t this._save_inner(sid, obj, \"order\");\r\n\t }\r\n\t },\r\n\t _onStoreUpdated: function _onStoreUpdated(id, obj, operation) {\r\n\t switch (operation) {\r\n\t case \"save\":\r\n\t operation = \"update\";\r\n\t break;\r\n\r\n\t case \"update\":\r\n\t operation = \"update\";\r\n\t break;\r\n\r\n\t case \"add\":\r\n\t operation = \"insert\";\r\n\t break;\r\n\r\n\t case \"delete\":\r\n\t operation = \"delete\";\r\n\t break;\r\n\r\n\t default:\r\n\t return true;\r\n\t }\r\n\r\n\t return this._save_inner(id, obj, operation);\r\n\t },\r\n\t _check_unique: function _check_unique(check) {\r\n\t for (var i = 0; i < this._updates.length; i++) {\r\n\t var one = this._updates[i];\r\n\r\n\t if (one.id == check.id) {\r\n\t if (check.operation == \"delete\") {\r\n\t if (one.operation == \"insert\") this._updates.splice(i, 1);else one.operation = \"delete\";\r\n\t }\r\n\r\n\t one.data = check.data;\r\n\t one._invalid = check._invalid;\r\n\t return false;\r\n\t }\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t send: function send() {\r\n\t this._sendData();\r\n\t },\r\n\t _sendData: function _sendData() {\r\n\t if (!this._settings.url) return;\r\n\t var marked = this._updates;\r\n\t var to_send = [];\r\n\t var url = this._settings.url;\r\n\r\n\t for (var i = 0; i < marked.length; i++) {\r\n\t var tosave = marked[i];\r\n\t if (tosave._in_progress) continue;\r\n\t if (tosave._invalid) continue;\r\n\t var id = tosave.id;\r\n\t var operation = tosave.operation;\r\n\t var precise_url = _typeof(url) == \"object\" && !url.$proxy ? url[operation] : url;\r\n\t var proxy = precise_url && (precise_url.$proxy || typeof precise_url === \"function\");\r\n\t if (!precise_url) continue;\r\n\t if (this._settings.store._scheme_save) this._settings.store._scheme_save(tosave.data);\r\n\t if (!this.callEvent(\"onBefore\" + operation, [id, tosave])) continue;\r\n\t tosave._in_progress = true;\r\n\t if (!this.callEvent(\"onBeforeDataSend\", [tosave])) return;\r\n\t tosave.data = this._updatesData(tosave.data);\r\n\r\n\t var callback = this._send_callback({\r\n\t id: tosave.id,\r\n\t status: tosave.operation\r\n\t });\r\n\r\n\t if (precise_url.$proxy) {\r\n\t if (precise_url.save) precise_url.save(this.config.master, tosave, this, callback);\r\n\t to_send.push(tosave);\r\n\t } else {\r\n\t if (operation == \"insert\") delete tosave.data.id;\r\n\r\n\t if (proxy) {\r\n\t //promise\r\n\t precise_url(tosave.id, tosave.operation, tosave.data).then(function (data) {\r\n\t if (data && typeof data.json == \"function\") data = data.json();\r\n\t callback.success(\"\", data, -1);\r\n\t }, function (error) {\r\n\t callback.error(\"\", null, error);\r\n\t });\r\n\t } else {\r\n\t //normal url\r\n\t tosave.data[this._settings.operationName] = operation;\r\n\r\n\t this._send(precise_url, tosave.data, this._settings.mode, operation, callback);\r\n\t }\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterDataSend\", [tosave]);\r\n\t }\r\n\r\n\t if (url.$proxy && url.saveAll && to_send.length) url.saveAll(this.config.master, to_send, this, this._send_callback({}));\r\n\t },\r\n\r\n\t /*! process updates list to POST and GET params according dataprocessor protocol\r\n\t *\t@param updates\r\n\t *\t\tlist of objects { id: \"item id\", data: \"data hash\", operation: \"type of operation\"}\r\n\t *\t@return\r\n\t *\t\tobject { post: { hash of post params as name: value }, get: { hash of get params as name: value } }\r\n\t **/\r\n\t _updatesData: function _updatesData(source) {\r\n\t var target = {};\r\n\r\n\t for (var j in source) {\r\n\t if (j.indexOf(\"$\") !== 0) target[j] = source[j];\r\n\t }\r\n\r\n\t return target;\r\n\t },\r\n\r\n\t /*! send dataprocessor query to server\r\n\t *\tand attach event to process result\r\n\t *\t@param url\r\n\t *\t\tserver url\r\n\t *\t@param get\r\n\t *\t\thash of get params\r\n\t *\t@param post\r\n\t *\t\thash of post params\r\n\t *\t@mode\r\n\t *\t\t'post' or 'get'\r\n\t **/\r\n\t _send: function _send(url, post, mode, operation, callback) {\r\n\t assert(url, \"url was not set for DataProcessor\");\r\n\t if (typeof url == \"function\") return url(post, operation, callback);\r\n\t ajax()[mode](url, post, callback);\r\n\t },\r\n\t _send_callback: function _send_callback(id) {\r\n\t var self = this;\r\n\t return {\r\n\t success: function success(t, d, l) {\r\n\t return self._processResult(id, t, d, l);\r\n\t },\r\n\t error: function error(t, d, l) {\r\n\t return self._processError(id, t, d, l);\r\n\t }\r\n\t };\r\n\t },\r\n\t attachProgress: function attachProgress(start, end, error) {\r\n\t this.attachEvent(\"onBeforeDataSend\", start);\r\n\t this.attachEvent(\"onAfterSync\", end);\r\n\t this.attachEvent(\"onAfterSaveError\", error);\r\n\t this.attachEvent(\"onLoadError\", error);\r\n\t },\r\n\t _processError: function _processError(id, text, data, loader) {\r\n\t if (id) this._innerProcessResult(true, id.id, false, id.status, false, {\r\n\t text: text,\r\n\t data: data,\r\n\t loader: loader\r\n\t });else {\r\n\t this.callEvent(\"onLoadError\", arguments);\r\n\t callEvent(\"onLoadError\", [text, data, loader, this]);\r\n\t }\r\n\t },\r\n\t _innerProcessResult: function _innerProcessResult(error, id, newid, status, obj, details) {\r\n\t var master = this._settings.master;\r\n\t var update = this.getItemState(id);\r\n\t update._in_progress = false;\r\n\r\n\t if (error) {\r\n\t if (this.callEvent(\"onBeforeSaveError\", [id, status, obj, details])) {\r\n\t update._invalid = true;\r\n\r\n\t if (this._settings.undoOnError && master._settings.undo) {\r\n\t this.ignore(function () {\r\n\t master.undo(id);\r\n\t });\r\n\t this.setItemState(id, false);\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterSaveError\", [id, status, obj, details]);\r\n\t }\r\n\r\n\t return;\r\n\t } else this.setItemState(id, false); //update from response\r\n\r\n\r\n\t if (newid && id != newid) this._settings.store.changeId(id, newid);\r\n\t if (obj && status != \"delete\" && this._settings.updateFromResponse) this.ignore(function () {\r\n\t this._settings.store.updateItem(newid || id, obj);\r\n\t }); //clean undo history, for the saved record\r\n\r\n\t if (this._settings.undoOnError && master._settings.undo) master.removeUndo(newid || id);\r\n\t this.callEvent(\"onAfterSave\", [obj, id, details]);\r\n\t this.callEvent(\"onAfter\" + status, [obj, id, details]);\r\n\t },\r\n\t processResult: function processResult(state, hash, details) {\r\n\t //compatibility with custom json response\r\n\t var error = hash && (hash.status == \"error\" || hash.status == \"invalid\");\r\n\t var newid = hash ? hash.newid || hash.id : false;\r\n\r\n\t this._innerProcessResult(error, state.id, newid, state.status, hash, details);\r\n\t },\r\n\t // process saving from result\r\n\t _processResult: function _processResult(state, text, data, loader) {\r\n\t this.callEvent(\"onBeforeSync\", [state, text, data, loader]);\r\n\r\n\t if (loader === -1) {\r\n\t //callback from promise\r\n\t this.processResult(state, data, {});\r\n\t } else {\r\n\t var proxy = this._settings.url;\r\n\t if (proxy.$proxy && proxy.result) proxy.result(state, this._settings.master, this, text, data, loader);else {\r\n\t var hash;\r\n\r\n\t if (text) {\r\n\t hash = data.json(); //invalid response\r\n\r\n\t if (text && (hash === null || typeof hash == \"undefined\")) hash = {\r\n\t status: \"error\"\r\n\t };\r\n\t }\r\n\r\n\t this.processResult(state, hash, {\r\n\t text: text,\r\n\t data: data,\r\n\t loader: loader\r\n\t });\r\n\t }\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterSync\", [state, text, data, loader]);\r\n\t },\r\n\r\n\t /*! if it's defined escape function - call it\r\n\t *\t@param value\r\n\t *\t\tvalue to escape\r\n\t *\t@return\r\n\t *\t\tescaped value\r\n\t **/\r\n\t escape: function escape(value) {\r\n\t if (this._settings.escape) return this._settings.escape(value);else return encodeURIComponent(value);\r\n\t },\r\n\t getState: function getState() {\r\n\t if (!this._updates.length) return false;\r\n\r\n\t for (var i = this._updates.length - 1; i >= 0; i--) {\r\n\t if (this._updates[i]._in_progress) return \"saving\";\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t getItemState: function getItemState(id) {\r\n\t var index = this._get_stack_index(id);\r\n\r\n\t return this._updates[index] || null;\r\n\t },\r\n\t setItemState: function setItemState(id, state) {\r\n\t if (state) this.save(id, state);else {\r\n\t var index = this._get_stack_index(id);\r\n\r\n\t if (index > -1) this._updates.splice(index, 1);\r\n\t }\r\n\t },\r\n\t _get_stack_index: function _get_stack_index(id) {\r\n\t var index = -1;\r\n\r\n\t for (var i = 0; i < this._updates.length; i++) {\r\n\t if (this._updates[i].id == id) {\r\n\t index = i;\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t return index;\r\n\t }\r\n\t}, Settings, EventSystem, ValidateData);\r\n\r\n\t/*\r\n\t\tDataStore is not a behavior, it standalone object, which represents collection of data.\r\n\t\tCall provideAPI to map data API\r\n\r\n\t\t@export\r\n\t\t\texists\r\n\t\t\tgetIdByIndex\r\n\t\t\tgetIndexById\r\n\t\t\tget\r\n\t\t\tset\r\n\t\t\trefresh\r\n\t\t\tcount\r\n\t\t\tsort\r\n\t\t\tfilter\r\n\t\t\tnext\r\n\t\t\tprevious\r\n\t\t\tclearAll\r\n\t\t\tfirst\r\n\t\t\tlast\r\n\t*/\r\n\r\n\tfunction DataStore() {\r\n\t this.name = \"DataStore\";\r\n\t exports.extend(this, EventSystem);\r\n\t this.setDriver(\"json\"); //default data source is an\r\n\r\n\t this.pull = {}; //hash of IDs\r\n\r\n\t this.order = toArray(); //order of IDs\r\n\r\n\t this._marks = {};\r\n\t}\r\n\r\n\tDataStore.prototype = {\r\n\t //defines type of used data driver\r\n\t //data driver is an abstraction other different data formats - xml, json, csv, etc.\r\n\t setDriver: function setDriver(type) {\r\n\t assert(DataDriver[type], \"incorrect DataDriver\");\r\n\t this.driver = DataDriver[type];\r\n\t },\r\n\t //process incoming raw data\r\n\t _parse: function _parse(data) {\r\n\t this.callEvent(\"onParse\", [this.driver, data]);\r\n\t if (this._filter_order) this.filter(); //get size and position of data\r\n\r\n\t var info = this.driver.getInfo(data); //generated by connectors only\r\n\r\n\t if (info.key) state.securityKey = info.key;\r\n\t if (info.config) this.callEvent(\"onServerConfig\", [info.config]);\r\n\t var options = this.driver.getOptions(data);\r\n\t if (options) this.callEvent(\"onServerOptions\", [options]); //get array of records\r\n\r\n\t var recs = this.driver.getRecords(data);\r\n\r\n\t this._inner_parse(info, recs); //in case of tree store we may want to group data\r\n\r\n\r\n\t if (this._scheme_group && this._group_processing && !this._not_grouped_order) this._group_processing(this._scheme_group); //optional data sorting\r\n\r\n\t if (this._scheme_sort) {\r\n\t this.blockEvent();\r\n\t this.sort(this._scheme_sort);\r\n\t this.unblockEvent();\r\n\t }\r\n\r\n\t this.callEvent(\"onStoreLoad\", [this.driver, data]); //repaint self after data loading\r\n\r\n\t this.refresh();\r\n\t },\r\n\t _inner_parse: function _inner_parse(info, recs) {\r\n\t var from = info.from;\r\n\t var subload = true;\r\n\t var marks = false; //some data is loaded and new data doesn't have \"pos\" - assuming update\r\n\r\n\t if (!from && from !== 0 && this.order[0]) {\r\n\t if (this._removeMissed) {\r\n\t //update mode, create kill list\r\n\t marks = {};\r\n\r\n\t for (var i = 0; i < this.order.length; i++) {\r\n\t marks[this.order[i]] = true;\r\n\t }\r\n\t }\r\n\r\n\t subload = false;\r\n\t from = this.order.length;\r\n\t } else from = (from || 0) * 1;\r\n\r\n\t var j = 0;\r\n\r\n\t for (var _i = 0; _i < recs.length; _i++) {\r\n\t //get hash of details for each record\r\n\t var temp = this.driver.getDetails(recs[_i]);\r\n\t var id = this.id(temp); //generate ID for the record\r\n\r\n\t if (!this.pull[id]) {\r\n\t //if such ID already exists - update instead of insert\r\n\t this.order[j + from] = id;\r\n\t j++;\r\n\t } else if (subload && this.order[j + from]) j++;\r\n\r\n\t if (this.pull[id]) {\r\n\t exports.extend(this.pull[id], temp, true); //add only new properties\r\n\r\n\t if (this._scheme_update) this._scheme_update(this.pull[id]); //update mode, remove item from kill list\r\n\r\n\t if (marks) delete marks[id];\r\n\t } else {\r\n\t this.pull[id] = temp;\r\n\t if (this._scheme_init) this._scheme_init(temp);\r\n\t }\r\n\t } //update mode, delete items which are not existing in the new xml\r\n\r\n\r\n\t if (marks) {\r\n\t this.blockEvent();\r\n\r\n\t for (var delid in marks) {\r\n\t this.remove(delid);\r\n\t }\r\n\r\n\t this.unblockEvent();\r\n\t }\r\n\r\n\t var endpos = info.size * 1;\r\n\r\n\t if (endpos) {\r\n\t if (!this.order[endpos - 1]) this.order[endpos - 1] = undefined;\r\n\t if (endpos < this.order.length) this.order = this.order.slice(0, endpos);\r\n\t }\r\n\t },\r\n\t //generate id for data object\r\n\t id: function id(data) {\r\n\t return data.id || (data.id = uid());\r\n\t },\r\n\t changeId: function changeId(old, newid) {\r\n\t //assert(this.pull[old],\"Can't change id, for non existing item: \"+old);\r\n\t if (old == newid) return;\r\n\t if (this.pull[old]) this.pull[newid] = this.pull[old];\r\n\t this.pull[newid].id = newid;\r\n\t this.order[this.order.find(old)] = newid;\r\n\t if (this._filter_order) this._filter_order[this._filter_order.find(old)] = newid;\r\n\r\n\t if (this._marks[old]) {\r\n\t this._marks[newid] = this._marks[old];\r\n\t delete this._marks[old];\r\n\t }\r\n\r\n\t this.callEvent(\"onIdChange\", [old, newid]);\r\n\t if (this._render_change_id) this._render_change_id(old, newid);\r\n\t delete this.pull[old];\r\n\t },\r\n\t //get data from hash by id\r\n\t getItem: function getItem(id) {\r\n\t return this.pull[id];\r\n\t },\r\n\t //assigns data by id\r\n\t updateItem: function updateItem(id, update, mode) {\r\n\t if (_typeof(id) === \"object\") id = id.toString();\r\n\t var data = this.getItem(id);\r\n\t var old = null; //check is change tracking active\r\n\r\n\t var changeTrack = this.hasEvent(\"onDataUpdate\");\r\n\t assert(data, \"Invalid ID for updateItem\");\r\n\t assert(!update || !update.id || update.id == id, \"Attempt to change ID in updateItem\");\r\n\r\n\t if (!isUndefined(update) && data !== update) {\r\n\t //preserve original object\r\n\t if (changeTrack) old = copy(data);\r\n\t id = data.id; //preserve id\r\n\r\n\t exports.extend(data, update, true);\r\n\t data.id = id;\r\n\t }\r\n\r\n\t if (this._scheme_update) this._scheme_update(data);\r\n\t this.callEvent(\"onStoreUpdated\", [id, data, mode || \"update\"]);\r\n\t if (changeTrack) this.callEvent(\"onDataUpdate\", [id, data, old]);\r\n\t },\r\n\t //sends repainting signal\r\n\t refresh: function refresh(id) {\r\n\t if (this._skip_refresh) return;\r\n\r\n\t if (id) {\r\n\t if (this.exists(id)) this.callEvent(\"onStoreUpdated\", [id, this.pull[id], \"paint\"]);\r\n\t } else this.callEvent(\"onStoreUpdated\", [null, null, null]);\r\n\t },\r\n\t silent: function silent(code, master) {\r\n\t this._skip_refresh = true;\r\n\t code.call(master || this);\r\n\t this._skip_refresh = false;\r\n\t },\r\n\t //converts range IDs to array of all IDs between them\r\n\t getRange: function getRange(from, to) {\r\n\t //if some point is not defined - use first or last id\r\n\t //BEWARE - do not use empty or null ID\r\n\t if (from) from = this.getIndexById(from);else from = this.$min || this.startOffset || 0;\r\n\t if (to) to = this.getIndexById(to);else {\r\n\t to = this.$max === 0 ? 0 : Math.min(this.$max ? this.$max - 1 : this.endOffset || Infinity, this.count() - 1);\r\n\t if (to < 0) to = 0; //we have not data in the store\r\n\t }\r\n\r\n\t if (from > to) {\r\n\t //can be in case of backward shift-selection\r\n\t var a = to;\r\n\t to = from;\r\n\t from = a;\r\n\t }\r\n\r\n\t return this.getIndexRange(from, to);\r\n\t },\r\n\t //converts range of indexes to array of all IDs between them\r\n\t getIndexRange: function getIndexRange(from, to) {\r\n\t to = Math.min(to === 0 ? 0 : to || Infinity, this.count() - 1);\r\n\t var ret = toArray(); //result of method is rich-array\r\n\r\n\t for (var i = from || 0; i <= to; i++) {\r\n\t ret.push(this.getItem(this.order[i]));\r\n\t }\r\n\r\n\t return ret;\r\n\t },\r\n\t //returns total count of elements\r\n\t count: function count() {\r\n\t return this.order.length;\r\n\t },\r\n\t //returns truy if item with such ID exists\r\n\t exists: function exists(id) {\r\n\t return !!this.pull[id];\r\n\t },\r\n\t //nextmethod is not visible on component level, check DataMove.move\r\n\t //moves item from source index to the target index\r\n\t move: function move(sindex, tindex) {\r\n\t assert(sindex >= 0 && tindex >= 0, \"DataStore::move\", \"Incorrect indexes\");\r\n\t if (sindex == tindex) return;\r\n\t var id = this.getIdByIndex(sindex);\r\n\t var obj = this.getItem(id);\r\n\t if (this._filter_order) this._move_inner(this._filter_order, 0, 0, this.getIdByIndex(sindex), this.getIdByIndex(tindex));\r\n\r\n\t this._move_inner(this.order, sindex, tindex); //repaint signal\r\n\r\n\r\n\t this.callEvent(\"onStoreUpdated\", [id, obj, \"move\"]);\r\n\t },\r\n\t _move_inner: function _move_inner(col, sindex, tindex, sid, tid) {\r\n\t if (sid || tid) {\r\n\t sindex = tindex = -1;\r\n\r\n\t for (var i = 0; i < col.length; i++) {\r\n\t if (col[i] == sid && sindex < 0) sindex = i;\r\n\t if (col[i] == tid && tindex < 0) tindex = i;\r\n\t }\r\n\t }\r\n\r\n\t var id = col[sindex];\r\n\t col.removeAt(sindex); //remove at old position\r\n\r\n\t col.insertAt(id, Math.min(col.length, tindex)); //insert at new position\r\n\t },\r\n\t scheme: function scheme(config) {\r\n\t this._scheme = {};\r\n\t this._scheme_save = config.$save;\r\n\t this._scheme_init = config.$init || config.$change;\r\n\t this._scheme_update = config.$update || config.$change;\r\n\t this._scheme_serialize = config.$serialize;\r\n\t this._scheme_group = config.$group;\r\n\t this._scheme_sort = config.$sort; //ignore $-starting properties, as they have special meaning\r\n\r\n\t for (var key in config) {\r\n\t if (key.substr(0, 1) != \"$\") this._scheme[key] = config[key];\r\n\t }\r\n\t },\r\n\t importData: function importData(target, silent) {\r\n\t var data = target ? target.data || target : [];\r\n\t this._filter_order = null;\r\n\r\n\t if (typeof data.serialize == \"function\") {\r\n\t this.order = toArray([].concat(data.order)); //make full copy, to preserve object properties\r\n\t //[WE-CAN-DO-BETTER]\r\n\r\n\t if (this._make_full_copy) {\r\n\t this._make_full_copy = false;\r\n\t var oldpull = this.pull;\r\n\t this.pull = {};\r\n\r\n\t for (var _key in data.pull) {\r\n\t var old = oldpull[_key];\r\n\t this.pull[_key] = copy(data.pull[_key]);\r\n\t if (old && old.open) this.pull[_key].open = true;\r\n\t }\r\n\t } else this.pull = data.pull;\r\n\r\n\t if (data.branch && this.branch) {\r\n\t this.branch = copy(data.branch);\r\n\t this._filter_branch = null;\r\n\t }\r\n\t } else {\r\n\t this.order = toArray();\r\n\t this.pull = {};\r\n\t var id, obj;\r\n\t if (isArray(target)) for (var _key2 = 0; _key2 < target.length; _key2++) {\r\n\t obj = id = target[_key2];\r\n\t if (_typeof(obj) == \"object\") obj.id = obj.id || uid();else obj = {\r\n\t id: id,\r\n\t value: id\r\n\t };\r\n\t this.order.push(obj.id);\r\n\t if (this._scheme_init) this._scheme_init(obj);\r\n\t this.pull[obj.id] = obj;\r\n\t } else for (var _key3 in data) {\r\n\t this.order.push(_key3);\r\n\t this.pull[_key3] = {\r\n\t id: _key3,\r\n\t value: data[_key3]\r\n\t };\r\n\t }\r\n\t }\r\n\r\n\t if (this._extraParser && !data.branch) {\r\n\t this.branch = {\r\n\t 0: []\r\n\t };\r\n\t if (!this._datadriver_child) this._set_child_scheme(\"data\");\r\n\r\n\t for (var i = 0; i < this.order.length; i++) {\r\n\t var key = this.order[i];\r\n\r\n\t this._extraParser(this.pull[key], 0, 0, false);\r\n\t }\r\n\t }\r\n\r\n\t this.callEvent(\"onStoreLoad\", []);\r\n\t if (!silent) this.callEvent(\"onStoreUpdated\", []);\r\n\t },\r\n\t sync: function sync(source, filter, silent) {\r\n\t this.unsync();\r\n\r\n\t var type = _typeof(source);\r\n\r\n\t if (type == \"string\") source = $$(source);\r\n\r\n\t if (type != \"function\" && type != \"object\") {\r\n\t silent = filter;\r\n\t filter = null;\r\n\t }\r\n\r\n\t if (source.name != \"DataStore\") {\r\n\t if (source.data && (source.data.name === \"DataStore\" || source.data.name === \"TreeStore\")) source = source.data;else {\r\n\t this._sync_source = source;\r\n\t return callEvent(\"onSyncUnknown\", [this, source, filter]);\r\n\t }\r\n\t }\r\n\r\n\t var sync_logic = bind(function (id, data, mode) {\r\n\t if (this._skip_next_sync) return; //sync of tree-structure with after-filtering\r\n\t //we need to make a full copy, to preserve $count\r\n\t //[WE-CAN-DO-BETTER]\r\n\r\n\t if (filter && this.branch) this._make_full_copy = true;\r\n\t this.importData(source, true);\r\n\t if (filter) this.silent(filter);\r\n\t if (this._on_sync) this._on_sync();\r\n\t if (!(id && data && mode)) //clearall\r\n\t this._marks = {};\r\n\t if (mode == \"delete\" && this._marks[id]) delete this._marks[id];\r\n\t this.callEvent(\"onSyncApply\", []);\r\n\t if (!silent) this.refresh();else silent = false;\r\n\t }, this);\r\n\t this._sync_events = [source.attachEvent(\"onStoreUpdated\", sync_logic), source.attachEvent(\"onIdChange\", bind(function (old, nid) {\r\n\t this.changeId(old, nid);\r\n\t this.refresh(nid);\r\n\t }, this))];\r\n\t this._sync_source = source; //backward data saving\r\n\r\n\t this._back_sync_handler = this.attachEvent(\"onStoreUpdated\", function (id, data, mode) {\r\n\t if (mode == \"update\" || mode == \"save\") {\r\n\t this._skip_next_sync = 1;\r\n\t source.updateItem(id, data);\r\n\t this._skip_next_sync = 0;\r\n\t }\r\n\t });\r\n\t sync_logic();\r\n\t },\r\n\t unsync: function unsync() {\r\n\t if (this._sync_source) {\r\n\t var source = this._sync_source;\r\n\r\n\t if (source.name != \"DataStore\" && (!source.data || source.data.name != \"DataStore\")) {\r\n\t //data sync with external component\r\n\t callEvent(\"onUnSyncUnknown\", [this, source]);\r\n\t } else {\r\n\t //data sync with webix component\r\n\t for (var i = 0; i < this._sync_events.length; i++) {\r\n\t source.detachEvent(this._sync_events[i]);\r\n\t }\r\n\r\n\t this.detachEvent(this._back_sync_handler);\r\n\t }\r\n\r\n\t this._sync_source = null;\r\n\t }\r\n\t },\r\n\t destructor: function destructor() {\r\n\t this.unsync();\r\n\t this.pull = this.order = this._marks = null;\r\n\t this._evs_events = this._evs_handlers = {};\r\n\t },\r\n\t //adds item to the store\r\n\t add: function add(obj, index) {\r\n\t //default values\t\t\r\n\t if (this._scheme) for (var key in this._scheme) {\r\n\t if (isUndefined(obj[key])) obj[key] = this._scheme[key];\r\n\t }\r\n\t if (this._scheme_init) this._scheme_init(obj); //generate id for the item\r\n\r\n\t var id = this.id(obj); //in case of treetable order is sent as 3rd parameter\r\n\r\n\t var order = arguments[2] || this.order; //by default item is added to the end of the list\r\n\r\n\t var data_size = order.length;\r\n\t if (isUndefined(index) || index < 0) index = data_size; //check to prevent too big indexes\t\t\t\r\n\r\n\t if (index > data_size) {\r\n\t assert(0, \"Warning\", \"DataStore:add\", \"Index of out of bounds\");\r\n\t index = Math.min(order.length, index);\r\n\t }\r\n\r\n\t if (this.callEvent(\"onBeforeAdd\", [id, obj, index]) === false) return false;\r\n\t assert(!this.exists(id), \"Not unique ID\");\r\n\t this.pull[id] = obj;\r\n\t order.insertAt(id, index);\r\n\r\n\t if (this._filter_order) {\r\n\t //adding during filtering\r\n\t //we can't know the location of new item in full dataset, making suggestion\r\n\t //put at end of original dataset by default\r\n\t var original_index = this._filter_order.length; //if some data exists, put at the same position in original and filtered lists\r\n\r\n\t if (this.order.length) original_index = Math.min(index || 0, original_index);\r\n\r\n\t this._filter_order.insertAt(id, original_index);\r\n\t } //repaint signal\r\n\r\n\r\n\t this.callEvent(\"onStoreUpdated\", [id, obj, \"add\"]);\r\n\t this.callEvent(\"onAfterAdd\", [id, index]);\r\n\t return obj.id;\r\n\t },\r\n\t //removes element from datastore\r\n\t remove: function remove(id) {\r\n\t //id can be an array of IDs - result of getSelect, for example\r\n\t if (isArray(id)) {\r\n\t for (var i = 0; i < id.length; i++) {\r\n\t this.remove(id[i]);\r\n\t }\r\n\r\n\t return;\r\n\t }\r\n\r\n\t if (this.callEvent(\"onBeforeDelete\", [id]) === false) return false;\r\n\t assert(this.exists(id), \"Not existing ID in remove command\" + id);\r\n\t var obj = this.getItem(id); //save for later event\r\n\t //clear from collections\r\n\r\n\t this.order.remove(id);\r\n\t if (this._filter_order) this._filter_order.remove(id);\r\n\t delete this.pull[id];\r\n\t if (this._marks[id]) delete this._marks[id]; //repaint signal\r\n\r\n\t this.callEvent(\"onStoreUpdated\", [id, obj, \"delete\"]);\r\n\t this.callEvent(\"onAfterDelete\", [id]);\r\n\t },\r\n\t //deletes all records in datastore\r\n\t clearAll: function clearAll(soft) {\r\n\t //instead of deleting one by one - just reset inner collections\r\n\t this.pull = {};\r\n\t this._marks = {};\r\n\t this.order = toArray(); //this.feed = null;\r\n\r\n\t this._filter_order = null;\r\n\t if (!soft) this.url = null;\r\n\t this.callEvent(\"onClearAll\", [soft]);\r\n\t this.refresh();\r\n\t },\r\n\t //converts id to index\r\n\t getIdByIndex: function getIdByIndex(index) {\r\n\t assert(index >= 0, \"DataStore::getIdByIndex Incorrect index\");\r\n\t return this.order[index];\r\n\t },\r\n\t //converts index to id\r\n\t getIndexById: function getIndexById(id) {\r\n\t if (!this.pull[id]) return -1;else return this.order.find(id); //slower than getIdByIndex\r\n\t },\r\n\t //returns ID of next element\r\n\t getNextId: function getNextId(id, step) {\r\n\t return this.order[this.getIndexById(id) + (step || 1)];\r\n\t },\r\n\t //returns ID of first element\r\n\t getFirstId: function getFirstId() {\r\n\t return this.order[0];\r\n\t },\r\n\t //returns ID of last element\r\n\t getLastId: function getLastId() {\r\n\t return this.order[this.order.length - 1];\r\n\t },\r\n\t //returns ID of previous element\r\n\t getPrevId: function getPrevId(id, step) {\r\n\t return this.order[this.getIndexById(id) - (step || 1)];\r\n\t },\r\n\r\n\t /*\r\n\t \tsort data in collection\r\n\t \t\tby - settings of sorting\r\n\t \t\r\n\t \tor\r\n\t \t\r\n\t \t\tby - sorting function\r\n\t \t\tdir - \"asc\" or \"desc\"\r\n\t \t\t\r\n\t \tor\r\n\t \t\r\n\t \t\tby - property\r\n\t \t\tdir - \"asc\" or \"desc\"\r\n\t \t\tas - type of sortings\r\n\t \t\r\n\t \tSorting function will accept 2 parameters and must return 1,0,-1, based on desired order\r\n\t */\r\n\t sort: function sort(by, dir, as) {\r\n\t var sort = by;\r\n\t if (typeof by == \"function\") sort = {\r\n\t as: by,\r\n\t dir: dir\r\n\t };else if (typeof by == \"string\") sort = {\r\n\t by: by.replace(/#/g, \"\"),\r\n\t dir: dir,\r\n\t as: as\r\n\t };\r\n\t var parameters = [sort.by, sort.dir, sort.as, sort];\r\n\t if (!this.callEvent(\"onBeforeSort\", parameters)) return;\r\n\t this.order = this._sort_core(sort, this.order);\r\n\t if (this._filter_order && this._filter_order.length != this.order.length) this._filter_order = this._sort_core(sort, this._filter_order); //repaint self\r\n\r\n\t this.refresh();\r\n\t this.callEvent(\"onAfterSort\", parameters);\r\n\t },\r\n\t _sort_core: function _sort_core(sort, order) {\r\n\t var sorter = this.sorting.create(sort);\r\n\r\n\t if (this.order.length) {\r\n\t var pre = order.splice(0, this.$freeze); //get array of IDs\r\n\r\n\t var neworder = toArray();\r\n\r\n\t for (var i = order.length - 1; i >= 0; i--) {\r\n\t neworder[i] = this.pull[order[i]];\r\n\t }\r\n\r\n\t neworder.sort(sorter);\r\n\t return toArray(pre.concat(neworder.map(function (obj) {\r\n\t assert(obj, \"Client sorting can't be used with dynamic loading\");\r\n\t return this.id(obj);\r\n\t }, this)));\r\n\t }\r\n\r\n\t return order;\r\n\t },\r\n\r\n\t /*\r\n\t \tFilter datasource\r\n\t \t\r\n\t \ttext - property, by which filter\r\n\t \tvalue - filter mask\r\n\t \t\r\n\t \tor\r\n\t \t\r\n\t \ttext - filter method\r\n\t \t\r\n\t \tFilter method will receive data object and must return true or false\r\n\t */\r\n\t _filter_reset: function _filter_reset(preserve) {\r\n\t //remove previous filtering , if any\r\n\t if (this._filter_order && !preserve) {\r\n\t this.order = this._filter_order;\r\n\t delete this._filter_order;\r\n\t }\r\n\t },\r\n\t _filter_core: function _filter_core(filter, value, preserve) {\r\n\t var neworder = toArray();\r\n\t var freeze = this.$freeze || 0;\r\n\r\n\t for (var i = 0; i < this.order.length; i++) {\r\n\t var id = this.order[i];\r\n\t if (i < freeze || filter(this.getItem(id), value)) neworder.push(id);\r\n\t } //set new order of items, store original\r\n\r\n\r\n\t if (!preserve || !this._filter_order) this._filter_order = this.order;\r\n\t this.order = neworder;\r\n\t },\r\n\t find: function find(config, first) {\r\n\t var result = [];\r\n\r\n\t for (var i in this.pull) {\r\n\t var data = this.pull[i];\r\n\t var match = true;\r\n\r\n\t if (_typeof(config) == \"object\") {\r\n\t for (var key in config) {\r\n\t if (data[key] != config[key]) {\r\n\t match = false;\r\n\t break;\r\n\t }\r\n\t }\r\n\t } else if (!config(data)) match = false;\r\n\r\n\t if (match) result.push(data);\r\n\t if (first && result.length) return result[0];\r\n\t }\r\n\r\n\t return result;\r\n\t },\r\n\t filter: function filter(text, value, preserve) {\r\n\t //unfilter call but we already in not-filtered state\r\n\t if (!text && !this._filter_order && !this._filter_branch) return;\r\n\t if (!this.callEvent(\"onBeforeFilter\", [text, value])) return;\r\n\r\n\t this._filter_reset(preserve);\r\n\r\n\t if (!this.order.length) return; //if text not define -just unfilter previous state and exit\r\n\r\n\t if (text) {\r\n\t var filter = text;\r\n\t value = value || \"\";\r\n\r\n\t if (typeof text == \"string\") {\r\n\t text = text.replace(/#/g, \"\");\r\n\t if (typeof value == \"function\") filter = function filter(obj) {\r\n\t return value(obj[text]);\r\n\t };else {\r\n\t value = value.toString().toLowerCase();\r\n\r\n\t filter = function filter(obj, value) {\r\n\t //default filter - string start from, case in-sensitive\r\n\t assert(obj, \"Client side filtering can't be used with dynamic loading\");\r\n\t return (obj[text] || \"\").toString().toLowerCase().indexOf(value) != -1;\r\n\t };\r\n\t }\r\n\t }\r\n\r\n\t this._filter_core(filter, value, preserve, this._filterMode);\r\n\t } //repaint self\r\n\r\n\r\n\t this.refresh();\r\n\t this.callEvent(\"onAfterFilter\", []);\r\n\t },\r\n\r\n\t /*\r\n\t \tIterate through collection\r\n\t */\r\n\t _obj_array: function _obj_array() {\r\n\t var data = [];\r\n\r\n\t for (var i = this.order.length - 1; i >= 0; i--) {\r\n\t data[i] = this.pull[this.order[i]];\r\n\t }\r\n\r\n\t return data;\r\n\t },\r\n\t each: function each(method, master, all) {\r\n\t var order = this.order;\r\n\t if (all) order = this._filter_order || order;\r\n\r\n\t for (var i = 0; i < order.length; i++) {\r\n\t if (order[i]) method.call(master || this, this.getItem(order[i]), i);\r\n\t }\r\n\t },\r\n\t _methodPush: function _methodPush(object, method) {\r\n\t return function () {\r\n\t return object[method].apply(object, arguments);\r\n\t };\r\n\t },\r\n\r\n\t /*\r\n\t \tmap inner methods to some distant object\r\n\t */\r\n\t provideApi: function provideApi(target, eventable) {\r\n\t if (eventable) {\r\n\t this.mapEvent({\r\n\t onbeforesort: target,\r\n\t onaftersort: target,\r\n\t onbeforeadd: target,\r\n\t onafteradd: target,\r\n\t onbeforedelete: target,\r\n\t onafterdelete: target,\r\n\t ondataupdate: target\r\n\t /*,\r\n\t onafterfilter:\ttarget,\r\n\t onbeforefilter:\ttarget*/\r\n\r\n\t });\r\n\t }\r\n\r\n\t var list = [\"sort\", \"add\", \"remove\", \"exists\", \"getIdByIndex\", \"getIndexById\", \"getItem\", \"updateItem\", \"refresh\", \"count\", \"filter\", \"find\", \"getNextId\", \"getPrevId\", \"clearAll\", \"getFirstId\", \"getLastId\", \"serialize\", \"sync\"];\r\n\r\n\t for (var i = 0; i < list.length; i++) {\r\n\t target[list[i]] = this._methodPush(this, list[i]);\r\n\t }\r\n\t },\r\n\t addMark: function addMark(id, mark, css, value, silent) {\r\n\t var obj = this._marks[id] || {};\r\n\t this._marks[id] = obj;\r\n\r\n\t if (!obj[mark]) {\r\n\t obj[mark] = value || true;\r\n\r\n\t if (css) {\r\n\t var old_css = obj.$css || \"\";\r\n\t obj.$css = old_css + \" \" + mark;\r\n\t }\r\n\r\n\t if (!silent) this.refresh(id);\r\n\t }\r\n\r\n\t return obj[mark];\r\n\t },\r\n\t removeMark: function removeMark(id, mark, css, silent) {\r\n\t var obj = this._marks[id];\r\n\r\n\t if (obj) {\r\n\t if (obj[mark]) delete obj[mark];\r\n\r\n\t if (css) {\r\n\t var current_css = obj.$css;\r\n\r\n\t if (current_css) {\r\n\t obj.$css = current_css.replace(mark, \"\").replace(\" \", \" \");\r\n\t }\r\n\t }\r\n\r\n\t if (!silent) this.refresh(id);\r\n\t }\r\n\t },\r\n\t getMark: function getMark(id, mark) {\r\n\t var obj = this._marks[id];\r\n\t return obj ? obj[mark] : false;\r\n\t },\r\n\t clearMark: function clearMark(name, css, silent) {\r\n\t for (var id in this._marks) {\r\n\t var obj = this._marks[id];\r\n\r\n\t if (obj[name]) {\r\n\t delete obj[name];\r\n\t if (css && obj.$css) obj.$css = obj.$css.replace(name, \"\").replace(\" \", \" \");\r\n\t if (!silent) this.refresh(id);\r\n\t }\r\n\t }\r\n\t },\r\n\r\n\t /*\r\n\t \tserializes data to a json object\r\n\t */\r\n\t serialize: function serialize(all) {\r\n\t var ids = this.order;\r\n\t if (all && this._filter_order) ids = this._filter_order;\r\n\t var result = [];\r\n\r\n\t for (var i = 0; i < ids.length; i++) {\r\n\t var el = this.pull[ids[i]];\r\n\r\n\t if (this._scheme_serialize) {\r\n\t el = this._scheme_serialize(el);\r\n\t if (el === false) continue;\r\n\t }\r\n\r\n\t result.push(el);\r\n\t }\r\n\r\n\t return result;\r\n\t },\r\n\t sorting: {\r\n\t create: function create(config) {\r\n\t return this._dir(config.dir, this._by(config.by, config.as));\r\n\t },\r\n\t as: {\r\n\t //handled by dataFeed\r\n\t \"server\": function server() {\r\n\t return false;\r\n\t },\r\n\t \"date\": function date(a, b) {\r\n\t a = a - 0;\r\n\t b = b - 0;\r\n\t return a > b ? 1 : a < b ? -1 : 0;\r\n\t },\r\n\t \"int\": function int(a, b) {\r\n\t a = a * 1;\r\n\t b = b * 1;\r\n\t return a > b ? 1 : a < b ? -1 : 0;\r\n\t },\r\n\t \"string_strict\": function string_strict(a, b) {\r\n\t a = a.toString();\r\n\t b = b.toString();\r\n\t return a > b ? 1 : a < b ? -1 : 0;\r\n\t },\r\n\t \"string\": function string(a, b) {\r\n\t if (!b) return 1;\r\n\t if (!a) return -1;\r\n\t a = a.toString().toLowerCase();\r\n\t b = b.toString().toLowerCase();\r\n\t return a > b ? 1 : a < b ? -1 : 0;\r\n\t },\r\n\t \"raw\": function raw(a, b) {\r\n\t return a > b ? 1 : a < b ? -1 : 0;\r\n\t }\r\n\t },\r\n\t _by: function _by(prop, method) {\r\n\t if (!prop) return method;\r\n\t if (typeof method != \"function\") method = this.as[method || \"string\"];\r\n\t assert(method, \"Invalid sorting method\");\r\n\t return function (a, b) {\r\n\t return method(a[prop], b[prop]);\r\n\t };\r\n\t },\r\n\t _dir: function _dir(prop, method) {\r\n\t if (prop == \"asc\" || !prop) return method;\r\n\t return function (a, b) {\r\n\t return method(a, b) * -1;\r\n\t };\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t\tBehavior:DataLoader - load data in the component\r\n\t\t\r\n\t\t@export\r\n\t\t\tload\r\n\t\t\tparse\r\n\t*/\r\n\r\n\tvar DataLoader = exports.proto({\r\n\t $init: function $init(config) {\r\n\t //prepare data store\r\n\t config = config || \"\"; //list of all active ajax requests\r\n\r\n\t this._ajax_queue = toArray();\r\n\t this._feed_last = {};\r\n\t this.data = new DataStore();\r\n\t this.data.attachEvent(\"onClearAll\", bind(this._call_onclearall, this));\r\n\t this.data.attachEvent(\"onServerConfig\", bind(this._call_on_config, this));\r\n\t this.attachEvent(\"onDestruct\", this._call_onclearall);\r\n\t this.data.feed = this._feed;\r\n\t this.data.owner = config.id;\r\n\t },\r\n\t _feed: function _feed(from, count, callback) {\r\n\t //allow only single request at same time\r\n\t if (this._load_count) return this._load_count = [from, count, callback]; //save last ignored request\r\n\t else this._load_count = true;\r\n\t this._feed_last.from = from;\r\n\t this._feed_last.count = count;\r\n\r\n\t this._feed_common.call(this, from, count, callback);\r\n\t },\r\n\t _feed_common: function _feed_common(from, count, callback, url, details) {\r\n\t var state = null;\r\n\t url = url || this.data.url;\r\n\t var final_callback = [{\r\n\t success: this._feed_callback,\r\n\t error: this._feed_callback\r\n\t }, callback];\r\n\t if (from < 0) from = 0;\r\n\t if (!details) details = {\r\n\t start: from,\r\n\t count: count\r\n\t };\r\n\t if (this.count()) details[\"continue\"] = \"true\";\r\n\t if (this.getState) state = this.getState(); // proxy\r\n\r\n\t if (url && typeof url != \"string\") {\r\n\t if (state) {\r\n\t if (state.sort) details.sort = state.sort;\r\n\t if (state.filter) details.filter = state.filter;\r\n\t }\r\n\r\n\t this.load(url, final_callback, details);\r\n\t } else {\r\n\t // GET\r\n\t url = url + (url.indexOf(\"?\") == -1 ? \"?\" : \"&\");\r\n\t var params = [];\r\n\r\n\t for (var d in details) {\r\n\t params.push(d + \"=\" + details[d]);\r\n\t }\r\n\r\n\t if (state) {\r\n\t if (state.sort) params.push(\"sort[\" + state.sort.id + \"]=\" + encodeURIComponent(state.sort.dir));\r\n\t if (state.filter) for (var key in state.filter) {\r\n\t var filterValue = state.filter[key];\r\n\t if (_typeof(filterValue) == \"object\") filterValue = ajax().stringify(filterValue); //server daterangefilter\r\n\r\n\t params.push(\"filter[\" + key + \"]=\" + encodeURIComponent(filterValue));\r\n\t }\r\n\t }\r\n\r\n\t url += params.join(\"&\");\r\n\r\n\t if (this._feed_last.url !== url) {\r\n\t this._feed_last.url = url;\r\n\t this.load(url, final_callback);\r\n\t } else {\r\n\t this._load_count = false;\r\n\t }\r\n\t }\r\n\t },\r\n\t _feed_callback: function _feed_callback() {\r\n\t //after loading check if we have some ignored requests\r\n\t var temp = this._load_count;\r\n\t this._load_count = false;\r\n\t if (_typeof(temp) == \"object\") this.data.feed.apply(this, temp); //load last ignored request\r\n\t },\r\n\t //loads data from external URL\r\n\t load: function load(url) {\r\n\t url = proxy$b.$parse(url);\r\n\t var ajax$$1 = AtomDataLoader.load.apply(this, arguments); //prepare data feed for dyn. loading\r\n\r\n\t if (!this.data.url) this.data.url = url;\r\n\t return ajax$$1;\r\n\t },\r\n\t //load next set of data rows\r\n\t loadNext: function loadNext(count, start, callback, url, now) {\r\n\t var config = this._settings;\r\n\r\n\t if (config.datathrottle && !now) {\r\n\t if (this._throttle_request) window.clearTimeout(this._throttle_request);\r\n\t this._throttle_request = delay(function () {\r\n\t this.loadNext(count, start, callback, url, true);\r\n\t }, this, 0, config.datathrottle);\r\n\t return;\r\n\t }\r\n\r\n\t if (!start && start !== 0) start = this.count();\r\n\t if (!count) count = config.datafetch || this.count();\r\n\t this.data.url = this.data.url || url;\r\n\t if (this.callEvent(\"onDataRequest\", [start, count, callback, url]) && this.data.url) this.data.feed.call(this, start, count, callback);\r\n\t },\r\n\t _maybe_loading_already: function _maybe_loading_already(count, from) {\r\n\t var last = this._feed_last;\r\n\r\n\t if (this._load_count && last.url) {\r\n\t if (last.from <= from && last.count + last.from >= count + from) return true;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t removeMissed_setter: function removeMissed_setter(value) {\r\n\t return this.data._removeMissed = value;\r\n\t },\r\n\t //init of dataprocessor delayed after all settings processing\r\n\t //because it need to be the last in the event processing chain\r\n\t //to get valid validation state\r\n\t _init_dataprocessor: function _init_dataprocessor() {\r\n\t var url = this._settings.save;\r\n\t if (url === true) url = this._settings.save = this._settings.url;\r\n\t var obj = {\r\n\t master: this\r\n\t };\r\n\t if (url && url.url) exports.extend(obj, url);else obj.url = url;\r\n\t dp(obj);\r\n\t },\r\n\t save_setter: function save_setter(value) {\r\n\t if (value) this.$ready.push(this._init_dataprocessor);\r\n\t return value;\r\n\t },\r\n\t scheme_setter: function scheme_setter(value) {\r\n\t this.data.scheme(value);\r\n\t },\r\n\t dataFeed_setter: function dataFeed_setter(value) {\r\n\t value = proxy$b.$parse(value);\r\n\t this.data.attachEvent(\"onBeforeFilter\", bind(function (text, filtervalue) {\r\n\t //complex filtering, can't be routed to dataFeed\r\n\t if (typeof text == \"function\") return true; //we have dataFeed and some text\r\n\r\n\t if (this._settings.dataFeed && (text || filtervalue)) {\r\n\t text = text || \"id\";\r\n\t if (filtervalue && _typeof(filtervalue) == \"object\") filtervalue = filtervalue.id;\r\n\t this.clearAll();\r\n\t var url = this._settings.dataFeed; //js data feed\r\n\r\n\t if (typeof url == \"function\") {\r\n\t var filter = {};\r\n\t filter[text] = filtervalue;\r\n\t url.call(this, filtervalue, filter);\r\n\t } else if (url.$proxy) {\r\n\t if (url.load) {\r\n\t var filterobj = {};\r\n\t filterobj[text] = filtervalue;\r\n\t url.load(this, {\r\n\t success: this._onLoad,\r\n\t error: this._onLoadError\r\n\t }, {\r\n\t filter: filterobj\r\n\t });\r\n\t }\r\n\t } else {\r\n\t //url data feed\r\n\t var urldata = \"filter[\" + text + \"]=\" + encodeURIComponent(filtervalue);\r\n\t this.load(url + (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + urldata, this._settings.datatype);\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\t }, this));\r\n\t return value;\r\n\t },\r\n\t _call_onready: function _call_onready() {\r\n\t if (this._settings.ready && !this._ready_was_used) {\r\n\t var code = toFunctor(this._settings.ready, this.$scope);\r\n\t if (code) delay(code, this, arguments);\r\n\t if (this.callEvent) delay(this.callEvent, this, [\"onReady\", []]);\r\n\t this._ready_was_used = true;\r\n\t }\r\n\t },\r\n\t _call_onclearall: function _call_onclearall(soft) {\r\n\t for (var i = 0; i < this._ajax_queue.length; i++) {\r\n\t var xhr = this._ajax_queue[i]; //IE9 and IE8 deny extending of ActiveX wrappers\r\n\r\n\t try {\r\n\t xhr.aborted = true;\r\n\t } catch (e) {\r\n\t _xhr_aborted.push(xhr);\r\n\t }\r\n\r\n\t xhr.abort();\r\n\t }\r\n\r\n\t if (!soft) {\r\n\t this._load_count = false;\r\n\t this._feed_last = {};\r\n\t this._ajax_queue = toArray();\r\n\t this.waitData = Deferred.defer();\r\n\t }\r\n\t },\r\n\t _call_on_config: function _call_on_config(config) {\r\n\t this._parseSeetingColl(config);\r\n\t }\r\n\t}, AtomDataLoader);\r\n\r\n\tvar DataState = {\r\n\t getState: function getState() {\r\n\t var cols_n = this.config.columns.length;\r\n\t var columns = this.config.columns;\r\n\t var settings = {\r\n\t ids: [],\r\n\t size: [],\r\n\t select: this.getSelectedId(true),\r\n\t scroll: this.getScrollState()\r\n\t };\r\n\r\n\t for (var i = 0; i < cols_n; i++) {\r\n\t var col = columns[i];\r\n\t settings.ids.push(col.id);\r\n\t settings.size.push(col.fillspace || col.adjust ? -1 : col.width);\r\n\t }\r\n\r\n\t settings.order = [].concat(this._hidden_column_order.length ? this._hidden_column_order : settings.ids);\r\n\r\n\t if (this._last_sorted) {\r\n\t settings.sort = {\r\n\t id: this._last_sorted,\r\n\t dir: this._last_order\r\n\t };\r\n\t } //this method will try to access the rendered values\r\n\t //just ignore it if grid is not rendered yet\r\n\r\n\r\n\t if (this._filter_elements && this._dtable_fully_ready) {\r\n\t var filter = {};\r\n\t var any_filter = 0;\r\n\r\n\t for (var key in this._filter_elements) {\r\n\t if (this._hidden_column_hash[key]) continue;\r\n\t var f = this._filter_elements[key];\r\n\t f[1].value = filter[key] = f[2].getValue(f[0]);\r\n\t any_filter = 1;\r\n\t }\r\n\r\n\t if (any_filter) settings.filter = filter;\r\n\t }\r\n\r\n\t settings.hidden = [];\r\n\r\n\t for (var _key in this._hidden_column_hash) {\r\n\t settings.hidden.push(_key);\r\n\t }\r\n\r\n\t return settings;\r\n\t },\r\n\t setState: function setState(obj) {\r\n\t var columns = this.config.columns;\r\n\t if (!obj) return;\r\n\t this._last_sorted = null;\r\n\t this.blockEvent();\r\n\t if (obj.order && obj.order.length) this._hidden_column_order = [].concat(obj.order);\r\n\r\n\t if (obj.hidden) {\r\n\t var hihash = {};\r\n\r\n\t for (var i = 0; i < obj.hidden.length; i++) {\r\n\t hihash[obj.hidden[i]] = true;\r\n\t if (!this._hidden_column_order.length) this.hideColumn(obj.hidden[i]);\r\n\t }\r\n\r\n\t if (this._hidden_column_order.length) {\r\n\t for (var _i = 0; _i < this._hidden_column_order.length; _i++) {\r\n\t var hikey = this._hidden_column_order[_i];\r\n\t if (!!hihash[hikey] == !this._hidden_column_hash[hikey]) this.hideColumn(hikey, {}, false, !!hihash[hikey]);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (obj.ids) {\r\n\t var reorder = false;\r\n\t var cols = this.config.columns;\r\n\r\n\t for (var _i2 = 0; _i2 < cols.length; _i2++) {\r\n\t if (cols[_i2].id != obj.ids[_i2]) reorder = true;\r\n\t }\r\n\r\n\t if (reorder) {\r\n\t for (var _i3 = 0; _i3 < obj.ids.length; _i3++) {\r\n\t cols[_i3] = this.getColumnConfig(obj.ids[_i3]) || cols[_i3];\r\n\t }\r\n\r\n\t this.refreshColumns();\r\n\t }\r\n\t }\r\n\r\n\t if (obj.size) {\r\n\t var cols_n = Math.min(obj.size.length, columns.length);\r\n\r\n\t for (var _i4 = 0; _i4 < cols_n; _i4++) {\r\n\t var col = columns[_i4];\r\n\r\n\t if (col && obj.size[_i4] > 0 && col.width != obj.size[_i4]) {\r\n\t delete col.fillspace;\r\n\t delete col.adjust;\r\n\r\n\t this._setColumnWidth(_i4, obj.size[_i4], true);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t this.unblockEvent();\r\n\t var silent = !(this._settings.leftSplit || this._settings.rightSplit);\r\n\r\n\t this._updateColsSizeSettings(silent);\r\n\r\n\t this.callEvent(\"onStructureUpdate\", []);\r\n\r\n\t if (obj.sort) {\r\n\t var column = columns[this.getColumnIndex(obj.sort.id)];\r\n\t if (column) this._sort(obj.sort.id, obj.sort.dir, column.sort);\r\n\t }\r\n\r\n\t if (obj.filter) {\r\n\t //temporary disable filtering \r\n\t var temp = this.filterByAll;\r\n\r\n\t this.filterByAll = function () {}; //apply defined filters\r\n\r\n\r\n\t for (var key in obj.filter) {\r\n\t var value = obj.filter[key];\r\n\t if (!value) continue;\r\n\t if (!this._filter_elements[key]) continue;\r\n\t var f = this._filter_elements[key];\r\n\t f[2].setValue(f[0], value);\r\n\t var contentid = f[1].contentId;\r\n\t if (contentid) this._active_headers[contentid].value = value;\r\n\t } //remove old filters\r\n\r\n\r\n\t for (var _key2 in this._filter_elements) {\r\n\t if (!obj.filter[_key2]) {\r\n\t var _f = this._filter_elements[_key2];\r\n\r\n\t _f[2].setValue(_f[0], \"\");\r\n\t }\r\n\t } //restore and apply filtering\r\n\r\n\r\n\t this.filterByAll = temp;\r\n\t this.filterByAll();\r\n\t }\r\n\r\n\t if (obj.select && this.select) {\r\n\t var select = obj.select;\r\n\t this.unselect();\r\n\r\n\t for (var _i5 = 0; _i5 < select.length; _i5++) {\r\n\t if (!select[_i5].row || this.exists(select[_i5].row)) this._select(select[_i5], true);\r\n\t }\r\n\t }\r\n\r\n\t if (obj.scroll) this.scrollTo(obj.scroll.x, obj.scroll.y);\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t\tBehavior:DragItem - adds ability to move items by dnd\r\n\t\t\r\n\t\tdnd context can have next properties\r\n\t\t\tfrom - source object\r\n\t\t\tto - target object\r\n\t\t\tsource - id of dragged item(s)\r\n\t\t\ttarget - id of drop target, null for drop on empty space\r\n\t\t\tstart - id from which DND was started\r\n\t*/\r\n\r\n\tvar DragItem = {\r\n\t //helper - defines component's container as active zone for dragging and for dropping\r\n\t _initHandlers: function _initHandlers(obj, source, target) {\r\n\t if (!source) DragControl.addDrop(obj._contentobj, obj, true);\r\n\t if (!target) DragControl.addDrag(obj._contentobj, obj);\r\n\t this.attachEvent(\"onDragOut\", function (a, b) {\r\n\t this.$dragMark(a, b);\r\n\t });\r\n\t this.attachEvent(\"onBeforeAutoScroll\", function () {\r\n\t var context = DragControl.getContext();\r\n\t return !!(DragControl._active && context && (context.to === this || this._auto_scroll_force));\r\n\t });\r\n\t },\r\n\t drag_setter: function drag_setter(value) {\r\n\t if (value) {\r\n\t exports.extend(this, AutoScroll, true);\r\n\t if (value == \"order\") exports.extend(this, use(\"DragOrder\"), true);\r\n\t if (value == \"inner\") this._inner_drag_only = true;\r\n\r\n\t this._initHandlers(this, value == \"source\", value == \"target\");\r\n\r\n\t delete this.drag_setter; //prevent double initialization\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\r\n\t /*\r\n\t \ts - source html element\r\n\t \tt - target html element\r\n\t \td - drop-on html element ( can be not equal to the target )\r\n\t \te - native html event \r\n\t */\r\n\t //called when drag moved over possible target\r\n\t $dragIn: function $dragIn(s, t, e) {\r\n\t var id = this.locate(e) || null;\r\n\t var context = DragControl._drag_context; //in inner drag mode - ignore dnd from other components\r\n\r\n\t if ((this._inner_drag_only || context.from._inner_drag_only) && context.from !== this) return false;\r\n\t var to = DragControl.getMaster(t); //previous target\r\n\r\n\t var html = this.getItemNode(id, e) || this._dataobj; //prevent double processing of same target\r\n\r\n\r\n\t if (html == DragControl._landing) return html;\r\n\t context.target = id;\r\n\t context.to = to;\r\n\t if (this._auto_scroll_delay) this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay);\r\n\t this._auto_scroll_delay = delay(function (pos$$1, id) {\r\n\t this._drag_pause(id);\r\n\r\n\t this._auto_scroll(pos$$1, id);\r\n\t }, this, [pos(e), id], 250);\r\n\r\n\t if (!this.$dropAllow(context, e) || !this.callEvent(\"onBeforeDragIn\", [context, e])) {\r\n\t context.to = context.target = null;\r\n\t if (this._auto_scroll_delay) this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay);\r\n\t return null;\r\n\t } //mark target only when landing confirmed\r\n\r\n\r\n\t this.$dragMark(context, e);\r\n\t return html;\r\n\t },\r\n\t $dropAllow: function $dropAllow() {\r\n\t return true;\r\n\t },\r\n\t _drag_pause: function _drag_pause() {//may be reimplemented in some components\r\n\t // tree for example\r\n\t },\r\n\t _target_to_id: function _target_to_id(target) {\r\n\t return target && _typeof(target) === \"object\" ? target.toString() : target;\r\n\t },\r\n\t //called when drag moved out from possible target\r\n\t $dragOut: function $dragOut(s, t, n, e) {\r\n\t var id = (this._viewobj.contains(n) ? this.locate(e) : null) || null;\r\n\t var context = DragControl._drag_context; //still over previous target\r\n\r\n\t if ((context.target || \"\").toString() == (id || \"\").toString()) return null;\r\n\r\n\t if (this._auto_scroll_delay) {\r\n\t this._auto_scroll_force = null;\r\n\t this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay);\r\n\t } //unmark previous target\r\n\r\n\r\n\t context.target = context.to = null;\r\n\t this.callEvent(\"onDragOut\", [context, e]);\r\n\t return null;\r\n\t },\r\n\t //called when drag moved on target and button is released\r\n\t $drop: function $drop(s, t, e) {\r\n\t if (this._auto_scroll_delay) this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay);\r\n\t var context = DragControl._drag_context; //finalize context details\r\n\r\n\t context.to = this;\r\n\r\n\t var target = this._target_to_id(context.target);\r\n\r\n\t if (this.getBranchIndex) {\r\n\t if (target) {\r\n\t context.parent = this.getParentId(target);\r\n\t context.index = this.getBranchIndex(target);\r\n\t }\r\n\t } else context.index = target ? this.getIndexById(target) : this.count(); //unmark last target\r\n\r\n\r\n\t this.$dragMark({}, e);\r\n\r\n\t if (context.from && context.from != context.to && context.from.callEvent) {\r\n\t context.from.callEvent(\"onBeforeDropOut\", [context, e]);\r\n\t }\r\n\r\n\t if (!this.callEvent(\"onBeforeDrop\", [context, e])) return; //moving\r\n\r\n\t this._context_to_move(context, e);\r\n\r\n\t this.callEvent(\"onAfterDrop\", [context, e]);\r\n\t },\r\n\t _context_to_move: function _context_to_move(context) {\r\n\t assert(context.from, \"Unsopported d-n-d combination\");\r\n\r\n\t if (context.from && context.from.move) {\r\n\t //from different component with item dnd\r\n\t var details = {\r\n\t parent: context.parent,\r\n\t mode: context.pos\r\n\t };\r\n\t context.from.move(context.source, context.index, context.to, details);\r\n\t }\r\n\t },\r\n\t _getDragItemPos: function _getDragItemPos(pos$$1, e) {\r\n\t if (this.getItemNode) {\r\n\t var id = this.locate(e, true); //in some case, node may be outiside of dom ( spans in datatable for example )\r\n\t //so getItemNode can return null\r\n\r\n\t var node = id ? this.getItemNode(id) : null;\r\n\t return node ? offset(node) : node;\r\n\t }\r\n\t },\r\n\t //called when drag action started\r\n\t $drag: function $drag(s, e) {\r\n\t var id = this.locate(e, true);\r\n\r\n\t if (id) {\r\n\t var list = [id];\r\n\r\n\t if (this.getSelectedId && !this._do_not_drag_selection) {\r\n\t //has selection model\r\n\t //if dragged item is one of selected - drag all selected\r\n\t var selection = this.getSelectedId(true, true);\r\n\r\n\t if (selection && selection.length > 1 && PowerArray.find.call(selection, id) != -1) {\r\n\t var hash = {};\r\n\t list = [];\r\n\r\n\t for (var i = 0; i < selection.length; i++) {\r\n\t hash[selection[i]] = true;\r\n\t }\r\n\r\n\t for (var _i = 0; _i < this.data.order.length; _i++) {\r\n\t var hash_id = this.data.order[_i];\r\n\t if (hash[hash_id]) list.push(hash_id);\r\n\t }\r\n\t }\r\n\t } //save initial dnd params\r\n\r\n\r\n\t var context = DragControl._drag_context = {\r\n\t source: list,\r\n\t start: id\r\n\t };\r\n\t context.fragile = this.addRowCss && env.touch && (env.isWebKit || env.isFF);\r\n\t context.from = this;\r\n\r\n\t if (this.callEvent(\"onBeforeDrag\", [context, e])) {\r\n\t if (Touch) Touch._start_context = null; //set drag representation\r\n\r\n\t return context.html || this.$dragHTML(this.getItem(id), e);\r\n\t }\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t $dragHTML: function $dragHTML(obj) {\r\n\t return this._toHTML(obj);\r\n\t },\r\n\t $dragMark: function $dragMark(context) {\r\n\t var target = null;\r\n\t if (context.target) target = this._target_to_id(context.target); //touch webkit will stop touchmove event if source node removed\r\n\t //datatable can't repaint rows without repainting\r\n\r\n\t if (this._marked && this._marked != target) {\r\n\t if (!context.fragile) this.removeCss(this._marked, \"webix_drag_over\");\r\n\t this._marked = null;\r\n\t }\r\n\r\n\t if (!this._marked && target) {\r\n\t this._marked = target;\r\n\t if (!context.fragile) this.addCss(target, \"webix_drag_over\");\r\n\t return target;\r\n\t }\r\n\r\n\t if (context.to) {\r\n\t return true;\r\n\t } else return false;\r\n\t }\r\n\t};\r\n\r\n\tvar DragOrder = {\r\n\t _do_not_drag_selection: true,\r\n\t $drag: function $drag(s, e) {\r\n\t var html = DragItem.$drag.call(this, s, e);\r\n\r\n\t if (html) {\r\n\t var context = DragControl.getContext();\r\n\t if (this.getBranchIndex) this._drag_order_stored_left = this._drag_order_complex ? this.getItem(context.start).$level * 16 : 0;\r\n\t if (!context.fragile) this.addCss(context.start, \"webix_transparent\");\r\n\t }\r\n\r\n\t return html;\r\n\t },\r\n\t _getDragItemPos: function _getDragItemPos(pos$$1, e) {\r\n\t return DragItem._getDragItemPos(pos$$1, e);\r\n\t },\r\n\t $dragPos: function $dragPos(pos$$1, e, node) {\r\n\t var box = offset(this.$view);\r\n\t var left = box.x + (this._drag_order_complex ? 1 + this._drag_order_stored_left : 1);\r\n\t var top = pos$$1.y;\r\n\t var config = this._settings;\r\n\t var xdrag = config.layout == \"x\";\r\n\r\n\t if (xdrag) {\r\n\t top = box.y + (this._drag_order_complex ? +box.height - env.scrollSize - 1 : 1);\r\n\t left = pos$$1.x;\r\n\t }\r\n\r\n\t node.style.display = \"none\";\r\n\t var html = document.elementFromPoint(left, top);\r\n\r\n\t if (html != this._last_sort_dnd_node) {\r\n\t var view = $$(html); //this type of dnd is limited to the self\r\n\r\n\t if (view && view == this) {\r\n\t var id = this.locate(html, true); // sometimes 'mousedown' on item is followed by 'mousemove' on empty area and item caanot be located\r\n\r\n\t if (!id && DragControl._saved_event) id = this.locate(DragControl._saved_event, true);\r\n\t var start_id = DragControl.getContext().start;\r\n\t this._auto_scroll_force = true;\r\n\r\n\t if (id) {\r\n\t if (id != this._last_sort_dnd_node) {\r\n\t if (id != start_id) {\r\n\t var details, index$$1;\r\n\r\n\t if (this.getBranchIndex) {\r\n\t details = {\r\n\t parent: this.getParentId(id)\r\n\t };\r\n\t index$$1 = this.getBranchIndex(id);\r\n\t } else {\r\n\t details = {};\r\n\t index$$1 = this.getIndexById(id);\r\n\t }\r\n\r\n\t if (this.callEvent(\"onBeforeDropOrder\", [start_id, index$$1, e, details])) {\r\n\t this.move(start_id, index$$1, this, details);\r\n\t this._last_sort_dnd_node = id;\r\n\t }\r\n\t }\r\n\r\n\t DragControl._last = this._contentobj;\r\n\t }\r\n\t } else {\r\n\t id = \"$webix-last\";\r\n\r\n\t if (this._last_sort_dnd_node != id) {\r\n\t if (!this.callEvent(\"onBeforeDropOrder\", [start_id, -1, e, {\r\n\t parent: 0\r\n\t }])) return;\r\n\t this._last_sort_dnd_node = id;\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t node.style.display = \"block\";\r\n\r\n\t if (xdrag) {\r\n\t pos$$1.y = box.y;\r\n\t pos$$1.x = pos$$1.x - 18;\r\n\t if (pos$$1.x < box.x) pos$$1.x = box.x;else {\r\n\t var max = box.x + this.$view.offsetWidth - 60;\r\n\t if (pos$$1.x > max) pos$$1.x = max;\r\n\t }\r\n\t } else {\r\n\t box.y += this._header_height;\r\n\t pos$$1.x = this._drag_order_stored_left || box.x;\r\n\t pos$$1.y = pos$$1.y - 18;\r\n\t if (pos$$1.y < box.y) pos$$1.y = box.y;else {\r\n\t var _max = box.y + this.$view.offsetHeight - 60;\r\n\r\n\t if (pos$$1.y > _max) pos$$1.y = _max;\r\n\t }\r\n\t }\r\n\r\n\t if (this._auto_scroll_delay) this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay);\r\n\t this._auto_scroll_delay = delay(this._auto_scroll, this, [pos(e), this.locate(e) || null], 250); //prevent normal dnd landing checking\r\n\r\n\t DragControl._skip = true;\r\n\t },\r\n\t $dragIn: function $dragIn() {\r\n\t return false;\r\n\t },\r\n\t $drop: function $drop(s, t, e) {\r\n\t if (this._auto_scroll_delay) {\r\n\t this._auto_scroll_force = null;\r\n\t this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay);\r\n\t }\r\n\r\n\t var context = DragControl.getContext();\r\n\t var id = context.start;\r\n\t this.removeCss(id, \"webix_transparent\");\r\n\t var index$$1 = this.getIndexById(id);\r\n\t this.callEvent(\"onAfterDropOrder\", [id, index$$1, e]);\r\n\t if (context.fragile) this.refresh();\r\n\t }\r\n\t};\r\n\tdefine(\"DragOrder\", DragOrder);\r\n\r\n\tvar Undo = {\r\n\t $init: function $init() {\r\n\t this._undoHistory = exports.extend([], PowerArray, true);\r\n\t this._undoCursor = -1;\r\n\t },\r\n\t undo_setter: function undo_setter(value) {\r\n\t if (value) {\r\n\t this._init_undo();\r\n\r\n\t this._init_undo = function () {};\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t _init_undo: function _init_undo() {\r\n\t var view = this; // drag-n-drop\r\n\r\n\t this.attachEvent(\"onBeforeDrop\", function (context) {\r\n\t if (context.from == context.to) {\r\n\t var item = view._draggedItem = copy(this.getItem(context.start));\r\n\r\n\t if (this.data.branch) {\r\n\t item.$index = this.getBranchIndex(item.id);\r\n\t } else item.$index = this.getIndexById(item.id);\r\n\t }\r\n\t });\r\n\t this.data.attachEvent(\"onDataMove\", function (sid) {\r\n\t if (view._draggedItem && view._draggedItem.id == sid) {\r\n\t var data = view._draggedItem;\r\n\t view._draggedItem = null;\r\n\r\n\t view._addToHistory(sid, data, \"move\");\r\n\t }\r\n\t }); // add, remove\r\n\r\n\t this.data.attachEvent(\"onBeforeDelete\", function (id) {\r\n\t if (this.getItem(id)) {\r\n\t var item = view._deletedItem = copy(this.getItem(id));\r\n\r\n\t if (this.branch) {\r\n\t item.$index = this.getBranchIndex(id);\r\n\t if (this.branch[id]) item.$branch = copy(this.serialize(id));\r\n\t } else item.$index = this.getIndexById(id);\r\n\t }\r\n\t });\r\n\t this.data.attachEvent(\"onDataUpdate\", function (id, data, old) {\r\n\t view._addToHistory(id + \"\", old, \"update\");\r\n\t });\r\n\t this.data.attachEvent(\"onStoreUpdated\", function (id, item, mode) {\r\n\t var data = null;\r\n\r\n\t if (id) {\r\n\t if (mode == \"add\") {\r\n\t data = copy(item);\r\n\t } else if (mode == \"delete\") {\r\n\t data = view._deletedItem;\r\n\t }\r\n\r\n\t if (data) view._addToHistory(id, data, mode);\r\n\t }\r\n\t }); // id change\r\n\r\n\t this.data.attachEvent(\"onIdChange\", function (oldId, newId) {\r\n\t if (_typeof(oldId) == \"object\") oldId = oldId.row;\r\n\r\n\t for (var i = 0; i < view._undoHistory.length; i++) {\r\n\t if (view._undoHistory[i].id == oldId) {\r\n\t view._undoHistory[i].id = newId;\r\n\t }\r\n\t }\r\n\t });\r\n\t },\r\n\t _addToHistory: function _addToHistory(id, data, action) {\r\n\t if (!this._skipHistory && this._settings.undo) {\r\n\t this._undoHistory.push({\r\n\t id: id,\r\n\t action: action,\r\n\t data: data\r\n\t });\r\n\r\n\t if (this._undoHistory.length == 20) this._undoHistory.splice(0, 1);\r\n\t if (!this._skipCursorInc) this._undoCursor = this._undoHistory.length - 1;\r\n\t }\r\n\t },\r\n\t ignoreUndo: function ignoreUndo(func, master) {\r\n\t this._skipHistory = true;\r\n\t func.call(master || this);\r\n\t this._skipHistory = false;\r\n\t },\r\n\t removeUndo: function removeUndo(id) {\r\n\t for (var i = this._undoHistory.length - 1; i >= 0; i--) {\r\n\t if (this._undoHistory[i].id == id) {\r\n\t if (this._undoHistory[i].action == \"id\") {\r\n\t id = this._undoHistory[i].data;\r\n\t }\r\n\r\n\t this._undoHistory.removeAt(i);\r\n\t }\r\n\t }\r\n\r\n\t this._undoCursor = this._undoHistory.length - 1;\r\n\t },\r\n\t undo: function undo(id) {\r\n\t if (id) {\r\n\t this.ignoreUndo(function () {\r\n\t var data, i;\r\n\r\n\t for (i = this._undoHistory.length - 1; !data && i >= 0; i--) {\r\n\t if (this._undoHistory[i].id == id) data = this._undoHistory[i];\r\n\t }\r\n\r\n\t if (data) {\r\n\t /*if(data.action == \"id\")\r\n\t \tid = data.data;*/\r\n\t this._undoAction(data);\r\n\r\n\t this._undoHistory.removeAt(i + 1);\r\n\r\n\t this._undoCursor = this._undoHistory.length - 1;\r\n\t }\r\n\t });\r\n\t } else {\r\n\t var data = this._undoHistory[this._undoCursor];\r\n\r\n\t if (data) {\r\n\t this.ignoreUndo(function () {\r\n\t this._undoAction(data);\r\n\r\n\t this._undoHistory.removeAt(this._undoCursor);\r\n\t });\r\n\t this._undoCursor--;\r\n\t /*if(data.action == \"id\")\r\n\t \tthis.undo();*/\r\n\t }\r\n\t }\r\n\t },\r\n\t _undoAction: function _undoAction(obj) {\r\n\t if (obj.action == \"delete\") {\r\n\t var branch = null,\r\n\t parentId = obj.data.$parent;\r\n\r\n\t if (obj.data.$branch) {\r\n\t branch = {\r\n\t parent: obj.id,\r\n\t data: copy(obj.data.$branch)\r\n\t };\r\n\t delete obj.data.$branch;\r\n\t if (parentId && !this.data.branch[parentId]) parentId = 0;\r\n\t }\r\n\r\n\t this.add(obj.data, obj.data.$index, parentId);\r\n\r\n\t if (branch) {\r\n\t this.parse(branch);\r\n\t }\r\n\t } else if (obj.action == \"add\") {\r\n\t this.remove(obj.id);\r\n\t } else if (obj.action == \"update\") {\r\n\t this.updateItem(obj.id, obj.data);\r\n\t } else if (obj.action == \"move\") {\r\n\t if (obj.data.$parent) {\r\n\t if (this.getItem(obj.data.$parent)) this.move(obj.id, obj.data.$index, null, {\r\n\t parent: obj.data.$parent\r\n\t });\r\n\t } else this.move(obj.id, obj.data.$index);\r\n\t }\r\n\t /*else if(obj.action == \"id\"){\r\n\t \tthis.data.changeId(obj.id, obj.data);\r\n\t }*/\r\n\r\n\t }\r\n\t};\r\n\r\n\tfunction init_suggest(editor, input) {\r\n\t var suggest = editor.config.suggest;\r\n\r\n\t if (suggest) {\r\n\t var box = editor.config.suggest = create_suggest(suggest);\r\n\t var boxobj = $$(box);\r\n\t if (boxobj && input) boxobj.linkInput(input);\r\n\t }\r\n\t}\r\n\r\n\tfunction create_suggest(config) {\r\n\t if (typeof config == \"string\") return config;\r\n\t if (config.linkInput) return config._settings.id;\r\n\r\n\t if (_typeof(config) == \"object\") {\r\n\t if (isArray(config)) config = {\r\n\t data: config\r\n\t };\r\n\t config.view = config.view || \"suggest\";\r\n\t } else if (config === true) config = {\r\n\t view: \"suggest\"\r\n\t };\r\n\r\n\t var obj = ui(config);\r\n\t return obj.config.id;\r\n\t}\r\n\r\n\tfunction getLabel(config) {\r\n\t var text = config.header && config.header[0] ? config.header[0].text : config.editValue || config.label;\r\n\t return (text || \"\").toString().replace(/<[^>]*>/g, \"\");\r\n\t}\r\n\t/*\r\n\tthis.node - html node, available after render call\r\n\tthis.config - editor config\r\n\tthis.value - original value\r\n\tthis.popup - id of popup \r\n\t*/\r\n\r\n\r\n\tvar editors = {\r\n\t \"text\": {\r\n\t focus: function focus() {\r\n\t this.getInputNode(this.node).focus();\r\n\t this.getInputNode(this.node).select();\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this.getInputNode(this.node).value;\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t var input = this.getInputNode(this.node);\r\n\t input.value = value;\r\n\t init_suggest(this, input);\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this.node.firstChild;\r\n\t },\r\n\t render: function render() {\r\n\t return create(\"div\", {\r\n\t \"class\": \"webix_dt_editor\"\r\n\t }, \"\");\r\n\t }\r\n\t },\r\n\t \"inline-checkbox\": {\r\n\t render: function render() {\r\n\t return {};\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this.node.checked;\r\n\t },\r\n\t setValue: function setValue() {},\r\n\t focus: function focus() {\r\n\t this.node.focus();\r\n\t },\r\n\t getInputNode: function getInputNode() {},\r\n\t $inline: true\r\n\t },\r\n\t \"inline-text\": {\r\n\t render: function render() {\r\n\t return {};\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this.node.value;\r\n\t },\r\n\t setValue: function setValue() {},\r\n\t focus: function focus() {\r\n\t try {\r\n\t //IE9\r\n\t this.node.select();\r\n\t this.node.focus();\r\n\t } catch (e) {} //eslint-disable-line\r\n\r\n\t },\r\n\t getInputNode: function getInputNode() {},\r\n\t $inline: true\r\n\t },\r\n\t \"checkbox\": {\r\n\t focus: function focus() {\r\n\t this.getInputNode().focus();\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this.getInputNode().checked;\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this.getInputNode().checked = !!value;\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this.node.firstChild.firstChild;\r\n\t },\r\n\t render: function render() {\r\n\t return create(\"div\", {\r\n\t \"class\": \"webix_dt_editor\"\r\n\t }, \"
\");\r\n\t }\r\n\t },\r\n\t \"select\": {\r\n\t focus: function focus() {\r\n\t this.getInputNode().focus();\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this.getInputNode().value;\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this.getInputNode().value = value;\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this.node.firstChild;\r\n\t },\r\n\t render: function render() {\r\n\t var html = \"\";\r\n\t var options = this.config.options || this.config.collection;\r\n\t assert(options, \"options not defined for select editor\");\r\n\t if (options.data && options.data.each) options.data.each(function (obj) {\r\n\t html += \"\";\r\n\t });else {\r\n\t if (isArray(options)) {\r\n\t for (var i = 0; i < options.length; i++) {\r\n\t var rec = options[i];\r\n\t var isplain = isUndefined(rec.id);\r\n\t var id = isplain ? rec : rec.id;\r\n\t var label = isplain ? rec : rec.value;\r\n\t html += \"\";\r\n\t }\r\n\t } else for (var key in options) {\r\n\t html += \"\";\r\n\t }\r\n\t }\r\n\t return create(\"div\", {\r\n\t \"class\": \"webix_dt_editor\"\r\n\t }, \"\");\r\n\t }\r\n\t },\r\n\t popup: {\r\n\t focus: function focus() {\r\n\t this.getInputNode().focus();\r\n\t },\r\n\t destroy: function destroy() {\r\n\t this.getPopup().hide();\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this.getInputNode().getValue() || \"\";\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this.getPopup().show(this.node);\r\n\t this.getInputNode().setValue(value);\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this.getPopup().getChildViews()[0];\r\n\t },\r\n\t getPopup: function getPopup() {\r\n\t if (!this.config.$popup) this.config.$popup = this.createPopup();\r\n\t return $$(this.config.$popup);\r\n\t },\r\n\t createPopup: function createPopup() {\r\n\t var popup = this.config.popup || this.config.suggest;\r\n\r\n\t if (popup) {\r\n\t var pobj;\r\n\r\n\t if (_typeof(popup) == \"object\" && !popup.name) {\r\n\t popup.view = popup.view || \"suggest\";\r\n\t pobj = ui(copy(popup));\r\n\t } else pobj = $$(popup); //custom popup may be linked already\r\n\r\n\r\n\t if (!pobj._linked) {\r\n\t if (pobj.linkInput) pobj.linkInput(document.body);else if (this.linkInput) this.linkInput(document.body);\r\n\t pobj._linked = true;\r\n\t }\r\n\r\n\t return pobj;\r\n\t }\r\n\r\n\t var type = editors.$popup[this.popupType];\r\n\r\n\t if (typeof type != \"string\" && !type.name) {\r\n\t type = editors.$popup[this.popupType] = ui(type);\r\n\t this.popupInit(type);\r\n\t if (!type.linkInput) this.linkInput(document.body);\r\n\t }\r\n\r\n\t return type._settings.id;\r\n\t },\r\n\t linkInput: function linkInput(node) {\r\n\t _event(toNode(node), \"keydown\", bind(function (e) {\r\n\t //abort, when editor was not initialized yet\r\n\t if (!this.config.$popup) return;\r\n\t var code = e.which || e.keyCode,\r\n\t list = this.getInputNode();\r\n\t if (!list.isVisible()) return;\r\n\r\n\t if (list.moveSelection && code < 41 && code > 32) {\r\n\t var dir;\r\n\t if (code == 33) dir = \"pgup\";\r\n\t if (code == 34) dir = \"pgdown\";\r\n\t if (code == 35) dir = \"bottom\";\r\n\t if (code == 36) dir = \"top\";\r\n\t if (code == 37) dir = \"left\";\r\n\t if (code == 38) dir = \"up\";\r\n\t if (code == 39) dir = \"right\";\r\n\t if (code == 40) dir = \"down\";\r\n\t list.moveSelection(dir);\r\n\t } // shift+enter support for 'popup' editor\r\n\t else if (code === 13 && (e.target.nodeName !== \"TEXTAREA\" || !e.shiftKey)) callEvent(\"onEditEnd\", []);\r\n\t }, this));\r\n\t },\r\n\t popupInit: function popupInit() {},\r\n\t popupType: \"text\",\r\n\t render: function render() {\r\n\t return {};\r\n\t },\r\n\t $inline: true\r\n\t }\r\n\t};\r\n\teditors.color = exports.extend({\r\n\t focus: function focus() {},\r\n\t popupType: \"color\",\r\n\t popupInit: function popupInit(popup) {\r\n\t popup.getChildViews()[0].attachEvent(\"onItemClick\", function (value) {\r\n\t callEvent(\"onEditEnd\", [value]);\r\n\t });\r\n\t }\r\n\t}, editors.popup);\r\n\teditors.date = exports.extend({\r\n\t focus: function focus() {},\r\n\t popupType: \"date\",\r\n\t setValue: function setValue(value) {\r\n\t this._is_string = this.config.stringResult || value && typeof value == \"string\";\r\n\t editors.popup.setValue.call(this, value);\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this.getInputNode().getValue(this._is_string ? i18n.parseFormatStr : \"\") || \"\";\r\n\t },\r\n\t popupInit: function popupInit(popup) {\r\n\t popup.getChildViews()[0].attachEvent(\"onDateSelect\", function (value) {\r\n\t callEvent(\"onEditEnd\", [value]);\r\n\t });\r\n\t }\r\n\t}, editors.popup);\r\n\teditors.combo = exports.extend({\r\n\t _create_suggest: function _create_suggest(config) {\r\n\t if (this.config.popup) {\r\n\t return this.config.popup.config.id;\r\n\t } else if (config) {\r\n\t return create_suggest(config);\r\n\t } else return this._shared_suggest(config);\r\n\t },\r\n\t _shared_suggest: function _shared_suggest() {\r\n\t var e = editors.combo;\r\n\t return e._suggest = e._suggest || this._create_suggest(true);\r\n\t },\r\n\t render: function render() {\r\n\t var node = create(\"div\", {\r\n\t \"class\": \"webix_dt_editor\"\r\n\t }, \"\"); //save suggest id for future reference\t\t\r\n\r\n\t var suggest = this.config.suggest = this._create_suggest(this.config.suggest);\r\n\r\n\t if (suggest) {\r\n\t $$(suggest).linkInput(node.firstChild, true);\r\n\r\n\t _event(node.firstChild, \"click\", bind(this.showPopup, this));\r\n\t }\r\n\r\n\t return node;\r\n\t },\r\n\t getPopup: function getPopup() {\r\n\t return $$(this.config.suggest);\r\n\t },\r\n\t showPopup: function showPopup() {\r\n\t var popup = this.getPopup();\r\n\t var list = popup.getList();\r\n\t var input = this.getInputNode();\r\n\t var value = this._initial_value;\r\n\t popup.show(input);\r\n\t input.setAttribute(\"aria-expanded\", \"true\");\r\n\r\n\t if (value) {\r\n\t assert(list.exists(value), \"Option with ID \" + value + \" doesn't exist\");\r\n\r\n\t if (list.exists(value)) {\r\n\t list.select(value);\r\n\t list.showItem(value);\r\n\t }\r\n\t } else {\r\n\t list.unselect();\r\n\t list.showItem(list.getFirstId());\r\n\t }\r\n\r\n\t popup._last_input_target = input;\r\n\t },\r\n\t afterRender: function afterRender() {\r\n\t this.showPopup();\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this._initial_value = value;\r\n\r\n\t if (this.config.suggest) {\r\n\t var sobj = $$(this.config.suggest);\r\n\t var data = this.config.collection || this.config.options;\r\n\t if (data) sobj.getList().data.importData(data);\r\n\t this.getInputNode(this.node).value = sobj.getItemText(value);\r\n\t }\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t var value = this.getInputNode().value;\r\n\r\n\t if (this.config.suggest) {\r\n\t var suggest = $$(this.config.suggest),\r\n\t list = suggest.getList();\r\n\t if (value || list.getSelectedId && list.getSelectedId()) value = suggest.getSuggestion(value);\r\n\t }\r\n\r\n\t return value;\r\n\t }\r\n\t}, editors.text);\r\n\teditors.richselect = exports.extend({\r\n\t focus: function focus() {},\r\n\t getValue: function getValue$$1() {\r\n\t return this.getPopup().getValue();\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t var suggest = this.config.collection || this.config.options;\r\n\t this.getInputNode();\r\n\t if (suggest) this.getPopup().getList().data.importData(suggest);\r\n\t this.getPopup().show(this.node);\r\n\t this.getPopup().setValue(value);\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this.getPopup().getList();\r\n\t },\r\n\t popupInit: function popupInit(popup) {\r\n\t popup.linkInput(document.body);\r\n\t },\r\n\t popupType: \"richselect\"\r\n\t}, editors.popup);\r\n\teditors.password = exports.extend({\r\n\t render: function render() {\r\n\t return create(\"div\", {\r\n\t \"class\": \"webix_dt_editor\"\r\n\t }, \"\");\r\n\t }\r\n\t}, editors.text);\r\n\teditors.$popup = {\r\n\t text: {\r\n\t view: \"popup\",\r\n\t width: 250,\r\n\t height: 150,\r\n\t body: {\r\n\t view: \"textarea\"\r\n\t }\r\n\t },\r\n\t color: {\r\n\t view: \"popup\",\r\n\t body: {\r\n\t view: \"colorboard\"\r\n\t }\r\n\t },\r\n\t date: {\r\n\t view: \"popup\",\r\n\t width: 250,\r\n\t height: 250,\r\n\t padding: 0,\r\n\t body: {\r\n\t view: \"calendar\",\r\n\t icons: true,\r\n\t borderless: true\r\n\t }\r\n\t },\r\n\t richselect: {\r\n\t view: \"suggest\",\r\n\t body: {\r\n\t view: \"list\",\r\n\t select: true\r\n\t }\r\n\t },\r\n\t multiselect: {\r\n\t view: \"multisuggest\",\r\n\t suggest: {\r\n\t button: true\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t\tBehavior:EditAbility - enables item operation for the items\r\n\t\t\r\n\t\t@export\r\n\t\t\tedit\r\n\t\t\tstopEdit\r\n\t*/\r\n\r\n\tvar EditAbility = {\r\n\t defaults: {\r\n\t editaction: \"click\"\r\n\t },\r\n\t $init: function $init(config) {\r\n\t this._editors = {};\r\n\t this._in_edit_mode = 0;\r\n\t this._edit_open_time = 0;\r\n\t this._contentobj.style.position = \"relative\";\r\n\t if (config) config.onDblClick = config.onDblClick || {};\r\n\t this.attachEvent(\"onAfterRender\", this._refocus_inline_editor); //when we call extend the editable prop can be already set\r\n\r\n\t if (this._settings.editable) this._init_edit_events_once();\r\n\t exports.extend(this, Undo);\r\n\t },\r\n\t _refocus_try: function _refocus_try(newnode) {\r\n\t try {\r\n\t //Chrome throws an error if selectionStart is not accessible\r\n\t if (typeof newnode.selectionStart == \"number\") {\r\n\t newnode.selectionStart = newnode.selectionEnd = newnode.value.length;\r\n\t } else if (typeof newnode.createTextRange != \"undefined\") {\r\n\t var range = newnode.createTextRange();\r\n\t range.collapse(false);\r\n\t range.select();\r\n\t }\r\n\t } catch (e) {} // eslint-disable-line\r\n\r\n\t },\r\n\t _refocus_inline_editor: function _refocus_inline_editor() {\r\n\t var editor = this.getEditor();\r\n\r\n\t if (editor && editor.$inline && !editor.getPopup) {\r\n\t var newnode = this._locateInput(editor);\r\n\r\n\t if (newnode && newnode != editor.node) {\r\n\t var text = editor.node.value;\r\n\t editor.node = newnode;\r\n\t newnode.value = text;\r\n\t newnode.focus();\r\n\r\n\t this._refocus_try(newnode);\r\n\t } else this.editStop();\r\n\t }\r\n\t },\r\n\t editable_setter: function editable_setter(value) {\r\n\t if (value) this._init_edit_events_once();\r\n\t return value;\r\n\t },\r\n\t _init_edit_events_once: function _init_edit_events_once() {\r\n\t //will close editor on any click outside\r\n\t attachEvent(\"onEditEnd\", bind(function () {\r\n\t if (this._in_edit_mode) this.editStop();\r\n\t }, this));\r\n\t attachEvent(\"onClick\", bind(function (e) {\r\n\t //but ignore click which opens editor\r\n\t if (this._in_edit_mode && new Date() - this._edit_open_time > 200) {\r\n\t if (!this._last_editor || this._last_editor.popupType || !e || !this._last_editor.node || !this._last_editor.node.contains(e.target || e.srcElement)) this.editStop();\r\n\t }\r\n\t }, this)); //property sheet has simple data object, without events\r\n\r\n\t if (this.data.attachEvent) this.data.attachEvent(\"onIdChange\", bind(function (oldid, newid) {\r\n\t this._changeEditorId(oldid, newid);\r\n\t }, this)); //when clicking on row - will start editor\r\n\r\n\t this.attachEvent(\"onItemClick\", function (id) {\r\n\t if (this._settings.editable && this._settings.editaction == \"click\") this.edit(id);\r\n\t });\r\n\t this.attachEvent(\"onItemDblClick\", function (id) {\r\n\t if (this._settings.editable && this._settings.editaction == \"dblclick\") this.edit(id);\r\n\t }); //each time when we clicking on input, reset timer to prevent self-closing\r\n\r\n\t this._reset_active_editor = bind(function () {\r\n\t this._edit_open_time = new Date();\r\n\t }, this);\r\n\r\n\t this._init_edit_events_once = function () {};\r\n\r\n\t if (this._component_specific_edit_init) this._component_specific_edit_init();\r\n\t },\r\n\t _handle_live_edits: function _handle_live_edits() {\r\n\t delay(function () {\r\n\t var editor = this.getEditor();\r\n\r\n\t if (editor && editor.config.liveEdit) {\r\n\t var state$$1 = {\r\n\t value: editor.getValue(),\r\n\t old: editor.value\r\n\t };\r\n\t if (state$$1.value == state$$1.old) return;\r\n\t editor.value = state$$1.value;\r\n\r\n\t this._set_new_value(editor, state$$1.value, false);\r\n\r\n\t this.callEvent(\"onLiveEdit\", [state$$1, editor]);\r\n\t }\r\n\t }, this);\r\n\t },\r\n\t _show_editor_form: function _show_editor_form(id) {\r\n\t var form = this._settings.form;\r\n\t if (typeof form != \"string\") this._settings.form = form = ui(form).config.id;\r\n\t form = $$(form);\r\n\t var realform = form.setValues ? form : form.getChildViews()[0];\r\n\t realform.setValues(this.getItem(id.row || id));\r\n\t form.config.master = this.config.id;\r\n\t form.show(this.getItemNode(id));\r\n\t var first = realform.getChildViews()[0];\r\n\t if (first.focus) first.focus();\r\n\t },\r\n\t edit: function edit(id, preserve, show) {\r\n\t if (!this._settings.editable || !this.callEvent(\"onBeforeEditStart\", [id])) return;\r\n\t if (this._settings.form) return this._show_editor_form(id);\r\n\r\n\t var editor = this._get_editor_type(id);\r\n\r\n\t if (editor) {\r\n\t if (this.getEditor(id)) return;\r\n\t if (!preserve) this.editStop(); //render html input\r\n\r\n\t assert(editors[editor], \"Invalid editor type: \" + editor);\r\n\t var type = exports.extend({}, editors[editor]);\r\n\r\n\t var node = this._init_editor(id, type, show);\r\n\r\n\t if (type.config.liveEdit) this._live_edits_handler = this.attachEvent(\"onKeyPress\", this._handle_live_edits);\r\n\t var area = type.getPopup ? type.getPopup(node)._viewobj : node;\r\n\t if (area) _event(area, \"click\", this._reset_active_editor);\r\n\t if (node) _event(node, \"change\", this._on_editor_change, {\r\n\t bind: {\r\n\t view: this,\r\n\t id: id\r\n\t }\r\n\t });\r\n\t if (show !== false) type.focus();\r\n\t if (this.$fixEditor) this.$fixEditor(type); //save time of creation to prevent instant closing from the same click\r\n\r\n\t this._edit_open_time = state.edit_open_time = new Date();\r\n\t UIManager.setFocus(this, true);\r\n\t this.callEvent(\"onAfterEditStart\", [id]);\r\n\t return type;\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t getEditor: function getEditor(id) {\r\n\t if (!id) return this._last_editor;\r\n\t return this._editors[id];\r\n\t },\r\n\t _changeEditorId: function _changeEditorId(oldid, newid) {\r\n\t var editor = this._editors[oldid];\r\n\r\n\t if (editor) {\r\n\t this._editors[newid] = editor;\r\n\t editor.id = newid;\r\n\t delete this._editors[oldid];\r\n\t }\r\n\t },\r\n\t _on_editor_change: function _on_editor_change() {\r\n\t if (this.view.hasEvent(\"onEditorChange\")) this.view.callEvent(\"onEditorChange\", [this.id, this.view.getEditorValue(this.id)]);\r\n\t },\r\n\t _get_edit_config: function _get_edit_config() {\r\n\t return this._settings;\r\n\t },\r\n\t _init_editor: function _init_editor(id, type, show) {\r\n\t type.config = this._get_edit_config(id);\r\n\t var node = type.render();\r\n\t if (type.$inline) node = this._locateInput(id);\r\n\t type.node = node;\r\n\t var item = this.getItem(id); //value can be configured by editValue option\r\n\r\n\t var value = item[this._settings.editValue || \"value\"]; //if property was not defined - use empty value\r\n\r\n\t if (isUndefined(value)) value = \"\";\r\n\t type.setValue(value, item);\r\n\t type.value = value;\r\n\r\n\t this._addEditor(id, type); //show it over cell\r\n\r\n\r\n\t if (show !== false) this.showItem(id);\r\n\t if (!type.$inline) this._sizeToCell(id, node, true);\r\n\t if (type.afterRender) type.afterRender();\r\n\t return node;\r\n\t },\r\n\t _locate_cell: function _locate_cell(id) {\r\n\t return this.getItemNode(id);\r\n\t },\r\n\t _locateInput: function _locateInput(id) {\r\n\t var cell = this._locate_cell(id);\r\n\r\n\t if (cell) cell = cell.getElementsByTagName(\"input\")[0] || cell;\r\n\t return cell;\r\n\t },\r\n\t _get_editor_type: function _get_editor_type() {\r\n\t return this._settings.editor;\r\n\t },\r\n\t _addEditor: function _addEditor(id, type) {\r\n\t type.id = id;\r\n\t this._editors[id] = this._last_editor = type;\r\n\t this._in_edit_mode++;\r\n\t },\r\n\t _removeEditor: function _removeEditor(editor) {\r\n\t if (this._last_editor == editor) this._last_editor = 0;\r\n\t if (editor.destroy) editor.destroy();\r\n\t delete editor.popup;\r\n\t delete editor.node;\r\n\t delete this._editors[editor.id];\r\n\t this._in_edit_mode--;\r\n\t },\r\n\t focusEditor: function focusEditor() {\r\n\t var editor = this.getEditor.apply(this, arguments);\r\n\t if (editor && editor.focus) editor.focus();\r\n\t },\r\n\t editCancel: function editCancel() {\r\n\t this.editStop(null, null, true);\r\n\t },\r\n\t _applyChanges: function _applyChanges(el) {\r\n\t if (el) {\r\n\t var ed = this.getEditor();\r\n\t if (ed && ed.getPopup && ed.getPopup() == el.getTopParentView()) return;\r\n\t }\r\n\r\n\t this.editStop();\r\n\t },\r\n\t editStop: function editStop(id) {\r\n\t if (this._edit_stop) return;\r\n\t this._edit_stop = 1;\r\n\t var cancel = arguments[2];\r\n\t var result = 1;\r\n\r\n\t if (!id) {\r\n\t this._for_each_editor(function (editor) {\r\n\t result = result * this._editStop(editor, cancel);\r\n\t });\r\n\t } else result = this._editStop(this._editors[id], cancel);\r\n\r\n\t this._edit_stop = 0;\r\n\t return result;\r\n\t },\r\n\t _cellPosition: function _cellPosition(id) {\r\n\t var html = this.getItemNode(id);\r\n\t return {\r\n\t left: html.offsetLeft,\r\n\t top: html.offsetTop,\r\n\t height: html.offsetHeight,\r\n\t width: html.offsetWidth,\r\n\t parent: this._contentobj\r\n\t };\r\n\t },\r\n\t _sizeToCell: function _sizeToCell(id, node, inline) {\r\n\t //fake inputs\r\n\t if (!node.style) return;\r\n\r\n\t var pos$$1 = this._cellPosition(id);\r\n\r\n\t node.style.top = pos$$1.top + \"px\";\r\n\t node.style.left = pos$$1.left + \"px\";\r\n\t node.style.width = pos$$1.width - 1 + \"px\";\r\n\t node.style.height = pos$$1.height - 1 + \"px\";\r\n\t node.top = pos$$1.top; //later will be used during y-scrolling\r\n\r\n\t if (inline) pos$$1.parent.appendChild(node);\r\n\t },\r\n\t _for_each_editor: function _for_each_editor(handler) {\r\n\t for (var editor in this._editors) {\r\n\t handler.call(this, this._editors[editor]);\r\n\t }\r\n\t },\r\n\t _editStop: function _editStop(editor, ignore) {\r\n\t if (!editor || state._final_destruction) return;\r\n\t var state$$1 = {\r\n\t value: editor.getValue(),\r\n\t old: editor.value\r\n\t };\r\n\r\n\t if (this.callEvent(\"onBeforeEditStop\", [state$$1, editor, ignore])) {\r\n\t if (!ignore) {\r\n\t //special case, state.old = 0, state.value = \"\"\r\n\t //we need to state.old to string, to detect the change\r\n\t var old = state$$1.old;\r\n\t if (typeof state$$1.value == \"string\") old += \"\";\r\n\r\n\t if (old != state$$1.value || editor.config.liveEdit) {\r\n\t var item = this._set_new_value(editor, state$$1.value, true);\r\n\r\n\t this.updateItem(editor.row || editor.id, item);\r\n\t }\r\n\t }\r\n\r\n\t if (editor.$inline) editor.node = null;else remove(editor.node);\r\n\t var popup = editor.config.suggest;\r\n\t if (popup && typeof popup == \"string\") $$(popup).hide();\r\n\r\n\t this._removeEditor(editor);\r\n\r\n\t if (this._live_edits_handler) this.detachEvent(this._live_edits_handler);\r\n\t this.callEvent(\"onAfterEditStop\", [state$$1, editor, ignore]);\r\n\t return 1;\r\n\t }\r\n\r\n\t return 0;\r\n\t },\r\n\t validateEditor: function validateEditor(id) {\r\n\t var result = true;\r\n\r\n\t if (this._settings.rules) {\r\n\t var editor = this.getEditor(id);\r\n\t var key = editor.column || this._settings.editValue || \"value\";\r\n\t var rule = this._settings.rules[key];\r\n\t var all = this._settings.rules.$all;\r\n\r\n\t if (rule || all) {\r\n\t var obj = this.data.getItem(editor.row || editor.id);\r\n\t var value = editor.getValue();\r\n\t var input = editor.getInputNode();\r\n\t if (rule) result = rule.call(this, value, obj, key);\r\n\t if (all) result = all.call(this, value, obj, key) && result;\r\n\t if (result) removeCss(input, \"webix_invalid\");else addCss(input, \"webix_invalid\");\r\n\t callEvent(\"onLiveValidation\", [editor, result, obj, value]);\r\n\t }\r\n\t }\r\n\r\n\t return result;\r\n\t },\r\n\t getEditorValue: function getEditorValue(id) {\r\n\t var editor;\r\n\t if (arguments.length === 0) editor = this._last_editor;else editor = this.getEditor(id);\r\n\t if (editor) return editor.getValue();\r\n\t },\r\n\t getEditState: function getEditState() {\r\n\t return this._last_editor || false;\r\n\t },\r\n\t editNext: function editNext(next, from) {\r\n\t next = next !== false; //true by default\r\n\r\n\t if (this._in_edit_mode == 1 || from) {\r\n\t //only if one editor is active\r\n\t var editor_next = this._find_cell_next(this._last_editor || from, function (id) {\r\n\t if (this._get_editor_type(id)) return true;\r\n\t return false;\r\n\t }, next);\r\n\r\n\t if (this.editStop()) {\r\n\t //if we was able to close previous editor\r\n\t if (editor_next) {\r\n\t //and there is a new target\r\n\t this.edit(editor_next); //init new editor\r\n\r\n\t this._after_edit_next(editor_next);\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\t }\r\n\t },\r\n\t //stab, used in datatable\r\n\t _after_edit_next: function _after_edit_next() {},\r\n\t _find_cell_next: function _find_cell_next(start, check, direction) {\r\n\t var row = this.getIndexById(start.id);\r\n\t var order = this.data.order;\r\n\r\n\t if (direction) {\r\n\t for (var i = row + 1; i < order.length; i++) {\r\n\t if (check.call(this, order[i])) return order[i];\r\n\t }\r\n\t } else {\r\n\t for (var _i = row - 1; _i >= 0; _i--) {\r\n\t if (check.call(this, order[_i])) return order[_i];\r\n\t }\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t _set_new_value: function _set_new_value(editor, new_value, copy$$1) {\r\n\t var item = copy$$1 ? {} : this.getItem(editor.id);\r\n\t item[this._settings.editValue || \"value\"] = new_value;\r\n\t return item;\r\n\t }\r\n\t};\r\n\r\n\tvar FlexLayout = {\r\n\t $init: function $init() {\r\n\t this.$view.className += \" webix_flexlayout\";\r\n\t },\r\n\t _fix_vertical_layout: function _fix_vertical_layout() {},\r\n\t _beforeResetBorders: function _beforeResetBorders() {},\r\n\t _afterResetBorders: function _afterResetBorders() {},\r\n\t $getSize: function $getSize() {\r\n\t debug_size_box_start(this, true);\r\n\t var w = 0,\r\n\t h = 0,\r\n\t g = this._settings.gravity;\r\n\t this._sizes = [];\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t var size = this._cells[i].$getSize(0, 0);\r\n\r\n\t this._sizes.push(size);\r\n\r\n\t w = Math.max(w, size[0]);\r\n\t h = Math.max(h, size[2]);\r\n\t }\r\n\r\n\t w += (this._paddingX || 0) * 2;\r\n\t h += (this._paddingY || 0) * 2;\r\n\t if (this._settings.width) w = Math.max(w, this._settings.width);\r\n\t if (this._settings.height) h = Math.max(h, this._settings.height);\r\n\t var self_size = [w, 100000, h, 100000, g];\r\n\t debug_size_box_end(this, self_size);\r\n\t return self_size;\r\n\t },\r\n\t render: function render() {\r\n\t this.resize();\r\n\t },\r\n\t _set_child_size: function _set_child_size() {\r\n\t if (!this.isVisible(this._settings.id)) return;\r\n\t var st = this.$view.style;\r\n\t var margin = Math.round(this._margin / 2);\r\n\t st.paddingTop = st.paddingBottom = this._paddingY - margin + \"px\";\r\n\t st.paddingLeft = st.paddingRight = this._paddingX - margin + \"px\";\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t if (this._cells[i]._settings.hidden) continue;\r\n\t var view = this._cells[i].$view;\r\n\t var size = this._sizes[i];\r\n\t var config = this._cells[i]._settings;\r\n\r\n\t if (view) {\r\n\t view.style.minWidth = size[0] + \"px\";\r\n\t if (size[1] < 100000 && size[1] != size[0]) view.style.maxWidth = size[1] + \"px\";\r\n\t view.style.flexBasis = config.flexBasis || size[0] + \"px\";\r\n\t view.style.flexGrow = config.flexGrow || (size[1] != size[0] ? size[4] : 0);\r\n\t view.style.height = size[3] != size[2] ? \"auto\" : size[2] + \"px\";\r\n\t view.style.minHeight = size[2] + \"px\";\r\n\t if (size[3] < 100000 && size[3] != size[2]) view.style.maxHeight = size[3] + \"px\";\r\n\t view.style.margin = margin + \"px\";\r\n\t }\r\n\t }\r\n\r\n\t var whs = [];\r\n\r\n\t for (var _i = 0; _i < this._cells.length; _i++) {\r\n\t if (this._cells[_i]._settings.hidden) continue;\r\n\t var _view = this._cells[_i].$view;\r\n\t whs[_i] = [_view.offsetWidth, _view.offsetHeight];\r\n\t }\r\n\r\n\t for (var _i2 = 0; _i2 < this._cells.length; _i2++) {\r\n\t if (this._cells[_i2]._settings.hidden) continue;\r\n\t var cell = this._cells[_i2];\r\n\t var _view2 = cell.$view;\r\n\r\n\t if (_view2) {\r\n\t cell._settings.flex = true;\r\n\t var _size = this._sizes[_i2];\r\n\t var h = _size[2] == _size[3] ? _size[2] : whs[_i2][1];\r\n\t cell.$setSize(whs[_i2][0], h);\r\n\t cell._settings.flex = false;\r\n\t }\r\n\t }\r\n\r\n\t this.$height = this._content_height = this.$view.scrollHeight;\r\n\t this.$view.style.height = this._content_height + \"px\";\r\n\t }\r\n\t};\r\n\r\n\tvar GroupMethods = {\r\n\t sum: function sum(property, data) {\r\n\t data = data || this;\r\n\t var summ = 0;\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t summ += property(data[i]) * 1;\r\n\t }\r\n\r\n\t return summ;\r\n\t },\r\n\t min: function min(property, data) {\r\n\t data = data || this;\r\n\t var min = Infinity;\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t if (property(data[i]) * 1 < min) min = property(data[i]) * 1;\r\n\t }\r\n\r\n\t return min * 1;\r\n\t },\r\n\t max: function max(property, data) {\r\n\t data = data || this;\r\n\t var max = -Infinity;\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t if (property(data[i]) * 1 > max) max = property(data[i]) * 1;\r\n\t }\r\n\r\n\t return max * 1;\r\n\t },\r\n\t count: function count(property, data) {\r\n\t var count = 0;\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t var some = property(data[i]);\r\n\t if (some !== null && typeof some !== \"undefined\") count++;\r\n\t }\r\n\r\n\t return count;\r\n\t },\r\n\t any: function any(property, data) {\r\n\t return property(data[0]);\r\n\t },\r\n\t string: function string(property) {\r\n\t return property.$name;\r\n\t }\r\n\t};\r\n\r\n\tvar GroupStore = {\r\n\t $init: function $init() {\r\n\t this.attachEvent(\"onClearAll\", this._reset_groups);\r\n\t },\r\n\t _reset_groups: function _reset_groups() {\r\n\t this._not_grouped_order = this._not_grouped_pull = null;\r\n\t this._group_level_count = 0;\r\n\t },\r\n\t ungroup: function ungroup(skipRender) {\r\n\t if (this.getBranchIndex) return this._ungroup_tree.apply(this, arguments);\r\n\r\n\t if (this._not_grouped_order) {\r\n\t this.order = this._not_grouped_order;\r\n\t this.pull = this._not_grouped_pull;\r\n\t this._not_grouped_pull = this._not_grouped_order = null;\r\n\t if (!skipRender) this.callEvent(\"onStoreUpdated\", []);\r\n\t }\r\n\t },\r\n\t _group_processing: function _group_processing(scheme) {\r\n\t this.blockEvent();\r\n\t this.group(scheme);\r\n\t this.unblockEvent();\r\n\t },\r\n\t _group_prop_accessor: function _group_prop_accessor(val) {\r\n\t if (typeof val == \"function\") return val;\r\n\r\n\t var acc = function acc(obj) {\r\n\t return obj[val];\r\n\t };\r\n\r\n\t acc.$name = val;\r\n\t return acc;\r\n\t },\r\n\t group: function group(stats) {\r\n\t if (this.getBranchIndex) return this._group_tree.apply(this, arguments);\r\n\t if (typeof stats == \"string\") stats = {\r\n\t by: stats,\r\n\t map: {}\r\n\t };\r\n\t var input = typeof stats.by == \"function\" ? \"value\" : stats.by;\r\n\r\n\t var key = this._group_prop_accessor(stats.by);\r\n\r\n\t if (!stats.map[input]) stats.map[input] = [input, this._any];\r\n\t var groups = {};\r\n\t var labels = [];\r\n\t this.each(function (data) {\r\n\t var current = key(data);\r\n\r\n\t if (!groups[current]) {\r\n\t labels.push({\r\n\t id: current,\r\n\t $group: true,\r\n\t $row: stats.row\r\n\t });\r\n\t groups[current] = toArray();\r\n\t }\r\n\r\n\t groups[current].push(data);\r\n\t });\r\n\r\n\t for (var prop in stats.map) {\r\n\t var functor = stats.map[prop][1] || \"any\";\r\n\r\n\t var property = this._group_prop_accessor(stats.map[prop][0]);\r\n\r\n\t if (typeof functor != \"function\") {\r\n\t assert(GroupMethods[functor], \"unknown grouping rule: \" + functor);\r\n\t functor = GroupMethods[functor];\r\n\t }\r\n\r\n\t for (var i = 0; i < labels.length; i++) {\r\n\t labels[i][prop] = functor.call(this, property, groups[labels[i].id]);\r\n\t }\r\n\t }\r\n\r\n\t this._not_grouped_order = this.order;\r\n\t this._not_grouped_pull = this.pull;\r\n\t this.order = toArray();\r\n\t this.pull = {};\r\n\r\n\t for (var _i = 0; _i < labels.length; _i++) {\r\n\t var id = this.id(labels[_i]);\r\n\t this.pull[id] = labels[_i];\r\n\t this.order.push(id);\r\n\t if (this._scheme_init) this._scheme_init(labels[_i]);\r\n\t }\r\n\r\n\t this.callEvent(\"onStoreUpdated\", []);\r\n\t },\r\n\t _group_tree: function _group_tree(input, parent) {\r\n\t this._group_level_count = (this._group_level_count || 0) + 1; //supports simplified group by syntax\r\n\r\n\t var stats;\r\n\r\n\t if (typeof input == \"string\") {\r\n\t stats = {\r\n\t by: this._group_prop_accessor(input),\r\n\t map: {}\r\n\t };\r\n\t stats.map[input] = [input];\r\n\t } else if (typeof input == \"function\") {\r\n\t stats = {\r\n\t by: input,\r\n\t map: {}\r\n\t };\r\n\t } else stats = input; //prepare\r\n\r\n\r\n\t var level;\r\n\t if (parent) level = this.getItem(parent).$level;else {\r\n\t parent = 0;\r\n\t level = 0;\r\n\t }\r\n\t var order = this.branch[parent];\r\n\r\n\t var key = this._group_prop_accessor(stats.by); //run\r\n\r\n\r\n\t var topbranch = [];\r\n\t var labels = [];\r\n\r\n\t for (var i = 0; i < order.length; i++) {\r\n\t var data = this.getItem(order[i]);\r\n\t var current = key(data);\r\n\t var current_id = level + \"$\" + current;\r\n\t var ancestor = this.branch[current_id];\r\n\r\n\t if (!ancestor) {\r\n\t var newitem = this.pull[current_id] = {\r\n\t id: current_id,\r\n\t value: current,\r\n\t $group: true,\r\n\t $row: stats.row\r\n\t };\r\n\t if (this._scheme_init) this._scheme_init(newitem);\r\n\t labels.push(newitem);\r\n\t ancestor = this.branch[current_id] = [];\r\n\t ancestor._formath = [];\r\n\t topbranch.push(current_id);\r\n\t }\r\n\r\n\t ancestor.push(data.id);\r\n\r\n\t ancestor._formath.push(data);\r\n\t }\r\n\r\n\t this.branch[parent] = topbranch;\r\n\r\n\t for (var prop in stats.map) {\r\n\t var functor = stats.map[prop][1] || \"any\";\r\n\r\n\t var property = this._group_prop_accessor(stats.map[prop][0]);\r\n\r\n\t if (typeof functor != \"function\") {\r\n\t assert(GroupMethods[functor], \"unknown grouping rule: \" + functor);\r\n\t functor = GroupMethods[functor];\r\n\t }\r\n\r\n\t for (var _i2 = 0; _i2 < labels.length; _i2++) {\r\n\t labels[_i2][prop] = functor.call(this, property, this.branch[labels[_i2].id]._formath);\r\n\t }\r\n\t }\r\n\r\n\t for (var _i3 = 0; _i3 < labels.length; _i3++) {\r\n\t var group = labels[_i3];\r\n\t if (this.hasEvent(\"onGroupCreated\")) this.callEvent(\"onGroupCreated\", [group.id, group.value, this.branch[group.id]._formath]);\r\n\r\n\t if (stats.footer) {\r\n\t var id = \"footer$\" + group.id;\r\n\t var footer = this.pull[id] = {\r\n\t id: id,\r\n\t $footer: true,\r\n\t value: group.value,\r\n\t $level: level,\r\n\t $count: 0,\r\n\t $parent: group.id,\r\n\t $row: stats.footer.row\r\n\t };\r\n\r\n\t for (var _prop in stats.footer) {\r\n\t var _functor = stats.footer[_prop][1] || \"any\";\r\n\r\n\t var _property = this._group_prop_accessor(stats.footer[_prop][0]);\r\n\r\n\t if (typeof _functor != \"function\") {\r\n\t assert(GroupMethods[_functor], \"unknown grouping rule: \" + _functor);\r\n\t _functor = GroupMethods[_functor];\r\n\t }\r\n\r\n\t footer[_prop] = _functor.call(this, _property, this.branch[labels[_i3].id]._formath);\r\n\t }\r\n\r\n\t this.branch[group.id].push(footer.id);\r\n\t this.callEvent(\"onGroupFooter\", [footer.id, footer.value, this.branch[group.id]._formath]);\r\n\t }\r\n\r\n\t delete this.branch[group.id]._formath;\r\n\t }\r\n\r\n\t this._fix_group_levels(topbranch, parent, level + 1);\r\n\r\n\t this.callEvent(\"onStoreUpdated\", []);\r\n\t },\r\n\t _ungroup_tree: function _ungroup_tree(skipRender, parent, force) {\r\n\t //not grouped\r\n\t if (!force && !this._group_level_count) return;\r\n\t this._group_level_count = Math.max(0, this._group_level_count - 1);\r\n\t parent = parent || 0;\r\n\t var order = [];\r\n\t var toporder = this.branch[parent];\r\n\r\n\t for (var i = 0; i < toporder.length; i++) {\r\n\t var id = toporder[i];\r\n\t var branch = this.branch[id];\r\n\t if (branch) order = order.concat(branch);\r\n\t delete this.pull[id];\r\n\t delete this.branch[id];\r\n\t }\r\n\r\n\t this.branch[parent] = order;\r\n\r\n\t for (var _i4 = order.length - 1; _i4 >= 0; _i4--) {\r\n\t if (this.pull[order[_i4]].$footer) order.splice(_i4, 1);\r\n\t }\r\n\r\n\t this._fix_group_levels(order, 0, 1);\r\n\r\n\t if (!skipRender) this.callEvent(\"onStoreUpdated\", []);\r\n\t },\r\n\t _fix_group_levels: function _fix_group_levels(branch, parent, level) {\r\n\t if (parent) this.getItem(parent).$count = branch.length;\r\n\r\n\t for (var i = 0; i < branch.length; i++) {\r\n\t var item = this.pull[branch[i]];\r\n\t item.$level = level;\r\n\t item.$parent = parent;\r\n\t var next = this.branch[item.id];\r\n\t if (next) this._fix_group_levels(next, item.id, level + 1);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Group = {\r\n\t $init: function $init() {\r\n\t exports.extend(this.data, GroupStore); //in case of plain store we need to remove store original dataset\r\n\r\n\t this.data.attachEvent(\"onClearAll\", bind(function () {\r\n\t this.data._not_grouped_order = this.data._not_grouped_pull = null;\r\n\t this._group_level_count = 0;\r\n\t }, this));\r\n\t },\r\n\t group: function group(config) {\r\n\t this.data.ungroup(true);\r\n\t this.data.group(config);\r\n\t },\r\n\t ungroup: function ungroup(skipRender) {\r\n\t this.data.ungroup(skipRender);\r\n\t }\r\n\t};\r\n\r\n\t/*aria-style handling for options of multiple-value controls (radio, segmented, tabbar)*/\r\n\r\n\tvar HTMLOptions = {\r\n\t $init: function $init() {\r\n\t if ($active.customRadio || this.addOption) _event(this.$view, \"keydown\", this._moveSelection, {\r\n\t bind: this\r\n\t });\r\n\t },\r\n\t _focus: function _focus() {\r\n\t if (!this._settings.disabled && !this.queryView({\r\n\t disabled: true\r\n\t }, \"parent\")) {\r\n\t var input = this._getInputNode();\r\n\r\n\t if (input) for (var i = 0; i < input.length; i++) {\r\n\t if (input[i].getAttribute(\"tabindex\") == \"0\") {\r\n\t input[i].focus();\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _blur: function _blur() {\r\n\t var input = this._getInputNode();\r\n\r\n\t if (input) for (var i = 0; i < input.length; i++) {\r\n\t if (input[i].getAttribute(\"tabindex\") == \"0\") input[i].blur();\r\n\t }\r\n\t },\r\n\t _moveSelection: function _moveSelection(e) {\r\n\t var code = e.which || e.keyCode;\r\n\t var startCode = this.addOption ? 34 : 36;\r\n\r\n\t if (code > startCode && code < 41) {\r\n\t preventEvent(e);\r\n\t var index$$1;\r\n\r\n\t var inp = this._getInputNode();\r\n\r\n\t if (code == 35) index$$1 = inp.length - 1;else if (code === 36) index$$1 = 0;else {\r\n\t var dir = code === 37 || code === 38 ? -1 : 1;\r\n\r\n\t for (var i = 0; i < inp.length; i++) {\r\n\t if (inp[i].getAttribute(\"tabindex\") == \"0\") {\r\n\t index$$1 = i + dir;\r\n\t if (index$$1 < 0) index$$1 = inp.length - 1;else if (index$$1 >= inp.length) index$$1 = 0;\r\n\t break;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (!isUndefined(index$$1)) {\r\n\t var id = inp[index$$1].getAttribute(\"button_id\");\r\n\t this.setValue(id);\r\n\t inp[index$$1].focus();\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar HtmlMap = exports.proto({\r\n\t $init: function $init(key) {\r\n\t this._id = \"map_\" + uid();\r\n\t this._key = key;\r\n\t this._map = [];\r\n\t this._areas = [];\r\n\t },\r\n\t addRect: function addRect(id, points, userdata) {\r\n\t this._createMapArea(id, \"RECT\", points, userdata);\r\n\t },\r\n\t addPoly: function addPoly(id, points, userdata) {\r\n\t this._createMapArea(id, \"POLY\", points, userdata);\r\n\t },\r\n\t _createMapArea: function _createMapArea(id, shape, coords, userdata) {\r\n\t var extra_data = \"\";\r\n\t if (arguments.length == 4) extra_data = \"userdata='\" + userdata + \"'\";\r\n\r\n\t this._map.push(\"\");\r\n\r\n\t this._areas.push({\r\n\t index: userdata,\r\n\t points: coords\r\n\t });\r\n\t },\r\n\t addSector: function addSector(id, alpha0, alpha1, x, y, R, ky, userdata) {\r\n\t var points = [];\r\n\t points.push(x);\r\n\t points.push(Math.floor(y * ky));\r\n\r\n\t for (var i = alpha0; i < alpha1; i += Math.PI / 18) {\r\n\t points.push(Math.floor(x + R * Math.cos(i)));\r\n\t points.push(Math.floor((y + R * Math.sin(i)) * ky));\r\n\t }\r\n\r\n\t points.push(Math.floor(x + R * Math.cos(alpha1)));\r\n\t points.push(Math.floor((y + R * Math.sin(alpha1)) * ky));\r\n\t points.push(x);\r\n\t points.push(Math.floor(y * ky));\r\n\t return this.addPoly(id, points, userdata);\r\n\t },\r\n\t hide: function hide(obj, data, mode) {\r\n\t if (obj.querySelectorAll) {\r\n\t var nodes = obj.querySelectorAll(\"area[userdata=\\\"\" + data + \"\\\"]\");\r\n\r\n\t for (var i = 0; i < nodes.length; i++) {\r\n\t var nod = nodes[i];\r\n\r\n\t if (mode) {\r\n\t if (nod.getAttribute(\"coords\")) {\r\n\t nod.coordsdis = nod.getAttribute(\"coords\");\r\n\t nod.setAttribute(\"coords\", \"\");\r\n\t nod.coords = \"\";\r\n\t }\r\n\t } else if (!mode) {\r\n\t if (nod.coordsdis) {\r\n\t nod.setAttribute(\"coords\", nod.coordsdis);\r\n\t nod.coords = nod.coordsdis;\r\n\t nod.coordsdis = \"\";\r\n\t }\r\n\t }\r\n\r\n\t nodes[i].style.display = mode ? \"none\" : \"\";\r\n\t }\r\n\t }\r\n\t },\r\n\t render: function render(obj) {\r\n\t var d = create(\"DIV\");\r\n\t d.style.cssText = \"position:absolute; width:100%; height:100%; top:0px; left:0px;\";\r\n\t obj.appendChild(d);\r\n\t var src = env.isIE ? \"\" : \"src='data:image/gif;base64,R0lGODlhEgASAIAAAP///////yH5BAUUAAEALAAAAAASABIAAAIPjI+py+0Po5y02ouz3pwXADs='\";\r\n\t d.innerHTML = \"\" + this._map.join(\"\\n\") + \"\";\r\n\t obj._htmlmap = d; //for clearing routine\r\n\r\n\t this._map = [];\r\n\t }\r\n\t});\r\n\r\n\tvar IdSpace = {\r\n\t $init: function $init() {\r\n\t this._elements = {};\r\n\t this._translate_ids = {};\r\n\t this.getTopParentView = this._get_self = bind(function () {\r\n\t return this;\r\n\t }, this);\r\n\r\n\t this._run_inner_init_logic();\r\n\r\n\t this.$ready.push(this._run_after_inner_init_logic);\r\n\t },\r\n\t $$: function $$$$1(id) {\r\n\t return this._elements[id];\r\n\t },\r\n\t innerId: function innerId(id) {\r\n\t return this._translate_ids[id];\r\n\t },\r\n\t _run_inner_init_logic: function _run_inner_init_logic() {\r\n\t this._prev_global_col = state._global_collection;\r\n\t state._global_collection = this;\r\n\t },\r\n\t _run_after_inner_init_logic: function _run_after_inner_init_logic() {\r\n\t for (var name in this._elements) {\r\n\t var input = this._elements[name];\r\n\t if (this.callEvent && input.mapEvent && !input._evs_map.onitemclick) input.mapEvent({\r\n\t onitemclick: this\r\n\t });\r\n\t input.getTopParentView = this._get_self;\r\n\t }\r\n\r\n\t state._global_collection = this._prev_global_col;\r\n\t this._prev_global_col = 0;\r\n\t },\r\n\t _destroy_child: function _destroy_child(id) {\r\n\t delete this._elements[id];\r\n\t },\r\n\t ui: function ui$$1() {\r\n\t this._run_inner_init_logic();\r\n\r\n\t var temp = ui.apply(this, arguments);\r\n\r\n\t this._run_after_inner_init_logic();\r\n\r\n\t return temp;\r\n\t }\r\n\t};\r\n\r\n\tvar KeysNavigation = {\r\n\t $init: function $init() {\r\n\t if (this.getSelectedId) {\r\n\t this.attachEvent(\"onAfterRender\", this._set_focusable_item);\r\n\t this.attachEvent(\"onAfterSelect\", once(function (id) {\r\n\t if (this.count() > 1 && this._dataobj && this.data.order[0] != id) {\r\n\t var node = this._dataobj.querySelector(\"[\" + this._id + \"]\");\r\n\r\n\t if (node) {\r\n\t node.setAttribute(\"tabindex\", \"-1\");\r\n\t removeCss(node, \"webix_focused\");\r\n\t }\r\n\t }\r\n\t }));\r\n\t }\r\n\t },\r\n\t _set_focusable_item: function _set_focusable_item() {\r\n\t var sel = this.getSelectedId(true);\r\n\r\n\t if (!sel.length || !this.getItemNode(sel[0])) {\r\n\t var node = this._dataobj.querySelector(\"[\" + this._id + \"]\");\r\n\r\n\t if (node) {\r\n\t node.setAttribute(\"tabindex\", \"0\");\r\n\t addCss(node, \"webix_focused\");\r\n\t }\r\n\t }\r\n\t },\r\n\t _navigation_helper: function _navigation_helper(mode) {\r\n\t return function (view, e) {\r\n\t var tag = e.srcElement || e.target; //ignore clipboard listener\r\n\r\n\t if (!tag.getAttribute(\"webixignore\")) {\r\n\t //ignore hotkeys if focus in the common input\r\n\t //to allow normal text edit operations\r\n\t var name = tag.tagName;\r\n\t if (name == \"INPUT\" || name == \"TEXTAREA\" || name == \"SELECT\") return true;\r\n\t }\r\n\r\n\t if (view && view.moveSelection && view.config.navigation && !view._in_edit_mode) {\r\n\t preventEvent(e);\r\n\t return view.moveSelection(mode, {\r\n\t shift: e.shiftKey,\r\n\t ctrl: e.ctrlKey\r\n\t });\r\n\t }\r\n\r\n\t return true;\r\n\t };\r\n\t },\r\n\t moveSelection: function moveSelection(mode, details, focus) {\r\n\t var config = this._settings;\r\n\t if (config.disabled) return; //get existing selection\r\n\r\n\t var selected = this.getSelectedId(true);\r\n\t var x_layout = this.count && (config.layout == \"x\" || config.xCount > 1);\r\n\r\n\t if ((mode == \"right\" || mode == \"left\") && this._parent_menu) {\r\n\t var parent = $$(this._parent_menu);\r\n\r\n\t parent._hide_sub_menu(true);\r\n\r\n\t if (parent.config.layout === \"x\") parent.moveSelection(mode);else UIManager.setFocus(parent);\r\n\t return;\r\n\t }\r\n\r\n\t if (!selected.length && this.count()) {\r\n\t if (mode == \"down\" || mode == \"right\" && x_layout) mode = \"top\";else if (mode == \"up\" || mode == \"left\" && x_layout) mode = \"bottom\";else return;\r\n\t selected = [this.getFirstId()];\r\n\t }\r\n\r\n\t if (selected.length == 1) {\r\n\t //if we have a selection\r\n\t selected = selected[0];\r\n\t var prev = selected;\r\n\t if (mode == \"left\" && this.close) return this.close(selected);\r\n\t if (mode == \"right\" && this.open) return this.open(selected);else if (mode == \"top\") {\r\n\t selected = this.getFirstId();\r\n\t } else if (mode == \"bottom\") {\r\n\t selected = this.getLastId();\r\n\t } else if (mode == \"up\" || mode == \"left\" || mode == \"pgup\") {\r\n\t var index$$1 = this.getIndexById(selected);\r\n\t var step = mode == \"pgup\" ? 10 : 1;\r\n\t selected = this.getIdByIndex(Math.max(0, index$$1 - step));\r\n\t } else if (mode == \"down\" || mode == \"right\" || mode == \"pgdown\") {\r\n\t var _index = this.getIndexById(selected);\r\n\r\n\t var _step = mode == \"pgdown\" ? 10 : 1;\r\n\r\n\t selected = this.getIdByIndex(Math.min(this.count() - 1, _index + _step));\r\n\t } else {\r\n\t assert(false, \"Not supported selection moving mode\");\r\n\t return;\r\n\t }\r\n\t if (this._skip_item) selected = this._skip_item(selected, prev, mode);\r\n\t this.showItem(selected);\r\n\t this.select(selected);\r\n\t if (this.getSubMenu && this.getSubMenu(selected)) this._mouse_move_activation(selected, this.getItemNode(selected));\r\n\r\n\t if (!this.config.clipboard && focus !== false) {\r\n\t var node = this.getItemNode(selected);\r\n\t if (node) node.focus();\r\n\t }\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t navigation_setter: function navigation_setter(value) {\r\n\t //using global flag to apply hotkey only once\r\n\t if (value && !UIManager._global_nav_grid_hotkeys) {\r\n\t UIManager._global_nav_grid_hotkeys = true; //hotkeys will react on any component but will not work in edit mode\r\n\t //you can define moveSelection method to handle navigation keys\r\n\r\n\t UIManager.addHotKey(\"up\", this._navigation_helper(\"up\"));\r\n\t UIManager.addHotKey(\"down\", this._navigation_helper(\"down\"));\r\n\t UIManager.addHotKey(\"right\", this._navigation_helper(\"right\"));\r\n\t UIManager.addHotKey(\"left\", this._navigation_helper(\"left\"));\r\n\t UIManager.addHotKey(\"shift+up\", this._navigation_helper(\"up\"));\r\n\t UIManager.addHotKey(\"shift+down\", this._navigation_helper(\"down\"));\r\n\t UIManager.addHotKey(\"shift+right\", this._navigation_helper(\"right\"));\r\n\t UIManager.addHotKey(\"shift+left\", this._navigation_helper(\"left\"));\r\n\t UIManager.addHotKey(\"ctrl+shift+up\", this._navigation_helper(\"up\"));\r\n\t UIManager.addHotKey(\"ctrl+shift+down\", this._navigation_helper(\"down\"));\r\n\t UIManager.addHotKey(\"ctrl+shift+right\", this._navigation_helper(\"right\"));\r\n\t UIManager.addHotKey(\"ctrl+shift+left\", this._navigation_helper(\"left\"));\r\n\t UIManager.addHotKey(\"pageup\", this._navigation_helper(\"pgup\"));\r\n\t UIManager.addHotKey(\"pagedown\", this._navigation_helper(\"pgdown\"));\r\n\t UIManager.addHotKey(\"home\", this._navigation_helper(\"top\"));\r\n\t UIManager.addHotKey(\"end\", this._navigation_helper(\"bottom\"));\r\n\t }\r\n\r\n\t return value;\r\n\t }\r\n\t};\r\n\r\n\t/*Data collection mapping logic */\r\n\r\n\tvar MapCollection = {\r\n\t $init: function $init() {\r\n\t this.$ready.push(this._create_scheme_init);\r\n\t this.attachEvent(\"onStructureUpdate\", this._create_scheme_init);\r\n\t this.attachEvent(\"onStructureLoad\", function () {\r\n\t if (!this._scheme_init_order.length) this._create_scheme_init();\r\n\t });\r\n\t },\r\n\t _create_scheme_init: function _create_scheme_init() {\r\n\t var stack = this._scheme_init_order = [];\r\n\t var config = this._settings;\r\n\t if (config.columns) this._build_data_map(config.columns);\r\n\t if (this._settings.map) this._process_field_map(config.map);\r\n\r\n\t if (stack.length) {\r\n\t this.data._scheme_init = function (obj) {\r\n\t for (var i = 0; i < stack.length; i++) {\r\n\t stack[i](obj);\r\n\t }\r\n\t };\r\n\t }\r\n\t },\r\n\t _process_field_map: function _process_field_map(map) {\r\n\t for (var key in map) {\r\n\t this._scheme_init_order.push(this._process_single_map(key, map[key]));\r\n\t }\r\n\t },\r\n\t _process_single_map: function _process_single_map(target, map, extra) {\r\n\t var source = map.replace(/^(\\s|)\\((date|number)\\)/, \"\");\r\n\t var getSource;\r\n\r\n\t if (source === \"\") {\r\n\t getSource = function getSource(a) {\r\n\t return a[target];\r\n\t };\r\n\t } else {\r\n\t if (source.indexOf(\"#\") === -1 && source.indexOf(\"{\") === -1) {\r\n\t source = \"#\" + source + \"#\";\r\n\t }\r\n\r\n\t getSource = template(source);\r\n\t }\r\n\r\n\t if (map.indexOf(\"(date)\") === 0) {\r\n\t if (extra && !extra.format) extra.format = i18n.dateFormatStr;\r\n\t return function (obj) {\r\n\t var dateStr = (getSource(obj) || \"\").toString();\r\n\t obj[target] = i18n.parseFormatDate(dateStr);\r\n\t };\r\n\t } else if (map.indexOf(\"(number)\") === 0) {\r\n\t return function (obj) {\r\n\t obj[target] = getSource(obj) * 1;\r\n\t };\r\n\t } else {\r\n\t return function (obj) {\r\n\t obj[target] = getSource(obj) || \"\";\r\n\t };\r\n\t }\r\n\t },\r\n\t _build_data_map: function _build_data_map(columns) {\r\n\t //for datatable\r\n\t for (var i = 0; i < columns.length; i++) {\r\n\t var map = columns[i].map;\r\n\t var id = columns[i].id;\r\n\r\n\t if (!id) {\r\n\t id = columns[i].id = \"i\" + uid();\r\n\t if (!columns[i].header) columns[i].header = \"\";\r\n\t }\r\n\r\n\t if (map) this._scheme_init_order.push(this._process_single_map(id, map, columns[i]));\r\n\r\n\t this._map_options(columns[i]);\r\n\t }\r\n\t },\r\n\t _map_options: function _map_options(element) {\r\n\t var options = element.options || element.collection;\r\n\r\n\t if (options) {\r\n\t if (typeof options === \"string\") {\r\n\t //id of some other view\r\n\t var options_view = $$(options); //or url\r\n\r\n\t if (!options_view) {\r\n\t options_view = new (use(\"DataCollection\"))({\r\n\t url: options\r\n\t });\r\n\r\n\t this._destroy_with_me.push(options_view);\r\n\t } //if it was a view, special check for suggests\r\n\r\n\r\n\t if (options_view.getBody) options_view = options_view.getBody();\r\n\r\n\t this._bind_collection(options_view, element);\r\n\t } else if (!options.loadNext) {\r\n\t if (options[0] && _typeof(options[0]) == \"object\") {\r\n\t //[{ id:1, value:\"one\"}, ...]\r\n\t options = new (use(\"DataCollection\"))({\r\n\t data: options\r\n\t });\r\n\r\n\t this._bind_collection(options, element);\r\n\r\n\t this._destroy_with_me.push(options);\r\n\t } else {\r\n\t //[\"one\", \"two\"]\r\n\t //or\r\n\t //{ 1: \"one\", 2: \"two\"}\r\n\t if (isArray(options)) {\r\n\t var data = {};\r\n\r\n\t for (var ij = 0; ij < options.length; ij++) {\r\n\t data[options[ij]] = options[ij];\r\n\t }\r\n\r\n\t element.options = options = data;\r\n\t }\r\n\r\n\t element.template = element.template || this._collection_accesser(options, element.id, element.optionslist);\r\n\t }\r\n\t } else {\r\n\t //data collection or view\r\n\t this._bind_collection(options, element);\r\n\t }\r\n\t }\r\n\t },\r\n\t _bind_collection: function _bind_collection(options, element) {\r\n\t if (element) {\r\n\t delete element.options;\r\n\t element.collection = options;\r\n\t element.template = element.template || this._bind_accesser(options, element.id, element.optionslist);\r\n\t var id = options.data.attachEvent(\"onStoreUpdated\", bind(function () {\r\n\t this.refresh();\r\n\t if (this.refreshFilter) this.refreshFilter(element.id);\r\n\t }, this));\r\n\t this.attachEvent(\"onDestruct\", function () {\r\n\t if (!options.$destructed) options.data.detachEvent(id);\r\n\t });\r\n\t }\r\n\t },\r\n\t _collection_accesser: function _collection_accesser(options, id, multi) {\r\n\t if (multi) {\r\n\t var separator = typeof multi == \"string\" ? multi : \",\";\r\n\t return function (obj) {\r\n\t var value = obj[id] || obj.value;\r\n\t if (!value) return \"\";\r\n\t var ids = value.split(separator);\r\n\r\n\t for (var i = 0; i < ids.length; i++) {\r\n\t ids[i] = options[ids[i]] || \"\";\r\n\t }\r\n\r\n\t return ids.join(\", \");\r\n\t };\r\n\t } else {\r\n\t return function (obj) {\r\n\t return options[obj[id]] || obj.value || \"\";\r\n\t };\r\n\t }\r\n\t },\r\n\t _bind_accesser: function _bind_accesser(col, id, multi) {\r\n\t if (multi) {\r\n\t var separator = typeof multi == \"string\" ? multi : \",\";\r\n\t return function (obj) {\r\n\t var value = obj[id] || obj.value;\r\n\t if (!value) return \"\";\r\n\t var ids = value.split(separator);\r\n\r\n\t for (var i = 0; i < ids.length; i++) {\r\n\t var data = col.data.pull[ids[i]];\r\n\t ids[i] = data ? data.value || \"\" : \"\";\r\n\t }\r\n\r\n\t return ids.join(\", \");\r\n\t };\r\n\t } else {\r\n\t return function (obj) {\r\n\t var prop = obj[id] || obj.value,\r\n\t data = col.data.pull[prop];\r\n\t if (data && (data.value || data.value === 0)) return data.value;\r\n\t return \"\";\r\n\t };\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar MouseEvents = {\r\n\t $init: function $init(config) {\r\n\t config = config || {};\r\n\t this._clickstamp = 0;\r\n\t this._dbl_sensetive = 300;\r\n\t this._item_clicked = null;\r\n\r\n\t this._mouse_action_extend(config.onClick, \"on_click\");\r\n\r\n\t this._mouse_action_extend(config.onContext, \"on_context\");\r\n\r\n\t this._mouse_action_extend(config.onDblClick, \"on_dblclick\");\r\n\r\n\t this._mouse_action_extend(config.onMouseMove, \"on_mouse_move\"); //attach dom events if related collection is defined\r\n\r\n\r\n\t if (this.on_click) {\r\n\t _event(this._contentobj, \"click\", this._onClick, {\r\n\t bind: this\r\n\t });\r\n\r\n\t if (env.isIE8 && this.on_dblclick) _event(this._contentobj, \"dblclick\", this._onDblClick, {\r\n\t bind: this\r\n\t });\r\n\t }\r\n\r\n\t if (this.on_context) _event(this._contentobj, \"contextmenu\", this._onContext, {\r\n\t bind: this\r\n\t });\r\n\t if (this.on_mouse_move) this._enable_mouse_move();\r\n\t },\r\n\t _enable_mouse_move: function _enable_mouse_move() {\r\n\t if (!this._mouse_move_enabled) {\r\n\t this.on_mouse_move = this.on_mouse_move || {};\r\n\r\n\t _event(this._contentobj, \"mousemove\", this._onMouse, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(this._contentobj, env.isIE ? \"mouseleave\" : \"mouseout\", this._onMouse, {\r\n\t bind: this\r\n\t });\r\n\r\n\t this._mouse_move_enabled = 1;\r\n\t this.attachEvent(\"onDestruct\", function () {\r\n\t if (this._mouse_move_timer) window.clearTimeout(this._mouse_move_timer);\r\n\t });\r\n\t }\r\n\t },\r\n\t _mouse_action_extend: function _mouse_action_extend(config, key) {\r\n\t if (config) {\r\n\t var now = this[key];\r\n\t var step = now ? exports.extend({}, now) : {};\r\n\t this[key] = exports.extend(step, config);\r\n\t }\r\n\t },\r\n\t //inner onclick object handler\r\n\t _onClick: function _onClick(e) {\r\n\t if (!this.isEnabled()) return false;\r\n\r\n\t UIManager._focus_action(this);\r\n\r\n\t if (this.on_dblclick) {\r\n\t // emulates double click\r\n\t var stamp = new Date().valueOf();\r\n\r\n\t if (stamp - this._clickstamp <= this._dbl_sensetive && this.locate) {\r\n\t var item = this.locate(e);\r\n\r\n\t if (\"\" + item == \"\" + this._item_clicked) {\r\n\t this._clickstamp = 0;\r\n\t return this._onDblClick(e);\r\n\t }\r\n\t }\r\n\r\n\t this._clickstamp = stamp;\r\n\t }\r\n\r\n\t var result = this._mouseEvent(e, this.on_click, \"ItemClick\");\r\n\r\n\t return result;\r\n\t },\r\n\t //inner ondblclick object handler\r\n\t _onDblClick: function _onDblClick(e) {\r\n\t return this._mouseEvent(e, this.on_dblclick, \"ItemDblClick\");\r\n\t },\r\n\t //process oncontextmenu events\r\n\t _onContext: function _onContext(e) {\r\n\t this._mouseEvent(e, this.on_context, \"BeforeContextMenu\", \"AfterContextMenu\");\r\n\t },\r\n\r\n\t /*\r\n\t \tevent throttler - ignore events which occurs too fast\r\n\t \tduring mouse moving there are a lot of event firing - we need no so much\r\n\t \talso, mouseout can fire when moving inside the same html container - we need to ignore such fake calls\r\n\t */\r\n\t _onMouse: function _onMouse(e) {\r\n\t if (this.$destructed) return;\r\n\t if (document.createEventObject) //make a copy of event, will be used in timed call\r\n\t e = document.createEventObject(event);else if (!isUndefined(e.movementY) && !e.movementY && !e.movementX) return; //logitech mouse driver can send false signals in Chrome\r\n\r\n\t if (this._mouse_move_timer) //clear old event timer\r\n\t window.clearTimeout(this._mouse_move_timer); //this event just inform about moving operation, we don't care about details\r\n\r\n\t this.callEvent(\"onMouseMoving\", [e]); //set new event timer\r\n\r\n\t this._mouse_move_timer = window.setTimeout(bind(function () {\r\n\t //called only when we have at least 100ms after previous event\r\n\t if (e.type == \"mousemove\") this._onMouseMove(e);else this._onMouseOut(e);\r\n\t }, this), this._settings.mouseEventDelay || 500);\r\n\t },\r\n\t //inner mousemove object handler\r\n\t _onMouseMove: function _onMouseMove(e) {\r\n\t if (!this._mouseEvent(e, this.on_mouse_move, \"MouseMove\")) this.callEvent(\"onMouseOut\", [e || event]);\r\n\t },\r\n\t //inner mouseout object handler\r\n\t _onMouseOut: function _onMouseOut(e) {\r\n\t this.callEvent(\"onMouseOut\", [e || event]);\r\n\t },\r\n\t //common logic for click and dbl-click processing\r\n\t _mouseEvent: function _mouseEvent(e, hash, name, pair) {\r\n\t e = e || event;\r\n\t if (e.processed || !this._viewobj) return;\r\n\t e.processed = true;\r\n\t var trg = e.target || e.srcElement; //IE8 can't modify event object\r\n\t //so we need to stop event bubbling to prevent double processing\r\n\r\n\t if (env.isIE8) {\r\n\t var vid = this._settings.id;\r\n\t var wid = trg.w_view;\r\n\t if (!wid) trg.w_view = vid;else if (wid !== vid) return;\r\n\t }\r\n\r\n\t var css = \"\";\r\n\t var id = null;\r\n\t var found = false; //loop through all parents\r\n\t //we need to check for this._viewobj as some handler can destroy the view\r\n\r\n\t while (trg && trg.parentNode && this._viewobj && trg != this._viewobj.parentNode) {\r\n\t if (!found && trg.getAttribute) {\r\n\t //if element with ID mark is not detected yet\r\n\t id = trg.getAttribute(this._id); //check id of current one\r\n\r\n\t if (id) {\r\n\t this._item_clicked = id;\r\n\r\n\t if (this.callEvent) {\r\n\t //it will be triggered only for first detected ID, in case of nested elements\r\n\t if (!this.callEvent(\"on\" + name, [id, e, trg])) return;\r\n\t if (pair) this.callEvent(\"on\" + pair, [id, e, trg]);\r\n\t } //set found flag\r\n\r\n\r\n\t found = true;\r\n\t }\r\n\t }\r\n\r\n\t css = _getClassName(trg);\r\n\r\n\t if (css) {\r\n\t //check if pre-defined reaction for element's css name exists\r\n\t css = css.toString().split(\" \");\r\n\r\n\t for (var i = 0; i < css.length; i++) {\r\n\t if (hash[css[i]]) {\r\n\t var functor = toFunctor(hash[css[i]], this.$scope);\r\n\t var res = functor.call(this, e, id || locate(e, this._id), trg);\r\n\t if (res === false) return found;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t trg = trg.parentNode;\r\n\t }\r\n\r\n\t return found; //returns true if item was located and event was triggered\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t UI: navigation control\r\n\t*/\r\n\r\n\tvar NavigationButtons = {\r\n\t $init: function $init() {\r\n\t this.$ready.push(function () {\r\n\t this.attachEvent(\"onKeyPress\", this._onKeyPress);\r\n\t });\r\n\t },\r\n\t _moveActive: function _moveActive(code, e) {\r\n\t if (code === 37 || code === 39) {\r\n\t preventEvent(e);\r\n\r\n\t this._showNavItem(code === 37 ? -1 : 1);\r\n\r\n\t var node = this._navPanel.querySelector(\"[tabindex='0']\");\r\n\r\n\t if (node) node.focus();\r\n\t }\r\n\t },\r\n\t _renderPanel: function _renderPanel() {\r\n\t remove(this._navPanel);\r\n\t this._navPanel = create(\"DIV\", {\r\n\t \"class\": \"webix_nav_panel \" + \"webix_nav_panel_\" + this._settings.navigation.type,\r\n\t \"role\": \"tablist\"\r\n\t }, \"\");\r\n\r\n\t this._viewobj.appendChild(this._navPanel);\r\n\r\n\t this._renderNavItems();\r\n\r\n\t this._renderNavButtons();\r\n\r\n\t this._setLinkEventHandler();\r\n\t },\r\n\t _setLinkEventHandler: function _setLinkEventHandler() {\r\n\t var h = [];\r\n\t if (this._navPanel) h[0] = event$1(this._navPanel, \"click\", bind(function (e) {\r\n\t var elem = e.srcElement || e.target;\r\n\t var found = false;\r\n\r\n\t while (elem != this._navPanel && !found) {\r\n\t var bindId = elem.getAttribute(this._linkAttr);\r\n\r\n\t if (bindId) {\r\n\t found = true;\r\n\r\n\t this._showPanelBind(bindId);\r\n\t }\r\n\r\n\t elem = elem.parentNode;\r\n\t }\r\n\t }, this));\r\n\t if (this._prevNavButton) h[1] = event$1(this._prevNavButton, \"click\", bind(function () {\r\n\t this._showNavItem(-1);\r\n\t }, this));\r\n\t if (this._nextNavButton) h[1] = event$1(this._nextNavButton, \"click\", bind(function () {\r\n\t this._showNavItem(1);\r\n\t }, this));\r\n\t this.attachEvent(\"onDestruct\", function () {\r\n\t for (var i = 0; i < h.length; i++) {\r\n\t this.detachEvent(h[i]);\r\n\t }\r\n\r\n\t h = null;\r\n\t });\r\n\t },\r\n\t _showNavItem: function _showNavItem(inc) {\r\n\t if (this._cells) {\r\n\t var index$$1 = this._active_cell + inc;\r\n\r\n\t if (index$$1 >= this._cells.length || index$$1 < 0) {\r\n\t index$$1 = index$$1 < 0 ? this._cells.length - 1 : 0;\r\n\t }\r\n\r\n\t this.setActiveIndex(index$$1);\r\n\t }\r\n\t },\r\n\t _showPanelBind: function _showPanelBind(id) {\r\n\t if (this._cells) $$(id).show();\r\n\t },\r\n\t _renderNavItems: function _renderNavItems() {\r\n\t var item, config;\r\n\t config = this._settings.navigation;\r\n\r\n\t if (config.items) {\r\n\t this._linkAttr = config.linkAttr || \"bind_id\";\r\n\t if (!this._navPanel) this._renderPanel();else this._clearPanel();\r\n\t var data = this._cells ? this._cells : this.data.order;\r\n\r\n\t if (data.length > 1) {\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t item = create(\"DIV\", {\r\n\t \"class\": \"webix_nav_item webix_nav_\" + (i == this._active_cell ? \"active\" : \"inactive\"),\r\n\t \"role\": \"tab\",\r\n\t \"tabindex\": i == this._active_cell ? \"0\" : \"-1\"\r\n\t });\r\n\t var id = this._cells ? this._cells[i]._settings.id : data[i];\r\n\t if (id) item.setAttribute(this._linkAttr, id);\r\n\r\n\t this._navPanel.appendChild(item);\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _clearPanel: function _clearPanel() {\r\n\t if (this._navPanel) {\r\n\t var coll = this._navPanel.childNodes;\r\n\r\n\t for (var i = coll.length - 1; i >= 0; i--) {\r\n\t remove(coll[i]);\r\n\t }\r\n\t }\r\n\t },\r\n\t _renderNavButtons: function _renderNavButtons() {\r\n\t var config = this._settings.navigation;\r\n\r\n\t if (config.buttons) {\r\n\t if (this._prevNavButton) remove(this._prevNavButton);\r\n\t if (this._prevNavButton) remove(this._nextNavButton);\r\n\t this._prevNavButton = create(\"DIV\", {\r\n\t \"class\": \"webix_nav_button_\" + config.type + \" webix_nav_button_prev \"\r\n\t }, \"
\");\r\n\r\n\t this._viewobj.appendChild(this._prevNavButton);\r\n\r\n\t this._nextNavButton = create(\"DIV\", {\r\n\t \"class\": \"webix_nav_button_\" + config.type + \" webix_nav_button_next \"\r\n\t }, \"
\");\r\n\r\n\t this._viewobj.appendChild(this._nextNavButton);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar OverlayBox = {\r\n\t showOverlay: function showOverlay(message) {\r\n\t if (!this._overlay) {\r\n\t this._overlay = create(\"DIV\", {\r\n\t \"class\": \"webix_overlay\"\r\n\t }, message || \"\");\r\n\t insertBefore(this._overlay, this._viewobj.firstChild, this._viewobj);\r\n\t this._viewobj.style.position = \"relative\";\r\n\t } else this._overlay.innerHTML = message;\r\n\t },\r\n\t hideOverlay: function hideOverlay() {\r\n\t if (this._overlay) {\r\n\t remove(this._overlay);\r\n\t this._overlay = null;\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar PagingAbility = {\r\n\t pager_setter: function pager_setter(pager) {\r\n\t if (typeof pager == \"string\") {\r\n\t var ui_pager = $$(pager);\r\n\r\n\t if (!ui_pager) {\r\n\t this.$blockRender = true;\r\n\t delay(function () {\r\n\t var obj = $$(pager);\r\n\t this._settings.pager = this.pager_setter(obj);\r\n\t var s = obj._settings;\r\n\t s.count = this.data._count_pager_total(s.level);\r\n\t obj.refresh();\r\n\t this.$blockRender = false;\r\n\t this.render();\r\n\t }, this);\r\n\t return null;\r\n\t }\r\n\r\n\t pager = ui_pager;\r\n\t }\r\n\r\n\t function check_pager_sizes(repeat) {\r\n\t if (pager.config.autosize && this.getVisibleCount) {\r\n\t var count = this.getVisibleCount();\r\n\r\n\t if (isNaN(count)) {\r\n\t pager.config.size = 1;\r\n\t delay(check_pager_sizes, this, [true]);\r\n\t } else if (count != pager.config.size) {\r\n\t pager.config.size = count;\r\n\t pager.refresh();\r\n\t if (repeat === true) this.refresh();\r\n\t }\r\n\t }\r\n\r\n\t var s = this._settings.pager; //initial value of pager = -1, waiting for real value\r\n\r\n\t if (s.page == -1) return false;\r\n\t this.data.$min = this._count_pager_index(0, s.page * s.size); //affect data.getRange\r\n\r\n\t this.data.$max = this._count_pager_index(this.data.$min, s.size);\r\n\t this.data.$pagesize = this.data.$max - this.data.$min;\r\n\t return true;\r\n\t }\r\n\r\n\t this.attachEvent(\"onBeforeRender\", check_pager_sizes);\r\n\r\n\t if (!pager.$view) {\r\n\t pager.view = \"pager\";\r\n\t pager = ui(pager);\r\n\t }\r\n\r\n\t this._pager = pager;\r\n\t pager.$master = this;\r\n\t this.data.attachEvent(\"onStoreUpdated\", function () {\r\n\t var s = pager._settings;\r\n\t s.count = this._count_pager_total(s.level);\r\n\t pager.refresh();\r\n\t });\r\n\t this.data._count_pager_total = this._count_pager_total;\r\n\t return pager._settings;\r\n\t },\r\n\t _count_pager_total: function _count_pager_total(level) {\r\n\t if (level && level !== 0) {\r\n\t var count = 0;\r\n\t this.each(function (obj) {\r\n\t if (obj.$level == level) count++;\r\n\t });\r\n\t return count;\r\n\t } else return this.count();\r\n\t },\r\n\t _count_pager_index: function _count_pager_index(start, count) {\r\n\t var s = this._settings.pager;\r\n\r\n\t if (s.level && s.level !== 0) {\r\n\t var end = start;\r\n\t var max = this.data.order.length;\r\n\t if (count) while (end < max) {\r\n\t if (this.data.order[end] && this.data.getItem(this.data.order[end]).$level == s.level) {\r\n\t if (count === 0) break;else count--;\r\n\t }\r\n\r\n\t end++;\r\n\t }\r\n\t return end;\r\n\t } else return start + count;\r\n\t },\r\n\t setPage: function setPage(value) {\r\n\t if (this._pager) this._pager.select(value);\r\n\t },\r\n\t getPage: function getPage() {\r\n\t return this._pager._settings.page;\r\n\t },\r\n\t getPager: function getPager() {\r\n\t return this._pager;\r\n\t }\r\n\t};\r\n\r\n\tvar ProgressBar = {\r\n\t $init: function $init() {\r\n\t if (isUndefined(this._progress) && this.attachEvent) {\r\n\t this.attachEvent(\"onBeforeLoad\", this.showProgress);\r\n\t this.attachEvent(\"onAfterLoad\", this.hideProgress);\r\n\t this._progress = null;\r\n\t }\r\n\t },\r\n\t showProgress: function showProgress(config) {\r\n\t // { position: 0 - 1, delay: 2000ms by default, css : name of css class to use }\r\n\t if (!this._progress) {\r\n\t config = exports.extend({\r\n\t position: 0,\r\n\t delay: 2000,\r\n\t type: \"icon\",\r\n\t icon: \"wxi-sync\",\r\n\t hide: false\r\n\t }, config || {}, true);\r\n\t var incss = config.type == \"icon\" ? config.icon + \" webix_spin\" : \"\";\r\n\t this._progress = create(\"DIV\", {\r\n\t \"class\": \"webix_progress_\" + config.type,\r\n\t \"role\": \"progressbar\",\r\n\t \"aria-valuemin\": \"0\",\r\n\t \"aria-valuemax\": \"100\",\r\n\t \"tabindex\": \"0\"\r\n\t }, \"
\");\r\n\t if (!this.setPosition) this._viewobj.style.position = \"relative\";\r\n\t insertBefore(this._progress, this._viewobj.firstChild, this._viewobj);\r\n\r\n\t this._viewobj.setAttribute(\"aria-busy\", \"true\");\r\n\r\n\t if (!Touch.$active) {\r\n\t if (this.getScrollState) {\r\n\t var scroll = this.getScrollState();\r\n\r\n\t if (this._viewobj.scrollWidth != this.$width) {\r\n\t this._progress.style.left = scroll.x + \"px\";\r\n\t }\r\n\r\n\t if (this._viewobj.scrollHeight != this.$height) {\r\n\t if (config.type != \"bottom\") {\r\n\t this._progress.style.top = scroll.y + \"px\";\r\n\t } else {\r\n\t this._progress.style.top = scroll.y + this.$height - this._progress.offsetHeight + \"px\";\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t this._progress_delay = 1;\r\n\t }\r\n\r\n\t if (config && config.type != \"icon\") delay(function () {\r\n\t if (this._progress) {\r\n\t var position = config.position || 1; //check for css-transition support\r\n\r\n\t if (this._progress.style[env.transitionDuration] !== undefined || !config.delay) {\r\n\t this._progress.firstChild.style.width = position * 100 + \"%\";\r\n\t if (config.delay) this._progress.firstChild.style[env.transitionDuration] = config.delay + \"ms\";\r\n\t } else {\r\n\t //if animation is not supported fallback to timeouts [IE9]\r\n\t var count = 0,\r\n\t start = 0,\r\n\t step = position / config.delay * 30,\r\n\t view = this;\r\n\r\n\t if (this._progressTimer) {\r\n\t //reset the existing progress\r\n\t window.clearInterval(this._progressTimer);\r\n\t start = this._progress.firstChild.offsetWidth / this._progress.offsetWidth * 100;\r\n\t }\r\n\r\n\t this._progressTimer = window.setInterval(function () {\r\n\t if (count * 30 == config.delay) {\r\n\t window.clearInterval(view._progressTimer);\r\n\t } else {\r\n\t if (view._progress && view._progress.firstChild) view._progress.firstChild.style.width = start + count * step * position * 100 + \"%\";\r\n\t count++;\r\n\t }\r\n\t }, 30);\r\n\t }\r\n\r\n\t if (config.hide) delay(this.hideProgress, this, [1], config.delay);\r\n\t }\r\n\r\n\t this._progress_delay = 0;\r\n\t }, this);else if (config && config.type == \"icon\" && config.hide) delay(this.hideProgress, this, [1], config.delay);\r\n\t },\r\n\t hideProgress: function hideProgress(now) {\r\n\t if (this._progress_delay) now = true;\r\n\r\n\t if (this._progress) {\r\n\t if (now) {\r\n\t if (this._progressTimer) window.clearInterval(this._progressTimer);\r\n\t remove(this._progress);\r\n\t this._progress = null;\r\n\r\n\t this._viewobj.removeAttribute(\"aria-busy\");\r\n\t } else {\r\n\t this.showProgress({\r\n\t position: 1.1,\r\n\t delay: 300,\r\n\t hide: true\r\n\t });\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar RenderStack = {\r\n\t $init: function $init() {\r\n\t assert(this.data, \"RenderStack :: Component doesn't have DataStore\");\r\n\t assert(template, \"template :: template is not accessible\"); //used for temporary HTML elements\r\n\t //automatically nulified during destruction\r\n\r\n\t this._html = document.createElement(\"DIV\");\r\n\t this.data.attachEvent(\"onIdChange\", bind(this._render_change_id, this));\r\n\t this.attachEvent(\"onItemClick\", this._call_onclick); //create copy of default type, and set it as active one\r\n\r\n\t if (!this.types) {\r\n\t this.types = {\r\n\t \"default\": this.type\r\n\t };\r\n\t this.type.name = \"default\";\r\n\t }\r\n\r\n\t this.type = clone(this.type);\r\n\t },\r\n\t customize: function customize(obj) {\r\n\t type(this, obj);\r\n\t },\r\n\t item_setter: function item_setter(value) {\r\n\t return this.type_setter(value);\r\n\t },\r\n\t type_setter: function type_setter(value) {\r\n\t if (!this.types[value]) this.customize(value);else {\r\n\t this.type = clone(this.types[value]);\r\n\t if (this.type.css) this._contentobj.className += \" \" + this.type.css;\r\n\t }\r\n\t if (this.type.on_click) exports.extend(this.on_click, this.type.on_click);\r\n\t return value;\r\n\t },\r\n\t template_setter: function template_setter(value) {\r\n\t this.type.template = template(value);\r\n\t },\r\n\t //convert single item to HTML text (templating)\r\n\t _toHTML: function _toHTML(obj) {\r\n\t var mark = this.data._marks[obj.id]; //check if related template exist\r\n\r\n\t assert(!obj.$template || this.type[\"template\" + obj.$template], \"RenderStack :: Unknown template: \" + obj.$template);\r\n\t this.callEvent(\"onItemRender\", [obj]);\r\n\t return this.type.templateStart(obj, this.type, mark) + (obj.$template ? this.type[\"template\" + obj.$template] : this.type.template)(obj, this.type, mark) + this.type.templateEnd(obj, this.type, mark);\r\n\t },\r\n\t //convert item to HTML object (templating)\r\n\t _toHTMLObject: function _toHTMLObject(obj) {\r\n\t this._html.innerHTML = this._toHTML(obj);\r\n\t return this._html.firstChild;\r\n\t },\r\n\t _render_change_id: function _render_change_id(old, newid) {\r\n\t var obj = this.getItemNode(old);\r\n\r\n\t if (obj) {\r\n\t obj.setAttribute(this._id, newid);\r\n\t this._htmlmap[newid] = this._htmlmap[old];\r\n\t delete this._htmlmap[old];\r\n\t }\r\n\t },\r\n\t //calls function that is set in onclick property\r\n\t _call_onclick: function _call_onclick() {\r\n\t if (this._settings.click) {\r\n\t var code = toFunctor(this._settings.click, this.$scope);\r\n\t if (code && code.call) code.apply(this, arguments);\r\n\t }\r\n\t },\r\n\t //return html container by its ID\r\n\t //can return undefined if container doesn't exists\r\n\t getItemNode: function getItemNode(search_id) {\r\n\t if (this._htmlmap) return this._htmlmap[search_id]; //fill map if it doesn't created yet\r\n\r\n\t this._htmlmap = {};\r\n\t var t = this._dataobj.childNodes;\r\n\r\n\t for (var i = 0; i < t.length; i++) {\r\n\t var id = t[i].getAttribute(this._id); //get item's\r\n\r\n\t if (id) this._htmlmap[id] = t[i];\r\n\t } //call locator again, when map is filled\r\n\r\n\r\n\t return this.getItemNode(search_id);\r\n\t },\r\n\t //return id of item from html event\r\n\t locate: function locate$$1(e) {\r\n\t return locate(e, this._id);\r\n\t },\r\n\r\n\t /*change scrolling state of top level container, so related item will be in visible part*/\r\n\t showItem: function showItem(id) {\r\n\t var html = this.getItemNode(id);\r\n\r\n\t if (html && this.scrollTo) {\r\n\t var txmin = Math.abs(this._contentobj.offsetLeft - html.offsetLeft);\r\n\t var txmax = txmin + html.offsetWidth;\r\n\t var tymin = Math.abs(this._contentobj.offsetTop - html.offsetTop);\r\n\t var tymax = tymin + html.offsetHeight;\r\n\t var state = this.getScrollState();\r\n\t var x = state.x;\r\n\t if (x > txmin || x + this._content_width < txmax) x = txmin;\r\n\t var y = state.y;\r\n\t if (y > tymin || y + this._content_height < tymax) y = tymin - 5;\r\n\t this.scrollTo(x, y);\r\n\t if (this._setItemActive) this._setItemActive(id);\r\n\t }\r\n\t },\r\n\t //update view after data update\r\n\t //method calls low-level rendering for related items\r\n\t //when called without parameters - all view refreshed\r\n\t render: function render(id, data, type$$1) {\r\n\t if (!this.isVisible(this._settings.id) || this.$blockRender) return;\r\n\r\n\t if (id) {\r\n\t var cont = this.getItemNode(id); //get html element of updated item\r\n\r\n\t switch (type$$1) {\r\n\t case \"paint\":\r\n\t case \"update\":\r\n\t //in case of update - replace existing html with updated one\r\n\t if (!cont) return;\r\n\r\n\t var t1 = this._htmlmap[id] = this._toHTMLObject(data);\r\n\r\n\t insertBefore(t1, cont);\r\n\t remove(cont);\r\n\t break;\r\n\r\n\t case \"delete\":\r\n\t //in case of delete - remove related html\r\n\t if (!cont) return;\r\n\t remove(cont);\r\n\t delete this._htmlmap[id];\r\n\t break;\r\n\r\n\t case \"add\":\r\n\t //in case of add - put new html at necessary position\r\n\t var t2 = this._htmlmap[id] = this._toHTMLObject(data);\r\n\r\n\t insertBefore(t2, this.getItemNode(this.data.getNextId(id)), this._dataobj);\r\n\t break;\r\n\r\n\t case \"move\":\r\n\t //moving without repainting the item\r\n\t insertBefore(this.getItemNode(id), this.getItemNode(this.data.getNextId(id)), this._dataobj);\r\n\t break;\r\n\r\n\t default:\r\n\t assert(0, \"Unknown render command: \" + type$$1);\r\n\t break;\r\n\t }\r\n\t } else {\r\n\t //full reset\r\n\t if (this.callEvent(\"onBeforeRender\", [this.data])) {\r\n\t //getRange - returns all elements\r\n\t (this._renderobj || this._dataobj).innerHTML = this.data.getRange().map(this._toHTML, this).join(\"\");\r\n\t this._htmlmap = null; //clear map, it will be filled at first getItemNode\r\n\r\n\t this.callEvent(\"onAfterRender\", []);\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Scrollable = {\r\n\t $init: function $init(config) {\r\n\t //do not spam unwanted scroll containers for templates \r\n\t if (config && !config.scroll && this._one_time_scroll) return this._dataobj = this._dataobj || this._contentobj;\r\n\r\n\t (this._dataobj || this._contentobj).appendChild(create(\"DIV\", {\r\n\t \"class\": \"webix_scroll_cont\"\r\n\t }, \"\"));\r\n\r\n\t this._dataobj = (this._dataobj || this._contentobj).firstChild;\r\n\t if (!env.touch || env.touch === \"native\") _event(this._viewobj, \"scroll\", bind(function () {\r\n\t if (this.callEvent) delay(function () {\r\n\t this.callEvent(\"onAfterScroll\", []);\r\n\t }, this);\r\n\t }, this));\r\n\t },\r\n\r\n\t /*defaults:{\r\n\t \tscroll:true\r\n\t },*/\r\n\t scroll_setter: function scroll_setter(value) {\r\n\t if (!value) return false;\r\n\t var marker = value == \"x\" ? \"x\" : value == \"xy\" ? \"xy\" : value == \"a\" ? \"xy\" : \"y\";\r\n\r\n\t if (Touch.$active && env.touch != \"native\") {\r\n\t this._dataobj.setAttribute(\"touch_scroll\", marker);\r\n\r\n\t if (this.attachEvent) this.attachEvent(\"onAfterRender\", bind(this._refresh_scroll, this));\r\n\t this._touch_scroll = true;\r\n\t } else {\r\n\t if (env.$customScroll) {\r\n\t CustomScroll.enable(this, marker);\r\n\t } else {\r\n\t var node = this._dataobj.parentNode.style;\r\n\r\n\t if (value.toString().indexOf(\"a\") != -1) {\r\n\t node.overflowX = node.overflowY = \"auto\";\r\n\t } else {\r\n\t if (marker.indexOf(\"x\") != -1) {\r\n\t this._scroll_x = true;\r\n\t node.overflowX = \"scroll\";\r\n\t }\r\n\r\n\t if (marker.indexOf(\"y\") != -1) {\r\n\t this._scroll_y = true;\r\n\t node.overflowY = \"scroll\";\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return marker;\r\n\t },\r\n\t _onoff_scroll: function _onoff_scroll(mode, dir) {\r\n\t if (!!this._settings.scroll == !!mode) return;\r\n\r\n\t if (!env.$customScroll) {\r\n\t var style = this._dataobj.parentNode.style;\r\n\t style[dir === \"x\" ? \"overflowX\" : \"overflowY\"] = mode ? \"auto\" : \"hidden\";\r\n\t }\r\n\r\n\t if (dir === \"x\") {\r\n\t this._scroll_x = mode;\r\n\t } else {\r\n\t this._scroll_y = mode;\r\n\t }\r\n\r\n\t this._settings.scroll = dir;\r\n\t },\r\n\t getScrollState: function getScrollState() {\r\n\t if (Touch.$active) {\r\n\t var temp = Touch._get_matrix(this._dataobj);\r\n\r\n\t return {\r\n\t x: -temp.e,\r\n\t y: -temp.f\r\n\t };\r\n\t } else return {\r\n\t x: this._dataobj.parentNode.scrollLeft,\r\n\t y: this._dataobj.parentNode.scrollTop\r\n\t };\r\n\t },\r\n\t scrollTo: function scrollTo(x, y) {\r\n\t if (Touch.$active && env.touch != \"native\") {\r\n\t y = Math.max(0, Math.min(y, this._dataobj.offsetHeight - this._content_height));\r\n\t x = Math.max(0, Math.min(x, this._dataobj.offsetWidth - this._content_width));\r\n\r\n\t Touch._set_matrix(this._dataobj, -x, -y, this._settings.scrollSpeed || \"100ms\");\r\n\t } else {\r\n\t this._dataobj.parentNode.scrollLeft = x;\r\n\t this._dataobj.parentNode.scrollTop = y;\r\n\t }\r\n\t },\r\n\t _refresh_scroll: function _refresh_scroll() {\r\n\t if (this._settings.scroll.toString().indexOf(\"x\") != -1) {\r\n\t var x = this._dataobj.scrollWidth;\r\n\r\n\t if (x) {\r\n\t //in hidden state we will have a Zero scrollWidth\r\n\t this._dataobj.style.width = \"100%\";\r\n\t this._dataobj.style.width = this._dataobj.scrollWidth + \"px\";\r\n\t }\r\n\t }\r\n\r\n\t if (Touch.$active && this._touch_scroll) {\r\n\t Touch._clear_artefacts();\r\n\r\n\t Touch._scroll_end();\r\n\r\n\t var s = this.getScrollState();\r\n\t var dx = this._dataobj.offsetWidth - this.$width - s.x;\r\n\t var dy = this._dataobj.offsetHeight - this.$height - s.y; //if current scroll is outside of data area\r\n\r\n\t if (dx < 0 || dy < 0) {\r\n\t //scroll to the end of data area\r\n\t var _x = dx < 0 ? Math.min(-dx - s.x, 0) : -s.x;\r\n\r\n\t var y = dy < 0 ? Math.min(-dy - s.y, 0) : -s.y;\r\n\r\n\t Touch._set_matrix(this._dataobj, _x, y, 0);\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t\tBehavior:SelectionModel - manage selection states\r\n\t\t@export\r\n\t\t\tselect\r\n\t\t\tunselect\r\n\t\t\tselectAll\r\n\t\t\tunselectAll\r\n\t\t\tisSelected\r\n\t\t\tgetSelectedId\r\n\t*/\r\n\r\n\tvar SelectionModel = {\r\n\t $init: function $init() {\r\n\t //collection of selected IDs\r\n\t this._selected = toArray();\r\n\t assert(this.data, \"SelectionModel :: Component doesn't have DataStore\"); //remove selection from deleted items\r\n\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(this._data_updated, this));\r\n\t this.data.attachEvent(\"onStoreLoad\", bind(this._data_loaded, this));\r\n\t this.data.attachEvent(\"onAfterFilter\", bind(this._data_filtered, this));\r\n\t this.data.attachEvent(\"onSyncApply\", bind(this._select_check, this));\r\n\t this.data.attachEvent(\"onIdChange\", bind(this._id_changed, this));\r\n\t this.$ready.push(this._set_noselect);\r\n\t },\r\n\t _set_noselect: function _set_noselect() {\r\n\t if (this._settings.select == \"multiselect\" || this._settings.multiselect || this._settings.select == \"area\") _event(this.$view, \"mousedown\", function (e) {\r\n\t var shiftKey = (e || event$1).shiftKey;\r\n\r\n\t if (shiftKey) {\r\n\t state._noselect_element = this;\r\n\t addCss(this, \"webix_noselect\", 1);\r\n\t }\r\n\t });\r\n\t },\r\n\t _id_changed: function _id_changed(oldid, newid) {\r\n\t for (var i = this._selected.length - 1; i >= 0; i--) {\r\n\t if (this._selected[i] == oldid) this._selected[i] = newid;\r\n\t }\r\n\t },\r\n\t _data_filtered: function _data_filtered() {\r\n\t for (var i = this._selected.length - 1; i >= 0; i--) {\r\n\t if (this.data.getIndexById(this._selected[i]) < 0) {\r\n\t var id = this._selected[i];\r\n\t this.removeCss(id, \"webix_selected\", true);\r\n\r\n\t this._selected.splice(i, 1);\r\n\r\n\t this.callEvent(\"onSelectChange\", [id]);\r\n\t }\r\n\t }\r\n\t },\r\n\t //helper - linked to onStoreUpdated\r\n\t _data_updated: function _data_updated(id, obj, type) {\r\n\t if (type == \"delete\") {\r\n\t //remove selection from deleted items\r\n\t if (this.loadBranch) {\r\n\t //hierarchy, need to check all\r\n\t this._select_check();\r\n\t } else this._selected.remove(id);\r\n\t } else if (!id && !this.data.count() && !this.data._filter_order) {\r\n\t //remove selection for clearAll\r\n\t this._selected = toArray();\r\n\t }\r\n\t },\r\n\t _data_loaded: function _data_loaded() {\r\n\t if (this._settings.select) this.data.each(function (obj) {\r\n\t if (obj && obj.$selected) this.select(obj.id);\r\n\t }, this);\r\n\t },\r\n\t _select_check: function _select_check() {\r\n\t for (var i = this._selected.length - 1; i >= 0; i--) {\r\n\t if (!this.exists(this._selected[i])) this._selected.splice(i, 1);\r\n\t }\r\n\t },\r\n\t //helper - changes state of selection for some item\r\n\t _select_mark: function _select_mark(id, state$$1, refresh, need_unselect) {\r\n\t var sname = state$$1 ? \"onBeforeSelect\" : \"onBeforeUnSelect\";\r\n\t if (!this.callEvent(sname, [id, state$$1])) return false;\r\n\r\n\t if (need_unselect) {\r\n\t this._silent_selection = true;\r\n\t this.unselectAll();\r\n\t this._silent_selection = false;\r\n\t }\r\n\r\n\t if (state$$1) this.addCss(id, \"webix_selected\", true);else this.removeCss(id, \"webix_selected\", true);\r\n\t if (refresh) refresh.push(id); //if we in the mass-select mode - collect all changed IDs\r\n\t else {\r\n\t if (state$$1) this._selected.push(id); //then add to list of selected items\r\n\t else this._selected.remove(id);\r\n\r\n\t this._refresh_selection(id); //othervise trigger repainting\r\n\r\n\t }\r\n\t var ename = state$$1 ? \"onAfterSelect\" : \"onAfterUnSelect\";\r\n\t this.callEvent(ename, [id]);\r\n\t return true;\r\n\t },\r\n\t //select some item\r\n\t select: function select(id, preserve) {\r\n\t var ctrlKey = arguments[2];\r\n\t var shiftKey = arguments[3]; //if id not provide - works as selectAll\r\n\r\n\t if (!id) return this.selectAll(); //allow an array of ids as parameter\r\n\r\n\t if (isArray(id)) {\r\n\t for (var i = 0; i < id.length; i++) {\r\n\t this.select(id[i], i ? 1 : preserve, ctrlKey, shiftKey);\r\n\t }\r\n\r\n\t return;\r\n\t }\r\n\r\n\t assert(this.data.exists(id), \"Incorrect id in select command: \" + id); //block selection mode\r\n\r\n\t if (shiftKey && this._selected.length) return this.selectAll(this._selected[this._selected.length - 1], id); //single selection mode\r\n\r\n\t var need_unselect = false;\r\n\t if (!ctrlKey && !preserve && (this._selected.length != 1 || this._selected[0] != id)) need_unselect = true;\r\n\r\n\t if (!need_unselect && this.isSelected(id)) {\r\n\t if (ctrlKey) this.unselect(id); //ctrl-selection of already selected item\r\n\r\n\t return;\r\n\t }\r\n\r\n\t this._select_mark(id, true, null, need_unselect);\r\n\t },\r\n\t //unselect some item\r\n\t unselect: function unselect(id) {\r\n\t //if id is not provided - unselect all items\r\n\t if (!id) return this.unselectAll();\r\n\t if (!this.isSelected(id)) return;\r\n\r\n\t this._select_mark(id, false);\r\n\t },\r\n\t //select all items, or all in defined range\r\n\t selectAll: function selectAll(from, to) {\r\n\t var range;\r\n\t var refresh = [];\r\n\t if (from || to) range = this.data.getRange(from || null, to || null); //get limited set if bounds defined\r\n\t else range = this.data.getRange(); //get all items in other case\r\n\t //in case of paging - it will be current page only\r\n\r\n\t range.each(function (obj) {\r\n\t if (!this.data.getMark(obj.id, \"webix_selected\")) {\r\n\t this._selected.push(obj.id);\r\n\r\n\t this._select_mark(obj.id, true, refresh);\r\n\t }\r\n\t }, this); //repaint self\r\n\r\n\t this._refresh_selection(refresh);\r\n\t },\r\n\t //remove selection from all items\r\n\t unselectAll: function unselectAll() {\r\n\t var refresh = [];\r\n\r\n\t this._selected.each(function (id) {\r\n\t this._select_mark(id, false, refresh); //unmark selected only\r\n\r\n\t }, this);\r\n\r\n\t this._selected = toArray();\r\n\r\n\t this._refresh_selection(refresh); //repaint self\r\n\r\n\t },\r\n\t //returns true if item is selected\r\n\t isSelected: function isSelected(id) {\r\n\t return this._selected.find(id) != -1;\r\n\t },\r\n\r\n\t /*\r\n\t \treturns ID of selected items or array of IDs\r\n\t \tto make result predictable - as_array can be used, \r\n\t \t\twith such flag command will always return an array \r\n\t \t\tempty array in case when no item was selected\r\n\t */\r\n\t getSelectedId: function getSelectedId(as_array) {\r\n\t switch (this._selected.length) {\r\n\t case 0:\r\n\t return as_array ? [] : \"\";\r\n\r\n\t case 1:\r\n\t return as_array ? [this._selected[0]] : this._selected[0];\r\n\r\n\t default:\r\n\t return [].concat(this._selected);\r\n\t //isolation\r\n\t }\r\n\t },\r\n\t getSelectedItem: function getSelectedItem(as_array) {\r\n\t var sel = this.getSelectedId(true);\r\n\r\n\t if (sel.length > 1 || as_array) {\r\n\t for (var i = sel.length - 1; i >= 0; i--) {\r\n\t sel[i] = this.getItem(sel[i]);\r\n\t }\r\n\r\n\t return sel;\r\n\t } else if (sel.length) return this.getItem(sel[0]);\r\n\t },\r\n\t //detects which repainting mode need to be used\r\n\t _is_mass_selection: function _is_mass_selection(obj) {\r\n\t // crappy heuristic, but will do the job\r\n\t return obj.length > 100 || obj.length > this.data.count / 2;\r\n\t },\r\n\t _refresh_selection: function _refresh_selection(refresh) {\r\n\t if (_typeof(refresh) != \"object\") refresh = [refresh];\r\n\t if (!refresh.length) return; //nothing to repaint\r\n\r\n\t if (this._is_mass_selection(refresh)) this.data.refresh(); //many items was selected - repaint whole view\r\n\t else for (var i = 0; i < refresh.length; i++) {\r\n\t //repaint only selected\r\n\t this.render(refresh[i], this.data.getItem(refresh[i]), \"update\");\r\n\t }\r\n\t if (!this._silent_selection) this.callEvent(\"onSelectChange\", [refresh]);\r\n\t }\r\n\t};\r\n\tready(function () {\r\n\t event$1(document.body, \"mouseup\", function () {\r\n\t if (state._noselect_element) {\r\n\t removeCss(state._noselect_element, \"webix_noselect\");\r\n\t state._noselect_element = null;\r\n\t }\r\n\t });\r\n\t});\r\n\r\n\tvar color = {\r\n\t _toHex: [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\"],\r\n\t toHex: function toHex(number, length) {\r\n\t number = parseInt(number, 10);\r\n\t var str = \"\";\r\n\r\n\t while (number > 0) {\r\n\t str = this._toHex[number % 16] + str;\r\n\t number = Math.floor(number / 16);\r\n\t }\r\n\r\n\t while (str.length < length) {\r\n\t str = \"0\" + str;\r\n\t }\r\n\r\n\t return str;\r\n\t },\r\n\t rgbToHex: function rgbToHex(rgb) {\r\n\t var arr = [];\r\n\t if (typeof rgb === \"string\") rgb.replace(/[\\d+.]+/g, function (v) {\r\n\t arr.push(parseFloat(v));\r\n\t });else if (isArray(rgb)) arr = rgb; //transparent\r\n\r\n\t if (arr[3] === 0) return \"\";\r\n\t return arr.slice(0, 3).map(function (n) {\r\n\t return color.toHex(Math.floor(n), 2);\r\n\t }).join(\"\");\r\n\t },\r\n\t hexToDec: function hexToDec(hex) {\r\n\t return parseInt(hex, 16);\r\n\t },\r\n\t toRgb: function toRgb(rgb) {\r\n\t var r, g, b, rgbArr;\r\n\r\n\t if (typeof rgb != \"string\") {\r\n\t r = rgb[0];\r\n\t g = rgb[1];\r\n\t b = rgb[2];\r\n\t } else if (rgb.indexOf(\"rgb\") != -1) {\r\n\t rgbArr = rgb.substr(rgb.indexOf(\"(\") + 1, rgb.lastIndexOf(\")\") - rgb.indexOf(\"(\") - 1).split(\",\");\r\n\t r = rgbArr[0];\r\n\t g = rgbArr[1];\r\n\t b = rgbArr[2];\r\n\t } else {\r\n\t if (rgb.substr(0, 1) == \"#\") {\r\n\t rgb = rgb.substr(1);\r\n\t }\r\n\r\n\t r = this.hexToDec(rgb.substr(0, 2));\r\n\t g = this.hexToDec(rgb.substr(2, 2));\r\n\t b = this.hexToDec(rgb.substr(4, 2));\r\n\t }\r\n\r\n\t r = parseInt(r, 10) || 0;\r\n\t g = parseInt(g, 10) || 0;\r\n\t b = parseInt(b, 10) || 0;\r\n\t if (r < 0 || r > 255) r = 0;\r\n\t if (g < 0 || g > 255) g = 0;\r\n\t if (b < 0 || b > 255) b = 0;\r\n\t return [r, g, b];\r\n\t },\r\n\t hsvToRgb: function hsvToRgb(h, s, v) {\r\n\t var hi, f, p, q, t, r, g, b;\r\n\t hi = Math.floor(h / 60) % 6;\r\n\t f = h / 60 - hi;\r\n\t p = v * (1 - s);\r\n\t q = v * (1 - f * s);\r\n\t t = v * (1 - (1 - f) * s);\r\n\t r = 0;\r\n\t g = 0;\r\n\t b = 0;\r\n\r\n\t switch (hi) {\r\n\t case 0:\r\n\t r = v;\r\n\t g = t;\r\n\t b = p;\r\n\t break;\r\n\r\n\t case 1:\r\n\t r = q;\r\n\t g = v;\r\n\t b = p;\r\n\t break;\r\n\r\n\t case 2:\r\n\t r = p;\r\n\t g = v;\r\n\t b = t;\r\n\t break;\r\n\r\n\t case 3:\r\n\t r = p;\r\n\t g = q;\r\n\t b = v;\r\n\t break;\r\n\r\n\t case 4:\r\n\t r = t;\r\n\t g = p;\r\n\t b = v;\r\n\t break;\r\n\r\n\t case 5:\r\n\t r = v;\r\n\t g = p;\r\n\t b = q;\r\n\t break;\r\n\r\n\t default:\r\n\t break;\r\n\t }\r\n\r\n\t r = Math.floor(r * 255);\r\n\t g = Math.floor(g * 255);\r\n\t b = Math.floor(b * 255);\r\n\t return [r, g, b];\r\n\t },\r\n\t rgbToHsv: function rgbToHsv(r, g, b) {\r\n\t var r0, g0, b0, min0, max0, s, h, v;\r\n\t r0 = r / 255;\r\n\t g0 = g / 255;\r\n\t b0 = b / 255;\r\n\t min0 = Math.min(r0, g0, b0);\r\n\t max0 = Math.max(r0, g0, b0);\r\n\t h = 0;\r\n\t s = max0 === 0 ? 0 : 1 - min0 / max0;\r\n\t v = max0;\r\n\r\n\t if (max0 == min0) {\r\n\t h = 0;\r\n\t } else if (max0 == r0 && g0 >= b0) {\r\n\t h = 60 * (g0 - b0) / (max0 - min0) + 0;\r\n\t } else if (max0 == r0 && g0 < b0) {\r\n\t h = 60 * (g0 - b0) / (max0 - min0) + 360;\r\n\t } else if (max0 == g0) {\r\n\t h = 60 * (b0 - r0) / (max0 - min0) + 120;\r\n\t } else if (max0 == b0) {\r\n\t h = 60 * (r0 - g0) / (max0 - min0) + 240;\r\n\t }\r\n\r\n\t return [h, s, v];\r\n\t }\r\n\t};\r\n\r\n\tfunction joinAttributes(attrs) {\r\n\t var result = \" \";\r\n\t if (attrs) for (var a in attrs) {\r\n\t result += a + \"=\\\"\" + attrs[a] + \"\\\" \";\r\n\t }\r\n\t return result;\r\n\t} // SVG\r\n\r\n\r\n\tvar SVG = {};\r\n\r\n\tSVG.draw = function (content, width, height, css) {\r\n\t var attrs = {\r\n\t xmlns: \"http://www.w3.org/2000/svg\",\r\n\t version: \"1.1\",\r\n\t height: \"100%\",\r\n\t width: \"100%\",\r\n\t viewBox: \"0 0 \" + width + \" \" + height,\r\n\t \"class\": css || \"\"\r\n\t };\r\n\t return \"\" + content + \"\";\r\n\t};\r\n\r\n\tSVG.styleMap = {\r\n\t \"lineColor\": \"stroke\",\r\n\t \"color\": \"fill\"\r\n\t};\r\n\r\n\tSVG.group = function (path) {\r\n\t return \"\" + path + \"\";\r\n\t};\r\n\r\n\tSVG._handlers = {\r\n\t // MoveTo: {x:px,y:py}\r\n\t \"M\": function M(p) {\r\n\t return \" M \" + p.x + \" \" + p.y;\r\n\t },\r\n\t // LineTo: {x:px,y:py}\r\n\t \"L\": function L(p) {\r\n\t return \" L \" + p.x + \" \" + p.y;\r\n\t },\r\n\t // Curve: 3 points {x:px,y:py}: two control points and an end point\r\n\t \"C\": function C(cp0, cp1, p) {\r\n\t return \" C \" + cp0.x + \" \" + cp0.y + \" \" + cp1.x + \" \" + cp1.y + \" \" + p.x + \" \" + p.y;\r\n\t },\r\n\t // Arc: center point {x:px,y:py}, radius, angle0, angle1\r\n\t \"A\": function A(p, radius, angle0, angle1) {\r\n\t var x = p.x + Math.cos(angle1) * radius;\r\n\t var y = p.y + Math.sin(angle1) * radius;\r\n\t var bigCircle = angle1 - angle0 >= Math.PI;\r\n\t return \" A \" + radius + \" \" + radius + \" 0 \" + (bigCircle ? 1 : 0) + \" 1 \" + x + \" \" + y;\r\n\t }\r\n\t}; // points is an array of an array with two elements: {string} line type, {array}\r\n\r\n\tSVG.definePath = function (points, close) {\r\n\t var path = \"\";\r\n\r\n\t for (var i = 0; i < points.length; i++) {\r\n\t assert(points[i][0] && typeof points[i][0] == \"string\", \"Path type must be a string\");\r\n\t var type = points[i][0].toUpperCase();\r\n\t assert(this._handlers[type], \"Incorrect path type\");\r\n\t path += this._handlers[type].apply(this, points[i].slice(1));\r\n\t }\r\n\r\n\t if (close) path += \" Z\";\r\n\t return path;\r\n\t};\r\n\r\n\tSVG._linePoints = function (points) {\r\n\t var result = [];\r\n\r\n\t for (var i = 0; i < points.length; i++) {\r\n\t result.push([i ? \"L\" : \"M\", points[i]]);\r\n\t }\r\n\r\n\t return result;\r\n\t};\r\n\r\n\tSVG.setOpacity = function (rawColor, opacity) {\r\n\t var rgbColor = color.toRgb(rawColor);\r\n\t rgbColor.push(opacity);\r\n\t return \"rgba(\" + rgbColor.join(\",\") + \")\";\r\n\t};\r\n\r\n\tSVG._curvePoints = function (points) {\r\n\t var result = [];\r\n\r\n\t for (var i = 0; i < points.length; i++) {\r\n\t var p = points[i];\r\n\r\n\t if (!i) {\r\n\t result.push([\"M\", p[0]]);\r\n\t }\r\n\r\n\t result.push([\"C\", p[1], p[2], p[3]]);\r\n\t }\r\n\r\n\t return result;\r\n\t};\r\n\r\n\tSVG.getPath = function (path, css, attrs) {\r\n\t attrs = joinAttributes(attrs);\r\n\t return \"\";\r\n\t};\r\n\r\n\tSVG.getSector = function (p, radius, angle0, angle1, css, attrs) {\r\n\t attrs = joinAttributes(attrs);\r\n\t var x0 = p.x + Math.cos(angle0) * radius;\r\n\t var y0 = p.y + Math.sin(angle0) * radius;\r\n\t var lines = [[\"M\", p], [\"L\", {\r\n\t x: x0,\r\n\t y: y0\r\n\t }], [\"A\", p, radius, angle0, angle1], [\"L\", p]];\r\n\t return \"\";\r\n\t};\r\n\r\n\tSVG.getCurve = function (points, css, attrs) {\r\n\t attrs = joinAttributes(attrs);\r\n\t var path = this.definePath(this._curvePoints(points));\r\n\t return \"\";\r\n\t};\r\n\r\n\tSVG.getLine = function (p0, p1, css, attrs) {\r\n\t return this.getPath(this.definePath(this._linePoints([p0, p1]), true), css, attrs);\r\n\t};\r\n\r\n\tSVG.getCircle = function (p, radius, css, attrs) {\r\n\t attrs = joinAttributes(attrs);\r\n\t return \"\";\r\n\t};\r\n\r\n\tSVG.getRect = function (x, y, width, height, css, attrs) {\r\n\t attrs = joinAttributes(attrs);\r\n\t return \"\";\r\n\t};\r\n\r\n\tvar defaults = {\r\n\t paddingX: 6,\r\n\t paddingY: 6,\r\n\t radius: 2,\r\n\t minHeight: 4,\r\n\t eventRadius: 8\r\n\t};\r\n\r\n\tfunction Line(config) {\r\n\t this.config = exports.extend(copy(defaults), config || {}, true);\r\n\t}\r\n\r\n\tLine.prototype.draw = function (data, width, height) {\r\n\t var points = this.getPoints(data, width, height);\r\n\t var config = this.config;\r\n\t var renderer = SVG;\r\n\t var styles = config.color ? this._applyColor(renderer, config.color) : null; // draw line\r\n\r\n\t var path = renderer.definePath(this._getLinePoints(points));\r\n\t var graph = renderer.group(renderer.getPath(path, \"webix_sparklines_line\" + (styles ? \" \" + styles.line : \"\"))); // draw items\r\n\r\n\t graph += this._drawItems(renderer, points, config.radius, \"webix_sparklines_item\" + (styles ? \" \" + styles.item : \"\")); // draw event items\r\n\r\n\t var eventRadius = Math.min(data.length ? (width - 2 * (config.paddingX || 0)) / data.length : 0, config.eventRadius);\r\n\t graph += this._drawEventItems(renderer, points, eventRadius);\r\n\t return renderer.draw(graph, width, height, \"webix_sparklines_line_chart\" + (config.css ? \" \" + config.css : \"\"));\r\n\t};\r\n\r\n\tLine.prototype._applyColor = function (renderer, color) {\r\n\t var config = {\r\n\t \"line\": {},\r\n\t \"item\": {}\r\n\t },\r\n\t map = renderer.styleMap;\r\n\r\n\t if (color) {\r\n\t config.line[map.lineColor] = color;\r\n\t config.item[map.color] = color;\r\n\r\n\t for (var name in config) {\r\n\t config[name] = createCss(config[name]);\r\n\t }\r\n\t }\r\n\r\n\t return config;\r\n\t};\r\n\r\n\tLine.prototype._drawItems = function (renderer, points, radius, css, attrs) {\r\n\t var items = [];\r\n\r\n\t for (var i = 0; i < points.length; i++) {\r\n\t items.push(renderer.getCircle(points[i], radius, css, attrs));\r\n\t }\r\n\r\n\t return renderer.group(items.join(\"\"));\r\n\t};\r\n\r\n\tLine.prototype._drawEventItems = function (renderer, points, radius) {\r\n\t var items = [];\r\n\r\n\t for (var i = 0; i < points.length; i++) {\r\n\t items.push(renderer.getCircle(points[i], radius, \"webix_sparklines_event_area\", {\r\n\t webix_area: i\r\n\t }));\r\n\t }\r\n\r\n\t return renderer.group(items.join(\"\"));\r\n\t};\r\n\r\n\tLine.prototype._getLinePoints = function (points) {\r\n\t var i,\r\n\t type,\r\n\t result = [];\r\n\r\n\t for (i = 0; i < points.length; i++) {\r\n\t type = i ? \"L\" : \"M\";\r\n\t result.push([type, points[i]]);\r\n\t }\r\n\r\n\t return result;\r\n\t};\r\n\r\n\tLine.prototype.getPoints = function (data, width, height) {\r\n\t var config = this.config;\r\n\t var minValue = Math.min.apply(null, data);\r\n\t if (typeof config.origin !== \"undefined\") minValue = Math.min(config.origin, minValue);\r\n\t var maxValue = Math.max.apply(null, data);\r\n\t var result = [];\r\n\t var x = config.paddingX || 0;\r\n\t var y = config.paddingY || 0;\r\n\t width = (width || 100) - x * 2;\r\n\t var minHeight = config.minHeight || 0;\r\n\t height = (height || 100) - y * 2;\r\n\r\n\t if (data.length) {\r\n\t if (data.length == 1) result.push({\r\n\t x: width / 2 + x,\r\n\t y: height / 2 + x\r\n\t });else {\r\n\t var unitX = width / (data.length - 1);\r\n\t var yNum = config.scale || maxValue - minValue;\r\n\t var unitY = (height - minHeight) / (yNum ? yNum : 1);\r\n\t if (!yNum) height /= 2;\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t result.push({\r\n\t x: Math.ceil(unitX * i) + x,\r\n\t y: height - Math.ceil(unitY * (data[i] - minValue)) + y - minHeight\r\n\t });\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return result;\r\n\t};\r\n\r\n\tvar defaults$1 = {\r\n\t paddingX: 3,\r\n\t paddingY: 4,\r\n\t radius: 1,\r\n\t minHeight: 4,\r\n\t eventRadius: 8\r\n\t};\r\n\r\n\tfunction Area(config) {\r\n\t this.config = exports.extend(copy(defaults$1), config || {}, true);\r\n\t}\r\n\r\n\tArea.prototype.draw = function (data, width, height) {\r\n\t var eventRadius,\r\n\t graph,\r\n\t path,\r\n\t points,\r\n\t styles,\r\n\t config = this.config,\r\n\t Line$$1 = Line.prototype,\r\n\t renderer = SVG; // draw area\r\n\r\n\t points = this.getPoints(data, width, height);\r\n\t path = renderer.definePath(Line$$1._getLinePoints(points), true);\r\n\t if (config.color) styles = this._applyColor(renderer, config.color);\r\n\t graph = renderer.group(renderer.getPath(path, \"webix_sparklines_area\" + (styles ? \" \" + styles.area : \"\"))); // draw line\r\n\r\n\t points.splice(points.length - 3, 3);\r\n\t path = renderer.definePath(Line$$1._getLinePoints(points));\r\n\t graph += renderer.group(renderer.getPath(path, \"webix_sparklines_line\" + (styles ? \" \" + styles.line : \"\"))); // draw items\r\n\r\n\t graph += Line$$1._drawItems(renderer, points, config.radius, \"webix_sparklines_item\" + (styles ? \" \" + styles.item : \"\")); // draw event areas\r\n\r\n\t eventRadius = Math.min(data.length ? (width - 2 * (config.paddingX || 0)) / data.length : 0, config.eventRadius);\r\n\t graph += Line$$1._drawEventItems(renderer, points, eventRadius);\r\n\t return renderer.draw(graph, width, height, \"webix_sparklines_area_chart\" + (config.css ? \" \" + config.css : \"\"));\r\n\t};\r\n\r\n\tArea.prototype._applyColor = function (renderer, color) {\r\n\t var config = {\r\n\t \"area\": {},\r\n\t \"line\": {},\r\n\t \"item\": {}\r\n\t },\r\n\t map = renderer.styleMap;\r\n\r\n\t if (color) {\r\n\t config.area[map.color] = renderer.setOpacity(color, 0.2);\r\n\t config.line[map.lineColor] = color;\r\n\t config.item[map.color] = color;\r\n\r\n\t for (var name in config) {\r\n\t config[name] = createCss(config[name]);\r\n\t }\r\n\t }\r\n\r\n\t return config;\r\n\t};\r\n\r\n\tArea.prototype.getPoints = function (data, width, height) {\r\n\t var Line$$1 = Line.prototype;\r\n\t var points = Line$$1.getPoints.call(this, data, width, height);\r\n\t var x = this.config.paddingX || 0;\r\n\t var y = this.config.paddingY || 0;\r\n\t points.push({\r\n\t x: width - x,\r\n\t y: height - y\r\n\t }, {\r\n\t x: x,\r\n\t y: height - y\r\n\t }, {\r\n\t x: x,\r\n\t y: points[0].y\r\n\t });\r\n\t return points;\r\n\t};\r\n\r\n\tvar defaults$2 = {\r\n\t paddingX: 3,\r\n\t paddingY: 4,\r\n\t width: 20,\r\n\t margin: 4,\r\n\t minHeight: 4,\r\n\t eventRadius: 8,\r\n\t origin: 0,\r\n\t itemCss: function itemCss(value) {\r\n\t return value < (this.config.origin || 0) ? \" webix_sparklines_bar_negative\" : \"\";\r\n\t }\r\n\t};\r\n\r\n\tfunction Bar(config) {\r\n\t this.config = exports.extend(copy(defaults$2), config || {}, true);\r\n\t}\r\n\r\n\tBar.prototype.draw = function (data, width, height) {\r\n\t var i,\r\n\t css,\r\n\t p,\r\n\t y,\r\n\t padding,\r\n\t config = this.config,\r\n\t graph = \"\",\r\n\t items = [],\r\n\t points = this.getPoints(data, width, height),\r\n\t renderer = SVG; // draw bars\r\n\r\n\t for (i = 0; i < points.length; i++) {\r\n\t css = typeof config.itemCss == \"function\" ? config.itemCss.call(this, data[i]) : config.itemCss || \"\";\r\n\t if (config.negativeColor && data[i] < config.origin) css += \" \" + this._applyColor(renderer, config.negativeColor);else if (config.color) css += \" \" + this._applyColor(renderer, config.color);\r\n\t p = points[i];\r\n\t items.push(renderer.getRect(p.x, p.y, p.width, p.height, \"webix_sparklines_bar \" + css));\r\n\t }\r\n\r\n\t graph += renderer.group(items.join(\"\")); // origin)\r\n\r\n\t y = parseInt(this._getOrigin(data, width, height), 10) + 0.5;\r\n\t padding = config.paddingX || 0;\r\n\t graph += renderer.group(renderer.getLine({\r\n\t x: padding,\r\n\t y: y\r\n\t }, {\r\n\t x: width - padding,\r\n\t y: y\r\n\t }, \"webix_sparklines_origin\")); // event areas\r\n\r\n\t var evPoints = this._getEventPoints(data, width, height);\r\n\r\n\t var evItems = [];\r\n\r\n\t for (i = 0; i < evPoints.length; i++) {\r\n\t p = evPoints[i];\r\n\t evItems.push(renderer.getRect(p.x, p.y, p.width, p.height, \"webix_sparklines_event_area \", {\r\n\t \"webix_area\": i\r\n\t }));\r\n\t }\r\n\r\n\t graph += renderer.group(evItems.join(\"\"));\r\n\t return renderer.draw(graph, width, height, \"webix_sparklines_bar_chart\" + (config.css ? \" \" + config.css : \"\"));\r\n\t};\r\n\r\n\tBar.prototype._applyColor = function (renderer, color) {\r\n\t var config = {},\r\n\t map = renderer.styleMap;\r\n\t if (color) config[map.color] = color;\r\n\t return createCss(config);\r\n\t};\r\n\r\n\tBar.prototype._getOrigin = function (data, width, height) {\r\n\t var config = this.config;\r\n\t var y = config.paddingY || 0;\r\n\t height = (height || 100) - y * 2;\r\n\t var pos$$1 = y + height;\r\n\r\n\t if (config.origin !== false) {\r\n\t var minValue = Math.min.apply(null, data);\r\n\t var maxValue = Math.max.apply(null, data);\r\n\t var origin = config.origin || -0.000001;\r\n\r\n\t if (origin >= maxValue) {\r\n\t pos$$1 = y;\r\n\t } else if (origin > minValue) {\r\n\t var unitY = height / (maxValue - minValue);\r\n\t pos$$1 -= unitY * (origin - minValue);\r\n\t }\r\n\t }\r\n\r\n\t return pos$$1;\r\n\t};\r\n\r\n\tBar.prototype._getEventPoints = function (data, width, height) {\r\n\t var result = [];\r\n\t var x = this.config.paddingX || 0;\r\n\t var y = this.config.paddingY || 0;\r\n\t width = (width || 100) - x * 2;\r\n\t height = (height || 100) - y * 2;\r\n\r\n\t if (data.length) {\r\n\t var unitX = width / data.length;\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t result.push({\r\n\t x: Math.ceil(unitX * i) + x,\r\n\t y: y,\r\n\t height: height,\r\n\t width: unitX\r\n\t });\r\n\t }\r\n\t }\r\n\r\n\t return result;\r\n\t};\r\n\r\n\tBar.prototype.getPoints = function (data, width, height) {\r\n\t var config = this.config;\r\n\t var minValue = Math.min.apply(null, data);\r\n\t if (config.origin < minValue) minValue = config.origin;\r\n\t var maxValue = Math.max.apply(null, data);\r\n\t var result = [];\r\n\t var x = config.paddingX;\r\n\t var y = config.paddingY;\r\n\t var margin = config.margin;\r\n\t var barWidth = config.width || 20;\r\n\r\n\t var originY = this._getOrigin(data, width, height);\r\n\r\n\t width = (width || 100) - x * 2;\r\n\t height = (height || 100) - y * 2;\r\n\r\n\t if (data.length) {\r\n\t var unitX = width / data.length;\r\n\t var yNum = config.scale || maxValue - minValue;\r\n\t barWidth = Math.min(unitX - margin, barWidth);\r\n\t margin = unitX - barWidth;\r\n\t var minHeight = 0;\r\n\t var origin = minValue;\r\n\t if (config.origin !== false && config.origin > minValue) origin = config.origin || 0;else minHeight = config.minHeight;\r\n\t var unitY = (height - minHeight) / (yNum ? yNum : 1);\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t var h = Math.ceil(unitY * (data[i] - origin));\r\n\t result.push({\r\n\t x: Math.ceil(unitX * i) + x + margin / 2,\r\n\t y: originY - (data[i] >= origin ? h : 0) - minHeight,\r\n\t height: Math.abs(h) + minHeight,\r\n\t width: barWidth\r\n\t });\r\n\t }\r\n\t }\r\n\r\n\t return result;\r\n\t};\r\n\r\n\tvar defaults$3 = {\r\n\t paddingY: 2\r\n\t};\r\n\r\n\tfunction Pie(config) {\r\n\t this.config = exports.extend(defaults$3, config || {}, true);\r\n\t}\r\n\r\n\tPie.prototype._defColorsCursor = 0;\r\n\tPie.prototype._defColors = [\"#f55b50\", \"#ff6d3f\", \"#ffa521\", \"#ffc927\", \"#ffee54\", \"#d3e153\", \"#9acb61\", \"#63b967\", \"#21a497\", \"#21c5da\", \"#3ea4f5\", \"#5868bf\", \"#7b53c0\", \"#a943ba\", \"#ec3b77\", \"#9eb0b8\"];\r\n\r\n\tPie.prototype._getColor = function (i, data) {\r\n\t var count = data.length;\r\n\t var colorsCount = this._defColors.length;\r\n\r\n\t if (colorsCount > count) {\r\n\t if (i) {\r\n\t if (i < colorsCount - count) i = this._defColorsCursor + 2;else i = this._defColorsCursor + 1;\r\n\t }\r\n\r\n\t this._defColorsCursor = i;\r\n\t } else i = i % colorsCount;\r\n\r\n\t return this._defColors[i];\r\n\t};\r\n\r\n\tPie.prototype.draw = function (data, width, height) {\r\n\t var attrs,\r\n\t graph,\r\n\t i,\r\n\t sectors,\r\n\t config = this.config,\r\n\t _color = config.color || this._getColor,\r\n\t points = this.getAngles(data),\r\n\t renderer = SVG,\r\n\t y = config.paddingY || 0,\r\n\t // radius\r\n\t r = height / 2 - y,\r\n\t // center\r\n\t x0 = width / 2,\r\n\t y0 = height / 2; // draw sectors\r\n\r\n\r\n\t if (typeof _color != \"function\") _color = function color() {\r\n\t return _color;\r\n\t };\r\n\t sectors = \"\";\r\n\r\n\t for (i = 0; i < points.length; i++) {\r\n\t attrs = {};\r\n\t attrs[renderer.styleMap[\"color\"]] = _color.call(this, i, data, this._context);\r\n\t sectors += renderer.getSector({\r\n\t x: x0,\r\n\t y: y0\r\n\t }, r, points[i][0], points[i][1], \"webix_sparklines_sector\", attrs);\r\n\t }\r\n\r\n\t graph = renderer.group(sectors); // draw event areas\r\n\r\n\t sectors = \"\";\r\n\r\n\t for (i = 0; i < points.length; i++) {\r\n\t sectors += renderer.getSector({\r\n\t x: x0,\r\n\t y: y0\r\n\t }, r, points[i][0], points[i][1], \"webix_sparklines_event_area\", {\r\n\t \"webix_area\": i\r\n\t });\r\n\t }\r\n\r\n\t graph += renderer.group(sectors);\r\n\t return renderer.draw(graph, width, height, \"webix_sparklines_pie_chart\" + (config.css ? \" \" + config.css : \"\"));\r\n\t};\r\n\r\n\tPie.prototype.getAngles = function (data) {\r\n\t var a0 = -Math.PI / 2,\r\n\t a1,\r\n\t i,\r\n\t result = [];\r\n\r\n\t var ratios = this._getRatios(data);\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t a1 = -Math.PI / 2 + ratios[i] - 0.0001;\r\n\t result.push([a0, a1]);\r\n\t a0 = a1;\r\n\t }\r\n\r\n\t return result;\r\n\t};\r\n\r\n\tPie.prototype._getTotalValue = function (data) {\r\n\t var t = 0;\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t t += data[i] * 1;\r\n\t }\r\n\r\n\t return t;\r\n\t};\r\n\r\n\tPie.prototype._getRatios = function (data) {\r\n\t var i,\r\n\t value,\r\n\t ratios = [],\r\n\t prevSum = 0,\r\n\t totalValue = this._getTotalValue(data);\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t value = data[i] * 1;\r\n\t ratios[i] = Math.PI * 2 * (totalValue ? (value + prevSum) / totalValue : 1 / data.length);\r\n\t prevSum += value;\r\n\t }\r\n\r\n\t return ratios;\r\n\t};\r\n\r\n\tvar defaults$4 = {\r\n\t paddingX: 3,\r\n\t paddingY: 6,\r\n\t radius: 2,\r\n\t minHeight: 4,\r\n\t eventRadius: 8\r\n\t};\r\n\r\n\tfunction Spline(config) {\r\n\t this.config = exports.extend(copy(defaults$4), config || {}, true);\r\n\t}\r\n\r\n\tSpline.prototype.draw = function (data, width, height) {\r\n\t var config = this.config,\r\n\t graph = \"\",\r\n\t Line$$1 = Line.prototype,\r\n\t points = this.getPoints(data, width, height),\r\n\t renderer = SVG,\r\n\t styles = config.color ? this._applyColor(renderer, config.color) : null; // draw spline\r\n\r\n\t graph += renderer.group(renderer.getCurve(points, \"webix_sparklines_line\" + (styles ? \" \" + styles.line : \"\")));\r\n\t var linePoints = Line$$1.getPoints.call(this, data, width, height); // draw items\r\n\r\n\t graph += Line$$1._drawItems(renderer, linePoints, config.radius, \"webix_sparklines_item\" + (styles ? \" \" + styles.item : \"\")); // draw event items\r\n\r\n\t var eventRadius = Math.min(data.length ? (width - 2 * (config.paddingX || 0)) / data.length : 0, config.eventRadius);\r\n\t graph += Line$$1._drawEventItems(renderer, linePoints, eventRadius);\r\n\t return renderer.draw(graph, width, height, \"webix_sparklines_line_chart\" + (config.css ? \" \" + config.css : \"\"));\r\n\t};\r\n\r\n\tSpline.prototype._applyColor = function (renderer, color) {\r\n\t var config = {\r\n\t \"line\": {},\r\n\t \"item\": {}\r\n\t },\r\n\t map = renderer.styleMap;\r\n\r\n\t if (color) {\r\n\t config.line[map.lineColor] = color;\r\n\t config.item[map.color] = color;\r\n\r\n\t for (var name in config) {\r\n\t config[name] = createCss(config[name]);\r\n\t }\r\n\t }\r\n\r\n\t return config;\r\n\t};\r\n\r\n\tSpline.prototype.getPoints = function (data, width, height) {\r\n\t var i,\r\n\t points,\r\n\t px,\r\n\t py,\r\n\t result = [],\r\n\t x = [],\r\n\t y = [],\r\n\t Line$$1 = Line.prototype;\r\n\t points = Line$$1.getPoints.call(this, data, width, height);\r\n\r\n\t for (i = 0; i < points.length; i++) {\r\n\t x.push(points[i].x);\r\n\t y.push(points[i].y);\r\n\t }\r\n\r\n\t px = this._getControlPoints(x);\r\n\t py = this._getControlPoints(y);\r\n\t /*updates path settings, the browser will draw the new spline*/\r\n\r\n\t for (i = 0; i < points.length - 1; i++) {\r\n\t result.push([points[i], {\r\n\t x: px[0][i],\r\n\t y: py[0][i]\r\n\t }, {\r\n\t x: px[1][i],\r\n\t y: py[1][i]\r\n\t }, points[i + 1]]);\r\n\t }\r\n\r\n\t return result;\r\n\t};\r\n\t/* code from https://www.particleincell.com/2012/bezier-splines/ */\r\n\r\n\r\n\tSpline.prototype._getControlPoints = function (points) {\r\n\t var a = [],\r\n\t b = [],\r\n\t c = [],\r\n\t r = [],\r\n\t p1 = [],\r\n\t p2 = [],\r\n\t i,\r\n\t m,\r\n\t n = points.length - 1;\r\n\t a[0] = 0;\r\n\t b[0] = 2;\r\n\t c[0] = 1;\r\n\t r[0] = points[0] + 2 * points[1];\r\n\r\n\t for (i = 1; i < n - 1; i++) {\r\n\t a[i] = 1;\r\n\t b[i] = 4;\r\n\t c[i] = 1;\r\n\t r[i] = 4 * points[i] + 2 * points[i + 1];\r\n\t }\r\n\r\n\t a[n - 1] = 2;\r\n\t b[n - 1] = 7;\r\n\t c[n - 1] = 0;\r\n\t r[n - 1] = 8 * points[n - 1] + points[n];\r\n\r\n\t for (i = 1; i < n; i++) {\r\n\t m = a[i] / b[i - 1];\r\n\t b[i] = b[i] - m * c[i - 1];\r\n\t r[i] = r[i] - m * r[i - 1];\r\n\t }\r\n\r\n\t p1[n - 1] = r[n - 1] / b[n - 1];\r\n\r\n\t for (i = n - 2; i >= 0; --i) {\r\n\t p1[i] = (r[i] - c[i] * p1[i + 1]) / b[i];\r\n\t }\r\n\r\n\t for (i = 0; i < n - 1; i++) {\r\n\t p2[i] = 2 * points[i + 1] - p1[i + 1];\r\n\t }\r\n\r\n\t p2[n - 1] = 0.5 * (points[n] + p1[n - 1]);\r\n\t return [p1, p2];\r\n\t};\r\n\r\n\tvar defaultsArea = {\r\n\t paddingX: 3,\r\n\t paddingY: 6,\r\n\t radius: 1,\r\n\t minHeight: 4,\r\n\t eventRadius: 8\r\n\t}; // spline area\r\n\r\n\tfunction SplineArea(config) {\r\n\t this.config = exports.extend(copy(defaultsArea), config || {}, true);\r\n\t}\r\n\r\n\tSplineArea.prototype = copy(Spline.prototype);\r\n\r\n\tSplineArea.prototype.draw = function (data, width, height) {\r\n\t var config = this.config,\r\n\t Line$$1 = Line.prototype,\r\n\t renderer = SVG,\r\n\t styles = config.color ? this._applyColor(renderer, config.color) : null;\r\n\t var points = this.getPoints(data, width, height); // draw area\r\n\r\n\t var linePoints = points.splice(points.length - 3, 3);\r\n\r\n\t var linePath = renderer._linePoints(linePoints);\r\n\r\n\t linePath[0][0] = \"L\";\r\n\r\n\t var areaPoints = renderer._curvePoints(points).concat(linePath);\r\n\r\n\t var graph = renderer.group(renderer.getPath(renderer.definePath(areaPoints), \"webix_sparklines_area\" + (styles ? \" \" + styles.area : \"\"), true)); // draw line\r\n\r\n\t graph += renderer.group(renderer.getPath(renderer.definePath(renderer._curvePoints(points)), \"webix_sparklines_line\" + (styles ? \" \" + styles.line : \"\")));\r\n\t var itemPoints = Line$$1.getPoints.call(this, data, width, height); // draw items\r\n\r\n\t graph += Line$$1._drawItems(renderer, itemPoints, config.radius, \"webix_sparklines_item\" + (styles ? \" \" + styles.item : \"\")); // draw event items\r\n\r\n\t var eventRadius = Math.min(data.length ? (width - 2 * (config.paddingX || 0)) / data.length : 0, config.eventRadius);\r\n\t graph += Line$$1._drawEventItems(renderer, itemPoints, eventRadius);\r\n\t return renderer.draw(graph, width, height, \"webix_sparklines_splinearea_chart\" + (config.css ? \" \" + config.css : \"\"));\r\n\t};\r\n\r\n\tSplineArea.prototype._applyColor = function (renderer, color) {\r\n\t var config = {\r\n\t \"area\": {},\r\n\t \"line\": {},\r\n\t \"item\": {}\r\n\t },\r\n\t map = renderer.styleMap;\r\n\r\n\t if (color) {\r\n\t config.area[map.color] = renderer.setOpacity(color, 0.2);\r\n\t config.line[map.lineColor] = color;\r\n\t config.item[map.color] = color;\r\n\r\n\t for (var name in config) {\r\n\t config[name] = createCss(config[name]);\r\n\t }\r\n\t }\r\n\r\n\t return config;\r\n\t};\r\n\r\n\tSplineArea.prototype.getPoints = function (data, width, height) {\r\n\t var points = Spline.prototype.getPoints.call(this, data, width, height);\r\n\t var x = this.config.paddingX || 0;\r\n\t var y = this.config.paddingY || 0;\r\n\t points.push({\r\n\t x: width - x,\r\n\t y: height - y\r\n\t }, {\r\n\t x: x,\r\n\t y: height - y\r\n\t }, {\r\n\t x: x,\r\n\t y: points[0][0].y\r\n\t });\r\n\t return points;\r\n\t};\r\n\r\n\tfunction Sparklines() {}\r\n\r\n\tfunction getData(data) {\r\n\t var values = [];\r\n\r\n\t for (var i = data.length - 1; i >= 0; i--) {\r\n\t var value = data[i];\r\n\t values[i] = _typeof(value) === \"object\" ? value.value : value;\r\n\t }\r\n\r\n\t return values;\r\n\t}\r\n\r\n\tSparklines.types = {};\r\n\r\n\tSparklines.getTemplate = function (customConfig) {\r\n\t var config = customConfig || {};\r\n\t if (typeof customConfig == \"string\") config = {\r\n\t type: customConfig\r\n\t };\r\n\t exports.extend(config, {\r\n\t type: \"line\"\r\n\t });\r\n\t var slConstructor = this.types[config.type];\r\n\t assert(slConstructor, \"Unknown sparkline type\");\r\n\t return bind(this._template, new slConstructor(config));\r\n\t};\r\n\r\n\tSparklines._template = function (item, common, data, column) {\r\n\t if (column) return this.draw(getData(data), column.width, 33);else return this.draw(item.data || item, common.width, common.height);\r\n\t}; // add \"sparklines\" type\r\n\r\n\r\n\tattachEvent(\"onDataTable\", function (table) {\r\n\t table.type.sparklines = Sparklines.getTemplate();\r\n\t});\r\n\tSparklines.types[\"area\"] = Area;\r\n\tSparklines.types[\"bar\"] = Bar;\r\n\tSparklines.types[\"line\"] = Line;\r\n\tSparklines.types[\"pie\"] = Pie;\r\n\tSparklines.types[\"spline\"] = Spline;\r\n\tSparklines.types[\"splineArea\"] = SplineArea;\r\n\r\n\tvar csv$1 = {\r\n\t escape: true,\r\n\t delimiter: {\r\n\t rows: \"\\n\",\r\n\t cols: \"\\t\"\r\n\t },\r\n\t parse: function parse(text, sep) {\r\n\t sep = sep || this.delimiter;\r\n\t if (!this.escape) return this._split_clip_data(text, sep);\r\n\t var lines = text.replace(/\\n$/, \"\").split(sep.rows);\r\n\t var i = 0;\r\n\r\n\t while (i < lines.length - 1) {\r\n\t if (this._substr_count(lines[i], \"\\\"\") % 2 === 1) {\r\n\t lines[i] += sep.rows + lines[i + 1];\r\n\t delete lines[i + 1];\r\n\t i++;\r\n\t }\r\n\r\n\t i++;\r\n\t }\r\n\r\n\t var csv = [];\r\n\r\n\t for (i = 0; i < lines.length; i++) {\r\n\t if (typeof lines[i] !== \"undefined\") {\r\n\t var tline = lines[i];\r\n\t var start = 0;\r\n\t var line = [];\r\n\t var quoted = false;\r\n\r\n\t for (var j = 0; j <= tline.length; j++) {\r\n\t if (!quoted && tline[j] === sep.cols || j === tline.length) {\r\n\t var chunk = tline.substr(start, j - start);\r\n\r\n\t if (chunk[0] === chunk[chunk.length - 1] && chunk[0] === \"\\\"\") {\r\n\t chunk = chunk.substr(1, chunk.length - 2).replace(\"\\\"\\\"\", \"\\\"\");\r\n\t }\r\n\r\n\t line.push(chunk);\r\n\t start = j + 1;\r\n\t }\r\n\r\n\t if (tline[j] === \"\\\"\") {\r\n\t quoted = !quoted;\r\n\t continue;\r\n\t }\r\n\t }\r\n\r\n\t csv.push(line);\r\n\t }\r\n\t }\r\n\r\n\t return csv;\r\n\t },\r\n\t _split_clip_data: function _split_clip_data(text, sep) {\r\n\t var lines = text.split(sep.rows);\r\n\r\n\t for (var i = 0; i < lines.length; i++) {\r\n\t lines[i] = lines[i].split(sep.cols);\r\n\t }\r\n\r\n\t return lines;\r\n\t },\r\n\r\n\t /*! counts how many occurances substring in string **/\r\n\t _substr_count: function _substr_count(string, substring) {\r\n\t var arr = string.split(substring);\r\n\t return arr.length - 1;\r\n\t },\r\n\t stringify: function stringify(data, sep) {\r\n\t sep = sep || this.delimiter;\r\n\r\n\t if (!this.escape) {\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t data[i] = data[i].join(sep.cols);\r\n\t }\r\n\r\n\t return data.join(sep.rows);\r\n\t }\r\n\r\n\t var reg = /\\n|\"|;|,/;\r\n\r\n\t for (var _i = 0; _i < data.length; _i++) {\r\n\t for (var j = 0; j < data[_i].length; j++) {\r\n\t var chunk = data[_i][j];\r\n\t if (chunk instanceof Date) data[_i][j] = i18n.parseFormatStr(chunk);else if (reg.test(chunk)) data[_i][j] = \"\\\"\" + chunk.toString().replace(/\"/g, \"\\\"\\\"\") + \"\\\"\";\r\n\t }\r\n\r\n\t data[_i] = data[_i].join(sep.cols);\r\n\t }\r\n\r\n\t data = data.join(sep.rows);\r\n\t return data;\r\n\t }\r\n\t};\r\n\r\n\tvar TablePaste = {\r\n\t clipboard_setter: function clipboard_setter(value) {\r\n\t if (value === true || value === 1) value = \"block\";\r\n\t clipbuffer.init();\r\n\t this.attachEvent(\"onSelectChange\", this._sel_to_clip); // solution for clicks on selected items\r\n\r\n\t this.attachEvent(\"onItemClick\", function () {\r\n\t if (document.activeElement && this.$view.contains(document.activeElement)) {\r\n\t clipbuffer.focus();\r\n\t UIManager.setFocus(this);\r\n\t }\r\n\t });\r\n\t this.attachEvent(\"onPaste\", this._clip_to_sel);\r\n\t return value;\r\n\t },\r\n\t templateCopy_setter: template,\r\n\t _sel_to_clip: function _sel_to_clip() {\r\n\t var data = this._get_sel_text();\r\n\r\n\t clipbuffer.set(data);\r\n\t UIManager.setFocus(this);\r\n\t },\r\n\t _get_sel_text: function _get_sel_text() {\r\n\t var data = [];\r\n\t var filter = this._settings.templateCopy;\r\n\t this.mapSelection(function (value, row, col, row_ind) {\r\n\t if (!data[row_ind]) data[row_ind] = [];\r\n\t var newvalue = filter ? filter(value, row, col) : value;\r\n\t data[row_ind].push(newvalue);\r\n\t return value;\r\n\t });\r\n\t var value = data.length === 1 && data[0].length === 1 ? data[0][0] : csv$1.stringify(data, this._settings.delimiter);\r\n\t return value;\r\n\t },\r\n\t _clip_to_sel: function _clip_to_sel(text) {\r\n\t if (!isUndefined(this._paste[this._settings.clipboard])) {\r\n\t var data = csv$1.parse(text, this._settings.delimiter);\r\n\r\n\t this._paste[this._settings.clipboard].call(this, data);\r\n\t }\r\n\t },\r\n\t _paste: {\r\n\t block: function block(data) {\r\n\t var leftTop = this.mapSelection(null);\r\n\t if (!leftTop) return; // filling cells with data\r\n\r\n\t this.mapCells(leftTop.row, leftTop.column, data.length, null, function (value, row, col, row_ind, col_ind) {\r\n\t if (data[row_ind] && data[row_ind].length > col_ind) {\r\n\t return data[row_ind][col_ind];\r\n\t }\r\n\r\n\t return value;\r\n\t });\r\n\t this.render();\r\n\t },\r\n\t selection: function selection(data) {\r\n\t this.mapSelection(function (value, row, col, row_ind, col_ind) {\r\n\t if (data[row_ind] && data[row_ind].length > col_ind) return data[row_ind][col_ind];\r\n\t return value;\r\n\t });\r\n\t this.render();\r\n\t },\r\n\t repeat: function repeat(data) {\r\n\t this.mapSelection(function (value, row, col, row_ind, col_ind) {\r\n\t row = data[row_ind % data.length];\r\n\t value = row[col_ind % row.length];\r\n\t return value;\r\n\t });\r\n\t this.render();\r\n\t },\r\n\t custom: function custom() {}\r\n\t }\r\n\t};\r\n\r\n\tvar TreeAPI = {\r\n\t open: function open(id, show) {\r\n\t if (!id) return; //ignore open for leaf items\r\n\r\n\t var item = this.getItem(id);\r\n\t if (!item.$count || item.open) return;\r\n\r\n\t if (this.callEvent(\"onBeforeOpen\", [id])) {\r\n\t item.open = true;\r\n\t this.data.callEvent(\"onStoreUpdated\", [id, 0, \"branch\"]);\r\n\t this.callEvent(\"onAfterOpen\", [id]);\r\n\t }\r\n\r\n\t if (show && id != \"0\") this.open(this.getParentId(id), show);\r\n\t },\r\n\t close: function close(id) {\r\n\t if (!id) return;\r\n\t var item = this.getItem(id);\r\n\t if (!item.open) return;\r\n\r\n\t if (this.callEvent(\"onBeforeClose\", [id])) {\r\n\t item.open = false;\r\n\t this.data.callEvent(\"onStoreUpdated\", [id, 0, \"branch\"]);\r\n\t this.callEvent(\"onAfterClose\", [id]);\r\n\t }\r\n\t },\r\n\t openAll: function openAll(id) {\r\n\t this.data.eachSubItem(id || 0, function (obj, branch) {\r\n\t if (branch) obj.open = true;\r\n\t });\r\n\t this.data.refresh();\r\n\t },\r\n\t closeAll: function closeAll(id) {\r\n\t this.data.eachSubItem(id || 0, function (obj, branch) {\r\n\t if (branch) obj.open = false;\r\n\t });\r\n\t this.data.refresh();\r\n\t },\r\n\t _tree_check_uncheck: function _tree_check_uncheck(id, mode, e) {\r\n\t if (this._settings.threeState) return this._tree_check_uncheck_3(id, mode !== null ? mode : \"\");\r\n\t var value,\r\n\t item = this.getItem(id),\r\n\t trg = e ? e.target || e.srcElement : null; //read actual value from HTML tag when possible\r\n\t //as it can be affected by dbl-clicks\r\n\r\n\t if (trg && trg.type == \"checkbox\") value = trg.checked ? true : false;else value = mode !== null ? mode : !item.checked;\r\n\t item.checked = value;\r\n\t this.callEvent(\"onItemCheck\", [id, item.checked, e]);\r\n\t },\r\n\t isBranchOpen: function isBranchOpen(search_id) {\r\n\t if (search_id == \"0\") return true;\r\n\t var item = this.getItem(search_id);\r\n\t if (item.open) return this.isBranchOpen(item.$parent);\r\n\t return false;\r\n\t },\r\n\t getOpenItems: function getOpenItems() {\r\n\t var open = [];\r\n\r\n\t for (var id in this.data.branch) {\r\n\t if (this.exists(id) && this.getItem(id).open) open.push(id);\r\n\t }\r\n\r\n\t return open;\r\n\t },\r\n\t getState: function getState() {\r\n\t return {\r\n\t open: this.getOpenItems(),\r\n\t select: this.getSelectedId(true)\r\n\t };\r\n\t },\r\n\t _repeat_set_state: function _repeat_set_state(tree, open) {\r\n\t var event = this.data.attachEvent(\"onStoreLoad\", function () {\r\n\t tree.setState.call(tree, open);\r\n\t tree.data.detachEvent(event);\r\n\t tree = null;\r\n\t });\r\n\t },\r\n\t setState: function setState(state) {\r\n\t if (state.open) {\r\n\t this.closeAll();\r\n\t var open = state.open;\r\n\r\n\t for (var i = 0; i < open.length; i++) {\r\n\t var item = this.getItem(open[i]);\r\n\r\n\t if (item && item.$count) {\r\n\t item.open = true; //dynamic loading\r\n\r\n\t if (item.$count == -1) {\r\n\t //call the same method after data loading\r\n\t this._repeat_set_state(this, state);\r\n\r\n\t this.refresh();\r\n\t return 0; //end processing\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t this.refresh();\r\n\t }\r\n\r\n\t if (state.select && this.select) {\r\n\t var select = state.select;\r\n\t this.unselect();\r\n\r\n\t for (var _i = 0; _i < select.length; _i++) {\r\n\t if (this.exists(select[_i])) this.select(select[_i], true);\r\n\t }\r\n\t }\r\n\r\n\t return 1;\r\n\t }\r\n\t};\r\n\r\n\tvar TreeClick = {\r\n\t webix_tree_open: function webix_tree_open(e, id) {\r\n\t this.close(id);\r\n\t return false;\r\n\t },\r\n\t webix_tree_close: function webix_tree_close(e, id) {\r\n\t this.open(id);\r\n\t return false;\r\n\t },\r\n\t webix_tree_checkbox: function webix_tree_checkbox(e, id) {\r\n\t this._tree_check_uncheck(id, null, e);\r\n\r\n\t return false;\r\n\t }\r\n\t};\r\n\r\n\tvar TreeDataLoader = {\r\n\t $init: function $init() {\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(this._sync_hierarchy, this), null, true); //redefine methods\r\n\r\n\t this._feed_common = this._feed_commonA;\r\n\t },\r\n\t _feed_commonA: function _feed_commonA(id, count, callback, url) {\r\n\t // branch loading\r\n\t var details = count === 0 ? {\r\n\t parent: encodeURIComponent(id)\r\n\t } : null;\r\n\r\n\t DataLoader.prototype._feed_common.call(this, id, count, callback, url, details);\r\n\t },\r\n\t //load next set of data rows\r\n\t loadBranch: function loadBranch(id, callback, url) {\r\n\t id = id || 0;\r\n\t this.data.url = url || this.data.url;\r\n\t if (this.callEvent(\"onDataRequest\", [id, callback, this.data.url]) && this.data.url) this.data.feed.call(this, id, 0, callback, url);\r\n\t },\r\n\t _sync_hierarchy: function _sync_hierarchy(id, data, mode) {\r\n\t if (!mode || mode == \"add\" || mode == \"delete\" || mode == \"branch\") {\r\n\t this.data._sync_to_order(this);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t\tBehavior:DataMove - allows to move and copy elements, heavily relays on DataStore.move\r\n\t\t@export\r\n\t\t\tcopy\r\n\t\t\tmove\r\n\t*/\r\n\r\n\tvar TreeDataMove = {\r\n\t $init: function $init() {\r\n\t assert(this.data, \"DataMove :: Component doesn't have DataStore\");\r\n\t },\r\n\t //creates a copy of the item\r\n\t copy: function copy$$1(sid, tindex, tobj, details) {\r\n\t details = details || {};\r\n\t details.copy = true;\r\n\t return this.move(sid, tindex, tobj, details);\r\n\t },\r\n\t _next_move_index: function _next_move_index(nid, next, source) {\r\n\t if (next && nid) {\r\n\t var new_index = this.getBranchIndex(nid);\r\n\t return new_index + (source == this && source.getBranchIndex(next) < new_index ? 0 : 1);\r\n\t }\r\n\t },\r\n\t _check_branch_child: function _check_branch_child(parent, child) {\r\n\t var t = this.data.branch[parent];\r\n\r\n\t if (t && t.length) {\r\n\t for (var i = 0; i < t.length; i++) {\r\n\t if (t[i] == child) return true;\r\n\t if (this._check_branch_child(t[i], child)) return true;\r\n\t }\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t //move item to the new position\r\n\t move: function move(sid, tindex, tobj, details) {\r\n\t details = details || {};\r\n\t tindex = tindex || 0;\r\n\t var new_id = details.newId || sid;\r\n\t var target_parent = details.parent || 0;\r\n\t tobj = tobj || this;\r\n\t assert(tobj.data, \"moving attempt to component without datastore\");\r\n\t if (!tobj.data) return;\r\n\r\n\t if (isArray(sid)) {\r\n\t for (var i = 0; i < sid.length; i++) {\r\n\t //increase index for each next item in the set, so order of insertion will be equal to order in the array\r\n\t var nid = this.move(sid[i], tindex, tobj, details);\r\n\t tindex = tobj._next_move_index(nid, sid[i + 1], this);\r\n\t }\r\n\r\n\t return;\r\n\t }\r\n\r\n\t if (this != tobj || details.copy) {\r\n\t new_id = tobj.data.add(tobj._externalData(this.getItem(sid), new_id), tindex, target_parent || 0);\r\n\r\n\t if (this.data.branch[sid] && tobj.getBranchIndex) {\r\n\t var temp = this.data._scheme_serialize;\r\n\r\n\t this.data._scheme_serialize = function (obj) {\r\n\t var copy$$1 = copy(obj);\r\n\t delete copy$$1.$parent;\r\n\t delete copy$$1.$level;\r\n\t delete copy$$1.$child;\r\n\t if (tobj.data.pull[copy$$1.id]) copy$$1.id = uid();\r\n\t return copy$$1;\r\n\t };\r\n\r\n\t var copy_data = {\r\n\t data: this.serialize(sid, true),\r\n\t parent: new_id\r\n\t };\r\n\t this.data._scheme_serialize = temp;\r\n\t tobj.parse(copy_data);\r\n\t }\r\n\r\n\t if (!details.copy) this.data.remove(sid);\r\n\t } else {\r\n\t //move in self\r\n\t if (sid == target_parent || this._check_branch_child(sid, target_parent)) return;\r\n\t var source = this.getItem(sid);\r\n\t var tbranch = this.data.branch[target_parent];\r\n\t if (!tbranch) tbranch = this.data.branch[target_parent] = [];\r\n\t var sbranch = this.data.branch[source.$parent];\r\n\t var sindex = PowerArray.find.call(sbranch, sid);\r\n\t if (tindex < 0) tindex = tbranch.length; //in the same branch\r\n\r\n\t if (sbranch === tbranch && tindex === sindex) return; //same position\r\n\r\n\t PowerArray.removeAt.call(sbranch, sindex);\r\n\t PowerArray.insertAt.call(tbranch, sid, Math.min(tbranch.length, tindex));\r\n\t if (!sbranch.length) delete this.data.branch[source.$parent];\r\n\t if (source.$parent && source.$parent != \"0\") this.getItem(source.$parent).$count--;\r\n\r\n\t if (target_parent && target_parent != \"0\") {\r\n\t var target = tobj.getItem(target_parent);\r\n\t target.$count++;\r\n\r\n\t this._set_level_rec(source, target.$level + 1);\r\n\t } else this._set_level_rec(source, 1);\r\n\r\n\t source.$parent = target_parent;\r\n\t tobj.data.callEvent(\"onDataMove\", [sid, tindex, target_parent, tbranch[tindex + 1]]);\r\n\t }\r\n\r\n\t this.refresh();\r\n\t return new_id; //return ID of item after moving\r\n\t },\r\n\t _set_level_rec: function _set_level_rec(item, value) {\r\n\t item.$level = value;\r\n\t var branch = this.data.branch[item.id];\r\n\t if (branch) for (var i = 0; i < branch.length; i++) {\r\n\t this._set_level_rec(this.getItem(branch[i]), value + 1);\r\n\t }\r\n\t },\r\n\t //reaction on pause during dnd\r\n\t _drag_pause: function _drag_pause(id) {\r\n\t if (id && !id.header) //ignore drag other header\r\n\t this.open(id);\r\n\t },\r\n\t $dropAllow: function $dropAllow(context) {\r\n\t if (context.from != context.to) return true;\r\n\r\n\t for (var i = 0; i < context.source.length; i++) {\r\n\t if (context.source == context.target || this._check_branch_child(context.source, context.target)) return false;\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\r\n\t /*\r\n\t \tthis is a stub for future functionality\r\n\t \tcurrently it just makes a copy of data object, which is enough for current situation\r\n\t */\r\n\t _externalData: function _externalData(data, id) {\r\n\t var new_data = DataMove._externalData.call(this, data, id);\r\n\r\n\t delete new_data.open;\r\n\t return new_data;\r\n\t }\r\n\t};\r\n\r\n\tvar TreeRenderStack = {\r\n\t $init: function $init() {\r\n\t assert(this.render, \"TreeRenderStack :: Object must use RenderStack first\");\r\n\t },\r\n\t _toHTMLItem: function _toHTMLItem(obj) {\r\n\t var mark = this.data._marks[obj.id];\r\n\t this.callEvent(\"onItemRender\", [obj]);\r\n\t return this.type.templateStart(obj, this.type, mark) + (obj.$template ? this.type[\"template\" + obj.$template](obj, this.type, mark) : this.type.template(obj, this.type, mark)) + this.type.templateEnd();\r\n\t },\r\n\t _toHTMLItemObject: function _toHTMLItemObject(obj) {\r\n\t this._html.innerHTML = this._toHTMLItem(obj);\r\n\t return this._html.firstChild;\r\n\t },\r\n\t //convert single item to HTML text (templating)\r\n\t _toHTML: function _toHTML(obj) {\r\n\t //check if related template exist\r\n\t assert(!obj.$template || this.type[\"template\" + obj.$template], \"RenderStack :: Unknown template: \" + obj.$template);\r\n\r\n\t var html = \"\";\r\n\t return html;\r\n\t },\r\n\t _toHTMLLevel: function _toHTMLLevel(id) {\r\n\t var html = \"\";\r\n\t var leaves = this.data.branch[id];\r\n\r\n\t if (leaves) {\r\n\t html += \"\";\r\n\t }\r\n\r\n\t return html;\r\n\t },\r\n\t //return true when some actual rendering done\r\n\t render: function render(id, data, type) {\r\n\t TreeRenderStack._obj = this; //can be used from complex render\r\n\r\n\t if (!this.isVisible(this._settings.id) || this.$blockRender) return;\r\n\r\n\t if (id) {\r\n\t var cont, node;\r\n\t var item = this.getItem(id);\r\n\r\n\t if (type != \"add\") {\r\n\t cont = this.getItemNode(id);\r\n\t if (!cont) return;\r\n\t }\r\n\r\n\t switch (type) {\r\n\t case \"branch\":\r\n\t var branch = cont.parentNode;\r\n\t node = this._toHTMLObject(item);\r\n\t insertBefore(node, branch);\r\n\t remove(branch);\r\n\t this._htmlmap = null;\r\n\t break;\r\n\r\n\t case \"paint\":\r\n\t case \"update\":\r\n\t node = this._htmlmap[id] = this._toHTMLItemObject(item);\r\n\t insertBefore(node, cont);\r\n\t remove(cont);\r\n\t break;\r\n\r\n\t case \"delete\":\r\n\t //deleting not item , but full branch\r\n\t remove(cont.parentNode);\r\n\t break;\r\n\r\n\t case \"add\":\r\n\t var parent; //we want process both empty value and 0 as string\r\n\t //jshint -W041:true\r\n\r\n\t if (item.$parent == 0) {\r\n\t parent = this._dataobj.firstChild;\r\n\t } else if (this.getItem(item.$parent).open) {\r\n\t parent = this.getItemNode(item.$parent);\r\n\r\n\t if (parent) {\r\n\t //when item created by the script, it will miss the container for child notes\r\n\t //create it on demand\r\n\t if (!parent.nextSibling) {\r\n\t var leafs = create(\"DIV\", {\r\n\t \"class\": \"webix_tree_leaves\"\r\n\t }, \"\");\r\n\t parent.parentNode.appendChild(leafs);\r\n\t }\r\n\r\n\t parent = parent.nextSibling;\r\n\t }\r\n\t }\r\n\r\n\t if (parent) {\r\n\t var next = this.data.getNextSiblingId(id);\r\n\t next = this.getItemNode(next);\r\n\t if (next) next = next.parentNode;\r\n\t node = this._toHTMLObject(item);\r\n\t this._htmlmap[id] = node.firstChild;\r\n\t insertBefore(node, next, parent);\r\n\t }\r\n\r\n\t break;\r\n\r\n\t default:\r\n\t return false;\r\n\t }\r\n\r\n\t this.callEvent(\"onPartialRender\", [id, data, type]);\r\n\t } else {\r\n\t //full reset\r\n\t if (this.callEvent(\"onBeforeRender\", [this.data])) {\r\n\t //will be used for lines management\r\n\t this.type._tree_branch_render_state = []; //getTopRange - returns all elements on top level\r\n\r\n\t this._dataobj.innerHTML = this._toHTMLLevel(0);\r\n\t this._htmlmap = null; //clear map, it will be filled at first getItemNode\r\n\r\n\t this.callEvent(\"onAfterRender\", []);\r\n\t }\r\n\t } //clear after usage\r\n\r\n\r\n\t this.type._tree_branch_render_state = 0;\r\n\t TreeRenderStack._obj = null;\r\n\t return true;\r\n\t },\r\n\t getItemNode: function getItemNode(search_id) {\r\n\t if (this._htmlmap) return this._htmlmap[search_id]; //fill map if it doesn't created yet\r\n\r\n\t this._htmlmap = {};\r\n\r\n\t var t = this._dataobj.getElementsByTagName(\"DIV\");\r\n\r\n\t for (var i = 0; i < t.length; i++) {\r\n\t var id = t[i].getAttribute(this._id); //get item's\r\n\r\n\t if (id) this._htmlmap[id] = t[i];\r\n\t } //call locator again, when map is filled\r\n\r\n\r\n\t return this.getItemNode(search_id);\r\n\t },\r\n\t _branch_render_supported: 1\r\n\t};\r\n\r\n\tvar TreeStateCheckbox = {\r\n\t _init_render_tree_state: function _init_render_tree_state() {\r\n\t if (this._branch_render_supported) {\r\n\t var old_render = this.render;\r\n\r\n\t this.render = function (id, data) {\r\n\t var updated = old_render.apply(this, arguments);\r\n\t if (this._settings.threeState && updated && data != \"checkbox\") this._setThirdState.apply(this, arguments);\r\n\t };\r\n\r\n\t this._init_render_tree_state = function () {};\r\n\t }\r\n\t },\r\n\t threeState_setter: function threeState_setter(value) {\r\n\t if (value) this._init_render_tree_state();\r\n\t return value;\r\n\t },\r\n\t _setThirdState: function _setThirdState(id) {\r\n\t var i, leaves, parents, checkedParents, tree;\r\n\t parents = [];\r\n\t tree = this;\r\n\t /*if item was removed*/\r\n\r\n\t if (id && !tree.data.pull[id]) {\r\n\t id = 0;\r\n\t }\r\n\t /*sets checkbox states*/\r\n\r\n\t /*if branch or full reloading*/\r\n\r\n\r\n\t if (!id || tree.data.pull[id].$count) {\r\n\t leaves = this._getAllLeaves(id);\r\n\t leaves.sort(function (a, b) {\r\n\t return tree.data.pull[b].$level - tree.data.pull[a].$level;\r\n\t });\r\n\r\n\t for (i = 0; i < leaves.length; i++) {\r\n\t if (!i || tree.data.pull[leaves[i]].$parent != tree.data.pull[leaves[i - 1]].$parent) parents = parents.concat(tree._setParentThirdState(leaves[i]));\r\n\t }\r\n\t } else {\r\n\t /*an item is a leaf */\r\n\t parents = parents.concat(tree._setParentThirdState(id));\r\n\t }\r\n\r\n\t checkedParents = {};\r\n\r\n\t for (i = 0; i < parents.length; i++) {\r\n\t if (!checkedParents[parents[i]]) {\r\n\t checkedParents[parents[i]] = 1;\r\n\r\n\t this._setCheckboxIndeterminate(parents[i]);\r\n\t }\r\n\t }\r\n\r\n\t tree = null;\r\n\t },\r\n\t _setCheckboxIndeterminate: function _setCheckboxIndeterminate(id) {\r\n\t var chElem, elem;\r\n\t elem = this.getItemNode(id);\r\n\r\n\t if (elem) {\r\n\t this.render(id, \"checkbox\", \"update\");\r\n\t /*needed to get the new input obj and to set indeterminate state*/\r\n\r\n\t if (this.getItem(id).indeterminate) {\r\n\t elem = this.getItemNode(id);\r\n\t chElem = elem.getElementsByTagName(\"input\")[0];\r\n\t if (chElem) chElem.indeterminate = this.getItem(id).indeterminate;\r\n\t }\r\n\t }\r\n\t },\r\n\t _setParentThirdState: function _setParentThirdState(itemId) {\r\n\t //we need to use dynamic function creating\r\n\t //jshint -W083:true\r\n\t var checked, checkedCount, indeterminate, parentId, result, unsureCount, needrender;\r\n\t parentId = this.getParentId(itemId);\r\n\t result = [];\r\n\r\n\t while (parentId && parentId != \"0\") {\r\n\t unsureCount = 0;\r\n\t checkedCount = 0;\r\n\t this.data.eachChild(parentId, function (obj) {\r\n\t if (obj.indeterminate) {\r\n\t unsureCount++;\r\n\t } else if (obj.checked) {\r\n\t checkedCount++;\r\n\t }\r\n\t });\r\n\t checked = indeterminate = needrender = false;\r\n\t var item = this.getItem(parentId);\r\n\r\n\t if (checkedCount == item.$count) {\r\n\t checked = true;\r\n\t } else if (checkedCount > 0 || unsureCount > 0) {\r\n\t indeterminate = true;\r\n\t } //we need to reset indeterminate in any case :(\r\n\r\n\r\n\t if (indeterminate || indeterminate != item.indeterminate) needrender = true;\r\n\t item.indeterminate = indeterminate;\r\n\t if (checked || item.checked != checked) needrender = true;\r\n\t item.checked = checked;\r\n\r\n\t if (needrender) {\r\n\t result.push(parentId);\r\n\t parentId = this.getParentId(parentId);\r\n\t } else parentId = 0;\r\n\t }\r\n\r\n\t return result;\r\n\t },\r\n\r\n\t /*get all checked items in tree*/\r\n\t getChecked: function getChecked() {\r\n\t var result = [];\r\n\t var tree = this;\r\n\t this.data.eachSubItem(0, function (obj) {\r\n\t if (tree.isChecked(obj.id)) result.push(obj.id);\r\n\t });\r\n\t return result;\r\n\t },\r\n\t _tree_check_uncheck_3: function _tree_check_uncheck_3(id, mode) {\r\n\t var item = this.getItem(id);\r\n\r\n\t if (item) {\r\n\t if (mode === \"\") mode = !item.checked;\r\n\r\n\t if (item.checked != mode || item.indeterminate) {\r\n\t item.checked = mode;\r\n\r\n\t this._correctThreeState(id);\r\n\r\n\t var parents = this._setParentThirdState(id);\r\n\r\n\t if (this._branch_render_supported && parents.length < 5) {\r\n\t for (var i = 0; i < parents.length; i++) {\r\n\t this._setCheckboxIndeterminate(parents[i]);\r\n\t }\r\n\t } else this.refresh();\r\n\r\n\t this.callEvent(\"onItemCheck\", [id, mode]);\r\n\t }\r\n\t }\r\n\t },\r\n\r\n\t /*set checked state for item checkbox*/\r\n\t checkItem: function checkItem(id) {\r\n\t this._tree_check_uncheck(id, true);\r\n\r\n\t this.updateItem(id);\r\n\t },\r\n\r\n\t /*uncheckes an item checkbox*/\r\n\t uncheckItem: function uncheckItem(id) {\r\n\t this._tree_check_uncheck(id, false);\r\n\r\n\t this.updateItem(id);\r\n\t },\r\n\t _checkUncheckAll: function _checkUncheckAll(id, mode, all) {\r\n\t var method = mode ? \"checkItem\" : \"uncheckItem\";\r\n\t if (!id) id = 0;else this[method](id);\r\n\r\n\t if (this._settings.threeState) {\r\n\t if (!id) this.data.eachChild(0, function (item) {\r\n\t this[method](item.id);\r\n\t }, this, all);\r\n\t } else this.data.each(function (item) {\r\n\t this[method](item.id);\r\n\t }, this, all, id);\r\n\t },\r\n\r\n\t /*checkes checkboxes of all items in a branch/tree*/\r\n\t checkAll: function checkAll(id, all) {\r\n\t this._checkUncheckAll(id, true, all);\r\n\t },\r\n\r\n\t /*uncheckes checkboxes of all items in a branch/tree*/\r\n\t uncheckAll: function uncheckAll(id, all) {\r\n\t this._checkUncheckAll(id, false, all);\r\n\t },\r\n\t _correctThreeState: function _correctThreeState(id) {\r\n\t var state;\r\n\t var item = this.getItem(id);\r\n\t item.indeterminate = false;\r\n\t state = item.checked;\r\n\t this.data.eachSubItem(id, function (child) {\r\n\t child.indeterminate = false;\r\n\t child.checked = state;\r\n\t });\r\n\r\n\t if (this._branch_render_supported && this.isBranchOpen(item.$parent)) {\r\n\t //for tree-render only\r\n\t this.render(id, 0, \"branch\");\r\n\t }\r\n\t },\r\n\r\n\t /*returns checked state of item checkbox*/\r\n\t isChecked: function isChecked(id) {\r\n\t return this.getItem(id).checked;\r\n\t },\r\n\r\n\t /*gets all leaves in a certain branch (in the whole tree if id is not set)*/\r\n\t _getAllLeaves: function _getAllLeaves(parentId) {\r\n\t var result = [];\r\n\t this.data.eachSubItem(parentId, function (obj, branch) {\r\n\t if (!branch) result.push(obj.id);\r\n\t });\r\n\t return result;\r\n\t }\r\n\t};\r\n\r\n\t// #include core/bind.js\r\n\t// #include core/treemove.js\r\n\r\n\tvar TreeStore = {\r\n\t name: \"TreeStore\",\r\n\t $init: function $init() {\r\n\t this._filterMode = {\r\n\t //level:1,\r\n\t showSubItems: true\r\n\t };\r\n\t this.branch = {\r\n\t 0: []\r\n\t };\r\n\t this.attachEvent(\"onParse\", function (driver) {\r\n\t this._set_child_scheme(driver.child);\r\n\t });\r\n\t this.attachEvent(\"onClearAll\", bind(function () {\r\n\t this._filter_branch = null;\r\n\t }, this));\r\n\t },\r\n\t filterMode_setter: function filterMode_setter(mode) {\r\n\t return exports.extend(this._filterMode, mode, true);\r\n\t },\r\n\t _filter_reset: function _filter_reset(preserve) {\r\n\t //remove previous filtering , if any\r\n\t if (this._filter_branch && !preserve) {\r\n\t this.branch = this._filter_branch;\r\n\t this.order = toArray(copy(this.branch[0]));\r\n\r\n\t for (var key in this.branch) {\r\n\t if (key != \"0\") //exclude 0 - virtual root\r\n\t this.getItem(key).$count = this.branch[key].length;\r\n\t }\r\n\r\n\t delete this._filter_branch;\r\n\t }\r\n\t },\r\n\t _filter_core: function _filter_core(filter, value, preserve, filterMode) {\r\n\t //for tree we have few filtering options\r\n\t //- filter leafs only\r\n\t //- filter data on specific level\r\n\t //- filter data on all levels\r\n\t //- in all cases we can show or hide empty folder\r\n\t //- in all cases we can show or hide childs for matched item\r\n\t //set new order of items, store original\r\n\t if (!preserve || !this._filter_branch) {\r\n\t this._filter_branch = this.branch;\r\n\t this.branch = clone(this.branch);\r\n\t }\r\n\r\n\t this.branch[0] = this._filter_branch_rec(filter, value, this.branch[0], 1, filterMode || {});\r\n\t },\r\n\t _filter_branch_rec: function _filter_branch_rec(filter, value, branch, level, config) {\r\n\t //jshint -W041\r\n\t var neworder = [];\r\n\t var allow = config.level && config.level != level;\r\n\r\n\t for (var i = 0; i < branch.length; i++) {\r\n\t var id = branch[i];\r\n\t var item = this.getItem(id);\r\n\t var child_run = false;\r\n\t var sub = this.branch[id];\r\n\r\n\t if (allow) {\r\n\t child_run = true;\r\n\t } else if (filter(this.getItem(id), value)) {\r\n\t neworder.push(id); // open all parents of the found item\r\n\r\n\t if (config.openParents !== false) {\r\n\t var parentId = this.getParentId(id);\r\n\r\n\t while (parentId && parentId != \"0\") {\r\n\t this.getItem(parentId).open = 1;\r\n\t parentId = this.getParentId(parentId);\r\n\t }\r\n\t } //in case of of fixed level filtering - do not change child-items\r\n\r\n\r\n\t if (config.level || config.showSubItems) continue;\r\n\t } else {\r\n\t //filtering level, not match\r\n\t child_run = true;\r\n\t } //if \"filter by all levels\" - filter childs\r\n\r\n\r\n\t if (allow || !config.level) {\r\n\t if (sub) {\r\n\t var newsub = this.branch[id] = this._filter_branch_rec(filter, value, sub, level + 1, config);\r\n\r\n\t item.$count = newsub.length;\r\n\t if (child_run && newsub.length) neworder.push(id);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return neworder;\r\n\t },\r\n\t count: function count() {\r\n\t if (this.order.length) return this.order.length; //we must return some non-zero value, or logic of selection will think that we have not data at all\r\n\r\n\t var count = 0;\r\n\t this.eachOpen(function () {\r\n\t count++;\r\n\t });\r\n\t return count;\r\n\t },\r\n\t _change_branch_id: function _change_branch_id(branches, parent, old, newid) {\r\n\t if (branches[old]) {\r\n\t var branch = branches[newid] = branches[old];\r\n\r\n\t for (var i = 0; i < branch.length; i++) {\r\n\t this.getItem(branch[i]).$parent = newid;\r\n\t }\r\n\r\n\t delete branches[old];\r\n\t }\r\n\r\n\t if (branches[parent]) {\r\n\t var index = PowerArray.find.call(branches[parent], old);\r\n\t if (index >= 0) branches[parent][index] = newid;\r\n\t }\r\n\t },\r\n\t changeId: function changeId(old, newid) {\r\n\t if (old == newid) return;\r\n\t var parent = this.getItem(old).$parent;\r\n\r\n\t this._change_branch_id(this.branch, parent, old, newid); //in case of filter applied, update id in filtered state as well\r\n\r\n\r\n\t if (this._filter_branch) this._change_branch_id(this._filter_branch, parent, old, newid);\r\n\t return DataStore.prototype.changeId.call(this, old, newid);\r\n\t },\r\n\t clearAll: function clearAll(soft) {\r\n\t this.branch = {\r\n\t 0: []\r\n\t };\r\n\t DataStore.prototype.clearAll.call(this, soft);\r\n\t },\r\n\t getPrevSiblingId: function getPrevSiblingId(id) {\r\n\t var order = this.branch[this.getItem(id).$parent];\r\n\t var pos = PowerArray.find.call(order, id) - 1;\r\n\t if (pos >= 0) return order[pos];\r\n\t return null;\r\n\t },\r\n\t getNextSiblingId: function getNextSiblingId(id) {\r\n\t var order = this.branch[this.getItem(id).$parent];\r\n\t var pos = PowerArray.find.call(order, id) + 1;\r\n\t if (pos < order.length) return order[pos];\r\n\t return null;\r\n\t },\r\n\t getParentId: function getParentId(id) {\r\n\t return this.getItem(id).$parent;\r\n\t },\r\n\t getFirstChildId: function getFirstChildId(id) {\r\n\t var order = this.branch[id];\r\n\t if (order && order.length) return order[0];\r\n\t return null;\r\n\t },\r\n\t isBranch: function isBranch(parent) {\r\n\t return !!this.branch[parent];\r\n\t },\r\n\t getBranchIndex: function getBranchIndex(child) {\r\n\t var t = this.branch[this.pull[child].$parent];\r\n\t return PowerArray.find.call(t, child);\r\n\t },\r\n\t _set_child_scheme: function _set_child_scheme(parse_name) {\r\n\t if (typeof parse_name == \"string\") this._datadriver_child = function (obj) {\r\n\t var t = obj[parse_name];\r\n\t if (t) delete obj[parse_name];\r\n\t return t;\r\n\t };else this._datadriver_child = parse_name;\r\n\t },\r\n\t _inner_parse: function _inner_parse(info, recs) {\r\n\t var parent = info.parent || 0;\r\n\r\n\t for (var i = 0; i < recs.length; i++) {\r\n\t //get hash of details for each record\r\n\t var temp = this.driver.getDetails(recs[i]);\r\n\t var id = this.id(temp); //generate ID for the record\r\n\r\n\t var update = !!this.pull[id]; //update mode\r\n\r\n\t if (update) {\r\n\t temp = exports.extend(this.pull[id], temp, true);\r\n\t if (this._scheme_update) this._scheme_update(temp);\r\n\t } else {\r\n\t if (this._scheme_init) this._scheme_init(temp);\r\n\t this.pull[id] = temp;\r\n\t }\r\n\r\n\t this._extraParser(temp, parent, 0, update, info.from ? info.from * 1 + i : 0);\r\n\t } //fix state of top item after data loading\r\n\r\n\r\n\t var pItem = this.pull[parent] || {};\r\n\t var pBranch = this.branch[parent] || [];\r\n\t pItem.$count = pBranch.length;\r\n\t delete pItem.webix_kids;\r\n\t if (info.size && info.size != pBranch.length) pBranch[info.size - 1] = undefined;\r\n\t },\r\n\t _extraParser: function _extraParser(obj, parent, level, update, from) {\r\n\t //processing top item\r\n\t obj.$count = 0; //using soft check, as parent can be a both 0 and \"0\" ( second one in case of loading from server side ) \r\n\r\n\t obj.$parent = parent != \"0\" ? parent : 0;\r\n\t obj.$level = level || (parent != \"0\" ? this.pull[parent].$level + 1 : 1);\r\n\t var parent_branch = this.branch[obj.$parent];\r\n\t if (!parent_branch) parent_branch = this.branch[obj.$parent] = [];\r\n\t if (this._filter_branch) this._filter_branch[obj.$parent] = parent_branch;\r\n\r\n\t if (!update) {\r\n\t var pos = from || parent_branch.length;\r\n\t parent_branch[pos] = obj.id;\r\n\t }\r\n\r\n\t var child = this._datadriver_child(obj);\r\n\r\n\t if (obj.webix_kids) {\r\n\t return obj.$count = -1;\r\n\t }\r\n\r\n\t if (!child) //ignore childless\r\n\t return obj.$count = 0; //when loading from xml we can have a single item instead of an array\r\n\r\n\t if (!isArray(child)) child = [child];\r\n\r\n\t for (var i = 0; i < child.length; i++) {\r\n\t //extra processing to convert strings to objects\r\n\t var item = DataDriver.json.getDetails(child[i]);\r\n\t var itemid = this.id(item);\r\n\t update = !!this.pull[itemid];\r\n\r\n\t if (update) {\r\n\t item = exports.extend(this.pull[itemid], item, true);\r\n\t if (this._scheme_update) this._scheme_update(item);\r\n\t } else {\r\n\t if (this._scheme_init) this._scheme_init(item);\r\n\t this.pull[itemid] = item;\r\n\t }\r\n\r\n\t this._extraParser(item, obj.id, obj.$level + 1, update);\r\n\t } //processing childrens\r\n\r\n\r\n\t var branch = this.branch[obj.id];\r\n\t if (branch) obj.$count = branch.length;\r\n\t },\r\n\t _sync_to_order: function _sync_to_order(master) {\r\n\t this.order = toArray();\r\n\r\n\t this._sync_each_child(0, master);\r\n\t },\r\n\t _sync_each_child: function _sync_each_child(start, master) {\r\n\t var branch = this.branch[start];\r\n\r\n\t for (var i = 0; i < branch.length; i++) {\r\n\t var id = branch[i];\r\n\t this.order.push(id);\r\n\t var item = this.pull[id];\r\n\r\n\t if (item) {\r\n\t if (item.open) {\r\n\t if (item.$count == -1) master.loadBranch(id);else if (item.$count) this._sync_each_child(id, master);\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t provideApi: function provideApi(target, eventable) {\r\n\t var list = [\"getPrevSiblingId\", \"getNextSiblingId\", \"getParentId\", \"getFirstChildId\", \"isBranch\", \"getBranchIndex\", \"filterMode_setter\"];\r\n\r\n\t for (var i = 0; i < list.length; i++) {\r\n\t target[list[i]] = this._methodPush(this, list[i]);\r\n\t }\r\n\r\n\t if (!target.getIndexById) DataStore.prototype.provideApi.call(this, target, eventable);\r\n\t },\r\n\t getTopRange: function getTopRange() {\r\n\t return toArray([].concat(this.branch[0])).map(function (id) {\r\n\t return this.getItem(id);\r\n\t }, this);\r\n\t },\r\n\t eachChild: function eachChild(id, functor, master, all) {\r\n\t var branch = this.branch;\r\n\t if (all && this._filter_branch) branch = this._filter_branch;\r\n\t var stack = branch[id];\r\n\t if (stack) for (var i = 0; i < stack.length; i++) {\r\n\t if (stack[i]) functor.call(master || this, this.getItem(stack[i]));\r\n\t }\r\n\t },\r\n\t each: function each(method, master, all, id) {\r\n\t this.eachChild(id || 0, function (item) {\r\n\t var branch = this.branch;\r\n\t method.call(master || this, item);\r\n\t if (all && this._filter_branch) branch = this._filter_branch;\r\n\t if (item && branch[item.id]) this.each(method, master, all, item.id);\r\n\t }, this, all);\r\n\t },\r\n\t eachOpen: function eachOpen(method, master, id) {\r\n\t this.eachChild(id || 0, function (item) {\r\n\t method.call(master || this, item);\r\n\t if (this.branch[item.id] && item.open) this.eachOpen(method, master, item.id);\r\n\t });\r\n\t },\r\n\t eachSubItem: function eachSubItem(id, functor) {\r\n\t var top = this.branch[id || 0];\r\n\t if (top) for (var i = 0; i < top.length; i++) {\r\n\t var key = top[i];\r\n\r\n\t if (this.branch[key]) {\r\n\t functor.call(this, this.getItem(key), true);\r\n\t this.eachSubItem(key, functor);\r\n\t } else functor.call(this, this.getItem(key), false);\r\n\t }\r\n\t },\r\n\t eachLeaf: function eachLeaf(id, functor) {\r\n\t var top = this.branch[id || 0];\r\n\t if (top) for (var i = 0; i < top.length; i++) {\r\n\t var key = top[i];\r\n\r\n\t if (this.branch[key]) {\r\n\t this.eachLeaf(key, functor);\r\n\t } else functor.call(this, this.getItem(key), false);\r\n\t }\r\n\t },\r\n\t _sort_core: function _sort_core(sort, order) {\r\n\t var sorter = this.sorting.create(sort);\r\n\r\n\t for (var key in this.branch) {\r\n\t var bset = this.branch[key];\r\n\t var data = [];\r\n\r\n\t for (var i = 0; i < bset.length; i++) {\r\n\t data.push(this.pull[bset[i]]);\r\n\t }\r\n\r\n\t data.sort(sorter);\r\n\r\n\t for (var _i = 0; _i < bset.length; _i++) {\r\n\t data[_i] = data[_i].id;\r\n\t }\r\n\r\n\t this.branch[key] = data;\r\n\t }\r\n\r\n\t return order;\r\n\t },\r\n\t add: function add(obj, index, pid) {\r\n\t var refresh_parent = false;\r\n\t var parent = this.getItem(pid || 0);\r\n\r\n\t if (parent) {\r\n\t //when adding items to leaf item - it need to be repainted\r\n\t if (!this.branch[parent.id]) refresh_parent = true;\r\n\t parent.$count++; //fix for the adding into dynamic loading branch\r\n\t //dynamic branch has $count as -1\r\n\r\n\t if (!parent.$count) parent.$count = 1;\r\n\t }\r\n\r\n\t this.branch[pid || 0] = this.order = toArray(this.branch[pid || 0]);\r\n\t obj.$count = obj.webix_kids ? -1 : 0;\r\n\t obj.$level = parent ? parent.$level + 1 : 1;\r\n\t obj.$parent = parent ? parent.id : 0;\r\n\r\n\t if (this._filter_branch) {\r\n\t //adding during filtering\r\n\t var origin = this._filter_branch[pid || 0]; //newly created branch\r\n\r\n\t if (!origin) origin = this._filter_branch[pid] = this.order; //branch can be shared bettwen collections, ignore such cases\r\n\r\n\t if (this.order !== origin) {\r\n\t //we can't know the location of new item in full dataset, making suggestion\r\n\t //put at end by default\r\n\t var original_index = origin.length; //put at start only if adding to the start and some data exists\r\n\r\n\t if (!index && this.branch[pid || 0].length) original_index = 0;\r\n\t origin = toArray(origin);\r\n\t obj.id = obj.id || uid();\r\n\t origin.insertAt(obj.id, original_index);\r\n\t }\r\n\t } //call original adding logic\r\n\r\n\r\n\t var result = DataStore.prototype.add.call(this, obj, index);\r\n\t if (refresh_parent) this.refresh(pid);\r\n\t return result;\r\n\t },\r\n\t _rec_remove: function _rec_remove(id) {\r\n\t var obj = this.pull[id];\r\n\r\n\t if (this.branch[obj.id] && this.branch[obj.id].length > 0) {\r\n\t var branch = this.branch[id];\r\n\r\n\t for (var i = 0; i < branch.length; i++) {\r\n\t this._rec_remove(branch[i], true);\r\n\t }\r\n\t }\r\n\r\n\t delete this.branch[id];\r\n\t if (this._filter_branch) delete this._filter_branch[id];\r\n\t delete this.pull[id];\r\n\t if (this._marks[id]) delete this._marks[id];\r\n\t },\r\n\t _filter_removed: function _filter_removed(pull, parentId, id) {\r\n\t var branch = pull[parentId];\r\n\r\n\t if (branch.length == 1 && branch[0] == id && parentId) {\r\n\t delete pull[parentId];\r\n\t } else toArray(branch).remove(id);\r\n\t },\r\n\t remove: function remove(id) {\r\n\t //id can be an array of IDs - result of getSelect, for example\r\n\t if (isArray(id)) {\r\n\t for (var i = 0; i < id.length; i++) {\r\n\t this.remove(id[i]);\r\n\t }\r\n\r\n\t return;\r\n\t }\r\n\r\n\t assert(this.exists(id), \"Not existing ID in remove command\" + id);\r\n\t var obj = this.pull[id];\r\n\t var parentId = obj.$parent || 0;\r\n\t if (this.callEvent(\"onBeforeDelete\", [id]) === false) return false;\r\n\r\n\t this._rec_remove(id);\r\n\r\n\t this.callEvent(\"onAfterDelete\", [id]);\r\n\t var parent = this.pull[parentId];\r\n\r\n\t this._filter_removed(this.branch, parentId, id);\r\n\r\n\t if (this._filter_branch) this._filter_removed(this._filter_branch, parentId, id);\r\n\t var refresh_parent = 0;\r\n\r\n\t if (parent) {\r\n\t parent.$count--;\r\n\r\n\t if (parent.$count <= 0) {\r\n\t parent.$count = 0;\r\n\t parent.open = 0;\r\n\t refresh_parent = 1;\r\n\t }\r\n\t } //repaint signal\r\n\r\n\r\n\t this.callEvent(\"onStoreUpdated\", [id, obj, \"delete\"]);\r\n\t if (refresh_parent) this.refresh(parent.id);\r\n\t },\r\n\r\n\t /*\r\n\t \tserializes data to a json object\r\n\t */\r\n\t getBranch: function getBranch(id) {\r\n\t var out = [];\r\n\t var items = (this._filter_branch || this.branch)[id];\r\n\t if (items) for (var i = 0; i < items.length; i++) {\r\n\t out[i] = this.pull[items[i]];\r\n\t }\r\n\t return out;\r\n\t },\r\n\t serialize: function serialize(id, all) {\r\n\t var coll = this.branch; //use original collection of branches\r\n\r\n\t if (all && this._filter_branch) coll = this._filter_branch;\r\n\t var ids = coll[id || 0];\r\n\t var result = [];\r\n\r\n\t for (var i = 0; i < ids.length; i++) {\r\n\t var obj = this.pull[ids[i]];\r\n\t var rel;\r\n\r\n\t if (this._scheme_serialize) {\r\n\t rel = this._scheme_serialize(obj);\r\n\t if (rel === false) continue;\r\n\t } else rel = copy(obj);\r\n\r\n\t if (coll[obj.id]) rel.data = this.serialize(obj.id, all);\r\n\t result.push(rel);\r\n\t }\r\n\r\n\t return result;\r\n\t }\r\n\t};\r\n\r\n\tvar TreeTablePaste = {\r\n\t insert: function insert(data) {\r\n\t var parent = this.getSelectedId(true, true);\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t var item = {};\r\n\r\n\t for (var j = 0; j < this._settings.columns.length; j++) {\r\n\t item[this._settings.columns[j].id] = data[i][j] || \"\";\r\n\t }\r\n\r\n\t if (!isUndefined(item.id) && this.exists(item.id)) item.id = uid();\r\n\t this.add(item, null, parent[0]);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar TreeType = {\r\n\t space: function space(obj) {\r\n\t var html = \"\";\r\n\r\n\t for (var i = 1; i < obj.$level; i++) {\r\n\t html += \"
\";\r\n\t }\r\n\r\n\t return html;\r\n\t },\r\n\t icon: function icon(obj) {\r\n\t if (obj.$count) {\r\n\t if (obj.open) return \"
\";else return \"
\";\r\n\t } else return \"
\";\r\n\t },\r\n\t checkbox: function checkbox(obj) {\r\n\t if (obj.nocheckbox) return \"\";\r\n\t return \"\";\r\n\t },\r\n\t folder: function folder(obj) {\r\n\t if (obj.icon) return \"
\";\r\n\r\n\t if (obj.$count) {\r\n\t if (obj.open) return \"
\";else return \"
\";\r\n\t }\r\n\r\n\t return \"
\";\r\n\t }\r\n\t};\r\n\r\n\tvar UploadDriver = {\r\n\t flash: {\r\n\t $render: function $render() {\r\n\t if (!window.swfobject) require(\"legacy/swfobject.js\", true); // sync loading\r\n\r\n\t var config = this._settings;\r\n\t config.swfId = config.swfId || \"webix_swf_\" + uid();\r\n\t this._getBox().innerHTML += \"
\";\r\n\t this._upload_area = this._getBox().lastChild; // add swf object\r\n\r\n\t /* global swfobject */\r\n\r\n\t swfobject.embedSWF(env.codebase + \"/legacy/uploader.swf\", config.swfId, \"100%\", \"100%\", \"9\", null, {\r\n\t uploaderId: config.id,\r\n\t ID: config.swfId,\r\n\t enableLogs: config.enableLogs ? \"1\" : \"\",\r\n\t paramName: config.inputName,\r\n\t multiple: config.multiple ? \"Y\" : \"\"\r\n\t }, {\r\n\t wmode: \"transparent\"\r\n\t });\r\n\r\n\t _event(this._viewobj, \"click\", bind(function () {\r\n\t var now_date = new Date();\r\n\r\n\t if (now_date - (this._upload_timer_click || 0) > 250) {\r\n\t this.fileDialog();\r\n\t }\r\n\t }, this));\r\n\r\n\t this.files.attachEvent(\"onBeforeDelete\", bind(this._stop_file, this));\r\n\t },\r\n\t $applyFlash: function $applyFlash(name, params) {\r\n\t return this[name].apply(this, params);\r\n\t },\r\n\t getSwfObject: function getSwfObject() {\r\n\t /* global swfobject */\r\n\t return swfobject.getObjectById(this._settings.swfId);\r\n\t },\r\n\t fileDialog: function fileDialog() {\r\n\t if (this.getSwfObject()) this.getSwfObject().showDialog();\r\n\t },\r\n\t send: function send(id) {\r\n\t if (typeof id == \"function\") {\r\n\t this._last_assigned_upload_callback = id;\r\n\t id = 0;\r\n\t }\r\n\r\n\t if (!id) {\r\n\t var order = this.files.data.order;\r\n\t var complete = true;\r\n\t if (order.length) for (var i = 0; i < order.length; i++) {\r\n\t complete = this.send(order[i]) && complete;\r\n\t }\r\n\t if (complete) this._upload_complete();\r\n\t return;\r\n\t }\r\n\r\n\t var item = this.files.getItem(id);\r\n\t if (item.status !== \"client\") return false;\r\n\t item.status = \"transfer\";\r\n\r\n\t if (this.getSwfObject()) {\r\n\t var url = this._get_active_url(item);\r\n\r\n\t var globalData = this._settings.formData || {};\r\n\t if (typeof globalData === \"function\") globalData = globalData.call(this);\r\n\t var details = exports.extend(item.formData || {}, globalData);\r\n\t this.getSwfObject().upload(id, url, details);\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t $beforeAddFileToQueue: function $beforeAddFileToQueue(id, name, size) {\r\n\t var type = name.split(\".\").pop();\r\n\r\n\t var format = this._format_size(size);\r\n\r\n\t return this.callEvent(\"onBeforeFileAdd\", [{\r\n\t id: id,\r\n\t name: name,\r\n\t size: size,\r\n\t sizetext: format,\r\n\t type: type\r\n\t }]);\r\n\t },\r\n\t $addFileToQueue: function $addFileToQueue(id, name, size) {\r\n\t if (this.files.exists(id)) return false;\r\n\t if (!this._settings.multiple) this.files.clearAll();\r\n\t var type = name.split(\".\").pop();\r\n\r\n\t var format = this._format_size(size);\r\n\r\n\t var file_struct = {\r\n\t name: name,\r\n\t id: id,\r\n\t size: size,\r\n\t sizetext: format,\r\n\t type: type,\r\n\t status: \"client\"\r\n\t };\r\n\t this.files.add(file_struct);\r\n\t this.callEvent(\"onAfterFileAdd\", [file_struct]);\r\n\t if (id && this._settings.autosend) this.send(id);\r\n\t },\r\n\t stopUpload: function stopUpload(id) {\r\n\t this._stop_file(id);\r\n\t },\r\n\t _stop_file: function _stop_file(id) {\r\n\t var item = this.files.getItem(id);\r\n\r\n\t if (item.status == \"transfer\") {\r\n\t this.getSwfObject().uploadStop(id);\r\n\t item.status = \"client\";\r\n\t }\r\n\t },\r\n\t _drop: function _drop() {},\r\n\t //drop of files is not supported in IE9-\r\n\t $onUploadComplete: function $onUploadComplete() {\r\n\t if (this._settings.autosend) {\r\n\t this._upload_complete();\r\n\t }\r\n\t },\r\n\t $onUploadSuccess: function $onUploadSuccess(id, name, response) {\r\n\t var item = this.files.getItem(id);\r\n\r\n\t if (item) {\r\n\t item.status = \"server\";\r\n\t item.progress = 100;\r\n\r\n\t if (response.text && typeof response.text == \"string\") {\r\n\t DataDriver.json.toObject(response.text);\r\n\t exports.extend(item, response, true);\r\n\t }\r\n\r\n\t this.callEvent(\"onFileUpload\", [item, response]);\r\n\t this.callEvent(\"onChange\", []);\r\n\t this.files.updateItem(id);\r\n\t }\r\n\t },\r\n\t $onUploadFail: function $onUploadFail(id) {\r\n\t var item = this.files.getItem(id);\r\n\t item.status = \"error\";\r\n\t delete item.percent;\r\n\t this.files.updateItem(id);\r\n\t this.callEvent(\"onFileUploadError\", [item, \"\"]);\r\n\t }\r\n\t },\r\n\t html5: {\r\n\t $render: function $render() {\r\n\t if (this._upload_area) {\r\n\t //firstChild is webix_el_box container, which have relative position\r\n\t //as result, file control is placed under the button and not in the top corner\r\n\t this._contentobj.firstChild.appendChild(this._upload_area);\r\n\r\n\t return;\r\n\t }\r\n\r\n\t this.files.attachEvent(\"onBeforeDelete\", this._stop_file);\r\n\t var input_config = {\r\n\t \"type\": \"file\",\r\n\t \"class\": \"webix_hidden_upload\",\r\n\t tabindex: -1\r\n\t };\r\n\t if (this._settings.accept) input_config.accept = this._settings.accept;\r\n\t if (this._settings.multiple) input_config.multiple = \"true\";\r\n\r\n\t if (this._settings.directory) {\r\n\t input_config.webkitdirectory = \"true\";\r\n\t input_config.mozdirectory = \"true\";\r\n\t input_config.directory = \"true\";\r\n\t }\r\n\r\n\t var f = create(\"input\", input_config);\r\n\t this._upload_area = this._contentobj.firstChild.appendChild(f);\r\n\r\n\t _event(this._viewobj, \"drop\", bind(function (e) {\r\n\t this._drop(e);\r\n\r\n\t preventEvent(e);\r\n\t }, this));\r\n\r\n\t _event(f, \"change\", bind(function () {\r\n\t this._add_files(f.files);\r\n\r\n\t if (env.isIE) {\r\n\t var t = document.createElement(\"form\");\r\n\t t.appendChild(this._upload_area);\r\n\t t.reset();\r\n\r\n\t this._contentobj.firstChild.appendChild(f);\r\n\t } else f.value = \"\";\r\n\t }, this));\r\n\r\n\t _event(this._viewobj, \"click\", bind(function () {\r\n\t var now_date = new Date();\r\n\r\n\t if (now_date - (this._upload_timer_click || 0) > 250) {\r\n\t this.fileDialog();\r\n\t }\r\n\t }, this));\r\n\r\n\t _event(this._viewobj, \"dragenter\", preventEvent);\r\n\r\n\t _event(this._viewobj, \"dragexit\", preventEvent);\r\n\r\n\t _event(this._viewobj, \"dragover\", preventEvent);\r\n\t },\r\n\t _directoryEntry: function _directoryEntry(value) {\r\n\t return value.isDirectory;\r\n\t },\r\n\t _directoryDrop: function _directoryDrop(item, state, path) {\r\n\t if (item.isFile) {\r\n\t item.file(function (file) {\r\n\t state.addFile(file, null, null, {\r\n\t name: path + \"/\" + file.name\r\n\t });\r\n\t });\r\n\t } else if (item.isDirectory) {\r\n\t // Get folder contents\r\n\t var dirReader = item.createReader();\r\n\t dirReader.readEntries(function (entries) {\r\n\t for (var i = 0; i < entries.length; i++) {\r\n\t state._directoryDrop(entries[i], state, (path ? path + \"/\" : \"\") + item.name);\r\n\t }\r\n\t });\r\n\t }\r\n\t },\r\n\t // adding files by drag-n-drop\r\n\t _drop: function _drop(e) {\r\n\t var files = e.dataTransfer.files;\r\n\t var items = e.dataTransfer.items;\r\n\r\n\t if (this.callEvent(\"onBeforeFileDrop\", [files, e])) {\r\n\t items = items || files; //IE10+\r\n\r\n\t for (var i = 0; i < items.length; i++) {\r\n\t //https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry\r\n\t var item = items[i];\r\n\r\n\t if (item.webkitGetAsEntry) {\r\n\t item = item.webkitGetAsEntry();\r\n\r\n\t if (item.isDirectory) {\r\n\t this._directoryDrop(item, this, \"\");\r\n\r\n\t continue;\r\n\t }\r\n\t }\r\n\r\n\t this.addFile(files[i]);\r\n\t }\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterFileDrop\", [files, e]);\r\n\t },\r\n\t fileDialog: function fileDialog(context) {\r\n\t this._upload_timer_click = new Date();\r\n\t this._last_file_context = context;\r\n\r\n\t var inputs = this._viewobj.getElementsByTagName(\"INPUT\");\r\n\r\n\t inputs[inputs.length - 1].click();\r\n\t },\r\n\t send: function send(id) {\r\n\t //alternative syntx send(callback)\r\n\t if (typeof id == \"function\") {\r\n\t this._last_assigned_upload_callback = id;\r\n\t id = 0;\r\n\t }\r\n\r\n\t if (!id) {\r\n\t var order = this.files.data.order;\r\n\t var complete = true;\r\n\t if (order.length) for (var i = 0; i < order.length; i++) {\r\n\t complete = !this.send(order[i]) && complete;\r\n\t }\r\n\t if (complete) this._upload_complete();\r\n\t return;\r\n\t }\r\n\r\n\t var item = this.files.getItem(id);\r\n\t if (item.status !== \"client\") return false;\r\n\t assert(this._settings.upload, \"You need to define upload url for uploader component\");\r\n\t item.status = \"transfer\";\r\n\t var formData = new FormData();\r\n\t formData.append(this.config.inputName, item.file, item.name);\r\n\t formData.append(this.config.inputName + \"_fullpath\", item.name);\r\n\t var headers = {};\r\n\t var globalData = this._settings.formData || {};\r\n\t if (typeof globalData === \"function\") globalData = globalData.call(this);\r\n\t var details = exports.extend(item.formData || {}, globalData);\r\n\t var xhr = new XMLHttpRequest();\r\n\r\n\t var url = this._get_active_url(item);\r\n\r\n\t if (callEvent(\"onBeforeAjax\", [\"POST\", url, details, xhr, headers, formData])) {\r\n\t for (var key in details) {\r\n\t formData.append(key, details[key]);\r\n\t }\r\n\r\n\t item.xhr = xhr;\r\n\t xhr.upload.addEventListener(\"progress\", bind(function (e) {\r\n\t this.$updateProgress(id, e.loaded / e.total * 100);\r\n\t }, this), false);\r\n\t xhr.onload = bind(function () {\r\n\t if (!xhr.aborted) this._file_complete(id);\r\n\t }, this);\r\n\t xhr.open(\"POST\", url, true);\r\n\r\n\t for (var _key in headers) {\r\n\t xhr.setRequestHeader(_key, headers[_key]);\r\n\t }\r\n\r\n\t xhr.send(formData);\r\n\t }\r\n\r\n\t this.$updateProgress(id, 0);\r\n\t return true;\r\n\t },\r\n\t _file_complete: function _file_complete(id) {\r\n\t var item = this.files.getItem(id);\r\n\r\n\t if (item) {\r\n\t var response = null;\r\n\r\n\t if (item.xhr.status < 400) {\r\n\t var driver = DataDriver[this._settings.datatype || \"json\"];\r\n\t response = driver.toObject(item.xhr.responseText);\r\n\t if (response) response = driver.getDetails(response);\r\n\t }\r\n\r\n\t if (!response || response.status == \"error\") {\r\n\t // file upload error\r\n\t item.status = \"error\";\r\n\t delete item.percent;\r\n\t this.files.updateItem(id);\r\n\t this.callEvent(\"onFileUploadError\", [item, response]);\r\n\t } else {\r\n\t // file upload complete\r\n\t assert(!response.status || response.status == \"server\", \"Not supported status value, use 'error' or 'server'\");\r\n\r\n\t this._complete(id, response);\r\n\t }\r\n\r\n\t delete item.xhr;\r\n\t }\r\n\t },\r\n\t stopUpload: function stopUpload(id) {\r\n\t bind(this._stop_file, this.files)(id);\r\n\t },\r\n\t _stop_file: function _stop_file(id) {\r\n\t var item = this.getItem(id);\r\n\r\n\t if (typeof item.xhr !== \"undefined\") {\r\n\t item.xhr.aborted = true;\r\n\t item.xhr.abort();\r\n\t delete item.xhr;\r\n\t item.status = \"client\";\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar ValidateCollection = {\r\n\t _validate_init_once: function _validate_init_once() {\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(function (id, data, mode) {\r\n\t if (id && (mode == \"add\" || mode == \"update\")) this.validate(id);\r\n\t }, this));\r\n\t this.data.attachEvent(\"onClearAll\", bind(this.clearValidation, this));\r\n\r\n\t this._validate_init_once = function () {};\r\n\t },\r\n\t rules_setter: function rules_setter(value) {\r\n\t if (value) {\r\n\t this._validate_init_once();\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t clearValidation: function clearValidation() {\r\n\t this.data.clearMark(\"webix_invalid\", true);\r\n\t },\r\n\t validate: function validate(id) {\r\n\t var result = true;\r\n\t if (!id) for (var key in this.data.pull) {\r\n\t result = this.validate(key) && result;\r\n\t } else {\r\n\t this._validate_details = {};\r\n\t var obj = this.getItem(id);\r\n\t result = ValidateData.validate.call(this, null, obj);\r\n\r\n\t if (result) {\r\n\t if (this.callEvent(\"onValidationSuccess\", [id, obj])) this._clear_invalid(id);\r\n\t } else {\r\n\t if (this.callEvent(\"onValidationError\", [id, obj, this._validate_details])) this._mark_invalid(id, this._validate_details);\r\n\t }\r\n\t }\r\n\t return result;\r\n\t },\r\n\t _validate: function _validate(rule, data, obj, key) {\r\n\t if (typeof rule == \"string\") rule = rules[rule];\r\n\t var res = rule.call(this, data, obj, key);\r\n\r\n\t if (!res) {\r\n\t this._validate_details[key] = true;\r\n\t }\r\n\r\n\t return res;\r\n\t },\r\n\t _clear_invalid: function _clear_invalid(id) {\r\n\t this.data.removeMark(id, \"webix_invalid\", true);\r\n\t },\r\n\t _mark_invalid: function _mark_invalid(id) {\r\n\t this.data.addMark(id, \"webix_invalid\", true);\r\n\t }\r\n\t};\r\n\r\n\tvar Values = {\r\n\t $init: function $init() {\r\n\t this.elements = {};\r\n\t },\r\n\t focus: function focus(name) {\r\n\t if (name) {\r\n\t assert(this.elements[name], \"unknown input name: \" + name);\r\n\r\n\t this._focus(this.elements[name]);\r\n\t } else {\r\n\t for (var n in this.elements) {\r\n\t if (this._focus(this.elements[n])) return true;\r\n\t }\r\n\t }\r\n\t },\r\n\t _focus: function _focus(target) {\r\n\t if (target && target.focus) {\r\n\t target.focus();\r\n\t return true;\r\n\t }\r\n\t },\r\n\t setValues: function setValues(data, update) {\r\n\t if (this._settings.complexData) data = CodeParser.collapseNames(data);\r\n\r\n\t this._inner_setValues(data, update);\r\n\t },\r\n\t _inner_setValues: function _inner_setValues(data, update) {\r\n\t this._is_form_dirty = update; //prevent onChange calls from separate controls\r\n\r\n\t this.blockEvent();\r\n\t if (!update || !this._values) this._values = {};\r\n\r\n\t for (var name in data) {\r\n\t if (!this.elements[name]) this._values[name] = data[name];\r\n\t }\r\n\r\n\t for (var _name in this.elements) {\r\n\t var input = this.elements[_name];\r\n\r\n\t if (input) {\r\n\t if (!isUndefined(data[_name])) input.setValue(data[_name]);else if (!update && input.$allowsClear) input.setValue(\"\");\r\n\t this._values[_name] = input.getValue();\r\n\t }\r\n\t }\r\n\r\n\t this.unblockEvent();\r\n\t this.callEvent(\"onValues\", []);\r\n\t },\r\n\t isDirty: function isDirty() {\r\n\t if (this._is_form_dirty) return true;\r\n\t if (this.getDirtyValues(1) === 1) return true;\r\n\t return false;\r\n\t },\r\n\t setDirty: function setDirty(flag) {\r\n\t this._is_form_dirty = flag;\r\n\t if (!flag) this._values = this._inner_getValues();\r\n\t },\r\n\t getDirtyValues: function getDirtyValues() {\r\n\t var result = {};\r\n\r\n\t if (this._values) {\r\n\t for (var name in this.elements) {\r\n\t var value = this.elements[name].getValue();\r\n\r\n\t if (this._values[name] != value) {\r\n\t result[name] = value; //FIXME - used by isDirty\r\n\r\n\t if (arguments[0]) return 1;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return result;\r\n\t },\r\n\t getCleanValues: function getCleanValues() {\r\n\t return this._values;\r\n\t },\r\n\t getValues: function getValues(filter) {\r\n\t var data = this._inner_getValues(filter);\r\n\r\n\t if (this._settings.complexData) data = CodeParser.expandNames(data);\r\n\t return data;\r\n\t },\r\n\t _inner_getValues: function _inner_getValues(filter) {\r\n\t //get original data\t\t\r\n\t var success,\r\n\t elem = null,\r\n\t data = this._values ? copy(this._values) : {}; //update properties from linked controls\r\n\r\n\t for (var name in this.elements) {\r\n\t elem = this.elements[name];\r\n\t success = true;\r\n\r\n\t if (filter) {\r\n\t if (_typeof(filter) == \"object\") {\r\n\t if (filter.hidden === false) success = elem.isVisible();\r\n\t if (success && filter.disabled === false) success = elem.isEnabled();\r\n\t } else success = filter.call(this, elem);\r\n\t }\r\n\r\n\t if (success) data[name] = elem.getValue();else delete data[name]; //in case of this._values[name]\r\n\t }\r\n\r\n\t return data;\r\n\t },\r\n\t clear: function clear() {\r\n\t this._is_form_dirty = false;\r\n\t var data = {};\r\n\r\n\t for (var name in this.elements) {\r\n\t if (this.elements[name].$allowsClear) data[name] = \"\";\r\n\t }\r\n\r\n\t this._inner_setValues(data);\r\n\t },\r\n\t markInvalid: function markInvalid(name, state) {\r\n\t // remove 'invalid' mark\r\n\t if (state === false) {\r\n\t this._clear_invalid(name);\r\n\t } // add 'invalid' mark\r\n\t else {\r\n\t // set invalidMessage\r\n\t if (typeof state == \"string\") {\r\n\t var input = this.elements[name];\r\n\t if (input) input._settings.invalidMessage = state;\r\n\t }\r\n\r\n\t this._mark_invalid(name);\r\n\t }\r\n\t },\r\n\t _mark_invalid: function _mark_invalid(id) {\r\n\t var input = this.elements[id];\r\n\r\n\t if (id && input) {\r\n\t this._clear_invalid(id, true);\r\n\r\n\t addCss(input._viewobj, \"webix_invalid\");\r\n\t input._settings.invalid = true;\r\n\t var message = input._settings.invalidMessage;\r\n\t if (typeof message === \"string\" && input.setBottomText) input.setBottomText();\r\n\t }\r\n\t },\r\n\t _clear_invalid: function _clear_invalid(id, silent) {\r\n\t var input = this.elements[id];\r\n\r\n\t if (id && input && input.$view && input._settings.invalid) {\r\n\t removeCss(input._viewobj, \"webix_invalid\");\r\n\t input._settings.invalid = false;\r\n\t var message = input._settings.invalidMessage;\r\n\t if (typeof message === \"string\" && !silent && input.setBottomText) input.setBottomText();\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t\tRenders collection of items\r\n\t\tAlways shows y-scroll\r\n\t\tCan be used with huge datasets\r\n\t\t\r\n\t\t@export\r\n\t\t\tshow\r\n\t\t\trender\r\n\t*/\r\n\r\n\tvar VirtualRenderStack = {\r\n\t $init: function $init() {\r\n\t assert(this.render, \"VirtualRenderStack :: Object must use RenderStack first\");\r\n\t this._htmlmap = {}; //init map of rendered elements\r\n\t //we need to repaint area each time when view resized or scrolling state is changed\r\n\r\n\t _event(this._viewobj, \"scroll\", bind(this._render_visible_rows, this));\r\n\r\n\t if (env.touch) {\r\n\t this.attachEvent(\"onAfterScroll\", bind(this._render_visible_rows, this));\r\n\t } //here we store IDs of elemenst which doesn't loadede yet, but need to be rendered\r\n\r\n\r\n\t this._unrendered_area = [];\r\n\t },\r\n\t //return html object by item's ID. Can return null for not-rendering element\r\n\t getItemNode: function getItemNode(search_id) {\r\n\t //collection was filled in _render_visible_rows\r\n\t return this._htmlmap[search_id];\r\n\t },\r\n\t //adjust scrolls to make item visible\r\n\t showItem: function showItem(id) {\r\n\t var range = this._getVisibleRange();\r\n\r\n\t var ind = this.data.getIndexById(id); //we can't use DOM method for not-rendered-yet items, so fallback to pure math\r\n\r\n\t var dy = Math.floor(ind / range._dx) * range._y;\r\n\r\n\t var state = this.getScrollState();\r\n\t if (dy < state.y || dy + this._settings.height >= state.y + this._content_height) this.scrollTo(0, dy);\r\n\t },\r\n\t //repain self after changes in DOM\r\n\t //for add, delete, move operations - render is delayed, to minify performance impact\r\n\t render: function render(id, data, type) {\r\n\t if (!this.isVisible(this._settings.id) || this.$blockRender) return;\r\n\r\n\t if (id) {\r\n\t var cont = this.getItemNode(id); //old html element\r\n\r\n\t switch (type) {\r\n\t case \"update\":\r\n\t if (!cont) return; //replace old with new\r\n\r\n\t var t = this._htmlmap[id] = this._toHTMLObject(data);\r\n\r\n\t insertBefore(t, cont);\r\n\t remove(cont);\r\n\t break;\r\n\r\n\t default:\r\n\t // \"move\", \"add\", \"delete\"\r\n\r\n\t /*\r\n\t \tfor all above operations, full repainting is necessary\r\n\t \tbut from practical point of view, we need only one repainting per thread\r\n\t \tcode below initiates double-thread-rendering trick\r\n\t */\r\n\t this._render_delayed();\r\n\r\n\t break;\r\n\t }\r\n\t } else {\r\n\t //full repainting\r\n\t if (this.callEvent(\"onBeforeRender\", [this.data])) {\r\n\t this._htmlmap = {}; //nulify links to already rendered elements\r\n\r\n\t this._render_visible_rows(null, true); // clear delayed-rendering, because we already have repaint view\r\n\r\n\r\n\t this._wait_for_render = false;\r\n\t this.callEvent(\"onAfterRender\", []);\r\n\t }\r\n\t }\r\n\t },\r\n\t //implement double-thread-rendering pattern\r\n\t _render_delayed: function _render_delayed() {\r\n\t //this flag can be reset from outside, to prevent actual rendering \r\n\t if (this._wait_for_render) return;\r\n\t this._wait_for_render = true;\r\n\t window.setTimeout(bind(function () {\r\n\t this.render();\r\n\t }, this), 1);\r\n\t },\r\n\t //create empty placeholders, which will take space before rendering\r\n\t _create_placeholder: function _create_placeholder(height) {\r\n\t if (env.maxHTMLElementSize) height = Math.min(env.maxHTMLElementSize, height);\r\n\t var node = document.createElement(\"DIV\");\r\n\t node.style.cssText = \"height:\" + height + \"px; width:100%; overflow:hidden;\";\r\n\t return node;\r\n\t },\r\n\r\n\t /*\r\n\t \tMethods get coordinatest of visible area and checks that all related items are rendered\r\n\t \tIf, during rendering, some not-loaded items was detected - extra data loading is initiated.\r\n\t \treset - flag, which forces clearing of previously rendered elements\r\n\t */\r\n\t _render_visible_rows: function _render_visible_rows(e, reset) {\r\n\t this._unrendered_area = []; //clear results of previous calls\r\n\r\n\t var viewport = this._getVisibleRange(); //details of visible view\r\n\r\n\r\n\t if (!this._dataobj.firstChild || reset) {\r\n\t //create initial placeholder - for all view space\r\n\t this._dataobj.innerHTML = \"\";\r\n\r\n\t this._dataobj.appendChild(this._create_placeholder(viewport._max)); //register placeholder in collection\r\n\r\n\r\n\t this._htmlrows = [this._dataobj.firstChild];\r\n\t }\r\n\t /*\r\n\t \tvirtual rendering breaks all view on rows, because we know widht of item\r\n\t \twe can calculate how much items can be placed on single row, and knowledge \r\n\t \tof that, allows to calculate count of such rows\r\n\t \t\r\n\t \teach time after scrolling, code iterate through visible rows and render items \r\n\t \tin them, if they are not rendered yet\r\n\t \t\r\n\t \tboth rendered rows and placeholders are registered in _htmlrows collection\r\n\t */\r\n\t //position of first visible row\r\n\r\n\r\n\t var t = viewport._from;\r\n\r\n\t while (t <= viewport._height) {\r\n\t //loop for all visible rows\r\n\t //skip already rendered rows\r\n\t while (this._htmlrows[t] && this._htmlrows[t]._filled && t <= viewport._height) {\r\n\t t++;\r\n\t } //go out if all is rendered\r\n\r\n\r\n\t if (t > viewport._height) break; //locate nearest placeholder\r\n\r\n\t var holder = t;\r\n\r\n\t while (!this._htmlrows[holder]) {\r\n\t holder--;\r\n\t }\r\n\r\n\t var holder_row = this._htmlrows[holder]; //render elements in the row\t\t\t\r\n\r\n\t var base = t * viewport._dx + (this.data.$min || 0); //index of rendered item\r\n\r\n\t if (base > (this.data.$max || Infinity)) break; //check that row is in virtual bounds, defined by paging\r\n\r\n\t var nextpoint = Math.min(base + viewport._dx - 1, this.data.$max ? this.data.$max - 1 : Infinity);\r\n\r\n\t var node = this._create_placeholder(viewport._y); //all items in rendered row\r\n\r\n\r\n\t var range = this.data.getIndexRange(base, nextpoint);\r\n\t if (!range.length) break;\r\n\t var loading = {\r\n\t $template: \"Loading\"\r\n\t };\r\n\r\n\t for (var i = 0; i < range.length; i++) {\r\n\t if (!range[i]) this._unrendered_area.push(base + i);\r\n\t range[i] = this._toHTML(range[i] || loading);\r\n\t }\r\n\r\n\t node.innerHTML = range.join(\"\"); //actual rendering\r\n\r\n\t for (var _i = 0; _i < range.length; _i++) {\r\n\t //register all new elements for later usage in getItemNode\r\n\t this._htmlmap[this.data.getIdByIndex(base + _i)] = node.childNodes[_i];\r\n\t } //correct placeholders\r\n\r\n\r\n\t var h = parseFloat(holder_row.style.height, 10);\r\n\t var delta = (t - holder) * viewport._y;\r\n\t var delta2 = h - delta - viewport._y; //add new row to the DOOM\r\n\r\n\t insertBefore(node, delta ? holder_row.nextSibling : holder_row, this._dataobj);\r\n\t this._htmlrows[t] = node;\r\n\t node._filled = true;\r\n\t /*\r\n\t \tif new row is at start of placeholder - decrease placeholder's height\r\n\t \telse if new row takes whole placeholder - remove placeholder from DOM\r\n\t \telse \r\n\t \t\twe are inserting row in the middle of existing placeholder\r\n\t \t\tdecrease height of existing one, and add one more, \r\n\t \t\tbefore the newly added row\r\n\t */\r\n\r\n\t if (delta <= 0 && delta2 > 0) {\r\n\t holder_row.style.height = delta2 + \"px\";\r\n\t this._htmlrows[t + 1] = holder_row;\r\n\t } else {\r\n\t if (delta < 0) remove(holder_row);else holder_row.style.height = delta + \"px\";\r\n\r\n\t if (delta2 > 0) {\r\n\t var new_space = this._htmlrows[t + 1] = this._create_placeholder(delta2);\r\n\r\n\t insertBefore(new_space, node.nextSibling, this._dataobj);\r\n\t }\r\n\t }\r\n\r\n\t t++;\r\n\t } //when all done, check for non-loaded items\r\n\r\n\r\n\t if (this._unrendered_area.length) {\r\n\t //we have some data to load\r\n\t //detect borders\r\n\t var from = this._unrendered_area[0];\r\n\t var to = this._unrendered_area.pop() + 1;\r\n\r\n\t if (to > from) {\r\n\t //initiate data loading\r\n\t var count = to - from;\r\n\t if (this._maybe_loading_already(count, from)) return;\r\n\t count = Math.max(count, this._settings.datafetch || this._settings.loadahead || 0);\r\n\t this.loadNext(count, from);\r\n\t }\r\n\t }\r\n\t },\r\n\t //calculates visible view\r\n\t _getVisibleRange: function _getVisibleRange() {\r\n\t var state = this.getScrollState();\r\n\t var top = Math.max(0, state.y);\r\n\t var width = this._content_width;\r\n\t var height = this._content_height; //size of single item\r\n\r\n\t var t = this.type;\r\n\t var dx = Math.floor(width / t.width) || 1; //at least single item per row\r\n\r\n\t var min = Math.floor(top / t.height); //index of first visible row\r\n\r\n\t var dy = Math.ceil((height + top) / t.height) - 1; //index of last visible row\r\n\t //total count of items, paging can affect this math\r\n\r\n\t var count = this.data.$max ? this.data.$max - this.data.$min : this.data.count();\r\n\t var max = Math.ceil(count / dx) * t.height; //size of view in rows\r\n\r\n\t return {\r\n\t _from: min,\r\n\t _height: dy,\r\n\t _top: top,\r\n\t _max: max,\r\n\t _y: t.height,\r\n\t _dx: dx\r\n\t };\r\n\t },\r\n\t _cellPosition: function _cellPosition(id) {\r\n\t var html = this.getItemNode(id);\r\n\r\n\t if (!html) {\r\n\t this.showItem(id);\r\n\r\n\t this._render_visible_rows();\r\n\r\n\t html = this.getItemNode(id);\r\n\t }\r\n\r\n\t return {\r\n\t left: html.offsetLeft,\r\n\t top: html.offsetTop,\r\n\t height: html.offsetHeight,\r\n\t width: html.offsetWidth,\r\n\t parent: this._contentobj\r\n\t };\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t\tRenders collection of items on demand\r\n\t*/\r\n\r\n\tvar VRenderStack = {\r\n\t $init: function $init() {\r\n\t this._htmlmap = {};\r\n\r\n\t _event(this._viewobj, \"scroll\", bind(function () {\r\n\t this.render(null, null, \"paint\");\r\n\t }, this));\r\n\t },\r\n\t //return html container by its ID\r\n\t //can return undefined if container doesn't exists\r\n\t getItemNode: function getItemNode(search_id) {\r\n\t return this._htmlmap && this._htmlmap[search_id];\r\n\t },\r\n\r\n\t /*change scrolling state of top level container, so related item will be in visible part*/\r\n\t showItem: function showItem(id) {\r\n\t var index$$1 = this.data.getIndexById(id);\r\n\r\n\t if (index$$1 > -1) {\r\n\t var top = index$$1 * this.type.height;\r\n\t var bottom = top + this.type.height;\r\n\t var scroll = this.getScrollState();\r\n\t var box = offset(this.$view);\r\n\t if (top < scroll.y) this.scrollTo(0, top);else if (bottom > scroll.y + box.height) this.scrollTo(0, bottom - box.height);\r\n\t }\r\n\t },\r\n\t //update view after data update\r\n\t //when called without parameters - all view refreshed\r\n\t render: function render(id, data, type) {\r\n\t if (!this.isVisible(this._settings.id) || this.$blockRender) return;\r\n\t var parent = this._renderobj || this._dataobj;\r\n\r\n\t if (id) {\r\n\t if (type == \"paint\" || type == \"update\") {\r\n\t var cont = this.getItemNode(id); //get html element of updated item\r\n\r\n\t if (cont) {\r\n\t var t = this._htmlmap[id] = this._toHTMLObject(data);\r\n\r\n\t t.style.top = cont.style.top;\r\n\t t.style.position = \"absolute\";\r\n\t t.style.left = 0;\r\n\t t.style.width = \"100%\";\r\n\t insertBefore(t, cont);\r\n\t remove(cont);\r\n\t return;\r\n\t } //updating not rendered yet item\r\n\r\n\r\n\t return;\r\n\t }\r\n\t }\r\n\r\n\t if (type != \"paint\") {\r\n\t //repaint all\r\n\t this._htmlmap = {};\r\n\t parent.innerHTML = \"\";\r\n\t } //full reset\r\n\r\n\r\n\t if (this.callEvent(\"onBeforeRender\", [this.data])) {\r\n\t var count = this.data.count();\r\n\t var scroll = this.getScrollState();\r\n\t var box = offset(this._viewobj);\r\n\t var top = Math.floor(scroll.y / this.type.height) - 2;\r\n\t var bottom = Math.ceil((scroll.y + box.height) / this.type.height) + 2;\r\n\t top = Math.max(0, top);\r\n\t bottom = Math.min(this.data.count() - 1, bottom);\r\n\t var html = [];\r\n\r\n\t for (var i = top; i <= bottom; i++) {\r\n\t var sid = this.data.order[i];\r\n\r\n\t if (!this._htmlmap[sid]) {\r\n\t var item = this.data.getItem(sid);\r\n\r\n\t if (!item) {\r\n\t this._run_load_next({\r\n\t count: bottom - i + (this._settings.loadahead || 0),\r\n\t start: i\r\n\t });\r\n\r\n\t break;\r\n\t }\r\n\r\n\t html.push(this._toHTML(item));\r\n\t } else {\r\n\t html.push(\"
\");\r\n\t }\r\n\t }\r\n\r\n\t this._html.innerHTML = html.join(\"\");\r\n\t parent.style.position = \"relative\";\r\n\t parent.style.height = count * this.type.height + \"px\";\r\n\t var kids = this._html.childNodes;\r\n\r\n\t for (var _i = kids.length - 1; _i >= 0; _i--) {\r\n\t var child = kids[_i];\r\n\t var cid = child.getAttribute(this._id);\r\n\r\n\t if (cid) {\r\n\t child.style.position = \"absolute\";\r\n\t child.style.top = (top + _i) * this.type.height + \"px\";\r\n\t child.style.left = 0;\r\n\t child.style.width = \"100%\";\r\n\t parent.appendChild(child);\r\n\t this._htmlmap[cid] = child;\r\n\t }\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterRender\", []);\r\n\t }\r\n\t },\r\n\t $setSize: function $setSize() {\r\n\t if (base.api.$setSize.apply(this, arguments)) {\r\n\t this.render(null, null, \"paint\");\r\n\t }\r\n\t },\r\n\t _run_load_next: function _run_load_next(conf) {\r\n\t var count = Math.max(conf.count, this._settings.datafetch || this._settings.loadahead || 0);\r\n\t if (this._maybe_loading_already(conf.count, conf.start)) return;\r\n\t this.loadNext(count, conf.start);\r\n\t }\r\n\t};\r\n\r\n\tvar version$1 = \"6.0.4\";\r\n\tvar name$1 = \"core\";\r\n\r\n\tvar errorMessage = \"non-existing view for export\";\r\n\tvar toPNG = function toPNG(id, options) {\r\n\t var defer = Deferred.defer();\r\n\t return require(env.cdn + \"/extras/html2canvas.min.js\").then(function () {\r\n\t //backward compatibility\r\n\t if (typeof options === \"string\") options = {\r\n\t filename: options\r\n\t };\r\n\t options = options || {};\r\n\t var view = $$(id);\r\n\t if (view && view.$exportView) view = view.$exportView(options);\r\n\t assert(view, errorMessage);\r\n\t if (!view) return defer.reject(errorMessage);\r\n\t var node = view ? view.$view : toNode(id);\r\n\t var filename = (options.filename || \"Data\") + \".png\";\r\n\t window.html2canvas(node).then(function (canvas) {\r\n\t var callback = function callback(data) {\r\n\t if (options.download !== false) download(data, filename);\r\n\t canvas.remove();\r\n\t defer.resolve(data);\r\n\t };\r\n\r\n\t if (canvas.msToBlob) callback(canvas.msToBlob());else canvas.toBlob(callback, \"image/png\");\r\n\t });\r\n\t return defer;\r\n\t });\r\n\t};\r\n\tvar toExcel = function toExcel(id, options) {\r\n\t options = options || {};\r\n\t options.export_mode = \"excel\";\r\n\t id = isArray(id) ? id : [id];\r\n\t var views = [];\r\n\r\n\t for (var i = 0; i < id.length; i++) {\r\n\t var view = $$(id[i]);\r\n\t if (view && view.$exportView) view = view.$exportView(options);\r\n\t if (view) views = views.concat(view);\r\n\t assert(view, errorMessage); //spreadsheet and excelviewer require plain data output first\r\n\r\n\t if (options.dataOnly) {\r\n\t var scheme = getExportScheme(view, options);\r\n\t views[i] = {\r\n\t scheme: scheme,\r\n\t exportData: getExportData(view, options, scheme),\r\n\t spans: options.spans ? getSpans(view, options) : []\r\n\t };\r\n\t }\r\n\t }\r\n\r\n\t if (options.dataOnly) return views;\r\n\t var defer = Deferred.defer();\r\n\t return require(env.cdn + \"/extras/xlsx.core.styles.min.js\").then(function () {\r\n\t if (!views.length) return defer.reject(errorMessage);\r\n\t var wb = {\r\n\t SheetNames: [],\r\n\t Sheets: {},\r\n\t Workbook: {\r\n\t WBProps: {},\r\n\t Names: []\r\n\t }\r\n\t };\r\n\t var name = isArray(options.sheets) ? options.sheets : [options.name || \"Data\"];\r\n\r\n\t for (var i = 0; i < views.length; i++) {\r\n\t var scheme = views[i].scheme || getExportScheme(views[i], options);\r\n\t var result = views[i].exportData || getExportData(views[i], options, scheme);\r\n\t var spans = views[i].spans ? views[i].spans : options.spans ? getSpans(views[i], options) : [];\r\n\t var ranges = views[i].ranges || [];\r\n\t var styles = views[i].styles || [];\r\n\t var data = getExcelData(result, scheme, spans, styles);\r\n\t var sname = (name[i] || \"Data\" + i).replace(/[*?:[\\]\\\\/]/g, \"\").replace(/&/g, \"&\").substring(0, 31);\r\n\t wb.SheetNames.push(sname);\r\n\t wb.Sheets[sname] = data;\r\n\t wb.Workbook.Names = wb.Workbook.Names.concat(ranges);\r\n\t }\r\n\t /* global XLSX */\r\n\r\n\r\n\t var xls = XLSX.write(wb, {\r\n\t bookType: \"xlsx\",\r\n\t bookSST: false,\r\n\t type: \"binary\"\r\n\t });\r\n\t var filename = (options.filename || name.join(\",\")) + \".xlsx\";\r\n\t var blob = new Blob([str2array(xls)], {\r\n\t type: \"application/xlsx\"\r\n\t });\r\n\t if (options.download !== false) download(blob, filename);\r\n\t defer.resolve(blob);\r\n\t return defer;\r\n\t });\r\n\t};\r\n\tvar toCSV = function toCSV(id, options) {\r\n\t options = options || {};\r\n\t var view = $$(id);\r\n\t if (view && view.$exportView) view = view.$exportView(options);\r\n\t assert(view, errorMessage);\r\n\t if (!view) return Deferred.reject(errorMessage);\r\n\t options.export_mode = \"csv\";\r\n\t options.filterHTML = true;\r\n\t var scheme = getExportScheme(view, options);\r\n\t var result = getExportData(view, options, scheme);\r\n\t var data = getCsvData(result, scheme);\r\n\t var filename = (options.filename || \"Data\") + \".csv\";\r\n\t var blob = new Blob([\"\\uFEFF\" + data], {\r\n\t type: \"text/csv\"\r\n\t });\r\n\t if (options.download !== false) download(blob, filename);\r\n\t return Deferred.resolve(blob);\r\n\t};\r\n\r\n\tfunction getCsvData(data) {\r\n\t return csv$1.stringify(data);\r\n\t}\r\n\r\n\tvar font;\r\n\tvar toPDF = function toPDF(id, options) {\r\n\t var defer = Deferred.defer();\r\n\t return require(env.cdn + \"/extras/pdfjs.js\").then(function () {\r\n\t options = options || {};\r\n\t var view = $$(id);\r\n\t if (view && view.$exportView) view = view.$exportView(options);\r\n\t assert(view, errorMessage);\r\n\t if (!view) return defer.reject(errorMessage);\r\n\t options.export_mode = \"pdf\";\r\n\t options._export_font = font;\r\n\t options.fontName = options.fontName || \"pt-sans.regular\";\r\n\t var scheme = getExportScheme(view, options);\r\n\t var data = getExportData(view, options, scheme);\r\n\r\n\t var callback = function callback(pdf, options) {\r\n\t var filename = (options.filename || \"Data\") + \".pdf\";\r\n\t var blob = new Blob([pdf.toString()], {\r\n\t type: \"application/pdf\"\r\n\t });\r\n\t if (options.download !== false) download(blob, filename);\r\n\t defer.resolve(blob);\r\n\t };\r\n\r\n\t if (options._export_font) getPdfData(scheme, data, options, callback);else\r\n\t /* global pdfjs */\r\n\t pdfjs.load(env.cdn + \"/extras/\" + options.fontName + \".ttf\", function (err, buf) {\r\n\t if (err) throw err;\r\n\t font = options._export_font = new pdfjs.TTFFont(buf);\r\n\t getPdfData(scheme, data, options, callback);\r\n\t });\r\n\t return defer;\r\n\t });\r\n\t};\r\n\r\n\tfunction getDataHelper(key, column, raw) {\r\n\t if (!raw && column.format) return function (obj) {\r\n\t return column.format(obj[key]);\r\n\t };\r\n\t return function (obj) {\r\n\t return obj[key];\r\n\t };\r\n\t}\r\n\r\n\tfunction getExportScheme(view, options) {\r\n\t var scheme = [];\r\n\t var h_count = 0,\r\n\t f_count = 0;\r\n\t var isTable = view.getColumnConfig;\r\n\t var columns = options.columns;\r\n\t var raw = !!options.rawValues;\r\n\t scheme.heights = {};\r\n\r\n\t if (!columns) {\r\n\t if (isTable) columns = [].concat(view._columns);else {\r\n\t columns = [];\r\n\t var obj = view.data.pull[view.data.order[0]];\r\n\r\n\t for (var key in obj) {\r\n\t if (key !== \"id\" && key[0] != \"$\") columns.push({\r\n\t id: key\r\n\t });\r\n\t }\r\n\t }\r\n\t } else if (!columns.length) {\r\n\t //export options are set as - columns:{ rank:true, title:{ header:\"custom\"}}\r\n\t var arr = [];\r\n\r\n\t for (var _key in columns) {\r\n\t arr.push(exports.extend({\r\n\t id: _key\r\n\t }, exports.extend({}, columns[_key])));\r\n\t }\r\n\r\n\t columns = arr;\r\n\t }\r\n\r\n\t if (options.ignore) for (var i = columns.length - 1; i >= 0; i--) {\r\n\t if (options.ignore[columns[i].id]) columns.splice(i, 1);\r\n\t }\r\n\t if (options.id) scheme.push({\r\n\t id: \"id\",\r\n\t width: 50,\r\n\t header: \" \",\r\n\t template: function template(obj) {\r\n\t return obj.id;\r\n\t }\r\n\t });\r\n\r\n\t if (options.flatTree) {\r\n\t var flatKey = options.flatTree.id;\r\n\t var copy$$1 = [].concat(options.flatTree.columns);\r\n\t var fill = [];\r\n\t var fillMode = !!options.flatTree.fill;\r\n\r\n\t for (var _i = 1; _i <= copy$$1.length; _i++) {\r\n\t copy$$1[_i - 1].template = function (i) {\r\n\t return function (obj) {\r\n\t return obj.$level == i ? fill[i] = obj[flatKey] : fillMode && i < obj.$level ? fill[i] : \"\";\r\n\t };\r\n\t }(_i);\r\n\t }\r\n\r\n\t var index$$1 = 0;\r\n\r\n\t for (var _i2 = columns.length - 1; _i2 >= 0; _i2--) {\r\n\t if (columns[_i2].id === flatKey) index$$1 = _i2;\r\n\t }\r\n\r\n\t columns = [].concat(columns.slice(0, index$$1)).concat(copy$$1).concat(columns.slice(index$$1 + 1));\r\n\t }\r\n\r\n\t for (var j = 0; j < columns.length; j++) {\r\n\t var column = columns[j];\r\n\t var _key2 = column.id;\r\n\t if (column.noExport) continue; // raw mode has sense only for datatable\r\n\t // in other cases we don't have built-in data templates\r\n\r\n\t var rawColumn = raw && isTable;\r\n\t var sourceColumn = view._columns_pull && view._columns_pull[_key2];\r\n\r\n\t if (isTable) {\r\n\t // when these's no column to take raw data from, or custom template defined - ignore raw mode\r\n\t if (column.template && (!sourceColumn || sourceColumn.template != column.template)) rawColumn = false;\r\n\t if (sourceColumn) column = exports.extend(exports.extend({}, column), sourceColumn);\r\n\t }\r\n\r\n\t var record = {\r\n\t id: column.id,\r\n\t template: rawColumn || !column.template ? getDataHelper(_key2, column, raw) : column.template,\r\n\t width: (column.width || 200) * (options.export_mode === \"excel\" ? 8.43 / 70 : 1),\r\n\t header: column.header !== false ? column.header || _key2 : \"\"\r\n\t };\r\n\r\n\t if (options.export_mode === \"excel\") {\r\n\t exports.extend(record, {\r\n\t type: column.exportType || \"\",\r\n\t format: column.exportFormat || \"\"\r\n\t });\r\n\t }\r\n\r\n\t if (typeof record.header === \"string\") record.header = [{\r\n\t text: record.header\r\n\t }];else record.header = copy(record.header);\r\n\r\n\t for (var _i3 = 0; _i3 < record.header.length; _i3++) {\r\n\t record.header[_i3] = record.header[_i3] ? record.header[_i3].contentId ? \"\" : record.header[_i3].text : \"\";\r\n\t }\r\n\r\n\t h_count = Math.max(h_count, record.header.length);\r\n\r\n\t if (view._settings.footer) {\r\n\t var footer = column.footer || \"\";\r\n\t if (typeof footer == \"string\") footer = [{\r\n\t text: footer\r\n\t }];else footer = copy(footer);\r\n\r\n\t for (var _i4 = 0; _i4 < footer.length; _i4++) {\r\n\t if (footer[_i4]) footer[_i4] = footer[_i4].contentId ? view.getHeaderContent(footer[_i4].contentId).getValue() : footer[_i4].text;else footer[_i4] = \"\";\r\n\t }\r\n\r\n\t record.footer = footer;\r\n\t f_count = Math.max(f_count, record.footer.length);\r\n\t }\r\n\r\n\t scheme.push(record);\r\n\t }\r\n\r\n\t for (var _i5 = 0; _i5 < scheme.length; _i5++) {\r\n\t var diff = h_count - scheme[_i5].header.length;\r\n\r\n\t for (var d = 0; d < diff; d++) {\r\n\t scheme[_i5].header.push(\"\");\r\n\t }\r\n\r\n\t if (view._settings.footer) {\r\n\t diff = f_count - scheme[_i5].footer.length;\r\n\r\n\t for (var _d = 0; _d < diff; _d++) {\r\n\t scheme[_i5].footer.push(\"\");\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return scheme;\r\n\t}\r\n\r\n\tfunction getExportData(view, options, scheme) {\r\n\t var filterHTML = !!options.filterHTML;\r\n\t var htmlFilter = /<[^>]*>/gi;\r\n\t var data = [];\r\n\t var header, headers;\r\n\r\n\t if (options.export_mode === \"excel\" && options.docHeader) {\r\n\t data = [[(options.docHeader.text || options.docHeader).toString()], [\"\"]];\r\n\t if (options.docHeader.height) scheme.heights[0] = options.docHeader.height;\r\n\t }\r\n\r\n\t if (options.header !== false && scheme.length) {\r\n\t for (var h = 0; h < scheme[0].header.length; h++) {\r\n\t headers = [];\r\n\r\n\t for (var i = 0; i < scheme.length; i++) {\r\n\t header = \"\";\r\n\r\n\t if (scheme[i].header[h]) {\r\n\t header = scheme[i].header[h];\r\n\t if (filterHTML) header = scheme[i].header[h] = header.replace(htmlFilter, \"\");\r\n\t }\r\n\r\n\t headers.push(header);\r\n\t }\r\n\r\n\t if (options.export_mode == \"excel\" && view._columns && options.heights !== false && (view._headers[h] !== $active.barHeight || options.heights == \"all\")) scheme.heights[data.length] = view._headers[h];\r\n\t if (options.export_mode !== \"pdf\") data[data.length] = headers;\r\n\t }\r\n\t }\r\n\r\n\t options.yCorrection = (options.yCorrection || 0) - data.length;\r\n\t var isTree = view.data.name == \"TreeStore\";\r\n\t var treeline = options.flatTree || options.plainOutput ? \"\" : \" - \";\r\n\t view.data.each(function (item) {\r\n\t if (!options.filter || options.filter(item)) {\r\n\t var line = [];\r\n\r\n\t for (var _i6 = 0; _i6 < scheme.length; _i6++) {\r\n\t var column = scheme[_i6],\r\n\t cell = null; //spreadsheet can output math\r\n\r\n\t if (options.math && item[\"$\" + column.id] && item[\"$\" + column.id].charAt(0) == \"=\" && !item[\"$\" + column.id].match(/^=(image|link|sparkline)\\(/i)) cell = item[\"$\" + column.id];\r\n\r\n\t if (this._spans_pull) {\r\n\t var span = this.getSpan(item.id, column.id);\r\n\r\n\t if (span && span[4] && span[0] == item.id && span[1] == column.id) {\r\n\t cell = span[4];\r\n\t if (filterHTML && typeof cell === \"string\") cell = cell.replace(htmlFilter, \"\");\r\n\t }\r\n\t }\r\n\r\n\t if (!cell) {\r\n\t cell = column.template(item, view.type, item[column.id], column, _i6);\r\n\t if (!cell && cell !== 0) cell = \"\";\r\n\r\n\t if (filterHTML && typeof cell === \"string\") {\r\n\t if (isTree) cell = cell.replace(/
<\\/div>/, treeline);\r\n\t cell = cell.replace(htmlFilter, \"\");\r\n\t } //remove end/start spaces(ex.hierarchy data)\r\n\r\n\r\n\t if (typeof cell === \"string\" && options.export_mode === \"csv\") cell = cell.trim(); //for multiline data\r\n\r\n\t if (typeof cell === \"string\" && (options.export_mode === \"excel\" || options.export_mode === \"csv\")) {\r\n\t cell = cell.replace(//mg, \"\\n\");\r\n\t }\r\n\t }\r\n\r\n\t line.push(cell);\r\n\t }\r\n\r\n\t if (options.export_mode == \"excel\" && view._columns && options.heights !== false && (item.$height && item.$height !== $active.rowHeight || options.heights == \"all\")) scheme.heights[data.length] = item.$height || this.config.rowHeight;\r\n\t data.push(line);\r\n\t }\r\n\t }, view);\r\n\r\n\t if (options.footer !== false) {\r\n\t var f_count = scheme[0].footer ? scheme[0].footer.length : 0;\r\n\r\n\t for (var f = 0; f < f_count; f++) {\r\n\t var footers = [];\r\n\r\n\t for (var _i7 = 0; _i7 < scheme.length; _i7++) {\r\n\t var footer = scheme[_i7].footer[f];\r\n\t if (filterHTML) footer = scheme[_i7].footer[f] = footer.toString().replace(htmlFilter, \"\");\r\n\t footers.push(footer);\r\n\t }\r\n\r\n\t if (options.export_mode == \"excel\" && view._columns && options.heights !== false && (view._footers[f] !== $active.barHeight || options.heights == \"all\")) scheme.heights[data.length] = view._footers[f];\r\n\t if (options.export_mode !== \"pdf\") data.push(footers);\r\n\t }\r\n\t }\r\n\r\n\t if (options.export_mode === \"excel\" && options.docFooter) {\r\n\t data = data.concat([[], [(options.docFooter.text || options.docFooter).toString()]]);\r\n\t if (options.docFooter.height) scheme.heights[data.length - 1] = options.docFooter.height;\r\n\t }\r\n\r\n\t return data;\r\n\t}\r\n\r\n\tfunction getColumnsWidths(scheme) {\r\n\t var wscols = [];\r\n\r\n\t for (var i = 0; i < scheme.length; i++) {\r\n\t wscols.push({\r\n\t wch: scheme[i].width\r\n\t });\r\n\t }\r\n\r\n\t return wscols;\r\n\t}\r\n\r\n\tfunction excelDate(date) {\r\n\t return Math.round(25569 + date / (24 * 60 * 60 * 1000));\r\n\t}\r\n\r\n\tfunction getSpans(view, options) {\r\n\t var isTable = view.getColumnConfig;\r\n\t var pull = view._spans_pull;\r\n\t var spans = [];\r\n\r\n\t if (isTable) {\r\n\t if (options.header !== false) spans = getHeaderSpans(view, options, \"header\", spans);\r\n\r\n\t if (pull) {\r\n\t var xc = options.xCorrection || 0;\r\n\t var yc = options.yCorrection || 0;\r\n\r\n\t for (var row in pull) {\r\n\t //{ s:{c:1, r:0}, e:{c:3, r:0} }\r\n\t var cols = pull[row];\r\n\r\n\t for (var col in cols) {\r\n\t var sc = view.getColumnIndex(col) - xc;\r\n\t var sr = view.getIndexById(row) - yc;\r\n\t var ec = sc + cols[col][0] - 1;\r\n\t var er = sr + (cols[col][1] - 1);\r\n\t spans.push({\r\n\t s: {\r\n\t c: sc,\r\n\t r: sr\r\n\t },\r\n\t e: {\r\n\t c: ec,\r\n\t r: er\r\n\t }\r\n\t });\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (options.footer !== false) spans = getHeaderSpans(view, options, \"footer\", spans);\r\n\t }\r\n\r\n\t return spans;\r\n\t}\r\n\r\n\tfunction getHeaderSpans(view, options, group, spans) {\r\n\t var columns = view.config.columns;\r\n\t var delta = (options.docHeader ? 2 : 0) + (group == \"header\" ? 0 : (options.header !== false ? view._headers.length : 0) + view.count());\r\n\r\n\t for (var i = 0; i < columns.length; i++) {\r\n\t var header = columns[i][group];\r\n\r\n\t for (var h = 0; h < header.length; h++) {\r\n\t if (header[h] && (header[h].colspan || header[h].rowspan)) {\r\n\t spans.push({\r\n\t s: {\r\n\t c: i,\r\n\t r: h + delta\r\n\t },\r\n\t e: {\r\n\t c: i + (header[h].colspan || 1) - 1,\r\n\t r: h + (header[h].rowspan || 1) - 1 + delta\r\n\t }\r\n\t });\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return spans;\r\n\t}\r\n\r\n\tfunction getStyles(r, c, styles) {\r\n\t //row index, column index, styles array\r\n\t if (styles[r] && styles[r][c]) return styles[r][c];\r\n\t return \"\";\r\n\t}\r\n\r\n\tfunction getRowHeights(heights) {\r\n\t for (var i in heights) {\r\n\t heights[i] = {\r\n\t hpx: heights[i],\r\n\t hpt: heights[i] * 0.75\r\n\t };\r\n\t }\r\n\r\n\t return heights;\r\n\t}\r\n\r\n\tvar types = {\r\n\t number: \"n\",\r\n\t date: \"n\",\r\n\t string: \"s\",\r\n\t boolean: \"b\"\r\n\t};\r\n\tvar table = \"_table\";\r\n\r\n\tfunction getExcelData(data, scheme, spans, styles) {\r\n\t var ws = {};\r\n\t var range = {\r\n\t s: {\r\n\t c: 10000000,\r\n\t r: 10000000\r\n\t },\r\n\t e: {\r\n\t c: 0,\r\n\t r: 0\r\n\t }\r\n\t };\r\n\r\n\t for (var R = 0; R != data.length; ++R) {\r\n\t for (var C = 0; C != data[R].length; ++C) {\r\n\t if (range.s.r > R) range.s.r = R;\r\n\t if (range.s.c > C) range.s.c = C;\r\n\t if (range.e.r < R) range.e.r = R;\r\n\t if (range.e.c < C) range.e.c = C;\r\n\t var cell = {\r\n\t v: data[R][C]\r\n\t };\r\n\t if (cell.v === null) continue;\r\n\t var cell_ref = XLSX.utils.encode_cell({\r\n\t c: C,\r\n\t r: R\r\n\t }); //apply user params\r\n\r\n\t if (R >= scheme[0].header.length && cell.v.toString().charAt(0) != \"=\") {\r\n\t var column = scheme[C];\r\n\t if (column.type) cell.t = types[column.type] || \"\";\r\n\t if (column.format) cell.z = column.format;\r\n\t }\r\n\r\n\t if (cell.v instanceof Date) {\r\n\t cell.t = cell.t || \"n\";\r\n\t cell.z = cell.z || XLSX.SSF[table][14];\r\n\t cell.v = excelDate(cell.v);\r\n\t } else if (!cell.t) {\r\n\t if (typeof cell.v === \"boolean\") cell.t = \"b\";else if (typeof cell.v === \"number\" || cell.v && !isNaN(cell.v * 1)) {\r\n\t cell.v = cell.v * 1;\r\n\t cell.t = \"n\";\r\n\t } else if (cell.v.charAt(0) == \"=\") {\r\n\t cell.t = \"n\";\r\n\t cell.f = cell.v;\r\n\t delete cell.v;\r\n\t } else cell.t = \"s\";\r\n\t }\r\n\r\n\t if (styles) cell.s = getStyles(R, C, styles);\r\n\t ws[cell_ref] = cell;\r\n\t }\r\n\t }\r\n\r\n\t if (range.s.c < 10000000) ws[\"!ref\"] = XLSX.utils.encode_range(range);\r\n\t ws[\"!rows\"] = getRowHeights(scheme.heights);\r\n\t ws[\"!cols\"] = getColumnsWidths(scheme);\r\n\t if (spans.length) ws[\"!merges\"] = spans;\r\n\t return ws;\r\n\t}\r\n\r\n\tfunction str2array(s) {\r\n\t var buf = new ArrayBuffer(s.length);\r\n\t var view = new Uint8Array(buf);\r\n\r\n\t for (var i = 0; i != s.length; ++i) {\r\n\t view[i] = s.charCodeAt(i) & 0xFF;\r\n\t }\r\n\r\n\t return buf;\r\n\t}\r\n\r\n\tfunction getPdfData(scheme, data, options, callback) {\r\n\t options.header = isUndefined(options.header) || options.header === true ? {} : options.header;\r\n\t options.footer = isUndefined(options.footer) || options.footer === true ? {} : options.footer;\r\n\t options.table = options.table || {};\r\n\t var width = options.width || 595.296,\r\n\t height = options.height || 841.896; // default A4 size\r\n\r\n\t if (options.orientation && options.orientation === \"landscape\") height = [width, width = height][0];\r\n\r\n\t if (options.autowidth) {\r\n\t width = 80; //paddings\r\n\r\n\t for (var i = 0; i < scheme.length; i++) {\r\n\t width += scheme[i].width;\r\n\t }\r\n\t }\r\n\r\n\t var doc = new pdfjs.Document({\r\n\t padding: 40,\r\n\t font: options._export_font,\r\n\t threshold: 256,\r\n\t width: width,\r\n\t height: height\r\n\t }); //render table\r\n\r\n\t var h_count = options.header === false ? 0 : scheme[0].header.length;\r\n\t var f_count = options.footer === false || !scheme[0].footer ? 0 : scheme[0].footer.length;\r\n\t var colWidths = [];\r\n\r\n\t for (var _i8 = 0; _i8 < scheme.length; _i8++) {\r\n\t colWidths[_i8] = scheme[_i8].width;\r\n\t }\r\n\r\n\t var tableOps = exports.extend(options.table, {\r\n\t borderWidth: 1,\r\n\t height: 20,\r\n\t lineHeight: 1.1,\r\n\t borderColor: 0xEEEEEE,\r\n\t backgroundColor: 0xFFFFFF,\r\n\t color: 0x666666,\r\n\t textAlign: \"left\",\r\n\t paddingRight: 10,\r\n\t paddingLeft: 10,\r\n\t headerRows: h_count,\r\n\t widths: colWidths.length ? colWidths : [\"100%\"]\r\n\t });\r\n\t var table = doc.table(tableOps); //render table header\r\n\r\n\t if (h_count) {\r\n\t var headerOps = exports.extend(options.header, {\r\n\t borderRightColor: 0xB0CEE3,\r\n\t borderBottomColor: 0xB0CEE3,\r\n\t color: 0x4A4A4A,\r\n\t backgroundColor: 0xD2E3EF,\r\n\t height: 27,\r\n\t lineHeight: 1.2\r\n\t });\r\n\r\n\t for (var _i9 = 0; _i9 < h_count; _i9++) {\r\n\t var header = table.tr(headerOps);\r\n\r\n\t for (var s = 0; s < scheme.length; s++) {\r\n\t header.td(scheme[s].header[_i9].toString());\r\n\t }\r\n\t }\r\n\t } //render table data\r\n\r\n\r\n\t for (var r = 0; r < data.length; r++) {\r\n\t var row = table.tr({});\r\n\r\n\t for (var c = 0; c < data[r].length; c++) {\r\n\t row.td(data[r][c]);\r\n\t }\r\n\t } //render table footer\r\n\r\n\r\n\t if (f_count) {\r\n\t var footerOps = exports.extend(options.footer, {\r\n\t borderRightColor: 0xEEEEEE,\r\n\t borderBottomColor: 0xEEEEEE,\r\n\t backgroundColor: 0xFAFAFA,\r\n\t color: 0x666666,\r\n\t height: 27,\r\n\t lineHeight: 1.2\r\n\t });\r\n\r\n\t for (var _i10 = 0; _i10 < f_count; _i10++) {\r\n\t var footer = table.tr(footerOps);\r\n\r\n\t for (var _s = 0; _s < scheme.length; _s++) {\r\n\t footer.td(scheme[_s].footer[_i10].toString());\r\n\t }\r\n\t }\r\n\t } //doc footer\r\n\r\n\r\n\t if (options.docFooter !== false) {\r\n\t var ft = doc.footer();\r\n\t ft.text({\r\n\t color: 0x666666,\r\n\t textAlign: \"center\"\r\n\t }).append(i18n.dataExport.page || \"Page\").pageNumber().append(\" \" + (i18n.dataExport.of || \"of\") + \" \").pageCount();\r\n\t }\r\n\r\n\t var horder = {\r\n\t text: 0,\r\n\t image: 1\r\n\t }; //doc header, configurable\r\n\r\n\t if (options.docHeader) {\r\n\t if (typeof options.docHeader == \"string\") options.docHeader = {\r\n\t text: options.docHeader\r\n\t };\r\n\t exports.extend(options.docHeader, {\r\n\t color: 0x666666,\r\n\t textAlign: \"right\",\r\n\t order: 0\r\n\t });\r\n\t horder.text = options.docHeader.order;\r\n\t }\r\n\r\n\t if (options.docHeaderImage) {\r\n\t if (typeof options.docHeaderImage == \"string\") options.docHeaderImage = {\r\n\t url: options.docHeaderImage\r\n\t };\r\n\t exports.extend(options.docHeaderImage, {\r\n\t align: \"right\",\r\n\t order: 1\r\n\t });\r\n\t horder.image = options.docHeaderImage.order;\r\n\t }\r\n\r\n\t if (options.docHeader && horder.image > horder.text) doc.header({\r\n\t paddingBottom: 10\r\n\t }).text(options.docHeader.text, options.docHeader);\r\n\r\n\t if (options.docHeaderImage) {\r\n\t pdfjs.load(options.docHeaderImage.url, function (err, buffer) {\r\n\t if (!err) {\r\n\t var img = new pdfjs.Image(buffer);\r\n\t doc.header({\r\n\t paddingBottom: 10\r\n\t }).image(img, options.docHeaderImage);\r\n\t if (options.docHeader && horder.image < horder.text) doc.header({\r\n\t paddingBottom: 10\r\n\t }).text(options.docHeader.text, options.docHeader);\r\n\t } //render pdf and show in browser\r\n\r\n\r\n\t var pdf = doc.render();\r\n\t callback(pdf, options);\r\n\t });\r\n\t } else {\r\n\t //render pdf and show in browser\r\n\t var pdf = doc.render();\r\n\t callback(pdf, options);\r\n\t }\r\n\t}\r\n\r\n\tvar _webix_msg_cfg = null;\r\n\r\n\tfunction callback(config, result) {\r\n\t var usercall = config.callback;\r\n\t modality(false);\r\n\t config.box.parentNode.removeChild(config.box);\r\n\t _webix_msg_cfg = config.box = null;\r\n\t if (usercall) usercall(result, config.details);\r\n\t}\r\n\r\n\tfunction modal_key(e) {\r\n\t if (_webix_msg_cfg) {\r\n\t e = e || event$1;\r\n\t var code = e.which || event$1.keyCode;\r\n\r\n\t if (message.keyboard) {\r\n\t if (code == 13 || code == 32) callback(_webix_msg_cfg, true);\r\n\t if (code == 27) callback(_webix_msg_cfg, false);\r\n\t if (e.preventDefault) e.preventDefault();\r\n\t return !(e.cancelBubble = true);\r\n\t }\r\n\t }\r\n\t}\r\n\r\n\tevent$1(document, \"keydown\", modal_key, {\r\n\t capture: true\r\n\t});\r\n\r\n\tfunction modality(mode) {\r\n\t if (!modality.cover || !modality.cover.parentNode) {\r\n\t modality.cover = document.createElement(\"DIV\"); //necessary for IE only\r\n\r\n\t modality.cover.onkeydown = modal_key;\r\n\t modality.cover.className = \"webix_modal_cover\";\r\n\t document.body.appendChild(modality.cover);\r\n\t }\r\n\r\n\t modality.cover.style.display = mode ? \"inline-block\" : \"none\";\r\n\t}\r\n\r\n\tfunction button(text, result, className) {\r\n\t return \"
\" + text + \"
\";\r\n\t}\r\n\r\n\tfunction info(text) {\r\n\t if (!t.area) {\r\n\t t.area = document.createElement(\"DIV\");\r\n\t t.area.className = \"webix_message_area\";\r\n\t t.area.style[t.position] = \"5px\";\r\n\t document.body.appendChild(t.area);\r\n\t }\r\n\r\n\t t.area.setAttribute(\"role\", \"alert\");\r\n\t t.area.setAttribute(\"aria-atomic\", true);\r\n\t t.hide(text.id);\r\n\t var message = document.createElement(\"DIV\");\r\n\t message.innerHTML = \"
\" + text.text + \"
\";\r\n\t message.className = \"webix_info webix_\" + text.type;\r\n\r\n\t message.onclick = function () {\r\n\t t.hide(text.id);\r\n\t text = null;\r\n\t };\r\n\t if (t.position == \"bottom\" && t.area.firstChild) t.area.insertBefore(message, t.area.firstChild);else t.area.appendChild(message);\r\n\t if (text.expire > 0) t.timers[text.id] = window.setTimeout(function () {\r\n\t t.hide(text.id);\r\n\t }, text.expire); //styling for animation\r\n\r\n\t message.style.height = message.offsetHeight - 2 + \"px\";\r\n\t t.pull[text.id] = message;\r\n\t message = null;\r\n\t return text.id;\r\n\t}\r\n\r\n\tfunction _boxStructure(config, ok, cancel) {\r\n\t var box = document.createElement(\"DIV\");\r\n\t box.className = \" webix_modal_box webix_\" + config.type;\r\n\t box.setAttribute(\"webixbox\", 1);\r\n\t box.setAttribute(\"role\", \"alertdialog\");\r\n\t box.setAttribute(\"aria-label\", config.title || \"\");\r\n\t box.setAttribute(\"tabindex\", \"0\");\r\n\t var inner = \"\";\r\n\t if (config.width) box.style.width = config.width + (rules.isNumber(config.width) ? \"px\" : \"\");\r\n\t if (config.height) box.style.height = config.height + (rules.isNumber(config.height) ? \"px\" : \"\");\r\n\t if (config.title) inner += \"
\" + config.title + \"
\";\r\n\t inner += \"
\" + (config.content ? \"\" : config.text) + \"
\";\r\n\t if (ok || config.ok) inner += button(config.ok || i18n.message.ok, true, \"confirm\");\r\n\t if (cancel || config.cancel) inner += button(config.cancel || i18n.message.cancel, false);\r\n\r\n\t if (config.buttons) {\r\n\t for (var i = 0; i < config.buttons.length; i++) {\r\n\t inner += button(config.buttons[i], i);\r\n\t }\r\n\t }\r\n\r\n\t inner += \"
\";\r\n\t box.innerHTML = inner;\r\n\r\n\t if (config.content) {\r\n\t var node = config.content;\r\n\t if (typeof node == \"string\") node = document.getElementById(node);\r\n\t if (node.style.display == \"none\") node.style.display = \"\";\r\n\t box.childNodes[config.title ? 1 : 0].appendChild(node);\r\n\t }\r\n\r\n\t box.onclick = function (e) {\r\n\t e = e || event$1;\r\n\t var source = e.target || e.srcElement;\r\n\t if (!source.className) source = source.parentNode;\r\n\r\n\t if (source.className.indexOf(\"webix_popup_button\") != -1) {\r\n\t var result = source.getAttribute(\"result\");\r\n\t result = result == \"true\" || (result == \"false\" ? false : result);\r\n\t callback(config, result);\r\n\t }\r\n\r\n\t e.cancelBubble = true;\r\n\t };\r\n\r\n\t config.box = box;\r\n\t if (ok || cancel || config.buttons) _webix_msg_cfg = config;\r\n\t return box;\r\n\t}\r\n\r\n\tfunction _createBox(config, ok, cancel) {\r\n\t var box = config.tagName ? config : _boxStructure(config, ok, cancel);\r\n\t if (!config.hidden) modality(true);\r\n\t toNode(config.container || document.body).appendChild(box);\r\n\t var x = config.left || Math.abs(Math.floor(((window.innerWidth || document.documentElement.offsetWidth) - box.offsetWidth) / 2));\r\n\t var y = config.top || Math.abs(Math.floor(((window.innerHeight || document.documentElement.offsetHeight) - box.offsetHeight) / 2));\r\n\t if (config.position == \"top\") box.style.top = \"-3px\";else box.style.top = y + \"px\";\r\n\t box.style.left = x + \"px\"; //necessary for IE only\r\n\r\n\t box.onkeydown = modal_key;\r\n\t box.focus();\r\n\t if (config.hidden) modalbox.hide(box);\r\n\t return box;\r\n\t}\r\n\r\n\tfunction alertPopup(config) {\r\n\t return _createBox(config, true, false);\r\n\t}\r\n\r\n\tfunction confirmPopup(config) {\r\n\t return _createBox(config, true, true);\r\n\t}\r\n\r\n\tfunction boxPopup(config) {\r\n\t return _createBox(config);\r\n\t}\r\n\r\n\tfunction box_params(text, type, callback) {\r\n\t if (_typeof(text) != \"object\") {\r\n\t if (typeof type == \"function\") {\r\n\t callback = type;\r\n\t type = \"\";\r\n\t }\r\n\r\n\t text = {\r\n\t text: text,\r\n\t type: type,\r\n\t callback: callback\r\n\t };\r\n\t }\r\n\r\n\t return text;\r\n\t}\r\n\r\n\tfunction params(text, type, expire, id) {\r\n\t if (_typeof(text) != \"object\") text = {\r\n\t text: text,\r\n\t type: type,\r\n\t expire: expire,\r\n\t id: id\r\n\t };\r\n\t text.id = text.id || t.uid();\r\n\t text.expire = text.expire || t.expire;\r\n\t return text;\r\n\t}\r\n\r\n\tfunction alert() {\r\n\t var text = box_params.apply(this, arguments);\r\n\t text.type = text.type || \"confirm\";\r\n\t return alertPopup(text);\r\n\t}\r\n\tfunction confirm() {\r\n\t var text = box_params.apply(this, arguments);\r\n\t text.type = text.type || \"alert\";\r\n\t return confirmPopup(text);\r\n\t}\r\n\tfunction modalbox() {\r\n\t var text = box_params.apply(this, arguments);\r\n\t text.type = text.type || \"alert\";\r\n\t return boxPopup(text);\r\n\t}\r\n\r\n\tmodalbox.hide = function (node) {\r\n\t if (node) {\r\n\t while (node && node.getAttribute && !node.getAttribute(\"webixbox\")) {\r\n\t node = node.parentNode;\r\n\t }\r\n\r\n\t if (node) {\r\n\t node.parentNode.removeChild(node);\r\n\t }\r\n\t }\r\n\r\n\t modality(false);\r\n\t _webix_msg_cfg = null;\r\n\t};\r\n\r\n\tfunction message(text, type, expire, id) {\r\n\t //eslint-disable-line\r\n\t text = params.apply(this, arguments);\r\n\t text.type = text.type || \"info\";\r\n\t var subtype = text.type.split(\"-\")[0];\r\n\r\n\t switch (subtype) {\r\n\t case \"alert\":\r\n\t return alertPopup(text);\r\n\r\n\t case \"confirm\":\r\n\t return confirmPopup(text);\r\n\r\n\t case \"modalbox\":\r\n\t return boxPopup(text);\r\n\r\n\t default:\r\n\t return info(text);\r\n\t }\r\n\t}\r\n\tvar t = message;\r\n\tt.seed = new Date().valueOf();\r\n\r\n\tt.uid = function () {\r\n\t return t.seed++;\r\n\t};\r\n\r\n\tt.expire = 4000;\r\n\tt.keyboard = true;\r\n\tt.position = \"top\";\r\n\tt.pull = {};\r\n\tt.timers = {};\r\n\r\n\tt.hideAll = function () {\r\n\t for (var key in t.pull) {\r\n\t t.hide(key);\r\n\t }\r\n\t};\r\n\r\n\tt.hide = function (id) {\r\n\t var obj = t.pull[id];\r\n\r\n\t if (obj && obj.parentNode) {\r\n\t window.setTimeout(function () {\r\n\t obj.parentNode.removeChild(obj);\r\n\t obj = null;\r\n\t }, 2000); //styling for animation\r\n\r\n\t obj.style.height = 0;\r\n\t obj.className += \" hidden\";\r\n\t t.area.removeAttribute(\"role\");\r\n\t if (t.timers[id]) window.clearTimeout(t.timers[id]);\r\n\t delete t.pull[id];\r\n\t }\r\n\t}; //override circualr dependencies\r\n\r\n\r\n\tdefine(\"message\", message);\r\n\r\n\tfunction editStop() {\r\n\t callEvent(\"onEditEnd\", []);\r\n\t}\r\n\r\n\tvar en = {\r\n\t groupDelimiter: \",\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \".\",\r\n\t decimalSize: 2,\r\n\t dateFormat: \"%m/%d/%Y\",\r\n\t timeFormat: \"%h:%i %A\",\r\n\t longDateFormat: \"%d %F %Y\",\r\n\t fullDateFormat: \"%m/%d/%Y %h:%i %A\",\r\n\t am: [\"am\", \"AM\"],\r\n\t pm: [\"pm\", \"PM\"],\r\n\t price: \"${obj}\",\r\n\t priceSettings: {\r\n\t groupDelimiter: \",\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \".\",\r\n\t decimalSize: 2\r\n\t },\r\n\t fileSize: [\"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\", \"Pb\", \"Eb\"],\r\n\t calendar: {\r\n\t monthFull: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\r\n\t monthShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\r\n\t dayFull: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\r\n\t dayShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\r\n\t hours: \"Hours\",\r\n\t minutes: \"Minutes\",\r\n\t done: \"Done\",\r\n\t clear: \"Clear\",\r\n\t today: \"Today\"\r\n\t },\r\n\t dataExport: {\r\n\t page: \"Page\",\r\n\t of: \"of\"\r\n\t },\r\n\t PDFviewer: {\r\n\t of: \"of\",\r\n\t automaticZoom: \"Automatic Zoom\",\r\n\t actualSize: \"Actual Size\",\r\n\t pageFit: \"Page Fit\",\r\n\t pageWidth: \"Page Width\",\r\n\t pageHeight: \"Page Height\"\r\n\t },\r\n\t aria: {\r\n\t calendar: \"Calendar\",\r\n\t increaseValue: \"Increase value\",\r\n\t decreaseValue: \"Decrease value\",\r\n\t navMonth: [\"Previous month\", \"Next month\"],\r\n\t navYear: [\"Previous year\", \"Next year\"],\r\n\t navDecade: [\"Previous decade\", \"Next decade\"],\r\n\t dateFormat: \"%d %F %Y\",\r\n\t monthFormat: \"%F %Y\",\r\n\t yearFormat: \"%Y\",\r\n\t hourFormat: \"Hours: %h %A\",\r\n\t minuteFormat: \"Minutes: %i\",\r\n\t removeItem: \"Remove item\",\r\n\t pages: [\"First page\", \"Previous page\", \"Next page\", \"Last page\"],\r\n\t page: \"Page\",\r\n\t headermenu: \"Header menu\",\r\n\t openGroup: \"Open column group\",\r\n\t closeGroup: \"Close column group\",\r\n\t closeTab: \"Close tab\",\r\n\t showTabs: \"Show more tabs\",\r\n\t resetTreeMap: \"Reset tree map\",\r\n\t navTreeMap: \"Level up\",\r\n\t nextTab: \"Next tab\",\r\n\t prevTab: \"Previous tab\",\r\n\t multitextSection: \"Add section\",\r\n\t multitextextraSection: \"Remove section\",\r\n\t showChart: \"Show chart\",\r\n\t hideChart: \"Hide chart\",\r\n\t resizeChart: \"Resize chart\"\r\n\t },\r\n\t richtext: {\r\n\t underline: \"Underline\",\r\n\t bold: \"Bold\",\r\n\t italic: \"Italic\"\r\n\t },\r\n\t combo: {\r\n\t select: \"Select\",\r\n\t selectAll: \"Select all\",\r\n\t unselectAll: \"Unselect all\"\r\n\t },\r\n\t message: {\r\n\t ok: \"OK\",\r\n\t cancel: \"Cancel\"\r\n\t }\r\n\t};\r\n\r\n\tvar wDate = {\r\n\t startOnMonday: false,\r\n\t toFixed: function toFixed(num, ms) {\r\n\t if (num < 10) num = \"0\" + num;\r\n\t if (ms && num < 100) num = \"0\" + num;\r\n\t return num;\r\n\t },\r\n\t weekStart: function weekStart(date) {\r\n\t date = this.copy(date);\r\n\t var shift = date.getDay();\r\n\r\n\t if (this.startOnMonday) {\r\n\t if (shift === 0) shift = 6;else shift--;\r\n\t }\r\n\r\n\t return this.datePart(this.add(date, -1 * shift, \"day\"));\r\n\t },\r\n\t monthStart: function monthStart(date) {\r\n\t date = this.copy(date);\r\n\t date.setDate(1);\r\n\t return this.datePart(date);\r\n\t },\r\n\t yearStart: function yearStart(date) {\r\n\t date = this.copy(date);\r\n\t date.setMonth(0);\r\n\t return this.monthStart(date);\r\n\t },\r\n\t dayStart: function dayStart(date) {\r\n\t return this.datePart(date, true);\r\n\t },\r\n\t dateToStr: function dateToStr(format, utc) {\r\n\t if (typeof format == \"function\") return format;\r\n\r\n\t if (env.strict) {\r\n\t return function (date) {\r\n\t var str = \"\";\r\n\t var lastPos = 0;\r\n\t format.replace(/%[a-zA-Z]/g, function (s, pos) {\r\n\t str += format.slice(lastPos, pos);\r\n\r\n\t var fn = function fn(date) {\r\n\t if (s == \"%d\") return wDate.toFixed(date.getDate());\r\n\t if (s == \"%m\") return wDate.toFixed(date.getMonth() + 1);\r\n\t if (s == \"%j\") return date.getDate();\r\n\t if (s == \"%n\") return date.getMonth() + 1;\r\n\t if (s == \"%y\") return wDate.toFixed(date.getFullYear() % 100);\r\n\t if (s == \"%Y\") return date.getFullYear();\r\n\t if (s == \"%D\") return i18n.calendar.dayShort[date.getDay()];\r\n\t if (s == \"%l\") return i18n.calendar.dayFull[date.getDay()];\r\n\t if (s == \"%M\") return i18n.calendar.monthShort[date.getMonth()];\r\n\t if (s == \"%F\") return i18n.calendar.monthFull[date.getMonth()];\r\n\t if (s == \"%h\") return wDate.toFixed((date.getHours() + 11) % 12 + 1);\r\n\t if (s == \"%g\") return (date.getHours() + 11) % 12 + 1;\r\n\t if (s == \"%G\") return date.getHours();\r\n\t if (s == \"%H\") return wDate.toFixed(date.getHours());\r\n\t if (s == \"%i\") return wDate.toFixed(date.getMinutes());\r\n\t if (s == \"%a\") return date.getHours() > 11 ? i18n.pm[0] : i18n.am[0];\r\n\t if (s == \"%A\") return date.getHours() > 11 ? i18n.pm[1] : i18n.am[1];\r\n\t if (s == \"%s\") return wDate.toFixed(date.getSeconds());\r\n\t if (s == \"%S\") return wDate.toFixed(date.getMilliseconds(), true);\r\n\t if (s == \"%W\") return wDate.toFixed(Date.getISOWeek(date));\r\n\r\n\t if (s == \"%c\") {\r\n\t var str = date.getFullYear();\r\n\t str += \"-\" + wDate.toFixed(date.getMonth() + 1);\r\n\t str += \"-\" + wDate.toFixed(date.getDate());\r\n\t str += \"T\";\r\n\t str += wDate.toFixed(date.getHours());\r\n\t str += \":\" + wDate.toFixed(date.getMinutes());\r\n\t str += \":\" + wDate.toFixed(date.getSeconds());\r\n\t return str;\r\n\t }\r\n\r\n\t return s;\r\n\t };\r\n\r\n\t str += fn(date);\r\n\t lastPos = pos + 2;\r\n\t });\r\n\t str += format.slice(lastPos, format.length);\r\n\t return str;\r\n\t };\r\n\t }\r\n\r\n\t format = format.replace(/%[a-zA-Z]/g, function (a) {\r\n\t switch (a) {\r\n\t case \"%d\":\r\n\t return \"\\\"+wDate.toFixed(date.getDate())+\\\"\";\r\n\r\n\t case \"%m\":\r\n\t return \"\\\"+wDate.toFixed((date.getMonth()+1))+\\\"\";\r\n\r\n\t case \"%j\":\r\n\t return \"\\\"+date.getDate()+\\\"\";\r\n\r\n\t case \"%n\":\r\n\t return \"\\\"+(date.getMonth()+1)+\\\"\";\r\n\r\n\t case \"%y\":\r\n\t return \"\\\"+wDate.toFixed(date.getFullYear()%100)+\\\"\";\r\n\r\n\t case \"%Y\":\r\n\t return \"\\\"+date.getFullYear()+\\\"\";\r\n\r\n\t case \"%D\":\r\n\t return \"\\\"+i18n.calendar.dayShort[date.getDay()]+\\\"\";\r\n\r\n\t case \"%l\":\r\n\t return \"\\\"+i18n.calendar.dayFull[date.getDay()]+\\\"\";\r\n\r\n\t case \"%M\":\r\n\t return \"\\\"+i18n.calendar.monthShort[date.getMonth()]+\\\"\";\r\n\r\n\t case \"%F\":\r\n\t return \"\\\"+i18n.calendar.monthFull[date.getMonth()]+\\\"\";\r\n\r\n\t case \"%h\":\r\n\t return \"\\\"+wDate.toFixed((date.getHours()+11)%12+1)+\\\"\";\r\n\r\n\t case \"%g\":\r\n\t return \"\\\"+((date.getHours()+11)%12+1)+\\\"\";\r\n\r\n\t case \"%G\":\r\n\t return \"\\\"+date.getHours()+\\\"\";\r\n\r\n\t case \"%H\":\r\n\t return \"\\\"+wDate.toFixed(date.getHours())+\\\"\";\r\n\r\n\t case \"%i\":\r\n\t return \"\\\"+wDate.toFixed(date.getMinutes())+\\\"\";\r\n\r\n\t case \"%a\":\r\n\t return \"\\\"+(date.getHours()>11?i18n.pm[0]:i18n.am[0])+\\\"\";\r\n\r\n\t case \"%A\":\r\n\t return \"\\\"+(date.getHours()>11?i18n.pm[1]:i18n.am[1])+\\\"\";\r\n\r\n\t case \"%s\":\r\n\t return \"\\\"+wDate.toFixed(date.getSeconds())+\\\"\";\r\n\r\n\t case \"%S\":\r\n\t return \"\\\"+wDate.toFixed(date.getMilliseconds(), true)+\\\"\";\r\n\r\n\t case \"%W\":\r\n\t return \"\\\"+wDate.toFixed(wDate.getISOWeek(date))+\\\"\";\r\n\r\n\t case \"%c\":\r\n\t var str = \"\\\"+date.getFullYear()+\\\"\";\r\n\t str += \"-\\\"+wDate.toFixed((date.getMonth()+1))+\\\"\";\r\n\t str += \"-\\\"+wDate.toFixed(date.getDate())+\\\"\";\r\n\t str += \"T\";\r\n\t str += \"\\\"+wDate.toFixed(date.getHours())+\\\"\";\r\n\t str += \":\\\"+wDate.toFixed(date.getMinutes())+\\\"\";\r\n\t str += \":\\\"+wDate.toFixed(date.getSeconds())+\\\"\";\r\n\t if (utc === true) str += \"Z\";\r\n\t return str;\r\n\r\n\t default:\r\n\t return a;\r\n\t }\r\n\t });\r\n\t if (utc === true) format = format.replace(/date\\.get/g, \"date.getUTC\");\r\n\t var temp = new Function(\"date\", \"i18n\", \"wDate\", \"if (!date) return ''; if (!date.getMonth) date=i18n.parseFormatDate(date); return \\\"\" + format + \"\\\";\");\r\n\t return function (v) {\r\n\t return temp(v, i18n, wDate);\r\n\t };\r\n\t },\r\n\t strToDate: function strToDate(format, utc) {\r\n\t if (typeof format == \"function\") return format;\r\n\t var mask = format.match(/%[a-zA-Z]/g);\r\n\t var splt = \"var temp=date.split(/[^0-9a-zA-Z]+/g);\";\r\n\t var i, t, s;\r\n\r\n\t if (!i18n.calendar.monthShort_hash) {\r\n\t s = i18n.calendar.monthShort;\r\n\t t = i18n.calendar.monthShort_hash = {};\r\n\r\n\t for (i = 0; i < s.length; i++) {\r\n\t t[s[i]] = i;\r\n\t }\r\n\r\n\t s = i18n.calendar.monthFull;\r\n\t t = i18n.calendar.monthFull_hash = {};\r\n\r\n\t for (i = 0; i < s.length; i++) {\r\n\t t[s[i]] = i;\r\n\t }\r\n\t }\r\n\r\n\t if (env.strict) {\r\n\t return function (date) {\r\n\t if (!date) return \"\";\r\n\t if (_typeof(date) == \"object\") return date;\r\n\t var temp = date.split(/[^0-9a-zA-Z]+/g);\r\n\t var set = [0, 0, 1, 0, 0, 0, 0];\r\n\r\n\t for (i = 0; i < mask.length; i++) {\r\n\t var a = mask[i];\r\n\t if (a == \"%y\") set[0] = temp[i] * 1 + (temp[i] > 30 ? 1900 : 2000);else if (a == \"%Y\") {\r\n\t set[0] = (temp[i] || 0) * 1;\r\n\t if (set[0] < 30) set[0] += 2000;\r\n\t } else if (a == \"%n\" || a == \"%m\") set[1] = (temp[i] || 1) - 1;else if (a == \"%M\") set[1] = i18n.calendar.monthShort_hash[temp[i]] || 0;else if (a == \"%F\") set[1] = i18n.calendar.monthFull_hash[temp[i]] || 0;else if (a == \"%j\" || a == \"%d\") set[2] = temp[i] || 1;else if (a == \"%g\" || a == \"%G\" || a == \"%h\" || a == \"%H\") set[3] = temp[i] || 0;else if (a == \"%a\") set[3] = set[3] % 12 + ((temp[i] || \"\") == i18n.am[0] ? 0 : 12);else if (a == \"%A\") set[3] = set[3] % 12 + ((temp[i] || \"\") == i18n.am[1] ? 0 : 12);else if (a == \"%i\") set[4] = temp[i] || 0;else if (a == \"%s\") set[5] = temp[i] || 0;else if (a == \"%S\") set[6] = temp[i] || 0;else if (a == \"%c\") {\r\n\t var reg = /(\\d+)-(\\d+)-(\\d+)T(\\d+):(\\d+):(\\d+)(\\+.*|)/g;\r\n\t var res = reg.exec(date);\r\n\t set[0] = (res[1] || 0) * 1;\r\n\t if (set[0] < 30) set[0] += 2000;\r\n\t set[1] = (res[2] || 1) - 1;\r\n\t set[2] = res[3] || 1;\r\n\t set[3] = res[4] || 0;\r\n\t set[4] = res[5] || 0;\r\n\t set[5] = res[6] || 0;\r\n\t }\r\n\t }\r\n\r\n\t if (utc) return new Date(Date.UTC(set[0], set[1], set[2], set[3], set[4], set[5], set[6]));\r\n\t return new Date(set[0], set[1], set[2], set[3], set[4], set[5], set[6]);\r\n\t };\r\n\t }\r\n\r\n\t for (i = 0; i < mask.length; i++) {\r\n\t switch (mask[i]) {\r\n\t case \"%j\":\r\n\t case \"%d\":\r\n\t splt += \"set[2]=temp[\" + i + \"]||1;\";\r\n\t break;\r\n\r\n\t case \"%n\":\r\n\t case \"%m\":\r\n\t splt += \"set[1]=(temp[\" + i + \"]||1)-1;\";\r\n\t break;\r\n\r\n\t case \"%y\":\r\n\t splt += \"set[0]=temp[\" + i + \"]*1+(temp[\" + i + \"]>30?1900:2000);\";\r\n\t break;\r\n\r\n\t case \"%g\":\r\n\t case \"%G\":\r\n\t case \"%h\":\r\n\t case \"%H\":\r\n\t splt += \"set[3]=temp[\" + i + \"]||0;\";\r\n\t break;\r\n\r\n\t case \"%i\":\r\n\t splt += \"set[4]=temp[\" + i + \"]||0;\";\r\n\t break;\r\n\r\n\t case \"%Y\":\r\n\t splt += \"set[0]=(temp[\" + i + \"]||0)*1; if (set[0]<30) set[0]+=2000;\";\r\n\t break;\r\n\r\n\t case \"%a\":\r\n\t splt += \"set[3]=set[3]%12+(temp[\" + i + \"]==i18n.am[0]?0:12);\";\r\n\t break;\r\n\r\n\t case \"%A\":\r\n\t splt += \"set[3]=set[3]%12+(temp[\" + i + \"]==i18n.am[1]?0:12);\";\r\n\t break;\r\n\r\n\t case \"%s\":\r\n\t splt += \"set[5]=temp[\" + i + \"]||0;\";\r\n\t break;\r\n\r\n\t case \"%S\":\r\n\t splt += \"set[6]=temp[\" + i + \"]||0;\";\r\n\t break;\r\n\r\n\t case \"%M\":\r\n\t splt += \"set[1]=i18n.calendar.monthShort_hash[temp[\" + i + \"]]||0;\";\r\n\t break;\r\n\r\n\t case \"%F\":\r\n\t splt += \"set[1]=i18n.calendar.monthFull_hash[temp[\" + i + \"]]||0;\";\r\n\t break;\r\n\r\n\t case \"%c\":\r\n\t splt += \"var res = date.split('T');\";\r\n\t splt += \"if(res[0]){ var d = res[0].split('-');\";\r\n\t splt += \"set[0]= (d[0]||0)*1; if (set[0]<30) set[0]+=2000;\";\r\n\t splt += \"set[1]= (d[1]||1)-1;\";\r\n\t splt += \"set[2]= d[2]||1;}\";\r\n\t splt += \"if(res[1]){ var t = res[1].split(':');\";\r\n\t splt += \"set[3]= t[0]||0;\";\r\n\t splt += \"set[4]= t[1]||0;\";\r\n\t splt += \"set[5]= parseInt(t[2])||0;}\";\r\n\t break;\r\n\r\n\t default:\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t var code = \"set[0],set[1],set[2],set[3],set[4],set[5], set[6]\";\r\n\t if (utc) code = \" Date.UTC(\" + code + \")\";\r\n\t var temp = new Function(\"date\", \"i18n\", \"if (!date) return ''; if (typeof date == 'object') return date; var set=[0,0,1,0,0,0,0]; \" + splt + \" return new Date(\" + code + \");\");\r\n\t return function (v) {\r\n\t return temp(v, i18n);\r\n\t };\r\n\t },\r\n\t getISOWeek: function getISOWeek(ndate) {\r\n\t if (!ndate) return false;\r\n\t var nday = ndate.getDay();\r\n\r\n\t if (nday === 0) {\r\n\t nday = 7;\r\n\t }\r\n\r\n\t var first_thursday = new Date(ndate.valueOf());\r\n\t first_thursday.setDate(ndate.getDate() + (4 - nday));\r\n\t var year_number = first_thursday.getFullYear(); // year of the first Thursday\r\n\r\n\t var ordinal_date = Math.floor((first_thursday.getTime() - new Date(year_number, 0, 1).getTime()) / 86400000); //ordinal date of the first Thursday - 1 (so not really ordinal date)\r\n\r\n\t var weekNumber = 1 + Math.floor(ordinal_date / 7);\r\n\t return weekNumber;\r\n\t },\r\n\t getUTCISOWeek: function getUTCISOWeek(ndate) {\r\n\t return this.getISOWeek(ndate);\r\n\t },\r\n\t _correctDate: function _correctDate(d, d0, inc, checkFunc) {\r\n\t if (!inc) return;\r\n\t var incorrect = checkFunc(d, d0);\r\n\r\n\t if (incorrect) {\r\n\t var i = inc > 0 ? 1 : -1;\r\n\r\n\t while (incorrect) {\r\n\t d.setHours(d.getHours() + i);\r\n\t incorrect = checkFunc(d, d0);\r\n\t i += inc > 0 ? 1 : -1;\r\n\t }\r\n\t }\r\n\t },\r\n\t add: function add(date, inc, mode, copy) {\r\n\t if (copy) date = this.copy(date);\r\n\t var d = wDate.copy(date);\r\n\r\n\t switch (mode) {\r\n\t case \"day\":\r\n\t date.setDate(date.getDate() + inc);\r\n\r\n\t this._correctDate(date, d, inc, function (d, d0) {\r\n\t return wDate.datePart(d0, true).valueOf() == wDate.datePart(d, true).valueOf();\r\n\t });\r\n\r\n\t break;\r\n\r\n\t case \"week\":\r\n\t date.setDate(date.getDate() + 7 * inc);\r\n\r\n\t this._correctDate(date, d, 7 * inc, function (d, d0) {\r\n\t return wDate.datePart(d0, true).valueOf() == wDate.datePart(d, true).valueOf();\r\n\t });\r\n\r\n\t break;\r\n\r\n\t case \"month\":\r\n\t date.setMonth(date.getMonth() + inc);\r\n\r\n\t this._correctDate(date, d, inc, function (d, d0) {\r\n\t return d0.getMonth() == d.getMonth() && d0.getYear() == d.getYear();\r\n\t });\r\n\r\n\t break;\r\n\r\n\t case \"year\":\r\n\t date.setYear(date.getFullYear() + inc);\r\n\r\n\t this._correctDate(date, d, inc, function (d, d0) {\r\n\t return d0.getFullYear() == d.getFullYear();\r\n\t });\r\n\r\n\t break;\r\n\r\n\t case \"hour\":\r\n\t date.setHours(date.getHours() + inc);\r\n\r\n\t this._correctDate(date, d, inc, function (d, d0) {\r\n\t return d0.getHours() == d.getHours() && Date.datePart(d0, true) == Date.datePart(d, true);\r\n\t });\r\n\r\n\t break;\r\n\r\n\t case \"minute\":\r\n\t date.setMinutes(date.getMinutes() + inc);\r\n\t break;\r\n\r\n\t default:\r\n\t wDate.add[mode](date, inc, mode);\r\n\t break;\r\n\t }\r\n\r\n\t return date;\r\n\t },\r\n\t datePart: function datePart(date, copy) {\r\n\t if (copy) date = this.copy(date); // workaround for non-existent hours\r\n\r\n\t var d = this.copy(date);\r\n\t d.setHours(0);\r\n\r\n\t if (d.getDate() != date.getDate()) {\r\n\t date.setHours(1);\r\n\t } else {\r\n\t date.setHours(0);\r\n\t }\r\n\r\n\t date.setMinutes(0);\r\n\t date.setSeconds(0);\r\n\t date.setMilliseconds(0);\r\n\t return date;\r\n\t },\r\n\t timePart: function timePart(date, copy) {\r\n\t if (copy) date = this.copy(date);\r\n\t return (date.valueOf() / 1000 - date.getTimezoneOffset() * 60) % 86400;\r\n\t },\r\n\t copy: function copy(date) {\r\n\t return new Date(date.valueOf());\r\n\t },\r\n\t equal: function equal(a, b) {\r\n\t if (!a || !b) return false;\r\n\t return a.valueOf() === b.valueOf();\r\n\t },\r\n\t isHoliday: function isHoliday(day) {\r\n\t day = day.getDay();\r\n\t if (day === 0 || day == 6) return \"webix_cal_event\";\r\n\t }\r\n\t};\r\n\r\n\tvar Number = {\r\n\t getConfig: function getConfig(value) {\r\n\t var config = {\r\n\t decimalSize: 0,\r\n\t groupSize: 999,\r\n\t prefix: \"\",\r\n\t sufix: \"\"\r\n\t };\r\n\t var parts = value.split(/[0-9].*[0-9]/g);\r\n\t if (parts[0].length) config.prefix = parts[0];\r\n\t if (parts[1].length) config.sufix = parts[1];\r\n\r\n\t if (config.prefix || config.sufix) {\r\n\t value = value.substr(config.prefix.length, value.length - config.prefix.length - config.sufix.length);\r\n\t }\r\n\r\n\t var num = value.indexOf(\"1\");\r\n\r\n\t if (num > 0) {\r\n\t config.prefix = value.substr(0, num);\r\n\t value = value.substr(num);\r\n\t }\r\n\r\n\t var dot = value.indexOf(\"0\");\r\n\r\n\t if (dot > 0) {\r\n\t config.decimalSize = value.length - dot;\r\n\t config.decimalDelimiter = value[dot - 1];\r\n\t value = value.substr(0, dot - 1);\r\n\t }\r\n\r\n\t var sep = value.match(/[^0-9]/);\r\n\r\n\t if (sep) {\r\n\t config.groupSize = value.length - sep.index - 1;\r\n\t config.groupDelimiter = value[sep.index];\r\n\t }\r\n\r\n\t return config;\r\n\t },\r\n\t parse: function parse(value, config) {\r\n\t if (!value || typeof value !== \"string\") return value;\r\n\t if (config.prefix) value = value.toLowerCase().replace(config.prefix.toLowerCase() || \"\", \"\");\r\n\t if (config.sufix) value = value.toLowerCase().replace(config.sufix.toLowerCase() || \"\", \"\");\r\n\t var decimal = \"\";\r\n\r\n\t if (config.decimalDelimiter) {\r\n\t var ind = value.indexOf(config.decimalDelimiter);\r\n\r\n\t if (ind > -1) {\r\n\t decimal = value.substr(ind + 1).replace(/[^0-9]/g, \"\");\r\n\t decimal = decimal.substr(0, Math.min(decimal.length, config.decimalSize));\r\n\t value = value.substr(0, ind);\r\n\t }\r\n\t }\r\n\r\n\t var sign = value[0] === \"-\" ? -1 : 1;\r\n\t value = value.replace(/[^0-9]/g, \"\");\r\n\t if (!value) value = \"0\";\r\n\t if (decimal) value += \".\" + decimal;\r\n\t return parseFloat(value) * sign;\r\n\t },\r\n\t format: function format(value, config) {\r\n\t if (value === \"\" || typeof value === \"undefined\") return value;\r\n\t config = config || i18n;\r\n\t value = parseFloat(value);\r\n\t var sign = value < 0 ? \"-\" : \"\";\r\n\t value = Math.abs(value);\r\n\t if (!config.decimalOptional) value = value.toFixed(config.decimalSize);\r\n\t var str = value.toString();\r\n\t str = str.split(\".\");\r\n\t var int_value = \"\";\r\n\r\n\t if (config.groupSize) {\r\n\t var step = config.groupSize;\r\n\t var i = str[0].length;\r\n\r\n\t do {\r\n\t i -= step;\r\n\t var chunk = i > 0 ? str[0].substr(i, step) : str[0].substr(0, step + i);\r\n\t int_value = chunk + (int_value ? config.groupDelimiter + int_value : \"\");\r\n\t } while (i > 0);\r\n\t } else int_value = str[0];\r\n\r\n\t if (config.decimalSize) str = sign + int_value + (str[1] ? config.decimalDelimiter + str[1] : \"\");else str = sign + int_value;\r\n\r\n\t if (config.prefix || config.sufix) {\r\n\t return config.prefix + str + config.sufix;\r\n\t } else return str;\r\n\t },\r\n\t numToStr: function numToStr(config) {\r\n\t return function (value) {\r\n\t return Number.format(value, config);\r\n\t };\r\n\t }\r\n\t};\r\n\r\n\tfunction extend(base, source) {\r\n\t for (var method in source) {\r\n\t if (_typeof(source[method]) == \"object\" && !isArray(source[method])) {\r\n\t if (!base[method]) {\r\n\t base[method] = {};\r\n\t }\r\n\r\n\t extend(base[method], source[method]);\r\n\t } else base[method] = source[method];\r\n\t }\r\n\t}\r\n\r\n\tvar helpers = [\"fullDateFormat\", \"timeFormat\", \"dateFormat\", \"longDateFormat\", \"parseFormat\", \"parseTimeFormat\"];\r\n\r\n\ti18n.setLocale = function (locale) {\r\n\t if (typeof locale == \"string\") locale = i18n.locales[locale];\r\n\r\n\t if (locale) {\r\n\t locale.priceSettings = copy(locale.priceSettings || locale);\r\n\t extend(i18n, locale);\r\n\t }\r\n\r\n\t for (var i = 0; i < helpers.length; i++) {\r\n\t var key = helpers[i];\r\n\t var utc = i18n[key + \"UTC\"];\r\n\t i18n[key + \"Str\"] = wDate.dateToStr(i18n[key], utc);\r\n\t i18n[key + \"Date\"] = wDate.strToDate(i18n[key], utc);\r\n\t }\r\n\r\n\t var _price_format = template(i18n.price);\r\n\r\n\t var _price_settings = i18n.priceSettings || i18n;\r\n\r\n\t i18n.intFormat = Number.numToStr({\r\n\t groupSize: i18n.groupSize,\r\n\t groupDelimiter: i18n.groupDelimiter,\r\n\t decimalSize: 0\r\n\t });\r\n\r\n\t i18n.priceFormat = function (value) {\r\n\t return _price_format(Number.format(value, _price_settings));\r\n\t };\r\n\r\n\t i18n.numberFormat = Number.format;\r\n\t};\r\n\r\n\ti18n.locales = {\r\n\t \"en-US\": en\r\n\t};\r\n\ti18n.setLocale(\"en-US\");\r\n\r\n\t/*\r\n\t\tBehavior:History - change multiview state on 'back' button\r\n\r\n\t */\r\n\r\n\tvar history = {\r\n\t track: function track(id, url) {\r\n\t this._init_state(id, url);\r\n\r\n\t if (this._aHandler) $$(this._aViewId).detachEvent(this._aHandler);\r\n\r\n\t if (id) {\r\n\t this._aViewId = id;\r\n\t var view = $$(id);\r\n\r\n\t var handler = function handler() {\r\n\t if (history._ignored) return;\r\n\t if (view.getValue) history.push(id, view.getValue());\r\n\t };\r\n\r\n\t if (view.getActiveId) this._aHandler = view.attachEvent(\"onViewChange\", handler);else this._aHandler = view.attachEvent(\"onChange\", handler);\r\n\t }\r\n\t },\r\n\t _set_state: function _set_state(view, state$$1) {\r\n\t history._ignored = 1;\r\n\t view = $$(view);\r\n\t if (view.callEvent(\"onBeforeHistoryNav\", [state$$1])) if (view.setValue) view.setValue(state$$1);\r\n\t history._ignored = 0;\r\n\t },\r\n\t push: function push(view, url, value) {\r\n\t view = $$(view);\r\n\t var new_url = \"\";\r\n\t if (url) new_url = \"#!/\" + url;\r\n\r\n\t if (isUndefined(value)) {\r\n\t if (view.getValue) value = view.getValue();else value = url;\r\n\t }\r\n\r\n\t window.history.pushState({\r\n\t webix: true,\r\n\t id: view._settings.id,\r\n\t value: value\r\n\t }, \"\", new_url);\r\n\t },\r\n\t _init_state: function _init_state(view, url) {\r\n\t event$1(window, \"popstate\", function (ev) {\r\n\t if (ev.state && ev.state.webix) {\r\n\t history._set_state(ev.state.id, ev.state.value);\r\n\t }\r\n\t });\r\n\t var hash = window.location.hash;\r\n\t state.noanimate = true;\r\n\t if (hash && hash.indexOf(\"#!/\") === 0) history._set_state(view, hash.replace(\"#!/\", \"\"));else if (url) {\r\n\t history.push(view, url);\r\n\r\n\t history._set_state(view, url);\r\n\t }\r\n\t state.noanimate = false;\r\n\r\n\t this._init_state = function () {};\r\n\t }\r\n\t};\r\n\r\n\tvar storage = {};\r\n\r\n\tstorage.prefix = function (scope, storage) {\r\n\t scope = scope + \".\";\r\n\t return {\r\n\t put: function put(name, data) {\r\n\t return storage.put(scope + name, data);\r\n\t },\r\n\t get: function get(name) {\r\n\t return storage.get(scope + name);\r\n\t },\r\n\t remove: function remove(name) {\r\n\t return storage.remove(scope + name);\r\n\t }\r\n\t };\r\n\t};\r\n\r\n\tstorage.local = {\r\n\t put: function put(name, data) {\r\n\t if (name && window.JSON && window.localStorage) {\r\n\t window.localStorage.setItem(name, stringify(data));\r\n\t }\r\n\t },\r\n\t get: function get(name) {\r\n\t if (name && window.JSON && window.localStorage) {\r\n\t var json = window.localStorage.getItem(name);\r\n\t if (!json) return null;\r\n\t return DataDriver.json.toObject(json);\r\n\t } else return null;\r\n\t },\r\n\t remove: function remove(name) {\r\n\t if (name && window.JSON && window.localStorage) {\r\n\t window.localStorage.removeItem(name);\r\n\t }\r\n\t },\r\n\t clear: function clear() {\r\n\t window.localStorage.clear();\r\n\t }\r\n\t};\r\n\tstorage.session = {\r\n\t put: function put(name, data) {\r\n\t if (name && window.JSON && window.sessionStorage) {\r\n\t window.sessionStorage.setItem(name, stringify(data));\r\n\t }\r\n\t },\r\n\t get: function get(name) {\r\n\t if (name && window.JSON && window.sessionStorage) {\r\n\t var json = window.sessionStorage.getItem(name);\r\n\t if (!json) return null;\r\n\t return DataDriver.json.toObject(json);\r\n\t } else return null;\r\n\t },\r\n\t remove: function remove(name) {\r\n\t if (name && window.JSON && window.sessionStorage) {\r\n\t window.sessionStorage.removeItem(name);\r\n\t }\r\n\t },\r\n\t clear: function clear() {\r\n\t window.sessionStorage.clear();\r\n\t }\r\n\t};\r\n\tstorage.cookie = {\r\n\t put: function put(name, data, domain, expires) {\r\n\t if (name && window.JSON) {\r\n\t document.cookie = name + \"=\" + escape(stringify(data)) + (expires && expires instanceof Date ? \";expires=\" + expires.toUTCString() : \"\") + (domain ? \";domain=\" + domain : \"\") + (env.https ? \";secure\" : \"\");\r\n\t }\r\n\t },\r\n\t getRaw: function getRaw(check_name) {\r\n\t // first we'll split this cookie up into name/value pairs\r\n\t // note: document.cookie only returns name=value, not the other components\r\n\t var a_all_cookies = document.cookie.split(\";\");\r\n\t var a_temp_cookie = \"\";\r\n\t var cookie_name = \"\";\r\n\t var cookie_value = \"\";\r\n\t var b_cookie_found = false; // set boolean t/f default f\r\n\r\n\t for (var i = 0; i < a_all_cookies.length; i++) {\r\n\t // now we'll split apart each name=value pair\r\n\t a_temp_cookie = a_all_cookies[i].split(\"=\"); // and trim left/right whitespace while we're at it\r\n\r\n\t cookie_name = a_temp_cookie[0].replace(/^\\s+|\\s+$/g, \"\"); // if the extracted name matches passed check_name\r\n\r\n\t if (cookie_name == check_name) {\r\n\t b_cookie_found = true; // we need to handle case where cookie has no value but exists (no = sign, that is):\r\n\r\n\t if (a_temp_cookie.length > 1) {\r\n\t cookie_value = unescape(a_temp_cookie[1].replace(/^\\s+|\\s+$/g, \"\"));\r\n\t } // note that in cases where cookie is initialized but no value, null is returned\r\n\r\n\r\n\t return cookie_value;\r\n\t }\r\n\r\n\t a_temp_cookie = null;\r\n\t cookie_name = \"\";\r\n\t }\r\n\r\n\t if (!b_cookie_found) {\r\n\t return null;\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t get: function get(name) {\r\n\t if (name && window.JSON) {\r\n\t var json = this.getRaw(name);\r\n\t if (!json) return null;\r\n\t return DataDriver.json.toObject(unescape(json));\r\n\t } else return null;\r\n\t },\r\n\t remove: function remove(name, domain) {\r\n\t if (name && this.getRaw(name)) document.cookie = name + \"=\" + (domain ? \";domain=\" + domain : \"\") + \";expires=Thu, 01-Jan-1970 00:00:01 GMT\";\r\n\t },\r\n\t clear: function clear(domain) {\r\n\t var cookies = document.cookie.split(\";\");\r\n\r\n\t for (var i = 0; i < cookies.length; i++) {\r\n\t document.cookie = /^[^=]+/.exec(cookies[i])[0] + \"=\" + (domain ? \";domain=\" + domain : \"\") + \";expires=Thu, 01-Jan-1970 00:00:01 GMT\";\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar markup = {\r\n\t namespace: \"x\",\r\n\t attribute: \"data-\",\r\n\t dataTag: \"li\",\r\n\t _dash: /-([a-z])/g,\r\n\t _after_dash: function _after_dash(match) {\r\n\t return match[1].toUpperCase();\r\n\t },\r\n\t _parse_int: {\r\n\t width: true,\r\n\t height: true,\r\n\t gravity: true,\r\n\t margin: true,\r\n\t padding: true,\r\n\t paddingX: true,\r\n\t paddingY: true,\r\n\t minWidth: true,\r\n\t maxWidth: true,\r\n\t minHeight: true,\r\n\t maxHeight: true,\r\n\t headerRowHeight: true\r\n\t },\r\n\t _parse_bool: {\r\n\t disabled: true,\r\n\t hidden: true\r\n\t },\r\n\t _view_has_method: function _view_has_method(view, name) {\r\n\t return hasMethod(view, name);\r\n\t },\r\n\t init: function init(node, target, scope) {\r\n\t node = node || document.body;\r\n\t var els = [];\r\n\r\n\t var temp = this._get_core_els(node);\r\n\r\n\t var html = temp.html;\r\n\t var ui$$1 = null; //make copy to prevent node removing effects\r\n\r\n\t for (var i = temp.length - 1; i >= 0; i--) {\r\n\t els[i] = temp[i];\r\n\t }\r\n\r\n\t for (var _i = 0; _i < els.length; _i++) {\r\n\t var config; //collect configuration\r\n\r\n\t config = this._sub_markup(els[_i], html);\r\n\t config.$scope = scope;\r\n\t ui$$1 = this._initComponent(config, els[_i], html, target);\r\n\t }\r\n\r\n\t return ui$$1;\r\n\t },\r\n\t parse: function parse(source, mode) {\r\n\t //convert from string to object\r\n\t if (typeof source == \"string\") source = DataDriver[mode || \"xml\"].toObject(source, source);\r\n\r\n\t var els = this._get_core_els(source, mode);\r\n\r\n\t return this._sub_markup(els[0], els.html);\r\n\t },\r\n\t _initComponent: function _initComponent(config, node, html, target) {\r\n\t if (!target) {\r\n\t config.container = node.parentNode;\r\n\t remove(node);\r\n\t } else config.container = target;\r\n\r\n\t if (this._view_has_method(config.view, \"setPosition\")) delete config.container; //init ui\r\n\r\n\t return ui(config);\r\n\t },\r\n\t _get_core_els: function _get_core_els(node) {\r\n\t this._full_prefix = this.namespace ? this.namespace + \":\" : \"\";\r\n\t this._full_prefix_top = this._full_prefix + \"ui\"; //xhtml mode\r\n\r\n\t var els = node.getElementsByTagName(this._full_prefix_top);\r\n\t if (!els.length && node.documentElement && node.documentElement.tagName == this._full_prefix_top) els = [node.documentElement]; //loading from xml file with valid namespace\r\n\r\n\t if (!els.length && this.namespace) {\r\n\t els = node.getElementsByTagName(\"ui\");\r\n\t if (!els.length && node.documentElement && node.documentElement.tagName == \"ui\") els = [node.documentElement];\r\n\t }\r\n\r\n\t if (!els.length) {\r\n\t //html mode\r\n\t els = this._get_html_tops(node);\r\n\t els.html = true;\r\n\t }\r\n\r\n\t return els;\r\n\t },\r\n\t //html conversion\r\n\t _get_html_tops: function _get_html_tops(node) {\r\n\t if (node.getAttribute && node.getAttribute(this.attribute + \"view\")) return [node];\r\n\t var els = node.querySelectorAll(\"[\" + this.attribute + \"view]\");\r\n\t var tags = [];\r\n\r\n\t for (var i = 0; i < els.length; i++) {\r\n\t if (!els[i].parentNode.getAttribute(this.attribute + \"view\")) tags.push(els[i]);\r\n\t }\r\n\r\n\t return tags;\r\n\t },\r\n\t _sub_markup: function _sub_markup(el, html, json) {\r\n\t var htmltable = false; //ignore top x:ui for xhtml and xml \r\n\r\n\t if (!json) {\r\n\t var name = this._get_name(el, html);\r\n\r\n\t if (name == \"ui\") {\r\n\t var childs = el.childNodes;\r\n\r\n\t for (var i = 0; i < childs.length; i++) {\r\n\t if (childs[i].nodeType == 1) {\r\n\t return this._sub_markup(childs[i], html);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t json = {\r\n\t view: name\r\n\t };\r\n\r\n\t if (html && el.tagName.toLowerCase() == \"table\") {\r\n\t json.data = el;\r\n\t json.datatype = \"htmltable\";\r\n\t htmltable = true;\r\n\t }\r\n\t }\r\n\r\n\t var is_layout = json.view == \"cols\" || json.view == \"rows\" || this._view_has_method(json.view, \"addView\");\r\n\r\n\t var subs = [];\r\n\t var has_tags = 0;\r\n\t var allow_sub_tags = !(html || el.style); //only for xml documents\r\n\r\n\t var first = el.firstChild;\r\n\r\n\t while (first) {\r\n\t //tag node\r\n\t if (first.nodeType == 1) {\r\n\t var _name = this._get_name(first, html);\r\n\r\n\t if (_name == \"data\") {\r\n\t has_tags = 1;\r\n\t var data = first;\r\n\t first = first.nextSibling;\r\n\t json.data = this._handle_data(data, html);\r\n\t continue;\r\n\t } else if (_name == \"config\") {\r\n\t this._get_config_html(first, json, html);\r\n\r\n\t var confignode = first;\r\n\t first = first.nextSibling;\r\n\t remove(confignode);\r\n\t continue;\r\n\t } else if (_name == \"column\") {\r\n\t has_tags = 1;\r\n\r\n\t var column = this._tag_to_json(first, html);\r\n\r\n\t column.header = column.header || column.value;\r\n\t column.width = column.width * 1 || \"\";\r\n\t json.columns = json.columns || [];\r\n\t json.columns.push(column);\r\n\t } else if (_name || is_layout && html) {\r\n\t var obj = this._sub_markup(first, html, {\r\n\t view: _name\r\n\t });\r\n\r\n\t if (obj.view == \"head\") json.head = obj.rows ? obj.rows[0] : obj.template;else if (obj.view == \"body\") {\r\n\t if (this._view_has_method(json.view, \"addView\")) {\r\n\t //multiview, accordion\r\n\t //subtag or plain value\r\n\t //in case of multiple sub tags, only first will be used\r\n\t // #dirty\r\n\t subs.push({\r\n\t body: obj.rows ? obj.rows[0] : obj.value,\r\n\t header: obj.header || \"\"\r\n\t });\r\n\t } else {\r\n\t //window, fieldset\r\n\t //one sub tag - use it\r\n\t //multiple sub tags - create sub layout\r\n\t //or use plain text value\r\n\t json.body = obj.rows ? obj.rows.length == 1 ? obj.rows[0] : {\r\n\t rows: obj.rows\r\n\t } : obj.value;\r\n\t }\r\n\t } else subs.push(obj);\r\n\t } else if (allow_sub_tags) {\r\n\t has_tags = 1;\r\n\t var tagName = first.tagName;\r\n\t if (html) tagName = tagName.toLowerCase().replace(this._dash, this._after_dash);\r\n\t json[tagName] = DataDriver.xml.tagToObject(first);\r\n\t }\r\n\t }\r\n\r\n\t first = first.nextSibling;\r\n\t }\r\n\r\n\t this._attrs_to_json(el, json, html);\r\n\r\n\t if (subs.length) {\r\n\t if (json.stack) json[json.stack] = subs;else if (this._view_has_method(json.view, \"setValues\")) json[\"elements\"] = subs;else if (json.view == \"rows\") {\r\n\t json.view = \"layout\";\r\n\t json.rows = subs;\r\n\t } else if (json.view == \"cols\") {\r\n\t json.view = \"layout\";\r\n\t json.cols = subs;\r\n\t } else if (this._view_has_method(json.view, \"setValue\")) {\r\n\t json[\"cells\"] = subs;\r\n\t } else if (this._view_has_method(json.view, \"getBody\")) {\r\n\t json.body = subs.length == 1 ? subs[0] : {\r\n\t rows: subs\r\n\t };\r\n\t } else json[\"rows\"] = subs;\r\n\t } else if (!htmltable && !has_tags) {\r\n\t if (html && !json.template && (!json.view || json.view == \"template\")) {\r\n\t json.view = \"template\";\r\n\t json.content = el;\r\n\t } else {\r\n\t var content = this._content(el, html);\r\n\r\n\t if (content) {\r\n\t var target = \"template\";\r\n\t if (this._view_has_method(json.view, \"setValue\")) target = \"value\";\r\n\t json[target] = json[target] || content;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return json;\r\n\t },\r\n\t _empty: function _empty(str) {\r\n\t var clean = str.replace(/\\s+/gm, \"\");\r\n\t return clean.length > 0 ? false : true;\r\n\t },\r\n\t _markup_names: {\r\n\t body: 1,\r\n\t head: 1,\r\n\t data: 1,\r\n\t rows: 1,\r\n\t cols: 1,\r\n\t cells: 1,\r\n\t elements: 1,\r\n\t ui: 1,\r\n\t column: 1,\r\n\t config: 1\r\n\t },\r\n\t _get_config_html: function _get_config_html(tag, json, html) {\r\n\t var master = this._attrs_to_json(tag, {});\r\n\r\n\t if (master.name) {\r\n\t json[master.name] = master;\r\n\t delete master.name;\r\n\t } else if (master.stack) json[master.stack] = [];else json = master;\r\n\r\n\t var childs = tag.childNodes;\r\n\r\n\t for (var i = 0; i < childs.length; i++) {\r\n\t var sub = null;\r\n\t if (childs[i].nodeType == 1 && childs[i].tagName.toLowerCase() == \"config\" && childs[i].attributes.length) sub = this._get_config_html(childs[i], master, html);else if (childs[i].nodeType == 1 && childs[i].tagName.toLowerCase() == \"data\") {\r\n\t sub = this._handle_data(childs[i], html);\r\n\t if (!master.stack) master.data = sub;\r\n\t } else sub = childs[i].innerHTML;\r\n\t if (master.stack && sub) json[master.stack].push(sub);\r\n\t }\r\n\r\n\t return json;\r\n\t },\r\n\t _get_name: function _get_name(tag, html) {\r\n\t //value of view attribute or config tag\r\n\t if (html) return tag.getAttribute(this.attribute + \"view\") || (tag.tagName.toLowerCase() == \"config\" ? \"config\" : null);\r\n\t var name = tag.tagName.toLowerCase();\r\n\r\n\t if (this.namespace) {\r\n\t if (name.indexOf(this._full_prefix) === 0 || tag.scopeName == this.namespace) return name.replace(this._full_prefix, \"\");\r\n\t } else {\r\n\t if (ui[name] || this._markup_names[name]) return name;\r\n\t }\r\n\r\n\t return 0;\r\n\t },\r\n\t _handle_data: function _handle_data(el, html) {\r\n\t var data = [];\r\n\t var records = el.getElementsByTagName(markup.dataTag);\r\n\r\n\t for (var i = 0; i < records.length; i++) {\r\n\t var rec = records[i];\r\n\r\n\t if (rec.parentNode.parentNode.tagName != markup.dataTag) {\r\n\t var json = this._tag_to_json(rec, html); //reuse css class \r\n\r\n\r\n\t if (rec.className) json.$css = rec.className;\r\n\t data.push(json);\r\n\t }\r\n\t }\r\n\r\n\t remove(el);\r\n\t return data;\r\n\t },\r\n\t _content: function _content(el) {\r\n\t if (el.style) return el.innerHTML;\r\n\t if (el.firstChild) return el.firstChild.wholeText || el.firstChild.data || \"\";\r\n\t return \"\";\r\n\t },\r\n\t _tag_to_json: function _tag_to_json(el, html) {\r\n\t if (!html) return DataDriver.xml.tagToObject(el);\r\n\r\n\t var json = this._attrs_to_json(el, {}, html);\r\n\r\n\t if (!json.value && el.childNodes.length) json.value = this._content(el, html);\r\n\t return json;\r\n\t },\r\n\t _attrs_to_json: function _attrs_to_json(el, json, html) {\r\n\t var attrs = el.attributes;\r\n\r\n\t for (var i = 0; i < attrs.length; i++) {\r\n\t var name = attrs[i].name;\r\n\r\n\t if (html) {\r\n\t if (name.indexOf(this.attribute) !== 0) continue;\r\n\t name = name.replace(this.attribute, \"\").replace(this._dash, this._after_dash);\r\n\t }\r\n\r\n\t var value = attrs[i].value;\r\n\t if (value.indexOf(\"json://\") != -1) value = JSON.parse(value.replace(\"json://\", \"\"));\r\n\t if (this._parse_int[name]) value = parseInt(value, 10);else if (this._parse_bool[name]) value = value && value !== \"false\" && value != \"0\";\r\n\t json[name] = value;\r\n\t }\r\n\r\n\t return json;\r\n\t }\r\n\t};\r\n\r\n\tenv.printPPI = 96;\r\n\tenv.printMargin = 0.75 * env.printPPI;\r\n\tvar margin = env.printMargin;\r\n\tvar papers = {\r\n\t \"a4\": \"A4\",\r\n\t \"a3\": \"A3\",\r\n\t \"letter\": \"letter\"\r\n\t};\r\n\tvar fits = {\r\n\t page: true,\r\n\t data: true\r\n\t};\r\n\tvar modes = {\r\n\t portrait: true,\r\n\t landscape: true\r\n\t};\r\n\tvar sizes = {\r\n\t //inches, real size is value*ppi\r\n\t \"A3\": {\r\n\t width: 11.7,\r\n\t height: 16.5\r\n\t },\r\n\t \"A4\": {\r\n\t width: 8.27,\r\n\t height: 11.7\r\n\t },\r\n\t \"letter\": {\r\n\t width: 8.5,\r\n\t height: 11\r\n\t }\r\n\t};\r\n\r\n\tvar print = function print(id, options) {\r\n\t var view = $$(id);\r\n\t if (view && view.$printView) view = view.$printView();\r\n\t assert(view, \"non-existing view for printing\");\r\n\t if (!view) return;\r\n\t if (view.callEvent) view.callEvent(\"onBeforePrint\", [options]);\r\n\t options = _checkOptions(options);\r\n\r\n\t _beforePrint(options); //try widget's custom logic first, sometimes it may deny \r\n\r\n\r\n\t if (!view.$customPrint || view.$customPrint(options) === true) _print(view, options);\r\n\r\n\t _afterPrint(options);\r\n\t};\r\n\t/*processing print options*/\r\n\r\n\r\n\tfunction _checkOptions(options) {\r\n\t options = options || {};\r\n\t options.paper = papers[(options.paper || \"\").toLowerCase()] || \"A4\";\r\n\t options.mode = modes[options.mode] ? options.mode : \"portrait\";\r\n\t options.fit = fits[options.fit] ? options.fit : \"page\";\r\n\t options.scroll = options.scroll || false;\r\n\t options.size = sizes[options.paper];\r\n\t options.margin = options.margin || options.margin === 0 ? options.margin : {};\r\n\t margin = isNaN(options.margin * 1) ? margin : options.margin;\r\n\t options.margin = {\r\n\t top: options.margin.top || options.margin.top === 0 ? options.margin.top : margin,\r\n\t bottom: options.margin.bottom || options.margin.bottom === 0 ? options.margin.bottom : margin,\r\n\t right: options.margin.right || options.margin.right === 0 ? options.margin.right : margin,\r\n\t left: options.margin.left || options.margin.left === 0 ? options.margin.left : margin\r\n\t };\r\n\t return options;\r\n\t}\r\n\t/*preparing printing environment*/\r\n\r\n\r\n\tfunction _beforePrint(options) {\r\n\t addCss(document.body, \"webix_print\");\r\n\t if (options.docHeader) _getHeaderFooter(\"Header\", options);\r\n\t if (options.docFooter) _getHeaderFooter(\"Footer\", options);\r\n\t /* static print styles are located at 'css/print.less'*/\r\n\r\n\t var cssString = \"@media print { \" + \"@page{ size:\" + options.paper + \" \" + options.mode + \";\" + \"margin-top:\" + options.margin.top + \"px;margin-bottom:\" + options.margin.bottom + \"px;margin-right:\" + options.margin.right + \"px;margin-left:\" + options.margin.left + \"px;}\" + \"}\";\r\n\t addStyle(cssString, \"print\");\r\n\t}\r\n\t/*cleaning environment*/\r\n\r\n\r\n\tfunction _afterPrint(options) {\r\n\t removeCss(document.body, \"webix_print\");\r\n\t removeStyle(\"print\");\r\n\t if (options.docHeader) remove(options.docHeader);\r\n\t if (options.docFooter) remove(options.docFooter);\r\n\t}\r\n\t/*common print actions */\r\n\r\n\r\n\tfunction _print(view, options) {\r\n\t var doc = view.$view.cloneNode(true); //copy data from all canvases\r\n\r\n\t var canvases = view.$view.getElementsByTagName(\"canvas\");\r\n\t if (canvases.length) for (var i = canvases.length - 1; i >= 0; i--) {\r\n\t var destCtx = doc.getElementsByTagName(\"canvas\")[i].getContext(\"2d\");\r\n\t destCtx.drawImage(canvases[i], 0, 0);\r\n\t }\r\n\t insertBefore(doc, options.docFooter, document.body);\r\n\t addCss(doc, \"webix_ui_print\");\r\n\t if (!options.scroll && (view._dataobj && view.data && view.data.pull || view.getBody)) addCss(doc, \"webix_print_noscroll\");\r\n\t window.print();\r\n\t remove(doc);\r\n\t}\r\n\t/*custom header nad footer*/\r\n\r\n\r\n\tfunction _getHeaderFooter(group, options) {\r\n\t var header = create(\"div\", {\r\n\t \"class\": \"webix_view webix_print_\" + group.toLowerCase(),\r\n\t \"style\": \"height:0px;visibility:hidden;\"\r\n\t }, options[\"doc\" + group]);\r\n\t if (group === \"Header\") insertBefore(header, document.body.firstChild);else document.body.appendChild(header);\r\n\t options[\"doc\" + group] = header;\r\n\t}\r\n\r\n\tvar patterns = {\r\n\t phone: {\r\n\t mask: \"+# (###) ###-####\",\r\n\t allow: /[0-9]/g\r\n\t },\r\n\t card: {\r\n\t mask: \"#### #### #### ####\",\r\n\t allow: /[0-9]/g\r\n\t },\r\n\t date: {\r\n\t mask: \"####-##-## ##:##\",\r\n\t allow: /[0-9]/g\r\n\t }\r\n\t};\r\n\r\n\t/*\r\n\t\tCommon helpers\r\n\t*/\r\n\r\n\tvar timers = {};\r\n\tfunction jsonp(url, params, callback, master) {\r\n\t var defer = Deferred.defer();\r\n\t var id = \"webix_jsonp_\" + uid();\r\n\t var script = document.createElement(\"script\");\r\n\t script.id = id;\r\n\t script.type = \"text/javascript\";\r\n\t var head = document.getElementsByTagName(\"head\")[0];\r\n\r\n\t if (typeof params == \"function\") {\r\n\t master = callback;\r\n\t callback = params;\r\n\t params = {};\r\n\t }\r\n\r\n\t if (!params) params = {};\r\n\t params.jsonp = id;\r\n\r\n\t window[id] = function () {\r\n\t if (callback) callback.apply(master || window, arguments);\r\n\t defer.resolve(arguments[0]);\r\n\t window.clearTimeout(timers[id]);\r\n\t delete timers[id];\r\n\t script.parentNode.removeChild(script);\r\n\t callback = head = master = script = null;\r\n\t delete window[id];\r\n\t }; //timeout timer\r\n\r\n\r\n\t timers[id] = window.setTimeout(function () {\r\n\t defer.reject();\r\n\t delete window[id];\r\n\t }, jsonp.timer);\r\n\t var vals = [];\r\n\r\n\t for (var key in params) {\r\n\t vals.push(key + \"=\" + encodeURIComponent(params[key]));\r\n\t }\r\n\r\n\t url += (url.indexOf(\"?\") == -1 ? \"?\" : \"&\") + vals.join(\"&\");\r\n\t script.src = url;\r\n\t head.appendChild(script);\r\n\t return defer;\r\n\t}\r\n\tjsonp.timer = 3000;\r\n\r\n\tvar error_key = \"__webix_remote_error\";\r\n\r\n\tfunction RemoteContext(url, config) {\r\n\t this._proxy = {};\r\n\t this._queue = [];\r\n\t this._url = url;\r\n\t this._key = \"\";\r\n\t if (config) this._process(config);else this._ready = ajax(url).then(function (data) {\r\n\t return data.text();\r\n\t }).then(bind(function (text) {\r\n\t text = text.split(\"/*api*/\")[1];\r\n\r\n\t this._process(JSON.parse(text));\r\n\r\n\t return this._proxy;\r\n\t }, this));\r\n\t}\r\n\r\n\tRemoteContext.prototype = {\r\n\t _process: function _process(config) {\r\n\t if (config.$key) this._key = config.$key;\r\n\t if (config.$vars) for (var key in config.$vars) {\r\n\t this._proxy[key] = config.$vars[key];\r\n\t }\r\n\r\n\t this._parse(config, this._proxy, \"\");\r\n\t },\r\n\t _parse: function _parse(api, obj, prefix) {\r\n\t for (var key in api) {\r\n\t if (key === \"$key\" || key === \"$vars\") continue;\r\n\t var val = api[key];\r\n\r\n\t if (_typeof(val) == \"object\") {\r\n\t var sub = obj[key] = {};\r\n\r\n\t this._parse(val, sub, prefix + key + \".\");\r\n\t } else obj[key] = this._proxy_call(this, prefix + key);\r\n\t }\r\n\t },\r\n\t _call: function _call(name, args) {\r\n\t var def = this._deffer(this, name, args);\r\n\r\n\t this._queue.push(def);\r\n\r\n\t this._start_queue();\r\n\r\n\t return def;\r\n\t },\r\n\t _start_queue: function _start_queue() {\r\n\t if (!this._timer) this._timer = setTimeout(bind(this._run_queue, this), 1);\r\n\t },\r\n\t _run_queue: function _run_queue() {\r\n\t var data = [],\r\n\t defs = this._queue;\r\n\r\n\t for (var i = 0; i < this._queue.length; i++) {\r\n\t var def = this._queue[i];\r\n\r\n\t if (def.$sync) {\r\n\t defs.splice(i, 1);\r\n\t i--;\r\n\t } else data.push({\r\n\t name: def.$name,\r\n\t args: def.$args\r\n\t });\r\n\t }\r\n\r\n\t if (defs.length) {\r\n\t var request = ajax();\r\n\r\n\t var pack = this._pack(data);\r\n\r\n\t callEvent(\"onBeforeRemoteCall\", [request, pack, {}]);\r\n\t var promise = request.post(this._url, pack).then(function (response) {\r\n\t var data = response.json();\r\n\t var results = data.data;\r\n\r\n\t for (var i = 0; i < results.length; i++) {\r\n\t var res = results[i];\r\n\t var error = results[i] && results[i][error_key];\r\n\r\n\t if (error) {\r\n\t callEvent(\"onRemoteError\", [error]);\r\n\t defs[i].reject(error);\r\n\t } else {\r\n\t defs[i].resolve(res);\r\n\t }\r\n\t }\r\n\t }, function (res) {\r\n\t for (var i = 0; i < defs.length; i++) {\r\n\t defs[i].reject(res);\r\n\t }\r\n\r\n\t throw res;\r\n\t });\r\n\t callEvent(\"onAfterRemoteCall\", [promise]);\r\n\t }\r\n\r\n\t this._queue = [];\r\n\t this._timer = null;\r\n\t },\r\n\t _sync: function _sync() {\r\n\t var value = null;\r\n\t this.$sync = true;\r\n\t var data = [{\r\n\t name: this.$name,\r\n\t args: this.$args\r\n\t }];\r\n\r\n\t try {\r\n\t var request = ajax();\r\n\r\n\t var pack = this.$context._pack(data);\r\n\r\n\t callEvent(\"onBeforeRemoteCall\", [request, pack, {\r\n\t sync: true\r\n\t }]);\r\n\t var xhr = request.sync().post(this.$context._url, pack);\r\n\t callEvent(\"onAfterRemoteCall\", [null]);\r\n\t value = JSON.parse(xhr.responseText).data[0];\r\n\t if (value[error_key]) value = null;\r\n\t } catch (e) {} //eslint-disable-line\r\n\r\n\r\n\t return value;\r\n\t },\r\n\t _deffer: function _deffer(master, name, args) {\r\n\t var pr = Deferred.defer();\r\n\t pr.sync = master._sync;\r\n\t pr.$name = name;\r\n\t pr.$args = args;\r\n\t pr.$context = this;\r\n\t return pr;\r\n\t },\r\n\t _proxy_call: function _proxy_call(master, name) {\r\n\t return function () {\r\n\t return master._call(name, [].slice.call(arguments));\r\n\t };\r\n\t },\r\n\t _getProxy: function _getProxy() {\r\n\t return this._ready || this._proxy;\r\n\t },\r\n\t _pack: function _pack(obj) {\r\n\t return {\r\n\t key: this._key,\r\n\t payload: obj\r\n\t };\r\n\t }\r\n\t};\r\n\r\n\tfunction getApi(url, config) {\r\n\t var ctx = new RemoteContext(url, config);\r\n\r\n\t var proxy = ctx._getProxy();\r\n\r\n\t for (var key in proxy) {\r\n\t remote[key] = proxy[key];\r\n\t }\r\n\r\n\t return proxy;\r\n\t}\r\n\r\n\tvar remote = function remote(url, config) {\r\n\t if (_typeof(url) === \"object\") {\r\n\t var scripts = document.getElementsByTagName(\"script\");\r\n\t config = url;\r\n\t url = scripts[scripts.length - 1].src;\r\n\t return getApi(url, config);\r\n\t } else return getApi(url, config);\r\n\t};\r\n\r\n\t/*submits values*/\r\n\r\n\tfunction send(url, values, method, target) {\r\n\t var form = create(\"FORM\", {\r\n\t \"target\": target || \"_self\",\r\n\t \"action\": url,\r\n\t \"method\": method || \"POST\"\r\n\t }, \"\");\r\n\r\n\t for (var k in values) {\r\n\t var field = create(\"INPUT\", {\r\n\t \"type\": \"hidden\",\r\n\t \"name\": k,\r\n\t \"value\": values[k]\r\n\t }, \"\");\r\n\t form.appendChild(field);\r\n\t }\r\n\r\n\t form.style.display = \"none\";\r\n\t document.body.appendChild(form);\r\n\t form.submit();\r\n\t document.body.removeChild(form);\r\n\t}\r\n\r\n\tfunction animate$1(obj, parent, config) {\r\n\t var pobj = $$(parent);\r\n\r\n\t if (pobj) {\r\n\t var aniset = config || {\r\n\t type: \"slide\",\r\n\t direction: \"left\"\r\n\t };\r\n\r\n\t var d = pobj._viewobj.cloneNode(true);\r\n\r\n\t var view = ui(obj, parent);\r\n\r\n\t view._viewobj.parentNode.appendChild(d);\r\n\r\n\t var line = animate.formLine(view._viewobj, d, aniset);\r\n\r\n\t aniset.callback = function () {\r\n\t animate.breakLine(line);\r\n\t };\r\n\r\n\t animate(line, aniset);\r\n\t return view;\r\n\t }\r\n\t}\r\n\tfunction animateView(view, stateHandler, config) {\r\n\t view = $$(view);\r\n\r\n\t if (view) {\r\n\t config = config || {\r\n\t type: \"slide\",\r\n\t direction: \"left\"\r\n\t };\r\n\r\n\t var getHTML = function getHTML(view) {\r\n\t var el = view._viewobj;\r\n\t var css = el.className;\r\n\t var content = el.innerHTML;\r\n\t return \"
\" + content + \"
\";\r\n\t }; // get 'display' state of child nodes\r\n\r\n\r\n\t var display = [];\r\n\r\n\t for (var i = 0; i < view._viewobj.childNodes.length; i++) {\r\n\t var node = view._viewobj.childNodes[i];\r\n\t var value = node.currentStyle ? node.currentStyle.display : getComputedStyle(node, null).display;\r\n\t display.push(value || \"\");\r\n\t } // get current html content\r\n\r\n\r\n\t var currentState = getHTML(view); // apply new state\r\n\r\n\t if (typeof stateHandler == \"function\") {\r\n\t stateHandler.call(this);\r\n\t } // get new html content\r\n\r\n\r\n\t var newState = getHTML(view); // insert elements into the view\r\n\r\n\t var tempParent = view._viewobj.insertBefore(create(\"DIV\", {\r\n\t \"class\": \"webix_view_animate\",\r\n\t \"style\": \"width:\" + view._viewobj.offsetWidth + \"px;height:\" + view._viewobj.offsetHeight + \"px;\"\r\n\t }, newState + currentState), view._viewobj.firstChild); // hide child nodes\r\n\r\n\r\n\t for (var _i = 1; _i < view._viewobj.childNodes.length; _i++) {\r\n\t view._viewobj.childNodes[_i].style.display = \"none\";\r\n\t } // animate inserted elements\r\n\r\n\r\n\t var line = animate.formLine(tempParent.childNodes[0], tempParent.childNodes[1], config);\r\n\r\n\t config.callback = function () {\r\n\t if (tempParent) {\r\n\t view._viewobj.removeChild(tempParent);\r\n\r\n\t tempParent = null; // restore 'display' state of child nodes\r\n\r\n\t for (var i = 0; i < view._viewobj.childNodes.length; i++) {\r\n\t view._viewobj.childNodes[i].style.display = display[i];\r\n\t }\r\n\t }\r\n\t };\r\n\r\n\t animate(line, config);\r\n\t return view;\r\n\t }\r\n\t}\r\n\r\n\tfunction orientation() {\r\n\t var new_orientation = !!(window.orientation % 180);\r\n\t if (state.orientation === new_orientation) return;\r\n\t state.orientation = new_orientation;\r\n\t callEvent(\"onRotate\", [new_orientation]);\r\n\t}\r\n\r\n\tif (env.touch) {\r\n\t state.orientation = !!((isUndefined(window.orientation) ? 90 : window.orientation) % 180);\r\n\t event$1(window, \"onorientationchange\" in window ? \"orientationchange\" : \"resize\", orientation);\r\n\t}\r\n\r\n\tfunction fullScreen() {\r\n\t if (!env.touch) return;\r\n\t addMeta(\"apple-mobile-web-app-capable\", \"yes\");\r\n\t addMeta(\"viewport\", \"initial-scale=1, maximum-scale=1, user-scalable=no, shrink-to-fit=no\");\r\n\r\n\t var fix = function fix() {\r\n\t var x = window.innerWidth;\r\n\t var y = window.innerHeight;\r\n\r\n\t if (y) {\r\n\t document.body.style.height = y + \"px\";\r\n\t document.body.style.width = x + \"px\";\r\n\t }\r\n\r\n\t state._freeze_resize = false;\r\n\t resize();\r\n\t };\r\n\r\n\t var onrotate = function onrotate() {\r\n\t state._freeze_resize = true;\r\n\t delay(fix, null, [], 500);\r\n\t };\r\n\r\n\t attachEvent(\"onRotate\", onrotate);\r\n\t orientation();\r\n\t delay(onrotate);\r\n\t}\r\n\r\n\tvar datafilter = {\r\n\t textWaitDelay: 500,\r\n\t \"summColumn\": {\r\n\t getValue: function getValue$$1(node) {\r\n\t return node.firstChild.innerHTML;\r\n\t },\r\n\t setValue: function setValue() {},\r\n\t refresh: function refresh(master, node, value) {\r\n\t var result = 0;\r\n\t master.mapCells(null, value.columnId, null, 1, function (value) {\r\n\t value = value * 1;\r\n\t if (!isNaN(value)) result += value;\r\n\t }, true);\r\n\t if (value.format) result = value.format(result);\r\n\t if (value.template) result = value.template({\r\n\t value: result\r\n\t });\r\n\t node.firstChild.innerHTML = result;\r\n\t },\r\n\t trackCells: true,\r\n\t render: function render(master, config) {\r\n\t if (config.template) config.template = template(config.template);\r\n\t return \"\";\r\n\t }\r\n\t },\r\n\t \"masterCheckbox\": {\r\n\t getValue: function getValue$$1() {},\r\n\t setValue: function setValue() {},\r\n\t getHelper: function getHelper(node, config) {\r\n\t return {\r\n\t check: function check() {\r\n\t config.checked = false;\r\n\t node.onclick();\r\n\t },\r\n\t uncheck: function uncheck() {\r\n\t config.checked = true;\r\n\t node.onclick();\r\n\t },\r\n\t isChecked: function isChecked() {\r\n\t return config.checked;\r\n\t }\r\n\t };\r\n\t },\r\n\t refresh: function refresh(master, node, config) {\r\n\t node.onclick = function () {\r\n\t this.getElementsByTagName(\"input\")[0].checked = config.checked = !config.checked;\r\n\t var column = master.getColumnConfig(config.columnId);\r\n\t var checked = config.checked ? column.checkValue : column.uncheckValue;\r\n\t master.data.each(function (obj) {\r\n\t obj[config.columnId] = checked;\r\n\t master.callEvent(\"onCheck\", [obj.id, config.columnId, checked]);\r\n\t this.callEvent(\"onStoreUpdated\", [obj.id, obj, \"save\"]);\r\n\t });\r\n\t master.refresh();\r\n\t };\r\n\t },\r\n\t render: function render(master, config) {\r\n\t return \"\";\r\n\t }\r\n\t },\r\n\t \"textFilter\": {\r\n\t getInputNode: function getInputNode(node) {\r\n\t return node.firstChild ? node.firstChild.firstChild : {\r\n\t value: null\r\n\t };\r\n\t },\r\n\t getValue: function getValue$$1(node) {\r\n\t return this.getInputNode(node).value;\r\n\t },\r\n\t setValue: function setValue(node, value) {\r\n\t this.getInputNode(node).value = value;\r\n\t },\r\n\t refresh: function refresh(master, node, value) {\r\n\t node.component = master._settings.id;\r\n\t master.registerFilter(node, value, this);\r\n\t node._comp_id = master._settings.id;\r\n\t if (value.value && this.getValue(node) != value.value) this.setValue(node, value.value);\r\n\t node.onclick = preventEvent;\r\n\r\n\t _event(node, \"keydown\", this._on_key_down);\r\n\t },\r\n\t render: function render(master, config) {\r\n\t if (this.init) this.init(config);\r\n\t config.css = \"webix_ss_filter\";\r\n\t return \"\";\r\n\t },\r\n\t _on_key_down: function _on_key_down(e) {\r\n\t var id = this._comp_id; //tabbing through filters must not trigger filtering\r\n\t //we can improve this functionality by preserving initial filter value\r\n\t //and comparing new one with it\r\n\r\n\t if ((e.which || e.keyCode) == 9) return;\r\n\t if (this._filter_timer) window.clearTimeout(this._filter_timer);\r\n\t this._filter_timer = window.setTimeout(function () {\r\n\t var ui$$1 = $$(id); //ensure that ui is not destroyed yet\r\n\r\n\t if (ui$$1) ui$$1.filterByAll();\r\n\t }, datafilter.textWaitDelay);\r\n\t }\r\n\t },\r\n\t \"selectFilter\": {\r\n\t getInputNode: function getInputNode(node) {\r\n\t return node.firstChild ? node.firstChild.firstChild : {\r\n\t value: null\r\n\t };\r\n\t },\r\n\t getValue: function getValue$$1(node) {\r\n\t return this.getInputNode(node).value;\r\n\t },\r\n\t setValue: function setValue(node, value) {\r\n\t this.getInputNode(node).value = value;\r\n\t },\r\n\t refresh: function refresh(master, node, value) {\r\n\t //value - config from header { contet: }\r\n\t value.compare = value.compare || function (a, b) {\r\n\t return a == b;\r\n\t };\r\n\r\n\t node.component = master._settings.id;\r\n\t master.registerFilter(node, value, this);\r\n\t var data;\r\n\t var options = value.options;\r\n\r\n\t if (options) {\r\n\t if (typeof options == \"string\") {\r\n\t data = value.options = [];\r\n\t ajax(options).then(bind(function (data) {\r\n\t value.options = data.json();\r\n\t this.refresh(master, node, value);\r\n\t }, this));\r\n\t } else data = options;\r\n\t } else {\r\n\t data = master.collectValues(value.columnId);\r\n\t data.unshift({\r\n\t id: \"\",\r\n\t value: \"\"\r\n\t });\r\n\t }\r\n\r\n\t var optview = $$(options);\r\n\r\n\t if (optview && optview.data && optview.data.getRange) {\r\n\t data = optview.data.getRange();\r\n\t } //slow in IE\r\n\t //http://jsperf.com/select-options-vs-innerhtml\r\n\r\n\r\n\t var select = document.createElement(\"select\");\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t var option = document.createElement(\"option\");\r\n\t option.value = data[i].id;\r\n\t option.text = data[i].value;\r\n\t select.add(option);\r\n\t }\r\n\r\n\t node.firstChild.innerHTML = \"\";\r\n\t node.firstChild.appendChild(select);\r\n\t if (value.value) this.setValue(node, value.value);\r\n\t node.onclick = preventEvent;\r\n\t select._comp_id = master._settings.id;\r\n\r\n\t _event(select, \"change\", this._on_change);\r\n\t },\r\n\t render: function render(master, config) {\r\n\t if (this.init) this.init(config);\r\n\t config.css = \"webix_ss_filter\";\r\n\t return \"\";\r\n\t },\r\n\t _on_change: function _on_change() {\r\n\t $$(this._comp_id).filterByAll();\r\n\t }\r\n\t }\r\n\t};\r\n\tdatafilter.serverFilter = exports.extend({\r\n\t $server: true,\r\n\t _on_key_down: function _on_key_down(e) {\r\n\t var id = this._comp_id,\r\n\t code = e.which || e.keyCode; //ignore tab and navigation keys\r\n\r\n\t if (code == 9 || code >= 33 && code <= 40) return;\r\n\t if (this._filter_timer) window.clearTimeout(this._filter_timer);\r\n\t this._filter_timer = window.setTimeout(function () {\r\n\t $$(id).filterByAll();\r\n\t }, datafilter.textWaitDelay);\r\n\t }\r\n\t}, datafilter.textFilter);\r\n\tdatafilter.serverSelectFilter = exports.extend({\r\n\t $server: true,\r\n\t _on_change: function _on_change() {\r\n\t var id = this._comp_id;\r\n\t $$(id).filterByAll();\r\n\t }\r\n\t}, datafilter.selectFilter);\r\n\tdatafilter.numberFilter = exports.extend({\r\n\t init: function init(config) {\r\n\t config.prepare = function (value) {\r\n\t var equality = value.indexOf(\"=\") != -1 ? 1 : 0;\r\n\t var intvalue = this.format(value);\r\n\t if (intvalue === \"\") return \"\";\r\n\t if (value.indexOf(\">\") != -1) config.compare = this._greater;else if (value.indexOf(\"<\") != -1) {\r\n\t config.compare = this._lesser;\r\n\t equality *= -1;\r\n\t } else {\r\n\t config.compare = this._equal;\r\n\t equality = 0;\r\n\t }\r\n\t return intvalue - equality;\r\n\t };\r\n\t },\r\n\t format: function format(value) {\r\n\t return value.replace(/[^\\-.0-9]/g, \"\");\r\n\t },\r\n\t _greater: function _greater(a, b) {\r\n\t return a * 1 > b;\r\n\t },\r\n\t _lesser: function _lesser(a, b) {\r\n\t return a !== \"\" && a * 1 < b;\r\n\t },\r\n\t _equal: function _equal(a, b) {\r\n\t return a * 1 == b;\r\n\t }\r\n\t}, datafilter.textFilter);\r\n\tdatafilter.dateFilter = exports.extend({\r\n\t format: function format(value) {\r\n\t if (value === \"\") return \"\";\r\n\t var date = new Date();\r\n\r\n\t if (value.indexOf(\"today\") != -1) {\r\n\t date = wDate.dayStart(date);\r\n\t } else if (value.indexOf(\"now\") == -1) {\r\n\t var parts = value.match(/[0-9]+/g);\r\n\t if (!parts || !parts.length) return \"\";\r\n\r\n\t if (parts.length < 3) {\r\n\t parts.reverse();\r\n\t date = new Date(parts[0], (parts[1] || 1) - 1, 1);\r\n\t } else date = i18n.dateFormatDate(value.replace(/^[>< =]+/, \"\"));\r\n\t }\r\n\r\n\t return date.valueOf();\r\n\t }\r\n\t}, datafilter.numberFilter);\r\n\r\n\tvar api$4 = {\r\n\t name: \"baselayout\",\r\n\t restore: function restore(state$$1, factory, configOnly) {\r\n\t var out = this._restore(copy(state$$1), factory);\r\n\r\n\t if (configOnly) return out;else ui(out.cols || out.rows, this);\r\n\t },\r\n\t _restore: function _restore(state$$1, factory) {\r\n\t if (state$$1.$layout) {\r\n\t var sub = state$$1.cols || state$$1.rows;\r\n\r\n\t for (var i = 0; i < sub.length; i++) {\r\n\t sub[i] = this._restore(sub[i], factory);\r\n\t }\r\n\t } else {\r\n\t return factory.call(this, state$$1);\r\n\t }\r\n\r\n\t return state$$1;\r\n\t },\r\n\t serialize: function serialize(serializer) {\r\n\t var out = [];\r\n\t var childs = this.getChildViews();\r\n\r\n\t for (var i = 0; i < childs.length; i++) {\r\n\t var sub = childs[i];\r\n\r\n\t if (sub.movePortlet) {\r\n\t var child = sub.getChildViews();\r\n\t out.push(serializer.call(this, child[child.length - 1]));\r\n\t } else if (sub.serialize) {\r\n\t // some kind of layout\r\n\t out.push(sub.serialize(serializer, true));\r\n\t } else {\r\n\t // leaf view\r\n\t out.push(serializer.call(this, sub));\r\n\t }\r\n\t }\r\n\r\n\t var obj = {\r\n\t $layout: true,\r\n\t type: this.config.type\r\n\t };\r\n\t if (this.config.rows) obj.rows = out;else obj.cols = out;\r\n\t return obj;\r\n\t },\r\n\t $init: function $init(config) {\r\n\t this.$ready.push(this._parse_cells);\r\n\t this._dataobj = this._contentobj;\r\n\t this._layout_sizes = [];\r\n\t this._responsive = [];\r\n\r\n\t if (config.$topView) {\r\n\t config.borderless = true;\r\n\t config._inner = {\r\n\t top: true,\r\n\t left: true,\r\n\t bottom: true,\r\n\t right: true\r\n\t };\r\n\t }\r\n\r\n\t if (config.isolate) exports.extend(this, IdSpace);\r\n\t },\r\n\t rows_setter: function rows_setter(value) {\r\n\t this._vertical_orientation = 1;\r\n\t this._collection = value;\r\n\t return true;\r\n\t },\r\n\t cols_setter: function cols_setter(value) {\r\n\t this._vertical_orientation = 0;\r\n\t this.$view.style.whiteSpace = \"nowrap\";\r\n\t this._collection = value;\r\n\t return true;\r\n\t },\r\n\t _remove: function _remove(view) {\r\n\t PowerArray.removeAt.call(this._cells, PowerArray.find.call(this._cells, view));\r\n\t this.resizeChildren(true);\r\n\t },\r\n\t _replace: function _replace(new_view, target_id) {\r\n\t if (isUndefined(target_id)) {\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t this._cells[i].destructor();\r\n\t }\r\n\r\n\t this._collection = new_view;\r\n\r\n\t this._parse_cells();\r\n\t } else {\r\n\t var source;\r\n\r\n\t if (typeof target_id == \"number\") {\r\n\t if (target_id < 0 || target_id > this._cells.length) target_id = this._cells.length;\r\n\t var prev_node = (this._cells[target_id] || {})._viewobj;\r\n\t PowerArray.insertAt.call(this._cells, new_view, target_id);\r\n\t if (!new_view._settings.hidden) insertBefore(new_view._viewobj, prev_node, this._dataobj);\r\n\t } else {\r\n\t source = $$(target_id);\r\n\t target_id = PowerArray.find.call(this._cells, source);\r\n\t assert(target_id != -1, \"Attempt to replace the non-existing view\");\r\n\t var parent = source._viewobj.parentNode;\r\n\t if (parent && !new_view._settings.hidden) parent.insertBefore(new_view._viewobj, source._viewobj);\r\n\t source.destructor();\r\n\t this._cells[target_id] = new_view;\r\n\t }\r\n\r\n\t if (!this._vertical_orientation) this._fix_vertical_layout(new_view);\r\n\t }\r\n\r\n\t this.resizeChildren(true);\r\n\t var form = this.elements ? this : this.getFormView();\r\n\t if (form) form._recollect_elements();\r\n\t callEvent(\"onReconstruct\", [this]);\r\n\t },\r\n\t _fix_vertical_layout: function _fix_vertical_layout(cell) {\r\n\t cell._viewobj.style.display = \"inline-block\";\r\n\t cell._viewobj.style.verticalAlign = \"top\";\r\n\t },\r\n\t addView: function addView(view, index$$1) {\r\n\t if (isUndefined(index$$1)) index$$1 = this._cells.length;\r\n\t var top = this.$$ ? this : this.getTopParentView();\r\n\t state._parent_cell = this;\r\n\t var newui = top && top.ui ? top.ui(view, this, index$$1) : ui(view, this, index$$1);\r\n\t state._parent_cell = null;\r\n\t return newui._settings.id;\r\n\t },\r\n\t removeView: function removeView(id) {\r\n\t var view;\r\n\t if (_typeof(id) != \"object\") view = $$(id) || (this.$$ ? this.$$(id) : null);else view = id;\r\n\t var target = PowerArray.find.call(this._cells, view);\r\n\r\n\t if (target >= 0) {\r\n\t if (this._beforeRemoveView) this._beforeRemoveView(target, view);\r\n\t var form = this.elements ? this : this.getFormView();\r\n\r\n\t this._cells.splice(target, 1);\r\n\r\n\t if (form) ui.each(view, function (sub) {\r\n\t if (sub.name) delete form.getCleanValues()[sub.config.name];\r\n\t }, form, true);\r\n\t view.destructor();\r\n\t this.resizeChildren(true);\r\n\t if (form) form._recollect_elements();\r\n\t } else assert(false, \"Attemp to remove not existing view: \" + id);\r\n\r\n\t callEvent(\"onReconstruct\", [this]);\r\n\t },\r\n\t reconstruct: function reconstruct() {\r\n\t this._hiddencells = 0;\r\n\r\n\t this._replace(this._collection);\r\n\t },\r\n\t _hide: function _hide(obj, settings, silent) {\r\n\t if (obj._settings.hidden) return;\r\n\t obj._settings.hidden = true;\r\n\t remove(obj._viewobj);\r\n\t this._hiddencells++;\r\n\t if (!silent && !state._ui_creation) this.resizeChildren(true);\r\n\t },\r\n\t _signal_hidden_cells: function _signal_hidden_cells(view) {\r\n\t if (view.callEvent) view.callEvent(\"onViewShow\", []);\r\n\t },\r\n\t resizeChildren: function resizeChildren() {\r\n\t if (state._freeze_resize) return;\r\n\r\n\t if (this._layout_sizes) {\r\n\t var parent = this.getParentView();\r\n\r\n\t if (parent) {\r\n\t if (parent.resizeChildren) return parent.resizeChildren();else return parent.resize();\r\n\t }\r\n\r\n\t var sizes = this.$getSize(0, 0);\r\n\t var x, y, nx, ny;\r\n\t nx = x = this._layout_sizes[0] || 0;\r\n\t ny = y = this._layout_sizes[1] || 0; //for auto-fill content, use adjust strategy\r\n\r\n\t if ((sizes[1] >= 100000 || sizes[3] >= 100000) && this._viewobj.parentNode) {\r\n\t //in hidden container adjust doesn't work, so fallback to last known size\r\n\t //also, ensure that min-size is not violated\r\n\t nx = x = Math.max(sizes[0], this._settings.width || this._viewobj.parentNode.offsetWidth || x || 0);\r\n\t ny = y = Math.max(sizes[2], this._settings.height || this._viewobj.parentNode.offsetHeight || y || 0);\r\n\t }\r\n\r\n\t if (!parent) {\r\n\t //minWidth\r\n\t if (sizes[0] > x) nx = sizes[0]; //minHeight\r\n\r\n\t if (sizes[2] > y) ny = sizes[2];\r\n\t var fullscreen = this._viewobj.parentNode == document.body && !this.setPosition; //maxWidth rule\r\n\r\n\t if (!fullscreen && x > sizes[1]) nx = sizes[1]; //maxHeight rule\r\n\r\n\t if (!fullscreen && y > sizes[3]) ny = sizes[3];\r\n\t this.$setSize(nx, ny);\r\n\t } else this._set_child_size(x, y);\r\n\r\n\t if (state._responsive_exception) {\r\n\t state._responsive_exception = false;\r\n\t this.resizeChildren();\r\n\t }\r\n\r\n\t callEvent(\"onResize\", []);\r\n\t }\r\n\t },\r\n\t getChildViews: function getChildViews() {\r\n\t return this._cells;\r\n\t },\r\n\t index: function index$$1(obj) {\r\n\t if (obj._settings) obj = obj._settings.id;\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t if (this._cells[i]._settings.id == obj) return i;\r\n\t }\r\n\r\n\t return -1;\r\n\t },\r\n\t _show: function _show(obj, settings, silent) {\r\n\t if (!obj._settings.hidden) return;\r\n\t obj._settings.hidden = false; //index of sibling cell, next to which new item will appear\r\n\r\n\t var index$$1 = this.index(obj) + 1; //locate nearest visible cell\r\n\r\n\t while (this._cells[index$$1] && this._cells[index$$1]._settings.hidden) {\r\n\t index$$1++;\r\n\t }\r\n\r\n\t var view = this._cells[index$$1] ? this._cells[index$$1]._viewobj : null;\r\n\t insertBefore(obj._viewobj, view, this._dataobj || this._viewobj);\r\n\t this._hiddencells--;\r\n\r\n\t if (!silent) {\r\n\t this.resizeChildren(true);\r\n\t if (obj.refresh) obj.refresh();\r\n\t }\r\n\r\n\t if (obj.callEvent) {\r\n\t obj.callEvent(\"onViewShow\", []);\r\n\t ui.each(obj, this._signal_hidden_cells);\r\n\t }\r\n\t },\r\n\t showBatch: function showBatch(name, mode) {\r\n\t var preserve = typeof mode != \"undefined\";\r\n\t mode = mode !== false;\r\n\r\n\t if (!preserve) {\r\n\t if (this._settings.visibleBatch == name) return;\r\n\t this._settings.visibleBatch = name;\r\n\t } else this._settings.visibleBatch = \"\";\r\n\r\n\t var show = [];\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t if (!this._cells[i]._settings.batch && !this._cells[i]._settings.hidden) show.push(this._cells[i]);else if (this._cells[i]._settings.batch == name) {\r\n\t if (mode) show.push(this._cells[i]);else this._hide(this._cells[i], null, true);\r\n\t } else if (!preserve) this._hide(this._cells[i], null, true);\r\n\t }\r\n\r\n\t for (var _i = 0; _i < show.length; _i++) {\r\n\t this._show(show[_i], null, true);\r\n\r\n\t show[_i]._render_hidden_views();\r\n\t }\r\n\r\n\t this.resizeChildren(true);\r\n\t },\r\n\t _parse_cells: function _parse_cells(collection) {\r\n\t this._cells = [];\r\n\t assert(collection, this.name + \" was incorrectly defined.

You have missed rows|cols|cells|elements collection\");\r\n\r\n\t for (var i = 0; i < collection.length; i++) {\r\n\t state._parent_cell = this;\r\n\t if (!collection[i]._inner) collection[i].borderless = true;\r\n\t this._cells[i] = ui._view(collection[i], this);\r\n\t if (!this._vertical_orientation) this._fix_vertical_layout(this._cells[i]);\r\n\r\n\t if (this._settings.visibleBatch && this._settings.visibleBatch != this._cells[i]._settings.batch && this._cells[i]._settings.batch) {\r\n\t this._cells[i]._settings.hidden = true;\r\n\t this._hiddencells++;\r\n\t }\r\n\r\n\t if (!this._cells[i]._settings.hidden) {\r\n\t (this._dataobj || this._contentobj).appendChild(this._cells[i]._viewobj);\r\n\r\n\t if (this._cells[i].$nospace) this._hiddencells++;\r\n\t }\r\n\t }\r\n\r\n\t if (this._parse_cells_ext_end) this._parse_cells_ext_end(collection);\r\n\t },\r\n\t _bubble_size: function _bubble_size(prop, size, vertical) {\r\n\t if (this._vertical_orientation != vertical) for (var i = 0; i < this._cells.length; i++) {\r\n\t this._cells[i]._settings[prop] = size;\r\n\t if (this._cells[i]._bubble_size) this._cells[i]._bubble_size(prop, size, vertical);\r\n\t }\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t debug_size_box_start(this, true);\r\n\t var minWidth = 0;\r\n\t var maxWidth = 100000;\r\n\t var maxHeight = 100000;\r\n\t var minHeight = 0;\r\n\t if (this._vertical_orientation) maxHeight = 0;else maxWidth = 0;\r\n\t var fixed = 0;\r\n\t var fixed_count = 0;\r\n\t var gravity = 0;\r\n\t this._sizes = [];\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t //ignore hidden cells\r\n\t if (this._cells[i]._settings.hidden) continue;\r\n\r\n\t var sizes = this._sizes[i] = this._cells[i].$getSize(0, 0);\r\n\r\n\t if (this._cells[i].$nospace) {\r\n\t fixed_count++;\r\n\t continue;\r\n\t }\r\n\r\n\t if (this._vertical_orientation) {\r\n\t //take max minSize value\r\n\t if (sizes[0] > minWidth) minWidth = sizes[0]; //take min maxSize value\r\n\r\n\t if (sizes[1] < maxWidth) maxWidth = sizes[1];\r\n\t minHeight += sizes[2];\r\n\t maxHeight += sizes[3];\r\n\r\n\t if (sizes[2] == sizes[3] && sizes[2] != -1) {\r\n\t fixed += sizes[2];\r\n\t fixed_count++;\r\n\t } else gravity += sizes[4];\r\n\t } else {\r\n\t //take max minSize value\r\n\t if (sizes[2] > minHeight) minHeight = sizes[2]; //take min maxSize value\r\n\r\n\t if (sizes[3] < maxHeight) maxHeight = sizes[3];\r\n\t minWidth += sizes[0];\r\n\t maxWidth += sizes[1];\r\n\r\n\t if (sizes[0] == sizes[1] && sizes[0] != -1) {\r\n\t fixed += sizes[0];\r\n\t fixed_count++;\r\n\t } else gravity += sizes[4];\r\n\t }\r\n\t }\r\n\r\n\t if (minHeight > maxHeight) maxHeight = minHeight;\r\n\t if (minWidth > maxWidth) maxWidth = minWidth;\r\n\t this._master_size = [fixed, this._cells.length - fixed_count, gravity];\r\n\t this._desired_size = [minWidth + dx, minHeight + dy]; //get layout sizes\r\n\r\n\t var self_size = baseview.api.$getSize.call(this, 0, 0); //use child settings if layout's one was not defined\r\n\r\n\t if (self_size[1] >= 100000) self_size[1] = 0;\r\n\t if (self_size[3] >= 100000) self_size[3] = 0;\r\n\t self_size[0] = (self_size[0] || minWidth) + dx;\r\n\t self_size[1] = Math.max(self_size[0], (self_size[1] || maxWidth) + dx);\r\n\t self_size[2] = (self_size[2] || minHeight) + dy;\r\n\t self_size[3] = Math.max(self_size[2], (self_size[3] || maxHeight) + dy);\r\n\t debug_size_box_end(this, self_size);\r\n\t if (!this._vertical_orientation && this._settings.responsive) self_size[0] = 0;\r\n\t return self_size;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t this._layout_sizes = [x, y];\r\n\t debug_size_box_start(this);\r\n\t baseview.api.$setSize.call(this, x, y);\r\n\r\n\t this._set_child_size(x, y);\r\n\r\n\t debug_size_box_end(this, [x, y]);\r\n\t },\r\n\t _set_child_size_a: function _set_child_size_a(sizes, min, max) {\r\n\t min = sizes[min];\r\n\t max = sizes[max];\r\n\t var height = min;\r\n\r\n\t if (min != max) {\r\n\t var ps = this._set_size_delta * sizes[4] / this._set_size_gravity;\r\n\r\n\t if (ps < min) {\r\n\t height = min;\r\n\t this._set_size_gravity -= sizes[4];\r\n\t this._set_size_delta -= height;\r\n\t } else if (ps > max) {\r\n\t height = max;\r\n\t this._set_size_gravity -= sizes[4];\r\n\t this._set_size_delta -= height;\r\n\t } else {\r\n\t return -1;\r\n\t }\r\n\t }\r\n\r\n\t return height;\r\n\t },\r\n\t _responsive_hide: function _responsive_hide(cell, mode) {\r\n\t var target = $$(mode);\r\n\r\n\t if (target === \"hide\" || !target) {\r\n\t cell.hide();\r\n\t cell._responsive_marker = \"hide\";\r\n\t } else {\r\n\t //for SideBar in Webix 1.9\r\n\t if (!target) target = ui({\r\n\t view: \"popup\",\r\n\t body: [{}]\r\n\t });\r\n\t cell._responsive_width = cell._settings.width;\r\n\t cell._responsive_height = cell._settings.height;\r\n\t cell._responsive_marker = target._settings.id;\r\n\t cell._settings.width = 0;\r\n\t if (!cell._settings.height) cell._settings.autoheight = true;\r\n\t ui(cell, target, this._responsive.length);\r\n\t }\r\n\r\n\t this._responsive.push(cell);\r\n\t },\r\n\t _responsive_show: function _responsive_show(cell) {\r\n\t var target = cell._responsive_marker;\r\n\t cell._responsive_marker = 0;\r\n\r\n\t if (target === \"hide\" || !target) {\r\n\t cell.show();\r\n\t } else {\r\n\t cell._settings.width = cell._responsive_width;\r\n\t cell._settings.height = cell._responsive_height;\r\n\t delete cell._settings.autoheight;\r\n\t var index$$1 = 0;\r\n\r\n\t while (this._cells[index$$1] && this._cells[index$$1]._settings.responsiveCell === false) {\r\n\t index$$1++;\r\n\t }\r\n\r\n\t ui(cell, this, index$$1);\r\n\t }\r\n\r\n\t this._responsive.pop();\r\n\t },\r\n\t _responsive_cells: function _responsive_cells(x) {\r\n\t state._responsive_tinkery = true;\r\n\r\n\t if (x + this._paddingX * 2 + this._margin * (this._cells.length - 1) < this._desired_size[0]) {\r\n\t var max = this._cells.length - 1;\r\n\r\n\t for (var i = 0; i < max; i++) {\r\n\t var cell = this._cells[i];\r\n\r\n\t if (!cell._responsive_marker) {\r\n\t if (cell._settings.responsiveCell !== false) {\r\n\t this._responsive_hide(cell, this._settings.responsive);\r\n\r\n\t callEvent(\"onResponsiveHide\", [cell._settings.id]);\r\n\t state._responsive_exception = true;\r\n\t break;\r\n\t } else {\r\n\t max = this._cells.length;\r\n\t }\r\n\t }\r\n\t }\r\n\t } else if (this._responsive.length) {\r\n\t var _cell = this._responsive[this._responsive.length - 1];\r\n\t var dx = _cell._responsive_marker == \"hide\" ? 0 : _cell._responsive_width;\r\n\r\n\t var px = _cell.$getSize(dx, 0);\r\n\r\n\t if (px[0] + this._desired_size[0] + this._margin + 20 <= x) {\r\n\t this._responsive_show(_cell);\r\n\r\n\t callEvent(\"onResponsiveShow\", [_cell._settings.id]);\r\n\t state._responsive_exception = true;\r\n\t }\r\n\t }\r\n\r\n\t state._responsive_tinkery = false;\r\n\t },\r\n\t _set_child_size: function _set_child_size(x, y) {\r\n\t state._child_sizing_active = (state._child_sizing_active || 0) + 1;\r\n\t if (!this._vertical_orientation && this._settings.responsive) this._responsive_cells(x, y);\r\n\t this._set_size_delta = (this._vertical_orientation ? y : x) - this._master_size[0];\r\n\t this._set_size_gravity = this._master_size[2];\r\n\t var width = x;\r\n\t var height = y;\r\n\t var auto = [];\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t //ignore hidden cells\r\n\t if (this._cells[i]._settings.hidden || !this._sizes[i]) continue;\r\n\t var sizes = this._sizes[i];\r\n\r\n\t if (this._vertical_orientation) {\r\n\t height = this._set_child_size_a(sizes, 2, 3);\r\n\r\n\t if (height < 0) {\r\n\t auto.push(i);\r\n\t continue;\r\n\t }\r\n\t } else {\r\n\t width = this._set_child_size_a(sizes, 0, 1);\r\n\r\n\t if (width < 0) {\r\n\t auto.push(i);\r\n\t continue;\r\n\t }\r\n\t }\r\n\r\n\t this._cells[i].$setSize(width, height);\r\n\t }\r\n\r\n\t for (var _i2 = 0; _i2 < auto.length; _i2++) {\r\n\t var index$$1 = auto[_i2];\r\n\t var _sizes = this._sizes[index$$1];\r\n\t var dx = Math.round(this._set_size_delta * _sizes[4] / this._set_size_gravity);\r\n\t this._set_size_delta -= dx;\r\n\t this._set_size_gravity -= _sizes[4];\r\n\t if (this._vertical_orientation) height = dx;else {\r\n\t width = dx;\r\n\t }\r\n\r\n\t this._cells[index$$1].$setSize(width, height);\r\n\t }\r\n\r\n\t state._child_sizing_active -= 1;\r\n\t },\r\n\t _next: function _next(obj, mode) {\r\n\t var index$$1 = this.index(obj);\r\n\t if (index$$1 == -1) return null;\r\n\t return this._cells[index$$1 + mode];\r\n\t },\r\n\t _first: function _first() {\r\n\t return this._cells[0];\r\n\t }\r\n\t};\r\n\tvar view$4 = exports.protoUI(api$4, EventSystem, baseview.view);\r\n\tvar baselayout = {\r\n\t api: api$4,\r\n\t view: view$4\r\n\t};\r\n\r\n\tvar api$5 = {\r\n\t name: \"layout\",\r\n\t $init: function $init() {\r\n\t this._hiddencells = 0;\r\n\t },\r\n\t defaults: {\r\n\t type: \"line\"\r\n\t },\r\n\t _parse_cells: function _parse_cells() {\r\n\t if (this._parse_cells_ext) collection = this._parse_cells_ext(collection);\r\n\r\n\t if (!this._parse_once) {\r\n\t this._viewobj.className += \" webix_layout_\" + (this._settings.type || \"\");\r\n\t this._parse_once = 1;\r\n\t }\r\n\r\n\t if (this._settings.margin !== undefined) this._margin = this._settings.margin;\r\n\t if (this._settings.padding != undefined) this._paddingX = this._paddingY = this._settings.padding;\r\n\t if (this._settings.paddingX !== undefined) this._paddingX = this._settings.paddingX;\r\n\t if (this._settings.paddingY !== undefined) this._paddingY = this._settings.paddingY;\r\n\t if (this._paddingY || this._paddingX) this._padding = true; //if layout has paddings we need to set the visible border \r\n\r\n\t if (this._hasBorders() && !this._settings.borderless) {\r\n\t this._contentobj.style.borderWidth = \"1px\"; //if layout has border - normal bordering rules are applied\r\n\r\n\t this._render_borders = true;\r\n\t }\r\n\r\n\t var collection = this._collection;\r\n\t if (this._settings.borderless) this._settings._inner = {\r\n\t top: true,\r\n\t left: true,\r\n\t right: true,\r\n\t bottom: true\r\n\t };\r\n\r\n\t this._beforeResetBorders(collection);\r\n\r\n\t baselayout.api._parse_cells.call(this, collection);\r\n\r\n\t this._afterResetBorders(collection);\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t dx = dx || 0;\r\n\t dy = dy || 0;\r\n\t var correction = this._margin * (this._cells.length - this._hiddencells - 1);\r\n\r\n\t if (this._render_borders || this._hasBorders()) {\r\n\t var _borders = this._settings._inner;\r\n\r\n\t if (_borders) {\r\n\t dx += (_borders.left ? 0 : 1) + (_borders.right ? 0 : 1);\r\n\t dy += (_borders.top ? 0 : 1) + (_borders.bottom ? 0 : 1);\r\n\t }\r\n\t }\r\n\r\n\t if (!this._settings.height) dy += (this._paddingY || 0) * 2 + (this._vertical_orientation ? correction : 0);\r\n\t if (!this._settings.width) dx += (this._paddingX || 0) * 2 + (this._vertical_orientation ? 0 : correction);\r\n\t return baselayout.api.$getSize.call(this, dx, dy);\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t this._layout_sizes = [x, y];\r\n\t debug_size_box_start(this);\r\n\t if (this._hasBorders() || this._render_borders) base.api.$setSize.call(this, x, y);else baseview.api.$setSize.call(this, x, y); //form with scroll\r\n\r\n\t y = this._content_height;\r\n\t x = this._content_width;\r\n\t var config = this._settings;\r\n\r\n\t if (config.scroll) {\r\n\t y = Math.max(y, this._desired_size[1]);\r\n\t x = Math.max(x, this._desired_size[0]);\r\n\t }\r\n\r\n\t this._set_child_size(x, y);\r\n\r\n\t debug_size_box_end(this, [x, y]);\r\n\t },\r\n\t _set_child_size: function _set_child_size(x, y) {\r\n\t var correction = this._margin * (this._cells.length - this._hiddencells - 1);\r\n\r\n\t if (this._vertical_orientation) {\r\n\t y -= correction + this._paddingY * 2;\r\n\t x -= this._paddingX * 2;\r\n\t } else {\r\n\t x -= correction + this._paddingX * 2;\r\n\t y -= this._paddingY * 2;\r\n\t }\r\n\r\n\t return baselayout.api._set_child_size.call(this, x, y);\r\n\t },\r\n\t resizeChildren: function resizeChildren(structure_changed) {\r\n\t if (structure_changed) {\r\n\t this._last_size = null; //forces children resize\r\n\r\n\t var config = [];\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t var cell = this._cells[i];\r\n\t config[i] = cell._settings;\r\n\t var n = cell._layout_sizes && !cell._render_borders || cell._settings.borderless ? \"0px\" : \"1px\";\r\n\t cell._viewobj.style.borderTopWidth = cell._viewobj.style.borderBottomWidth = cell._viewobj.style.borderLeftWidth = cell._viewobj.style.borderRightWidth = n;\r\n\t }\r\n\r\n\t this._beforeResetBorders(config);\r\n\r\n\t for (var _i = 0; _i < config.length; _i++) {\r\n\t if (config[_i].borderless && this._cells[_i]._set_inner) this._cells[_i]._set_inner(config[_i]);\r\n\t }\r\n\r\n\t this._afterResetBorders(this._cells);\r\n\t }\r\n\r\n\t if (state._responsive_tinkery) return;\r\n\t baselayout.api.resizeChildren.call(this);\r\n\t },\r\n\t _hasBorders: function _hasBorders() {\r\n\t return this._padding && this._margin > 0 && !this._cleanlayout;\r\n\t },\r\n\t _beforeResetBorders: function _beforeResetBorders(collection) {\r\n\t if (this._hasBorders() && (!this._settings.borderless || this._settings.type == \"space\")) {\r\n\t for (var i = 0; i < collection.length; i++) {\r\n\t if (!collection[i]._inner || !collection[i].borderless) collection[i]._inner = {\r\n\t top: false,\r\n\t left: false,\r\n\t right: false,\r\n\t bottom: false\r\n\t };\r\n\t }\r\n\t } else {\r\n\t for (var _i2 = 0; _i2 < collection.length; _i2++) {\r\n\t collection[_i2]._inner = clone(this._settings._inner);\r\n\t }\r\n\r\n\t var mode = false;\r\n\t if (this._cleanlayout) mode = true;\r\n\t var maxlength = collection.length;\r\n\r\n\t if (this._vertical_orientation) {\r\n\t for (var _i3 = 1; _i3 < maxlength - 1; _i3++) {\r\n\t collection[_i3]._inner.top = collection[_i3]._inner.bottom = mode;\r\n\t }\r\n\r\n\t if (maxlength > 1) {\r\n\t if (this._settings.type != \"head\") collection[0]._inner.bottom = mode;\r\n\r\n\t while (collection[maxlength - 1].hidden && maxlength > 1) {\r\n\t maxlength--;\r\n\t }\r\n\r\n\t if (maxlength > 0) collection[maxlength - 1]._inner.top = mode;\r\n\t }\r\n\t } else {\r\n\t for (var _i4 = 1; _i4 < maxlength - 1; _i4++) {\r\n\t collection[_i4]._inner.left = collection[_i4]._inner.right = mode;\r\n\t }\r\n\r\n\t if (maxlength > 1) {\r\n\t if (this._settings.type != \"head\") collection[0]._inner.right = mode;\r\n\t collection[maxlength - 1]._inner.left = mode;\r\n\r\n\t while (maxlength > 1 && collection[maxlength - 1].hidden) {\r\n\t maxlength--;\r\n\t }\r\n\r\n\t if (maxlength > 0) collection[maxlength - 1]._inner.left = mode;\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _fix_container_borders: function _fix_container_borders(style, inner) {\r\n\t if (inner.top) style.borderTopWidth = \"0px\";\r\n\t if (inner.left) style.borderLeftWidth = \"0px\";\r\n\t if (inner.right) style.borderRightWidth = \"0px\";\r\n\t if (inner.bottom) style.borderBottomWidth = \"0px\";\r\n\t },\r\n\t _afterResetBorders: function _afterResetBorders(collection) {\r\n\t var start = 0;\r\n\r\n\t for (var i = 0; i < collection.length; i++) {\r\n\t var cell = this._cells[i];\r\n\t var s_inner = cell._settings._inner;\r\n\r\n\t if (cell._settings.hidden && this._cells[i + 1]) {\r\n\t var s_next = this._cells[i + 1]._settings._inner;\r\n\t if (!s_inner.top) s_next.top = false;\r\n\t if (!s_inner.left) s_next.left = false;\r\n\t if (i == start) start++;\r\n\t }\r\n\r\n\t this._fix_container_borders(cell._viewobj.style, cell._settings._inner);\r\n\t }\r\n\r\n\t var style = this._vertical_orientation ? \"marginLeft\" : \"marginTop\";\r\n\t var contrstyle = this._vertical_orientation ? \"marginTop\" : \"marginLeft\";\r\n\t var padding = this._vertical_orientation ? this._paddingX : this._paddingY;\r\n\t var contrpadding = this._vertical_orientation ? this._paddingY : this._paddingX; //add top offset to all\r\n\r\n\t for (var _i5 = 0; _i5 < collection.length; _i5++) {\r\n\t this._cells[_i5]._viewobj.style[style] = (padding || 0) + \"px\";\r\n\t } //add left offset to first cell\r\n\r\n\r\n\t if (this._cells.length) this._cells[start]._viewobj.style[contrstyle] = (contrpadding || 0) + \"px\"; //add offset between cells\r\n\r\n\t for (var index = start + 1; index < collection.length; index++) {\r\n\t this._cells[index]._viewobj.style[contrstyle] = this._margin + \"px\";\r\n\t }\r\n\t },\r\n\t type_setter: function type_setter(value) {\r\n\t this._margin = typeof this._margin_set[value] != \"undefined\" ? this._margin_set[value] : this._margin_set[\"line\"];\r\n\t this._paddingX = this._paddingY = typeof this._margin_set[value] != \"undefined\" ? this._padding_set[value] : this._padding_set[\"line\"];\r\n\t this._cleanlayout = value == \"material\" || value == \"clean\";\r\n\t if (value == \"material\") this._settings.borderless = true;\r\n\t return value;\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this._margin_set = $active.layoutMargin;\r\n\t this._padding_set = $active.layoutPadding;\r\n\t }\r\n\t};\r\n\tvar view$5 = exports.protoUI(api$5, baselayout.view);\r\n\tvar layout = {\r\n\t api: api$5,\r\n\t view: view$5\r\n\t}; //not necessary anymore\r\n\t//preserving for backward compatibility\r\n\r\n\tview$5.call(-1);\r\n\r\n\tvar api$6 = {\r\n\t name: \"daterange\",\r\n\t defaults: {\r\n\t button: false,\r\n\t icons: false,\r\n\t calendarCount: 2,\r\n\t borderless: false\r\n\t },\r\n\t $init: function $init(config) {\r\n\t config.calendar = config.calendar || {};\r\n\t config.value = this._correct_value(config.value);\r\n\t delete config.calendar.type; // other types are not implemented\r\n\r\n\t this._viewobj.className += \" webix_daterange\";\r\n\t this._zoom_level = this._types[config.calendar.type] || 0;\r\n\t var cols = [],\r\n\t skinConf = $active.calendar,\r\n\t cheight = skinConf && skinConf.height ? skinConf.height : 250,\r\n\t cwidth = skinConf && skinConf.width ? skinConf.width : 250,\r\n\t calendar = exports.extend({\r\n\t view: \"calendar\",\r\n\t width: cwidth,\r\n\t height: cheight\r\n\t }, config.calendar || {}, true),\r\n\t count = config.calendarCount = this._zoom_level === 0 ? config.calendarCount || this.defaults.calendarCount : this.defaults.calendarCount,\r\n\t basecss = (calendar.css ? calendar.css + \" \" : \"\") + \"webix_range_\",\r\n\t start = config.value.start || new Date();\r\n\r\n\t for (var i = 0; i < count; i++) {\r\n\t var date = wDate.add(start, this._steps[this._zoom_level] * i, \"month\", true);\r\n\t exports.extend(calendar, {\r\n\t events: bind(this._isInRange, this),\r\n\t css: basecss + (count === 1 ? \"\" : i === 0 ? \"0\" : i + 1 == count ? \"N\" : \"1\"),\r\n\t timepicker: this._zoom_level === 0 ? config.timepicker : false,\r\n\t borderless: true,\r\n\t date: date\r\n\t }, true);\r\n\t cols.push(copy(calendar));\r\n\t }\r\n\r\n\t config.rows = [{\r\n\t type: \"clean\",\r\n\t cols: cols\r\n\t }, this._footer_row(config, cwidth * count)];\r\n\t config.height = config.height || calendar.height + (config.icons || config.button ? 35 : 0);\r\n\t config.type = \"line\";\r\n\t this.$ready.push(this._after_init);\r\n\t event$1(this.$view, \"keydown\", bind(function (e) {\r\n\t this._onKeyPress(e.which || e.keyCode, e);\r\n\t }, this));\r\n\t },\r\n\t value_setter: function value_setter(value) {\r\n\t return this._correct_value(value);\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this._settings.value;\r\n\t },\r\n\t setValue: function setValue(value, silent) {\r\n\t value = this._correct_value(value);\r\n\t this._settings.value = value;\r\n\t var start = value.start || value.end || new Date();\r\n\r\n\t if (!silent) {\r\n\t this._cals[0].showCalendar(value.start);\r\n\r\n\t for (var i = 1; i < this._cals.length; i++) {\r\n\t this._cals[i]._settings.date = start;\r\n\r\n\t this._changeDateSilent(this._cals[i], 1, i);\r\n\t }\r\n\t }\r\n\r\n\t this.callEvent(\"onChange\", [value]);\r\n\t this.refresh();\r\n\t },\r\n\t refresh: function refresh() {\r\n\t for (var i = 0; i < this._cals.length; i++) {\r\n\t if (this._cals[i]._zoom_level === this._zoom_level) {\r\n\t removeCss(this._cals[i].$view, \"webix_cal_timepicker\");\r\n\t removeCss(this._cals[i].$view, \"webix_range_timepicker\");\r\n\r\n\t var rel = this._related_date(this._cals[i].getVisibleDate());\r\n\r\n\t if (rel.start || rel.end) {\r\n\t this._cals[i]._settings.date = rel.start || rel.end;\r\n\r\n\t if (this._settings.timepicker) {\r\n\t var css = \"webix_\" + (rel.start && rel.end ? \"range\" : \"cal\") + \"_timepicker\";\r\n\t addCss(this._cals[i].$view, css);\r\n\t }\r\n\t } else wDate.datePart(this._cals[i]._settings.date);\r\n\r\n\t this._cals[i].refresh();\r\n\t }\r\n\t }\r\n\t },\r\n\t addToRange: function addToRange(date) {\r\n\t var value = this._add_date(this._string_to_date(date));\r\n\r\n\t this.setValue(value);\r\n\t },\r\n\t _icons: [{\r\n\t template: function template$$1() {\r\n\t return \"\" + i18n.calendar.today + \"\";\r\n\t },\r\n\t on_click: {\r\n\t \"webix_cal_icon_today\": function webix_cal_icon_today() {\r\n\t var date = new Date();\r\n\t if (!this._settings.timepicker) date = wDate.datePart(date);\r\n\t this.addToRange(date);\r\n\t this.callEvent(\"onTodaySet\", [this.getValue()]);\r\n\t }\r\n\t }\r\n\t }, {\r\n\t template: function template$$1() {\r\n\t return \"\" + i18n.calendar.clear + \"\";\r\n\t },\r\n\t on_click: {\r\n\t \"webix_cal_icon_clear\": function webix_cal_icon_clear() {\r\n\t this.setValue(\"\");\r\n\t this.callEvent(\"onDateClear\", []);\r\n\t }\r\n\t }\r\n\t }],\r\n\t _icons_template: function _icons_template(icons) {\r\n\t if (!icons) return {\r\n\t width: 0\r\n\t };else {\r\n\t icons = _typeof(icons) == \"object\" ? icons : this._icons; //custom or default \r\n\r\n\t var icons_template = {\r\n\t css: \"webix_cal_footer \",\r\n\t borderless: true,\r\n\t height: 30,\r\n\t template: \"
\",\r\n\t onClick: {}\r\n\t };\r\n\r\n\t for (var i = 0; i < icons.length; i++) {\r\n\t if (icons[i].template) {\r\n\t var itemplate = typeof icons[i].template == \"function\" ? icons[i].template : template(icons[i].template);\r\n\t icons_template.template += itemplate.call(this);\r\n\t }\r\n\r\n\t if (icons[i].on_click) {\r\n\t for (var k in icons[i].on_click) {\r\n\t icons_template.onClick[k] = bind(icons[i].on_click[k], this);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t icons_template.template += \"
\";\r\n\t icons_template.width = getTextSize(icons_template.template).width + 30;\r\n\t return icons_template;\r\n\t }\r\n\t },\r\n\t _footer_row: function _footer_row(config, width) {\r\n\t var button = {\r\n\t view: \"button\",\r\n\t value: i18n.calendar.done,\r\n\t minWidth: 100,\r\n\t maxWidth: 230,\r\n\t align: \"center\",\r\n\t height: 30,\r\n\t click: function click() {\r\n\t this.getParentView().getParentView().hide();\r\n\t }\r\n\t };\r\n\r\n\t var icons = this._icons_template(config.icons);\r\n\r\n\t var row = {\r\n\t css: \"webix_range_footer\",\r\n\t cols: [{\r\n\t width: icons.width\r\n\t }]\r\n\t };\r\n\t if ((config.button || config.icons) && icons.width * 2 + button.minWidth > width) row.cols[0].width = 0;\r\n\t row.cols.push(config.button ? button : {});\r\n\t row.cols.push(icons);\r\n\t return row;\r\n\t },\r\n\t _types: {\r\n\t \"time\": -1,\r\n\t \"month\": 1,\r\n\t \"year\": 2\r\n\t },\r\n\t _steps: {\r\n\t 0: 1,\r\n\t 1: 12,\r\n\t 2: 120\r\n\t },\r\n\t _correct_value: function _correct_value(value) {\r\n\t if (!value) value = {\r\n\t start: null,\r\n\t end: null\r\n\t };\r\n\t if (!value.start && !value.end) value = {\r\n\t start: value\r\n\t };\r\n\t value.end = this._string_to_date(value.end) || null;\r\n\t value.start = this._string_to_date(value.start) || null;\r\n\t if (value.end && value.end < value.start || !value.start) value.end = [value.start, value.start = value.end][0];\r\n\t return value;\r\n\t },\r\n\t _string_to_date: function _string_to_date(date) {\r\n\t if (typeof date == \"string\") {\r\n\t date = i18n.parseFormatDate(date);\r\n\t }\r\n\r\n\t return isNaN(date * 1) ? null : date;\r\n\t },\r\n\t _isInRange: function _isInRange(date, isOutside) {\r\n\t if (isOutside) return;\r\n\t var v = this._settings.value,\r\n\t s = v.start ? wDate.datePart(wDate.copy(v.start)) : null,\r\n\t e = v.end ? wDate.datePart(wDate.copy(v.end)) : null,\r\n\t d = wDate.datePart(date),\r\n\t tomorrow = wDate.add(d, 1, \"day\", true),\r\n\t yesterday = wDate.add(d, -1, \"day\", true),\r\n\t css = \"\";\r\n\r\n\t if (d >= s && e && d <= e) {\r\n\t css = \"webix_cal_range\";\r\n\t if (wDate.equal(yesterday, s)) css += \" webix_cal_range_first\";\r\n\t if (wDate.equal(tomorrow, e)) css += \" webix_cal_range_last\";\r\n\t }\r\n\r\n\t if (wDate.equal(d, s)) css = \"webix_cal_range_start\";\r\n\t if (wDate.equal(d, e)) css = \"webix_cal_range_end\";\r\n\t var holiday = wDate.isHoliday(date) + \" \" || \"\";\r\n\t return css + \" \" + holiday;\r\n\t },\r\n\t _after_init: function _after_init() {\r\n\t var cals = this._cals = this.getChildViews()[0].getChildViews();\r\n\t var range = this;\r\n\t var masterId = this.config.id;\r\n\t this._cals_hash = {};\r\n\r\n\t for (var i = 0; i < cals.length; i++) {\r\n\t cals[i].config.master = masterId;\r\n\t this._cals_hash[cals[i].config.id] = i; //events\r\n\r\n\t cals[i].attachEvent(\"onBeforeDateSelect\", function (date) {\r\n\t return range._on_date_select(this, date);\r\n\t });\r\n\t cals[i].attachEvent(\"onBeforeZoom\", function (zoom) {\r\n\t return range._before_zoom(this, zoom);\r\n\t });\r\n\r\n\t if (i === 0 || i === cals.length - 1) {\r\n\t cals[i].attachEvent(\"onAfterMonthChange\", bind(this._month_change, this));\r\n\t cals[i].attachEvent(\"onAfterZoom\", function (zoom, oldzoom) {\r\n\t range._after_zoom(this, zoom, oldzoom);\r\n\t });\r\n\t }\r\n\t }\r\n\r\n\t if (this._settings.timepicker) this.refresh();\r\n\t },\r\n\t _before_zoom: function _before_zoom(view, zoom) {\r\n\t var ind = this._getIndexById(view.config.id);\r\n\r\n\t if (zoom >= 0 && ind > 0 && ind !== this._cals.length - 1) return false;\r\n\r\n\t if (zoom === -1) {\r\n\t //time mode\r\n\t var rel = this._related_date(view.getVisibleDate());\r\n\r\n\t if (rel.start && rel.end) //both dates are in one calendar\r\n\t view._settings.date = rel[this._time_mode];\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t _month_change: function _month_change(now, prev) {\r\n\t var dir = now > prev ? 1 : -1;\r\n\t var start = now > prev ? this._cals[this._cals.length - 1] : this._cals[0];\r\n\t var step = start._zoom_logic[start._zoom_level]._changeStep;\r\n\r\n\t this._shift(dir, step, start);\r\n\r\n\t this.refresh();\r\n\t },\r\n\t _after_zoom: function _after_zoom(start, zoom, oldzoom) {\r\n\t var step = start._zoom_logic[start._zoom_level]._changeStep;\r\n\r\n\t var ind = this._getIndexById(start.config.id);\r\n\r\n\t var dir = ind === 0 ? 1 : -1;\r\n\t if (!this._cals[ind + dir]) return;\r\n\t var next = this._cals[ind + dir]._settings.date;\r\n\r\n\t if (oldzoom > zoom && zoom >= 0) {\r\n\t var diff = 0;\r\n\r\n\t if (zoom === 1) {\r\n\t //year was changed \r\n\t var year = next.getFullYear();\r\n\t if (this._zoom_level || dir === -1 && next.getMonth() === 11 || dir === 1 && next.getMonth() === 0) year = year - dir;\r\n\t diff = start._settings.date.getFullYear() - year;\r\n\t } else if (zoom === 0) {\r\n\t //month was changed\r\n\t var month = next.getMonth() - dir;\r\n\t if (month === 12 || month == -1) month = month === -1 ? 11 : 0;\r\n\t diff = start._settings.date.getMonth() - month;\r\n\t }\r\n\r\n\t this._shift(diff, step, start);\r\n\r\n\t this.refresh();\r\n\t }\r\n\t },\r\n\t _changeDateSilent: function _changeDateSilent(view, dir, step) {\r\n\t view.blockEvent();\r\n\t if (view._zoom_level >= 0) view._changeDate(dir, step);\r\n\t view.unblockEvent();\r\n\t },\r\n\t _getIndexById: function _getIndexById(id) {\r\n\t return this._cals_hash[id];\r\n\t },\r\n\t _shift: function _shift(dir, step, start) {\r\n\t for (var i = 0; i < this._cals.length; i++) {\r\n\t var next = this._cals[i];\r\n\t if (!start || next.config.id !== start.config.id) this._changeDateSilent(next, dir, step);\r\n\t }\r\n\t },\r\n\t _related_date: function _related_date(date) {\r\n\t var v = this._settings.value;\r\n\t var rel = {};\r\n\t if (v.start && v.start.getYear() === date.getYear() && v.start.getMonth() === date.getMonth()) rel.start = v.start;\r\n\t if (v.end && v.end.getYear() === date.getYear() && v.end.getMonth() === date.getMonth()) rel.end = v.end;\r\n\t return rel;\r\n\t },\r\n\t _set_time: function _set_time(date, source) {\r\n\t date.setHours(source.getHours());\r\n\t date.setMinutes(source.getMinutes());\r\n\t date.setSeconds(source.getSeconds());\r\n\t date.setMilliseconds(source.getMilliseconds());\r\n\t },\r\n\t _add_date: function _add_date(date, ind) {\r\n\t var v = copy(this._settings.value); //year, month\r\n\r\n\t if (this._zoom_level !== 0 && !isUndefined(ind)) {\r\n\t var key = ind ? \"end\" : \"start\";\r\n\t v[key] = date;\r\n\t } else {\r\n\t if (v.start && !v.end) v.end = date;else {\r\n\t v.start = date;\r\n\t v.end = null;\r\n\t }\r\n\t }\r\n\r\n\t return v;\r\n\t },\r\n\t _on_date_select: function _on_date_select(view, date) {\r\n\t if (this.callEvent(\"onBeforeDateSelect\", [date])) {\r\n\t var v = this._settings.value;\r\n\r\n\t if (view._zoom_level < 0) {\r\n\t //time set\r\n\t var rel = copy(this._related_date(date)),\r\n\t reldate;\r\n\t reldate = rel.start && rel.end ? rel[this._time_mode] : rel.start || rel.end;\r\n\t if (reldate) this._set_time(reldate, date);\r\n\t view._zoom_level = 0;\r\n\t v = exports.extend(copy(v), rel, true);\r\n\t } else {\r\n\t var vis = view.getVisibleDate();\r\n\r\n\t var ind = this._getIndexById(view.config.id);\r\n\r\n\t if (date.getMonth() !== vis.getMonth() && (ind === 0 || ind === this._cals.length - 1)) {\r\n\t var dir = date > vis ? 1 : -1;\r\n\r\n\t this._shift(dir, 1);\r\n\t }\r\n\r\n\t v = this._add_date(date, ind);\r\n\t }\r\n\r\n\t if (view._zoom_level !== this._zoom_level) view.showCalendar(date);\r\n\t this.setValue(v, true);\r\n\t this.callEvent(\"onAfterDateSelect\", [this.getValue()]);\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\t};\r\n\tvar view$6 = exports.protoUI(api$6, layout.view);\r\n\tvar daterange = {\r\n\t api: api$6,\r\n\t view: view$6\r\n\t};\r\n\r\n\tdatafilter.richSelectFilter = {\r\n\t getInputNode: function getInputNode(node) {\r\n\t return $$(node.$webix) || null;\r\n\t },\r\n\t getValue: function getValue$$1(node) {\r\n\t var ui$$1 = this.getInputNode(node);\r\n\t return ui$$1 ? ui$$1.getValue() : \"\";\r\n\t },\r\n\t setValue: function setValue(node, value) {\r\n\t var ui$$1 = this.getInputNode(node);\r\n\t return ui$$1 ? ui$$1.setValue(value) : \"\";\r\n\t },\r\n\t compare: function compare(a, b) {\r\n\t return a == b;\r\n\t },\r\n\t refresh: function refresh(master, node, value) {\r\n\t if (master.$destructed) return;\r\n\t var select = $$(value.richselect); //IE8 can destory the content of richselect, so recreating\r\n\r\n\t if (!select.$view.parentNode) {\r\n\t var d = create(\"div\", {\r\n\t \"class\": \"webix_richfilter\"\r\n\t });\r\n\t d.appendChild(select.$view);\r\n\t }\r\n\r\n\t node.$webix = value.richselect;\r\n\t node.style.marginLeft = \"-10px\";\r\n\t value.compare = value.compare || this.compare;\r\n\t value.prepare = value.prepare || this.prepare;\r\n\t master.registerFilter(node, value, this);\r\n\t var data;\r\n\t var options = value.options;\r\n\r\n\t if (options) {\r\n\t if (typeof options == \"string\") {\r\n\t data = value.options = [];\r\n\t ajax(options).then(bind(function (data) {\r\n\t value.options = data.json();\r\n\t var node = document.body.contains(node) ? node : document.body.querySelector(\"[active_id=\\\"\" + value.contentId + \"\\\"]\");\r\n\t this.refresh(master, node, value);\r\n\t }, this));\r\n\t } else data = options;\r\n\t } else data = master.collectValues(value.columnId);\r\n\r\n\t var list = select.getPopup().getList();\r\n\t var optview = $$(options);\r\n\r\n\t if (optview && optview.data && optview.data.getRange) {\r\n\t data = optview.data.getRange();\r\n\t } //reattaching node back to master container\r\n\r\n\r\n\t node.firstChild.appendChild(select.$view.parentNode); //load data in list, must be after reattaching, as callback of parse can try to operate with innerHTML\r\n\r\n\t if (list.parse) {\r\n\t list.clearAll();\r\n\t list.parse(data);\r\n\r\n\t if (!this.$noEmptyOption && value.emptyOption !== false || value.emptyOption) {\r\n\t var emptyOption = {\r\n\t id: \"\",\r\n\t value: value.emptyOption || \"\",\r\n\t $empty: true\r\n\t };\r\n\t list.add(emptyOption, 0);\r\n\t }\r\n\t } //set actual value for the filter\r\n\r\n\r\n\t if (value.value) this.setValue(node, value.value); //repaint the filter control\r\n\r\n\t select.render(); //adjust sizes after full rendering\r\n\r\n\t delay(select.resize, select);\r\n\t },\r\n\t render: function render(master, config) {\r\n\t if (!config.richselect) {\r\n\t var d = create(\"div\", {\r\n\t \"class\": \"webix_richfilter\"\r\n\t });\r\n\t var richconfig = {\r\n\t container: d,\r\n\t view: this.inputtype,\r\n\t options: []\r\n\t };\r\n\t var inputConfig = exports.extend(this.inputConfig || {}, config.inputConfig || {}, true);\r\n\t exports.extend(richconfig, inputConfig);\r\n\t if (config.separator) richconfig.separator = config.separator;\r\n\t if (config.suggest) richconfig.suggest = config.suggest;\r\n\t var richselect = ui(richconfig);\r\n\t richselect.attachEvent(\"onChange\", function () {\r\n\t master.filterByAll();\r\n\t });\r\n\t config.richselect = richselect._settings.id;\r\n\r\n\t master._destroy_with_me.push(richselect);\r\n\t }\r\n\r\n\t config.css = \"webix_div_filter\";\r\n\t return \" \";\r\n\t },\r\n\t inputtype: \"richselect\"\r\n\t};\r\n\tdatafilter.serverRichSelectFilter = exports.extend({\r\n\t $server: true\r\n\t}, datafilter.richSelectFilter);\r\n\tdatafilter.multiSelectFilter = exports.extend({\r\n\t $noEmptyOption: true,\r\n\t inputtype: \"multiselect\",\r\n\t prepare: function prepare(value, filter) {\r\n\t if (!value) return value;\r\n\t var hash = {};\r\n\t var parts = value.toString().split(filter.separator || \",\");\r\n\r\n\t for (var i = 0; i < parts.length; i++) {\r\n\t hash[parts[i]] = 1;\r\n\t }\r\n\r\n\t return hash;\r\n\t },\r\n\t compare: function compare(a, b) {\r\n\t return !b || b[a];\r\n\t }\r\n\t}, datafilter.richSelectFilter);\r\n\tdatafilter.serverMultiSelectFilter = exports.extend({\r\n\t $server: true,\r\n\t _on_change: function _on_change() {\r\n\t var id = this._comp_id;\r\n\t $$(id).filterByAll();\r\n\t }\r\n\t}, datafilter.multiSelectFilter);\r\n\tdatafilter.multiComboFilter = exports.extend({\r\n\t inputtype: \"multicombo\",\r\n\t inputConfig: {\r\n\t tagMode: false\r\n\t }\r\n\t}, datafilter.multiSelectFilter);\r\n\tdatafilter.serverMultiComboFilter = exports.extend({\r\n\t inputtype: \"multicombo\",\r\n\t inputConfig: {\r\n\t tagMode: false\r\n\t }\r\n\t}, datafilter.serverMultiSelectFilter);\r\n\tdatafilter.datepickerFilter = exports.extend({\r\n\t prepare: function prepare(value) {\r\n\t return value || \"\";\r\n\t },\r\n\t compare: function compare(a, b) {\r\n\t return a * 1 == b * 1;\r\n\t },\r\n\t inputtype: \"datepicker\"\r\n\t}, datafilter.richSelectFilter);\r\n\tdatafilter.columnGroup = {\r\n\t getValue: function getValue$$1() {},\r\n\t setValue: function setValue() {},\r\n\t getHelper: function getHelper(node, config) {\r\n\t return {\r\n\t open: function open() {\r\n\t config.closed = true;\r\n\t node.onclick();\r\n\t },\r\n\t close: function close() {\r\n\t config.closed = false;\r\n\t node.onclick();\r\n\t },\r\n\t isOpened: function isOpened() {\r\n\t return config.closed;\r\n\t }\r\n\t };\r\n\t },\r\n\t refresh: function refresh(master, node, config) {\r\n\t node.onclick = function (e) {\r\n\t stopEvent(e);\r\n\t var mark = this.firstChild.firstChild;\r\n\r\n\t if (config.closed) {\r\n\t config.closed = false;\r\n\t mark.className = \"webix_tree_open\";\r\n\t } else {\r\n\t config.closed = true;\r\n\t mark.className = \"webix_tree_close\";\r\n\t }\r\n\r\n\t delay(function () {\r\n\t master.callEvent(\"onColumnGroupCollapse\", [config.columnId, config.batch, !config.closed]);\r\n\t master.showColumnBatch(config.batch, !config.closed);\r\n\t });\r\n\t };\r\n\r\n\t if (!config.firstRun) {\r\n\t config.firstRun = 1;\r\n\t if (config.closed) master.showColumnBatch(config.batch, false);\r\n\t }\r\n\t },\r\n\t render: function render(master, config) {\r\n\t return \"
 \" + (config.groupText || \"\");\r\n\t }\r\n\t};\r\n\tdatafilter.dateRangeFilter = exports.extend({\r\n\t prepare: function prepare(value) {\r\n\t if (!value.start && !value.end) return \"\";\r\n\t return daterange.api._correct_value(value);\r\n\t },\r\n\t compare: function compare(a, b) {\r\n\t return (!b.start || a >= b.start) && (!b.end || a <= b.end);\r\n\t },\r\n\t inputtype: \"daterangepicker\"\r\n\t}, datafilter.richSelectFilter);\r\n\tdatafilter.serverDateRangeFilter = exports.extend({\r\n\t $server: true\r\n\t}, datafilter.dateRangeFilter);\r\n\r\n\tenv.scrollSize = env.touch || env.$customScroll ? 0 : 17;\r\n\tready(function () {\r\n\t var size = _detectScrollSize();\r\n\r\n\t env.scrollSize = env.touch ? 0 : size;\r\n\t});\r\n\r\n\tfunction _detectScrollSize() {\r\n\t var div = create(\"div\");\r\n\t div.className = \"webix_skin_mark\";\r\n\t div.style.cssText = \"position:absolute;left:-1000px;width:100px;padding:0px;margin:0px;min-height:100px;overflow-y:scroll;\";\r\n\t document.body.appendChild(div);\r\n\t var width = div.offsetWidth - div.clientWidth;\r\n\t var name = {\r\n\t 200: \"flat\",\r\n\t 210: \"compact\",\r\n\t 230: \"contrast\",\r\n\t 240: \"material\",\r\n\t 250: \"mini\"\r\n\t }[Math.floor(div.offsetHeight / 10) * 10];\r\n\t document.body.removeChild(div);\r\n\t if (name) set$1(name);\r\n\t if (env.$customScroll) return 0;\r\n\t return width;\r\n\t}\r\n\r\n\tvar fixed = false;\r\n\r\n\tfunction _fixHeight() {\r\n\t if (fixed) return;\r\n\t addStyle(\"html, body{ height:100%; }\");\r\n\t document.body.className += \" webix_full_screen\";\r\n\t Touch.limit(false);\r\n\t fixed = true;\r\n\t}\r\n\r\n\tdefine(\"_fixHeight\", _fixHeight);\r\n\r\n\tui.animate = animate$1;\r\n\tui.animateView = animateView;\r\n\tui.freeze = freeze;\r\n\tui.resize = resize;\r\n\tui.each = each;\r\n\tui.hasMethod = hasMethod;\r\n\tui.datafilter = datafilter;\r\n\tui.fullScreen = fullScreen;\r\n\r\n\t/*German (Germany) locale*/\r\n\tvar de = {\r\n\t groupDelimiter: \".\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2,\r\n\t dateFormat: \"%d.%n.%Y\",\r\n\t timeFormat: \"%H:%i\",\r\n\t longDateFormat: \"%j. %F %Y\",\r\n\t fullDateFormat: \"%j. %F %Y %H:%i\",\r\n\t am: null,\r\n\t pm: null,\r\n\t price: \"{obj} €\",\r\n\t priceSettings: {\r\n\t groupDelimiter: \".\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2\r\n\t },\r\n\t calendar: {\r\n\t monthFull: [\"Januar\", \"Februar\", \"März\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\r\n\t monthShort: [\"Jan\", \"Feb\", \"Mrz\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\r\n\t dayFull: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\r\n\t dayShort: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\r\n\t hours: \"Stunden\",\r\n\t minutes: \"Minuten\",\r\n\t done: \"Fertig\",\r\n\t clear: \"Entfernen\",\r\n\t today: \"Heute\"\r\n\t },\r\n\t dataExport: {\r\n\t page: \"Seite\",\r\n\t of: \"aus\"\r\n\t },\r\n\t PDFviewer: {\r\n\t of: \"aus\",\r\n\t automaticZoom: \"Automatisch Zoom\",\r\n\t actualSize: \"Aktuelles Ausmaß\",\r\n\t pageFit: \"Seite Ausmaß\",\r\n\t pageWidth: \"Seite Breite\",\r\n\t pageHeight: \"Seite Höhe\"\r\n\t },\r\n\t aria: {\r\n\t calendar: \"Kalender\",\r\n\t increaseValue: \"Wert erhöhen\",\r\n\t decreaseValue: \"Wert verringern\",\r\n\t navMonth: [\"Vorheriger Monat\", \"Nächsten Monat\"],\r\n\t navYear: [\"Vorheriges Jahr\", \"Nächstes Jahr\"],\r\n\t navDecade: [\"Zurück Jahrzehnt\", \"Als nächstes Jahrzehnt\"],\r\n\t dateFormat: \"%j. %F %Y\",\r\n\t monthFormat: \"%F %Y\",\r\n\t yearFormat: \"%Y\",\r\n\t hourFormat: \"Stunden: %H\",\r\n\t minuteFormat: \"Minuten: %i\",\r\n\t removeItem: \"Element entfernen\",\r\n\t pages: [\"Erste Seite\", \"Vorherige Seite\", \"Folgeseite\", \"Letzte Seite\"],\r\n\t page: \"Seite\",\r\n\t headermenu: \"Titelmenü\",\r\n\t openGroup: \"Öffnen Spaltengruppe \",\r\n\t closeGroup: \"Schließen Spaltengruppe \",\r\n\t closeTab: \"Tab schließen\",\r\n\t showTabs: \"Weitere Tabs\",\r\n\t resetTreeMap: \"Zurück zur ursprünglichen Ansicht\",\r\n\t navTreeMap: \"Aufleveln\",\r\n\t nextTab: \"Weiter tab\",\r\n\t prevTab: \"Zurück tab\",\r\n\t multitextSection: \"Element hinzufügen\",\r\n\t multitextextraSection: \"Element entfernen\",\r\n\t showChart: \"Chart anzeigen\",\r\n\t hideChart: \"Chart verstecken\",\r\n\t resizeChart: \"Chart Größe ändern\"\r\n\t },\r\n\t richtext: {\r\n\t underline: \"Unterstreichen\",\r\n\t bold: \"Fettgedruckt\",\r\n\t italic: \"Kursiv\"\r\n\t },\r\n\t combo: {\r\n\t select: \"Auswählen\",\r\n\t selectAll: \"Alles auswählen\",\r\n\t unselectAll: \"Alles widerrufen\"\r\n\t },\r\n\t message: {\r\n\t ok: \"OK\",\r\n\t cancel: \"Abbrechen\"\r\n\t }\r\n\t};\r\n\r\n\t/*Spanish (Spain, International Sort) locale*/\r\n\tvar es = {\r\n\t groupDelimiter: \".\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2,\r\n\t dateFormat: \"%d/%n/%Y\",\r\n\t timeFormat: \"%G:%i\",\r\n\t longDateFormat: \"%d %F %Y\",\r\n\t fullDateFormat: \"%d %F %Y %G:%i\",\r\n\t am: null,\r\n\t pm: null,\r\n\t price: \"{obj} €\",\r\n\t priceSettings: {\r\n\t groupDelimiter: \".\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2\r\n\t },\r\n\t calendar: {\r\n\t monthFull: [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"],\r\n\t monthShort: [\"ene\", \"feb\", \"mar\", \"abr\", \"may\", \"jun\", \"jul\", \"ago\", \"sep\", \"oct\", \"nov\", \"dic\"],\r\n\t dayFull: [\"domingo\", \"lunes\", \"martes\", \"miércoles\", \"jueves\", \"viernes\", \"sábado\"],\r\n\t dayShort: [\"dom\", \"lun\", \"mar\", \"mié\", \"jue\", \"vie\", \"sáb\"],\r\n\t hours: \"Horas\",\r\n\t minutes: \"Minutos\",\r\n\t done: \"Listo\",\r\n\t clear: \"Reinicio\",\r\n\t today: \"Hoy\"\r\n\t },\r\n\t dataExport: {\r\n\t page: \"Página\",\r\n\t of: \"de\"\r\n\t },\r\n\t PDFviewer: {\r\n\t of: \"de\",\r\n\t automaticZoom: \"Zoom automático\",\r\n\t actualSize: \"Tamaño real\",\r\n\t pageFit: \"Tamaño de página\",\r\n\t pageWidth: \"Ancho de página\",\r\n\t pageHeight: \"Altura de la página\"\r\n\t },\r\n\t aria: {\r\n\t calendar: \"Сalendario\",\r\n\t increaseValue: \"Aumentar el valor\",\r\n\t decreaseValue: \"Disminuye el valor\",\r\n\t navMonth: [\"Mes anterior\", \"Próximo mes\"],\r\n\t navYear: [\"Año anterior\", \"Próximo año\"],\r\n\t navDecade: [\"Década anterior\", \"Próxima década\"],\r\n\t dateFormat: \"%d %F %Y\",\r\n\t monthFormat: \"%F %Y\",\r\n\t yearFormat: \"%Y\",\r\n\t hourFormat: \"Horas: %G\",\r\n\t minuteFormat: \"Minutos: %i\",\r\n\t removeItem: \"Retire el elemento\",\r\n\t pages: [\"Primera página\", \"Pagina anterior\", \"Siguiente página\", \"Última página\"],\r\n\t page: \"Página\",\r\n\t headermenu: \"Menú de títulos\",\r\n\t openGroup: \"Grupo de columnas abiertas\",\r\n\t closeGroup: \"Primer grupo de columnas\",\r\n\t closeTab: \"Cerrar tab\",\r\n\t showTabs: \"Mostrar más tabs\",\r\n\t resetTreeMap: \"Volver a la vista original\",\r\n\t navTreeMap: \"Elevar a mismo nivel\",\r\n\t nextTab: \"Siguiente tab\",\r\n\t prevTab: \"Tab anterior\",\r\n\t multitextSection: \"Añadir elemento\",\r\n\t multitextextraSection: \"Retire el elemento\",\r\n\t showChart: \"Espectáculo chart\",\r\n\t hideChart: \"Esconder chart\",\r\n\t resizeChart: \"Cambiar el tamaño el chart\"\r\n\t },\r\n\t richtext: {\r\n\t underline: \"Subrayar\",\r\n\t bold: \"Negrita\",\r\n\t italic: \"Itálico\"\r\n\t },\r\n\t combo: {\r\n\t select: \"Seleccionar\",\r\n\t selectAll: \"Seleccionar todo\",\r\n\t unselectAll: \"Deselecciona todo\"\r\n\t },\r\n\t message: {\r\n\t ok: \"OK\",\r\n\t cancel: \"Cancelar\"\r\n\t }\r\n\t};\r\n\r\n\tvar fr = {\r\n\t groupDelimiter: \" \",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2,\r\n\t dateFormat: \"%d/%m/%Y\",\r\n\t timeFormat: \"%H:%i\",\r\n\t longDateFormat: \"%d %F %Y\",\r\n\t fullDateFormat: \"%d.%m.%Y %H:%i\",\r\n\t price: \"{obj} €\",\r\n\t priceSettings: null,\r\n\t //use number defaults\r\n\t calendar: {\r\n\t monthFull: [\"Janvier\", \"Février\", \"Mars\", \"Avril\", \"Mai\", \"Juin\", \"Juillet\", \"Août\", \"Septembre\", \"Octobre\", \"Novembre\", \"Décembre\"],\r\n\t monthShort: [\"Jan\", \"Fév\", \"Mar\", \"Avr\", \"Mai\", \"Juin\", \"Juil\", \"Aôu\", \"Sep\", \"Oct\", \"Nov\", \"Déc\"],\r\n\t dayFull: [\"Dimanche\", \"Lundi\", \"Mardi\", \"Mercredi\", \"Jeudi\", \"Vendredi\", \"Samedi\"],\r\n\t dayShort: [\"Dim\", \"Lun\", \"Mar\", \"Mer\", \"Jeu\", \"Ven\", \"Sam\"],\r\n\t hours: \"Heures\",\r\n\t minutes: \"Minutes\",\r\n\t done: \"Fini\",\r\n\t clear: \"Effacer\",\r\n\t today: \"Aujourd'hui\"\r\n\t },\r\n\t dataExport: {\r\n\t page: \"Page\",\r\n\t of: \"sur\"\r\n\t },\r\n\t PDFviewer: {\r\n\t of: \"sur\",\r\n\t automaticZoom: \"Zoom automatique\",\r\n\t actualSize: \"Taille actuelle\",\r\n\t pageFit: \"Taille de la page\",\r\n\t pageWidth: \"Largeur de la page\",\r\n\t pageHeight: \"Hauteur de page\"\r\n\t },\r\n\t aria: {\r\n\t calendar: \"Сalendrier\",\r\n\t increaseValue: \"Augmenter la valeur\",\r\n\t decreaseValue: \"Diminution de la valeur\",\r\n\t navMonth: [\"Le mois précédent\", \"Le mois prochain\"],\r\n\t navYear: [\"Année précédente\", \"L'année prochaine\"],\r\n\t navDecade: [\"Décennie précédente\", \"Suivant décennie\"],\r\n\t dateFormat: \"%d %F %Y\",\r\n\t monthFormat: \"%F %Y\",\r\n\t yearFormat: \"%Y\",\r\n\t hourFormat: \"Heures: %H\",\r\n\t minuteFormat: \"Minutes: %i\",\r\n\t removeItem: \"Retirer l'élément\",\r\n\t pages: [\"Première page\", \"Page précédente\", \"Page suivante\", \"Dernière page\"],\r\n\t page: \"Page\",\r\n\t headermenu: \"Menu de titre\",\r\n\t openGroup: \"Ouvrir groupe de colonnes \",\r\n\t closeGroup: \"Fermer groupe de colonnes\",\r\n\t closeTab: \"Fermer tab\",\r\n\t showTabs: \"Montrer plus tabs\",\r\n\t resetTreeMap: \"Revenir à la vue originale\",\r\n\t navTreeMap: \"Niveau supérieur\",\r\n\t nextTab: \"Prochain tab\",\r\n\t prevTab: \"Précédent tab\",\r\n\t multitextSection: \"Ajouter l'élément\",\r\n\t multitextextraSection: \"Retirer l'élément\",\r\n\t showChart: \"Montrer chart\",\r\n\t hideChart: \"Cacher chart\",\r\n\t resizeChart: \"Redimensionner chart\"\r\n\t },\r\n\t richtext: {\r\n\t underline: \"Souligner\",\r\n\t bold: \"Gras\",\r\n\t italic: \"Italique\"\r\n\t },\r\n\t combo: {\r\n\t select: \"Sélectionner\",\r\n\t selectAll: \"Tout sélectionner\",\r\n\t unselectAll: \"Tout déselectionner\"\r\n\t },\r\n\t message: {\r\n\t ok: \"OK\",\r\n\t cancel: \"Annuler\"\r\n\t }\r\n\t};\r\n\r\n\t/*Italian (Italy) locale*/\r\n\tvar it = {\r\n\t groupDelimiter: \".\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2,\r\n\t dateFormat: \"%d/%m/%Y\",\r\n\t timeFormat: \"%H:%i\",\r\n\t longDateFormat: \"%j %F %Y\",\r\n\t fullDateFormat: \"%j %F %Y %H:%i\",\r\n\t am: null,\r\n\t pm: null,\r\n\t price: \"€ {obj}\",\r\n\t priceSettings: {\r\n\t groupDelimiter: \".\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2\r\n\t },\r\n\t calendar: {\r\n\t monthFull: [\"gennaio\", \"febbraio\", \"marzo\", \"aprile\", \"maggio\", \"giugno\", \"luglio\", \"agosto\", \"settembre\", \"ottobre\", \"novembre\", \"dicembre\"],\r\n\t monthShort: [\"gen\", \"feb\", \"mar\", \"apr\", \"mag\", \"giu\", \"lug\", \"ago\", \"set\", \"ott\", \"nov\", \"dic\"],\r\n\t dayFull: [\"domenica\", \"lunedì\", \"martedì\", \"mercoledì\", \"giovedì\", \"venerdì\", \"sabato\"],\r\n\t dayShort: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\r\n\t hours: \"Orario\",\r\n\t minutes: \"Minuti\",\r\n\t done: \"Pronto\",\r\n\t clear: \"Pulisci\",\r\n\t today: \"Oggi\"\r\n\t },\r\n\t dataExport: {\r\n\t page: \"Pagina\",\r\n\t of: \"di\"\r\n\t },\r\n\t PDFviewer: {\r\n\t of: \"di\",\r\n\t automaticZoom: \"Zoom automatico\",\r\n\t actualSize: \"Dimensione reale\",\r\n\t pageFit: \"Dimensioni della pagina\",\r\n\t pageWidth: \"Larghezza della pagina\",\r\n\t pageHeight: \"Altezza della pagina\"\r\n\t },\r\n\t aria: {\r\n\t calendar: \"Calendario\",\r\n\t increaseValue: \"Aumenta il valore\",\r\n\t decreaseValue: \"Riduci il valore\",\r\n\t navMonth: [\"Il mese scorso\", \"Il prossimo mese\"],\r\n\t navYear: [\"L'anno scorso\", \"L'anno prossimo\"],\r\n\t navDecade: [\"Decennio precedente\", \"Prossimo decennio\"],\r\n\t dateFormat: \"%j %F %Y\",\r\n\t monthFormat: \"%F %Y\",\r\n\t yearFormat: \"%Y\",\r\n\t hourFormat: \"Orario: %H\",\r\n\t minuteFormat: \"Minuti: %i\",\r\n\t removeItem: \"Rimuovere l'elemento\",\r\n\t pages: [\"Prima pagina\", \"Pagina precedente\", \"Pagina successiva\", \"Ultima pagina\"],\r\n\t page: \"Pagina\",\r\n\t headermenu: \"Menu del titolo\",\r\n\t openGroup: \"Aperto gruppo di colonne\",\r\n\t closeGroup: \"Chiudi gruppo di colonne\",\r\n\t closeTab: \"Chiudi tab\",\r\n\t showTabs: \"Mostra più tabs\",\r\n\t resetTreeMap: \"Tornare alla vista originale\",\r\n\t navTreeMap: \"Livello superiore\",\r\n\t nextTab: \"Tab successivo\",\r\n\t prevTab: \"Tab precedente\",\r\n\t multitextSection: \"Aggiungi elemento\",\r\n\t multitextextraSection: \"Rimuovere l'elemento\",\r\n\t showChart: \"Mostrare grafico\",\r\n\t hideChart: \"Nascondere grafico\",\r\n\t resizeChart: \"Ridimensionare grafico\"\r\n\t },\r\n\t richtext: {\r\n\t underline: \"Sottolineare\",\r\n\t bold: \"Grassetto\",\r\n\t italic: \"Corsivo\"\r\n\t },\r\n\t combo: {\r\n\t select: \"Selezionare\",\r\n\t selectAll: \"Seleziona tutto\",\r\n\t unselectAll: \"Deseleziona tutto\"\r\n\t },\r\n\t message: {\r\n\t ok: \"OK\",\r\n\t cancel: \"Annullare\"\r\n\t }\r\n\t};\r\n\r\n\tvar ja = {\r\n\t groupDelimiter: \",\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \".\",\r\n\t decimalSize: 2,\r\n\t dateFormat: \"%Y.%m.%d\",\r\n\t timeFormat: \"%H:%i\",\r\n\t longDateFormat: \"%Y年%m月%d日\",\r\n\t fullDateFormat: \"%Y.%m.%d %H:%i\",\r\n\t price: \"¥{obj}\",\r\n\t priceSettings: {\r\n\t groupSize: 3,\r\n\t groupDelimiter: \",\",\r\n\t decimalDelimiter: \"\",\r\n\t decimalSize: 0\r\n\t },\r\n\t calendar: {\r\n\t monthFull: [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"],\r\n\t monthShort: [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"],\r\n\t dayFull: [\"日曜日\", \"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\"],\r\n\t dayShort: [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"],\r\n\t hours: \"営業時間\",\r\n\t minutes: \"分\",\r\n\t done: \"レディー\",\r\n\t clear: \"削除する\",\r\n\t today: \"今日\"\r\n\t },\r\n\t dataExport: {\r\n\t page: \"ページ\",\r\n\t of: \"から\"\r\n\t },\r\n\t PDFviewer: {\r\n\t of: \"から\",\r\n\t automaticZoom: \"自動ズーム\",\r\n\t actualSize: \"実サイズ\",\r\n\t pageFit: \"ページサイズ\",\r\n\t pageWidth: \"ページ幅\",\r\n\t pageHeight: \"ページの高さ\"\r\n\t },\r\n\t aria: {\r\n\t calendar: \"カレンダー\",\r\n\t increaseValue: \"増加値\",\r\n\t decreaseValue: \"数字を小さく\",\r\n\t navMonth: [\"前の月\", \"来月\"],\r\n\t navYear: [\"前年\", \"来年\"],\r\n\t navDecade: [\"前の十年\", \"次の10年\"],\r\n\t dateFormat: \"%Y年%m月%d日\",\r\n\t monthFormat: \"%Y年%m月\",\r\n\t yearFormat: \"%Y年\",\r\n\t hourFormat: \"営業時間: %H\",\r\n\t minuteFormat: \"分: %i\",\r\n\t removeItem: \"要素を削除します\",\r\n\t pages: [\"一ページ目\", \"前のページ\", \"次のページ\", \"最後のページ\"],\r\n\t page: \"ページ\",\r\n\t headermenu: \"ヘッダメニュー\",\r\n\t openGroup: \"オープン列グループ\",\r\n\t closeGroup: \"閉じる列グループ\",\r\n\t closeTab: \"タブを閉じます\",\r\n\t showTabs: \"複数のタブを表示します\",\r\n\t resetTreeMap: \"元の表示に戻ります\",\r\n\t navTreeMap: \"レベルパック\",\r\n\t nextTab: \"次のタブ\",\r\n\t prevTab: \"前のタブ\",\r\n\t multitextSection: \"要素を追加します。\",\r\n\t multitextextraSection: \"要素を削除します\",\r\n\t showChart: \"靴チャート\",\r\n\t hideChart: \"隠すチャート\",\r\n\t resizeChart: \"グラフのサイズを変更\"\r\n\t },\r\n\t richtext: {\r\n\t underline: \"アンダーライン\",\r\n\t bold: \"大胆な\",\r\n\t italic: \"イタリック\"\r\n\t },\r\n\t combo: {\r\n\t select: \"選択する\",\r\n\t selectAll: \"すべて選択\",\r\n\t unselectAll: \"すべての選択を解除する\"\r\n\t },\r\n\t message: {\r\n\t ok: \"OK\",\r\n\t cancel: \"取り消す\"\r\n\t }\r\n\t};\r\n\r\n\tvar pt = {\r\n\t groupDelimiter: \".\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2,\r\n\t dateFormat: \"%d/%m/%Y\",\r\n\t timeFormat: \"%G:%i\",\r\n\t longDateFormat: \"%d de %F de %Y\",\r\n\t fullDateFormat: \"%d de %F de %Y %G:%i\",\r\n\t am: null,\r\n\t pm: null,\r\n\t price: \"R$ {obj}\",\r\n\t priceSettings: {\r\n\t groupDelimiter: \".\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2\r\n\t },\r\n\t fileSize: [\"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\", \"Pb\", \"Eb\"],\r\n\t calendar: {\r\n\t monthFull: [\"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\r\n\t monthShort: [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"],\r\n\t dayFull: [\"Domingo\", \"Segunda-Feira\", \"Terça-Feira\", \"Quarta-Feira\", \"Quinta-Feira\", \"Sexta-Feira\", \"Sábado\"],\r\n\t dayShort: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"Sáb\"],\r\n\t hours: \"Horas\",\r\n\t minutes: \"Minutos\",\r\n\t done: \"Feito\",\r\n\t clear: \"Limpar\",\r\n\t today: \"Hoje\"\r\n\t },\r\n\t dataExport: {\r\n\t page: \"Página\",\r\n\t of: \"de\"\r\n\t },\r\n\t PDFviewer: {\r\n\t of: \"de\",\r\n\t automaticZoom: \"Zoom automático\",\r\n\t actualSize: \"Tamanho atual\",\r\n\t pageFit: \"Tamanho da página\",\r\n\t pageWidth: \"Largura da página\",\r\n\t pageHeight: \"Altura da página\"\r\n\t },\r\n\t aria: {\r\n\t calendar: \"Calendário\",\r\n\t increaseValue: \"Aumentar o valor\",\r\n\t decreaseValue: \"Diminuir o valor\",\r\n\t navMonth: [\"Mês anterior\", \"Próximo mês\"],\r\n\t navYear: [\"Ano anterior\", \"Próximo ano\"],\r\n\t navDecade: [\"Década anterior\", \"Próxima década\"],\r\n\t dateFormat: \"%d de %F de %Y\",\r\n\t monthFormat: \"%F de %Y\",\r\n\t yearFormat: \"%Y\",\r\n\t hourFormat: \"Horas: %G\",\r\n\t minuteFormat: \"Minutos: %i\",\r\n\t removeItem: \"Remover elemento\",\r\n\t pages: [\"Primeira página\", \"Página anterior\", \"Próxima página\", \"Última página\"],\r\n\t page: \"Página\",\r\n\t headermenu: \"Menu de títulos\",\r\n\t openGroup: \"Grupo coluna aberta\",\r\n\t closeGroup: \"Fechar grupo de colunas\",\r\n\t closeTab: \"Fechar tab\",\r\n\t showTabs: \"Mostre mais tabs\",\r\n\t resetTreeMap: \"Мoltar à vista original\",\r\n\t navTreeMap: \"Upar\",\r\n\t nextTab: \"Próximo tab\",\r\n\t prevTab: \"Anterior tab\",\r\n\t multitextSection: \"Adicionar elemento\",\r\n\t multitextextraSection: \"Remover elemento\",\r\n\t showChart: \"Exposição chart\",\r\n\t hideChart: \"Esconder chart\",\r\n\t resizeChart: \"Redimensionar chart\"\r\n\t },\r\n\t richtext: {\r\n\t underline: \"Sublinhado\",\r\n\t bold: \"Negrito\",\r\n\t italic: \"itálico\"\r\n\t },\r\n\t combo: {\r\n\t select: \"Selecionar\",\r\n\t selectAll: \"Selecionar tudo\",\r\n\t unselectAll: \"Desmarque todos\"\r\n\t },\r\n\t message: {\r\n\t ok: \"OK\",\r\n\t cancel: \"Cancelar\"\r\n\t }\r\n\t};\r\n\r\n\t/*Chinese (Simplified, PRC) locale*/\r\n\tvar zh = {\r\n\t groupDelimiter: \",\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \".\",\r\n\t decimalSize: 2,\r\n\t dateFormat: \"%Y/%m/%j\",\r\n\t timeFormat: \"%G:%i\",\r\n\t longDateFormat: \"%Y'年'%m'月'%j'日'\",\r\n\t fullDateFormat: \"%Y'年'%m'月'%j'日' %G:%i\",\r\n\t am: [\"上午\", \"上午\"],\r\n\t pm: [\"下午\", \"下午\"],\r\n\t price: \"¥{obj}\",\r\n\t priceSettings: {\r\n\t groupDelimiter: \",\",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \".\",\r\n\t decimalSize: 2\r\n\t },\r\n\t calendar: {\r\n\t monthFull: [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"],\r\n\t monthShort: [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"],\r\n\t dayFull: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"],\r\n\t dayShort: [\"周日\", \"周一\", \"周二\", \"周三\", \"周四\", \"周五\", \"周六\"],\r\n\t hours: \"小时\",\r\n\t minutes: \"分钟\",\r\n\t done: \"完成\",\r\n\t clear: \"清除\",\r\n\t today: \"今天\"\r\n\t },\r\n\t dataExport: {\r\n\t page: \"页\",\r\n\t of: \"从\"\r\n\t },\r\n\t PDFviewer: {\r\n\t of: \"从\",\r\n\t automaticZoom: \"自动设置页面大小\",\r\n\t actualSize: \"实际尺寸\",\r\n\t pageFit: \"页面大小\",\r\n\t pageWidth: \"页面宽度\",\r\n\t pageHeight: \"页面高度\"\r\n\t },\r\n\t aria: {\r\n\t calendar: \"日历\",\r\n\t increaseValue: \"增加值\",\r\n\t decreaseValue: \"减少值\",\r\n\t navMonth: [\"上个月\", \"下个月\"],\r\n\t navYear: [\"上年\", \"明年\"],\r\n\t navDecade: [\"过去十年\", \"下个十年\"],\r\n\t dateFormat: \"%Y'年'%m'月'%j'日'\",\r\n\t monthFormat: \"%Y'年'%m'月\",\r\n\t yearFormat: \"%Y'年\",\r\n\t hourFormat: \"小时: %G\",\r\n\t minuteFormat: \"分钟: %i\",\r\n\t removeItem: \"删除元素\",\r\n\t pages: [\"第一页\", \"上一页\", \"下一页\", \"最后一页\"],\r\n\t page: \"页\",\r\n\t headermenu: \"标题菜单\",\r\n\t openGroup: \"打开栏目组\",\r\n\t closeGroup: \"关闭栏目组\",\r\n\t closeTab: \"关闭标签\",\r\n\t showTabs: \"显示更多选项卡\",\r\n\t resetTreeMap: \"回到原来的视图\",\r\n\t navTreeMap: \"升级\",\r\n\t nextTab: \"下一个标签\",\r\n\t prevTab: \"前一个标签\",\r\n\t multitextSection: \"加元\",\r\n\t multitextextraSection: \"删除元素\",\r\n\t showChart: \"显示图表\",\r\n\t hideChart: \"隐藏图表\",\r\n\t resizeChart: \"调整图\"\r\n\t },\r\n\t richtext: {\r\n\t underline: \"强调\",\r\n\t bold: \"粗體\",\r\n\t italic: \"斜体\"\r\n\t },\r\n\t combo: {\r\n\t select: \"选择\",\r\n\t selectAll: \"全选\",\r\n\t unselectAll: \"全部取消选择\"\r\n\t },\r\n\t message: {\r\n\t ok: \"好\",\r\n\t cancel: \"取消\"\r\n\t }\r\n\t};\r\n\r\n\tvar ru = {\r\n\t groupDelimiter: \" \",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2,\r\n\t dateFormat: \"%d.%m.%Y\",\r\n\t timeFormat: \"%H:%i\",\r\n\t longDateFormat: \"%d %F %Y\",\r\n\t fullDateFormat: \"%d.%m.%Y %H:%i\",\r\n\t price: \"{obj} руб.\",\r\n\t priceSettings: null,\r\n\t //use number defaults\r\n\t calendar: {\r\n\t monthFull: [\"Январь\", \"Февраль\", \"Март\", \"Апрель\", \"Maй\", \"Июнь\", \"Июль\", \"Август\", \"Сентябрь\", \"Oктябрь\", \"Ноябрь\", \"Декабрь\"],\r\n\t monthShort: [\"Янв\", \"Фев\", \"Maр\", \"Aпр\", \"Maй\", \"Июн\", \"Июл\", \"Aвг\", \"Сен\", \"Окт\", \"Ноя\", \"Дек\"],\r\n\t dayFull: [\"Воскресенье\", \"Понедельник\", \"Вторник\", \"Среда\", \"Четверг\", \"Пятница\", \"Суббота\"],\r\n\t dayShort: [\"Вс\", \"Пн\", \"Вт\", \"Ср\", \"Чт\", \"Пт\", \"Сб\"],\r\n\t hours: \"Часы\",\r\n\t minutes: \"Минуты\",\r\n\t done: \"Гoтовo\",\r\n\t clear: \"Очистить\",\r\n\t today: \"Сегодня\"\r\n\t },\r\n\t dataExport: {\r\n\t page: \"Страница\",\r\n\t of: \"из\"\r\n\t },\r\n\t PDFviewer: {\r\n\t of: \"из\",\r\n\t automaticZoom: \"Автоматический зум\",\r\n\t actualSize: \"Настоящий размер\",\r\n\t pageFit: \"Размер страницы\",\r\n\t pageWidth: \"Ширина страницы\",\r\n\t pageHeight: \"Высота страницы\"\r\n\t },\r\n\t aria: {\r\n\t calendar: \"Календарь\",\r\n\t increaseValue: \"Увеличить значение\",\r\n\t decreaseValue: \"Уменьшить значение\",\r\n\t navMonth: [\"Предыдущий месяц\", \"Следующий месяц\"],\r\n\t navYear: [\"Предыдущий год\", \"Следующий год\"],\r\n\t navDecade: [\"Предыдущие десять лет\", \"Следующие десять лет\"],\r\n\t dateFormat: \"%d %F %Y\",\r\n\t monthFormat: \"%F %Y\",\r\n\t yearFormat: \"%Y\",\r\n\t hourFormat: \"Часы: %H\",\r\n\t minuteFormat: \"Минуты: %i\",\r\n\t removeItem: \"Удалить элемент\",\r\n\t pages: [\"Первая страница\", \"Предыдущая страница\", \"Следующая страница\", \"Последняя страница\"],\r\n\t page: \"Страница\",\r\n\t headermenu: \"Меню шапки таблицы\",\r\n\t openGroup: \"Развернуть группу столбцов\",\r\n\t closeGroup: \"Свернуть группу столбцов\",\r\n\t closeTab: \"Закрыть вкладку\",\r\n\t showTabs: \"Показать больше вкладок\",\r\n\t resetTreeMap: \"Вернуться к первоначальному представлению\",\r\n\t navTreeMap: \"Перейти на уровень выше\",\r\n\t nextTab: \"Следующая вкладка\",\r\n\t prevTab: \"Предыдущая вкладка\",\r\n\t multitextSection: \"Добавить элемент\",\r\n\t multitextextraSection: \"Удалить элемент\",\r\n\t showChart: \"Показать чарт\",\r\n\t hideChart: \"Спрятать чарт\",\r\n\t resizeChart: \"Изменить размер чарта\"\r\n\t },\r\n\t richtext: {\r\n\t underline: \"Подчеркивание\",\r\n\t bold: \"Жирный\",\r\n\t italic: \"Курсив\"\r\n\t },\r\n\t combo: {\r\n\t select: \"Выбрать\",\r\n\t selectAll: \"Выбрать все\",\r\n\t unselectAll: \"Сброс выбора\"\r\n\t },\r\n\t message: {\r\n\t ok: \"OK\",\r\n\t cancel: \"Отмена\"\r\n\t }\r\n\t};\r\n\r\n\tvar be = {\r\n\t groupDelimiter: \" \",\r\n\t groupSize: 3,\r\n\t decimalDelimiter: \",\",\r\n\t decimalSize: 2,\r\n\t dateFormat: \"%d.%m.%Y\",\r\n\t timeFormat: \"%H:%i\",\r\n\t longDateFormat: \"%d %F %Y\",\r\n\t fullDateFormat: \"%d.%m.%Y %H:%i\",\r\n\t price: \"{obj} руб.\",\r\n\t priceSettings: {\r\n\t groupSize: 3,\r\n\t groupDelimiter: \" \",\r\n\t decimalDelimiter: \"\",\r\n\t decimalSize: 0\r\n\t },\r\n\t calendar: {\r\n\t monthFull: [\"Студзень\", \"Люты\", \"Сакавік\", \"Красавік\", \"Травень\", \"Чэрвень\", \"Ліпень\", \"Жнівень\", \"Верасень\", \"Кастрычнік\", \"Лістапад\", \"Снежань\"],\r\n\t monthShort: [\"Студз\", \"Лют\", \"Сак\", \"Крас\", \"Трав\", \"Чэр\", \"Ліп\", \"Жнів\", \"Вер\", \"Каст\", \"Ліст\", \"Снеж\"],\r\n\t dayFull: [\"Нядзеля\", \"Панядзелак\", \"Аўторак\", \"Серада\", \"Чацвер\", \"Пятніца\", \"Субота\"],\r\n\t dayShort: [\"Нд\", \"Пн\", \"Аўт\", \"Ср\", \"Чцв\", \"Пт\", \"Сб\"],\r\n\t hours: \"Гадзіны\",\r\n\t minutes: \"Хвіліны\",\r\n\t done: \"Гатова\",\r\n\t today: \"Cёння\",\r\n\t clear: \"Ачысціць\"\r\n\t },\r\n\t dataExport: {\r\n\t page: \"Старонка\",\r\n\t of: \"з\"\r\n\t },\r\n\t PDFviewer: {\r\n\t of: \"з\",\r\n\t automaticZoom: \"Аўтаматычны зум\",\r\n\t actualSize: \"Сапраўдны памер\",\r\n\t pageFit: \"Памер старонкі\",\r\n\t pageWidth: \"Шырыня старонкі\",\r\n\t pageHeight: \"Вышыня старонкі\"\r\n\t },\r\n\t aria: {\r\n\t calendar: \"Каляндар\",\r\n\t increaseValue: \"Павялічыць значэнне\",\r\n\t decreaseValue: \"Паменшыць значэнне\",\r\n\t navMonth: [\"Папярэдні месяц\", \"Наступны месяц\"],\r\n\t navYear: [\"Папярэдні год\", \"Наступны год\"],\r\n\t navDecade: [\"Папярэднія дзесяць год\", \"Наступныя дзесяць год\"],\r\n\t dateFormat: \"%d %F %Y\",\r\n\t monthFormat: \"%F %Y\",\r\n\t yearFormat: \"%Y\",\r\n\t hourFormat: \"Hours: %h\",\r\n\t minuteFormat: \"Гадзіны: %i\",\r\n\t removeItem: \"Прыбраць элемент\",\r\n\t pages: [\"Першая старонка\", \"Папярэдняя старонка\", \"Наступная старонка\", \"Апошняя старонка\"],\r\n\t page: \"Старонка\",\r\n\t headermenu: \"Меню загалоўка\",\r\n\t openGroup: \"Адкрыць групу слупкоў\",\r\n\t closeGroup: \"Закрыць групу слупкоў\",\r\n\t closeTab: \"Закрыць укладку\",\r\n\t showTabs: \"Паказаць больш укладак\",\r\n\t resetTreeMap: \"Вярнуцца да першапачатковага выгляду\",\r\n\t navTreeMap: \"Падняцца на ўзровень вышэй\",\r\n\t nextTab: \"Наступная ўкладка\",\r\n\t prevTab: \"Папярэдняя ўкладка\",\r\n\t multitextSection: \"Дадаць элемент\",\r\n\t multitextextraSection: \"Прыбраць элемент\",\r\n\t showChart: \"Паказаць графік\",\r\n\t hideChart: \"Схаваць графік\",\r\n\t resizeChart: \"Змяніць памер графіка\"\r\n\t },\r\n\t richtext: {\r\n\t underline: \"Падкрэсліванне\",\r\n\t bold: \"Паўтлусты\",\r\n\t italic: \"Курсіў\"\r\n\t },\r\n\t combo: {\r\n\t select: \"Абраць\",\r\n\t selectAll: \"Абраць усё\",\r\n\t unselectAll: \"Ачысціць ўсе\"\r\n\t },\r\n\t message: {\r\n\t ok: \"ОК\",\r\n\t cancel: \"Адмена\"\r\n\t }\r\n\t};\r\n\r\n\t// en-EN locale is bundled by default\r\n\ti18n.locales[\"de-DE\"] = de; // spain\r\n\ti18n.locales[\"es-ES\"] = es; // france\r\n\ti18n.locales[\"fr-FR\"] = fr; // italy\r\n\ti18n.locales[\"it-IT\"] = it; // japan\r\n\ti18n.locales[\"ja-JP\"] = ja; // portuguese\r\n\ti18n.locales[\"pt-BR\"] = pt; // chinese\r\n\ti18n.locales[\"zh-CN\"] = zh; // russian\r\n\ti18n.locales[\"ru-RU\"] = ru; // belarus\r\n\ti18n.locales[\"be-BY\"] = be;\r\n\r\n\tvar api$7 = {\r\n\t name: \"spacer\",\r\n\t defaults: {\r\n\t borderless: true\r\n\t },\r\n\t $init: function $init() {\r\n\t this._viewobj.className += \" webix_spacer\";\r\n\t }\r\n\t};\r\n\tvar view$7 = exports.protoUI(api$7, base.view);\r\n\r\n\tvar api$8 = {\r\n\t name: \"template\",\r\n\t $init: function $init(config) {\r\n\t var subtype = this._template_types[config.type];\r\n\r\n\t if (subtype) {\r\n\t exports.extend(config, subtype); //will reset borders for \"section\"\r\n\r\n\t if (config.borderless) {\r\n\t delete config._inner;\r\n\r\n\t this._set_inner(config);\r\n\t }\r\n\t }\r\n\r\n\t if (this._dataobj == this._viewobj) {\r\n\t this._dataobj = create(\"DIV\");\r\n\t this._dataobj.className = \" webix_template\";\r\n\r\n\t this._viewobj.appendChild(this._dataobj);\r\n\t } else this._dataobj.className += \" webix_template\";\r\n\r\n\t this.attachEvent(\"onAfterRender\", this._correct_width_scroll);\r\n\t },\r\n\t setValues: function setValues(obj, update) {\r\n\t this.data = update ? exports.extend(this.data, obj, true) : obj;\r\n\t this.render();\r\n\t },\r\n\t getValues: function getValues() {\r\n\t return this.data;\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this._template_types.header.height = this._template_types.section.height = $active.barHeight;\r\n\t },\r\n\t _template_types: {\r\n\t \"header\": {\r\n\t css: \"webix_header\"\r\n\t },\r\n\t \"section\": {\r\n\t css: \"webix_section\",\r\n\t borderless: true\r\n\t },\r\n\t \"clean\": {\r\n\t css: \"webix_clean\",\r\n\t borderless: true\r\n\t }\r\n\t },\r\n\t onClick_setter: function onClick_setter(value) {\r\n\t this.on_click = exports.extend(this.on_click || {}, value, true);\r\n\t if (!this._onClick) exports.extend(this, MouseEvents);\r\n\t return value;\r\n\t },\r\n\t defaults: {\r\n\t template: template.empty\r\n\t },\r\n\t _render_me: function _render_me() {\r\n\t this._not_render_me = false;\r\n\r\n\t this._probably_render_me();\r\n\r\n\t this.resize();\r\n\t },\r\n\t _probably_render_me: function _probably_render_me() {\r\n\t if (!this._not_render_me) {\r\n\t this._not_render_me = true;\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t src_setter: function src_setter(value) {\r\n\t this._not_render_me = true;\r\n\t if (!this.callEvent(\"onBeforeLoad\", [])) return \"\";\r\n\t ajax(value, bind(function (text) {\r\n\t this._settings.template = template(text);\r\n\r\n\t this._render_me();\r\n\r\n\t this.callEvent(\"onAfterLoad\", []);\r\n\t }, this));\r\n\t return value;\r\n\t },\r\n\t _correct_width_scroll: function _correct_width_scroll() {\r\n\t //we need to force auto height calculation after content change\r\n\t //dropping the last_size flag will ensure that inner logic of $setSize will be processed\r\n\t if (this._settings.autoheight) {\r\n\t this._last_size = null;\r\n\t this.resize();\r\n\t }\r\n\r\n\t if (this._settings.scroll && this._settings.scroll.indexOf(\"x\") != -1) this._dataobj.style.width = this._dataobj.scrollWidth + \"px\";\r\n\t },\r\n\t content_setter: function content_setter(config) {\r\n\t if (config) {\r\n\t this._not_render_me = true;\r\n\r\n\t this.render = function () {};\r\n\r\n\t this._dataobj.appendChild(toNode(config));\r\n\r\n\t delay(this._correct_width_scroll, this);\r\n\t }\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this.render();\r\n\t },\r\n\t setHTML: function setHTML(html) {\r\n\t this._settings.template = function () {\r\n\t return html;\r\n\t };\r\n\r\n\t this.refresh();\r\n\t },\r\n\t setContent: function setContent(content) {\r\n\t this._dataobj.innerHTML = \"\";\r\n\t this.content_setter(content);\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t this._probably_render_me();\r\n\r\n\t if (this._settings.autoheight) {\r\n\t var top = this.getTopParentView();\r\n\t clearTimeout(top._template_resize_timer);\r\n\t top._template_resize_timer = delay(this.resize, this);\r\n\t }\r\n\r\n\t return true;\r\n\t }\r\n\t },\r\n\t $getSize: function $getSize(x, y) {\r\n\t if (this._settings.autoheight && (!this._settings.type || this._settings.type == \"clean\")) this._settings.height = this._get_auto_height();\r\n\t return base.api.$getSize.call(this, x, y);\r\n\t },\r\n\t _get_auto_height: function _get_auto_height() {\r\n\t var size;\r\n\t var padding = $active.layoutPadding.space;\r\n\r\n\t this._probably_render_me();\r\n\r\n\t if (!this.isVisible()) {\r\n\t //try getting height of a hidden template\r\n\t size = getTextSize(this._toHTML(this.data) || this._dataobj.innerHTML, //check for config.content \r\n\t \"webix_template\", (this.$width || (this.getParentView() ? this.getParentView().$width : 0)) - padding).height;\r\n\t } else {\r\n\t this._dataobj.style.height = \"auto\";\r\n\t size = this._dataobj.scrollHeight;\r\n\t this._dataobj.style.height = \"\";\r\n\t }\r\n\r\n\t return size;\r\n\t },\r\n\t _one_time_scroll: true //scroll will appear only if set directly in config\r\n\r\n\t};\r\n\tvar view$8 = exports.protoUI(api$8, Scrollable, AtomDataLoader, AtomRender, EventSystem, base.view);\r\n\tvar template$1 = {\r\n\t api: api$8,\r\n\t view: view$8\r\n\t};\r\n\r\n\t/*scrollable view with another view insize*/\r\n\r\n\tvar api$9 = {\r\n\t name: \"scrollview\",\r\n\t defaults: {\r\n\t scroll: \"y\",\r\n\t scrollSpeed: \"0ms\"\r\n\t },\r\n\t $init: function $init() {\r\n\t this._viewobj.className += \" webix_scrollview\";\r\n\t },\r\n\t body_setter: function body_setter(config) {\r\n\t config.borderless = true;\r\n\t state._parent_cell = this;\r\n\t this._body_cell = ui._view(config);\r\n\r\n\t this._dataobj.appendChild(this._body_cell._viewobj);\r\n\t },\r\n\t getChildViews: function getChildViews() {\r\n\t return [this._body_cell];\r\n\t },\r\n\t getBody: function getBody() {\r\n\t return this._body_cell;\r\n\t },\r\n\t resizeChildren: function resizeChildren() {\r\n\t if (!this._body_cell) return;\r\n\t this._desired_size = this._body_cell.$getSize(0, 0);\r\n\r\n\t this._resizeChildren();\r\n\r\n\t callEvent(\"onResize\", []);\r\n\t },\r\n\t _resizeChildren: function _resizeChildren() {\r\n\t var cx = Math.max(this._content_width, this._desired_size[0]);\r\n\t var cy = Math.max(this._content_height, this._desired_size[2]);\r\n\r\n\t this._body_cell.$setSize(cx, cy);\r\n\r\n\t this._dataobj.style.width = this._body_cell._content_width + \"px\";\r\n\t this._dataobj.style.height = this._body_cell._content_height + \"px\";\r\n\r\n\t if (env.touch) {\r\n\t var scroll = this.getScrollState();\r\n\t var top = this._body_cell._content_height - this._content_height;\r\n\t if (top < scroll.y) this.scrollTo(null, top);\r\n\t }\r\n\r\n\t if (state._responsive_exception) {\r\n\t state._responsive_exception = false;\r\n\t this._desired_size = this._body_cell.$getSize(0, 0);\r\n\r\n\t this._resizeChildren();\r\n\t }\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var desired_size = this._desired_size = this._body_cell.$getSize(0, 0);\r\n\r\n\t var self_sizes = base.api.$getSize.call(this, dx, dy);\r\n\t var scroll_size = this._native_scroll || env.scrollSize;\r\n\r\n\t if (this._settings.scroll == \"x\") {\r\n\t self_sizes[2] = Math.max(self_sizes[2], desired_size[2]) + scroll_size;\r\n\t self_sizes[3] = Math.min(self_sizes[3], desired_size[3]) + scroll_size;\r\n\t } else if (this._settings.scroll == \"y\") {\r\n\t self_sizes[0] = Math.max(self_sizes[0], desired_size[0]) + scroll_size;\r\n\t self_sizes[1] = Math.min(self_sizes[1], desired_size[1]) + scroll_size;\r\n\t }\r\n\r\n\t return self_sizes;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t var temp = env.scrollSize;\r\n\t env.scrollSize = this._native_scroll || temp;\r\n\t if (base.api.$setSize.call(this, x, y) || state._force_resize) this._resizeChildren();\r\n\t env.scrollSize = temp;\r\n\t },\r\n\t scroll_setter: function scroll_setter(value) {\r\n\t var custom = env.$customScroll;\r\n\r\n\t if (typeof value == \"string\" && value.indexOf(\"native-\") === 0) {\r\n\t this._native_scroll = 17;\r\n\t value = value.replace(\"native-\");\r\n\t env.$customScroll = false;\r\n\t }\r\n\r\n\t value = Scrollable.scroll_setter.call(this, value);\r\n\t env.$customScroll = custom;\r\n\t return value;\r\n\t },\r\n\t _replace: function _replace(new_view) {\r\n\t this._body_cell.destructor();\r\n\r\n\t this._body_cell = new_view;\r\n\r\n\t this._bodyobj.appendChild(this._body_cell._viewobj);\r\n\r\n\t this.resize();\r\n\t },\r\n\t showView: function showView(id) {\r\n\t var topPos = $$(id).$view.offsetTop - $$(id).$view.parentNode.offsetTop;\r\n\t this.scrollTo(0, topPos);\r\n\t }\r\n\t};\r\n\tvar view$9 = exports.protoUI(api$9, Scrollable, EventSystem, base.view);\r\n\r\n\tvar api$a = {\r\n\t name: \"iframe\",\r\n\t $init: function $init() {\r\n\t this._dataobj = this._contentobj;\r\n\t this._contentobj.innerHTML = \"\";\r\n\t },\r\n\t load: function load(value) {\r\n\t this.src_setter(value);\r\n\t },\r\n\t src_setter: function src_setter(value) {\r\n\t if (!this.callEvent(\"onBeforeLoad\", [])) return \"\";\r\n\t this.getIframe().src = value;\r\n\t return value;\r\n\t },\r\n\t getIframe: function getIframe() {\r\n\t return this._contentobj.getElementsByTagName(\"iframe\")[0];\r\n\t },\r\n\t getWindow: function getWindow() {\r\n\t return this.getIframe().contentWindow;\r\n\t }\r\n\t};\r\n\tvar view$a = exports.protoUI(api$a, base.view, EventSystem);\r\n\r\n\tvar api$b = {\r\n\t name: \"accordion\",\r\n\t defaults: {\r\n\t panelClass: \"accordionitem\",\r\n\t multi: false,\r\n\t collapsed: false\r\n\t },\r\n\t $init: function $init() {\r\n\t this._viewobj.setAttribute(\"role\", \"tablist\");\r\n\r\n\t this._viewobj.setAttribute(\"aria-multiselectable\", \"true\");\r\n\t },\r\n\t _replace: function _replace(newview) {\r\n\t layout.api._replace.apply(this, arguments);\r\n\r\n\t if (newview.collapsed_setter && newview.refresh) {\r\n\t newview.refresh();\r\n\t }\r\n\t },\r\n\t _parse_cells: function _parse_cells() {\r\n\t var panel = this._settings.panelClass;\r\n\t var cells = this._collection;\r\n\r\n\t for (var i = 0; i < cells.length; i++) {\r\n\t if ((cells[i].body || cells[i].header) && !cells[i].view && !cells[i].align) cells[i].view = panel;\r\n\t if (isUndefined(cells[i].collapsed)) cells[i].collapsed = this._settings.collapsed;\r\n\t }\r\n\r\n\t this._skin_render_collapse = true;\r\n\r\n\t layout.api._parse_cells.call(this);\r\n\r\n\t this._skin_render_collapse = false;\r\n\r\n\t for (var _i = 0; _i < this._cells.length; _i++) {\r\n\t if (this._cells[_i].name == panel) this._cells[_i].refresh();\r\n\t this._cells[_i]._accLastChild = false;\r\n\t }\r\n\r\n\t var found = false;\r\n\r\n\t for (var _i2 = this._cells.length - 1; _i2 >= 0 && !found; _i2--) {\r\n\t if (!this._cells[_i2]._settings.hidden) {\r\n\t this._cells[_i2]._accLastChild = true;\r\n\t found = true;\r\n\t }\r\n\t }\r\n\t },\r\n\t _afterOpen: function _afterOpen(view) {\r\n\t if (this._settings.multi === false && this._skin_render_collapse !== true) {\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t if (view != this._cells[i] && !this._cells[i]._settings.collapsed && this._cells[i].collapse) this._cells[i].collapse();\r\n\t }\r\n\t }\r\n\r\n\t if (view.callEvent) {\r\n\t view.callEvent(\"onViewShow\", []);\r\n\t each(view, this._signal_hidden_cells);\r\n\t }\r\n\t },\r\n\t _canCollapse: function _canCollapse(view) {\r\n\t if (this._settings.multi === true || this._skin_render_collapse) return true; //can collapse only if you have other item to open\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t if (view != this._cells[i] && !this._cells[i]._settings.collapsed && this._cells[i].isVisible() && !this._cells[i].$nospace) return true;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t $skin: function $skin() {\r\n\t var defaults = this.defaults;\r\n\t if ($active.accordionType) defaults.type = $active.accordionType;\r\n\t }\r\n\t};\r\n\tvar view$b = exports.protoUI(api$b, layout.view);\r\n\tvar base$1 = {\r\n\t api: api$b,\r\n\t view: view$b\r\n\t};\r\n\r\n\tvar api$c = {\r\n\t name: \"headerlayout\",\r\n\t defaults: {\r\n\t type: \"accordion\",\r\n\t multi: \"mixed\",\r\n\t collapsed: false\r\n\t }\r\n\t};\r\n\tvar view$c = exports.protoUI(api$c, base$1.view);\r\n\r\n\tvar api$d = {\r\n\t name: \"accordionitem\",\r\n\t $init: function $init(config) {\r\n\t this._viewobj.innerHTML = \"
\";\r\n\t this._contentobj = this._viewobj;\r\n\t this._headobj = this._contentobj.childNodes[0];\r\n\t if (!config.header) this._headobj.style.display = \"none\";\r\n\t this._headlabel = this._contentobj.childNodes[0].childNodes[1];\r\n\t this._headbutton = this._contentobj.childNodes[0].childNodes[0];\r\n\t this._bodyobj = this._contentobj.childNodes[1];\r\n\t this._viewobj.className += \" webix_accordionitem\";\r\n\t this._head_cell = this._body_cell = null;\r\n\t this._cells = true;\r\n\r\n\t this._bodyobj.setAttribute(\"role\", \"tabpanel\");\r\n\r\n\t this._headobj.setAttribute(\"role\", \"tab\");\r\n\r\n\t this.attachEvent(\"onKeyPress\", this._onKeyPress);\r\n\t },\r\n\t _remove: function _remove() {\r\n\t this._body_cell = {\r\n\t destructor: function destructor() {}\r\n\t };\r\n\t },\r\n\t _replace: function _replace(new_view) {\r\n\t this._body_cell.destructor();\r\n\r\n\t this._body_cell = new_view;\r\n\r\n\t this._bodyobj.appendChild(this._body_cell._viewobj);\r\n\r\n\t this.resize();\r\n\t },\r\n\t _id: \"webix_ai_id\",\r\n\t getChildViews: function getChildViews() {\r\n\t return [this._body_cell];\r\n\t },\r\n\t body_setter: function body_setter(value) {\r\n\t if (_typeof(value) != \"object\") value = {\r\n\t template: value\r\n\t };\r\n\t value._inner = {\r\n\t top: true,\r\n\t left: true,\r\n\t right: true,\r\n\t bottom: true\r\n\t };\r\n\t state._parent_cell = this;\r\n\t this._body_cell = ui._view(value);\r\n\r\n\t this._bodyobj.appendChild(this._body_cell._viewobj);\r\n\r\n\t return value;\r\n\t },\r\n\t header_setter: function header_setter(value) {\r\n\t if (value) value = template(value);\r\n\t return value;\r\n\t },\r\n\t headerAlt_setter: function headerAlt_setter(value) {\r\n\t if (value) value = template(value);\r\n\t return value;\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var size = this._body_cell.$getSize(0, 0); //apply external border to inner content sizes\r\n\r\n\r\n\t var _borders = this._settings._inner;\r\n\r\n\t if (_borders) {\r\n\t dx += (_borders.left ? 0 : 1) + (_borders.right ? 0 : 1);\r\n\t dy += (_borders.top ? 0 : 1) + (_borders.bottom ? 0 : 1);\r\n\t }\r\n\r\n\t var header = 0;\r\n\t var self_size = baseview.api.$getSize.call(this, 0, 0); //use child settings if layout's one was not defined\r\n\r\n\t self_size[0] = (self_size[0] || size[0]) + dx;\r\n\t if (self_size[1] >= 100000) self_size[1] = size[1];\r\n\t self_size[1] += dx;\r\n\t self_size[2] = (self_size[2] || size[2]) + dy;\r\n\t var fixedHeight = self_size[3] < 100000;\r\n\t if (!fixedHeight) self_size[3] = size[3];\r\n\t self_size[3] += dy;\r\n\r\n\t if (this.getParentView()._vertical_orientation) {\r\n\t if (this._settings.collapsed) {\r\n\t self_size[2] = self_size[3] = this._getHeaderSize();\r\n\t } else if (this._settings.header) header = this._settings.headerHeight;\r\n\t } else {\r\n\t if (this._settings.collapsed) self_size[0] = self_size[1] = this._getHeaderSize();\r\n\t if (this._settings.header) header = this._settings.headerHeight;\r\n\t } //include header in total height calculation\r\n\r\n\r\n\t if (!fixedHeight) {\r\n\t self_size[2] += header;\r\n\t self_size[3] += header;\r\n\t }\r\n\r\n\t debug_size_box(this, self_size, true);\r\n\t return self_size;\r\n\t },\r\n\t on_click: {\r\n\t webix_accordionitem_header: function webix_accordionitem_header(e) {\r\n\t this._toggle(e);\r\n\r\n\t return false;\r\n\t },\r\n\t webix_accordionitem_header_v: function webix_accordionitem_header_v(e) {\r\n\t this._toggle(e);\r\n\r\n\t return false;\r\n\t }\r\n\t },\r\n\t _toggle: function _toggle() {\r\n\t this.define(\"collapsed\", !this._settings.collapsed);\r\n\t },\r\n\t collapsed_setter: function collapsed_setter(value) {\r\n\t if (this._settings.header === false) return; //use last layout element if parent is not known yet\r\n\r\n\t var parent = this.getParentView();\r\n\r\n\t if (parent) {\r\n\t if (!value) this._expand();else {\r\n\t if (parent._canCollapse(this)) this._collapse();else {\r\n\t var success = 0;\r\n\t if (parent._cells.length > 1) for (var i = 0; i < parent._cells.length; i++) {\r\n\t var sibl = parent._cells[i];\r\n\r\n\t if (this != sibl && sibl.isVisible() && sibl.expand) {\r\n\t sibl.expand();\r\n\r\n\t this._collapse();\r\n\r\n\t success = 1;\r\n\t break;\r\n\t }\r\n\t }\r\n\t if (!success) return;\r\n\t }\r\n\t }\r\n\t this._settings.collapsed = value;\r\n\t if (!value) parent._afterOpen(this);\r\n\t this.refresh();\r\n\t if (!state._ui_creation) this.resize();\r\n\t parent.callEvent(\"onAfter\" + (value ? \"Collapse\" : \"Expand\"), [this._settings.id]);\r\n\t this._settings.$noresize = value;\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t collapse: function collapse() {\r\n\t this.define(\"collapsed\", true);\r\n\r\n\t UIManager._moveChildFocus(this);\r\n\t },\r\n\t expand: function expand() {\r\n\t this.define(\"collapsed\", false);\r\n\t },\r\n\t _show: function _show() {\r\n\t this.show();\r\n\t },\r\n\t _hide: function _hide() {\r\n\t this.hide();\r\n\t },\r\n\t _expand: function _expand() {\r\n\t this._bodyobj.style.display = \"\";\r\n\t removeCss(this.$view, \"collapsed\");\r\n\t removeCss(this._headobj, \"collapsed\");\r\n\r\n\t this._headobj.setAttribute(\"aria-expanded\", \"true\");\r\n\t },\r\n\t _collapse: function _collapse() {\r\n\t if (this._settings.headerAlt) this._headlabel.innerHTML = this._settings.headerAlt();\r\n\t this._bodyobj.style.display = \"none\";\r\n\t addCss(this.$view, \"collapsed\");\r\n\t addCss(this._headobj, \"collapsed\");\r\n\r\n\t this._headobj.setAttribute(\"aria-expanded\", \"false\");\r\n\t },\r\n\t refresh: function refresh() {\r\n\t var template$$1 = this._settings[this._settings.collapsed ? \"headerAlt\" : \"header\"] || this._settings.header;\r\n\r\n\t if (template$$1) {\r\n\t this._headlabel.innerHTML = template$$1();\r\n\r\n\t this._headbutton.setAttribute(\"aria-label\", template$$1());\r\n\t }\r\n\r\n\t var css = this.getParentView()._vertical_orientation ? \"vertical\" : \"horizontal\";\r\n\r\n\t if (this._viewobj.className.indexOf(\" \" + css) < 0) {\r\n\t addCss(this._viewobj, css);\r\n\t } //fix collapsed columns in IE8\r\n\r\n\r\n\t if (!env.transform) {\r\n\t addCss(this._viewobj, \"webix_ie\", true);\r\n\t }\r\n\t },\r\n\t _getHeaderSize: function _getHeaderSize() {\r\n\t return this._settings.collapsed ? this._settings.headerAltHeight : this._settings.headerHeight;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y) || this._getHeaderSize() != this._last_set_header_size) {\r\n\t x = this._content_width;\r\n\t y = this._content_height;\r\n\r\n\t var headerSize = this._last_set_header_size = this._getHeaderSize(); //-(this._settings._inner.top?0:1);\r\n\r\n\r\n\t if (this._settings.header) {\r\n\t this._headobj.style.height = headerSize + \"px\";\r\n\t this._headobj.style.width = \"auto\";\r\n\t this._headobj.style[env.transform] = \"\";\r\n\t this._headobj.style.borderBottomWidth = (this._settings.collapsed ? 0 : 1) + \"px\";\r\n\r\n\t if (this.getParentView()._vertical_orientation || !this._settings.collapsed) {\r\n\t y -= this._getHeaderSize();\r\n\t } else if (this._settings.collapsed) {\r\n\t //-2 - borders\r\n\t if (animate.isSupported()) {\r\n\t this._headobj.style.width = y + \"px\";\r\n\t this._headobj.style.height = x + 3 + \"px\";\r\n\t var d = Math.floor(y / 2 - x / 2) + (x - this._settings.headerAltHeight) / 2;\r\n\t this._headobj.style[env.transform] = \"rotate(90deg) translate(\" + d + \"px, \" + (d + 1) + \"px)\";\r\n\t } else {\r\n\t //IE8 fix\r\n\t this._headobj.style.width = x + \"px\";\r\n\t this._headobj.style.height = y + 3 + \"px\";\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (!this._settings.collapsed) {\r\n\t this._body_cell.$setSize(x, y);\r\n\r\n\t this._last_size_y = y;\r\n\t }\r\n\t } else if (!this._settings.collapsed) {\r\n\t var body = this._body_cell;\r\n\t if (this._last_size_y) body.$setSize(this._content_width, this._last_size_y);\r\n\t }\r\n\t },\r\n\t $skin: function $skin() {\r\n\t var defaults = this.defaults;\r\n\t defaults.headerAltHeight = defaults.headerHeight = $active.barHeight;\r\n\t defaults.headerHeight -= $active.borderWidth;\r\n\t },\r\n\t defaults: {\r\n\t header: false,\r\n\t headerAlt: false,\r\n\t body: \"\"\r\n\t }\r\n\t};\r\n\tvar view$d = exports.protoUI(api$d, MouseEvents, EventSystem, base.view);\r\n\r\n\tvar api$e = {\r\n\t name: \"resizearea\",\r\n\t defaults: {\r\n\t dir: \"x\"\r\n\t },\r\n\t $init: function $init(config) {\r\n\t var dir = config.dir || \"x\";\r\n\t var node = toNode(config.container);\r\n\t var size = dir == \"x\" ? \"width\" : \"height\";\r\n\t var margin = config.margin ? config.margin + \"px\" : 0;\r\n\t this._key_property = dir == \"x\" ? \"left\" : \"top\";\r\n\t this._viewobj = create(\"DIV\", {\r\n\t \"class\": \"webix_resize_area webix_dir_\" + dir\r\n\t }); //[[COMPAT]] FF12 can produce 2 move events\r\n\r\n\t _event(this._viewobj, env.mouse.down, stopEvent);\r\n\r\n\t if (margin) {\r\n\t if (dir == \"x\") margin = margin + \" 0 \" + margin;else margin = \"0 \" + margin + \" 0 \" + margin;\r\n\t }\r\n\r\n\t this._dragobj = create(\"DIV\", {\r\n\t \"class\": \"webix_resize_handle_\" + dir,\r\n\t \"style\": margin ? \"padding:\" + margin : \"\"\r\n\t }, \"
\");\r\n\t this._originobj = create(\"DIV\", {\r\n\t \"class\": \"webix_resize_origin_\" + dir\r\n\t });\r\n\r\n\t if (config[size]) {\r\n\t this._originobj.style[size] = config[size] + (config.border ? 1 : 0) + \"px\";\r\n\t this._dragobj.style[size] = config[size] + \"px\";\r\n\t }\r\n\r\n\t if (config.cursor) this._dragobj.style.cursor = this._originobj.style.cursor = this._viewobj.style.cursor = config.cursor;\r\n\t this._moveev = event$1(node, env.mouse.move, this._onmove, {\r\n\t bind: this\r\n\t });\r\n\t this._upev = event$1(document.body, env.mouse.up, this._onup, {\r\n\t bind: this\r\n\t });\r\n\t this._dragobj.style[this._key_property] = this._originobj.style[this._key_property] = config.start + \"px\";\r\n\t node.appendChild(this._viewobj);\r\n\t node.appendChild(this._dragobj);\r\n\t node.appendChild(this._originobj);\r\n\t },\r\n\t _onup: function _onup() {\r\n\t this.callEvent(\"onResizeEnd\", [this._last_result]);\r\n\t eventRemove(this._moveev);\r\n\t eventRemove(this._upev);\r\n\t remove(this._viewobj);\r\n\t remove(this._dragobj);\r\n\t remove(this._originobj);\r\n\t this._viewobj = this._dragobj = this._originobj = null;\r\n\t },\r\n\t _onmove: function _onmove(e) {\r\n\t var eventPos = pos(e);\r\n\t this._last_result = (this._settings.dir == \"x\" ? eventPos.x : eventPos.y) + this._settings.start - this._settings.eventPos;\r\n\t this._dragobj.style[this._key_property] = this._last_result + \"px\";\r\n\t this.callEvent(\"onResize\", [this._last_result]);\r\n\t }\r\n\t};\r\n\tvar view$e = exports.protoUI(api$e, EventSystem, Settings);\r\n\r\n\tvar api$f = {\r\n\t name: \"resizer\",\r\n\t defaults: {\r\n\t width: 7,\r\n\t height: 7\r\n\t },\r\n\t $init: function $init(config) {\r\n\t assert(this.getParentView(), \"Resizer can't be initialized outside a layout\");\r\n\t this._viewobj.className += \" webix_resizer\";\r\n\r\n\t var space = this.getParentView()._margin;\r\n\r\n\t _event(this._viewobj, env.mouse.down, this._rsDown, {\r\n\t bind: this\r\n\t });\r\n\r\n\t event$1(document.body, env.mouse.up, this._rsUp, {\r\n\t bind: this\r\n\t });\r\n\r\n\t var dir = this._getResizeDir();\r\n\r\n\t this._rs_started = false;\r\n\t this._resizer_dir = dir;\r\n\t this._resizer_dim = dir == \"x\" ? \"width\" : \"height\";\r\n\t if (dir == \"x\") config.height = 0;else config.width = 0;\r\n\r\n\t if (space > 0) {\r\n\t this._viewobj.className += \" webix_resizer_v\" + dir;\r\n\t this._viewobj.style.marginRight = \"-\" + space + \"px\";\r\n\t if (dir == \"x\") config.width = space;else config.height = space;\r\n\t this.$nospace = true;\r\n\t } else this._viewobj.className += \" webix_resizer_\" + dir;\r\n\r\n\t this._viewobj.innerHTML = \"
\";\r\n\t if (dir == \"y\" && space > 0) this._viewobj.style.marginBottom = \"-\" + (config.height || this.defaults.height) + \"px\";\r\n\r\n\t this._viewobj.setAttribute(\"tabindex\", \"-1\");\r\n\r\n\t this._viewobj.setAttribute(\"aria-grabbed\", \"false\");\r\n\t },\r\n\t _rsDown: function _rsDown(e) {\r\n\t var cells = this._getResizerCells(); //some sibling can block resize\r\n\r\n\r\n\t if (cells && !this._settings.disabled) {\r\n\t e = e || event$1;\r\n\t this._rs_started = true;\r\n\t this._rs_process = pos(e);\r\n\t this._rsLimit = [];\r\n\r\n\t this._viewobj.setAttribute(\"aria-grabbed\", \"true\");\r\n\r\n\t for (var i = 0; i < 2; i++) {\r\n\t cells[i].$view.setAttribute(\"aria-dropeffect\", \"move\");\r\n\t }\r\n\r\n\t this._viewobj.setAttribute(\"aria-dropeffect\", \"move\");\r\n\r\n\t this._rsStart(e, cells[0]);\r\n\t }\r\n\t },\r\n\t _rsUp: function _rsUp() {\r\n\t this._rs_started = false;\r\n\t this._rs_process = false;\r\n\t },\r\n\t _rsStart: function _rsStart(e, cell) {\r\n\t var dir, cellOffset, pos$$1, posParent, start;\r\n\t e = e || event$1;\r\n\t dir = this._resizer_dir;\r\n\t /*layout position:relative to place absolutely positioned elements in it*/\r\n\r\n\t this.getParentView()._viewobj.style.position = \"relative\";\r\n\t pos$$1 = offset(this._viewobj);\r\n\t posParent = offset(this.getParentView()._viewobj);\r\n\t start = pos$$1[dir] - posParent[dir];\r\n\t cellOffset = offset(cell.$view)[dir] - offset(this.getParentView().$view)[dir];\r\n\t this._rs_progress = [dir, cell, start, cellOffset];\r\n\t /*resizer stick (resizerea ext)*/\r\n\r\n\t this._resizeStick = new ui.resizearea({\r\n\t container: this.getParentView()._viewobj,\r\n\t dir: dir,\r\n\t eventPos: this._rs_process[dir],\r\n\t start: start - 1,\r\n\t height: this.$height,\r\n\t width: this.$width,\r\n\t border: 1,\r\n\t margin: this.getParentView()[\"_padding\" + dir.toUpperCase()]\r\n\t });\r\n\t /*stops resizing on stick mouseup*/\r\n\r\n\t this._resizeStick.attachEvent(\"onResizeEnd\", bind(this._rsEnd, this));\r\n\t /*needed to stop stick moving when the limit for dimension is reached*/\r\n\r\n\r\n\t this._resizeStick.attachEvent(\"onResize\", bind(this._rsResizeHandler, this));\r\n\r\n\t addCss(document.body, \"webix_noselect\", 1);\r\n\t },\r\n\t _getResizeDir: function _getResizeDir() {\r\n\t return this.getParentView()._vertical_orientation ? \"y\" : \"x\";\r\n\t },\r\n\t _rsResizeHandler: function _rsResizeHandler() {\r\n\t var cells, config, cDiff, diff, dir, i, limits, limitSizes, sizes, totalSize;\r\n\r\n\t if (this._rs_progress) {\r\n\t cells = this._getResizerCells();\r\n\t dir = this._rs_progress[0];\r\n\t /*vector distance between resizer and stick*/\r\n\r\n\t diff = this._resizeStick._last_result - this._rs_progress[2];\r\n\t /*new sizes for the resized cells, taking into account the stick position*/\r\n\r\n\t sizes = this._rsGetDiffCellSizes(cells, dir, diff);\r\n\t /*sum of cells dimensions*/\r\n\r\n\t totalSize = cells[0][\"$\" + this._resizer_dim] + cells[1][\"$\" + this._resizer_dim];\r\n\t /*max and min limits if they're set*/\r\n\r\n\t limits = dir == \"y\" ? [\"minHeight\", \"maxHeight\"] : [\"minWidth\", \"maxWidth\"];\r\n\r\n\t for (i = 0; i < 2; i++) {\r\n\t config = cells[i]._settings;\r\n\t cDiff = i ? -diff : diff;\r\n\t /*if cDiff is positive, the size of i cell is increased*/\r\n\r\n\t /*if size is bigger than max limit or size is smaller than min limit*/\r\n\r\n\t var min = config[limits[0]];\r\n\t var max = config[limits[1]];\r\n\r\n\t if (cDiff > 0 && max && max <= sizes[i] || cDiff < 0 && (min || 3) >= sizes[i]) {\r\n\t this._rsLimit[i] = cDiff > 0 ? max : min || 3;\r\n\t /*new sizes, taking into account max and min limits*/\r\n\r\n\t limitSizes = this._rsGetLimitCellSizes(cells, dir);\r\n\t /*stick position*/\r\n\r\n\t this._resizeStick._dragobj.style[dir == \"y\" ? \"top\" : \"left\"] = this._rs_progress[3] + limitSizes[0] + \"px\";\r\n\t return;\r\n\t } else if (sizes[i] < 3) {\r\n\t /*cells size can not be less than 1*/\r\n\t this._resizeStick._dragobj.style[dir == \"y\" ? \"top\" : \"left\"] = this._rs_progress[3] + i * totalSize + 1 + \"px\";\r\n\t } else {\r\n\t this._rsLimit[i] = null;\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _getResizerCells: function _getResizerCells() {\r\n\t var cells, i, res;\r\n\t cells = this.getParentView()._cells;\r\n\r\n\t for (i = 0; i < cells.length; i++) {\r\n\t if (cells[i] == this) {\r\n\t res = [this._getRsCell(cells, i, 1, -1), this._getRsCell(cells, i, 1, 1)];\r\n\t if (!res[0] || !res[1]) res = null;\r\n\t return res;\r\n\t }\r\n\t }\r\n\t },\r\n\t _getRsCell: function _getRsCell(cells, i, step, dir) {\r\n\t var cell = cells[i + dir * step];\r\n\t if (cell && cell._settings.hidden) return this._getRsCell(cells, i, step + 1, dir);else if (cell && cell._settings.$noresize) return null;else return cell;\r\n\t },\r\n\t _rsEnd: function _rsEnd(result) {\r\n\t if (typeof result == \"undefined\") return;\r\n\t var cells, dir, diff, size;\r\n\r\n\t var vertical = this.getParentView()._vertical_orientation;\r\n\r\n\t this._resizerStick = null;\r\n\r\n\t if (this._rs_progress) {\r\n\t dir = this._rs_progress[0];\r\n\t diff = result - this._rs_progress[2];\r\n\t cells = this._getResizerCells();\r\n\r\n\t if (cells[0] && cells[1]) {\r\n\t /*new cell sizes*/\r\n\t size = this._rsGetCellSizes(cells, dir, diff);\r\n\r\n\t for (var i = 0; i < 2; i++) {\r\n\t //cell has not fixed size, of fully fixed layout\r\n\t var cell_size = cells[i].$getSize(0, 0);\r\n\r\n\t if (vertical ? cell_size[2] == cell_size[3] : Math.abs(cell_size[1] - cell_size[0]) < 3) {\r\n\t /*set fixed sizes for both cells*/\r\n\t cells[i]._settings[this._resizer_dim] = size[i];\r\n\t if (cells[i]._bubble_size) cells[i]._bubble_size(this._resizer_dim, size[i], vertical);\r\n\t } else {\r\n\t var actualSize = cells[i].$view[vertical ? \"offsetHeight\" : \"offsetWidth\"]; //cells[i][\"$\"+this._resizer_dim];\r\n\r\n\t cells[i]._settings.gravity = size[i] / actualSize * cells[i]._settings.gravity;\r\n\t }\r\n\t }\r\n\r\n\t cells[0].resize();\r\n\r\n\t for (var _i = 0; _i < 2; _i++) {\r\n\t if (cells[_i].callEvent) cells[_i].callEvent(\"onViewResize\", []);\r\n\r\n\t cells[_i].$view.removeAttribute(\"aria-dropeffect\");\r\n\t }\r\n\r\n\t callEvent(\"onLayoutResize\", [cells]);\r\n\t }\r\n\r\n\t this._rs_progress = false;\r\n\t }\r\n\r\n\t this._rs_progress = false;\r\n\t this._rs_started = false;\r\n\t this._rsLimit = null;\r\n\t removeCss(document.body, \"webix_noselect\");\r\n\r\n\t this._viewobj.setAttribute(\"aria-grabbed\", \"false\");\r\n\r\n\t this._viewobj.removeAttribute(\"aria-dropeffect\");\r\n\t },\r\n\t _rsGetLimitCellSizes: function _rsGetLimitCellSizes(cells) {\r\n\t var size1, size2, totalSize;\r\n\t totalSize = cells[0][\"$\" + this._resizer_dim] + cells[1][\"$\" + this._resizer_dim];\r\n\r\n\t if (this._rsLimit[0]) {\r\n\t size1 = this._rsLimit[0];\r\n\t size2 = totalSize - size1;\r\n\t } else if (this._rsLimit[1]) {\r\n\t size2 = this._rsLimit[1];\r\n\t size1 = totalSize - size2;\r\n\t }\r\n\r\n\t return [size1, size2];\r\n\t },\r\n\t _rsGetDiffCellSizes: function _rsGetDiffCellSizes(cells, dir, diff) {\r\n\t var sizes = [];\r\n\t var styleDim = this._resizer_dim == \"height\" ? \"offsetHeight\" : \"offsetWidth\";\r\n\r\n\t for (var i = 0; i < 2; i++) {\r\n\t sizes[i] = cells[i].$view[styleDim] + (i ? -1 : 1) * diff;\r\n\t }\r\n\r\n\t return sizes;\r\n\t },\r\n\t _rsGetCellSizes: function _rsGetCellSizes(cells, dir, diff) {\r\n\t var i, sizes, totalSize;\r\n\t /*if max or min dimentsions are set*/\r\n\r\n\t if (this._rsLimit[0] || this._rsLimit[1]) {\r\n\t sizes = this._rsGetLimitCellSizes(cells, dir);\r\n\t } else {\r\n\t sizes = this._rsGetDiffCellSizes(cells, dir, diff);\r\n\r\n\t for (i = 0; i < 2; i++) {\r\n\t /*if stick moving is stopped outsize cells borders*/\r\n\t if (sizes[i] < 0) {\r\n\t totalSize = sizes[0] + sizes[1];\r\n\t sizes[i] = 1;\r\n\t sizes[1 - i] = totalSize - 1;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return sizes;\r\n\t }\r\n\t};\r\n\tvar view$f = exports.protoUI(api$f, MouseEvents, Destruction, base.view);\r\n\r\n\tvar api$g = {\r\n\t name: \"align\",\r\n\t defaults: {\r\n\t borderless: true,\r\n\t left: 0,\r\n\t top: 0,\r\n\t right: 0,\r\n\t bottom: 0\r\n\t },\r\n\t $init: function $init() {\r\n\t this._viewobj.className += \" webix_view_align\";\r\n\t },\r\n\t getChildViews: function getChildViews() {\r\n\t return [this._body_cell];\r\n\t },\r\n\t body_setter: function body_setter(value) {\r\n\t value._inner = {\r\n\t top: false,\r\n\t left: false,\r\n\t right: false,\r\n\t bottom: false\r\n\t };\r\n\t state._parent_cell = this;\r\n\t this._body_cell = ui._view(value);\r\n\r\n\t this._viewobj.appendChild(this._body_cell._viewobj);\r\n\r\n\t return value;\r\n\t },\r\n\t align_setter: function align_setter(value) {\r\n\t if (typeof value === \"string\") value = value.split(\",\");\r\n\t this._x_align = this._y_align = this._p_align = \"\";\r\n\r\n\t for (var i = 0; i < value.length; i++) {\r\n\t var c = value[i];\r\n\t if (c === \"center\" || c === \"left\" || c === \"right\") this._x_align = c;\r\n\t if (c === \"top\" || c === \"bottom\" || c === \"middle\") this._y_align = c;\r\n\t if (c === \"absolute\") this._x_align = this._y_align = this._p_align = \"precise\";\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t getBody: function getBody() {\r\n\t return this._body_cell;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t base.api.$setSize.call(this, x, y);\r\n\t var dx, dy;\r\n\r\n\t if (this._p_align) {\r\n\t dx = x - this._settings.left - this._settings.right;\r\n\t dy = y - this._settings.top - this._settings.bottom;\r\n\t } else {\r\n\t dx = this._desired_size[0] || x;\r\n\t dy = this._desired_size[2] || y;\r\n\t }\r\n\r\n\t this._body_cell.$setSize(dx, dy);\r\n\r\n\t var box = this._body_cell._viewobj;\r\n\t if (this._x_align == \"center\") box.style.marginLeft = Math.ceil((x - dx) / 2) + \"px\";else if (this._x_align == \"right\") box.style.marginLeft = x - dx + \"px\";else box.style.marginLeft = (this._p_align ? this._settings.left : 0) + \"px\";\r\n\t if (this._y_align == \"middle\") box.style.marginTop = Math.ceil((y - dy) / 2) + \"px\";else if (this._y_align == \"bottom\") box.style.marginTop = y - dy + \"px\";else box.style.marginTop = (this._p_align ? this._settings.top : 0) + \"px\";\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var size = this._desired_size = this._body_cell.$getSize(0, 0);\r\n\r\n\t var self_size = baseview.api.$getSize.call(this, 0, 0);\r\n\r\n\t if (this._p_align) {\r\n\t dx += this._settings.left + this._settings.right;\r\n\t dy += this._settings.top + this._settings.bottom;\r\n\t }\r\n\r\n\t if (!this._x_align || this._p_align) {\r\n\t self_size[0] = size[0] + dx;\r\n\t self_size[1] = size[1] + dx;\r\n\t } else {\r\n\t self_size[0] = (self_size[0] || size[0]) + dy;\r\n\t self_size[1] += dx;\r\n\t }\r\n\r\n\t if (!this._y_align || this._p_align) {\r\n\t self_size[2] = size[2] + dy;\r\n\t self_size[3] = size[3] + dy;\r\n\t } else {\r\n\t self_size[2] = (self_size[2] || size[2]) + dy;\r\n\t self_size[3] += dy;\r\n\t }\r\n\r\n\t return self_size;\r\n\t }\r\n\t};\r\n\tvar view$g = exports.protoUI(api$g, base.view);\r\n\r\n\tvar api$h = {\r\n\t name: \"multiview\",\r\n\t defaults: {\r\n\t animate: {}\r\n\t },\r\n\t setValue: function setValue(val) {\r\n\t $$(val).show();\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this.getActiveId();\r\n\t },\r\n\t $init: function $init() {\r\n\t this._active_cell = 0;\r\n\t this._vertical_orientation = 1;\r\n\t this._viewobj.style.position = \"relative\";\r\n\t this._viewobj.className += \" webix_multiview\";\r\n\t this._back_queue = [];\r\n\t },\r\n\t _ask_render: function _ask_render(cell_id, view_id) {\r\n\t var cell = $$(cell_id);\r\n\r\n\t if (!cell._render_hash) {\r\n\t cell._render_queue = [];\r\n\t cell._render_hash = {};\r\n\t }\r\n\r\n\t if (!cell._render_hash[view_id]) {\r\n\t cell._render_hash[view_id] = true;\r\n\r\n\t cell._render_queue.push(view_id);\r\n\t }\r\n\t },\r\n\t _render_activation: function _render_activation(cell_id) {\r\n\t var cell = $$(cell_id);\r\n\t if (this._settings.keepViews) cell._viewobj.style.display = \"\";\r\n\t /*back array*/\r\n\r\n\t if (this._back_queue[this._back_queue.length - 2] != cell_id) {\r\n\t if (this._back_queue.length == 10) this._back_queue.splice(0, 1);\r\n\r\n\t this._back_queue.push(cell_id);\r\n\t } else this._back_queue.splice(this._back_queue.length - 1, 1);\r\n\r\n\t if (cell._render_hash) {\r\n\t for (var i = 0; i < cell._render_queue.length; i++) {\r\n\t var subcell = $$(cell._render_queue[i]); //cell can be already destroyed\r\n\r\n\t if (subcell) subcell.render();\r\n\t }\r\n\r\n\t cell._render_queue = [];\r\n\t cell._render_hash = {};\r\n\t }\r\n\t },\r\n\t addView: function addView() {\r\n\t var id = baselayout.api.addView.apply(this, arguments);\r\n\t if (this._settings.keepViews) $$(id)._viewobj.style.display = \"none\";else remove($$(id)._viewobj);\r\n\t return id;\r\n\t },\r\n\t _beforeRemoveView: function _beforeRemoveView(index$$1) {\r\n\t //removing current view\r\n\t if (index$$1 == this._active_cell) {\r\n\t var next = Math.max(index$$1 - 1, 0);\r\n\r\n\t if (this._cells[next]) {\r\n\t this._in_animation = false;\r\n\r\n\t this._show(this._cells[next], false);\r\n\t }\r\n\t }\r\n\r\n\t if (index$$1 < this._active_cell) this._active_cell--;\r\n\t },\r\n\t //necessary, as we want to ignore hide calls for elements in multiview\r\n\t _hide: function _hide() {},\r\n\t _parse_cells: function _parse_cells(collection) {\r\n\t collection = collection || this._collection;\r\n\r\n\t for (var i = 0; i < collection.length; i++) {\r\n\t collection[i]._inner = this._settings.borderless ? {\r\n\t top: 1,\r\n\t left: 1,\r\n\t right: 1,\r\n\t bottom: 1\r\n\t } : this._settings._inner || {};\r\n\t }\r\n\r\n\t baselayout.api._parse_cells.call(this, collection);\r\n\r\n\t for (var _i = 1; _i < this._cells.length; _i++) {\r\n\t if (this._settings.keepViews) this._cells[_i]._viewobj.style.display = \"none\";else remove(this._cells[_i]._viewobj);\r\n\t }\r\n\r\n\t for (var _i2 = 0; _i2 < collection.length; _i2++) {\r\n\t var cell = this._cells[_i2];\r\n\t if (cell._cells && !cell._render_borders) continue;\r\n\t var _inner = cell._settings._inner;\r\n\t if (_inner.top) cell._viewobj.style.borderTopWidth = \"0px\";\r\n\t if (_inner.left) cell._viewobj.style.borderLeftWidth = \"0px\";\r\n\t if (_inner.right) cell._viewobj.style.borderRightWidth = \"0px\";\r\n\t if (_inner.bottom) cell._viewobj.style.borderBottomWidth = \"0px\";\r\n\r\n\t cell._viewobj.setAttribute(\"role\", \"tabpanel\");\r\n\t }\r\n\r\n\t this._render_activation(this.getActiveId());\r\n\t },\r\n\t cells_setter: function cells_setter(value) {\r\n\t assert(value && value.length, \"Multiview must have at least one view in 'cells'\");\r\n\t this._collection = value;\r\n\t },\r\n\t _getDirection: function _getDirection(next, active) {\r\n\t var dir = (this._settings.animate || {}).direction;\r\n\t var vx = dir == \"top\" || dir == \"bottom\";\r\n\t return next < active ? vx ? \"bottom\" : \"right\" : vx ? \"top\" : \"left\";\r\n\t },\r\n\t _show: function _show(obj, animation_options) {\r\n\t var parent = this.getParentView();\r\n\t if (parent && parent.getTabbar) parent.getTabbar().setValue(obj._settings.$id || obj._settings.id);\r\n\t if (this._in_animation) return delay(this._show, this, [obj, animation_options], 100);\r\n\r\n\t var _next_cell = -1;\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t if (this._cells[i] == obj) {\r\n\t _next_cell = i;\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t if (_next_cell < 0 || _next_cell == this._active_cell) return;\r\n\t var prev = this._cells[this._active_cell];\r\n\t var next = this._cells[_next_cell];\r\n\t prev.$getSize(0, 0); //need to be moved in animate\r\n\r\n\t if ((animation_options || typeof animation_options == \"undefined\") && animate.isSupported() && this._settings.animate) {\r\n\t var aniset = exports.extend({}, this._settings.animate);\r\n\t if (this._settings.keepViews) aniset.keepViews = true;\r\n\t aniset.direction = this._getDirection(_next_cell, this._active_cell);\r\n\t aniset = Settings._mergeSettings(animation_options || {}, aniset);\r\n\t var line = animate.formLine(next._viewobj, prev._viewobj, aniset);\r\n\t next.$getSize(0, 0);\r\n\t next.$setSize(this._content_width, this._content_height);\r\n\t var callback_original = aniset.callback;\r\n\r\n\t aniset.callback = function () {\r\n\t animate.breakLine(line, this._settings.keepViews);\r\n\t this._in_animation = false;\r\n\t if (callback_original) callback_original.call(this);\r\n\t callback_original = aniset.master = aniset.callback = null;\r\n\t this.resize();\r\n\t };\r\n\r\n\t aniset.master = this;\r\n\t this._active_cell = _next_cell;\r\n\r\n\t this._render_activation(this.getActiveId());\r\n\r\n\t animate(line, aniset);\r\n\t this._in_animation = true;\r\n\t } else {\r\n\t // browsers which don't support transform and transition\r\n\t if (this._settings.keepViews) {\r\n\t prev._viewobj.style.display = \"none\";\r\n\t } else {\r\n\t remove(prev._viewobj);\r\n\r\n\t this._viewobj.appendChild(this._cells[i]._viewobj);\r\n\t }\r\n\r\n\t this._active_cell = _next_cell;\r\n\t prev.resize();\r\n\r\n\t this._render_activation(this.getActiveId());\r\n\t }\r\n\r\n\t if (next.callEvent) {\r\n\t next.callEvent(\"onViewShow\", []);\r\n\t each(next, this._signal_hidden_cells);\r\n\t }\r\n\r\n\t this.callEvent(\"onViewChange\", [prev._settings.id, next._settings.id]);\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t if (!this._cells.length) return baseview.api.$getSize.call(this, 0, 0);\r\n\t debug_size_box_start(this, true);\r\n\r\n\t var size = this._cells[this._active_cell].$getSize(0, 0);\r\n\r\n\t if (this._settings.fitBiggest) {\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t if (i != this._active_cell) {\r\n\t var other = this._cells[i].$getSize(0, 0);\r\n\r\n\t for (var j = 0; j < 4; j++) {\r\n\t size[j] = Math.max(size[j], other[j]);\r\n\t }\r\n\t }\r\n\t }\r\n\t } //get layout sizes\r\n\r\n\r\n\t var self_size = baseview.api.$getSize.call(this, 0, 0); //use child settings if layout's one was not defined\r\n\r\n\t if (self_size[1] >= 100000) self_size[1] = 0;\r\n\t if (self_size[3] >= 100000) self_size[3] = 0;\r\n\t self_size[0] = (self_size[0] || size[0]) + dx;\r\n\t self_size[1] = (self_size[1] || size[1]) + dx;\r\n\t self_size[2] = (self_size[2] || size[2]) + dy;\r\n\t self_size[3] = (self_size[3] || size[3]) + dy;\r\n\t debug_size_box_end(this, self_size);\r\n\t return self_size;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (!this._cells.length) return;\r\n\t this._layout_sizes = [x, y];\r\n\t baseview.api.$setSize.call(this, x, y);\r\n\r\n\t this._cells[this._active_cell].$setSize(x, y);\r\n\t },\r\n\t isVisible: function isVisible(base_id, cell_id) {\r\n\t if (cell_id && cell_id != this.getActiveId()) {\r\n\t if (base_id) this._ask_render(cell_id, base_id);\r\n\t return false;\r\n\t }\r\n\r\n\t return base.api.isVisible.call(this, base_id, this._settings.id);\r\n\t },\r\n\t getActiveId: function getActiveId() {\r\n\t return this._cells.length ? this._cells[this._active_cell]._settings.id : null;\r\n\t },\r\n\t back: function back(step) {\r\n\t step = step || 1;\r\n\r\n\t if (this.callEvent(\"onBeforeBack\", [this.getActiveId(), step])) {\r\n\t if (this._back_queue.length > step) {\r\n\t var viewId = this._back_queue[this._back_queue.length - step - 1];\r\n\t $$(viewId).show();\r\n\t return viewId;\r\n\t }\r\n\r\n\t return null;\r\n\t }\r\n\r\n\t return null;\r\n\t }\r\n\t};\r\n\tvar view$h = exports.protoUI(api$h, baselayout.view);\r\n\r\n\tvar api$i = {\r\n\t name: \"tabview\",\r\n\t setValue: function setValue(val) {\r\n\t this._cells[0].setValue(val);\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this._cells[0].getValue();\r\n\t },\r\n\t getTabbar: function getTabbar() {\r\n\t return this._cells[0];\r\n\t },\r\n\t getMultiview: function getMultiview() {\r\n\t return this._cells[1];\r\n\t },\r\n\t addView: function addView(obj) {\r\n\t var nid = this.getMultiview().addView(obj.body);\r\n\t obj.id = nid;\r\n\t obj.value = obj.header;\r\n\t delete obj.body;\r\n\t delete obj.header;\r\n\t var t = this.getTabbar();\r\n\t t.addOption(obj);\r\n\t return nid;\r\n\t },\r\n\t removeView: function removeView(id) {\r\n\t var t = this.getTabbar();\r\n\t t.removeOption(id);\r\n\t t.refresh();\r\n\t },\r\n\t $init: function $init(config) {\r\n\t this.$ready.push(this._init_tabview_handlers);\r\n\t var cells = config.cells;\r\n\t var tabs = [];\r\n\t assert(cells && cells.length, \"tabview must have cells collection\");\r\n\r\n\t for (var i = cells.length - 1; i >= 0; i--) {\r\n\t var view = cells[i].body || cells[i];\r\n\t if (!view.id) view.id = \"view\" + uid();\r\n\t tabs[i] = {\r\n\t value: cells[i].header,\r\n\t id: view.id,\r\n\t close: cells[i].close,\r\n\t width: cells[i].width,\r\n\t hidden: !!cells[i].hidden\r\n\t };\r\n\t cells[i] = view;\r\n\t }\r\n\r\n\t var tabbar = {\r\n\t view: \"tabbar\",\r\n\t multiview: true\r\n\t };\r\n\t var mview = {\r\n\t view: \"multiview\",\r\n\t cells: cells,\r\n\t animate: !!config.animate\r\n\t };\r\n\t if (config.value) tabbar.value = config.value;\r\n\t if (config.tabbar) exports.extend(tabbar, config.tabbar, true);\r\n\t if (config.multiview) exports.extend(mview, config.multiview, true);\r\n\t tabbar.options = tabbar.options || tabs;\r\n\t config.rows = [tabbar, mview];\r\n\t delete config.cells;\r\n\t delete config.tabs;\r\n\t },\r\n\t _init_tabview_handlers: function _init_tabview_handlers() {\r\n\t this.getTabbar().attachEvent(\"onOptionRemove\", function (id) {\r\n\t var view = $$(id);\r\n\r\n\t if (view) {\r\n\t var parent = view.getParentView();\r\n\t if (parent) parent.removeView(view);\r\n\t }\r\n\t });\r\n\t }\r\n\t};\r\n\tvar view$i = exports.protoUI(api$i, layout.view);\r\n\r\n\tvar api$j = {\r\n\t name: \"carousel\",\r\n\t defaults: {\r\n\t scrollSpeed: \"300ms\",\r\n\t type: \"clean\",\r\n\t navigation: {},\r\n\t animate: true\r\n\t },\r\n\t $init: function $init() {\r\n\t this._viewobj.className += \" webix_carousel\";\r\n\t this._layout = null;\r\n\t this._dataobj = null;\r\n\t this._active_cell = 0;\r\n\t this.$ready.unshift(this._initLayout);\r\n\t this.$ready.push(this._after_init_call);\r\n\t },\r\n\t addView: function addView(view, index) {\r\n\t var t = this._layout.addView(view, index);\r\n\r\n\t this._fix_after_view_add();\r\n\r\n\t return t;\r\n\t },\r\n\t removeView: function removeView(id) {\r\n\t this._layout.removeView(id);\r\n\r\n\t this._fix_after_view_add();\r\n\t },\r\n\t _replace: function _replace(new_view, target_id) {\r\n\t this._layout._replace(new_view, target_id);\r\n\r\n\t this._fix_after_view_add();\r\n\t },\r\n\t _fix_after_view_add: function _fix_after_view_add() {\r\n\t this._cells = this._layout._cells;\r\n\r\n\t this._renderPanel();\r\n\r\n\t this.setActiveIndex(Math.min(this._active_cell, this._cells.length - 1));\r\n\t },\r\n\t _initLayout: function _initLayout() {\r\n\t if (this._layout && this._layout.destructor) this._layout.destructor();\r\n\t var layout = \"\";\r\n\r\n\t if (this.config.cols) {\r\n\t layout = \"cols\";\r\n\t this._vertical_orientation = 0;\r\n\t } else {\r\n\t layout = \"rows\";\r\n\t this._vertical_orientation = 1;\r\n\t }\r\n\r\n\t var config = {\r\n\t borderless: true,\r\n\t type: \"clean\"\r\n\t };\r\n\t config[layout] = copy(this._settings[layout]);\r\n\t var layoutProp = [\"type\", \"margin\", \"marginX\", \"marginY\", \"padding\", \"paddingX\", \"paddingY\"];\r\n\t var layoutConfig = {};\r\n\r\n\t for (var i = 0; i < layoutProp.length; i++) {\r\n\t if (this._settings[layoutProp[i]]) {\r\n\t layoutConfig[layoutProp[i]] = this._settings[layoutProp[i]];\r\n\t }\r\n\t }\r\n\r\n\t exports.extend(config, layoutConfig, true);\r\n\t state._parent_cell = this;\r\n\t this._layout = ui._view(config);\r\n\r\n\t this._viewobj.appendChild(this._layout._viewobj);\r\n\r\n\t this._cells = this._layout._cells;\r\n\t this._layout._show = bind(api$j._show, this);\r\n\t this._layout.adjustScroll = bind(api$j.adjustScroll, this);\r\n\t attachEvent(\"onReconstruct\", bind(function (view) {\r\n\t if (view == this._layout) this._setScroll();\r\n\t }, this));\r\n\t this._contentobj = this._viewobj.firstChild;\r\n\t },\r\n\t _onKeyPress: function _onKeyPress(code, e) {\r\n\t if (this._settings.navigation.items && e.target.getAttribute(\"role\") === \"tab\") this._moveActive(code, e);\r\n\r\n\t baseview.api._onKeyPress.call(this, code, e);\r\n\t },\r\n\t getChildViews: function getChildViews() {\r\n\t return [this._layout];\r\n\t },\r\n\t getLayout: function getLayout() {\r\n\t return this._layout;\r\n\t },\r\n\t _after_init_call: function _after_init_call() {\r\n\t this._contentobj.setAttribute(\"touch_scroll\", this._vertical_orientation ? \"y\" : \"x\");\r\n\r\n\t this._layout.attachEvent(\"onAfterScroll\", bind(function () {\r\n\t this.callEvent(\"onShow\", [this.getActiveId()]);\r\n\t }, this));\r\n\r\n\t each(this._layout, function (view) {\r\n\t view._viewobj.setAttribute(\"role\", \"tabpanel\");\r\n\t });\r\n\t },\r\n\t adjustScroll: function adjustScroll(matrix) {\r\n\t var size = this._vertical_orientation ? this._content_height : this._content_width;\r\n\t var correction;\r\n\r\n\t if (this._vertical_orientation) {\r\n\t correction = Math.round(matrix.f / size);\r\n\t matrix.f = correction * size;\r\n\t } else {\r\n\t correction = Math.round(matrix.e / size);\r\n\t matrix.e = correction * size;\r\n\t }\r\n\r\n\t this._active_cell = -correction;\r\n\t if (this._settings.navigation) this._renderNavItems();\r\n\t return true;\r\n\t },\r\n\t _show: function _show(obj) {\r\n\t var i, layout, _nextCell, _size, x, y;\r\n\r\n\t _nextCell = -1;\r\n\t layout = this._layout;\r\n\r\n\t for (i = 0; i < layout._cells.length; i++) {\r\n\t if (layout._cells[i] == obj) {\r\n\t _nextCell = i;\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t if (_nextCell < 0 || _nextCell == this._active_cell) return;\r\n\t this._active_cell = _nextCell;\r\n\t _size = layout._vertical_orientation ? this._content_height : this._content_width;\r\n\t x = -(layout._vertical_orientation ? 0 : _nextCell * _size);\r\n\t y = -(layout._vertical_orientation ? _nextCell * _size : 0);\r\n\t this.scrollTo(x, y);\r\n\t this.callEvent(\"onShow\", [layout._cells[this._active_cell]._settings.id]);\r\n\t if (this._settings.navigation) this._renderPanel();\r\n\t },\r\n\t scrollTo: function scrollTo(x, y) {\r\n\t if (Touch && animate.isSupported() && this._settings.animate) Touch._set_matrix(this._contentobj, x, y, this._settings.scrollSpeed || \"100ms\");else {\r\n\t this._contentobj.style.marginLeft = x + \"px\";\r\n\t this._contentobj.style.marginTop = y + \"px\";\r\n\t }\r\n\t },\r\n\t navigation_setter: function navigation_setter(config) {\r\n\t this._mergeSettings(config, {\r\n\t type: \"corner\",\r\n\t buttons: true,\r\n\t items: true\r\n\t });\r\n\r\n\t return config;\r\n\t },\r\n\t showNext: function showNext() {\r\n\t if (this._active_cell < this._layout._cells.length - 1) this.setActiveIndex(this._active_cell + 1);\r\n\t },\r\n\t showPrev: function showPrev() {\r\n\t if (this._active_cell > 0) this.setActiveIndex(this._active_cell - 1);\r\n\t },\r\n\t setActiveIndex: function setActiveIndex(value) {\r\n\t assert(value < this._layout._cells.length, \"Not existing index in collection\");\r\n\t var id = this._layout._cells[value]._settings.id;\r\n\t $$(id).show();\r\n\t },\r\n\t getActiveIndex: function getActiveIndex() {\r\n\t return this._active_cell;\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var layoutSizes = this._layout.$getSize(0, 0);\r\n\r\n\t var selfSizes = base.api.$getSize.call(this, dx, dy);\r\n\r\n\t if (this._layout._vertical_orientation) {\r\n\t selfSizes[0] = Math.max(selfSizes[0], layoutSizes[0]);\r\n\t selfSizes[1] = Math.min(selfSizes[1], layoutSizes[1]);\r\n\t } else {\r\n\t selfSizes[2] = Math.max(selfSizes[2], layoutSizes[2]);\r\n\t selfSizes[3] = Math.min(selfSizes[3], layoutSizes[3]);\r\n\t }\r\n\r\n\t return selfSizes;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t var layout = this._layout;\r\n\t var c = layout._cells.length;\r\n\t var changed = base.api.$setSize.call(this, x, y);\r\n\t var yc = this._content_height * (layout._vertical_orientation ? c : 1);\r\n\t var xc = this._content_width * (layout._vertical_orientation ? 1 : c);\r\n\r\n\t if (changed) {\r\n\t this._contentobj.style.height = yc + \"px\";\r\n\t this._contentobj.style.width = xc + \"px\";\r\n\t layout.$setSize(xc, yc);\r\n\r\n\t this._setScroll();\r\n\t } else layout.$setSize(xc, yc);\r\n\t },\r\n\t _setScroll: function _setScroll() {\r\n\t var layout = this._layout;\r\n\t var activeCell = this._active_cell || 0;\r\n\t var size = layout._vertical_orientation ? this._content_height : this._content_width;\r\n\t var x = -(layout._vertical_orientation ? 0 : activeCell * size);\r\n\t var y = -(layout._vertical_orientation ? activeCell * size : 0);\r\n\t this.scrollTo(x, y);\r\n\t if (this._settings.navigation) this._renderPanel();\r\n\t },\r\n\t getActiveId: function getActiveId() {\r\n\t var cell = this._layout._cells[this._active_cell];\r\n\t return cell ? cell._settings.id : null;\r\n\t },\r\n\t setActive: function setActive(value) {\r\n\t $$(value).show();\r\n\t }\r\n\t};\r\n\tvar view$j = exports.protoUI(api$j, EventSystem, NavigationButtons, base.view);\r\n\r\n\tvar api$k = {\r\n\t name: \"proxy\",\r\n\t body_setter: function body_setter(value) {\r\n\t state._parent_cell = this;\r\n\t this._body_cell = ui._view(value);\r\n\r\n\t this._viewobj.appendChild(this._body_cell._viewobj);\r\n\r\n\t return value;\r\n\t },\r\n\t getChildViews: function getChildViews() {\r\n\t return [this._body_cell];\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t base.api.$setSize.call(this, x, y);\r\n\r\n\t this._body_cell.$setSize(this.$width, this.$height);\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var selfSize = base.api.$getSize.call(this, dx, dy);\r\n\r\n\t var size = this._body_cell.$getSize(dx, dy);\r\n\r\n\t size[0] = Math.max(selfSize[0], size[0]);\r\n\t size[1] = Math.min(selfSize[1], size[1]);\r\n\t size[2] = Math.max(selfSize[2], size[2]);\r\n\t size[3] = Math.min(selfSize[3], size[3]);\r\n\t size[4] = Math.max(selfSize[4], size[4]);\r\n\t return size;\r\n\t },\r\n\t _replace: function _replace(n) {\r\n\t this._body_cell.destructor();\r\n\r\n\t this._body_cell = n;\r\n\r\n\t this._viewobj.appendChild(n._viewobj);\r\n\t }\r\n\t};\r\n\tvar view$k = exports.protoUI(api$k, base.view);\r\n\r\n\tvar api$l = {\r\n\t name: \"portlet\",\r\n\t defaults: {\r\n\t layoutType: \"wide\",\r\n\t icon: \"wxi-drag\"\r\n\t },\r\n\t $init: function $init(config) {\r\n\t this._viewobj.style.position = \"relative\";\r\n\t if (config.header && config.body) config.body = [{\r\n\t template: config.header,\r\n\t type: \"header\"\r\n\t }, config.body];\r\n\t this.$ready.push(this._init_drag_area); // refresh scroll state of datatables\r\n\r\n\t attachEvent(\"onAfterPortletMove\", this._refreshChildScrolls);\r\n\t },\r\n\t _refreshChildScrolls: function _refreshChildScrolls(source) {\r\n\t each(source, function (view) {\r\n\t if (view._restore_scroll_state) view._restore_scroll_state();\r\n\t });\r\n\t },\r\n\t _init_drag_area: function _init_drag_area() {\r\n\t var childs = this.getChildViews();\r\n\t if (childs.length > 1) DragControl.addDrag(childs[0].$view, this);else if (this._settings.icon) {\r\n\t var drag = create(\"div\", {\r\n\t \"class\": \"portlet_drag\"\r\n\t }, \"\");\r\n\r\n\t this._viewobj.appendChild(drag);\r\n\r\n\t DragControl.addDrag(drag, this);\r\n\t } else {\r\n\t DragControl.addDrag(this.$view, this);\r\n\t }\r\n\t },\r\n\t body_setter: function body_setter(value) {\r\n\t return this.rows_setter(isArray(value) ? value : [value]);\r\n\t },\r\n\t markDropArea: function markDropArea(target, mode) {\r\n\t if (!target) return remove(this._markerbox);\r\n\t target = $$(target);\r\n\t if (!this._markerbox) this._markerbox = create(\"div\", null, \" \");\r\n\t target.$view.appendChild(this._markerbox);\r\n\t this._markerbox.className = \"portlet_marker\" + mode;\r\n\t },\r\n\t movePortlet: function movePortlet(target, mode) {\r\n\t var parent = target.getParentView();\r\n\t var source = this.getParentView();\r\n\t var tindex = parent.index(target);\r\n\t var sindex = source.index(this);\r\n\t if (!callEvent(\"onBeforePortletMove\", [source, parent, this, target, mode])) return;\r\n\t state._freeze_resize = true;\r\n\t var shift = source != parent ? 1 : 0;\r\n\t var isv = parent._vertical_orientation;\r\n\r\n\t if (mode == \"top\" || mode == \"bottom\") {\r\n\t if (isv !== 1) {\r\n\t parent = ui({\r\n\t type: target._settings.layoutType,\r\n\t rows: []\r\n\t }, parent, tindex + shift);\r\n\t ui(target, parent, 0);\r\n\t tindex = 0;\r\n\t shift = 1;\r\n\t }\r\n\r\n\t if (mode == \"bottom\") shift += 1;\r\n\t } else if (mode == \"left\" || mode == \"right\") {\r\n\t if (isv !== 0) {\r\n\t parent = ui({\r\n\t type: target._settings.layoutType,\r\n\t cols: []\r\n\t }, parent, tindex + shift);\r\n\t ui(target, parent, 0);\r\n\t tindex = 0;\r\n\t shift = 1;\r\n\t }\r\n\r\n\t if (mode == \"right\") shift += 1;\r\n\t }\r\n\r\n\t if (sindex < tindex) shift -= 1;\r\n\t ui(this, parent, tindex + shift);\r\n\t if (mode == \"replace\") ui(target, source, sindex);\r\n\r\n\t this._removeEmptySource(source);\r\n\r\n\t state._freeze_resize = false;\r\n\t target.resize();\r\n\t source.resize();\r\n\t callEvent(\"onAfterPortletMove\", [source, parent, this, target, mode]);\r\n\t },\r\n\t _removeEmptySource: function _removeEmptySource(view) {\r\n\t var childview;\r\n\t var maxcount = 0;\r\n\r\n\t while (view.getChildViews().length <= maxcount) {\r\n\t childview = view;\r\n\t view = view.getParentView();\r\n\t maxcount = 1;\r\n\t }\r\n\r\n\t if (maxcount) view.removeView(childview);\r\n\t },\r\n\t $drag: function $drag(object) {\r\n\t addCss(this._viewobj, \"portlet_in_drag\");\r\n\t DragControl._drag_context = {\r\n\t source: object,\r\n\t from: object\r\n\t };\r\n\t return this._viewobj.innerHTML;\r\n\t },\r\n\t $dragDestroy: function $dragDestroy(target, html) {\r\n\t removeCss(this._viewobj, \"portlet_in_drag\");\r\n\t remove(html);\r\n\r\n\t if (this._portlet_drop_target) {\r\n\t this.movePortlet(this._portlet_drop_target, this._portlet_drop_mode);\r\n\t this.markDropArea();\r\n\t this._portlet_drop_target = null;\r\n\t }\r\n\t },\r\n\t _getDragItemPos: function _getDragItemPos() {\r\n\t return offset(this.$view);\r\n\t },\r\n\t $dragPos: function $dragPos(pos$$1, e, html) {\r\n\t html.style.left = \"-10000px\";\r\n\t var evObj = env.mouse.context(e);\r\n\t var top = document.body.scrollTop || document.documentElement.scrollTop || 0;\r\n\t var left = document.body.scrollLeft || document.documentElement.scrollLeft || 0; // elementFromPoint need to be corrected on scroll value\r\n\r\n\t var node = document.elementFromPoint(evObj.x - left, evObj.y - top);\r\n\t var view = null;\r\n\t if (node) view = $$(node);\r\n\t this._portlet_drop_target = this._getPortletTarget(view);\r\n\t this._portlet_drop_mode = this._markPortletDrag(this._portlet_drop_target, e);\r\n\t pos$$1.x = pos$$1.x - this._content_width + 10;\r\n\t pos$$1.y = pos$$1.y - 20;\r\n\t DragControl._skip = true;\r\n\t },\r\n\t _markPortletDrag: function _markPortletDrag(view, ev) {\r\n\t var drop = \"\";\r\n\t var mode = \"\";\r\n\r\n\t if (ev && view) {\r\n\t var box = offset(view.$view);\r\n\t var pos$$1 = pos(ev);\r\n\t var erx = pos$$1.x - box.x - box.width / 2;\r\n\t var ery = pos$$1.y - box.y - box.height / 2;\r\n\t mode = view._settings.mode;\r\n\t if (!mode) mode = Math.abs(erx) * (box.height / box.width) > Math.abs(ery) ? \"cols\" : \"rows\";\r\n\r\n\t if (mode == \"cols\") {\r\n\t drop = erx >= 0 ? \"right\" : \"left\";\r\n\t } else if (mode == \"rows\") {\r\n\t drop = ery >= 0 ? \"bottom\" : \"top\";\r\n\t }\r\n\r\n\t this.markDropArea(view, drop);\r\n\t }\r\n\r\n\t this.markDropArea(view, drop);\r\n\t return drop || mode;\r\n\t },\r\n\t _getPortletTarget: function _getPortletTarget(view) {\r\n\t while (view) {\r\n\t if (view.movePortlet) return view;else view = view.getParentView();\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$l = exports.protoUI(api$l, layout.view);\r\n\r\n\tvar api$m = {\r\n\t name: \"abslayout\",\r\n\t $init: function $init() {\r\n\t this.$view.className += \" webix_abslayout\";\r\n\t delete this.rows_setter;\r\n\t delete this.cols_setter;\r\n\t this._collection = [];\r\n\t },\r\n\t cells_setter: function cells_setter(cells) {\r\n\t this._collection = cells;\r\n\t },\r\n\t _parse_cells: function _parse_cells() {\r\n\t baselayout.api._parse_cells.call(this, this._collection);\r\n\t },\r\n\t $getSize: function $getSize() {\r\n\t var self_size = baseview.api.$getSize.call(this, 0, 0);\r\n\t var sub = null;\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t if (this._cells[i]._settings.relative) sub = this._cells[i].$getSize(0, 0);\r\n\t }\r\n\r\n\t if (sub) {\r\n\t //use child settings if layout's one was not defined\r\n\t if (self_size[1] >= 100000) self_size[1] = 0;\r\n\t if (self_size[3] >= 100000) self_size[3] = 0;\r\n\t self_size[0] = Math.max(self_size[0], sub[0]);\r\n\t self_size[1] = Math.max(self_size[1], sub[1]);\r\n\t self_size[2] = Math.max(self_size[2], sub[2]);\r\n\t self_size[3] = Math.max(self_size[3], sub[3]);\r\n\t }\r\n\r\n\t return self_size;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t this._layout_sizes = [x, y];\r\n\t debug_size_box_start(this);\r\n\t baseview.api.$setSize.call(this, x, y);\r\n\r\n\t this._set_child_size(x, y);\r\n\r\n\t debug_size_box_end(this, [x, y]);\r\n\t },\r\n\t _set_child_size: function _set_child_size(x, y) {\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t var view = this._cells[i];\r\n\t var conf = view._settings;\r\n\t var sizes = view.$getSize(0, 0);\r\n\r\n\t if (conf.relative) {\r\n\t conf.left = conf.top = 0;\r\n\t view.$setSize(x, y);\r\n\t } else {\r\n\t view.$setSize(sizes[0], sizes[2]);\r\n\t }\r\n\r\n\t var node = view.$view;\r\n\t var options = [\"left\", \"right\", \"top\", \"bottom\"];\r\n\r\n\t for (var j = 0; j < options.length; j++) {\r\n\t var key = options[j];\r\n\t if (key in conf) node.style[key] = conf[key] + \"px\";\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$m = exports.protoUI(api$m, baselayout.view);\r\n\tvar abslayout = {\r\n\t api: api$m,\r\n\t view: view$m\r\n\t};\r\n\r\n\tvar api$n = {\r\n\t name: \"gridlayout\",\r\n\t defaults: {\r\n\t autoplace: true,\r\n\t gridColumns: 2,\r\n\t gridRows: 2,\r\n\t margin: 10,\r\n\t padding: 10\r\n\t },\r\n\t gridRows_setter: function gridRows_setter(value) {\r\n\t return this._actual_rows = value;\r\n\t },\r\n\t _parse_cells: function _parse_cells() {\r\n\t for (var i = 0; i < this._collection.length; i++) {\r\n\t this._collection[i]._inner = {};\r\n\t }\r\n\r\n\t baselayout.api._parse_cells.call(this, this._collection);\r\n\t },\r\n\t removeView: function removeView(id) {\r\n\t abslayout.api.removeView.call(this, id);\r\n\r\n\t this._do_compact();\r\n\r\n\t this.callEvent(\"onChange\", []);\r\n\t },\r\n\t _check_default_pos: function _check_default_pos(config) {\r\n\t config.dx = config.dx || 1;\r\n\t config.dy = config.dy || 1;\r\n\r\n\t if (isUndefined(config.y) || isUndefined(config.x)) {\r\n\t var matrix = this._buildMatrix();\r\n\r\n\t for (var y = 0; y < this._actual_rows; y++) {\r\n\t for (var x = 0; x < this._settings.gridColumns; x++) {\r\n\t if (!matrix[x][y] && this._isFree(matrix, x, y, x + config.dx, y + config.dy)) {\r\n\t config.x = x;\r\n\t config.y = y;\r\n\t return;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t config.x = 0;\r\n\t config.y = this._actual_rows;\r\n\t } //ensure that view is not wider than grid\r\n\r\n\r\n\t var exceed = config.x + config.dx - this._settings.gridColumns;\r\n\t if (exceed > 0) config.dx -= exceed;\r\n\t },\r\n\t _replace: function _replace(new_view) {\r\n\t this._check_default_pos(new_view.config);\r\n\r\n\t this._cells.push(new_view);\r\n\r\n\t this.$view.appendChild(new_view._viewobj);\r\n\r\n\t this._reserveSpace(new_view.config, new_view.config.id);\r\n\r\n\t this._do_compact(true);\r\n\r\n\t if (!this._silent) this.callEvent(\"onChange\", []);\r\n\t },\r\n\t _isFree: function _isFree(matrix, sx, sy, dx, dy) {\r\n\t for (var x = sx; x < dx; x++) {\r\n\t for (var y = sy; y < dy; y++) {\r\n\t if (!matrix[x] || matrix[x][y]) return false;\r\n\t }\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t _markMatrix: function _markMatrix(matrix, sub, id) {\r\n\t for (var x = 0; x < sub.dx; x++) {\r\n\t for (var y = 0; y < sub.dy; y++) {\r\n\t matrix[x + sub.x][y + sub.y] = id;\r\n\t }\r\n\t }\r\n\t },\r\n\t _canMoveRight: function _canMoveRight(matrix, obj, sub) {\r\n\t var mx = this._settings.gridColumns;\r\n\r\n\t for (var x = obj.x + obj.dx; x + sub.dx <= mx; x++) {\r\n\t if (this._isFree(matrix, x, sub.y, x + sub.dx, sub.y + sub.dy)) return x - sub.x;\r\n\t }\r\n\r\n\t return 0;\r\n\t },\r\n\t _canMoveLeft: function _canMoveLeft(matrix, obj, sub) {\r\n\t for (var x = obj.x - sub.dx; x >= 0; x--) {\r\n\t if (this._isFree(matrix, x, sub.y, x + sub.dx, sub.y + sub.dy)) return sub.x - x;\r\n\t }\r\n\r\n\t return 0;\r\n\t },\r\n\t _canMoveTop: function _canMoveTop(matrix, obj, sub) {\r\n\t for (var y = obj.y - sub.dy; y >= 0; y--) {\r\n\t if (this._isFree(matrix, sub.x, y, sub.x + sub.dx, y + sub.dy)) return sub.y - y;\r\n\t }\r\n\r\n\t return 0;\r\n\t },\r\n\t _buildMatrix: function _buildMatrix(id) {\r\n\t var m = [];\r\n\r\n\t for (var x = 0; x < this._settings.gridColumns; x++) {\r\n\t m[x] = [];\r\n\t }\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t var sub = this._cells[i].config;\r\n\t if (sub.id === id) continue;\r\n\r\n\t this._markMatrix(m, sub, sub.id);\r\n\t }\r\n\r\n\t return m;\r\n\t },\r\n\t _do_compact: function _do_compact(force) {\r\n\t //do not correct places or grid, if autoplace disabled\r\n\t if (this._compact() || force) this._apply_new_grid();\r\n\t },\r\n\t _compact: function _compact() {\r\n\t if (!this._settings.autoplace) return false;\r\n\t var mx = this._settings.gridColumns;\r\n\t var my = this._actual_rows;\r\n\r\n\t var matrix = this._buildMatrix();\r\n\r\n\t var compacted = false;\r\n\r\n\t top: for (var y = my - 1; y >= 0; y--) {\r\n\t for (var x = mx - 1; x >= 0; x--) {\r\n\t if (matrix[x][y]) continue top;\r\n\t }\r\n\r\n\t compacted = true;\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t var sub = this._cells[i].config;\r\n\r\n\t if (sub.y >= y) {\r\n\t sub.y -= 1;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return compacted;\r\n\t },\r\n\t _reserveSpace: function _reserveSpace(conf, id) {\r\n\t //prevent x-overflow\r\n\t conf.x -= Math.max(0, conf.x + conf.dx - this._settings.gridColumns); //do not move other cells in non-compact mode\r\n\r\n\t if (!this._settings.autoplace) {\r\n\t conf.y -= Math.max(0, conf.y + conf.dy - this._settings.gridRows);\r\n\t return;\r\n\t }\r\n\r\n\t var cross = [];\r\n\r\n\t var matrix = this._buildMatrix(id);\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t var sub = this._cells[i].config;\r\n\t if (sub.id === id) continue; //console.log(sub.y +\"<\"+ (conf.y+conf.dy), (sub.y+sub.dy) + \">\" +conf.y , sub.x +\"<\"+ (conf.x+conf.dx), (sub.x+sub.dx) + \">\" + conf.x);\r\n\r\n\t if (sub.y < conf.y + conf.dy && sub.y + sub.dy > conf.y && sub.x < conf.x + conf.dx && sub.x + sub.dx > conf.x) {\r\n\t //intersection\r\n\t cross.push(sub);\r\n\t }\r\n\t }\r\n\r\n\t var next = [];\r\n\r\n\t for (var _i = 0; _i < cross.length; _i++) {\r\n\t // check right\r\n\t var _sub = cross[_i];\r\n\r\n\t this._markMatrix(matrix, _sub, 0);\r\n\r\n\t var right = this._canMoveRight(matrix, conf, _sub);\r\n\r\n\t if (right) {\r\n\t _sub.x += right;\r\n\t } else {\r\n\t // check left\r\n\t var left = this._canMoveLeft(matrix, conf, _sub);\r\n\r\n\t if (left) {\r\n\t _sub.x -= left;\r\n\t } else {\r\n\t //check top\r\n\t var top = this._canMoveTop(matrix, conf, _sub);\r\n\r\n\t if (top) {\r\n\t _sub.y -= top;\r\n\t } else {\r\n\t //move bottom\r\n\t _sub.y = conf.y + conf.dy;\r\n\t next.push(_sub);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t this._markMatrix(matrix, _sub, _sub.id);\r\n\t } //when moving bottom, we need to iterate one more time, to resolve new intersections\r\n\r\n\r\n\t for (var _i2 = 0; _i2 < next.length; _i2++) {\r\n\t //console.log(\"after correction for \"+next[i].id);\r\n\t this._reserveSpace(next[_i2], next[_i2].id);\r\n\t }\r\n\t },\r\n\t _apply_new_grid: function _apply_new_grid() {\r\n\t var rows = this._settings.gridRows;\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t var cell = this._cells[i].config;\r\n\t rows = Math.max(rows, cell.y + cell.dy);\r\n\t }\r\n\r\n\t if (this._actual_rows != rows) {\r\n\t this._actual_rows = rows;\r\n\t this.resize();\r\n\t }\r\n\r\n\t this._set_child_size();\r\n\t },\r\n\t moveView: function moveView(id, obj) {\r\n\t obj = exports.extend($$(id).config, obj, true);\r\n\r\n\t this._reserveSpace(obj, id);\r\n\r\n\t this._do_compact(true);\r\n\r\n\t this.callEvent(\"onChange\", []);\r\n\t },\r\n\t serialize: function serialize(serializer) {\r\n\t var state = [];\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t if (serializer) {\r\n\t state.push(serializer.call(this, this._cells[i]));\r\n\t } else {\r\n\t var conf = this._cells[i].config;\r\n\t state.push({\r\n\t id: conf.id,\r\n\t name: conf.name,\r\n\t x: conf.x,\r\n\t y: conf.y,\r\n\t dx: conf.dx,\r\n\t dy: conf.dy\r\n\t });\r\n\t }\r\n\t }\r\n\r\n\t return state;\r\n\t },\r\n\t clearAll: function clearAll() {\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t this._cells[i].destructor();\r\n\t }\r\n\r\n\t this._cells = [];\r\n\t this.callEvent(\"onChange\", []);\r\n\t },\r\n\t restore: function restore(state, factory) {\r\n\t factory = factory || this._settings.factory;\r\n\t state = copy(state);\r\n\t this._silent = true;\r\n\t var ids = {};\r\n\r\n\t for (var i = 0; i < state.length; i++) {\r\n\t var conf = state[i];\r\n\t var view = $$(conf.id);\r\n\t var id;\r\n\r\n\t if (view) {\r\n\t exports.extend(view.config, conf, true);\r\n\t id = view.config.id;\r\n\t } else {\r\n\t view = factory.call(this, conf);\r\n\t id = this.addView(view);\r\n\t }\r\n\r\n\t ids[id] = 1;\r\n\t }\r\n\r\n\t for (var _i3 = this._cells.length - 1; _i3 >= 0; _i3--) {\r\n\t if (!ids[this._cells[_i3].config.id]) {\r\n\t this._cells[_i3].destructor();\r\n\r\n\t this._cells.splice(_i3, 1);\r\n\t }\r\n\t }\r\n\r\n\t this._apply_new_grid();\r\n\r\n\t this._silent = false;\r\n\t },\r\n\t $getSize: function $getSize() {\r\n\t var self_size = baseview.api.$getSize.call(this, 0, 0);\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t this._cells[i].$getSize(0, 0);\r\n\t }\r\n\r\n\t var width = this._settings.cellWidth;\r\n\t var height = this._settings.cellHeight;\r\n\r\n\t var box = this._getActualSize(0, 0, this._settings.gridColumns, this._actual_rows);\r\n\r\n\t if (width) self_size[0] = box.dx + box.x * 2;\r\n\t if (height) self_size[2] = box.dy + box.y * 2;\r\n\t return self_size;\r\n\t },\r\n\t _getActualSize: function _getActualSize(x, y, w, h) {\r\n\t var margin = this._settings.margin;\r\n\t var paddingX = this._settings.paddingX || this._settings.padding;\r\n\t var paddingY = this._settings.paddingY || this._settings.padding;\r\n\t var dx = this._settings.cellWidth;\r\n\t if (!dx) dx = (this.$width - 2 * paddingX + margin) / this._settings.gridColumns - margin;\r\n\t var dy = this._settings.cellHeight;\r\n\t if (!dy) dy = (this.$height - 2 * paddingY + margin) / this._actual_rows - margin;\r\n\t var left = paddingX + (dx + margin) * x;\r\n\t var top = paddingY + (dy + margin) * y;\r\n\t var width = Math.ceil(dx + (dx + margin) * (w - 1));\r\n\t var height = Math.ceil(dy + (dy + margin) * (h - 1));\r\n\t return {\r\n\t x: left,\r\n\t y: top,\r\n\t dx: width,\r\n\t dy: height\r\n\t };\r\n\t },\r\n\t _set_child_size: function _set_child_size() {\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t var view = this._cells[i];\r\n\t var conf = view._settings;\r\n\r\n\t var size = this._getActualSize(conf.x, conf.y, conf.dx, conf.dy);\r\n\r\n\t view.$getSize(0, 0); //need to be called before $setSize\r\n\r\n\t view.$setSize(size.dx, size.dy);\r\n\t var node = view.$view;\r\n\t node.style.left = size.x + \"px\";\r\n\t node.style.top = size.y + \"px\";\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$n = exports.protoUI(api$n, abslayout.view);\r\n\tvar gridlayout = {\r\n\t api: api$n,\r\n\t view: view$n\r\n\t};\r\n\r\n\tvar api$o = {\r\n\t name: \"dashboard\",\r\n\t $init: function $init() {\r\n\t DragControl.addDrag(this.$view, this);\r\n\t DragControl.addDrop(this.$view, this, true);\r\n\t },\r\n\t _isDragNode: function _isDragNode(target) {\r\n\t if (!target.getAttribute || target.getAttribute(\"webix_disable_drag\") || target.getAttribute(\"webixignore\")) return false;\r\n\t var css = (target.className || \"\").toString();\r\n\t if (css.indexOf(\"panel_drag\") != -1) return target;\r\n\t if (target.parentNode && target != this.$view) return this._isDragNode(target.parentNode);\r\n\t return false;\r\n\t },\r\n\t $dragCreate: function $dragCreate(object, e) {\r\n\t if (!e.target) return;\r\n\t if (!this._isDragNode(e.target)) return false; // ok, it seem the dnd need to be started\r\n\r\n\t var sview = $$(e);\r\n\t if (!sview.$resizeMove) sview = sview.queryView(function (a) {\r\n\t return !!a.config.dx;\r\n\t }, \"parent\");\r\n\t var box = offset(this.$view);\r\n\t var pos$$1 = pos(e);\r\n\t DragControl._drag_context = {\r\n\t source: sview,\r\n\t from: this,\r\n\t dashboard: {\r\n\t sx: pos$$1.x - box.x - parseInt(sview.$view.style.left) + this._settings.margin / 2,\r\n\t sy: pos$$1.y - box.y - parseInt(sview.$view.style.top) + this._settings.margin / 2\r\n\t }\r\n\t };\r\n\r\n\t this._addDragMarker(sview._settings.dx, sview._settings.dy);\r\n\r\n\t return sview.$view;\r\n\t },\r\n\t _addDragMarker: function _addDragMarker(x, y) {\r\n\t var drag = this._dragMarker = create(\"div\", {\r\n\t \"class\": \"panel_target\"\r\n\t });\r\n\r\n\t var size = this._getActualSize(0, 0, x, y);\r\n\r\n\t drag.style.width = size.dx + \"px\";\r\n\t drag.style.height = size.dy + \"px\";\r\n\t this.$view.appendChild(this._dragMarker);\r\n\t },\r\n\t $drop: function $drop() {\r\n\t var context = DragControl._drag_context;\r\n\t var obj = {\r\n\t x: context.dashboard.x,\r\n\t y: context.dashboard.y\r\n\t };\r\n\r\n\t if (context.from === this) {\r\n\t var conf = context.source.config;\r\n\t this.moveView(conf.id, obj);\r\n\t } else {\r\n\t obj.name = context.source[0];\r\n\t obj.dx = context.dashboard.dx;\r\n\t obj.dy = context.dashboard.dy;\r\n\t obj.id = obj.name + \":\" + uid();\r\n\t obj = this._settings.factory.call(this, obj);\r\n\t this.addView(obj);\r\n\t }\r\n\t },\r\n\t $dragDestroy: function $dragDestroy(target, html) {\r\n\t html.style.zIndex = 1;\r\n\t remove(this._dragMarker);\r\n\t this._dragMarker = null;\r\n\r\n\t this._apply_new_grid();\r\n\t },\r\n\t _getPosFromCoords: function _getPosFromCoords(x, y) {\r\n\t var margin = this._settings.margin;\r\n\t var paddingX = this._settings.paddingX || this._settings.padding;\r\n\t var paddingY = this._settings.paddingY || this._settings.padding;\r\n\t var dx = this._settings.cellWidth;\r\n\t if (!dx) dx = (this.$width - 2 * paddingX + margin) / this._settings.gridColumns - margin;\r\n\t var dy = this._settings.cellHeight;\r\n\t if (!dy) dy = (this.$height - 2 * paddingY + margin) / this._actual_rows - margin;\r\n\t x = Math.round(-0.2 + (x - paddingX) / (dx + margin / 2));\r\n\t y = Math.round(-0.2 + (y - paddingX) / (dy + margin / 2));\r\n\t x = Math.max(0, Math.min(x, this._settings.gridColumns));\r\n\t y = Math.max(0, Math.min(y, this._actual_rows));\r\n\t return {\r\n\t x: x,\r\n\t y: y,\r\n\t width: dx,\r\n\t height: dy,\r\n\t margin: margin,\r\n\t rx: x * dx + margin * x + paddingX,\r\n\t ry: y * dy + margin * y + paddingY\r\n\t };\r\n\t },\r\n\t $dragOut: function $dragOut() {\r\n\t var context = DragControl._drag_context;\r\n\r\n\t if (this._dragMarker && context.external) {\r\n\t remove(this._dragMarker);\r\n\t this._dragMarker = null;\r\n\t }\r\n\t },\r\n\t $dragIn: function $dragIn(to, from, e) {\r\n\t var context = DragControl._drag_context;\r\n\r\n\t if (!this._dragMarker) {\r\n\t context.external = true;\r\n\t var item = context.from.getItem(context.source);\r\n\t context.dashboard = {\r\n\t dx: item.dx,\r\n\t dy: item.dy\r\n\t };\r\n\r\n\t this._addDragMarker(item.dx, item.dy);\r\n\t }\r\n\r\n\t if (context.external) {\r\n\t var drag = this._dragMarker;\r\n\t var evObj = env.mouse.context(e);\r\n\t var box = offset(this.$view);\r\n\r\n\t var inpos = this._getPosFromCoords(evObj.x - box.x, evObj.y - box.y);\r\n\r\n\t exports.extend(context.dashboard, inpos, true);\r\n\t drag.style.left = inpos.rx + \"px\";\r\n\t drag.style.top = inpos.ry + \"px\";\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t $dragPos: function $dragPos(pos$$1, e, html) {\r\n\t var context = DragControl._drag_context;\r\n\t html.style.left = \"-10000px\";\r\n\t var evObj = env.mouse.context(e);\r\n\t var box = offset(this.$view);\r\n\t var dash = context.dashboard;\r\n\r\n\t var inpos = this._getPosFromCoords(evObj.x - box.x - dash.sx, evObj.y - box.y - dash.sy);\r\n\r\n\t pos$$1.x = evObj.x - dash.sx - box.x;\r\n\t pos$$1.y = evObj.y - dash.sy - box.y; //drag marker\r\n\r\n\t var drag = this._dragMarker;\r\n\t drag.style.left = inpos.rx + \"px\";\r\n\t drag.style.top = inpos.ry + \"px\";\r\n\t exports.extend(dash, inpos, true);\r\n\t }\r\n\t};\r\n\tvar view$o = exports.protoUI(api$o, gridlayout.view);\r\n\r\n\tvar api$p = {\r\n\t name: \"panel\",\r\n\t $init: function $init(config) {\r\n\t if (config.header && config.body) {\r\n\t var header = config.header;\r\n\t if (_typeof(header) !== \"object\") header = {\r\n\t template: config.header,\r\n\t type: \"header\",\r\n\t css: \"webix_header\"\r\n\t };\r\n\t config.body = [header, config.body];\r\n\t }\r\n\r\n\t addCss(this.$view, \"panel_drag_view\");\r\n\t this.$ready.push(this._init_drag_area);\r\n\t },\r\n\t _init_drag_area: function _init_drag_area() {\r\n\t var childs = this.getChildViews();\r\n\t var parent = childs.length === 1 ? this : childs[1];\r\n\r\n\t if (this._settings.icon) {\r\n\t var drag = create(\"div\", {\r\n\t \"class\": \"panel_icon\"\r\n\t }, \"\");\r\n\t if (parent != this) parent.$view.style.position = \"relative\";\r\n\t parent.$view.appendChild(drag);\r\n\t }\r\n\t },\r\n\t body_setter: function body_setter(value) {\r\n\t return this.rows_setter(isArray(value) ? value : [value]);\r\n\t },\r\n\t $resizeEnd: function $resizeEnd(pos$$1) {\r\n\t var parent = this.getParentView();\r\n\r\n\t if (parent && parent._getPosFromCoords) {\r\n\t var end = parent._getPosFromCoords(pos$$1.x, pos$$1.y);\r\n\r\n\t var dx = Math.max(end.x, 1);\r\n\t var dy = Math.max(end.y, 1);\r\n\t parent.moveView(this._settings.id, {\r\n\t dx: dx,\r\n\t dy: dy\r\n\t });\r\n\t }\r\n\t },\r\n\t $resizeMove: function $resizeMove(pos$$1) {\r\n\t var parent = this.getParentView();\r\n\r\n\t if (parent && parent._getPosFromCoords) {\r\n\t var fx = parent._getPosFromCoords(pos$$1.x, pos$$1.y);\r\n\r\n\t pos$$1.x = fx.width * fx.x + fx.margin * (fx.x - 1);\r\n\t pos$$1.y = fx.height * fx.y + fx.margin * (fx.y - 1);\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$p = exports.protoUI(api$p, layout.view, ResizeArea);\r\n\r\n\tvar api$q = {\r\n\t $init: function $init() {\r\n\t exports.extend(this, FlexLayout, true);\r\n\t },\r\n\t name: \"flexlayout\"\r\n\t};\r\n\tvar view$q = exports.protoUI(api$q, layout.view);\r\n\r\n\tvar api$r = {\r\n\t name: \"datalayout\",\r\n\t $init: function $init() {\r\n\t this.data.provideApi(this, true);\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(this.render, this));\r\n\t },\r\n\t _parse_cells: function _parse_cells() {\r\n\t if (!this._origin_cells) {\r\n\t this._origin_cells = this._collection;\r\n\t this._collection = [{}];\r\n\t }\r\n\r\n\t return layout.api._parse_cells.call(this, this._collection);\r\n\t },\r\n\t setValue: function setValue(obj) {\r\n\t this.parse(obj);\r\n\t },\r\n\t getValue: function getValue() {\r\n\t var subcount = this._origin_cells.length;\r\n\r\n\t for (var i = 0; i < this._cells.length; i++) {\r\n\t var id = this.data.order[Math.floor(i / subcount)];\r\n\t var item = this.data.getItem(id);\r\n\r\n\t this._save_data(this._cells[i], item);\r\n\t }\r\n\r\n\t return this.data.serialize();\r\n\t },\r\n\t _save_data: function _save_data(view, prop) {\r\n\t var name = view._settings.name;\r\n\r\n\t if (name) {\r\n\t var data = null;\r\n\t if (view.getValues) data = view.getValues();else if (view.getValue) data = view.getValue();else if (view.serialize) data = view.serialize();\r\n\t if (name == \"$value\") exports.extend(prop, data, true);else prop[name] = data;\r\n\t } else {\r\n\t var collection = view._cells;\r\n\t if (collection) for (var i = 0; i < collection.length; i++) {\r\n\t this._save_data(collection[i], prop);\r\n\t }\r\n\t }\r\n\t },\r\n\t _fill_data: function _fill_data(view, prop) {\r\n\t var obj,\r\n\t name = view._settings.name;\r\n\r\n\t if (name) {\r\n\t if (name == \"$value\") obj = prop;else obj = prop[name];\r\n\t if (view.setValues) view.setValues(obj);else if (view.setValue) view.setValue(obj);else if (view.parse) {\r\n\t //make copy of data for treestore parsers\r\n\t if (view.openAll) obj = copy(obj);\r\n\t view.parse(obj);\r\n\t }\r\n\t } else {\r\n\t var collection = view._cells;\r\n\t if (collection) for (var i = 0; i < collection.length; i++) {\r\n\t this._fill_data(collection[i], prop);\r\n\t }\r\n\t }\r\n\t },\r\n\t render: function render(id, obj, mode) {\r\n\t var subcount = this._origin_cells.length;\r\n\r\n\t if (id && mode === \"update\") {\r\n\t //update mode, change only part of layout\r\n\t var item = this.getItem(id);\r\n\t var index = this.getIndexById(id);\r\n\r\n\t for (var i = 0; i < subcount; i++) {\r\n\t this._fill_data(this._cells[index * subcount + i], item);\r\n\t }\r\n\r\n\t return;\r\n\t } //full repainting\r\n\r\n\r\n\t var cells = this._collection = [];\r\n\t var order = this.data.order;\r\n\r\n\t for (var _i = 0; _i < order.length; _i++) {\r\n\t if (subcount) for (var j = 0; j < subcount; j++) {\r\n\t cells.push(copy(this._origin_cells[j]));\r\n\t } else cells.push(this.getItem(order[_i]));\r\n\t }\r\n\r\n\t if (!cells.length) cells.push({});\r\n\t this.reconstruct();\r\n\t if (subcount) for (var _i2 = 0; _i2 < order.length; _i2++) {\r\n\t var prop = this.getItem(order[_i2]);\r\n\r\n\t for (var _j = 0; _j < subcount; _j++) {\r\n\t var view = this._cells[_i2 * subcount + _j];\r\n\r\n\t this._fill_data(view, prop);\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$r = exports.protoUI(api$r, DataLoader, layout.view);\r\n\tvar datalayout = {\r\n\t api: api$r,\r\n\t view: view$r\r\n\t};\r\n\r\n\tvar api$s = {\r\n\t $init: function $init() {\r\n\t exports.extend(this, FlexLayout, true);\r\n\t },\r\n\t name: \"flexdatalayout\"\r\n\t};\r\n\tvar view$s = exports.protoUI(api$s, datalayout.view);\r\n\r\n\tvar api$t = {\r\n\t name: \"popup\",\r\n\t $init: function $init() {\r\n\t this._settings.head = false;\r\n\t this.$view.className += \" webix_popup\";\r\n\t attachEvent(\"onClick\", bind(this._hide, this));\r\n\t this.attachEvent(\"onHide\", this._hide_point);\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.headHeight = $active.barHeight;\r\n\t this.defaults.padding = $active.popupPadding;\r\n\t this.defaults.point = !$active.popupNoPoint;\r\n\t this.defaults.borderless = $active.borderlessPopup;\r\n\t },\r\n\t close: function close() {\r\n\t remove(this._point_element);\r\n\t window$1.api.close.call(this);\r\n\t },\r\n\t $getSize: function $getSize(x, y) {\r\n\t return window$1.api.$getSize.call(this, x + this._settings.padding * 2, y + this._settings.padding * 2);\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t base.api.$setSize.call(this, x, y);\r\n\t x = this._content_width - this._settings.padding * 2;\r\n\t y = this._content_height - this._settings.padding * 2;\r\n\t this._contentobj.style.padding = this._settings.padding + \"px\";\r\n\t this._headobj.style.display = \"none\";\r\n\r\n\t this._body_cell.$setSize(x, y);\r\n\t },\r\n\t //redefine to preserve inner borders\r\n\t //_inner_body_set:function(){}, //same as win?\r\n\t _inner_body_set: function _inner_body_set(value) {\r\n\t if (typeof value.borderless == \"undefined\") value.borderless = false;\r\n\t },\r\n\t head_setter: function head_setter() {},\r\n\t _set_point: function _set_point(mode, left, top, fixed) {\r\n\t this._hide_point();\r\n\r\n\t document.body.appendChild(this._point_element = create(\"DIV\", {\r\n\t \"class\": \"webix_point_\" + mode\r\n\t }, \"\"));\r\n\t this._point_element.style.zIndex = zIndex();\r\n\t this._point_element.style.position = fixed ? \"fixed\" : \"absolute\";\r\n\t this._point_element.style.top = top + \"px\";\r\n\t this._point_element.style.left = left + \"px\";\r\n\t },\r\n\t _hide_point: function _hide_point() {\r\n\t this._point_element = remove(this._point_element);\r\n\t }\r\n\t};\r\n\tvar view$t = exports.protoUI(api$t, window$1.view);\r\n\tvar popup = {\r\n\t api: api$t,\r\n\t view: view$t\r\n\t};\r\n\r\n\tvar api$u = {\r\n\t name: \"toolbar\",\r\n\t defaults: {\r\n\t type: \"toolbar\"\r\n\t },\r\n\t _render_borders: true,\r\n\t _form_classname: \"webix_toolbar\",\r\n\t _form_vertical: false,\r\n\t $init: function $init(config) {\r\n\t if (!config.borderless) {\r\n\t this._contentobj.style.borderWidth = \"1px\";\r\n\t this._settings._inner = {\r\n\t top: false,\r\n\t left: false,\r\n\t right: false,\r\n\t bottom: false\r\n\t };\r\n\t }\r\n\r\n\t this._contentobj.className += \" \" + this._form_classname;\r\n\r\n\t this._viewobj.setAttribute(\"role\", \"toolbar\");\r\n\t },\r\n\t _recollect_elements: function _recollect_elements() {\r\n\t var form = this;\r\n\t form.elements = {};\r\n\t each(this, function (view) {\r\n\t if (view._settings.name && view.getValue && view.setValue) {\r\n\t form.elements[view._settings.name] = view;\r\n\t if (view.mapEvent) view.mapEvent({\r\n\t onbeforetabclick: form,\r\n\t onaftertabclick: form,\r\n\t onitemclick: form,\r\n\t onchange: form\r\n\t });\r\n\t }\r\n\r\n\t if (view.setValues) return false;\r\n\t });\r\n\t var old = this._values;\r\n\t this.setDirty(false);\r\n\r\n\t if (old) {\r\n\t //restore dirty state after form reconstructing\r\n\t var now = this._values;\r\n\r\n\t for (var key in form.elements) {\r\n\t if (old[key] && now[key] != old[key]) {\r\n\t now[key] = old[key];\r\n\t this.setDirty(true);\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _parse_cells_ext_end: function _parse_cells_ext_end() {\r\n\t this._recollect_elements();\r\n\t },\r\n\t _parse_cells_ext: function _parse_cells_ext(collection) {\r\n\t var config = this._settings;\r\n\r\n\t if (config.elements && !collection) {\r\n\t this._collection = collection = config.elements;\r\n\t this._vertical_orientation = this._form_vertical;\r\n\t delete config.elements;\r\n\t }\r\n\r\n\t if (this._settings.elementsConfig) this._rec_apply_settings(this._collection, config.elementsConfig);\r\n\t return collection;\r\n\t },\r\n\t _rec_apply_settings: function _rec_apply_settings(col, settings) {\r\n\t for (var i = 0; i < col.length; i++) {\r\n\t var element = col[i];\r\n\t exports.extend(element, settings);\r\n\t var nextsettings = settings;\r\n\t if (element.elementsConfig) nextsettings = exports.extend(exports.extend({}, element.elementsConfig), settings);\r\n\t var sub;\r\n\t if (element.body) sub = [element.body];else sub = element.rows || element.cols || element.cells || element.body;\r\n\t if (sub) this._rec_apply_settings(sub, nextsettings);\r\n\t }\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var sizes = layout.api.$getSize.call(this, dx, dy);\r\n\t var parent = this.getParentView();\r\n\t var index = this._vertical_orientation ? 3 : 1;\r\n\t if (parent && this._vertical_orientation != parent._vertical_orientation) sizes[index] += 100000;\r\n\t debug_size_box(this, sizes, true);\r\n\t return sizes;\r\n\t },\r\n\t render: function render() {},\r\n\t refresh: function refresh() {\r\n\t this.render();\r\n\t }\r\n\t};\r\n\tvar view$u = exports.protoUI(api$u, Scrollable, AtomDataLoader, Values, layout.view, ValidateData);\r\n\tvar toolbar = {\r\n\t api: api$u,\r\n\t view: view$u\r\n\t};\r\n\r\n\tvar api$v = {\r\n\t name: \"form\",\r\n\t defaults: {\r\n\t type: \"form\",\r\n\t autoheight: true\r\n\t },\r\n\t _default_height: -1,\r\n\t _form_classname: \"webix_form\",\r\n\t _form_vertical: true,\r\n\t $init: function $init() {\r\n\t this._viewobj.setAttribute(\"role\", \"form\");\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t if (this._scroll_y && !this._settings.width) dx += env.scrollSize;\r\n\t var sizes = layout.api.$getSize.call(this, dx, dy);\r\n\r\n\t if (this._settings.scroll || !this._settings.autoheight) {\r\n\t sizes[2] = this._settings.height || this._settings.minHeight || 0;\r\n\t sizes[3] += 100000;\r\n\t }\r\n\r\n\t return sizes;\r\n\t }\r\n\t};\r\n\tvar view$v = exports.protoUI(api$v, toolbar.view);\r\n\r\n\tvar api$w = {\r\n\t name: \"fieldset\",\r\n\t defaults: {\r\n\t borderless: true,\r\n\t $cssName: \"webix_fieldset\",\r\n\t paddingX: 18,\r\n\t paddingY: 30\r\n\t },\r\n\t $init: function $init(obj) {\r\n\t assert(obj.body, \"fieldset must have not-empty body\");\r\n\t this._viewobj.className += \" \" + this.defaults.$cssName;\r\n\t this._viewobj.innerHTML = \"
\";\r\n\t },\r\n\t label_setter: function label_setter(value) {\r\n\t this._viewobj.firstChild.childNodes[0].innerHTML = value;\r\n\t return value;\r\n\t },\r\n\t getChildViews: function getChildViews() {\r\n\t return [this._body_view];\r\n\t },\r\n\t body_setter: function body_setter(config) {\r\n\t state._parent_cell = this;\r\n\t this._body_view = ui(config, this._viewobj.firstChild.childNodes[1]);\r\n\t return config;\r\n\t },\r\n\t getBody: function getBody() {\r\n\t return this._body_view;\r\n\t },\r\n\t resizeChildren: function resizeChildren() {\r\n\t if (!this._body_view) return;\r\n\t var x = this.$width - this._settings.paddingX;\r\n\t var y = this.$height - this._settings.paddingY;\r\n\r\n\t var sizes = this._body_view.$getSize(0, 0); //minWidth\r\n\r\n\r\n\t if (sizes[0] > x) x = sizes[0]; //minHeight\r\n\r\n\t if (sizes[2] > y) y = sizes[2];\r\n\r\n\t this._body_view.$setSize(x, y);\r\n\r\n\t this.resize();\r\n\t },\r\n\t $getSize: function $getSize(x, y) {\r\n\t debug_size_box_start(this, true);\r\n\t x += this._settings.paddingX;\r\n\t y += this._settings.paddingY;\r\n\r\n\t var t = this._body_view.$getSize(x, y);\r\n\r\n\t var s = this._last_body_size = base.api.$getSize.call(this, x, y); //inner content minWidth > outer\r\n\r\n\t if (s[0] < t[0]) s[0] = t[0];\r\n\t if (s[2] < t[2]) s[2] = t[2]; //inner content maxWidth < outer\r\n\r\n\t if (s[1] > t[1]) s[1] = t[1];\r\n\t if (s[3] > t[3]) s[3] = t[3]; //make max size not less than min size\r\n\r\n\t if (s[1] < s[0]) s[1] = s[0];\r\n\t if (s[3] < s[2]) s[3] = s[2];\r\n\t debug_size_box_end(this, s);\r\n\t return s;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t x = Math.min(this._last_body_size[1], x);\r\n\t y = Math.min(this._last_body_size[3], y);\r\n\r\n\t this._body_view.$setSize(x - this._settings.paddingX, y - this._settings.paddingY);\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$w = exports.protoUI(api$w, base.view);\r\n\tvar fieldset = {\r\n\t api: api$w,\r\n\t view: view$w\r\n\t};\r\n\r\n\tvar api$x = {\r\n\t name: \"forminput\",\r\n\t defaults: {\r\n\t $cssName: \"webix_forminput\",\r\n\t labelWidth: 80,\r\n\t labelAlign: \"left\",\r\n\t // remove fieldset sizing\r\n\t paddingY: 0,\r\n\t paddingX: 0\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t if (this._body_view.setValue) this._body_view.setValue(value);else if (this._body_view.setValues) this._body_view.setValues(value);\r\n\t },\r\n\t focus: function focus() {\r\n\t if (this._body_view.focus) this._body_view.focus();\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t if (this._body_view.getValue) return this._body_view.getValue();else if (this._body_view.getValues) return this._body_view.getValues();\r\n\t },\r\n\t value_setter: function value_setter(value) {\r\n\t this.setValue(value);\r\n\t },\r\n\t getBody: function getBody() {\r\n\t return this._body_view;\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this._inputPadding = $active.inputPadding;\r\n\t this._inputSpacing = $active.inputSpacing;\r\n\t },\r\n\t $init: function $init(obj) {\r\n\t this.$ready.push(function () {\r\n\t var label = this._viewobj.firstChild.childNodes[0];\r\n\t label.style.width = this._settings.paddingX + \"px\";\r\n\t label.style.textAlign = this._settings.labelAlign;\r\n\t if (!this._settings.labelWidth) label.style.display = \"none\";\r\n\t });\r\n\t var lw = isUndefined(obj.labelWidth) ? this.defaults.labelWidth : obj.labelWidth;\r\n\t obj.paddingX = lw - this._inputPadding * 2 + this._inputSpacing * 2;\r\n\t },\r\n\t setBottomText: function setBottomText(text) {\r\n\t var config = this._settings;\r\n\r\n\t if (typeof text != \"undefined\") {\r\n\t if (config.bottomLabel == text) return;\r\n\t config.bottomLabel = text;\r\n\t }\r\n\r\n\t var message = (config.invalid ? config.invalidMessage : \"\") || config.bottomLabel;\r\n\r\n\t if (this._invalidMessage) {\r\n\t remove(this._invalidMessage);\r\n\t }\r\n\r\n\t if (message) {\r\n\t this.$view.style.position = \"relative\";\r\n\t this._invalidMessage = create(\"div\", {\r\n\t \"class\": \"webix_inp_bottom_label\",\r\n\t role: config.invalid ? \"alert\" : \"\",\r\n\t \"aria-relevant\": \"all\",\r\n\t style: \"position:absolute; bottom:0px; padding:2px; background: white; left:\" + this._settings.labelWidth + \"px; \"\r\n\t }, message);\r\n\r\n\t this._viewobj.appendChild(this._invalidMessage);\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$x = exports.protoUI(api$x, fieldset.view);\r\n\r\n\tfunction _tagname(el) {\r\n\t if (!el.tagName) return null;\r\n\t return el.tagName.toLowerCase();\r\n\t}\r\n\r\n\tfunction _attribute(el, name) {\r\n\t if (!el.getAttribute) return null;\r\n\t var attr = el.getAttribute(name);\r\n\t return attr ? attr.toLowerCase() : null;\r\n\t}\r\n\r\n\tfunction _get_html_value() {\r\n\t var tagname = _tagname(this);\r\n\r\n\t if (_get_value[tagname]) return _get_value[tagname](this);\r\n\t return _get_value.other(this);\r\n\t}\r\n\r\n\tvar _get_value = {\r\n\t radio: function radio(el) {\r\n\t for (var i = 0; i < el.length; i++) {\r\n\t if (el[i].checked) return el[i].value;\r\n\t }\r\n\r\n\t return \"\";\r\n\t },\r\n\t input: function input(el) {\r\n\t var type = _attribute(el, \"type\");\r\n\r\n\t if (type === \"checkbox\") return el.checked;\r\n\t return el.value;\r\n\t },\r\n\t textarea: function textarea(el) {\r\n\t return el.value;\r\n\t },\r\n\t select: function select(el) {\r\n\t var index$$1 = el.selectedIndex;\r\n\t return el.options[index$$1].value;\r\n\t },\r\n\t other: function other(el) {\r\n\t return el.innerHTML;\r\n\t }\r\n\t};\r\n\r\n\tfunction _set_html_value(value) {\r\n\t var tagname = _tagname(this);\r\n\r\n\t if (_set_value[tagname]) return _set_value[tagname](this, value);\r\n\t return _set_value.other(this, value);\r\n\t}\r\n\r\n\tvar _set_value = {\r\n\t radio: function radio(el, value) {\r\n\t for (var i = 0; i < el.length; i++) {\r\n\t el[i].checked = el[i].value == value;\r\n\t }\r\n\t },\r\n\t input: function input(el, value) {\r\n\t var type = _attribute(el, \"type\");\r\n\r\n\t if (type === \"checkbox\") el.checked = value ? true : false;else el.value = value;\r\n\t },\r\n\t textarea: function textarea(el, value) {\r\n\t el.value = value;\r\n\t },\r\n\t select: function select(el, value) {\r\n\t //select first option if no provided and if possible\r\n\t el.value = value ? value : el.firstElementChild.value || value;\r\n\t },\r\n\t other: function other(el, value) {\r\n\t el.innerHTML = value;\r\n\t }\r\n\t};\r\n\tvar api$y = {\r\n\t name: \"htmlform\",\r\n\t $init: function $init(config) {\r\n\t this.elements = {};\r\n\t this._default_values = false;\r\n\t if (config.content && (config.container == config.content || !config.container && config.content == document.body)) this._copy_inner_content = true;\r\n\t },\r\n\t content_setter: function content_setter(content) {\r\n\t content = toNode(content);\r\n\r\n\t if (this._copy_inner_content) {\r\n\t while (content.childNodes.length > 1) {\r\n\t this._viewobj.childNodes[0].appendChild(content.childNodes[0]);\r\n\t }\r\n\t } else {\r\n\t this._viewobj.childNodes[0].appendChild(content);\r\n\t }\r\n\r\n\t this._parse_inputs();\r\n\r\n\t return true;\r\n\t },\r\n\t render: function render() {\r\n\t template$1.api.render.apply(this, arguments);\r\n\r\n\t this._parse_inputs();\r\n\t },\r\n\t _parse_inputs: function _parse_inputs() {\r\n\t var inputs = this._viewobj.querySelectorAll(\"[name]\");\r\n\r\n\t this.elements = {};\r\n\r\n\t for (var i = 0; i < inputs.length; i++) {\r\n\t var el = inputs[i];\r\n\r\n\t var name = _attribute(el, \"name\");\r\n\r\n\t if (name) {\r\n\t var tag = _tagname(el) === \"button\";\r\n\r\n\t var type = _attribute(el, \"type\");\r\n\r\n\t var cant_clear = tag || type === \"button\" || type === \"submit\";\r\n\r\n\t if (type === \"radio\") {\r\n\t var stack = this.elements[name] || [];\r\n\t stack.tagName = \"radio\";\r\n\t stack.push(el);\r\n\t el = stack;\r\n\t }\r\n\r\n\t this.elements[name] = el;\r\n\t el.getValue = _get_html_value;\r\n\t el.setValue = _set_html_value;\r\n\t el.$allowsClear = !cant_clear;\r\n\t }\r\n\t }\r\n\r\n\t return this.elements;\r\n\t },\r\n\t _mark_invalid: function _mark_invalid(id, obj) {\r\n\t this._clear_invalid(id, obj);\r\n\r\n\t var el = this._viewobj.querySelector(\"[name=\\\"\" + id + \"\\\"]\");\r\n\r\n\t if (el) addCss(el, \"invalid\");\r\n\t },\r\n\t _clear_invalid: function _clear_invalid(id) {\r\n\t var el = this._viewobj.querySelector(\"[name=\\\"\" + id + \"\\\"]\");\r\n\r\n\t if (el) removeCss(el, \"invalid\");\r\n\t }\r\n\t};\r\n\tvar view$y = exports.protoUI(api$y, template$1.view, Values);\r\n\r\n\tvar api$z = {\r\n\t name: \"property\",\r\n\t $init: function $init() {\r\n\t this._contentobj.className += \" webix_property\";\r\n\r\n\t this._contentobj.setAttribute(\"role\", \"listbox\");\r\n\r\n\t this._destroy_with_me = [];\r\n\t this.attachEvent(\"onAfterEditStart\", function (id) {\r\n\t var node = this.getItemNode(id);\r\n\t addCss(node, \"webix_focused\");\r\n\t });\r\n\t this.attachEvent(\"onAfterEditStop\", function (id, editor) {\r\n\t var node = this.getItemNode(editor.config.id);\r\n\t removeCss(node, \"webix_focused\");\r\n\t });\r\n\t },\r\n\t defaults: {\r\n\t nameWidth: 100,\r\n\t editable: true\r\n\t },\r\n\t on_render: {\r\n\t checkbox: function checkbox(value) {\r\n\t return \"\";\r\n\t },\r\n\t color: function color(value) {\r\n\t return \"
\" + value + \"
\";\r\n\t }\r\n\t },\r\n\t on_edit: {\r\n\t label: false\r\n\t },\r\n\t _id: \"webix_f_id\",\r\n\t on_click: {\r\n\t webix_property_check: function webix_property_check(ev) {\r\n\t var id = this.locate(ev);\r\n\t this.getItem(id).value = !this.getItem(id).value;\r\n\t this.callEvent(\"onCheck\", [id, this.getItem(id).value]);\r\n\t return false;\r\n\t }\r\n\t },\r\n\t on_dblclick: {},\r\n\t registerType: function registerType(name, data) {\r\n\t if (data.template) this.on_render[name] = data.template;\r\n\t if (data.editor) this.on_edit[name] = data.editor;\r\n\t if (data.click) for (var key in data.click) {\r\n\t this.on_click[key] = data.click[key];\r\n\t }\r\n\t },\r\n\t elements_setter: function elements_setter(data) {\r\n\t this._idToLine = {};\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t var line = data[i];\r\n\t if (line.type == \"multiselect\") line.optionslist = true; //line.type \t= \tline.type||\"label\";\r\n\r\n\t line.id = line.id || uid();\r\n\t line.label = line.label || \"\";\r\n\t line.value = line.value || \"\";\r\n\t this._idToLine[line.id] = i;\r\n\t this.template = this._map_options(data[i]);\r\n\t }\r\n\r\n\t return data;\r\n\t },\r\n\t showItem: function showItem(id) {\r\n\t RenderStack.showItem.call(this, id);\r\n\t },\r\n\t locate: function locate$$1() {\r\n\t return locate(arguments[0], this._id);\r\n\t },\r\n\t getItemNode: function getItemNode(id) {\r\n\t return this._dataobj.childNodes[this._idToLine[id]];\r\n\t },\r\n\t getItem: function getItem(id) {\r\n\t return this._settings.elements[this._idToLine[id]];\r\n\t },\r\n\t _get_editor_type: function _get_editor_type(id) {\r\n\t var type = this.getItem(id).type;\r\n\t if (type == \"checkbox\") return \"inline-checkbox\";\r\n\t var alter_type = this.on_edit[type];\r\n\t return alter_type === false ? false : alter_type || type;\r\n\t },\r\n\t _get_edit_config: function _get_edit_config(id) {\r\n\t return this.getItem(id);\r\n\t },\r\n\t _find_cell_next: function _find_cell_next(start, check, direction) {\r\n\t var row = this._idToLine[start.id];\r\n\t var order = this._settings.elements;\r\n\r\n\t if (direction) {\r\n\t for (var i = row + 1; i < order.length; i++) {\r\n\t if (check.call(this, order[i].id)) return order[i].id;\r\n\t }\r\n\t } else {\r\n\t for (var _i = row - 1; _i >= 0; _i--) {\r\n\t if (check.call(this, order[_i].id)) return order[_i].id;\r\n\t }\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t updateItem: function updateItem(key, data) {\r\n\t data = data || {};\r\n\t var line = this.getItem(key);\r\n\t if (line) exports.extend(line, data, true);\r\n\t this.refresh();\r\n\t },\r\n\t _cellPosition: function _cellPosition(id) {\r\n\t var html = this.getItemNode(id);\r\n\t return {\r\n\t left: html.offsetLeft + this._settings.nameWidth,\r\n\t top: html.offsetTop,\r\n\t height: html.firstChild.offsetHeight,\r\n\t width: this._data_width,\r\n\t parent: this._contentobj\r\n\t };\r\n\t },\r\n\t _clear: function _clear() {\r\n\t var lines = this._settings.elements;\r\n\r\n\t for (var i = 0; i < lines.length; i++) {\r\n\t lines[i].value = \"\";\r\n\t }\r\n\t },\r\n\t clear: function clear() {\r\n\t this._clear();\r\n\r\n\t this._props_dataset = {};\r\n\t this.refresh();\r\n\t },\r\n\t setValues: function setValues(data, update) {\r\n\t if (this._settings.complexData) data = CodeParser.collapseNames(data);\r\n\t if (!update) this._clear();\r\n\r\n\t for (var key in data) {\r\n\t var line = this.getItem(key);\r\n\t if (line) line.value = data[key];\r\n\t }\r\n\r\n\t this._props_dataset = data;\r\n\t this.refresh();\r\n\t },\r\n\t getValues: function getValues() {\r\n\t var data = clone(this._props_dataset || {});\r\n\r\n\t for (var i = 0; i < this._settings.elements.length; i++) {\r\n\t var line = this._settings.elements[i];\r\n\t if (line.type != \"label\") data[line.id] = line.value;\r\n\t }\r\n\r\n\t if (this._settings.complexData) data = CodeParser.expandNames(data);\r\n\t return data;\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this.render();\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t this._data_width = this._content_width - this._settings.nameWidth;\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t if (this._settings.autoheight) {\r\n\t var count = this._settings.elements.length;\r\n\t this._settings.height = Math.max(this.type.height * count, this._settings.minHeight || 0);\r\n\t }\r\n\r\n\t return base.api.$getSize.call(this, dx, dy);\r\n\t },\r\n\t _toHTML: function _toHTML() {\r\n\t var html = [];\r\n\t var els = this._settings.elements;\r\n\t if (els) for (var i = 0; i < els.length; i++) {\r\n\t var data = els[i];\r\n\t if (data.css && _typeof(data.css) == \"object\") data.css = createCss(data.css);\r\n\t var pre = \"
\";\r\n\t if (data.type == \"label\") html[i] = pre + \"
\" + data.label + \"
\";else {\r\n\t var render = this.on_render[data.type],\r\n\t content;\r\n\t var post = \"
\" + data.label + \"
\";\r\n\r\n\t if (data.collection || data.options) {\r\n\t content = data.template(data, data.value);\r\n\t } else if (data.format) content = data.format(data.value);else content = data.value;\r\n\r\n\t if (render) content = render.call(this, data.value, data);\r\n\t html[i] = pre + post + content + \"
\";\r\n\t }\r\n\t }\r\n\t return html.join(\"\");\r\n\t },\r\n\t type: {\r\n\t height: 24,\r\n\t templateStart: template(\"\"),\r\n\t templateEnd: template(\"\")\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.type.height = $active.propertyItemHeight;\r\n\t }\r\n\t};\r\n\tvar view$z = exports.protoUI(api$z, AutoTooltip, EditAbility, MapCollection, MouseEvents, Scrollable, SingleRender, AtomDataLoader, EventSystem, base.view);\r\n\r\n\tvar api$A = {\r\n\t name: \"calendar\",\r\n\t defaults: {\r\n\t date: new Date(),\r\n\t //selected date, not selected by default\r\n\t select: false,\r\n\t navigation: true,\r\n\t monthSelect: true,\r\n\t weekHeader: true,\r\n\t weekNumber: false,\r\n\t skipEmptyWeeks: false,\r\n\t calendarHeader: \"%F %Y\",\r\n\t calendarWeekHeader: \"W#\",\r\n\t //calendarTime: \"%H:%i\",\r\n\t events: wDate.isHoliday,\r\n\t minuteStep: 5,\r\n\t timeIcon: \"wxi-clock\",\r\n\t icons: false,\r\n\t timepickerHeight: 30,\r\n\t headerHeight: 70,\r\n\t dayTemplate: function dayTemplate(d) {\r\n\t return d.getDate();\r\n\t },\r\n\t width: 260,\r\n\t height: 250\r\n\t },\r\n\t dayTemplate_setter: template,\r\n\t calendarHeader_setter: wDate.dateToStr,\r\n\t calendarWeekHeader_setter: wDate.dateToStr,\r\n\t calendarTime_setter: function calendarTime_setter(format) {\r\n\t this._calendarTime = format;\r\n\t return wDate.dateToStr(format);\r\n\t },\r\n\t date_setter: function date_setter(date) {\r\n\t return this._string_to_date(date);\r\n\t },\r\n\t maxDate_setter: function maxDate_setter(date) {\r\n\t return this._string_to_date(date);\r\n\t },\r\n\t minDate_setter: function minDate_setter(date) {\r\n\t return this._string_to_date(date);\r\n\t },\r\n\t minTime_setter: function minTime_setter(time) {\r\n\t if (typeof time == \"string\") {\r\n\t time = i18n.parseTimeFormatDate(time);\r\n\t time = [time.getHours(), time.getMinutes()];\r\n\t }\r\n\r\n\t return time;\r\n\t },\r\n\t maxTime_setter: function maxTime_setter(time) {\r\n\t if (typeof time == \"string\") {\r\n\t time = i18n.parseTimeFormatDate(time);\r\n\t time = [time.getHours(), time.getMinutes()];\r\n\t }\r\n\r\n\t return time;\r\n\t },\r\n\t _ariaFocus: function _ariaFocus() {\r\n\t var ev = \"focus\" + (env.isIE ? \"in\" : \"\");\r\n\r\n\t if (!env.touch) {\r\n\t _event(this.$view, ev, bind(function (e) {\r\n\t var t = e.target.className;\r\n\t var css = t.indexOf(\"webix_cal_day\") !== -1 ? \"webix_cal_day\" : t.indexOf(\"webix_cal_block\") !== -1 ? \"webix_cal_block\" : \"\";\r\n\r\n\t if (new Date() - UIManager._tab_time > 300 && new Date() - UIManager._mouse_time > 100 && css) {\r\n\t var prev = e.relatedTarget;\r\n\r\n\t if (prev && !isUndefined(prev.className)) {\r\n\t var date = css == \"webix_cal_day\" ? this._locate_day(e.target) : this._locate_date(e.target);\r\n\r\n\t this._moveSelection(date);\r\n\t }\r\n\t }\r\n\t }, this), {\r\n\t capture: !env.isIE\r\n\t });\r\n\t }\r\n\t },\r\n\t $init: function $init() {\r\n\t this._viewobj.className += \" webix_calendar\";\r\n\r\n\t this._viewobj.setAttribute(\"role\", \"region\");\r\n\r\n\t this._viewobj.setAttribute(\"aria-label\", i18n.aria.calendar); //special dates\r\n\r\n\r\n\t this._special_dates = {};\r\n\t this._selected_days = {};\r\n\t this._zoom_level = 0; //navigation and aria\r\n\r\n\t this._ariaFocus();\r\n\r\n\t this.attachEvent(\"onKeyPress\", this._onKeyPress);\r\n\t this.attachEvent(\"onAfterZoom\", function (zoom) {\r\n\t if (zoom >= 0) this.$view.querySelector(\".webix_cal_month_name\").blur();\r\n\t });\r\n\t },\r\n\t type_setter: function type_setter(value) {\r\n\t if (value == \"time\") {\r\n\t this._zoom_in = true;\r\n\t this._zoom_level = -1;\r\n\t } else if (value == \"year\") {\r\n\t this._fixed = true;\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t //repaint calendar when size changed\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t if (this._settings.cellHeight) {\r\n\t var state = this._getDateBoundaries(this._settings.date);\r\n\r\n\t this._settings.height = this._settings.cellHeight * state._rows + ($active.calendarHeight || 70);\r\n\t }\r\n\r\n\t return base.api.$getSize.call(this, dx, dy);\r\n\t },\r\n\t moveSelection: function moveSelection(mode, details, focus) {\r\n\t if (this.config.master) return; //in daterange\r\n\r\n\t var start = this.getSelectedDate();\r\n\t if (this.config.multiselect) start = start[0];\r\n\t var date = wDate.copy(start || this.getVisibleDate());\r\n\r\n\t this._moveSelection(date, mode, focus);\r\n\t },\r\n\t _moveSelection: function _moveSelection(date, mode, focus) {\r\n\t var css = this._zoom_logic[this._zoom_level]._keyshift(date, mode, this);\r\n\r\n\t if (focus !== false) {\r\n\t var sel = this._viewobj.querySelector(\".\" + css + \"[tabindex='0']\");\r\n\r\n\t if (sel) sel.focus();\r\n\t }\r\n\t },\r\n\t _getDateBoundaries: function _getDateBoundaries(date, reset) {\r\n\t // addition information about rendering event:\r\n\t // how many days from the previous month,\r\n\t // next,\r\n\t // number of weeks to display and so on\r\n\t if (!this._set_date_bounds || reset) {\r\n\t var month = date.getMonth();\r\n\t var year = date.getFullYear();\r\n\t var next = new Date(year, month + 1, 1);\r\n\t var start = wDate.weekStart(new Date(year, month, 1));\r\n\t var days = Math.round((next.valueOf() - start.valueOf()) / (60 * 1000 * 60 * 24));\r\n\t var rows = this._settings.skipEmptyWeeks ? Math.ceil(days / 7) : 6;\r\n\t this._set_date_bounds = {\r\n\t _month: month,\r\n\t _start: start,\r\n\t _next: next,\r\n\t _rows: rows\r\n\t };\r\n\t }\r\n\r\n\t return this._set_date_bounds;\r\n\t },\r\n\t $skin: function $skin() {\r\n\t if ($active.calendar) {\r\n\t if ($active.calendar.width) this.defaults.width = $active.calendar.width;\r\n\t if ($active.calendar.height) this.defaults.height = $active.calendar.height;\r\n\t if ($active.calendar.headerHeight) this.defaults.headerHeight = $active.calendar.headerHeight;\r\n\t if ($active.calendar.timepickerHeight) this.defaults.timepickerHeight = $active.calendar.timepickerHeight;\r\n\t }\r\n\t },\r\n\t _getColumnConfigSizes: function _getColumnConfigSizes(date) {\r\n\t var bounds = this._getDateBoundaries(date);\r\n\r\n\t var s = this._settings;\r\n\t var _columnsHeight = [];\r\n\t var _columnsWidth = [];\r\n\t var min = Infinity;\r\n\t var containerWidth = this._content_width - 36;\r\n\t var containerHeight = this._content_height - this._settings.headerHeight - 10 - (this._settings.timepicker || this._icons ? this._settings.timepickerHeight : 0);\r\n\t var columnsNumber = s.weekNumber ? 8 : 7;\r\n\r\n\t for (var i = 0; i < columnsNumber; i++) {\r\n\t _columnsWidth[i] = Math.ceil(containerWidth / (columnsNumber - i));\r\n\t containerWidth -= _columnsWidth[i];\r\n\t min = Math.min(min, _columnsWidth[i]);\r\n\t }\r\n\r\n\t var rowsNumber = bounds._rows;\r\n\r\n\t for (var k = 0; k < rowsNumber; k++) {\r\n\t _columnsHeight[k] = Math.ceil(containerHeight / (rowsNumber - k));\r\n\t containerHeight -= _columnsHeight[k];\r\n\t min = Math.min(min, _columnsHeight[k]);\r\n\t }\r\n\r\n\t return [_columnsWidth, _columnsHeight, min];\r\n\t },\r\n\t icons_setter: function icons_setter(value) {\r\n\t if (!value) this._icons = null;else if (_typeof(value) == \"object\") this._icons = value;else this._icons = this._icons2;\r\n\t },\r\n\t _icons: [],\r\n\t _icons2: [{\r\n\t template: function template$$1() {\r\n\t return \"\" + i18n.calendar.today + \"\";\r\n\t },\r\n\t on_click: {\r\n\t \"webix_cal_icon_today\": function webix_cal_icon_today() {\r\n\t var date = new Date();\r\n\t if (!this._settings.timepicker) date = wDate.datePart(date);\r\n\t this.setValue(date);\r\n\t this.callEvent(\"onTodaySet\", [this.getSelectedDate()]);\r\n\t }\r\n\t }\r\n\t }, {\r\n\t template: function template$$1() {\r\n\t return \"\" + i18n.calendar.clear + \"\";\r\n\t },\r\n\t on_click: {\r\n\t \"webix_cal_icon_clear\": function webix_cal_icon_clear() {\r\n\t this.setValue(\"\");\r\n\t this.callEvent(\"onDateClear\", [this.getSelectedDate()]);\r\n\t }\r\n\t }\r\n\t }],\r\n\t refresh: function refresh() {\r\n\t this.render();\r\n\t },\r\n\t render: function render() {\r\n\t //reset zoom level\r\n\t this._zoom_level = 0;\r\n\t this._zoom_size = false;\r\n\t var s = this._settings;\r\n\t if (!this.isVisible(s.id)) return;\r\n\t this._current_time = wDate.datePart(new Date());\r\n\t this.callEvent(\"onBeforeRender\", []);\r\n\t var date = this._settings.date;\r\n\r\n\t var bounds = this._getDateBoundaries(date, true);\r\n\r\n\t var sizes = this._getColumnConfigSizes(date);\r\n\r\n\t var width = sizes[0];\r\n\t var height = sizes[1];\r\n\t var html = \"
\" + s.calendarHeader(date) + \"\";\r\n\t if (s.navigation) html += \"
\";\r\n\t html += \"
\";\r\n\t if (s.weekHeader) html += \"\";\r\n\t html += \"
\" + this._body_template(width, height, bounds, sizes[2]) + \"
\";\r\n\r\n\t if (this._settings.timepicker || this._icons) {\r\n\t html += \"\";\r\n\t }\r\n\r\n\t this._contentobj.innerHTML = html;\r\n\r\n\t if (this._settings.type == \"time\") {\r\n\t var time = this._settings.date;\r\n\r\n\t if (time) {\r\n\t if (typeof time == \"string\") {\r\n\t date = i18n.parseTimeFormatDate(time);\r\n\t } else if (isArray(time)) {\r\n\t date.setHours(time[0]);\r\n\t date.setMinutes(time[1]);\r\n\t }\r\n\t }\r\n\r\n\t this._changeZoomLevel(-1, date);\r\n\t } else if (this._settings.type == \"month\") {\r\n\t this._changeZoomLevel(1, date);\r\n\t } else if (this._settings.type == \"year\") {\r\n\t this._changeZoomLevel(2, date);\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterRender\", []);\r\n\t },\r\n\t _icons_template: function _icons_template(date) {\r\n\t var html = \"
\";\r\n\t var icons = this._icons;\r\n\r\n\t for (var i = 0; i < icons.length; i++) {\r\n\t if (icons[i].template) {\r\n\t var template$$1 = typeof icons[i].template == \"function\" ? icons[i].template : template$$1(icons[i].template);\r\n\t html += template$$1.call(this, date);\r\n\t }\r\n\r\n\t if (icons[i].on_click) {\r\n\t exports.extend(this.on_click, icons[i].on_click);\r\n\t }\r\n\t }\r\n\r\n\t html += \"
\";\r\n\t return html;\r\n\t },\r\n\t _timepicker_template: function _timepicker_template(date) {\r\n\t var timeFormat = this._settings.calendarTime || i18n.timeFormatStr;\r\n\t var clock = this._settings.timeIcon;\r\n\t var tpl = \"\";\r\n\t if (!this._settings.master) tpl = \"
\" + timeFormat(date) + \"
\";else {\r\n\t //daterange needs two clocks\r\n\t var range_date = copy($$(this._settings.master)._settings.value);\r\n\t if (wDate.equal(range_date.end, date)) range_date.start = range_date.end;\r\n\r\n\t for (var i in range_date) {\r\n\t tpl += \"
\" + timeFormat(range_date[i]) + \"
\";\r\n\t }\r\n\t }\r\n\t return tpl;\r\n\t },\r\n\t _week_template: function _week_template(widths) {\r\n\t var s = this._settings;\r\n\t var week_template = \"\";\r\n\t var correction = 0;\r\n\r\n\t if (s.weekNumber) {\r\n\t correction = 1;\r\n\t week_template += \"
\" + s.calendarWeekHeader() + \"
\";\r\n\t }\r\n\r\n\t var k = wDate.startOnMonday ? 1 : 0;\r\n\r\n\t for (var i = 0; i < 7; i++) {\r\n\t // 7 days total\r\n\t var day_index = (k + i) % 7; // 0 - Sun, 6 - Sat as in Locale.date.day_short\r\n\r\n\t var day = i18n.calendar.dayShort[day_index]; // 01, 02 .. 31\r\n\r\n\t week_template += \"
\" + day + \"
\";\r\n\t }\r\n\r\n\t return week_template;\r\n\t },\r\n\t blockDates_setter: function blockDates_setter(value) {\r\n\t return toFunctor(value, this.$scope);\r\n\t },\r\n\t _day_css: function _day_css(day, bounds) {\r\n\t var css = \"\",\r\n\t isOutside = false;\r\n\t if (wDate.equal(day, this._current_time)) css += \" webix_cal_today\";\r\n\t if (!this._checkDate(day)) css += \" webix_cal_day_disabled\";\r\n\r\n\t if (day.getMonth() != bounds._month) {\r\n\t isOutside = true;\r\n\t css += \" webix_cal_outside\";\r\n\t }\r\n\r\n\t if (!isOutside && this._selectedDay(day)) css += \" webix_cal_select\";\r\n\t if (this._settings.events) css += \" \" + (this._settings.events(day, isOutside) || \"\");\r\n\t css += \" webix_cal_day\";\r\n\t return css;\r\n\t },\r\n\t _body_template: function _body_template(widths, heights, bounds, sqSize) {\r\n\t var s = this._settings;\r\n\t var html = \"\";\r\n\t var day = wDate.datePart(wDate.copy(bounds._start));\r\n\t var start = s.weekNumber ? 1 : 0;\r\n\t var weekNumber = wDate.getISOWeek(wDate.add(day, 2, \"day\", true));\r\n\r\n\t for (var y = 0; y < heights.length; y++) {\r\n\t html += \"
\";\r\n\r\n\t if (start) {\r\n\t // recalculate week number for the first week of a year\r\n\t if (!day.getMonth() && day.getDate() < 7) weekNumber = wDate.getISOWeek(wDate.add(day, 2, \"day\", true));\r\n\t html += \"\";\r\n\t }\r\n\r\n\t for (var x = start; x < widths.length; x++) {\r\n\t var css = this._day_css(day, bounds);\r\n\r\n\t var d = this._settings.dayTemplate.call(this, day);\r\n\r\n\t var sel = this._selectedDay(day);\r\n\r\n\t var alabel = \"\";\r\n\r\n\t var isOutside = day.getMonth() != bounds._month;\r\n\r\n\t if (_typeof(d) == \"object\") {\r\n\t alabel = d.aria || alabel;\r\n\t d = d.text;\r\n\t } else alabel = wDate.dateToStr(i18n.aria.dateFormat)(day);\r\n\r\n\t html += \"
\";\r\n\t day = wDate.add(day, 1, \"day\");\r\n\r\n\t if (day.getHours()) {\r\n\t day = wDate.datePart(day);\r\n\t }\r\n\t }\r\n\r\n\t html += \"
\";\r\n\t weekNumber++;\r\n\t }\r\n\r\n\t return html;\r\n\t },\r\n\t _changeDate: function _changeDate(dir, step) {\r\n\t var now = this._settings.date;\r\n\r\n\t if (!step) {\r\n\t step = this._zoom_logic[this._zoom_level]._changeStep;\r\n\t }\r\n\r\n\t if (!this._zoom_level) {\r\n\t now = wDate.copy(now);\r\n\t now.setDate(1);\r\n\t }\r\n\r\n\t var next = wDate.add(now, dir * step, \"month\", true);\r\n\r\n\t this._changeDateInternal(now, next);\r\n\t },\r\n\t _changeDateInternal: function _changeDateInternal(now, next) {\r\n\t if (this.callEvent(\"onBeforeMonthChange\", [now, next])) {\r\n\t if (this._zoom_level) {\r\n\t this._update_zoom_level(next);\r\n\t } else {\r\n\t this.showCalendar(next);\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterMonthChange\", [next, now]);\r\n\t }\r\n\t },\r\n\t _zoom_logic: {\r\n\t \"-2\": {\r\n\t _isBlocked: function _isBlocked(i) {\r\n\t var config = this._settings,\r\n\t date = config.date,\r\n\t isBlocked = false;\r\n\t var minHour = config.minTime ? config.minTime[0] : 0;\r\n\t var maxHour = config.maxTime ? config.maxTime[0] + (config.maxTime[1] ? 1 : 0) : 24;\r\n\t var minMinute = config.minTime && date.getHours() == minHour ? config.minTime[1] : 0;\r\n\t var maxMinute = config.maxTime && config.maxTime[1] && date.getHours() == maxHour - 1 ? config.maxTime[1] : 60;\r\n\r\n\t if (this._settings.blockTime) {\r\n\t var d = wDate.copy(date);\r\n\t d.setMinutes(i);\r\n\t isBlocked = this._settings.blockTime(d);\r\n\t }\r\n\r\n\t return i < minMinute || i >= maxMinute || isBlocked;\r\n\t },\r\n\t _setContent: function _setContent(next, i) {\r\n\t next.setMinutes(i);\r\n\t },\r\n\t _findActive: function _findActive(date, mode, calendar) {\r\n\t if (!this._isBlocked.call(calendar, date.getMinutes())) return date;else {\r\n\t var step = calendar._settings.minuteStep;\r\n\t var newdate = wDate.add(date, mode == \"right\" ? step : -step, \"minute\", true);\r\n\t if (date.getHours() === newdate.getHours()) return this._findActive(newdate, mode, calendar);\r\n\t }\r\n\t }\r\n\t },\r\n\t \"-1\": {\r\n\t _isBlocked: function _isBlocked(i) {\r\n\t var config = this._settings,\r\n\t date = config.date;\r\n\t var minHour = config.minTime ? config.minTime[0] : 0;\r\n\t var maxHour = config.maxTime ? config.maxTime[0] + (config.maxTime[1] ? 1 : 0) : 24;\r\n\t if (i < minHour || i >= maxHour) return true;\r\n\r\n\t if (config.blockTime) {\r\n\t var d = wDate.copy(date);\r\n\t d.setHours(i);\r\n\t var minMinute = config.minTime && i == minHour ? config.minTime[1] : 0;\r\n\t var maxMinute = config.maxTime && config.maxTime[1] && i == maxHour - 1 ? config.maxTime[1] : 60;\r\n\r\n\t for (var j = minMinute; j < maxMinute; j += config.minuteStep) {\r\n\t d.setMinutes(j);\r\n\t if (!config.blockTime(d)) return false;\r\n\t }\r\n\r\n\t return true;\r\n\t }\r\n\t },\r\n\t _setContent: function _setContent(next, i) {\r\n\t next.setHours(i);\r\n\t },\r\n\t _keyshift: function _keyshift(date, mode, calendar) {\r\n\t var newdate,\r\n\t inc,\r\n\t step = calendar._settings.minuteStep;\r\n\r\n\t if (mode === \"bottom\" || mode === \"top\") {\r\n\t date.setHours(mode === \"bottom\" ? 23 : 0);\r\n\t date.setMinutes(mode === \"bottom\" ? 55 : 0);\r\n\t date.setSeconds(0);\r\n\t date.setMilliseconds(0);\r\n\t newdate = date;\r\n\t } else if (mode === \"left\" || mode === \"right\") {\r\n\t //minutes\r\n\t inc = mode === \"right\" ? step : -step;\r\n\t if (mode === \"left\" && date.getMinutes() < step) inc = 60 - step;\r\n\t if (mode === \"right\" && date.getMinutes() >= 60 - step) inc = step - 60;\r\n\t inc -= date.getMinutes() % step;\r\n\t newdate = calendar._zoom_logic[\"-2\"]._findActive(wDate.add(date, inc, \"minute\"), mode, calendar);\r\n\t } else if (mode === \"up\" || mode === \"down\") {\r\n\t //hours\r\n\t inc = mode === \"down\" ? 1 : -1;\r\n\t if (mode === \"down\" && date.getHours() === 23) inc = -23;\r\n\t if (mode === \"up\" && date.getHours() === 0) inc = 23;\r\n\t newdate = this._findActive(wDate.add(date, inc, \"hour\"), mode, calendar);\r\n\t } else if (mode === false) newdate = this._findActive(date, mode, calendar);\r\n\r\n\t calendar.selectDate(newdate, false);\r\n\r\n\t if (newdate) {\r\n\t calendar._update_zoom_level(newdate);\r\n\r\n\t calendar.selectDate(newdate, false);\r\n\t }\r\n\r\n\t return \"webix_cal_block\" + (mode === \"left\" || mode === \"right\" ? \"_min\" : \"\");\r\n\t },\r\n\t _findActive: function _findActive(date, mode, calendar) {\r\n\t if (!this._isBlocked.call(calendar, date.getHours())) return date;else {\r\n\t var newdate = wDate.add(date, mode == \"down\" ? 1 : -1, \"hour\", true);\r\n\t if (date.getDate() === newdate.getDate()) return this._findActive(newdate, mode, calendar);\r\n\t }\r\n\t }\r\n\t },\r\n\t \"0\": {\r\n\t //days\r\n\t _changeStep: 1,\r\n\t _keyshift: function _keyshift(date, mode, calendar) {\r\n\t var newdate = date;\r\n\t if (mode === \"pgup\" || mode === \"pgdown\") newdate = wDate.add(date, mode === \"pgdown\" ? 1 : -1, \"month\");else if (mode === \"bottom\") newdate = new Date(date.getFullYear(), date.getMonth() + 1, 0);else if (mode === \"top\") newdate = new Date(date.setDate(1));else if (mode === \"left\" || mode === \"right\") newdate = wDate.add(date, mode === \"right\" ? 1 : -1, \"day\");else if (mode === \"up\" || mode === \"down\") newdate = wDate.add(date, mode === \"down\" ? 1 : -1, \"week\");\r\n\t if (!calendar._checkDate(newdate)) newdate = calendar._findActive(date, mode);\r\n\t if (newdate) calendar.selectDate(newdate, true);\r\n\t return \"webix_cal_day\";\r\n\t }\r\n\t },\r\n\t \"1\": {\r\n\t //months\r\n\t _isBlocked: function _isBlocked(i, calendar) {\r\n\t var blocked = false,\r\n\t minYear,\r\n\t maxYear,\r\n\t min = calendar._settings.minDate || null,\r\n\t max = calendar._settings.maxDate || null,\r\n\t year = calendar._settings.date.getFullYear();\r\n\r\n\t if (min && max) {\r\n\t minYear = min.getFullYear();\r\n\t maxYear = max.getFullYear();\r\n\t if (year < minYear || year == minYear && min.getMonth() > i || year > maxYear || year == maxYear && max.getMonth() < i) blocked = true;\r\n\t }\r\n\r\n\t return blocked;\r\n\t },\r\n\t _correctDate: function _correctDate(date, calendar) {\r\n\t if (date < calendar._settings.minDate) {\r\n\t date = wDate.copy(calendar._settings.minDate);\r\n\t } else if (date > calendar._settings.maxDate) {\r\n\t date = wDate.copy(calendar._settings.maxDate);\r\n\t }\r\n\r\n\t return date;\r\n\t },\r\n\t _getTitle: function _getTitle(date) {\r\n\t return date.getFullYear();\r\n\t },\r\n\t _getContent: function _getContent(i) {\r\n\t return i18n.calendar.monthShort[i];\r\n\t },\r\n\t _setContent: function _setContent(next, i) {\r\n\t if (i != next.getMonth()) next.setDate(1);\r\n\t next.setMonth(i);\r\n\t },\r\n\t _changeStep: 12,\r\n\t _keyshift: function _keyshift(date, mode, calendar) {\r\n\t var newdate = date;\r\n\t if (mode === \"pgup\" || mode === \"pgdown\") newdate = wDate.add(date, mode === \"pgdown\" ? 1 : -1, \"year\");else if (mode === \"bottom\") newdate = new Date(date.setMonth(11));else if (mode === \"top\") newdate = new Date(date.setMonth(0));else if (mode === \"left\" || mode === \"right\") newdate = wDate.add(date, mode === \"right\" ? 1 : -1, \"month\");else if (mode === \"up\" || mode === \"down\") newdate = wDate.add(date, mode === \"down\" ? 4 : -4, \"month\");\r\n\t if (!calendar._checkDate(newdate)) newdate = calendar._findActive(date, mode);\r\n\r\n\t if (newdate) {\r\n\t calendar._update_zoom_level(newdate);\r\n\r\n\t calendar.selectDate(newdate, false);\r\n\t }\r\n\r\n\t return \"webix_cal_block\";\r\n\t }\r\n\t },\r\n\t \"2\": {\r\n\t //years\r\n\t _isBlocked: function _isBlocked(i, calendar) {\r\n\t i += calendar._zoom_start_date;\r\n\t var blocked = false;\r\n\t var min = calendar._settings.minDate;\r\n\t var max = calendar._settings.maxDate;\r\n\r\n\t if (min && max && (min.getFullYear() > i || max.getFullYear() < i)) {\r\n\t blocked = true;\r\n\t }\r\n\r\n\t return blocked;\r\n\t },\r\n\t _correctDate: function _correctDate(date, calendar) {\r\n\t if (date < calendar._settings.minDate) {\r\n\t date = wDate.copy(calendar._settings.minDate);\r\n\t } else if (date > calendar._settings.maxDate) {\r\n\t date = wDate.copy(calendar._settings.maxDate);\r\n\t }\r\n\r\n\t return date;\r\n\t },\r\n\t _getTitle: function _getTitle(date, calendar) {\r\n\t var start = date.getFullYear();\r\n\t calendar._zoom_start_date = start = start - start % 10 - 1;\r\n\t return start + \" - \" + (start + 10 + 1);\r\n\t },\r\n\t _getContent: function _getContent(i, calendar) {\r\n\t return calendar._zoom_start_date + i;\r\n\t },\r\n\t _setContent: function _setContent(next, i, calendar) {\r\n\t next.setFullYear(calendar._zoom_start_date + i);\r\n\t },\r\n\t _changeStep: 12 * 10,\r\n\t _keyshift: function _keyshift(date, mode, calendar) {\r\n\t var newdate = date;\r\n\t if (mode === \"pgup\" || mode === \"pgdown\") newdate = wDate.add(date, mode === \"pgdown\" ? 10 : -10, \"year\");else if (mode === \"bottom\") newdate = new Date(date.setYear(calendar._zoom_start_date + 10));else if (mode === \"top\") newdate = new Date(date.setYear(calendar._zoom_start_date));else if (mode === \"left\" || mode === \"right\") newdate = wDate.add(date, mode === \"right\" ? 1 : -1, \"year\");else if (mode === \"up\" || mode === \"down\") newdate = wDate.add(date, mode === \"down\" ? 4 : -4, \"year\");\r\n\t if (!calendar._checkDate(newdate)) newdate = calendar._findActive(date, mode);\r\n\r\n\t if (newdate) {\r\n\t calendar._update_zoom_level(newdate);\r\n\r\n\t calendar.selectDate(newdate, false);\r\n\t }\r\n\r\n\t return \"webix_cal_block\";\r\n\t }\r\n\t }\r\n\t },\r\n\t _correctBlockedTime: function _correctBlockedTime() {\r\n\t var i, isDisabledHour, isDisabledMinutes;\r\n\t isDisabledHour = this._zoom_logic[-1]._isBlocked.call(this, this._settings.date.getHours());\r\n\r\n\t if (isDisabledHour) {\r\n\t for (i = 0; i < 24; i++) {\r\n\t if (!this._zoom_logic[-1]._isBlocked.call(this, i)) {\r\n\t this._settings.date.setHours(i);\r\n\r\n\t break;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t isDisabledMinutes = this._zoom_logic[-2]._isBlocked.call(this, this._settings.date.getMinutes());\r\n\r\n\t if (isDisabledMinutes) {\r\n\t for (i = 0; i < 60; i += this._settings.minuteStep) {\r\n\t if (!this._zoom_logic[-2]._isBlocked.call(this, i)) {\r\n\t this._settings.date.setMinutes(i);\r\n\r\n\t break;\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _update_zoom_level: function _update_zoom_level(date) {\r\n\t var config, css, height, i, index$$1, sections, selected, type, width, zlogic, temp, sqSize;\r\n\t var html = \"\";\r\n\t config = this._settings;\r\n\t index$$1 = config.weekHeader ? 2 : 1;\r\n\t zlogic = this._zoom_logic[this._zoom_level];\r\n\t sections = this._contentobj.childNodes;\r\n\r\n\t if (date) {\r\n\t config.date = date;\r\n\t }\r\n\r\n\t type = config.type; //store width and height of draw area\r\n\r\n\t if (!this._zoom_size) {\r\n\t /*this._reserve_box_height = sections[index].offsetHeight +(index==2?sections[1].offsetHeight:0);*/\r\n\t this._reserve_box_height = this._contentobj.offsetHeight - config.headerHeight;\r\n\t if (type != \"year\" && type != \"month\") this._reserve_box_height -= config.timepickerHeight;else if (this._icons) {\r\n\t this._reserve_box_height -= 10;\r\n\t }\r\n\t this._reserve_box_width = sections[index$$1].offsetWidth;\r\n\t this._zoom_size = 1;\r\n\t } //main section\r\n\r\n\r\n\t if (this._zoom_in) {\r\n\t //hours and minutes\r\n\t height = this._reserve_box_height / 6;\r\n\t var timeColNum = 6;\r\n\t var timeFormat = this._calendarTime || i18n.timeFormat;\r\n\t var enLocale = timeFormat.match(/%([a,A])/);\r\n\t if (enLocale) timeColNum++;\r\n\t width = parseInt((this._reserve_box_width - 3) / timeColNum, 10);\r\n\t sqSize = Math.min(width, height);\r\n\t html += \"
\" + this._timeHeaderTemplate(width, enLocale) + \"
\";\r\n\t html += \"
\"; // check and change blocked selected time\r\n\r\n\t this._correctBlockedTime();\r\n\r\n\t html += \"
\";\r\n\t selected = config.date.getHours();\r\n\t temp = wDate.copy(config.date);\r\n\r\n\t for (i = 0; i < 24; i++) {\r\n\t css = \"\";\r\n\r\n\t if (enLocale) {\r\n\t if (i % 4 === 0) {\r\n\t var label = !i ? i18n.am[0] : i == 12 ? i18n.pm[0] : \"\";\r\n\t html += \"
\" + label + \"
\";\r\n\t }\r\n\t }\r\n\r\n\t if (this._zoom_logic[-1]._isBlocked.call(this, i)) {\r\n\t css += \" webix_cal_day_disabled\";\r\n\t } else if (selected == i) css += \" webix_selected\";\r\n\r\n\t temp.setHours(i);\r\n\t html += \"
\" + wDate.toFixed(enLocale ? !i || i == 12 ? 12 : i % 12 : i) + \"
\";\r\n\t }\r\n\r\n\t html += \"
\";\r\n\t html += \"
\";\r\n\t selected = config.date.getMinutes();\r\n\t temp = wDate.copy(config.date);\r\n\r\n\t for (i = 0; i < 60; i += config.minuteStep) {\r\n\t css = \"\";\r\n\r\n\t if (this._zoom_logic[-2]._isBlocked.call(this, i)) {\r\n\t css = \" webix_cal_day_disabled\";\r\n\t } else if (selected == i) css = \" webix_selected\";\r\n\r\n\t temp.setMinutes(i);\r\n\t html += \"
\" + wDate.toFixed(i) + \"
\";\r\n\t }\r\n\r\n\t html += \"
\";\r\n\t html += \"
\";\r\n\t html += \"\";\r\n\t this._contentobj.innerHTML = html;\r\n\t } else {\r\n\t //years and months\r\n\t //reset header\r\n\t var header = sections[0].childNodes;\r\n\t var labels = i18n.aria[\"nav\" + (this._zoom_level == 1 ? \"Year\" : \"Decade\")];\r\n\t header[0].innerHTML = zlogic._getTitle(config.date, this);\r\n\t header[1].setAttribute(\"aria-label\", labels[0]);\r\n\t header[2].setAttribute(\"aria-label\", labels[1]);\r\n\t height = this._reserve_box_height / 3;\r\n\t width = this._reserve_box_width / 4;\r\n\t sqSize = Math.min(height, width);\r\n\t if (this._checkDate(config.date)) selected = this._zoom_level == 1 ? config.date.getMonth() : config.date.getFullYear();\r\n\r\n\t for (i = 0; i < 12; i++) {\r\n\t css = selected == (this._zoom_level == 1 ? i : zlogic._getContent(i, this)) ? \" webix_selected\" : \"\";\r\n\r\n\t if (zlogic._isBlocked(i, this)) {\r\n\t css += \" webix_cal_day_disabled\";\r\n\t }\r\n\r\n\t var format = i18n.aria[(this._zoom_level == 1 ? \"month\" : \"year\") + \"Format\"];\r\n\t html += \"
\" + zlogic._getContent(i, this) + \"
\";\r\n\t }\r\n\r\n\t if (index$$1 - 1) {\r\n\t sections[index$$1 - 1].style.display = \"none\";\r\n\t }\r\n\r\n\t sections[index$$1].innerHTML = html;\r\n\r\n\t if (type != \"year\" && type != \"month\") {\r\n\t if (!sections[index$$1 + 1]) this._contentobj.innerHTML += \"\";else sections[index$$1 + 1].innerHTML = this._timeButtonsTemplate();\r\n\t }\r\n\r\n\t sections[index$$1].style.height = this._reserve_box_height + \"px\";\r\n\t }\r\n\t },\r\n\t _getCalSizesString: function _getCalSizesString(width, height) {\r\n\t return \"width:\" + width + \"px; height:\" + height + \"px; line-height:\" + height + \"px;\";\r\n\t },\r\n\t _timeButtonsTemplate: function _timeButtonsTemplate() {\r\n\t return \"\";\r\n\t },\r\n\t _timeHeaderTemplate: function _timeHeaderTemplate(width, enLocale) {\r\n\t var w1 = width * (enLocale ? 5 : 4);\r\n\t var w2 = width * 2;\r\n\t return \"
\" + i18n.calendar.hours + \"
\" + i18n.calendar.minutes + \"
\";\r\n\t },\r\n\t _changeZoomLevel: function _changeZoomLevel(zoom, date) {\r\n\t var oldzoom = this._zoom_level;\r\n\r\n\t if (this.callEvent(\"onBeforeZoom\", [zoom, oldzoom])) {\r\n\t this._zoom_level = zoom;\r\n\t if (zoom) this._update_zoom_level(date);else this.showCalendar(date);\r\n\t this.callEvent(\"onAfterZoom\", [zoom, oldzoom]);\r\n\t }\r\n\t },\r\n\t _correctDate: function _correctDate(date) {\r\n\t if (!this._checkDate(date) && this._zoom_logic[this._zoom_level]._correctDate) date = this._zoom_logic[this._zoom_level]._correctDate(date, this);\r\n\t return date;\r\n\t },\r\n\t _mode_selected: function _mode_selected(target) {\r\n\t var next = this._locate_date(target);\r\n\r\n\t var zoom = this._zoom_level - (this._fixed ? 0 : 1);\r\n\t next = this._correctDate(next);\r\n\r\n\t if (this._checkDate(next)) {\r\n\t this._changeZoomLevel(zoom, next);\r\n\r\n\t var type = this._settings.type;\r\n\t if (type == \"month\" || type == \"year\") this._selectDate(next);\r\n\t }\r\n\t },\r\n\t // selects date and redraw calendar\r\n\t _selectDate: function _selectDate(date, add) {\r\n\t if (this.callEvent(\"onBeforeDateSelect\", [date])) {\r\n\t this.selectDate(date, true, add);\r\n\t this.callEvent(\"onDateSelect\", [date]); // should be deleted in a future version\r\n\r\n\t this.callEvent(\"onAfterDateSelect\", [date]);\r\n\t }\r\n\t },\r\n\t _locate_day: function _locate_day(target) {\r\n\t var cind = index(target) - (this._settings.weekNumber ? 1 : 0);\r\n\t var rind = index(target.parentNode);\r\n\t var date = wDate.add(this._getDateBoundaries()._start, cind + rind * 7, \"day\", true);\r\n\r\n\t if (this._settings.timepicker) {\r\n\t date.setHours(this._settings.date.getHours());\r\n\t date.setMinutes(this._settings.date.getMinutes());\r\n\t }\r\n\r\n\t return date;\r\n\t },\r\n\t _locate_date: function _locate_date(target) {\r\n\t var value = target.getAttribute(\"data-value\") * 1;\r\n\t var level = target.className.indexOf(\"webix_cal_block_min\") != -1 ? this._zoom_level - 1 : this._zoom_level;\r\n\t var now = this._settings.date;\r\n\t var next = wDate.copy(now);\r\n\r\n\t this._zoom_logic[level]._setContent(next, value, this);\r\n\r\n\t return next;\r\n\t },\r\n\t on_click: {\r\n\t webix_cal_prev_button: function webix_cal_prev_button() {\r\n\t this._changeDate(-1);\r\n\t },\r\n\t webix_cal_next_button: function webix_cal_next_button() {\r\n\t this._changeDate(1);\r\n\t },\r\n\t webix_cal_day_disabled: function webix_cal_day_disabled() {\r\n\t return false;\r\n\t },\r\n\t webix_cal_outside: function webix_cal_outside() {\r\n\t if (!this._settings.navigation) return false;\r\n\t },\r\n\t webix_cal_day: function webix_cal_day(e, id, target) {\r\n\t var date = this._locate_day(target);\r\n\r\n\t var add = this._settings.multiselect === \"touch\" || e.ctrlKey || e.metaKey;\r\n\r\n\t this._selectDate(date, add);\r\n\t },\r\n\t webix_cal_time: function webix_cal_time() {\r\n\t if (this._zoom_logic[this._zoom_level - 1]) {\r\n\t this._zoom_in = true;\r\n\t var zoom = this._zoom_level - 1;\r\n\r\n\t this._changeZoomLevel(zoom);\r\n\t }\r\n\t },\r\n\t webix_range_time_start: function webix_range_time_start() {\r\n\t $$(this._settings.master)._time_mode = \"start\";\r\n\t },\r\n\t webix_range_time_end: function webix_range_time_end() {\r\n\t $$(this._settings.master)._time_mode = \"end\";\r\n\t },\r\n\t webix_cal_done: function webix_cal_done() {\r\n\t var date = wDate.copy(this._settings.date);\r\n\t date = this._correctDate(date);\r\n\r\n\t this._selectDate(date);\r\n\t },\r\n\t webix_cal_month_name: function webix_cal_month_name() {\r\n\t this._zoom_in = false; //maximum zoom reached\r\n\r\n\t if (this._zoom_level == 2 || !this._settings.monthSelect) return;\r\n\t var zoom = Math.max(this._zoom_level, 0) + 1;\r\n\r\n\t this._changeZoomLevel(zoom);\r\n\t },\r\n\t webix_cal_block: function webix_cal_block(e, id, trg) {\r\n\t if (this._zoom_in) {\r\n\t if (trg.className.indexOf(\"webix_cal_day_disabled\") !== -1) return false;\r\n\r\n\t var next = this._locate_date(trg);\r\n\r\n\t this._update_zoom_level(next);\r\n\t } else {\r\n\t if (trg.className.indexOf(\"webix_cal_day_disabled\") == -1) this._mode_selected(trg);\r\n\t }\r\n\t }\r\n\t },\r\n\t _string_to_date: function _string_to_date(date, format) {\r\n\t if (!date) {\r\n\t return wDate.datePart(new Date());\r\n\t }\r\n\r\n\t if (typeof date == \"string\") {\r\n\t if (format) date = wDate.strToDate(format)(date);else date = i18n.parseFormatDate(date);\r\n\t }\r\n\r\n\t return date;\r\n\t },\r\n\t _checkDate: function _checkDate(date) {\r\n\t var blockedDate = this._settings.blockDates && this._settings.blockDates.call(this, date);\r\n\r\n\t var minDate = this._settings.minDate;\r\n\t var maxDate = this._settings.maxDate;\r\n\t var outOfRange = date < minDate || date > maxDate;\r\n\t return !blockedDate && !outOfRange;\r\n\t },\r\n\t _findActive: function _findActive(date, mode) {\r\n\t var dir = mode === \"top\" || mode === \"left\" || mode === \"pgup\" || mode === \"up\" ? -1 : 1;\r\n\t var newdate = wDate.add(date, dir, \"day\", true);\r\n\t if (this._checkDate(newdate)) return newdate;else {\r\n\t var compare;\r\n\t if (this._zoom_level === 0) compare = date.getMonth() === newdate.getMonth();else if (this._zoom_level === 1) compare = date.getFullYear() === newdate.getFullYear();else if (this._zoom_level === 2) compare = newdate.getFullYear() > this._zoom_start_date && newdate.getFullYear() < this._zoom_start_date + 10;\r\n\t if (compare) return this._findActive(newdate, mode);\r\n\t }\r\n\t },\r\n\t showCalendar: function showCalendar(date) {\r\n\t date = this._string_to_date(date);\r\n\t this._settings.date = date;\r\n\t this.render();\r\n\t this.resize();\r\n\t },\r\n\t _selectedDay: function _selectedDay(day) {\r\n\t return day && this._selected_days[day.valueOf()];\r\n\t },\r\n\t getSelectedDate: function getSelectedDate() {\r\n\t var result = [];\r\n\r\n\t for (var key in this._selected_days) {\r\n\t result.push(wDate.copy(this._selected_days[key]));\r\n\t }\r\n\r\n\t return this.config.multiselect ? result : result[0] || null;\r\n\t },\r\n\t getVisibleDate: function getVisibleDate() {\r\n\t return wDate.copy(this._settings.date);\r\n\t },\r\n\t setValue: function setValue(date) {\r\n\t this.selectDate(date, true);\r\n\t },\r\n\t getValue: function getValue$$1(format) {\r\n\t var date = this.getSelectedDate();\r\n\t if (format) date = wDate.dateToStr(format)(date);\r\n\t return date;\r\n\t },\r\n\t selectDate: function selectDate(date, show, add) {\r\n\t if (!date || !add || !this.config.multiselect) this._selected_days = {};\r\n\r\n\t if (date) {\r\n\t if (!isArray(date)) date = [date];\r\n\r\n\t for (var i = 0; i < date.length; i++) {\r\n\t var days = this._string_to_date(date[i]);\r\n\r\n\t var key = wDate.datePart(wDate.copy(days)).valueOf();\r\n\t if (this._selected_days[key] && add) delete this._selected_days[key];else this._selected_days[key] = days;\r\n\t if (!this.config.multiselect) break;\r\n\t }\r\n\r\n\t if (date.length && show) this.showCalendar(date[0]);\r\n\t }\r\n\r\n\t if (show !== false) this.render();\r\n\t this.callEvent(\"onChange\", [date]);\r\n\t },\r\n\t locate: function locate$$1() {\r\n\t return null;\r\n\t }\r\n\t};\r\n\tvar view$A = exports.protoUI(api$A, KeysNavigation, MouseEvents, base.view, EventSystem);\r\n\r\n\tvar api$B = {\r\n\t name: \"colorboard\",\r\n\t defaults: {\r\n\t template: \"
\",\r\n\t palette: null,\r\n\t height: 220,\r\n\t width: 220,\r\n\t cols: 12,\r\n\t rows: 10,\r\n\t minLightness: 0.15,\r\n\t maxLightness: 1,\r\n\t navigation: true\r\n\t },\r\n\t $init: function $init() {\r\n\t _event(this._viewobj, \"click\", bind(function (e) {\r\n\t var value = locate(e, \"webix_val\");\r\n\t this.setValue(value);\r\n\t this.callEvent(\"onItemClick\", [this._settings.value, e]);\r\n\t this.callEvent(\"onSelect\", [this._settings.value]);\r\n\t }, this));\r\n\r\n\t this.$view.setAttribute(\"role\", \"grid\");\r\n\r\n\t this._viewobj.setAttribute(\"aria-readonly\", \"true\");\r\n\t },\r\n\t _findIndex: function _findIndex(value) {\r\n\t var pal = this._settings.palette;\r\n\t value = (value || \"\").toUpperCase();\r\n\r\n\t for (var r = 0, rows = pal.length; r < rows; r++) {\r\n\t for (var c = 0, cols = pal[r].length; c < cols; c++) {\r\n\t if (pal[r][c].toUpperCase() == value) {\r\n\t return {\r\n\t row: r,\r\n\t col: c\r\n\t };\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this._settings.value;\r\n\t },\r\n\t _getBox: function _getBox() {\r\n\t return this._viewobj.firstChild;\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t if (value && value.toString().charAt(0) != \"#\") value = \"#\" + value;\r\n\t var oldvalue = this._settings.value;\r\n\t this._settings.value = value;\r\n\t this.$setValue(value, oldvalue);\r\n\t return value;\r\n\t },\r\n\t _selectBox: null,\r\n\t _getSelectBox: function _getSelectBox() {\r\n\t if (this._selectBox && this._selectBox.parentNode) {\r\n\t return this._selectBox;\r\n\t } else {\r\n\t var div = this._selectBox = document.createElement(\"div\");\r\n\t div.className = \"webix_color_selector\";\r\n\r\n\t this._viewobj.lastChild.appendChild(div);\r\n\r\n\t return div;\r\n\t }\r\n\t },\r\n\t $setValue: function $setValue(value, oldvalue) {\r\n\t if (this.isVisible(this._settings.id)) {\r\n\t var cell,\r\n\t div,\r\n\t ind,\r\n\t parent,\r\n\t style,\r\n\t left = 0,\r\n\t top = 0; //remove tabindex for previous selection\r\n\r\n\t if (oldvalue) ind = this._findIndex(oldvalue);\r\n\t if (!ind) ind = {\r\n\t row: 0,\r\n\t col: 0\r\n\t };\r\n\r\n\t this._viewobj.lastChild.childNodes[ind.row].childNodes[ind.col].setAttribute(\"tabindex\", \"-1\");\r\n\r\n\t ind = this._findIndex(value);\r\n\r\n\t if (ind) {\r\n\t cell = this._viewobj.lastChild.childNodes[ind.row].childNodes[ind.col];\r\n\t }\r\n\r\n\t if (cell && cell.parentNode && cell.parentNode.parentNode) {\r\n\t parent = cell.parentNode;\r\n\t left = cell.offsetLeft - parent.offsetLeft;\r\n\t top = -(this.$height - (cell.offsetTop - parent.parentNode.offsetTop));\r\n\t cell.setAttribute(\"tabindex\", \"0\");\r\n\t cell.setAttribute(\"aria-selected\", \"true\");\r\n\t cell.setAttribute(\"tabindex\", \"0\");\r\n\t cell.setAttribute(\"aria-selected\", \"true\");\r\n\t } else {\r\n\t if (this._selectBox) this._selectBox.style.left = \"-100px\";\r\n\r\n\t this._viewobj.lastChild.childNodes[0].childNodes[0].setAttribute(\"tabindex\", \"0\");\r\n\r\n\t return;\r\n\t }\r\n\r\n\t div = this._getSelectBox();\r\n\t style = [\"left:\" + left + \"px\", \"top:\" + top + \"px\", \"width:\" + cell.style.width, \"height:\" + cell.style.height].join(\";\");\r\n\r\n\t if (typeof div.style.cssText !== \"undefined\") {\r\n\t div.style.cssText = style;\r\n\t } else {\r\n\t div.setAttribute(\"style\", style);\r\n\t }\r\n\t }\r\n\t },\r\n\t _initPalette: function _initPalette(config) {\r\n\t function numToHex(n) {\r\n\t return color.toHex(n, 2);\r\n\t }\r\n\r\n\t function rgbToHex(r, g, b) {\r\n\t return \"#\" + numToHex(Math.floor(r)) + numToHex(Math.floor(g)) + numToHex(Math.floor(b));\r\n\t }\r\n\r\n\t function hslToRgb(h, s, l) {\r\n\t var r, g, b;\r\n\r\n\t if (!s) {\r\n\t r = g = b = l; // achromatic\r\n\t } else {\r\n\t var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n\t var p = 2 * l - q;\r\n\t r = hue2rgb(p, q, h + 1 / 3);\r\n\t g = hue2rgb(p, q, h);\r\n\t b = hue2rgb(p, q, h - 1 / 3);\r\n\t }\r\n\r\n\t return {\r\n\t r: r * 255,\r\n\t g: g * 255,\r\n\t b: b * 255\r\n\t };\r\n\t }\r\n\r\n\t function hue2rgb(p, q, t) {\r\n\t if (t < 0) t += 1;\r\n\t if (t > 1) t -= 1;\r\n\t if (t < 1 / 6) return p + (q - p) * 6 * t;else if (t <= 1 / 2) return q;else if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;else return p;\r\n\t }\r\n\r\n\t function renderGrayBar(colCount) {\r\n\t var gray = [],\r\n\t val = 255,\r\n\t step = val / colCount;\r\n\r\n\t for (var i = 0; i < colCount; i++) {\r\n\t val = Math.round(val > 0 ? val : 0);\r\n\t gray.push(rgbToHex(val, val, val));\r\n\t val -= step;\r\n\t }\r\n\r\n\t gray[gray.length - 1] = \"#000000\";\r\n\t return gray;\r\n\t }\r\n\r\n\t var colors = [];\r\n\t var colorRows = config.rows - 1;\r\n\t var colorStep = 1 / config.cols;\r\n\t var lightStep = (config.maxLightness - config.minLightness) / colorRows;\r\n\t var colorRange = null;\r\n\t colors.push(renderGrayBar(config.cols));\r\n\r\n\t for (var step = 0, lt = config.minLightness; step < colorRows; step++) {\r\n\t colorRange = [];\r\n\r\n\t for (var c = 0, col = 0; c < config.cols; c++) {\r\n\t var val = hslToRgb(col, 1, lt);\r\n\t colorRange.push(rgbToHex(val.r, val.g, val.b));\r\n\t col += colorStep;\r\n\t }\r\n\r\n\t colors.push(colorRange);\r\n\t lt += lightStep;\r\n\t }\r\n\r\n\t this._settings.palette = colors;\r\n\t },\r\n\t moveSelection: function moveSelection(mode, details, focus) {\r\n\t var value = this.getValue(),\r\n\t ind,\r\n\t cell;\r\n\t if (value) ind = this._findIndex(value);\r\n\t if (!ind) ind = {\r\n\t row: 0,\r\n\t col: 0\r\n\t };\r\n\r\n\t if (ind) {\r\n\t if (mode == \"up\" || mode == \"down\") ind.row = ind.row + (mode == \"up\" ? -1 : 1);else if (mode == \"right\" || mode == \"left\") ind.col = ind.col + (mode == \"right\" ? 1 : -1);else if (mode == \"top\") ind.row = ind.col = 0;else if (mode == \"bottom\") {\r\n\t ind.row = this._viewobj.lastChild.querySelectorAll(\".webix_color_row\").length - 1;\r\n\t ind.col = this._viewobj.lastChild.childNodes[ind.row].childNodes.length - 1;\r\n\t }\r\n\t if (ind.row >= 0) cell = this._viewobj.lastChild.childNodes[ind.row].childNodes[ind.col];\r\n\r\n\t if (cell) {\r\n\t value = cell.getAttribute(\"webix_val\");\r\n\t this.setValue(value);\r\n\t this.callEvent(\"onSelect\", [this._settings.value]);\r\n\r\n\t if (focus !== false) {\r\n\t var sel = this._viewobj.querySelector(\"div[tabindex='0']\");\r\n\r\n\t if (sel) sel.focus();\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t render: function render() {\r\n\t if (!this.isVisible(this._settings.id)) return;\r\n\t if (!this._settings.palette) this._initPalette(this._settings);\r\n\t var palette = this._settings.palette;\r\n\t this.callEvent(\"onBeforeRender\", []);\r\n\t var config = this._settings,\r\n\t itemTpl = template(\"
\" + (config.template || \"\") + \"
\"),\r\n\t data = {\r\n\t width: 0,\r\n\t height: 0,\r\n\t val: 0\r\n\t },\r\n\t width = this.$width,\r\n\t height = this.$height,\r\n\t widths = [];\r\n\t var html = \"
\";\r\n\t var firstRow = _typeof(palette[0]) == \"object\" ? palette[0] : palette;\r\n\r\n\t for (var i = 0; i < firstRow.length; i++) {\r\n\t widths[i] = Math.floor(width / (firstRow.length - i));\r\n\t width -= widths[i];\r\n\t }\r\n\r\n\t if (_typeof(palette[0]) == \"object\") {\r\n\t for (var r = 0; r < palette.length; r++) {\r\n\t var cellHeight = Math.floor(height / (palette.length - r));\r\n\t height -= cellHeight;\r\n\t var row = palette[r];\r\n\t html += renderRow(row, widths, cellHeight);\r\n\t }\r\n\t } else {\r\n\t html += renderRow(palette, widths, height);\r\n\t }\r\n\r\n\t html += \"
\";\r\n\t this._viewobj.innerHTML = html;\r\n\r\n\t function renderRow(row, widths, height) {\r\n\t var rowHtml = \"
\";\r\n\r\n\t for (var cell = 0; cell < row.length; cell++) {\r\n\t data.width = widths[cell];\r\n\t data.height = height;\r\n\t data.val = row[cell];\r\n\t rowHtml += itemTpl(data);\r\n\t }\r\n\r\n\t rowHtml += \"
\";\r\n\t return rowHtml;\r\n\t }\r\n\r\n\t this._selectBox = null;\r\n\t if (this._settings.value) this.$setValue(this._settings.value);else this._viewobj.lastChild.childNodes[0].childNodes[0].setAttribute(\"tabindex\", \"0\");\r\n\t this.callEvent(\"onAfterRender\", []);\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this.render();\r\n\t }\r\n\t};\r\n\tvar view$B = exports.protoUI(api$B, KeysNavigation, base.view, EventSystem);\r\n\r\n\tvar api$C = {\r\n\t name: \"button\",\r\n\t touchable: true,\r\n\t $skin: function $skin() {\r\n\t this.defaults.height = $active.buttonHeight || $active.inputHeight; //used in \"text\"\r\n\r\n\t this._labelTopHeight = $active.labelTopHeight || 15;\r\n\t this._borderWidth = $active.borderWidth;\r\n\t },\r\n\t defaults: {\r\n\t template: function template$$1(obj, common) {\r\n\t var text = common.$renderInput(obj, common);\r\n\t if (obj.badge) text = text.replace(\"\", \"\" + obj.badge + \"\");\r\n\t return \"
\" + text + \"
\";\r\n\t },\r\n\t label: \"\",\r\n\t borderless: true\r\n\t },\r\n\t $renderInput: function $renderInput(obj) {\r\n\t var css = \"class='webixtype_\" + (obj.type || \"base\") + \"' \";\r\n\t return \"\";\r\n\t },\r\n\t $init: function $init() {\r\n\t this._viewobj.className += \" webix_control webix_el_\" + (this.$cssName || this.name);\r\n\t this.data = this._settings;\r\n\t this._dataobj = this._viewobj;\r\n\t this.$ready.push(function () {\r\n\t this._calc_size(this.config);\r\n\t });\r\n\t },\r\n\t hotkey_setter: function hotkey_setter(key) {\r\n\t var control = this;\r\n\r\n\t this._addElementHotKey(key, function (view, ev) {\r\n\t if (control.isVisible()) {\r\n\t var elem = control.$view.firstChild;\r\n\t triggerEvent(elem, \"MouseEvents\", \"click\");\r\n\t preventEvent(ev);\r\n\t }\r\n\t });\r\n\t },\r\n\t _addElementHotKey: function _addElementHotKey(key, func, view) {\r\n\t var keyCode = UIManager.addHotKey(key, func, view);\r\n\t this.attachEvent(\"onDestruct\", function () {\r\n\t UIManager.removeHotKey(keyCode, func, view);\r\n\t });\r\n\t },\r\n\t tooltip_setter: function tooltip_setter(value) {\r\n\t var box = this._getBox() || this.$view.firstChild;\r\n\t if (box) box.title = value;\r\n\t return value;\r\n\t },\r\n\t type_setter: function type_setter(value) {\r\n\t if (this._types[value]) this.$renderInput = template(this._types[value]);\r\n\t if (value == \"prev\" || value == \"next\") this._set_inner_size = this._set_inner_size_next;else this._set_inner_size = false;\r\n\t return value;\r\n\t },\r\n\t _types: {\r\n\t htmlbutton: \"\",\r\n\t prev: \"
\",\r\n\t next: \"
\",\r\n\t imageButton: \"\",\r\n\t imageButtonTop: \"\",\r\n\t image: \"\",\r\n\t imageTop: \"\",\r\n\t icon: \"\",\r\n\t iconButton: \"\",\r\n\t iconTop: \"\",\r\n\t iconButtonTop: \"\"\r\n\t },\r\n\t _findAllInputs: function _findAllInputs() {\r\n\t var result = [];\r\n\t var tagNames = [\"input\", \"select\", \"textarea\", \"button\"];\r\n\r\n\t for (var i = 0; i < tagNames.length; i++) {\r\n\t var inputs = this.$view.getElementsByTagName(tagNames[i]);\r\n\r\n\t for (var j = 0; j < inputs.length; j++) {\r\n\t result.push(inputs[j]);\r\n\t }\r\n\t }\r\n\r\n\t return result;\r\n\t },\r\n\t disable: function disable() {\r\n\t var i,\r\n\t node,\r\n\t elem = this._getBox();\r\n\r\n\t baseview.api.disable.apply(this, arguments);\r\n\r\n\t if (elem && elem.className.indexOf(\" webix_disabled_box\") == -1) {\r\n\t elem.className += \" webix_disabled_box\";\r\n\r\n\t var inputs = this._findAllInputs();\r\n\r\n\t for (i = 0; i < inputs.length; i++) {\r\n\t inputs[i].setAttribute(\"disabled\", true);\r\n\t } // richselect and based on it\r\n\r\n\r\n\t node = this.getInputNode();\r\n\r\n\t if (node && node.tagName.toLowerCase() == \"div\") {\r\n\t this._disabledTabIndex = node.getAttribute(\"tabIndex\");\r\n\t node.removeAttribute(\"tabIndex\");\r\n\t }\r\n\r\n\t if (this._settings.labelPosition == \"top\") {\r\n\t var label = this._dataobj.firstChild;\r\n\t if (label) label.className += \" webix_disabled_top_label\";\r\n\t }\r\n\t }\r\n\t },\r\n\t enable: function enable() {\r\n\t baseview.api.enable.apply(this, arguments);\r\n\r\n\t var node,\r\n\t elem = this._getBox();\r\n\r\n\t if (elem) {\r\n\t elem.className = elem.className.replace(\" webix_disabled_box\", \"\");\r\n\r\n\t var inputs = this._findAllInputs();\r\n\r\n\t for (var i = 0; i < inputs.length; i++) {\r\n\t inputs[i].removeAttribute(\"disabled\");\r\n\t }\r\n\r\n\t node = this.getInputNode();\r\n\t if (node && !isUndefined(this._disabledTabIndex)) node.setAttribute(\"tabIndex\", this._disabledTabIndex);\r\n\r\n\t if (this._settings.labelPosition == \"top\") {\r\n\t var label = this._dataobj.firstChild;\r\n\t if (label) label.className = label.className.replace(\" webix_disabled_top_label\", \"\");\r\n\t }\r\n\t }\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t value = this.$prepareValue(value);\r\n\t var oldvalue = this._settings.value;\r\n\t if (this.$compareValue(oldvalue, value)) return false;\r\n\t this._settings.value = value;\r\n\t if (this._rendered_input) this.$setValue(value);\r\n\t this.callEvent(\"onChange\", [value, oldvalue]);\r\n\t },\r\n\t $compareValue: function $compareValue(oldvalue, value) {\r\n\t if (typeof value === \"number\") value = value.toString();\r\n\t if (typeof oldvalue === \"number\") oldvalue = oldvalue.toString();\r\n\t return oldvalue == value;\r\n\t },\r\n\t $prepareValue: function $prepareValue(value) {\r\n\t return this._pattern(value, false);\r\n\t },\r\n\t _pattern: function _pattern(value) {\r\n\t return value === 0 ? \"0\" : (value || \"\").toString();\r\n\t },\r\n\t //visual part of setValue\r\n\t $setValue: function $setValue(value) {\r\n\t //\t\tthis._settings.label = value;\r\n\t var node = this.getInputNode();\r\n\r\n\t if (node) {\r\n\t if (node.tagName == \"BUTTON\") node.innerHTML = value;else node.value = value;\r\n\t }\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t //if button was rendered - returning actual value\r\n\t //otherwise - returning last set value\r\n\t var value = this._rendered_input ? this.$getValue() : this._settings.value;\r\n\t return typeof value == \"undefined\" ? \"\" : value;\r\n\t },\r\n\t $getValue: function $getValue() {\r\n\t return this._settings.value || \"\";\r\n\t },\r\n\t focus: function focus() {\r\n\t if (!this._settings.disabled && !this.queryView({\r\n\t disabled: true\r\n\t }, \"parent\")) {\r\n\t var input = this.getInputNode();\r\n\t if (input && input.focus) input.focus();\r\n\t }\r\n\t },\r\n\t blur: function blur() {\r\n\t var input = this.getInputNode();\r\n\t if (input && input.blur) input.blur();\r\n\t },\r\n\t //get input element\r\n\t getInputNode: function getInputNode() {\r\n\t return this._dataobj.getElementsByTagName(\"input\")[0] || this._dataobj.getElementsByTagName(\"button\")[0];\r\n\t },\r\n\t //get top-level sub-container\r\n\t _getBox: function _getBox() {\r\n\t for (var i = 0; i < this._dataobj.childNodes.length; i++) {\r\n\t if (this._dataobj.childNodes[i].className.indexOf(\"webix_el_box\") >= 0) return this._dataobj.childNodes[i];\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t _sqrt_2: Math.sqrt(2),\r\n\t _set_inner_size_next: function _set_inner_size_next() {\r\n\t var cfg = this._settings;\r\n\r\n\t var arrow = this._getBox().childNodes[1];\r\n\r\n\t var button = arrow.previousSibling;\r\n\t var style = cfg.type == \"next\" ? \"right\" : \"left\";\r\n\t var height = cfg.aheight - $active.inputPadding * 2 - 2 * this._borderWidth; //-2 - borders\r\n\r\n\t var arrowEdge = height * this._sqrt_2 / 2;\r\n\t arrow.style.width = arrowEdge + \"px\";\r\n\t arrow.style.height = arrowEdge + \"px\";\r\n\t arrow.style.top = (height - arrowEdge) / 2 + $active.inputPadding + \"px\";\r\n\t arrow.style[style] = (height - arrowEdge) / 2 + this._sqrt_2 / 2 + \"px\";\r\n\t button.style.width = cfg.awidth - height / 2 - 2 + \"px\";\r\n\t button.style.height = height + 2 + \"px\";\r\n\t button.style[style] = height / 2 + 2 + \"px\";\r\n\t button.style.top = $active.inputPadding + \"px\";\r\n\t },\r\n\t _calc_size: function _calc_size(config) {\r\n\t config = config || this._settings;\r\n\t if (config.autowidth) config.width = getTextSize(config.value || config.label || \"\", \"webixbutton\").width + (config.badge ? 15 : 0) + (config.type === \"iconButton\" ? 30 : 0) + (config.type === \"icon\" ? 20 : 0);\r\n\t },\r\n\t _calck_input_size: function _calck_input_size() {\r\n\t //use width for both width and inputWidth settings in clever way\r\n\t //in form, we can define width for some element smaller than for siblings\r\n\t //it will use inputWidth to render the desired view\r\n\t this._input_width = this._settings.inputWidth || (this._content_width - this._settings.width > 2 ? this._settings.width : 0) || this._content_width;\r\n\t this._input_height = this._settings.inputHeight || this._inputHeight || 0;\r\n\t },\r\n\t resize: function resize() {\r\n\t this._calc_size();\r\n\r\n\t return base.api.resize.apply(this, arguments);\r\n\t },\r\n\t render: function render() {\r\n\t this._calck_input_size();\r\n\r\n\t this._settings.awidth = this._input_width || this._content_width;\r\n\t this._settings.aheight = this._input_height || this._content_height; //image button - image width\r\n\r\n\t this._settings.bheight = this._settings.aheight + 2;\r\n\t this._settings.cheight = this._settings.aheight - 2 * $active.inputPadding;\r\n\t this._settings.dheight = this._settings.cheight - 2; // - borders\r\n\r\n\t if (AtomRender.render.call(this)) {\r\n\t this._rendered_input = true;\r\n\t if (this._set_inner_size) this._set_inner_size();\r\n\r\n\t if (this._settings.align) {\r\n\t var handle = this._dataobj.firstChild;\r\n\t if (this._settings.labelPosition == \"top\" && handle.nextSibling) handle = handle.nextSibling;\r\n\r\n\t switch (this._settings.align) {\r\n\t case \"right\":\r\n\t handle.style.cssFloat = \"right\";\r\n\t break;\r\n\r\n\t case \"center\":\r\n\t handle.style.display = \"inline-block\";\r\n\t handle.parentNode.style.textAlign = \"center\";\r\n\t break;\r\n\r\n\t case \"middle\":\r\n\t handle.style.marginTop = Math.round((this._content_height - this._input_height) / 2) + \"px\";\r\n\t break;\r\n\r\n\t case \"bottom\":\r\n\t handle.style.marginTop = this._content_height - this._input_height + \"px\";\r\n\t break;\r\n\r\n\t case \"left\":\r\n\t handle.style.cssFloat = \"left\";\r\n\t break;\r\n\r\n\t default:\r\n\t assert(false, \"Unknown align mode: \" + this._settings.align);\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t if (this.$render) this.$render(this.data);\r\n\t if (this._settings.disabled) this.disable(); // set tooltip after render\r\n\r\n\t if (this._settings.tooltip) this.define(\"tooltip\", this._settings.tooltip);\r\n\r\n\t if (this._init_once) {\r\n\t this._init_once(this.data);\r\n\r\n\t this._init_once = 0;\r\n\t }\r\n\t }\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this.render();\r\n\t },\r\n\t on_click: {\r\n\t _handle_tab_click: function _handle_tab_click(ev) {\r\n\t var id = locate(ev, \"button_id\");\r\n\r\n\t if (id && this.callEvent(\"onBeforeTabClick\", [id, ev])) {\r\n\t this.setValue(id);\r\n\t this.callEvent(\"onAfterTabClick\", [id, ev]);\r\n\t }\r\n\t },\r\n\t webix_all_segments: function webix_all_segments(ev, button) {\r\n\t this.on_click._handle_tab_click.call(this, ev, button);\r\n\t },\r\n\t webix_all_tabs: function webix_all_tabs(ev, button) {\r\n\t this.on_click._handle_tab_click.call(this, ev, button);\r\n\t },\r\n\t webix_inp_counter_next: function webix_inp_counter_next() {\r\n\t if (!this._settings.readonly) this.next();\r\n\t },\r\n\t webix_inp_counter_prev: function webix_inp_counter_prev() {\r\n\t if (!this._settings.readonly) this.prev();\r\n\t },\r\n\t webix_input_icon: function webix_input_icon() {\r\n\t this.getInputNode().focus();\r\n\t },\r\n\t webix_inp_checkbox_border: function webix_inp_checkbox_border(e) {\r\n\t if (!this._settings.disabled && (e.target || e.srcElement).tagName != \"DIV\" && !this._settings.readonly) this.toggle();\r\n\t },\r\n\t webix_inp_checkbox_label: function webix_inp_checkbox_label() {\r\n\t if (!this._settings.readonly) this.toggle();\r\n\t },\r\n\t webix_inp_radio_border: function webix_inp_radio_border(e) {\r\n\t var value = locate(e, \"radio_id\");\r\n\t this.setValue(value);\r\n\t this.focus();\r\n\t },\r\n\t webix_inp_radio_label: function webix_inp_radio_label(e, obj, node) {\r\n\t node = node.parentNode.getElementsByTagName(\"input\")[0];\r\n\t return this.on_click.webix_inp_radio_border.call(this, node, obj, node);\r\n\t },\r\n\t webix_tab_more_icon: function webix_tab_more_icon(ev, obj, node) {\r\n\t this.getPopup().resize();\r\n\t this.getPopup().show(node, null, true);\r\n\t },\r\n\t webix_tab_close: function webix_tab_close(ev) {\r\n\t var id = locate(ev, \"button_id\");\r\n\t if (id && this.callEvent(\"onBeforeTabClose\", [id, ev])) this.removeOption(id);\r\n\t }\r\n\t },\r\n\t //method do not used by button, but used by other child-views\r\n\t _check_options: function _check_options(opts) {\r\n\t assert(opts, this.name + \": options not defined\");\r\n\r\n\t for (var i = 0; i < opts.length; i++) {\r\n\t // asserts need to be removed in final version\t\t\t\r\n\t assert(!opts[i].text, \"Please replace .text with .value in control config\");\r\n\t assert(!opts[i].label, \"Please replace .label with .value in control config\");\r\n\r\n\t if (typeof opts[i] == \"string\") {\r\n\t opts[i] = {\r\n\t id: opts[i],\r\n\t value: opts[i]\r\n\t };\r\n\t } else {\r\n\t if (isUndefined(opts[i].id)) opts[i].id = opts[i].value;\r\n\t if (isUndefined(opts[i].value)) opts[i].value = opts[i].id;\r\n\t }\r\n\t }\r\n\r\n\t return opts;\r\n\t },\r\n\t _get_div_placeholder: function _get_div_placeholder(obj) {\r\n\t var placeholder = obj ? obj.placeholder : this._settings.placeholder;\r\n\t return placeholder ? \"\" + placeholder + \"\" : \"\";\r\n\t }\r\n\t};\r\n\tvar view$C = exports.protoUI(api$C, base.view, AtomRender, Settings, EventSystem);\r\n\tvar button$1 = {\r\n\t api: api$C,\r\n\t view: view$C\r\n\t};\r\n\r\n\tvar api$D = {\r\n\t name: \"label\",\r\n\t defaults: {\r\n\t template: \"
#label#
\"\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.height = $active.inputHeight;\r\n\t },\r\n\t focus: function focus() {\r\n\t return false;\r\n\t },\r\n\t _getBox: function _getBox() {\r\n\t return this._dataobj.firstChild;\r\n\t },\r\n\t setHTML: function setHTML(html) {\r\n\t this._settings.template = function () {\r\n\t return html;\r\n\t };\r\n\r\n\t this.refresh();\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this._settings.label = value;\r\n\t button$1.api.setValue.apply(this, arguments);\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t this._dataobj.firstChild.innerHTML = value;\r\n\t },\r\n\t _set_inner_size: function _set_inner_size() {},\r\n\t _calc_size: function _calc_size(config) {\r\n\t config = config || this._settings;\r\n\t if (config.autowidth) config.width = getTextSize(config.value || config.label, \"webix_el_label\").width;\r\n\t }\r\n\t};\r\n\tvar view$D = exports.protoUI(api$D, button$1.view);\r\n\r\n\tvar controls = {};\r\n\r\n\tfor (var i in UIManager._controls) {\r\n\t controls[UIManager._controls[i]] = i;\r\n\t}\r\n\r\n\tvar nav_controls = {\r\n\t 9: \"tab\",\r\n\t 38: \"up\",\r\n\t 40: \"down\",\r\n\t 37: \"left\",\r\n\t 39: \"right\"\r\n\t};\r\n\tvar TextPattern = {\r\n\t $init: function $init(config) {\r\n\t if (config.pattern || config.format && !this.format_setter) {\r\n\t this.attachEvent(\"onKeyPress\", function (code, e) {\r\n\t if (e.ctrlKey || e.altKey || this._custom_format) return;\r\n\t if (code > 105 && code < 112) //numpad operators\r\n\t code -= 64;\r\n\r\n\t if (controls[code] && code !== 8 && code !== 46) {\r\n\t //del && bsp\r\n\t if (!nav_controls[code]) preventEvent(e);\r\n\t return;\r\n\t }\r\n\r\n\t preventEvent(e);\r\n\r\n\t this._on_key_pressed(e, code);\r\n\t });\r\n\t this.attachEvent(\"onAfterRender\", this._after_render);\r\n\r\n\t this.getText = function () {\r\n\t return this.getInputNode().value;\r\n\t };\r\n\r\n\t this._pattern = function (value, mode) {\r\n\t if (mode === false) return this._getRawValue(value);else return this._matchPattern(value);\r\n\t };\r\n\r\n\t if (config.format) {\r\n\t if (_typeof(config.format) === \"object\") {\r\n\t this._custom_format = config.format;\r\n\t } else {\r\n\t var format = Number.getConfig(config.format);\r\n\t this._custom_format = {\r\n\t parse: function parse(value) {\r\n\t return Number.parse(value, format);\r\n\t },\r\n\t edit: function edit(value) {\r\n\t return Number.format(value, format);\r\n\t }\r\n\t };\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t pattern_setter: function pattern_setter(value) {\r\n\t var pattern = patterns[value] || value;\r\n\t if (typeof pattern == \"string\") pattern = {\r\n\t mask: pattern\r\n\t };\r\n\t pattern.allow = pattern.allow || /[A-Za-z0-9]/g;\r\n\r\n\t this._patternScheme(pattern);\r\n\r\n\t return pattern;\r\n\t },\r\n\t _init_validation: function _init_validation() {\r\n\t this.config.validate = this.config.validate || bind(function () {\r\n\t var value = this.getText();\r\n\t var raw = value.replace(this._pattern_chars, \"\");\r\n\t var matches = (value.toString().match(this._pattern_allows) || []).join(\"\");\r\n\t return matches.length == raw.length && value.length == this._settings.pattern.mask.length;\r\n\t }, this);\r\n\t },\r\n\t _after_render: function _after_render() {\r\n\t var ev = env.isIE8 ? \"propertychange\" : \"input\";\r\n\t if (!this._custom_format) _event(this.getInputNode(), ev, function () {\r\n\t var stamp = new Date().valueOf(); //dark ie8 magic\r\n\r\n\t var width = this.$view.offsetWidth; //eslint-disable-line\r\n\r\n\t if (!this._property_stamp || stamp - this._property_stamp > 100) {\r\n\t this._property_stamp = stamp;\r\n\t this.$setValue(this.getText());\r\n\t }\r\n\t }, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(this.getInputNode(), \"blur\", function () {\r\n\t this._applyChanges();\r\n\t }, {\r\n\t bind: this\r\n\t });\r\n\t },\r\n\t _patternScheme: function _patternScheme(pattern) {\r\n\t var mask = pattern.mask,\r\n\t scheme = {},\r\n\t chars = \"\",\r\n\t count = 0;\r\n\r\n\t for (var i = 0; i < mask.length; i++) {\r\n\t if (mask[i] === \"#\") {\r\n\t scheme[i] = count;\r\n\t count++;\r\n\t } else {\r\n\t scheme[i] = false;\r\n\t if (chars.indexOf(mask[i]) === -1) chars += \"\\\\\" + mask[i];\r\n\t }\r\n\t }\r\n\r\n\t this._pattern_allows = pattern.allow;\r\n\t this._pattern_chars = new RegExp(\"[\" + chars + \"]\", \"g\");\r\n\t this._pattern_scheme = scheme;\r\n\r\n\t this._init_validation();\r\n\t },\r\n\t _on_key_pressed: function _on_key_pressed(e, code) {\r\n\t var node = this.getInputNode();\r\n\t var value = node.value;\r\n\t var pos$$1 = getSelectionRange(node);\r\n\t var chr = \"\";\r\n\r\n\t if (code == 8 || code == 46) {\r\n\t if (pos$$1.start == pos$$1.end) {\r\n\t if (code == 8) pos$$1.start--;else pos$$1.end++;\r\n\t }\r\n\t } else {\r\n\t chr = String.fromCharCode(code);\r\n\t if (!e.shiftKey) chr = chr.toLowerCase();\r\n\t }\r\n\r\n\t value = value.substr(0, pos$$1.start) + chr + value.substr(pos$$1.end);\r\n\t pos$$1 = this._getCaretPos(chr, value.length, pos$$1.start, code);\r\n\t this._input_code = code;\r\n\t this.$setValue(value);\r\n\t setSelectionRange(node, pos$$1);\r\n\t },\r\n\t _getCaretPos: function _getCaretPos(chr, len, pos$$1, code) {\r\n\t if (chr && chr.match(this._pattern_allows) || code == 8 || code == 46) {\r\n\t pos$$1 = chr ? pos$$1 + 1 : pos$$1;\r\n\t pos$$1 = this._fixCaretPos(pos$$1, code);\r\n\t } else if (len - 1 == pos$$1 && code !== 8 && code !== 46) {\r\n\t var rest = this._settings.pattern.mask.indexOf(\"#\", pos$$1);\r\n\r\n\t if (rest > 0) pos$$1 += rest;\r\n\t }\r\n\r\n\t return pos$$1;\r\n\t },\r\n\t _fixCaretPos: function _fixCaretPos(pos$$1, code) {\r\n\t var prev = pos$$1 - (code !== 46) * 1;\r\n\r\n\t if (this._pattern_scheme[prev] === false) {\r\n\t pos$$1 = pos$$1 + (code == 8 ? -1 : 1);\r\n\t return this._fixCaretPos(pos$$1, code);\r\n\t }\r\n\r\n\t if (this._pattern_scheme[pos$$1] === false && code !== 8) return this._fixCaretPos(pos$$1 + 1, code) - 1;\r\n\t return pos$$1;\r\n\t },\r\n\t _getRawValue: function _getRawValue(value) {\r\n\t if (this._custom_format) return this._custom_format.parse(value);\r\n\t value = value || \"\";\r\n\t var matches = value.toString().match(this._pattern_allows) || [];\r\n\t return matches.join(\"\").replace(this._pattern_chars, \"\");\r\n\t },\r\n\t _matchPattern: function _matchPattern(value) {\r\n\t if (this._custom_format) return this._custom_format.edit(this._custom_format.parse(value));\r\n\r\n\t var raw = this._getRawValue(value),\r\n\t pattern = this._settings.pattern.mask,\r\n\t mask = this._settings.pattern.mask,\r\n\t scheme = this._pattern_scheme,\r\n\t end = false,\r\n\t index$$1 = 0,\r\n\t rawIndex = 0,\r\n\t rawLength = 0;\r\n\r\n\t for (var i in scheme) {\r\n\t if (scheme[i] !== false) {\r\n\t if (!end) {\r\n\t index$$1 = i * 1;\r\n\t rawIndex = scheme[i];\r\n\t var rchar = raw[rawIndex] || \"\";\r\n\t var next = raw[rawIndex + 1];\r\n\t pattern = (rchar ? pattern.substr(0, index$$1) : \"\") + rchar + (rchar && next ? pattern.substr(index$$1 + 1) : \"\");\r\n\t if (!next) end = true;\r\n\t }\r\n\r\n\t rawLength++;\r\n\t }\r\n\t } //finalize value with subsequent mask chars \r\n\r\n\r\n\t var icode = this._input_code;\r\n\r\n\t if (icode && icode !== 8 || !icode && rawLength - 1 === rawIndex && pattern.length < mask.length) {\r\n\t if (raw) {\r\n\t var nind = index$$1 + 1;\r\n\r\n\t if (mask.charAt(nind) !== \"#\" && pattern.length < mask.length) {\r\n\t var lind = mask.indexOf(\"#\", nind);\r\n\t if (lind < 0) lind = mask.length;\r\n\t pattern += mask.substr(nind, lind - nind);\r\n\t }\r\n\t } else if (icode !== 46) {\r\n\t pattern += mask.substr(0, mask.indexOf(\"#\"));\r\n\t }\r\n\t }\r\n\r\n\t this._input_code = null;\r\n\t return pattern;\r\n\t }\r\n\t};\r\n\r\n\tvar api$E = {\r\n\t name: \"text\",\r\n\t $allowsClear: true,\r\n\t _init_onchange: function _init_onchange() {\r\n\t if (this.$allowsClear) {\r\n\t //attach onChange handler only for controls which do not manage blur on their own\r\n\t //for example - combo\r\n\t if (!this._onBlur) _event(this.getInputNode(), \"change\", this._applyChanges, {\r\n\t bind: this\r\n\t });\r\n\t if (this._settings.suggest) $$(this._settings.suggest).linkInput(this);\r\n\t }\r\n\t },\r\n\t _applyChanges: function _applyChanges() {\r\n\t var newvalue = this.getValue();\r\n\t if (newvalue != this._settings.value) this.setValue(newvalue, true);else if (this._custom_format) {\r\n\t //controls with post formating, we need to repaint value\r\n\t this.$setValue(newvalue);\r\n\t }\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.height = $active.inputHeight;\r\n\t this.defaults.inputPadding = $active.inputPadding;\r\n\t this._inputSpacing = $active.inputSpacing;\r\n\t },\r\n\t $init: function $init(config) {\r\n\t if (config.labelPosition == \"top\") if (isUndefined(config.height) && this.defaults.height) // textarea\r\n\t config.height = this.defaults.height + this._labelTopHeight; //suggest reference for destructor\r\n\r\n\t this._destroy_with_me = [];\r\n\t this.attachEvent(\"onAfterRender\", this._init_onchange);\r\n\t this.attachEvent(\"onBlur\", function () {\r\n\t if (this._onBlur) this._onBlur();\r\n\t });\r\n\t },\r\n\t $renderIcon: function $renderIcon() {\r\n\t var config = this._settings;\r\n\r\n\t if (config.icon) {\r\n\t var height = config.aheight - 2 * config.inputPadding,\r\n\t padding = (height - 18) / 2 - 1,\r\n\t aria = this.addSection ? \"role='button' tabindex='0' aria-label='\" + i18n.aria[\"multitext\" + (config.mode || \"\") + \"Section\"] + \"'\" : \"\";\r\n\t return \"\";\r\n\t }\r\n\r\n\t return \"\";\r\n\t },\r\n\t relatedView_setter: function relatedView_setter(value) {\r\n\t this.attachEvent(\"onChange\", function () {\r\n\t var value = this.getValue();\r\n\t var mode = this._settings.relatedAction;\r\n\t var viewid = this._settings.relatedView;\r\n\t var view = $$(viewid);\r\n\r\n\t if (!view) {\r\n\t var top = this.getTopParentView();\r\n\t if (top && top.$$) view = top.$$(viewid);\r\n\t }\r\n\r\n\t assert(view, \"Invalid relatedView: \" + viewid);\r\n\r\n\t if (mode == \"enable\") {\r\n\t if (value) view.enable();else view.disable();\r\n\t } else {\r\n\t if (value) view.show();else view.hide();\r\n\t }\r\n\t });\r\n\t return value;\r\n\t },\r\n\t validateEvent_setter: function validateEvent_setter(value) {\r\n\t if (value == \"blur\") this.attachEvent(\"onBlur\", this.validate);\r\n\t if (value == \"key\") this.attachEvent(\"onTimedKeyPress\", this.validate);\r\n\t return value;\r\n\t },\r\n\t validate: function validate() {\r\n\t var rule = this._settings.validate;\r\n\t if (!rule && this._settings.required) rule = rules.isNotEmpty;\r\n\t var form = this.getFormView();\r\n\t var name = this._settings.name;\r\n\t var value = this.getValue();\r\n\t var data = {};\r\n\t data[name] = value;\r\n\t assert(form, \"Validation works only for fields in the form\");\r\n\t assert(name, \"Validation works only for fields with name\");\r\n\t if (rule && !form._validate(rule, value, data, name)) return false;\r\n\t return true;\r\n\t },\r\n\t bottomLabel_setter: function bottomLabel_setter(value) {\r\n\t if (!this._settings.bottomPadding) this._settings.bottomPadding = 18;\r\n\t return value;\r\n\t },\r\n\t _getInvalidText: function _getInvalidText() {\r\n\t var text = this._settings.invalidMessage;\r\n\r\n\t if (typeof text == \"function\") {\r\n\t text.call(this);\r\n\t }\r\n\r\n\t return text;\r\n\t },\r\n\t setBottomText: function setBottomText(text, height) {\r\n\t var config = this._settings;\r\n\r\n\t if (typeof text != \"undefined\") {\r\n\t if (config.bottomLabel == text) return;\r\n\t config.bottomLabel = text;\r\n\t }\r\n\r\n\t var message = (config.invalid ? config.invalidMessage : \"\") || config.bottomLabel;\r\n\t if (!message && !config.bottomPadding) config.inputHeight = 0;\r\n\r\n\t if (message && !config.bottomPadding) {\r\n\t this._restorePadding = 1;\r\n\t config.bottomPadding = config.bottomPadding || height || 18;\r\n\t this.render();\r\n\t this.resize();\r\n\t } else if (!message && this._restorePadding) {\r\n\t config.bottomPadding = this._restorePadding = 0; //textarea\r\n\r\n\t if (!config.height) this.render();\r\n\t this.resize();\r\n\t } else this.render();\r\n\t },\r\n\t $getSize: function $getSize() {\r\n\t var sizes = base.api.$getSize.apply(this, arguments);\r\n\t var heightInc = this.config.bottomPadding;\r\n\r\n\t if (heightInc) {\r\n\t sizes[2] += heightInc;\r\n\t sizes[3] += heightInc;\r\n\t }\r\n\r\n\t return sizes;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t var config = this._settings;\r\n\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t if (!x || !y) return;\r\n\r\n\t if (config.labelPosition == \"top\") {\r\n\t // textarea\r\n\t if (!config.inputHeight) this._inputHeight = this._content_height - this._labelTopHeight - (this.config.bottomPadding || 0);\r\n\t config.labelWidth = 0;\r\n\t } else if (config.bottomPadding) {\r\n\t config.inputHeight = this._content_height - this.config.bottomPadding;\r\n\t }\r\n\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t _get_input_width: function _get_input_width(config) {\r\n\t var width = (this._input_width || 0) - (config.label ? this._settings.labelWidth : 0) - this._inputSpacing - (config.iconWidth || 0); //prevent js error in IE\r\n\r\n\t return width < 0 ? 0 : width;\r\n\t },\r\n\t _render_div_block: function _render_div_block(obj, common) {\r\n\t var id = \"x\" + uid();\r\n\r\n\t var width = common._get_input_width(obj);\r\n\r\n\t var inputAlign = obj.inputAlign || \"left\";\r\n\t var height = this._settings.aheight - 2 * $active.inputPadding - 2 * this._borderWidth;\r\n\r\n\t var text = obj.text || obj.value || this._get_div_placeholder(obj);\r\n\r\n\t var html = \"
\" + text + \"
\";\r\n\t return common.$renderInput(obj, html, id);\r\n\t },\r\n\t _baseInputHTML: function _baseInputHTML(tag) {\r\n\t var html = \"<\" + tag + (this._settings.placeholder ? \" placeholder='\" + this._settings.placeholder + \"' \" : \" \");\r\n\t if (this._settings.readonly) html += \"readonly='true' aria-readonly=''\";\r\n\t if (this._settings.required) html += \"aria-required='true'\";\r\n\t if (this._settings.invalid) html += \"aria-invalid='true'\";\r\n\t var attrs = this._settings.attributes;\r\n\t if (attrs) for (var prop in attrs) {\r\n\t html += prop + \"='\" + attrs[prop] + \"' \";\r\n\t }\r\n\t return html;\r\n\t },\r\n\t $renderLabel: function $renderLabel(config, id) {\r\n\t var labelAlign = config.labelAlign || \"left\";\r\n\t var top = this._settings.labelPosition == \"top\";\r\n\t var labelTop = top ? \"display:block;\" : \"width: \" + this._settings.labelWidth + \"px;\";\r\n\t var label = \"\";\r\n\t var labelHeight = top ? this._labelTopHeight - 2 * this._borderWidth : this._settings.aheight - 2 * this._settings.inputPadding;\r\n\t if (config.label) label = \"\";\r\n\t return label;\r\n\t },\r\n\t $renderInput: function $renderInput(config, div_start, id) {\r\n\t var inputAlign = config.inputAlign || \"left\";\r\n\t var top = config.labelPosition == \"top\";\r\n\r\n\t var inputWidth = this._get_input_width(config);\r\n\r\n\t id = id || uid();\r\n\t var label = this.$renderLabel(config, id);\r\n\t var html = \"\";\r\n\r\n\t if (div_start) {\r\n\t html += div_start;\r\n\t } else {\r\n\t var value = template.escape(config.text || this._pattern(config.value));\r\n\t html += this._baseInputHTML(\"input\") + \"id='\" + id + \"' type='\" + (config.type || this.name) + \"'\" + (config.editable ? \" role='combobox'\" : \"\") + \" value='\" + value + \"' style='width: \" + inputWidth + \"px; text-align: \" + inputAlign + \";'\";\r\n\t var attrs = config.attributes;\r\n\t if (attrs) for (var prop in attrs) {\r\n\t html += \" \" + prop + \"='\" + attrs[prop] + \"'\";\r\n\t }\r\n\t html += \" />\";\r\n\t }\r\n\r\n\t var icon = this.$renderIcon ? this.$renderIcon(config) : \"\";\r\n\t html += icon;\r\n\t var result = \"\"; //label position, top or left\r\n\r\n\t if (top) result = label + \"
\" + html + \"
\";else result = \"
\" + label + html + \"
\"; //bottom message width\r\n\r\n\t var padding = config.awidth - inputWidth - $active.inputPadding * 2; //bottom message text\r\n\r\n\t var message = (config.invalid ? config.invalidMessage : \"\") || config.bottomLabel;\r\n\t if (message) result += \"
\" + message + \"
\";\r\n\t return result;\r\n\t },\r\n\t defaults: {\r\n\t template: function template$$1(obj, common) {\r\n\t return common.$renderInput(obj);\r\n\t },\r\n\t label: \"\",\r\n\t labelWidth: 80\r\n\t },\r\n\t type_setter: function type_setter(value) {\r\n\t return value;\r\n\t },\r\n\t _set_inner_size: false,\r\n\t $setValue: function $setValue(value) {\r\n\t this.getInputNode().value = this._pattern(value);\r\n\t },\r\n\t $getValue: function $getValue() {\r\n\t return this._pattern(this.getInputNode().value, false);\r\n\t },\r\n\t suggest_setter: function suggest_setter(value) {\r\n\t if (value) {\r\n\t assert(value !== true, \"suggest options can't be set as true, data need to be provided instead\");\r\n\r\n\t if (typeof value == \"string\") {\r\n\t var attempt = $$(value);\r\n\t if (attempt) return $$(value)._settings.id;\r\n\t value = {\r\n\t body: {\r\n\t url: value,\r\n\t dataFeed: value\r\n\t }\r\n\t };\r\n\t } else if (value.getItem) value = {\r\n\t body: {\r\n\t data: value\r\n\t }\r\n\t };else if (isArray(value)) value = {\r\n\t body: {\r\n\t data: this._check_options(value)\r\n\t }\r\n\t };else if (!value.body) value.body = {};\r\n\r\n\t exports.extend(value, {\r\n\t view: \"suggest\"\r\n\t });\r\n\t var view = ui(value);\r\n\r\n\t this._destroy_with_me.push(view);\r\n\r\n\t return view._settings.id;\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\t};\r\n\tvar view$E = exports.protoUI(api$E, TextPattern, button$1.view);\r\n\tvar text = {\r\n\t api: api$E,\r\n\t view: view$E\r\n\t};\r\n\r\n\tvar DataCollection = exports.proto({\r\n\t name: \"DataCollection\",\r\n\t isVisible: function isVisible() {\r\n\t if (!this.data.order.length && !this.data._filter_order && !this._settings.dataFeed) return false;\r\n\t return true;\r\n\t },\r\n\t $init: function $init(config) {\r\n\t this.data.provideApi(this, true);\r\n\t var id = config && config.id ? config.id : uid();\r\n\t this._settings.id = id;\r\n\t ui.views[id] = this;\r\n\t this.data.attachEvent(\"onStoreLoad\", bind(function () {\r\n\t this.callEvent(\"onBindRequest\", []);\r\n\t }, this));\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this.callEvent(\"onBindRequest\", []);\r\n\t }\r\n\t}, DataMove, CollectionBind, BindSource, ValidateCollection, DataLoader, MapCollection, EventSystem, BaseBind, Destruction, Settings);\r\n\tdefine(\"DataCollection\", DataCollection);\r\n\r\n\tvar api$F = {\r\n\t name: \"select\",\r\n\t defaults: {\r\n\t template: function template(obj, common) {\r\n\t var options = common._check_options(obj.options);\r\n\r\n\t var id = \"x\" + uid();\r\n\t var html = common._baseInputHTML(\"select\") + \"id='\" + id + \"' style='width:\" + common._get_input_width(obj) + \"px;'>\";\r\n\t var optview = $$(options);\r\n\r\n\t if (optview && optview.data && optview.data.each) {\r\n\t optview.data.each(function (option) {\r\n\t html += \"\" + option.value + \"\";\r\n\t });\r\n\t } else for (var i = 0; i < options.length; i++) {\r\n\t html += \"\" + options[i].value + \"\";\r\n\t }\r\n\r\n\t html += \"\";\r\n\t return common.$renderInput(obj, html, id);\r\n\t }\r\n\t },\r\n\t options_setter: function options_setter(value) {\r\n\t if (value) {\r\n\t if (typeof value == \"string\") {\r\n\t var collection = new DataCollection({\r\n\t url: value\r\n\t });\r\n\t collection.data.attachEvent(\"onStoreLoad\", bind(this.refresh, this));\r\n\t return collection;\r\n\t } else return value;\r\n\t }\r\n\t },\r\n\t //get input element\r\n\t getInputNode: function getInputNode() {\r\n\t return this._dataobj.getElementsByTagName(\"select\")[0];\r\n\t }\r\n\t};\r\n\tvar view$F = exports.protoUI(api$F, text.view);\r\n\r\n\tvar api$G = {\r\n\t name: \"checkbox\",\r\n\t defaults: {\r\n\t checkValue: 1,\r\n\t uncheckValue: 0,\r\n\t template: function template$$1(config, common) {\r\n\t var id = \"x\" + uid();\r\n\t var rightlabel = \"\";\r\n\r\n\t if (config.labelRight) {\r\n\t rightlabel = \"\"; //user clearly attempts to hide the label, help him\r\n\r\n\t if (config.labelWidth) config.label = config.label || \" \";\r\n\t }\r\n\r\n\t var checked = config.checkValue == config.value;\r\n\t var margin = Math.floor((common._settings.aheight - 16) / 2);\r\n\t var ch = common._baseInputHTML(\"input\") + \"style='margin-top:\" + margin + \"px;\" + (config.customCheckbox ? \"display:none\" : \"\") + \"' id='\" + id + \"' type='checkbox' \" + (checked ? \"checked='1'\" : \"\") + (config.labelRight ? \" aria-label='\" + template.escape(config.labelRight) + \"'\" : \"\") + \"/>\";\r\n\t var className = \"webix_inp_checkbox_border webix_el_group webix_checkbox_\" + (checked ? \"1\" : \"0\");\r\n\t var customCheckbox = config.customCheckbox || \"\";\r\n\r\n\t if (customCheckbox) {\r\n\t customCheckbox = customCheckbox.replace(/(aria-checked=')\\w*(?=')/, \"$1\" + (config.value == config.checkValue ? \"true\" : \"false\"));\r\n\t customCheckbox = customCheckbox.replace(/(aria-label=')\\w*(?=')/, \"$1\" + template.escape(config.labelRight || config.label));\r\n\t customCheckbox = customCheckbox.replace(/(aria-invalid=')\\w*(?=')/, \"$1\" + (config.invalid ? \"true\" : \"false\"));\r\n\t }\r\n\r\n\t var html = \"
\" + ch + customCheckbox + rightlabel + \"
\";\r\n\t return common.$renderInput(config, html, id);\r\n\t }\r\n\t },\r\n\t customCheckbox_setter: function customCheckbox_setter(value) {\r\n\t if (value === true && $active.customCheckbox) {\r\n\t value = \"\";\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t blur: function blur() {\r\n\t var input = this.getInputNode();\r\n\t if (input) input.blur();\r\n\t },\r\n\t _pattern: function _pattern(value) {\r\n\t return value;\r\n\t },\r\n\t _init_onchange: function _init_onchange() {},\r\n\t $setValue: function $setValue(value) {\r\n\t var isChecked = value == this._settings.checkValue;\r\n\t var input = this.$view.getElementsByTagName(\"input\")[0];\r\n\t var parentNode = input ? input.parentNode : null;\r\n\r\n\t if (parentNode && this._settings.customCheckbox) {\r\n\t var button = parentNode.getElementsByTagName(\"BUTTON\");\r\n\t if (button[0]) button[0].setAttribute(\"aria-checked\", isChecked ? \"true\" : \"false\");\r\n\t }\r\n\r\n\t if (parentNode) {\r\n\t parentNode.className = parentNode.className.replace(/(webix_checkbox_)\\d/, \"$1\" + (isChecked ? 1 : 0));\r\n\t }\r\n\r\n\t input.checked = isChecked;\r\n\t },\r\n\t toggle: function toggle() {\r\n\t var value = this.getValue() != this._settings.checkValue ? this._settings.checkValue : this._settings.uncheckValue;\r\n\t this.setValue(value);\r\n\t },\r\n\t getValue: function getValue() {\r\n\t var value = this._settings.value;\r\n\t return value == this._settings.checkValue ? this._settings.checkValue : this._settings.uncheckValue;\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this.$view.getElementsByTagName(this._settings.customCheckbox ? \"button\" : \"input\")[0];\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.customCheckbox = !!$active.customCheckbox;\r\n\t }\r\n\t};\r\n\tvar view$G = exports.protoUI(api$G, text.view);\r\n\tvar checkbox = {\r\n\t api: api$G,\r\n\t view: view$G\r\n\t};\r\n\r\n\tvar api$H = {\r\n\t name: \"radio\",\r\n\t defaults: {\r\n\t template: function template$$1(config, common) {\r\n\t var options = common._check_options(config.options);\r\n\r\n\t var html = [];\r\n\t var id;\r\n\r\n\t for (var i = 0; i < options.length; i++) {\r\n\t var eachid = \"x\" + uid();\r\n\t id = id || eachid;\r\n\t if (i && (options[i].newline || config.vertical)) html.push(\"
\");\r\n\t var isChecked = options[i].id == config.value;\r\n\t var label = options[i].value || \"\";\r\n\t var customRadio = config.customRadio || \"\";\r\n\r\n\t if (customRadio) {\r\n\t var optlabel = (i === 0 ? config.label + \" \" : \"\") + label;\r\n\t customRadio = customRadio.replace(/(aria-label=')\\w*(?=')/, \"$1\" + template.escape(optlabel));\r\n\t customRadio = customRadio.replace(/(aria-checked=')\\w*(?=')/, \"$1\" + (isChecked ? \"true\" : \"false\"));\r\n\t customRadio = customRadio.replace(/(tabindex=')\\w*(?=')/, \"$1\" + (isChecked || i === 0 && !config.value ? \"0\" : \"-1\"));\r\n\t customRadio = customRadio.replace(/(aria-invalid=')\\w*(?=')/, \"$1\" + (config.invalid ? \"true\" : \"false\"));\r\n\t customRadio = customRadio.replace(/(button_id=')\\w*(?=')/, \"$1\" + options[i].id);\r\n\t }\r\n\r\n\t var rd = common._baseInputHTML(\"input\") + \" name='\" + (config.name || config.id) + \"' type='radio' \" + (isChecked ? \"checked='1'\" : \"\") + \"tabindex=\" + (isChecked || i === 0 && !config.value ? \"0\" : \"-1\") + \" value='\" + options[i].id + \"' id='\" + eachid + \"' style='\" + (customRadio ? \"display:none\" : \"\") + \"' />\";\r\n\t var input = \"\";\r\n\t if (label) label = \"\";\r\n\t html.push(\"\");\r\n\t }\r\n\r\n\t html = \"
\" + html.join(\"\") + \"
\";\r\n\t return common.$renderInput(config, html, id);\r\n\t }\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this.render();\r\n\t if (this._last_size && this.$getSize(0, 0)[2] != this._last_size[1]) this.resize();\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var size = button$1.api.$getSize.call(this, dx, dy);\r\n\r\n\t if (this._settings.options) {\r\n\t var count = this._settings.vertical ? 0 : 1;\r\n\r\n\t for (var i = 0; i < this._settings.options.length; i++) {\r\n\t if (this._settings.vertical || this._settings.options[i].newline) count++;\r\n\t }\r\n\r\n\t size[3] = size[2] = Math.max(size[2], (this._settings.optionHeight || 25) * count + this._settings.inputPadding * 2 + (this._settings.labelPosition == \"top\" ? this._labelTopHeight : 0));\r\n\t }\r\n\r\n\t var heightInc = this.config.bottomPadding;\r\n\r\n\t if (heightInc) {\r\n\t size[2] += heightInc;\r\n\t size[3] += heightInc;\r\n\t }\r\n\r\n\t return size;\r\n\t },\r\n\t _getInputNode: function _getInputNode() {\r\n\t return this._dataobj.getElementsByTagName(this._settings.customRadio ? \"button\" : \"input\");\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t var inp = this._dataobj.getElementsByTagName(\"input\");\r\n\r\n\t for (var i = 0; i < inp.length; i++) {\r\n\t if (inp[i].parentNode.getAttribute(\"radio_id\") == value) {\r\n\t inp[i].checked = true;\r\n\t inp[i].setAttribute(\"tabindex\", \"0\");\r\n\t } else {\r\n\t inp[i].checked = false;\r\n\t inp[i].setAttribute(\"tabindex\", \"-1\");\r\n\t }\r\n\r\n\t var parentNode = inp[i] ? inp[i].parentNode : null;\r\n\r\n\t if (parentNode) {\r\n\t parentNode.className = parentNode.className.replace(/(webix_radio_)\\d/, \"$1\" + (inp[i].checked ? 1 : 0));\r\n\r\n\t if (this._settings.customRadio) {\r\n\t var button = parentNode.getElementsByTagName(\"BUTTON\");\r\n\r\n\t if (button[0]) {\r\n\t button[0].setAttribute(\"aria-checked\", inp[i].checked ? \"true\" : \"false\");\r\n\t button[0].setAttribute(\"tabindex\", inp[i].checked ? \"0\" : \"-1\");\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this._settings.value;\r\n\t },\r\n\t focus: function focus() {\r\n\t this._focus();\r\n\t },\r\n\t blur: function blur() {\r\n\t this._blur();\r\n\t },\r\n\t customRadio_setter: function customRadio_setter(value) {\r\n\t if (value === true && $active.customRadio) value = \"\";\r\n\t return value;\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.customRadio = !!$active.customRadio;\r\n\t if ($active.optionHeight) this.defaults.optionHeight = $active.optionHeight;\r\n\t }\r\n\t};\r\n\tvar view$H = exports.protoUI(api$H, HTMLOptions, text.view);\r\n\r\n\tvar api$I = {\r\n\t name: \"datepicker\",\r\n\t $init: function $init() {\r\n\t this.$ready.push(this._init_popup);\r\n\t },\r\n\t defaults: {\r\n\t template: function template(obj, common) {\r\n\t if (common._settings.type == \"time\") {\r\n\t common._settings.icon = common._settings.timeIcon;\r\n\t } //temporary remove obj.type [[DIRTY]]\r\n\r\n\r\n\t var t = obj.type;\r\n\t obj.type = \"\";\r\n\t var res = obj.editable ? common.$renderInput(obj) : common._render_div_block(obj, common);\r\n\t obj.type = t;\r\n\t return res;\r\n\t },\r\n\t stringResult: false,\r\n\t timepicker: false,\r\n\t icon: \"wxi-calendar\",\r\n\t icons: true,\r\n\t timeIcon: \"wxi-clock\",\r\n\t separator: \", \"\r\n\t },\r\n\t _onBlur: function _onBlur() {\r\n\t if (this._settings.text == this.getText() || isUndefined(this._settings.text) && !this.getText()) return;\r\n\t var value = this.getPopup().getValue();\r\n\t if (value) this.setValue(value);\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.inputPadding = $active.inputPadding;\r\n\t this.defaults.point = !$active.popupNoPoint;\r\n\t },\r\n\t getPopup: function getPopup() {\r\n\t return $$(this._settings.popup);\r\n\t },\r\n\t _init_popup: function _init_popup() {\r\n\t var obj = this._settings;\r\n\t if (obj.suggest) obj.popup = obj.suggest;else if (!obj.popup) {\r\n\t var timepicker = this._settings.timepicker;\r\n\t obj.popup = obj.suggest = this.suggest_setter({\r\n\t type: \"calendar\",\r\n\t point: this._settings.point === false ? false : true,\r\n\t padding: 0,\r\n\t body: {\r\n\t height: 240 + (timepicker || this._settings.icons ? 30 : 0),\r\n\t width: 250,\r\n\t multiselect: this._settings.multiselect,\r\n\t timepicker: timepicker,\r\n\t type: this._settings.type,\r\n\t icons: this._settings.icons,\r\n\t timeIcon: this._settings.timeIcon\r\n\t }\r\n\t });\r\n\t }\r\n\r\n\t this._init_once = function () {};\r\n\t },\r\n\t $render: function $render(obj) {\r\n\t if (isUndefined(obj.value)) return;\r\n\t obj.value = this.$prepareValue(obj.value);\r\n\t this.$setValue(obj.value);\r\n\t },\r\n\t $prepareValue: function $prepareValue(value) {\r\n\t if (this._settings.multiselect) {\r\n\t if (typeof value === \"string\") value = value.split(this._settings.separator);else if (value instanceof Date) {\r\n\t value = [value];\r\n\t } else if (!value) {\r\n\t value = [];\r\n\t }\r\n\r\n\t for (var i = 0; i < value.length; i++) {\r\n\t value[i] = this._prepareSingleValue(value[i]);\r\n\t }\r\n\r\n\t return value;\r\n\t } else {\r\n\t return this._prepareSingleValue(value);\r\n\t }\r\n\t },\r\n\t _prepareSingleValue: function _prepareSingleValue(value) {\r\n\t var type = this._settings.type;\r\n\t var timeMode = type == \"time\"; //setValue(\"1980-12-25\")\r\n\r\n\t if (!isNaN(parseFloat(value))) value = \"\" + value;\r\n\r\n\t if (typeof value == \"string\" && value) {\r\n\t var formatDate = null;\r\n\r\n\t if ((type == \"month\" || type == \"year\") && this._formatDate) {\r\n\t formatDate = this._formatDate;\r\n\t } else formatDate = timeMode ? i18n.parseTimeFormatDate : i18n.parseFormatDate;\r\n\r\n\t value = formatDate(value);\r\n\t }\r\n\r\n\t if (value) {\r\n\t //time mode\r\n\t if (timeMode) {\r\n\t //setValue([16,24])\r\n\t if (isArray(value)) {\r\n\t var time = new Date();\r\n\t time.setHours(value[0]);\r\n\t time.setMinutes(value[1]);\r\n\t value = time;\r\n\t }\r\n\t } //setValue(invalid date)\r\n\r\n\r\n\t if (isNaN(value.getTime())) value = \"\";\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t _get_visible_text: function _get_visible_text(value) {\r\n\t if (this._settings.multiselect) {\r\n\t return [].concat(value).map(function (a) {\r\n\t return this._get_visible_text_single(a);\r\n\t }.bind(this)).join(this.config.separator);\r\n\t } else return this._get_visible_text_single(value);\r\n\t },\r\n\t _get_visible_text_single: function _get_visible_text_single(value) {\r\n\t var timeMode = this._settings.type == \"time\";\r\n\t var timepicker = this.config.timepicker;\r\n\t var formatStr = this._formatStr || (timeMode ? i18n.timeFormatStr : timepicker ? i18n.fullDateFormatStr : i18n.dateFormatStr);\r\n\t return formatStr(value);\r\n\t },\r\n\t _set_visible_text: function _set_visible_text() {\r\n\t var node = this.getInputNode();\r\n\r\n\t if (node.value == undefined) {\r\n\t node.innerHTML = this._settings.text || this._get_div_placeholder();\r\n\t } else {\r\n\t node.value = this._settings.text || \"\";\r\n\t }\r\n\t },\r\n\t $compareValue: function $compareValue(oldvalue, value) {\r\n\t if (!oldvalue && !value) return true;\r\n\t return wDate.equal(oldvalue, value);\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t this._settings.text = value ? this._get_visible_text(value) : \"\";\r\n\r\n\t this._set_visible_text();\r\n\t },\r\n\t format_setter: function format_setter(value) {\r\n\t if (value) {\r\n\t if (typeof value === \"function\") this._formatStr = value;else {\r\n\t this._formatStr = wDate.dateToStr(value);\r\n\t this._formatDate = wDate.strToDate(value);\r\n\t }\r\n\t } else this._formatStr = this._formatDate = null;\r\n\r\n\t return value;\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this._settings.editable ? this._dataobj.getElementsByTagName(\"input\")[0] : this._dataobj.getElementsByTagName(\"DIV\")[1];\r\n\t },\r\n\t getValue: function getValue() {\r\n\t if (this._settings.multiselect) {\r\n\t var value = this._settings.value;\r\n\t if (!value) return [];\r\n\t var result = [].concat(value).map(function (a) {\r\n\t return this._get_value_single(a);\r\n\t }.bind(this));\r\n\t if (this._settings.stringResult) return result.join(this._settings.separator);\r\n\t return result;\r\n\t }\r\n\r\n\t return this._get_value_single(this._settings.value);\r\n\t },\r\n\t _get_value_single: function _get_value_single(value) {\r\n\t var type = this._settings.type; //time mode\r\n\r\n\t var timeMode = type == \"time\"; //date and time mode\r\n\r\n\t var timepicker = this.config.timepicker; //input was not rendered, we need to parse value from setValue method\r\n\r\n\t if (!this._rendered_input) value = this.$prepareValue(value) || null; //rendere and in edit mode\r\n\t else if (this._settings.editable) {\r\n\t var formatDate = this._formatDate || (timeMode ? i18n.timeFormatDate : timepicker ? i18n.fullDateFormatDate : i18n.dateFormatDate);\r\n\t value = formatDate(this.getInputNode().value);\r\n\t } //return string from getValue\r\n\r\n\t if (this._settings.stringResult) {\r\n\t var formatStr = i18n.parseFormatStr;\r\n\t if (timeMode) formatStr = i18n.parseTimeFormatStr;\r\n\r\n\t if (this._formatStr && (type == \"month\" || type == \"year\")) {\r\n\t formatStr = this._formatStr;\r\n\t }\r\n\r\n\t if (this._settings.multiselect) return [].concat(value).map(function (a) {\r\n\t return a ? formatStr(a) : \"\";\r\n\t });\r\n\t return value ? formatStr(value) : \"\";\r\n\t }\r\n\r\n\t return value || null;\r\n\t },\r\n\t getText: function getText() {\r\n\t var node = this.getInputNode();\r\n\t return node ? typeof node.value == \"undefined\" ? this.getValue() ? node.innerHTML : \"\" : node.value : \"\";\r\n\t }\r\n\t};\r\n\tvar view$I = exports.protoUI(api$I, text.view);\r\n\tvar datepicker = {\r\n\t api: api$I,\r\n\t view: view$I\r\n\t};\r\n\r\n\tvar api$J = {\r\n\t name: \"colorpicker\",\r\n\t $init: function $init() {\r\n\t this.$ready.push(this._init_popup);\r\n\t },\r\n\t defaults: {\r\n\t icon: true\r\n\t },\r\n\t _init_popup: function _init_popup() {\r\n\t var obj = this._settings;\r\n\t if (obj.suggest) obj.popup = obj.suggest;else if (!obj.popup) obj.popup = obj.suggest = this.suggest_setter({\r\n\t type: \"colorboard\",\r\n\t height: 200\r\n\t });\r\n\r\n\t this._init_once = function () {};\r\n\t },\r\n\t $render: function $render(obj) {\r\n\t if (isUndefined(obj.value)) return;\r\n\t obj.value = this.$prepareValue(obj.value);\r\n\t this.$setValue(obj.value);\r\n\t },\r\n\t getValue: function getValue() {\r\n\t if (this._rendered_input && this._settings.editable) return this.getInputNode().value;else return this._settings.value;\r\n\t },\r\n\t $prepareValue: function $prepareValue(value) {\r\n\t if (value && value.charAt && value.charAt(0) != \"#\") value = \"#\" + value;\r\n\t return value || \"\";\r\n\t },\r\n\t _getColorNode: function _getColorNode() {\r\n\t return this.$view.getElementsByTagName(\"DIV\")[this._settings.editable ? 1 : 2];\r\n\t },\r\n\t _get_visible_text: function _get_visible_text(value) {\r\n\t return value;\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t this._getColorNode().style.backgroundColor = value;\r\n\t this._settings.text = value;\r\n\t var node = this.getInputNode();\r\n\t if (node.value == undefined) node.innerHTML = value;else node.value = value;\r\n\t },\r\n\t $renderIcon: function $renderIcon() {\r\n\t var config = this.config;\r\n\t return \"
\";\r\n\t }\r\n\t};\r\n\tvar view$J = exports.protoUI(api$J, datepicker.view);\r\n\r\n\tvar api$K = {\r\n\t name: \"richselect\",\r\n\t defaults: {\r\n\t template: function template(obj, common) {\r\n\t return common._render_div_block(obj, common);\r\n\t },\r\n\t popupWidth: 200,\r\n\t icon: \"wxi-menu-down\"\r\n\t },\r\n\t _onBlur: function _onBlur() {\r\n\t if (this._settings.text == this.getText() || isUndefined(this._settings.text) && !this.getText()) return;\r\n\t var suggest = this.getPopup(),\r\n\t nodeValue = this.getInputNode().value,\r\n\t value = suggest.getSuggestion(nodeValue),\r\n\t oldvalue = this.getValue(); //non-empty value that differs from old value and matches filtering rule\r\n\r\n\t if (value && value != oldvalue && !(nodeValue === \"\" && suggest.getItemText(value) !== \"\")) this.setValue(value);else if (nodeValue === \"\") this.setValue(\"\");else if (this._revertValue) this._revertValue();\r\n\t },\r\n\t suggest_setter: function suggest_setter(value) {\r\n\t return this.options_setter(value);\r\n\t },\r\n\t options_setter: function options_setter(value) {\r\n\t value = this._suggest_config ? this._suggest_config(value) : value;\r\n\t var suggest = this._settings.popup = this._settings.suggest = text.api.suggest_setter.call(this, value);\r\n\t var list = $$(suggest).getList();\r\n\t if (list) list.attachEvent(\"onAfterLoad\", bind(this._reset_value, this));\r\n\t return suggest;\r\n\t },\r\n\t getList: function getList() {\r\n\t var suggest = $$(this._settings.suggest);\r\n\t assert(suggest, \"Input doesn't have a list\");\r\n\t return suggest.getList();\r\n\t },\r\n\t _pattern: function _pattern(value) {\r\n\t return value;\r\n\t },\r\n\t _reset_value: function _reset_value() {\r\n\t var value = this._settings.value; //this._dataobj.firstChild - check that input is already rendered, as in IE11 it can be destroy during parent repainting\r\n\r\n\t if (!isUndefined(value) && !this.getPopup().isVisible() && !this._settings.text && this._dataobj.firstChild) this.$setValue(value);\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.inputPadding = $active.inputPadding;\r\n\t },\r\n\t $render: function $render(obj) {\r\n\t if (isUndefined(obj.value)) return;\r\n\t this.$setValue(obj.value);\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this._dataobj.getElementsByTagName(\"DIV\")[1];\r\n\t },\r\n\t getPopup: function getPopup() {\r\n\t return $$(this._settings.popup);\r\n\t },\r\n\t getText: function getText() {\r\n\t var value = this._settings.value,\r\n\t node = this.getInputNode();\r\n\t if (!node) return value ? this.getPopup().getItemText(value) : \"\";\r\n\r\n\t if (typeof node.value == \"undefined\") {\r\n\t if (node.firstChild && node.firstChild.className === \"webix_placeholder\") return \"\";\r\n\t return node.innerHTML;\r\n\t }\r\n\r\n\t return node.value;\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t if (!this._rendered_input) return;\r\n\t var text$$1 = value;\r\n\t var popup = this.getPopup();\r\n\t if (popup) text$$1 = this.getPopup().getItemText(value);\r\n\r\n\t if (!text$$1 && value && value.id) {\r\n\t //add new value\r\n\t this.getPopup().getList().add(value);\r\n\t text$$1 = this.getPopup().getItemText(value.id);\r\n\t this._settings.value = value.id;\r\n\t }\r\n\r\n\t var node = this.getInputNode();\r\n\t if (isUndefined(node.value)) node.innerHTML = text$$1 || this._get_div_placeholder();else node.value = text$$1 = text$$1.replace(/<[^>]*>/g, \"\");\r\n\t this._settings.text = text$$1;\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this._settings.value || \"\";\r\n\t }\r\n\t};\r\n\tvar view$K = exports.protoUI(api$K, text.view);\r\n\tvar richselect = {\r\n\t api: api$K,\r\n\t view: view$K\r\n\t};\r\n\r\n\tvar api$L = {\r\n\t name: \"combo\",\r\n\t getInputNode: function getInputNode() {\r\n\t return this._dataobj.getElementsByTagName(\"input\")[0];\r\n\t },\r\n\t $render: function $render(obj) {\r\n\t if (isUndefined(obj.value)) return;\r\n\t this.$setValue(obj.value);\r\n\t },\r\n\t _revertValue: function _revertValue() {\r\n\t if (!this._settings.editable) {\r\n\t var value = this.getValue();\r\n\t this.$setValue(isUndefined(value) ? \"\" : value);\r\n\t }\r\n\t },\r\n\t _applyChanges: function _applyChanges() {\r\n\t var input = this.getInputNode(),\r\n\t value = \"\",\r\n\t suggest = this.getPopup();\r\n\r\n\t if (input.value) {\r\n\t value = this._settings.value;\r\n\t if (suggest.getItemText(value) != this.getText()) value = suggest.getSuggestion() || value;\r\n\t }\r\n\r\n\t if (value != this._settings.value) this.setValue(value, true);else this.$setValue(value);\r\n\t },\r\n\t defaults: {\r\n\t template: function template(config, common) {\r\n\t return common.$renderInput(config).replace(/(\";\r\n\t html += \"\";\r\n\t html += common._baseInputHTML(\"input\") + \" id='\" + id + \"' type='text' class='webix_inp_counter_value' aria-live='assertive'\" + \" value='\" + value + \"'>\";\r\n\t html += \"\";\r\n\t return common.$renderInput(config, html, id);\r\n\t },\r\n\t min: 0,\r\n\t max: Infinity,\r\n\t step: 1\r\n\t },\r\n\t $init: function $init() {\r\n\t _event(this.$view, \"keydown\", this._keyshift, {\r\n\t bind: this\r\n\t });\r\n\t },\r\n\t _keyshift: function _keyshift(e) {\r\n\t var code = e.which || e.keyCode,\r\n\t c = this._settings,\r\n\t value = c.value || c.min;\r\n\r\n\t if (code > 32 && code < 41) {\r\n\t if (code === 35) value = c.min;else if (code === 36) value = c.max === Infinity ? 1000000 : c.max;else if (code === 33) this.next();else if (code === 34) this.prev();else value = value + (code === 37 || code === 40 ? -1 : 1);\r\n\t if (code > 34 && value >= c.min && value <= c.max) this.setValue(value);\r\n\t }\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t this.getInputNode().value = value;\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this._dataobj.getElementsByTagName(\"input\")[0];\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return button$1.api.getValue.apply(this, arguments) * 1;\r\n\t },\r\n\t next: function next(step) {\r\n\t step = this._settings.step;\r\n\t this.shift(step);\r\n\t },\r\n\t prev: function prev(step) {\r\n\t step = -1 * this._settings.step;\r\n\t this.shift(step);\r\n\t },\r\n\t shift: function shift(step) {\r\n\t var min = this._settings.min;\r\n\t var max = this._settings.max;\r\n\t var new_value = this.getValue() + step;\r\n\t if (new_value >= min && new_value <= max) this.setValue(new_value);\r\n\t }\r\n\t};\r\n\tvar view$M = exports.protoUI(api$M, text.view);\r\n\r\n\tvar api$N = {\r\n\t name: \"icon\",\r\n\t $skin: function $skin() {\r\n\t this.defaults.height = $active.inputHeight;\r\n\t this.defaults.width = $active.inputHeight;\r\n\t },\r\n\t defaults: {\r\n\t template: function template(obj) {\r\n\t return \"\";\r\n\t }\r\n\t },\r\n\t _set_inner_size: function _set_inner_size() {},\r\n\t $setValue: function $setValue() {}\r\n\t};\r\n\tvar view$N = exports.protoUI(api$N, button$1.view);\r\n\r\n\tvar api$O = {\r\n\t name: \"search\",\r\n\t on_click: {\r\n\t \"webix_input_icon\": function webix_input_icon(e) {\r\n\t this.getInputNode().focus();\r\n\t this.callEvent(\"onSearchIconClick\", [e]);\r\n\t }\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.inputPadding = $active.inputPadding;\r\n\t },\r\n\t defaults: {\r\n\t type: \"text\",\r\n\t icon: \"wxi-search\"\r\n\t }\r\n\t};\r\n\tvar view$O = exports.protoUI(api$O, text.view);\r\n\r\n\tvar api$P = {\r\n\t name: \"segmented\",\r\n\t $allowsClear: false,\r\n\t $init: function $init() {\r\n\t this.attachEvent(\"onChange\", function (value) {\r\n\t if (this._settings.multiview) this._show_view(value);\r\n\t });\r\n\t this.attachEvent(\"onAfterRender\", once(function () {\r\n\t if (this._settings.multiview && this._settings.value) this._show_view(this._settings.value);\r\n\t }));\r\n\t },\r\n\t _show_view: function _show_view(value) {\r\n\t var top = this.getTopParentView();\r\n\t var view = null; //get from local isolate\r\n\r\n\t if (top && top.$$) view = top.$$(value); //or check globally\r\n\r\n\t if (!view) view = $$(value);\r\n\t if (view && view.show) view.show();\r\n\t },\r\n\t defaults: {\r\n\t template: function template$$1(obj, common) {\r\n\t if (!obj.options) assert(false, \"segmented: options undefined\");\r\n\t var options = obj.options;\r\n\r\n\t common._check_options(options);\r\n\r\n\t options = common._filterOptions(options);\r\n\r\n\t var width = common._get_input_width(obj);\r\n\r\n\t var id = uid();\r\n\t var html = \"
\";\r\n\t var optionWidth = obj.optionWidth || Math.floor(width / options.length);\r\n\t if (!obj.value) obj.value = options[0].id;\r\n\r\n\t for (var i = 0; i < options.length; i++) {\r\n\t html += \"\";\r\n\t }\r\n\r\n\t return common.$renderInput(obj, html + \"
\", id);\r\n\t }\r\n\t },\r\n\t _getInputNode: function _getInputNode() {\r\n\t return this.$view.getElementsByTagName(\"BUTTON\");\r\n\t },\r\n\t focus: function focus() {\r\n\t this._focus();\r\n\t },\r\n\t blur: function blur() {\r\n\t this._blur();\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t var options = this._getInputNode();\r\n\r\n\t for (var i = 0; i < options.length; i++) {\r\n\t var id = options[i].getAttribute(\"button_id\");\r\n\t options[i].setAttribute(\"aria-selected\", value == id ? \"true\" : \"false\");\r\n\t options[i].setAttribute(\"tabindex\", value == id ? \"0\" : \"-1\");\r\n\t if (value == id) addCss(options[i], \"webix_selected\");else removeCss(options[i], \"webix_selected\");\r\n\t } //refresh tabbar if the option is in the popup list\r\n\r\n\r\n\t var popup = this.config.tabbarPopup;\r\n\t if (popup && $$(popup) && $$(popup).getBody().exists(value)) this.refresh();\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t return this._settings.value;\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return null;\r\n\t },\r\n\t optionIndex: function optionIndex(id) {\r\n\t var pages = this._settings.options;\r\n\r\n\t for (var i = 0; i < pages.length; i++) {\r\n\t if (pages[i].id == id) return i;\r\n\t }\r\n\r\n\t return -1;\r\n\t },\r\n\t addOption: function addOption(id, value, show, index$$1) {\r\n\t var obj = id;\r\n\r\n\t if (_typeof(id) != \"object\") {\r\n\t value = value || id;\r\n\t obj = {\r\n\t id: id,\r\n\t value: value\r\n\t };\r\n\t } else {\r\n\t id = obj.id;\r\n\t index$$1 = show;\r\n\t show = value;\r\n\t }\r\n\r\n\t if (this.optionIndex(id) < 0) PowerArray.insertAt.call(this._settings.options, obj, index$$1);\r\n\t this.refresh();\r\n\t if (show) this.setValue(id);\r\n\t },\r\n\t removeOption: function removeOption(id) {\r\n\t var index$$1 = this.optionIndex(id);\r\n\t var options = this._settings.options;\r\n\t if (index$$1 >= 0) PowerArray.removeAt.call(options, index$$1); // if we remove a selected option\r\n\r\n\t if (this._settings.value == id) this._setNextVisible(options, index$$1);\r\n\t this.refresh();\r\n\t this.callEvent(\"onOptionRemove\", [id, this._settings.value]);\r\n\t },\r\n\t _setNextVisible: function _setNextVisible(options, index$$1) {\r\n\t var size = options.length;\r\n\r\n\t if (size) {\r\n\t index$$1 = Math.min(index$$1, size - 1); //forward search\r\n\r\n\t for (var i = index$$1; i < size; i++) {\r\n\t if (!options[i].hidden) return this.setValue(options[i].id);\r\n\t } //backward search\r\n\r\n\r\n\t for (var _i = index$$1; _i >= 0; _i--) {\r\n\t if (!options[_i].hidden) return this.setValue(options[_i].id);\r\n\t }\r\n\t } //nothing found\t\t\r\n\r\n\r\n\t this.setValue(\"\");\r\n\t },\r\n\t _filterOptions: function _filterOptions(options) {\r\n\t var copy$$1 = [];\r\n\r\n\t for (var i = 0; i < options.length; i++) {\r\n\t if (!options[i].hidden) copy$$1.push(options[i]);\r\n\t }\r\n\r\n\t return copy$$1;\r\n\t },\r\n\t _setOptionVisibility: function _setOptionVisibility(id, state) {\r\n\t var options = this._settings.options;\r\n\t var index$$1 = this.optionIndex(id);\r\n\t var option = options[index$$1];\r\n\r\n\t if (option && state == !!option.hidden) {\r\n\t //new state differs from previous one\r\n\t option.hidden = !state;\r\n\r\n\t if (state || this._settings.value != id) {\r\n\t //show item, no need for extra steps\r\n\t this.refresh();\r\n\t } else {\r\n\t //hide item, switch to next visible one\r\n\t this._setNextVisible(options, index$$1);\r\n\t }\r\n\t }\r\n\t },\r\n\t hideOption: function hideOption(id) {\r\n\t this._setOptionVisibility(id, false);\r\n\t },\r\n\t showOption: function showOption(id) {\r\n\t this._setOptionVisibility(id, true);\r\n\t },\r\n\t _set_inner_size: false\r\n\t};\r\n\tvar view$P = exports.protoUI(api$P, HTMLOptions, text.view);\r\n\tvar segmented = {\r\n\t api: api$P,\r\n\t view: view$P\r\n\t};\r\n\r\n\tvar api$Q = {\r\n\t name: \"textarea\",\r\n\t defaults: {\r\n\t template: function template(obj, common) {\r\n\t var name = obj.name || obj.id;\r\n\t var id = \"x\" + uid();\r\n\t var html = common._baseInputHTML(\"textarea\") + \"style='width:\" + common._get_input_width(obj) + \"px;'\";\r\n\t html += \" id='\" + id + \"' name='\" + name + \"' class='webix_inp_textarea'>\" + common._pattern(obj.value) + \"\";\r\n\t return common.$renderInput(obj, html, id);\r\n\t },\r\n\t height: 0,\r\n\t minHeight: 60\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.inputPadding = $active.inputPadding;\r\n\t this._inputSpacing = $active.inputSpacing;\r\n\t },\r\n\t _skipSubmit: true,\r\n\t $renderLabel: function $renderLabel(config, id) {\r\n\t var labelAlign = config.labelAlign || \"left\";\r\n\t var top = this._settings.labelPosition == \"top\";\r\n\t var labelTop = top ? \"display:block;\" : \"width: \" + this._settings.labelWidth + \"px;\";\r\n\t var label = \"\";\r\n\t if (config.label) label = \"\";\r\n\t return label;\r\n\t },\r\n\t //get input element\r\n\t getInputNode: function getInputNode() {\r\n\t return this._dataobj.getElementsByTagName(\"textarea\")[0];\r\n\t }\r\n\t};\r\n\tvar view$Q = exports.protoUI(api$Q, text.view);\r\n\r\n\tvar api$R = {\r\n\t name: \"toggle\",\r\n\t $allowsClear: true,\r\n\t $init: function $init() {\r\n\t this.attachEvent(\"onItemClick\", function () {\r\n\t this.toggle();\r\n\t });\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t var input = this.getInputNode();\r\n\t var obj = this._settings;\r\n\t var isPressed = value && value != \"0\";\r\n\t var text = (isPressed ? obj.onLabel : obj.offLabel) || obj.label;\r\n\t var textNode = input.lastChild;\r\n\t input.setAttribute(\"aria-pressed\", isPressed ? \"true\" : false);\r\n\t input.value = text;\r\n\t if (textNode) (textNode.firstChild || textNode).nodeValue = \" \" + text; //icon or image button\r\n\r\n\t if (input.firstChild && input.firstChild.nodeName === \"SPAN\" && obj.onIcon && obj.offIcon && obj.onIcon !== obj.offIcon) input.firstChild.className = input.firstChild.className.replace(isPressed ? obj.offIcon : obj.onIcon, isPressed ? obj.onIcon : obj.offIcon);\r\n\t var parent = input.parentNode;\r\n\t if (isPressed) addCss(parent, \"webix_pressed\");else removeCss(parent, \"webix_pressed\");\r\n\t },\r\n\t toggle: function toggle() {\r\n\t this.setValue(!this.getValue());\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t var value = this._settings.value;\r\n\t return !value || value == \"0\" ? 0 : 1;\r\n\t },\r\n\t defaults: {\r\n\t template: function template(obj, common) {\r\n\t var isPressed = obj.value && obj.value != \"0\";\r\n\t var css = isPressed ? \" webix_pressed\" : \"\";\r\n\t obj.label = (isPressed ? obj.onLabel : obj.offLabel) || obj.label;\r\n\t obj.icon = (isPressed ? obj.onIcon : obj.offIcon) || obj.icon;\r\n\t var html = \"
\" + common.$renderInput(obj, common) + \"
\";\r\n\t html = html.replace(/(button)\\s*(?=\\w)/, \"$1\" + (\" aria-pressed='\" + (isPressed ? \"true\" : \"false\") + \"' \"));\r\n\t if (obj.badge) html = html.replace(/<\\/div>$/, \"\" + obj.badge + \"\");\r\n\t return html;\r\n\t }\r\n\t },\r\n\t _set_inner_size: false\r\n\t};\r\n\tvar view$R = exports.protoUI(api$R, button$1.view);\r\n\r\n\tvar api$S = {\r\n\t name: \"multitext\",\r\n\t $cssName: \"text\",\r\n\t defaults: {\r\n\t icon: \"wxi-plus-circle\",\r\n\t iconWidth: 25,\r\n\t separator: \", \"\r\n\t },\r\n\t getValueHere: function getValueHere() {\r\n\t return text.api.getValue.call(this);\r\n\t },\r\n\t setValueHere: function setValueHere(value) {\r\n\t return text.api.$setValue.call(this, value);\r\n\t },\r\n\t getValue: function getValue() {\r\n\t if (this.config.mode == \"extra\") return this.getValueHere();\r\n\t if (this._full_value) return this._full_value;\r\n\t var values = [this.getValueHere(this)];\r\n\r\n\t for (var i = 0; i < this._subs.length; i++) {\r\n\t var seg = $$(this._subs[i]).getValueHere();\r\n\t if (seg) values.push(seg);\r\n\t }\r\n\r\n\t return values.join(this.config.separator);\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t value = value || \"\";\r\n\t if (this.config.mode == \"extra\") return this.setValueHere(value);\r\n\t this._full_value = value;\r\n\t var parts = value.split(this.config.separator);\r\n\r\n\t if (parts.length == this._subs.length + 1) {\r\n\t this.setValueHere(parts[0]);\r\n\r\n\t for (var i = 0; i < this._subs.length; i++) {\r\n\t $$(this._subs[i]).setValueHere(parts[i + 1]);\r\n\t }\r\n\r\n\t this._full_value = \"\";\r\n\t return;\r\n\t }\r\n\r\n\t this.removeSection();\r\n\t this.setValueHere.call(this, parts[0]);\r\n\r\n\t for (var _i = 1; _i < parts.length; _i++) {\r\n\t this.addSection(parts[_i]);\r\n\t }\r\n\r\n\t this._full_value = \"\";\r\n\t },\r\n\t _subOnChange: function _subOnChange() {\r\n\t var parent = this.config.master ? $$(this.config.master) : this;\r\n\t var newvalue = parent.getValue();\r\n\t var oldvalue = parent._settings.value;\r\n\r\n\t if (newvalue !== oldvalue) {\r\n\t parent._settings.value = newvalue;\r\n\t parent.callEvent(\"onChange\", [newvalue, oldvalue]);\r\n\t }\r\n\t },\r\n\t addSection: function addSection(text$$1) {\r\n\t var config = this.config,\r\n\t newConfig = {\r\n\t labelWidth: config.labelWidth,\r\n\t inputWidth: config.inputWidth,\r\n\t width: config.width,\r\n\t label: config.label ? \" \" : \"\",\r\n\t view: this.name,\r\n\t mode: \"extra\",\r\n\t value: text$$1 || \"\",\r\n\t icon: \"wxi-minus-circle\",\r\n\t suggest: config.suggest || null,\r\n\t master: config.id\r\n\t };\r\n\t exports.extend(newConfig, config.subConfig || {}, true);\r\n\t var newone = this.getParentView().addView(newConfig);\r\n\t $$(newone).attachEvent(\"onChange\", this._subOnChange);\r\n\r\n\t this._subs.push(newone);\r\n\r\n\t this.callEvent(\"onSectionAdd\", [newone, this._subs.length]);\r\n\t return newone;\r\n\t },\r\n\t removeSection: function removeSection(id) {\r\n\t var parent = this.config.master ? $$(this.config.master) : this;\r\n\r\n\t for (var i = parent._subs.length - 1; i >= 0; i--) {\r\n\t var section = parent._subs[i];\r\n\r\n\t if (!id || section == id) {\r\n\t parent._subs.removeAt(i);\r\n\r\n\t this.getParentView().removeView(section);\r\n\t parent.callEvent(\"onSectionRemove\", [section, i + 1]);\r\n\t }\r\n\t }\r\n\t },\r\n\t on_click: {\r\n\t \"webix_input_icon\": function webix_input_icon() {\r\n\t if (this.config.mode == \"extra\") {\r\n\t this.removeSection(this.config.id);\r\n\t var childs = this.getParentView().getChildViews();\r\n\t childs[childs.length - 1].focus();\r\n\r\n\t this._subOnChange();\r\n\t } else $$(this.addSection()).focus();\r\n\r\n\t return false;\r\n\t }\r\n\t },\r\n\t $init: function $init() {\r\n\t this._subs = toArray([]);\r\n\t this.attachEvent(\"onKeyPress\", this._onKeyPress);\r\n\t },\r\n\t $render: function $render(obj) {\r\n\t this.$setValue(obj.value);\r\n\t }\r\n\t};\r\n\tvar view$S = exports.protoUI(api$S, text.view);\r\n\r\n\tvar api$T = {\r\n\t name: \"proto\",\r\n\t $init: function $init() {\r\n\t this.data.provideApi(this, true);\r\n\t this._dataobj = this._dataobj || this._contentobj; //render self , each time when data is updated\r\n\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(function () {\r\n\t this.render.apply(this, arguments);\r\n\t }, this));\r\n\t },\r\n\t $setSize: function $setSize() {\r\n\t if (base.api.$setSize.apply(this, arguments)) this.render();\r\n\t },\r\n\t _id: \"webix_item\",\r\n\t on_mouse_move: {},\r\n\t type: {}\r\n\t};\r\n\tvar view$T = exports.protoUI(api$T, PagingAbility, DataMarks, AutoTooltip, ValidateCollection, RenderStack, DataLoader, base.view, EventSystem, Settings);\r\n\tvar proto = {\r\n\t api: api$T,\r\n\t view: view$T\r\n\t};\r\n\r\n\tvar api$U = {\r\n\t name: \"list\",\r\n\t _listClassName: \"webix_list\",\r\n\t _itemClassName: \"webix_list_item\",\r\n\t $init: function $init(config) {\r\n\t addCss(this._viewobj, this._listClassName + ((config.layout || this.defaults.layout) == \"x\" ? \"-x\" : \"\"));\r\n\t this.data.provideApi(this, true);\r\n\t this._auto_resize = bind(this._auto_resize, this);\r\n\t this.data.attachEvent(\"onStoreUpdated\", this._auto_resize);\r\n\t this.data.attachEvent(\"onSyncApply\", this._auto_resize);\r\n\t this.attachEvent(\"onAfterRender\", this._correct_width_scroll);\r\n\r\n\t this._viewobj.setAttribute(\"role\", \"listbox\");\r\n\t },\r\n\t dynamic_setter: function dynamic_setter(value) {\r\n\t if (value) exports.extend(this, VRenderStack, true);\r\n\t return value;\r\n\t },\r\n\t $dragHTML: function $dragHTML(obj) {\r\n\t if (this._settings.layout == \"y\" && this.type.width == \"auto\") {\r\n\t this.type.width = this._content_width;\r\n\r\n\t var node = this._toHTML(obj);\r\n\r\n\t this.type.width = \"auto\";\r\n\t return node;\r\n\t }\r\n\r\n\t return this._toHTML(obj);\r\n\t },\r\n\t defaults: {\r\n\t select: false,\r\n\t scroll: true,\r\n\t layout: \"y\",\r\n\t navigation: true,\r\n\t datafetch: 50\r\n\t },\r\n\t _id: \"webix_l_id\",\r\n\t on_click: {\r\n\t webix_list_item: function webix_list_item(e, id) {\r\n\t if (this._settings.select) {\r\n\t this._no_animation = true;\r\n\t if (this._settings.select == \"multiselect\" || this._settings.multiselect) this.select(id, false, e.ctrlKey || e.metaKey || this._settings.multiselect == \"touch\", e.shiftKey); //multiselection\r\n\t else this.select(id);\r\n\t this._no_animation = false;\r\n\t }\r\n\t }\r\n\t },\r\n\t on_dblclick: {},\r\n\t getVisibleCount: function getVisibleCount() {\r\n\t return Math.floor(this._content_height / this._one_height());\r\n\t },\r\n\t _auto_resize: function _auto_resize() {\r\n\t if (this._settings.autoheight || this._settings.autowidth) this.resize();\r\n\t },\r\n\t _auto_height_calc: function _auto_height_calc(count) {\r\n\t var value = this.data.$pagesize || this.count();\r\n\r\n\t this._onoff_scroll(count && count < value, \"y\");\r\n\r\n\t if (this._settings.autoheight && value < (count || Infinity)) count = value;\r\n\t var height = this._one_height() * count + (this.type.margin || 0); //unitlist\r\n\r\n\t if (this.getUnits) height += this.getUnits().length * this.type.headerHeight;\r\n\t return Math.max(height, this._settings.minHeight || 0);\r\n\t },\r\n\t _one_height: function _one_height() {\r\n\t return this.type.height + (this.type.margin || 0);\r\n\t },\r\n\t _auto_width_calc: function _auto_width_calc(count) {\r\n\t var value = this.data.$pagesize || this.count();\r\n\r\n\t this._onoff_scroll(count && count < value, \"x\");\r\n\r\n\t if (this._settings.autowidth && value < (count || Infinity)) count = value;\r\n\t return this.type.width * count;\r\n\t },\r\n\t _correct_width_scroll: function _correct_width_scroll() {\r\n\t if (this._settings.layout == \"x\") this._dataobj.style.width = this.type.width != \"auto\" ? this.type.width * this.count() + \"px\" : \"auto\";\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t if (this._settings.layout == \"y\") {\r\n\t if (this.type.width != \"auto\") this._settings.width = this.type.width + (this._scroll_y ? env.scrollSize : 0);\r\n\t if (this._settings.yCount || this._settings.autoheight) this._settings.height = this._auto_height_calc(this._settings.yCount) || 1;\r\n\t } else {\r\n\t if (this.type.height != \"auto\") this._settings.height = this._one_height() + (this._scroll_x ? env.scrollSize : 0);\r\n\t if (this._settings.xCount || this._settings.autowidth) this._settings.width = this._auto_width_calc(this._settings.xCount) || 1;\r\n\t }\r\n\r\n\t return base.api.$getSize.call(this, dx, dy);\r\n\t },\r\n\t $setSize: function $setSize() {\r\n\t base.api.$setSize.apply(this, arguments);\r\n\t },\r\n\t type: {\r\n\t css: \"\",\r\n\t widthSize: function widthSize(obj, common) {\r\n\t return common.width + (common.width > -1 ? \"px\" : \"\");\r\n\t },\r\n\t heightSize: function heightSize(obj, common) {\r\n\t return common.height + (common.height > -1 ? \"px\" : \"\");\r\n\t },\r\n\t classname: function classname(obj, common, marks) {\r\n\t var css = \"webix_list_item\";\r\n\r\n\t if (obj.$css) {\r\n\t if (_typeof(obj.$css) == \"object\") obj.$css = createCss(obj.$css);\r\n\t css += \" \" + obj.$css;\r\n\t }\r\n\r\n\t if (marks && marks.$css) css += \" \" + marks.$css;\r\n\t return css;\r\n\t },\r\n\t aria: function aria(obj, common, marks) {\r\n\t return \"role=\\\"option\\\"\" + (marks && marks.webix_selected ? \" aria-selected=\\\"true\\\" tabindex=\\\"0\\\"\" : \" tabindex=\\\"-1\\\"\") + (obj.$count && obj.$template ? \"aria-expanded=\\\"true\\\"\" : \"\");\r\n\t },\r\n\t template: function template$$1(obj) {\r\n\t return (obj.icon ? \" \" : \"\") + obj.value + (obj.badge ? \"
\" + obj.badge + \"
\" : \"\");\r\n\t },\r\n\t width: \"auto\",\r\n\t templateStart: template(\"
\"),\r\n\t templateEnd: template(\"
\")\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.type.height = $active.listItemHeight;\r\n\t }\r\n\t};\r\n\tvar view$U = exports.protoUI(api$U, CustomPrint, KeysNavigation, DataMove, DragItem, MouseEvents, SelectionModel, Scrollable, proto.view, CopyPaste);\r\n\tvar list = {\r\n\t api: api$U,\r\n\t view: view$U\r\n\t};\r\n\r\n\tvar api$V = {\r\n\t name: \"multiselect\",\r\n\t $cssName: \"richselect\",\r\n\t defaults: {\r\n\t separator: \",\"\r\n\t },\r\n\t _suggest_config: function _suggest_config(value) {\r\n\t var isobj = !isArray(value) && _typeof(value) == \"object\" && !value.name;\r\n\t var suggest = {\r\n\t view: \"checksuggest\",\r\n\t separator: this.config.separator,\r\n\t buttonText: this.config.buttonText,\r\n\t button: this.config.button\r\n\t };\r\n\t if (this._settings.optionWidth) suggest.width = this._settings.optionWidth;else suggest.fitMaster = true;\r\n\t if (isobj) exports.extend(suggest, value, true);\r\n\t var view = ui(suggest);\r\n\t var list$$1 = view.getList();\r\n\t if (typeof value == \"string\") list$$1.load(value);else if (!isobj) list$$1.parse(value);\r\n\t view.attachEvent(\"onShow\", function () {\r\n\t view.setValue($$(view._settings.master).config.value);\r\n\t });\r\n\t return view;\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t if (!this._rendered_input) return;\r\n\t var popup = this.getPopup();\r\n\t var text = \"\";\r\n\r\n\t if (popup) {\r\n\t text = popup.setValue(value);\r\n\r\n\t if (_typeof(text) == \"object\") {\r\n\t text = text.join(this.config.separator + \" \");\r\n\t }\r\n\t }\r\n\r\n\t this._settings.text = text;\r\n\t var node = this.getInputNode();\r\n\t node.innerHTML = text || this._get_div_placeholder();\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this._settings.value || \"\";\r\n\t }\r\n\t};\r\n\teditors.multiselect = exports.extend({\r\n\t popupType: \"multiselect\"\r\n\t}, editors.richselect);\r\n\ttype(list.view, {\r\n\t name: \"multilist\",\r\n\t templateStart: template(\"
\")\r\n\t}, \"default\");\r\n\ttype(list.view, {\r\n\t name: \"checklist\",\r\n\t templateStart: template(\"
{common.checkbox()}\"),\r\n\t checkbox: function checkbox(obj) {\r\n\t var icon = obj.$checked ? \"wxi-checkbox-marked\" : \"wxi-checkbox-blank\";\r\n\t return \"\";\r\n\t },\r\n\t aria: function aria(obj) {\r\n\t return \"role='option' tabindex='-1' \" + (obj.$checked ? \"aria-selected='true'\" : \"\");\r\n\t },\r\n\t template: template(\"#value#\")\r\n\t}, \"default\");\r\n\tvar view$V = exports.protoUI(api$V, richselect.view);\r\n\r\n\tvar api$W = {\r\n\t name: \"multicombo\",\r\n\t $cssName: \"text\",\r\n\t defaults: {\r\n\t keepText: false,\r\n\t separator: \",\",\r\n\t icon: false,\r\n\t iconWidth: 0,\r\n\t tagMode: true,\r\n\t tagTemplate: function tagTemplate(values) {\r\n\t return values.length ? values.length + \" item(s)\" : \"\";\r\n\t },\r\n\t template: function template$$1(obj, common) {\r\n\t return common._render_value_block(obj, common);\r\n\t }\r\n\t },\r\n\t $init: function $init() {\r\n\t this.$view.className += \" webix_multicombo\";\r\n\t this.attachEvent(\"onBeforeRender\", function () {\r\n\t if (!this._inputHeight) this._inputHeight = $active.inputHeight;\r\n\t return true;\r\n\t });\r\n\t this.attachEvent(\"onAfterRender\", function () {\r\n\t this._last_size = null;\r\n\t });\r\n\t this._renderCount = 0;\r\n\t },\r\n\t on_click: {\r\n\t \"webix_multicombo_delete\": function webix_multicombo_delete(e, view, node) {\r\n\t var value;\r\n\t if (!this._settings.readonly && node && (value = node.parentNode.getAttribute(\"optvalue\"))) this._removeValue(value);\r\n\t return false;\r\n\t }\r\n\t },\r\n\t _onBlur: function _onBlur() {\r\n\t var value = this.getInputNode().value; //blurring caused by clicks in the suggest list cannot affect new values\r\n\r\n\t if (value && this._settings.newValues && new Date() - (this.getPopup()._click_stamp || 0) > 100) {\r\n\t this._addNewValue(value);\r\n\t }\r\n\r\n\t if (!this._settings.keepText) this._inputValue = \"\";\r\n\t this.refresh();\r\n\t },\r\n\t _removeValue: function _removeValue(value) {\r\n\t var values = this._settings.value;\r\n\t var suggest = $$(this.config.suggest);\r\n\t if (typeof values == \"string\") values = values.split(this._settings.separator);\r\n\t values = toArray(copy(values));\r\n\t values.remove(value);\r\n\t this.setValue(values.join(this._settings.separator));\r\n\r\n\t if (suggest && suggest._settings.selectAll) {\r\n\t suggest.getBody()._cells[0].setValue(0);\r\n\t }\r\n\t },\r\n\t _addValue: function _addValue(newValue) {\r\n\t var suggest = $$(this.config.suggest);\r\n\t var list = suggest.getList();\r\n\t var item = list.getItem(newValue);\r\n\r\n\t if (item) {\r\n\t var values = suggest.getValue();\r\n\t if (values && typeof values == \"string\") values = values.split(suggest.config.separator);\r\n\t values = toArray(values || []);\r\n\r\n\t if (values.find(newValue) < 0) {\r\n\t values.push(newValue);\r\n\t suggest.setValue(values);\r\n\t this.setValue(suggest.getValue());\r\n\t }\r\n\t }\r\n\t },\r\n\t _addNewValue: function _addNewValue(value) {\r\n\t var suggest = $$(this.config.suggest);\r\n\t var list = suggest.getList();\r\n\t var id;\r\n\t value = value.replace(/^\\s+|\\s+$/g, \"\");\r\n\r\n\t if (value) {\r\n\t for (var i in list.data.pull) {\r\n\t if (suggest.getItemText(i) == value) id = i;\r\n\t }\r\n\t }\r\n\r\n\t if (!id && value) id = list.add({\r\n\t id: value,\r\n\t value: value\r\n\t });\r\n\r\n\t this._addValue(id);\r\n\t },\r\n\t _suggest_config: function _suggest_config(value) {\r\n\t var isObj = !isArray(value) && _typeof(value) == \"object\" && !value.name,\r\n\t suggest = {\r\n\t view: \"checksuggest\",\r\n\t separator: this.config.separator,\r\n\t buttonText: this.config.buttonText,\r\n\t button: this.config.button\r\n\t },\r\n\t combo = this;\r\n\t if (this._settings.optionWidth) suggest.width = this._settings.optionWidth;\r\n\t if (isObj) exports.extend(suggest, value, true);\r\n\t var view = ui(suggest);\r\n\t if (!this._settings.optionWidth) view.$customWidth = function () {\r\n\t this.config.width = combo._get_input_width(combo._settings);\r\n\t };\r\n\t view.attachEvent(\"onBeforeShow\", function (node, mode, point) {\r\n\t if (this._settings.master) {\r\n\t this.setValue($$(this._settings.master).config.value);\r\n\r\n\t if ($$(this._settings.master).getInputNode().value || this.isVisible()) {\r\n\t this.getList().refresh();\r\n\t this._dont_unfilter = true;\r\n\t } else this.getList().filter();\r\n\r\n\t if (node.tagName && node.tagName.toLowerCase() == \"input\") {\r\n\t popup.api.show.apply(this, [node.parentNode, mode, point]);\r\n\t return false;\r\n\t }\r\n\t }\r\n\t });\r\n\t var list = view.getList();\r\n\t if (typeof value == \"string\") list.load(value);else if (!isObj) list.parse(value); //prevent default show-hide logicfunction(){\r\n\r\n\t view._suggest_after_filter = function () {};\r\n\r\n\t return view;\r\n\t },\r\n\t _render_value_block: function _render_value_block(obj, common) {\r\n\t var id,\r\n\t input,\r\n\t inputAlign,\r\n\t inputStyle,\r\n\t inputValue,\r\n\t inputWidth,\r\n\t height,\r\n\t html,\r\n\t label,\r\n\t list,\r\n\t message,\r\n\t padding,\r\n\t readOnly,\r\n\t width,\r\n\t bottomLabel = \"\",\r\n\t top = this._settings.labelPosition == \"top\";\r\n\t id = \"x\" + uid();\r\n\t width = common._get_input_width(obj);\r\n\t inputAlign = obj.inputAlign || \"left\";\r\n\t height = this._inputHeight - 2 * $active.inputPadding - 2;\r\n\t inputValue = this._inputValue || \"\";\r\n\t list = \"
    \";\r\n\t inputWidth = Math.min(width, common._inputWidth || 7);\r\n\t inputStyle = \"width: \" + inputWidth + \"px;height:\" + height + \"px;max-width:\" + (width - 20) + \"px\";\r\n\t readOnly = obj.readonly ? \" readonly \" : \"\";\r\n\t input = \"\";\r\n\t html = \"
    \" + list + input + \"
    \";\r\n\t label = common.$renderLabel(obj, id);\r\n\t padding = this._settings.awidth - width - $active.inputPadding * 2;\r\n\t message = (obj.invalid ? obj.invalidMessage : \"\") || obj.bottomLabel;\r\n\t if (message) bottomLabel = \"
    \" + message + \"
    \";\r\n\t if (top) return label + \"
    \" + html + bottomLabel + \"
    \";else return \"
    \" + label + html + bottomLabel + \"
    \";\r\n\t },\r\n\t _getValueListBox: function _getValueListBox() {\r\n\t return this._getBox().getElementsByTagName(\"UL\")[0];\r\n\t },\r\n\t _set_inner_size: function _set_inner_size() {\r\n\t var popup$$1 = this.getPopup();\r\n\r\n\t if (popup$$1) {\r\n\t var textArr = popup$$1 ? popup$$1.setValue(this._settings.value) : null;\r\n\t if (popup$$1._toMultiValue) this._settings.value = popup$$1._toMultiValue(this._settings.value);\r\n\t var html = \"\";\r\n\r\n\t var listbox = this._getValueListBox();\r\n\r\n\t var text = textArr && textArr.length;\r\n\r\n\t if (text) {\r\n\t var height = this._inputHeight - 2 * $active.inputPadding - 8;\r\n\t var values = this._settings.value;\r\n\t if (typeof values == \"string\") values = values.split(this._settings.separator);\r\n\r\n\t if (this._settings.tagMode) {\r\n\t for (var i = 0; i < textArr.length; i++) {\r\n\t var content = \"\" + textArr[i] + \"x\";\r\n\t html += \"
  • \" + content + \"
  • \";\r\n\t }\r\n\t } else {\r\n\t html += \"
  • \" + this._settings.tagTemplate(values) + \"
  • \";\r\n\t }\r\n\t }\r\n\r\n\t listbox.innerHTML = html; // reset placeholder\r\n\r\n\t var inp = this.getInputNode();\r\n\r\n\t if (this._settings.placeholder) {\r\n\t if (text) {\r\n\t inp.placeholder = \"\";\r\n\t if (!inp.value && inp.offsetWidth > 20) inp.style.width = \"20px\";\r\n\t } else if (!inp.value) {\r\n\t inp.placeholder = this._settings.placeholder;\r\n\t inp.style.width = this._get_input_width(this._settings) + \"px\";\r\n\t }\r\n\t }\r\n\r\n\t if (!this._settings.tagMode && listbox.firstChild) inp.style.width = this._getMultiComboInputWidth() + \"px\";\r\n\t }\r\n\r\n\t this._resizeToContent();\r\n\t },\r\n\t _focusAtEnd: function _focusAtEnd(inputEl) {\r\n\t inputEl = inputEl || this.getInputNode();\r\n\r\n\t if (inputEl) {\r\n\t if (inputEl.value.length) {\r\n\t if (inputEl.createTextRange) {\r\n\t var FieldRange = inputEl.createTextRange();\r\n\t FieldRange.moveStart(\"character\", inputEl.value.length);\r\n\t FieldRange.collapse();\r\n\t FieldRange.select();\r\n\t } else if (inputEl.selectionStart || inputEl.selectionStart == \"0\") {\r\n\t var elemLen = inputEl.value.length;\r\n\t inputEl.selectionStart = elemLen;\r\n\t inputEl.selectionEnd = elemLen;\r\n\t inputEl.focus();\r\n\t }\r\n\t } else {\r\n\t inputEl.focus();\r\n\t }\r\n\t }\r\n\t },\r\n\t _resizeToContent: function _resizeToContent() {\r\n\t var top = this._settings.labelPosition == \"top\";\r\n\r\n\t var inputDiv = this._getInputDiv();\r\n\r\n\t var inputHeight = Math.max(inputDiv.offsetHeight + 2 * $active.inputPadding, this._inputHeight);\r\n\t if (top) inputHeight += this._labelTopHeight;\r\n\t inputHeight += this._settings.bottomPadding || 0;\r\n\t var sizes = this.$getSize(0, 0);\r\n\r\n\t if (inputHeight != sizes[2]) {\r\n\t var cHeight = inputDiv.offsetHeight + (top ? this._labelTopHeight : 0); // workaround for potential rendering loop\r\n\r\n\t if (cHeight == this._calcHeight) this._renderCount++;else this._renderCount = 0;\r\n\t if (this._renderCount > 10) return false;\r\n\t this._calcHeight = cHeight;\r\n\t var topView = this.getTopParentView();\r\n\t clearTimeout(topView._template_resize_timer);\r\n\t topView._template_resize_timer = delay(function () {\r\n\t this.config.height = this._calcHeight + 2 * $active.inputPadding;\r\n\t this.resize();\r\n\r\n\t if (this._typing) {\r\n\t this._focusAtEnd(this.getInputNode());\r\n\r\n\t this._typing = false;\r\n\t }\r\n\r\n\t if (this._enter) {\r\n\t if (!this._settings.keepText) this.getInputNode().value = \"\";else this.getInputNode().select();\r\n\t this._enter = false;\r\n\t }\r\n\r\n\t if (this.getPopup().isVisible() || this._typing) {\r\n\t this.getPopup().show(this._getInputDiv());\r\n\t }\r\n\t }, this);\r\n\t }\r\n\r\n\t if (this._enter) {\r\n\t this.getInputNode().select();\r\n\t }\r\n\t },\r\n\t _getInputDiv: function _getInputDiv() {\r\n\t var parentNode = this._getBox();\r\n\r\n\t var nodes = parentNode.childNodes;\r\n\r\n\t for (var i = 0; i < nodes.length; i++) {\r\n\t if (nodes[i].className && nodes[i].className.indexOf(\"webix_inp_static\") != -1) return nodes[i];\r\n\t }\r\n\r\n\t return parentNode;\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this._getBox().getElementsByTagName(\"INPUT\")[0];\r\n\t },\r\n\t $setValue: function $setValue() {\r\n\t if (this._rendered_input) this._set_inner_size();\r\n\t },\r\n\t getValue: function getValue(config) {\r\n\t if (_typeof(config) == \"object\" && config.options) return this._getSelectedOptions();\r\n\t var value = this._settings.value;\r\n\t if (!value) return \"\";\r\n\t return typeof value != \"string\" ? value.join(this._settings.separator) : value;\r\n\t },\r\n\t getText: function getText() {\r\n\t var value = this._settings.value;\r\n\t if (!value) return \"\";\r\n\t if (typeof value == \"string\") value = value.split(this._settings.separator);\r\n\t var text = [];\r\n\r\n\t for (var i = 0; i < value.length; i++) {\r\n\t text.push(this.getPopup().getItemText(value[i]));\r\n\t }\r\n\r\n\t return text.join(this._settings.separator);\r\n\t },\r\n\t _getSelectedOptions: function _getSelectedOptions() {\r\n\t var i,\r\n\t item,\r\n\t popup$$1,\r\n\t options = [],\r\n\t value = this._settings.value;\r\n\t if (!value) return [];\r\n\t if (typeof value == \"string\") value = value.split(this._settings.separator);\r\n\t popup$$1 = this.getPopup();\r\n\r\n\t for (i = 0; i < value.length; i++) {\r\n\t item = popup$$1.getList().getItem(value[i]) || (popup$$1._valueHistory ? popup$$1._valueHistory[value[i]] : null);\r\n\t if (item) options.push(item);\r\n\t }\r\n\r\n\t return options;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t var config = this._settings;\r\n\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t if (!x || !y) return;\r\n\r\n\t if (config.labelPosition == \"top\") {\r\n\t config.labelWidth = 0;\r\n\t }\r\n\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t _calcInputWidth: function _calcInputWidth(value) {\r\n\t var tmp = document.createElement(\"span\");\r\n\t tmp.className = \"webix_multicombo_input\";\r\n\t tmp.style.visibility = \"visible\";\r\n\t tmp.style.height = \"0px\";\r\n\t tmp.innerHTML = value.replace(/&/g, \"&\").replace(//g, \">\");\r\n\t document.body.appendChild(tmp);\r\n\t var width = tmp.offsetWidth + 10;\r\n\t document.body.removeChild(tmp);\r\n\t return width;\r\n\t },\r\n\t _getMultiComboInputWidth: function _getMultiComboInputWidth() {\r\n\t var listbox = this._getValueListBox();\r\n\r\n\t return listbox.offsetWidth - listbox.firstChild.offsetWidth - 17;\r\n\t },\r\n\t _init_onchange: function _init_onchange() {\r\n\t // input focus and focus styling\r\n\t _event(this._getBox(), \"click\", function () {\r\n\t this.getInputNode().focus();\r\n\t }, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(this.getInputNode(), \"focus\", function () {\r\n\t if (this._getBox().className.indexOf(\"webix_focused\") == -1) this._getBox().className += \" webix_focused\";\r\n\t }, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(this.getInputNode(), \"blur\", function () {\r\n\t this._getBox().className = this._getBox().className.replace(\" webix_focused\", \"\");\r\n\t }, {\r\n\t bind: this\r\n\t }); // need for clear click (\"x\") in IE\r\n\r\n\r\n\t _event(this.getInputNode(), \"input\", function () {\r\n\t if (!this.getInputNode().value && this._inputValue) {\r\n\t this.getInputNode().style.width = \"20px\";\r\n\t this._inputWidth = 20;\r\n\t this._inputValue = \"\";\r\n\t this._typing = true;\r\n\t this.getPopup().show(this._getInputDiv());\r\n\r\n\t this._resizeToContent();\r\n\t }\r\n\t }, {\r\n\t bind: this\r\n\t }); // resize\r\n\r\n\r\n\t _event(this.getInputNode(), \"keyup\", function (e) {\r\n\t var inp = this.getInputNode();\r\n\t var calcWidth, width;\r\n\t e = e || event; // to show placeholder\r\n\r\n\t if (this._settings.placeholder && !this._settings.value && !inp.value) width = this._get_input_width(this._settings);else {\r\n\t width = calcWidth = this._calcInputWidth(inp.value) + 10;\r\n\t if (!this._settings.tagMode && this._getValueListBox().firstChild) width = this._getMultiComboInputWidth();\r\n\t }\r\n\t inp.style.width = width + \"px\";\r\n\r\n\t if (calcWidth != this._inputWidth) {\r\n\t if (this._settings.keepText || e.keyCode != 13) {\r\n\t this._inputValue = inp.value;\r\n\t } else {\r\n\t this._inputValue = false;\r\n\t }\r\n\r\n\t this._typing = true;\r\n\t if (this._inputWidth) this.getPopup().show(this._getInputDiv());\r\n\t this._inputWidth = calcWidth || width;\r\n\r\n\t this._resizeToContent();\r\n\t } else if (this._windowHeight != this.getPopup().$height) {\r\n\t this.getPopup().show(this._getInputDiv());\r\n\t }\r\n\r\n\t if (inp.value.indexOf(this._settings.separator) > -1 && this._settings.tagMode) {\r\n\t var newValue = inp.value.replace(this._settings.separator, \"\");\r\n\r\n\t if (newValue) {\r\n\t if (this._settings.newValues) this._addNewValue(newValue);else {\r\n\t var newId = this.getPopup().getItemId(newValue);\r\n\t if (newId) this._addValue(newId);\r\n\t }\r\n\t }\r\n\r\n\t if (this._settings.keepText) {\r\n\t this._inputValue = newValue;\r\n\t inp.value = newValue;\r\n\t this._enter = true;\r\n\t this._typing = true;\r\n\r\n\t this._resizeToContent();\r\n\t } else {\r\n\t inp.value = \"\";\r\n\t }\r\n\t }\r\n\t }, {\r\n\t bind: this\r\n\t }); // remove the last value on Backspace click\r\n\r\n\r\n\t _event(this.getInputNode(), \"keydown\", function (e) {\r\n\t this._enter = false;\r\n\r\n\t if (this.isVisible()) {\r\n\t e = e || event;\r\n\r\n\t var node = this._getValueListBox().lastChild;\r\n\r\n\t this._windowHeight = this.getPopup().$height;\r\n\r\n\t if (e.keyCode == 8 && node) {\r\n\t if (!this.getInputNode().value && new Date().valueOf() - (this._backspaceTime || 0) > 100) {\r\n\t this._typing = true;\r\n\r\n\t this._removeValue(node.getAttribute(\"optvalue\"));\r\n\t } else {\r\n\t this._backspaceTime = new Date().valueOf();\r\n\t }\r\n\t }\r\n\r\n\t if (e.keyCode == 13 || e.keyCode == 9) {\r\n\t var input = this.getInputNode();\r\n\t var id = \"\";\r\n\t var suggest = $$(this._settings.suggest);\r\n\t var list = suggest.getList(); // if no selected options\r\n\r\n\t if (!list.getSelectedId()) {\r\n\t if (input.value) id = suggest.getSuggestion(input.value);\r\n\r\n\t if (this._settings.newValues) {\r\n\t if (e.keyCode == 13) this._enter = true;\r\n\r\n\t this._addNewValue(input.value);\r\n\r\n\t if (this._settings.keepText) this._inputValue = input.value;else input.value = \"\";\r\n\t } else if (id) {\r\n\t if (e.keyCode == 9) {\r\n\t this._typing = false;\r\n\t this._inputValue = \"\";\r\n\t this._inputWidth = 10;\r\n\t input.value = \"\";\r\n\r\n\t this._addValue(id);\r\n\t } else {\r\n\t this._enter = true;\r\n\r\n\t this._addValue(id);\r\n\r\n\t if (this._settings.keepText) this._inputValue = input.value;else input.value = \"\";\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (e.keyCode == 13) {\r\n\t this._enter = true;\r\n\t this._typing = true;\r\n\t if (this._settings.keepText) this._inputValue = input.value;else input.value = \"\";\r\n\t }\r\n\t }\r\n\t }\r\n\t }, {\r\n\t bind: this\r\n\t });\r\n\r\n\t $$(this._settings.suggest).linkInput(this);\r\n\t }\r\n\t};\r\n\tvar view$W = exports.protoUI(api$W, richselect.view);\r\n\r\n\tvar api$X = {\r\n\t name: \"slider\",\r\n\t $touchCapture: true,\r\n\t defaults: {\r\n\t min: 0,\r\n\t max: 100,\r\n\t value: 50,\r\n\t step: 1,\r\n\t title: false,\r\n\t moveTitle: true,\r\n\t template: function template$$1(obj, common) {\r\n\t var id = common._handle_id = \"x\" + uid();\r\n\t var html = \"\";\r\n\t var title = \"
    \";\r\n\t var left = \"
     
    \";\r\n\t var right = \"
    \";\r\n\t var handle = \"
     
    \";\r\n\t if (obj.vertical) html = \"
    \" + right + left + handle + \"
    \" + title;else html = title + \"
    \" + left + right + handle + \"
    \";\r\n\t return common.$renderInput(obj, html, id);\r\n\t }\r\n\t },\r\n\t type_setter: function type_setter(type) {\r\n\t this._viewobj.className += \" webix_slider_\" + type;\r\n\t },\r\n\t title_setter: function title_setter(value) {\r\n\t if (typeof value == \"string\") return template(value);\r\n\t return value;\r\n\t },\r\n\t _get_slider_handle: function _get_slider_handle() {\r\n\t return this.$view.querySelector(\".webix_slider_handle\");\r\n\t },\r\n\t _set_inner_size: function _set_inner_size() {\r\n\t var handle = this._get_slider_handle();\r\n\r\n\t var config = this._settings;\r\n\r\n\t if (handle) {\r\n\t //view is rendered for sure\r\n\t var size = config.vertical ? this._content_height : this._get_input_width(config); //width or height\r\n\r\n\t var value = config.value % config.step ? Math.round(config.value / config.step) * config.step : config.value;\r\n\t var max = config.max - config.min;\r\n\t value = Math.max(Math.min(value, config.max), config.min);\r\n\t value = config.vertical ? max - (value - config.min) : value - config.min; //top or left\r\n\r\n\t var corner1 = Math.ceil((size - 2 * this._sliderPadding) * value / max); //bottom or right\r\n\r\n\t var corner2 = size - 2 * this._sliderPadding - corner1;\r\n\t var cornerStr = config.vertical ? \"top\" : \"left\";\r\n\t var sizeStr = config.vertical ? \"height\" : \"width\";\r\n\t handle.style[cornerStr] = this._sliderPadding + corner1 - this._sliderHandleWidth / 2 + \"px\";\r\n\t handle.parentNode.style[sizeStr] = size + \"px\"; //1px border\r\n\r\n\t corner2 = Math.min(Math.max(corner2, 2 * this._sliderBorder), size - this._sliderPadding * 2 - 2 * this._sliderBorder);\r\n\t corner1 = Math.min(Math.max(corner1, 2 * this._sliderBorder), size - this._sliderPadding * 2 - 2 * this._sliderBorder); //width for left/top and right/bottom bars\r\n\r\n\t var part = handle.previousSibling;\r\n\t part.style[sizeStr] = corner2 + \"px\";\r\n\t var last = part.previousSibling;\r\n\t last.style[sizeStr] = corner1 + \"px\";\r\n\r\n\t this._set_title(handle, corner1, corner2, cornerStr);\r\n\t }\r\n\t },\r\n\t _set_title: function _set_title(handle, corner1, corner2, cornerStr) {\r\n\t var config = this._settings;\r\n\r\n\t if (this._settings.title) {\r\n\t var title = handle.parentNode[config.vertical ? \"nextSibling\" : \"previousSibling\"];\r\n\t title.innerHTML = this._settings.title(this._settings, this);\r\n\r\n\t if (this._settings.moveTitle) {\r\n\t var pos$$1 = 0;\r\n\t if (config.vertical) pos$$1 = corner1 + 2 * this._sliderBorder - this._sliderHandleWidth / 2;else {\r\n\t var half = title.clientWidth / 2;\r\n\t var pos1 = half > corner1 ? half - corner1 - 2 * this._sliderBorder : 0; //left/top text is to large\r\n\r\n\t var pos2 = half > corner2 ? half - corner2 - 2 * this._sliderBorder - this._sliderHandleWidth / 2 : 0; //right/bottom text is too large\r\n\r\n\t pos$$1 = this._sliderPadding + corner1 - half + pos1 - pos2;\r\n\t }\r\n\t title.style[cornerStr] = pos$$1 + \"px\";\r\n\t }\r\n\t }\r\n\t },\r\n\t _set_value_now: function _set_value_now() {\r\n\t this._get_slider_handle().setAttribute(\"aria-valuenow\", this._settings.value);\r\n\t },\r\n\t refresh: function refresh() {\r\n\t var handle = this._get_slider_handle();\r\n\r\n\t if (handle) {\r\n\t this._set_value_now();\r\n\r\n\t if (this._settings.title) handle.setAttribute(\"aria-label\", this._settings.label + \" \" + this._settings.title(this._settings, this));\r\n\r\n\t this._set_inner_size();\r\n\t }\r\n\t },\r\n\t $setValue: function $setValue() {\r\n\t this.refresh();\r\n\t },\r\n\t $getValue: function $getValue() {\r\n\t return this._settings.value;\r\n\t },\r\n\t $init: function $init(config) {\r\n\t if (env.touch) this.attachEvent(\"onTouchStart\", bind(this._on_mouse_down_start, this));else _event(this._viewobj, \"mousedown\", bind(this._on_mouse_down_start, this));\r\n\r\n\t _event(this.$view, \"keydown\", bind(this._handle_move_keyboard, this));\r\n\r\n\t if (config.vertical) {\r\n\t config.height = config.height || $active.vSliderHeight;\r\n\t this._viewobj.className += \" webix_slider_vertical\";\r\n\t this._sliderPadding = $active.vSliderPadding;\r\n\t }\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this._sliderHandleWidth = $active.sliderHandleWidth; //8 - width of handle / 2\r\n\r\n\t this._sliderPadding = $active.sliderPadding; //10 - padding of webix_slider_box ( 20 = 10*2 )\r\n\r\n\t this._sliderBorder = $active.sliderBorder; //1px border\r\n\t },\r\n\t _handle_move_keyboard: function _handle_move_keyboard(e) {\r\n\t var code = e.keyCode,\r\n\t c = this._settings,\r\n\t value = c.value;\r\n\r\n\t if (code > 32 && code < 41) {\r\n\t preventEvent(e);\r\n\t var trg = e.target || e.srcElement;\r\n\t var match = /webix_slider_handle_(\\d)/.exec(trg.className);\r\n\t this._activeIndex = match ? parseInt(match[1], 10) : -1;\r\n\t if (match) value = c.value[this._activeIndex];\r\n\t value = value < c.min ? c.min : value > c.max ? c.max : value;\r\n\t if (code === 35) value = c.min;else if (code === 36) value = c.max;else {\r\n\t var inc = code === 37 || code === 40 || code === 34 ? -1 : 1;\r\n\t if (code === 33 || code === 34 || c.step > 1) inc = inc * c.step;\r\n\t value = value * 1 + inc;\r\n\t }\r\n\r\n\t if (match) {\r\n\t var other = c.value[this._activeIndex ? 0 : 1];\r\n\t value = this._activeIndex && value <= other || !this._activeIndex && value >= other ? other : value;\r\n\t }\r\n\r\n\t if (value >= c.min && value <= c.max) {\r\n\t if (match) {\r\n\t var temp = [];\r\n\r\n\t for (var i = 0; i < c.value.length; i++) {\r\n\t temp[i] = i === this._activeIndex ? value : c.value[i];\r\n\t }\r\n\r\n\t value = temp;\r\n\t }\r\n\r\n\t this.setValue(value);\r\n\t this._activeIndex = -1;\r\n\t }\r\n\t }\r\n\t },\r\n\t _on_mouse_down_start: function _on_mouse_down_start(e) {\r\n\t var trg = e.target || e.srcElement;\r\n\r\n\t if (this._mouse_down_process) {\r\n\t this._mouse_down_process(e);\r\n\t }\r\n\r\n\t var value = this._settings.value;\r\n\t if (isArray(value)) value = copy(value);\r\n\r\n\t if (trg.className.indexOf(\"webix_slider_handle\") != -1) {\r\n\t this._start_value = value;\r\n\t return this._start_handle_dnd.apply(this, arguments);\r\n\t } else if (trg.className.indexOf(\"webix_slider\") != -1) {\r\n\t this._start_value = value;\r\n\t this._settings.value = this._get_value_from_event.apply(this, arguments);\r\n\r\n\t this._start_handle_dnd(e);\r\n\t }\r\n\t },\r\n\t _start_handle_dnd: function _start_handle_dnd() {\r\n\t if (env.touch) {\r\n\t this._handle_drag_events = [this.attachEvent(\"onTouchMove\", bind(this._handle_move_process, this)), this.attachEvent(\"onTouchEnd\", bind(this._handle_move_stop, this))];\r\n\t } else this._handle_drag_events = [event$1(document.body, \"mousemove\", bind(this._handle_move_process, this)), event$1(window, \"mouseup\", bind(this._handle_move_stop, this))];\r\n\r\n\t addCss(document.body, \"webix_noselect\");\r\n\t },\r\n\t _handle_move_stop: function _handle_move_stop() {\r\n\t //detach event handlers\r\n\t if (this._handle_drag_events) {\r\n\t if (env.touch) {\r\n\t this.detachEvent(this._handle_drag_events[0]);\r\n\t this.detachEvent(this._handle_drag_events[1]);\r\n\t } else {\r\n\t eventRemove(this._handle_drag_events[0]);\r\n\t eventRemove(this._handle_drag_events[1]);\r\n\t }\r\n\r\n\t this._handle_drag_events = [];\r\n\t }\r\n\r\n\t removeCss(document.body, \"webix_noselect\");\r\n\t var value = this._settings.value;\r\n\t if (isArray(value)) value = copy(value);\r\n\t this._settings.value = this._start_value;\r\n\t this.setValue(value);\r\n\r\n\t this._get_slider_handle(this._activeIndex).focus();\r\n\r\n\t this._activeIndex = -1;\r\n\t },\r\n\t _handle_move_process: function _handle_move_process() {\r\n\t this._settings.value = this._get_value_from_event.apply(this, arguments);\r\n\t this.refresh();\r\n\t this.callEvent(\"onSliderDrag\", []);\r\n\t },\r\n\t _get_value_from_event: function _get_value_from_event(event, touchContext) {\r\n\t // this method takes 2 arguments in case of touch env\r\n\t var pos$$1 = 0;\r\n\t var ax = this._settings.vertical ? \"y\" : \"x\";\r\n\t if (env.touch) pos$$1 = touchContext ? touchContext[ax] : event[ax];else pos$$1 = pos(event)[ax];\r\n\t return this._get_value_from_pos(pos$$1);\r\n\t },\r\n\t _get_value_from_pos: function _get_value_from_pos(pos$$1) {\r\n\t var config = this._settings;\r\n\t var max = config.max - config.min;\r\n\t var ax = config.vertical ? \"y\" : \"x\"; //top or left depending on slider type\r\n\r\n\t var corner = offset(this._get_slider_handle().parentNode)[ax] + this._sliderPadding; //height or width depending on slider type\r\n\r\n\r\n\t var size = (config.vertical ? this._content_height : this._get_input_width(config)) - 2 * this._sliderPadding;\r\n\t var newvalue = size ? (pos$$1 - corner) * max / size : 0;\r\n\t if (config.vertical) newvalue = max - newvalue;\r\n\t newvalue = Math.round((newvalue + config.min) / config.step) * config.step;\r\n\t return Math.max(Math.min(newvalue, config.max), config.min);\r\n\t },\r\n\t _init_onchange: function _init_onchange() {} //need not ui.text logic\r\n\r\n\t};\r\n\tvar view$X = exports.protoUI(api$X, text.view);\r\n\tvar slider = {\r\n\t api: api$X,\r\n\t view: view$X\r\n\t};\r\n\r\n\tvar api$Y = {\r\n\t name: \"rangeslider\",\r\n\t $cssName: \"slider webix_rangeslider\",\r\n\t defaults: {\r\n\t separator: \",\",\r\n\t value: \"20,80\",\r\n\t template: function template(obj, common) {\r\n\t var id = \"x\" + uid();\r\n\t common._handle_id = [id + \"_0\", id + \"_1\"];\r\n\t var aria = \"role='slider' aria-label='\" + obj.label + (obj.title ? \" \" + obj.title(obj) : \"\") + \"' aria-valuemax='\" + obj.max + \"' aria-valuemin='\" + obj.min + \"' tabindex='0'\";\r\n\t var handles = \"
     
    \";\r\n\t handles += \"
     
    \";\r\n\t var title = \"
    \";\r\n\t if (obj.moveTitle) title = \"
    \" + (title + title) + \"
    \";\r\n\t var parts = \"
     
    \";\r\n\t var html = \"\";\r\n\t if (obj.vertical) html = \"
    \" + parts + handles + \"
    \" + title;else html = title + \"
    \" + parts + handles + \"
    \";\r\n\t return common.$renderInput(obj, html, id);\r\n\t }\r\n\t },\r\n\t value_setter: function value_setter(value) {\r\n\t if (!isArray(value)) {\r\n\t value = value.toString().split(this._settings.separator);\r\n\t }\r\n\r\n\t if (value.length < 2) value[1] = value[0];\r\n\t value[0] = parseFloat(value[0]);\r\n\t value[1] = parseFloat(value[1]);\r\n\t return value;\r\n\t },\r\n\t _get_slider_handle: function _get_slider_handle(index$$1) {\r\n\t index$$1 = index$$1 && index$$1 >= 0 ? index$$1 : 0;\r\n\t return this.$view.querySelector(\".webix_slider_handle_\" + (index$$1 || 0));\r\n\t },\r\n\t _get_left_pos: function _get_left_pos(size, index$$1) {\r\n\t var config, max, value;\r\n\t config = this._settings;\r\n\t max = config.max - config.min;\r\n\t value = config.value[index$$1] % config.step ? Math.round(config.value[index$$1] / config.step) * config.step : config.value[index$$1];\r\n\t value = Math.max(Math.min(value, config.max), config.min);\r\n\t return Math.ceil((size - this._sliderPadding * 2) * (value - config.min) / max);\r\n\t },\r\n\t _set_left_pos: function _set_left_pos(size, left, vertical) {\r\n\t var pos$$1 = this._sliderPadding + left - this._sliderHandleWidth / 2 * (vertical ? -1 : 1);\r\n\t pos$$1 = vertical ? size - pos$$1 : pos$$1;\r\n\t return pos$$1 + \"px\";\r\n\t },\r\n\t _set_value_pos: function _set_value_pos(size, left, length, vertical) {\r\n\t var pos$$1 = left + this._sliderPadding + 2 * this._sliderBorder;\r\n\t if (vertical) pos$$1 = size - pos$$1 - length;\r\n\t return pos$$1 + \"px\";\r\n\t },\r\n\t _set_inner_size: function _set_inner_size() {\r\n\t var config, handle0, handle1, left0, left1, max, length, parentBox, sizeStr, size, cornerStr;\r\n\t handle0 = this._get_slider_handle(0);\r\n\t handle1 = this._get_slider_handle(1);\r\n\t config = this._settings;\r\n\r\n\t if (!isArray(config.value)) {\r\n\t this.define(\"value\", config.value);\r\n\t }\r\n\r\n\t if (handle0) {\r\n\t sizeStr = config.vertical ? \"height\" : \"width\";\r\n\t cornerStr = config.vertical ? \"top\" : \"left\";\r\n\t size = config.vertical ? this._content_height : this._get_input_width(config);\r\n\t max = size - this._sliderPadding * 2 - 2 * this._sliderBorder;\r\n\t left0 = this._get_left_pos(size, 0);\r\n\t left1 = this._get_left_pos(size, 1);\r\n\t length = left1 - left0;\r\n\t handle0.style[cornerStr] = this._set_left_pos(size, left0, config.vertical);\r\n\t handle1.style[cornerStr] = this._set_left_pos(size, left1, config.vertical);\r\n\t parentBox = handle0.parentNode;\r\n\t parentBox.style[sizeStr] = size + \"px\";\r\n\t parentBox.firstChild.style[sizeStr] = max + \"px\";\r\n\t parentBox.childNodes[1].style[sizeStr] = length + \"px\";\r\n\t parentBox.childNodes[1].style[cornerStr] = this._set_value_pos(size, left0, length, config.vertical);\r\n\r\n\t this._set_title(handle0, [left0, left1], max, cornerStr);\r\n\t }\r\n\t },\r\n\t _title_hidden: 0,\r\n\t _hide_title: function _hide_title(title, index$$1) {\r\n\t if (!isUndefined(this._title_hidden)) title[this._title_hidden].style.visibility = \"visible\";\r\n\r\n\t if (!isUndefined(index$$1)) {\r\n\t title[index$$1].style.visibility = \"hidden\";\r\n\t this._title_hidden = index$$1;\r\n\t }\r\n\t },\r\n\t _set_title: function _set_title(handle0, left, max, cornerStr) {\r\n\t var config = this._settings;\r\n\r\n\t if (this._settings.title) {\r\n\t var box = handle0.parentNode;\r\n\t var sibling = config.vertical ? \"nextSibling\" : \"previousSibling\";\r\n\t if (!config.moveTitle) box[sibling].innerHTML = this._settings.title(this._settings, this);else {\r\n\t //two independent titles\r\n\t var title = box[sibling].childNodes;\r\n\t var pos$$1 = [];\r\n\r\n\t for (var i = 0; i < 2; i++) {\r\n\t pos$$1.push(this._set_title_n(title[i], config.value[i], left[i], max, cornerStr, i));\r\n\t } //correct for overlapping titles\r\n\r\n\r\n\t var diff = config.vertical ? pos$$1[0] - pos$$1[1] - this._sliderHandleWidth : pos$$1[1] - pos$$1[0];\r\n\t var sizeStr = config.vertical ? \"clientHeight\" : \"clientWidth\";\r\n\t if (title[0][sizeStr] / 2 + title[1][sizeStr] / 2 > diff) this._hide_title(title, isUndefined(this._activeIndex) ? 0 : this._activeIndex ? 0 : 1);else this._hide_title(title); //set position\r\n\r\n\t for (var _i = 0; _i < 2; _i++) {\r\n\t title[_i].style[cornerStr] = pos$$1[_i] + \"px\";\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _set_title_n: function _set_title_n(title, value, left, max, cornerStr, index$$1) {\r\n\t title.innerHTML = this._settings.title({\r\n\t value: value\r\n\t }, this);\r\n\t var half = title.clientWidth / 2;\r\n\t var pos$$1 = 0;\r\n\t if (this._settings.vertical) pos$$1 = max - left - this._sliderHandleWidth / 2 - (index$$1 ? this._sliderPadding + this.config.inputPadding : 0) + 2 * this._sliderBorder;else {\r\n\t pos$$1 = left + this._sliderHandleWidth / 2 + 2 * this._sliderBorder - half;\r\n\t pos$$1 = !index$$1 && half > left ? half - left + pos$$1 : pos$$1; //left/top text is to small\r\n\r\n\t pos$$1 = index$$1 && half + left > max ? pos$$1 - half + (max - left) : pos$$1; //right/bottom text is too large\r\n\t }\r\n\t return pos$$1;\r\n\t },\r\n\t _set_value_now: function _set_value_now() {\r\n\t for (var i = 0; i < 2; i++) {\r\n\t this._get_slider_handle(i).setAttribute(\"aria-valuenow\", this._settings.value[i]);\r\n\t }\r\n\t },\r\n\t _mouse_down_process: function _mouse_down_process(e) {\r\n\t var trg = e.target || e.srcElement;\r\n\t var match = /webix_slider_handle_(\\d)/.exec(trg.className);\r\n\t this._activeIndex = match ? parseInt(match[1], 10) : -1;\r\n\t if (match) this._set_handle_active(this._activeIndex);\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t var oldvalue = this._settings.value;\r\n\t var temp = _typeof(value) == \"object\" ? value.join(this._settings.separator) : value;\r\n\t if (oldvalue.join(this._settings.separator) == temp) return false;\r\n\t this._settings.value = value;\r\n\t if (this._rendered_input) this.$setValue(value);\r\n\t this.callEvent(\"onChange\", [value, oldvalue]);\r\n\t },\r\n\t $getValue: function $getValue() {\r\n\t var value = this._settings.value;\r\n\t return this._settings.stringResult ? value.join(this._settings.separator) : value;\r\n\t },\r\n\t _set_handle_active: function _set_handle_active(index$$1) {\r\n\t var hActive = this._get_slider_handle(index$$1);\r\n\r\n\t var h = this._get_slider_handle(1 - index$$1);\r\n\r\n\t if (hActive.className.indexOf(\"webix_slider_active\") == -1) hActive.className += \" webix_slider_active\";\r\n\t h.className = h.className.replace(\" webix_slider_active\", \"\");\r\n\t },\r\n\t _get_value_from_pos: function _get_value_from_pos(pos$$1) {\r\n\t var config = this._settings;\r\n\t var value = config.value; //10 - padding of slider box\r\n\r\n\t var max = config.max - config.min;\r\n\t var ax = config.vertical ? \"y\" : \"x\";\r\n\t var left = offset(this._get_slider_handle().parentNode)[ax];\r\n\t var newvalue = Math.ceil((pos$$1 - left) * max / (config.vertical ? this._content_height : this._get_input_width(config)));\r\n\t newvalue = Math.round((newvalue + config.min) / config.step) * config.step;\r\n\t if (config.vertical) newvalue = max - newvalue;\r\n\t var index$$1 = null;\r\n\t var pos0 = offset(this._get_slider_handle(0))[ax];\r\n\t var pos1 = offset(this._get_slider_handle(1))[ax];\r\n\r\n\t if (pos0 == pos1 && (config.value[0] == config.min || config.value[0] == config.max)) {\r\n\t index$$1 = config.value[0] == config.min ? 1 : 0;\r\n\r\n\t this._set_handle_active(index$$1);\r\n\t } else {\r\n\t if (this._activeIndex >= 0) {\r\n\t index$$1 = this._activeIndex;\r\n\t } else {\r\n\t if (pos0 == pos1) {\r\n\t index$$1 = pos$$1 < pos0 ? 0 : 1;\r\n\t } else {\r\n\t var dist0 = Math.abs(pos0 - pos$$1);\r\n\t var dist1 = Math.abs(pos1 - pos$$1);\r\n\t index$$1 = dist0 < dist1 ? 0 : 1;\r\n\t this._activeIndex = index$$1;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (index$$1) {\r\n\t value[index$$1] = Math.max(Math.min(newvalue, config.max), value[0]);\r\n\t } else {\r\n\t value[index$$1] = Math.max(Math.min(newvalue, value[1]), config.min);\r\n\t }\r\n\r\n\t return value;\r\n\t }\r\n\t};\r\n\tvar view$Y = exports.protoUI(api$Y, slider.view);\r\n\r\n\tvar api$Z = {\r\n\t name: \"switch\",\r\n\t defaults: {\r\n\t template: function template(config, common) {\r\n\t common._calck_switch_size();\r\n\r\n\t var id = config.name || \"x\" + uid();\r\n\t var rightlabel = \"\";\r\n\r\n\t if (config.labelRight) {\r\n\t rightlabel = \"\";\r\n\t if (config.labelWidth) config.label = config.label || \" \";\r\n\t }\r\n\r\n\t var checked = config.checkValue == config.value;\r\n\t var aria = \"aria-label=\\\"\" + (config.label || config.labelRight || \"\") + \"\\\" role=\\\"checkbox\\\" tabindex=\\\"0\\\" aria-checked=\\\"\" + (checked ? \"true\" : \"false\") + \"\\\" \" + (config.readonly ? \"aria-readonly='true'\" : \"\") + \"\\\"\";\r\n\t var html = \"
    \" + \"\" + ((checked ? config.onLabel : config.offLabel) || \"\") + \"\" + \"\" + \"
    \" + rightlabel;\r\n\t return common.$renderInput(config, html, id);\r\n\t }\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this._switchHeight = $active.switchHeight;\r\n\t this._switchWidth = $active.switchWidth;\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t var config = this._settings;\r\n\t var checked = value == config.checkValue;\r\n\t var box = this.$view.querySelector(\".webix_switch_box\");\r\n\r\n\t if (box) {\r\n\t var handle = box.childNodes[1];\r\n\t var text = (checked ? config.onLabel : config.offLabel) || \"\";\r\n\t if (checked) addCss(box, \"webix_switch_on\");else removeCss(box, \"webix_switch_on\");\r\n\t handle.style.left = (checked ? this._switchWidth - this._switchHeight : 0) + \"px\";\r\n\t handle.firstChild.checked = checked;\r\n\t handle.setAttribute(\"aria-checked\", checked ? \"true\" : \"false\");\r\n\r\n\t if (text) {\r\n\t box.childNodes[0].innerHTML = text;\r\n\t }\r\n\t }\r\n\t },\r\n\t _calck_switch_size: function _calck_switch_size() {\r\n\t var config = this._settings;\r\n\r\n\t if (config.onLabel || config.offLabel) {\r\n\t var onWidth = config.onLabel ? getTextSize(config.onLabel, \"webix_switch_text\").width : 0;\r\n\t var offWidth = config.onLabel ? getTextSize(config.offLabel, \"webix_switch_text\").width : 0;\r\n\t this._switchWidth = Math.max(onWidth, offWidth) + this._switchHeight;\r\n\t }\r\n\t },\r\n\t on_click: {\r\n\t \"webix_switch_box\": function webix_switch_box() {\r\n\t if (!this._settings.readonly) this.toggle();\r\n\t },\r\n\t \"webix_label_right\": function webix_label_right() {\r\n\t if (!this._settings.readonly) this.toggle();\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$Z = exports.protoUI(api$Z, checkbox.view);\r\n\r\n\tvar api$_ = {\r\n\t name: \"tabbar\",\r\n\t $init: function $init() {\r\n\t this.attachEvent(\"onKeyPress\", this._onKeyPress);\r\n\t },\r\n\t $skin: function $skin() {\r\n\t var skin$$1 = $active;\r\n\t var defaults = this.defaults;\r\n\t defaults.topOffset = skin$$1.tabTopOffset || 0;\r\n\t defaults.tabOffset = typeof skin$$1.tabOffset != \"undefined\" ? skin$$1.tabOffset : 10;\r\n\t defaults.bottomOffset = skin$$1.tabBottomOffset || 0;\r\n\t defaults.height = skin$$1.tabbarHeight;\r\n\t defaults.tabMargin = skin$$1.tabMargin;\r\n\t defaults.inputPadding = skin$$1.inputPadding;\r\n\t defaults.tabMinWidth = skin$$1.tabMinWidth || 100;\r\n\t defaults.tabMoreWidth = skin$$1.tabMoreWidth || 40;\r\n\t defaults.borderless = !skin$$1.tabBorder;\r\n\t },\r\n\t _getTabbarSizes: function _getTabbarSizes() {\r\n\t var config = this._settings,\r\n\t i,\r\n\t len,\r\n\t tabs = this._tabs || config.options,\r\n\t totalWidth = this._input_width - config.tabOffset * 2,\r\n\t limitWidth = config.optionWidth || config.tabMinWidth;\r\n\t len = tabs.length;\r\n\r\n\t if (config.tabMinWidth && totalWidth / len < limitWidth) {\r\n\t return {\r\n\t max: parseInt(totalWidth / limitWidth, 10) || 1\r\n\t };\r\n\t }\r\n\r\n\t if (!config.optionWidth) {\r\n\t for (i = 0; i < len; i++) {\r\n\t if (tabs[i].width) {\r\n\t totalWidth -= tabs[i].width + (!i && !config.type ? config.tabMargin : 0);\r\n\t len--;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return {\r\n\t width: len ? totalWidth / len : config.tabMinWidth\r\n\t };\r\n\t },\r\n\t _init_popup: function _init_popup() {\r\n\t var obj = this._settings;\r\n\r\n\t if (!obj.tabbarPopup) {\r\n\t var popupConfig = {\r\n\t view: \"popup\",\r\n\t width: obj.popupWidth || 200,\r\n\t body: {\r\n\t view: \"list\",\r\n\t borderless: true,\r\n\t select: true,\r\n\t css: \"webix_tab_list\",\r\n\t autoheight: true,\r\n\t yCount: obj.yCount,\r\n\t type: {\r\n\t template: obj.popupTemplate\r\n\t }\r\n\t }\r\n\t };\r\n\t var view = ui(popupConfig);\r\n\t view.getBody().attachEvent(\"onBeforeSelect\", bind(function (id) {\r\n\t if (id && this.callEvent(\"onBeforeTabClick\", [id])) {\r\n\t this.setValue(id);\r\n\t $$(this._settings.tabbarPopup).hide();\r\n\t this.callEvent(\"onAfterTabClick\", [id]);\r\n\t return true;\r\n\t }\r\n\t }, this));\r\n\t view.getBody().attachEvent(\"onAfterSelect\", bind(function () {\r\n\t this.refresh();\r\n\t }, this));\r\n\t obj.tabbarPopup = view._settings.id;\r\n\r\n\t this._destroy_with_me.push(view);\r\n\t }\r\n\r\n\t this._init_popup = function () {};\r\n\t },\r\n\t getPopup: function getPopup() {\r\n\t this._init_popup();\r\n\r\n\t return $$(this._settings.tabbarPopup);\r\n\t },\r\n\t moreTemplate_setter: template,\r\n\t popupTemplate_setter: template,\r\n\t defaults: {\r\n\t popupWidth: 200,\r\n\t popupTemplate: \"#value#\",\r\n\t yCount: 7,\r\n\t moreTemplate: \"\",\r\n\t template: function template$$1(obj, common) {\r\n\t var contentWidth, html, i, leafWidth, resultHTML, style, sum, tabs, verticalOffset, width;\r\n\t common._tabs = tabs = common._filterOptions(obj.options);\r\n\r\n\t if (!tabs.length) {\r\n\t html = \"
    \";\r\n\t } else {\r\n\t common._check_options(tabs);\r\n\r\n\t if (!obj.value && tabs.length) obj.value = tabs[0].id;\r\n\t html = \"\";\r\n\t if (obj.tabOffset) html += \"
     
    \";\r\n\t contentWidth = common._input_width - obj.tabOffset * 2 - (!obj.type ? obj.tabMargin * (tabs.length - 1) : 0);\r\n\t verticalOffset = obj.topOffset + obj.bottomOffset;\r\n\r\n\t var sizes = common._getTabbarSizes();\r\n\r\n\t if (sizes.max && sizes.max < tabs.length) {\r\n\t //we need popup\r\n\t var popup = common.getPopup();\r\n\t popup.hide();\r\n\t var list = popup.getBody() || null;\r\n\r\n\t if (list) {\r\n\t if (sizes.max) {\r\n\t var found = false;\r\n\r\n\t for (i = 0; i < tabs.length && !found; i++) {\r\n\t if (tabs[i].id == obj.value) {\r\n\t found = true;\r\n\r\n\t if (i + 1 > sizes.max) {\r\n\t var selectedTab = tabs.splice(i, 1);\r\n\t var displayTabs = tabs.splice(0, sizes.max - 1).concat(selectedTab);\r\n\t tabs = displayTabs.concat(tabs);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t list.clearAll();\r\n\t list.parse(tabs.slice(sizes.max));\r\n\t } else {\r\n\t list.clearAll();\r\n\t }\r\n\t }\r\n\t } else if (common._settings.tabbarPopup) $$(common._settings.tabbarPopup).hide();\r\n\r\n\t sum = obj.tabOffset;\r\n\t var lastTab = false;\r\n\r\n\t for (i = 0; i < tabs.length && !lastTab; i++) {\r\n\t // tab width\r\n\t if (sizes && sizes.max) {\r\n\t if (sizes.max == i + 1) {\r\n\t lastTab = true;\r\n\t }\r\n\r\n\t contentWidth = common._input_width - obj.tabOffset * 2 - (!obj.type && sizes.max > 1 ? obj.tabMargin * (sizes.max - 1) : 0);\r\n\t width = (contentWidth - obj.tabMoreWidth) / sizes.max;\r\n\t } else width = sizes.width;\r\n\r\n\t width = tabs[i].width || obj.optionWidth || width;\r\n\t sum += width + (i && !obj.type ? obj.tabMargin : 0);\r\n\t if (obj.tabMargin > 0 && i && !obj.type) html += \"
    \"; // tab innerHTML\r\n\r\n\t html += common._getTabHTML(tabs[i], width);\r\n\r\n\t if (lastTab) {\r\n\t html += \"
    \" + obj.moreTemplate(obj, common) + \"
    \";\r\n\t sum += obj.tabMoreWidth;\r\n\t }\r\n\t }\r\n\r\n\t leafWidth = common._content_width - sum;\r\n\t if (leafWidth > 0 && !obj.type) html += \"
     
    \";\r\n\t }\r\n\r\n\t resultHTML = \"\"; // consider top and bottom offset in tabs height (top tabbar)\r\n\r\n\t style = verticalOffset && !obj.type ? \"height:\" + (common._content_height - verticalOffset) + \"px\" : \"\"; //space above tabs (top tabbar)\r\n\r\n\t if (obj.topOffset && !obj.type) resultHTML += \"
    \"; // tabs html\r\n\r\n\t resultHTML += \"
    \" + html + \"
    \"; //space below to tabs (top tabbar)\r\n\r\n\t if (obj.bottomOffset && !obj.type) resultHTML += \"
    \";\r\n\t return resultHTML;\r\n\t }\r\n\t },\r\n\t _getInputNode: function _getInputNode() {\r\n\t return this.$view.querySelectorAll(\".webix_item_tab\");\r\n\t },\r\n\t _getTabHTML: function _getTabHTML(tab, width) {\r\n\t var html,\r\n\t className = \"\",\r\n\t config = this.config;\r\n\t if (tab.id == config.value) className = \" webix_selected\";\r\n\t if (tab.css) className += \" \" + tab.css;\r\n\t width = tab.width || width;\r\n\t html = \"
    \"; // a tab title\r\n\r\n\t if (this._tabTemplate) {\r\n\t var calcHeight = this._content_height - config.inputPadding * 2 - 2;\r\n\t var height = this._content_height - 2;\r\n\t var temp = exports.extend({\r\n\t cheight: calcHeight,\r\n\t aheight: height\r\n\t }, tab);\r\n\t html += this._tabTemplate(temp);\r\n\t } else {\r\n\t var icon = tab.icon ? \" \" : \"\";\r\n\t html += icon + tab.value;\r\n\t }\r\n\r\n\t if (tab.close || config.close) html += \"\";\r\n\t html += \"
    \";\r\n\t return html;\r\n\t },\r\n\t _types: {\r\n\t image: \"
    #value#
    \",\r\n\t icon: \"
    #value#
    \",\r\n\t iconTop: \"
    #value#
    \"\r\n\t },\r\n\t type_setter: function type_setter(value) {\r\n\t this._settings.tabOffset = 0;\r\n\t if (this._types[value]) this._tabTemplate = template(this._types[value]);\r\n\t return value;\r\n\t }\r\n\t};\r\n\tvar view$_ = exports.protoUI(api$_, segmented.view);\r\n\r\n\tvar api$10 = {\r\n\t name: \"richtext\",\r\n\t defaults: {\r\n\t label: \"\",\r\n\t labelWidth: 80,\r\n\t labelPosition: \"left\"\r\n\t },\r\n\t $init: function $init() {\r\n\t this._viewobj.className += \" webix_richtext\";\r\n\t this.$ready.unshift(this._setLayout);\r\n\t },\r\n\t getInputNode: function getInputNode() {\r\n\t return this.$view.querySelector(\".webix_richtext_editor\");\r\n\t },\r\n\t _button: function _button(name) {\r\n\t return {\r\n\t view: \"toggle\",\r\n\t type: \"iconButton\",\r\n\t icon: \"wxi-\" + name,\r\n\t name: name,\r\n\t id: name,\r\n\t label: i18n.richtext[name],\r\n\t autowidth: true,\r\n\t action: name,\r\n\t click: this._add_data\r\n\t };\r\n\t },\r\n\t _setLayout: function _setLayout() {\r\n\t var top = this;\r\n\t var editField = {\r\n\t view: \"template\",\r\n\t css: \"webix_richtext_container\",\r\n\t borderless: true,\r\n\t template: \"
    \" + this.getValue() + \"
    \",\r\n\t on: {\r\n\t onAfterRender: function onAfterRender() {\r\n\t top._rendered_input = true;\r\n\r\n\t _event(top.getInputNode(), \"blur\", function () {\r\n\t top._updateValue(this.innerHTML);\r\n\t });\r\n\r\n\t _event(top.getInputNode(), \"keyup\", function () {\r\n\t top._getselection();\r\n\t });\r\n\t }\r\n\t },\r\n\t onClick: {\r\n\t webix_richtext_editor: function webix_richtext_editor() {\r\n\t top._getselection();\r\n\t }\r\n\t }\r\n\t };\r\n\t var editorToolbar = {\r\n\t view: \"toolbar\",\r\n\t id: \"toolbar\",\r\n\t elements: [this._button(\"underline\"), this._button(\"bold\"), this._button(\"italic\"), {}]\r\n\t };\r\n\t var rows = [editorToolbar, editField];\r\n\r\n\t if (this.config.labelPosition === \"top\" || !this.config.labelWidth) {\r\n\t editorToolbar.elements.concat([{\r\n\t view: \"label\",\r\n\t label: this.config.label,\r\n\t align: \"right\"\r\n\t }, {\r\n\t width: 4\r\n\t }]);\r\n\t this.rows_setter(rows);\r\n\t } else {\r\n\t this.config.borderless = true;\r\n\t this.cols_setter([{\r\n\t template: this.config.label || \" \",\r\n\t css: \"webix_richtext_inp_label\",\r\n\t borderless: true,\r\n\t width: this.config.labelWidth\r\n\t }, {\r\n\t rows: rows\r\n\t }]);\r\n\t }\r\n\t },\r\n\t _getselection: function _getselection() {\r\n\t var top = this;\r\n\t var bar = top.$$(\"toolbar\");\r\n\t var sel;\r\n\t bar.setValues({\r\n\t italic: false,\r\n\t underline: false,\r\n\t bold: false\r\n\t });\r\n\r\n\t if (window.getSelection) {\r\n\t sel = window.getSelection();\r\n\t } else {\r\n\t sel = document.selection.createRange();\r\n\t }\r\n\r\n\t for (var i = 0; i < sel.rangeCount; ++i) {\r\n\t if (top.$view.contains(this.getInputNode())) {\r\n\t if (document.queryCommandState(\"bold\")) {\r\n\t top.$$(\"bold\").setValue(true);\r\n\t }\r\n\r\n\t if (document.queryCommandState(\"underline\")) {\r\n\t top.$$(\"underline\").setValue(true);\r\n\t }\r\n\r\n\t if (document.queryCommandState(\"italic\")) {\r\n\t top.$$(\"italic\").setValue(true);\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t refresh: function refresh() {\r\n\t if (this._rendered_input) this.getInputNode().innerHTML = this.config.value;\r\n\t },\r\n\t _execCommandOnElement: function _execCommandOnElement(el, commandName) {\r\n\t var sel, selText;\r\n\r\n\t if (window.getSelection()) {\r\n\t sel = window.getSelection();\r\n\t selText = sel.toString().length;\r\n\t } else {\r\n\t sel = document.selection.createRange();\r\n\t selText = sel.text.length;\r\n\t }\r\n\r\n\t if (selText > 0) {\r\n\t for (var i = 0; i < sel.rangeCount; ++i) {\r\n\t var range = sel.getRangeAt(i);\r\n\r\n\t if (!sel.isCollapsed) {\r\n\t document.execCommand(commandName, false, \"\");\r\n\t } else {\r\n\t var textValue = sel.focusNode.textContent;\r\n\t var focusEl = sel.focusNode;\r\n\t var focustext = sel.anchorOffset;\r\n\t var wordBegining = textValue.substring(0, focustext).match(/[A-Za-z]*$/)[0];\r\n\t var wordEnd = textValue.substring(focustext).match(/^[A-Za-z]*/)[0];\r\n\t var startWord = focustext - wordBegining.length;\r\n\t var endWord = focustext + wordEnd.length;\r\n\t range.setStart(focusEl, startWord);\r\n\t range.setEnd(focusEl, endWord);\r\n\t sel.removeAllRanges();\r\n\t window.getSelection().addRange(range);\r\n\t document.execCommand(commandName, false, \"\");\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _add_data: function _add_data() {\r\n\t var top = this.getTopParentView();\r\n\t var editableElement = top.getInputNode();\r\n\r\n\t if (this.$view.contains(this.getInputNode())) {\r\n\t top._execCommandOnElement(editableElement, this.config.action);\r\n\t }\r\n\t },\r\n\t focus: function focus() {\r\n\t var editableElement = this.$view.querySelector(\".webix_richtext_editor\");\r\n\t editableElement.focus();\r\n\t },\r\n\t _updateValue: function _updateValue(value) {\r\n\t var old = this.config.value;\r\n\t this.config.value = value || \"\";\r\n\t if (old !== value) this.callEvent(\"onChange\", [value, old]);\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this._updateValue(value);\r\n\r\n\t this.refresh();\r\n\t },\r\n\t getValue: function getValue() {\r\n\t var input = this.getInputNode();\r\n\t if (input) this.config.value = this.getInputNode().innerHTML;\r\n\t var value = this.config.value;\r\n\t return value || (value === 0 ? \"0\" : \"\");\r\n\t }\r\n\t};\r\n\tvar view$10 = exports.protoUI(api$10, IdSpace, layout.view);\r\n\r\n\t/*\r\n\t\tUI:Uploader\r\n\t*/\r\n\t// #include ui/view.js\r\n\t// #include ui/list.js\r\n\r\n\ttype(list.view, {\r\n\t name: \"uploader\",\r\n\t template: \"{common.removeIcon()}{common.percent()}
    #sizetext#
    {common.fileName()}\",\r\n\t percent: function percent(obj) {\r\n\t if (obj.status == \"transfer\") return \"
    \" + obj.percent + \"%
    \";\r\n\t return \"
    \";\r\n\t },\r\n\t removeIcon: function removeIcon() {\r\n\t return \"
    \";\r\n\t },\r\n\t fileName: function fileName(obj) {\r\n\t return \"
    \" + obj.name + \"
    \";\r\n\t },\r\n\t on_click: {\r\n\t \"webix_remove_upload\": function webix_remove_upload(ev, id) {\r\n\t $$(this.config.uploader).files.remove(id);\r\n\t }\r\n\t }\r\n\t});\r\n\tvar api$11 = {\r\n\t name: \"uploader\",\r\n\t defaults: {\r\n\t autosend: true,\r\n\t multiple: true,\r\n\t inputName: \"upload\"\r\n\t },\r\n\t $cssName: \"button webix_uploader\",\r\n\t $allowsClear: true,\r\n\t on_click: {\r\n\t //don't fire extra onItemClick events, visible button will do it\r\n\t \"webix_hidden_upload\": function webix_hidden_upload() {\r\n\t return false;\r\n\t }\r\n\t },\r\n\t //will be redefined by upload driver\r\n\t send: function send() {},\r\n\t fileDialog: function fileDialog() {},\r\n\t stopUpload: function stopUpload() {},\r\n\t $init: function $init() {\r\n\t var driver = UploadDriver.html5;\r\n\t this.files = new DataCollection();\r\n\t this._destroy_with_me = [this.files]; // browser doesn't support XMLHttpRequest2\r\n\r\n\t if (isUndefined(XMLHttpRequest) || isUndefined(new XMLHttpRequest().upload)) driver = UploadDriver.flash;\r\n\t assert(driver, \"incorrect driver\");\r\n\t exports.extend(this, driver, true);\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t apiOnly_setter: function apiOnly_setter(value) {\r\n\t delay(this.render, this);\r\n\t return this.$apiOnly = value;\r\n\t },\r\n\t _add_files: function _add_files(files) {\r\n\t for (var i = 0; i < files.length; i++) {\r\n\t this.addFile(files[i]);\r\n\t }\r\n\t },\r\n\t link_setter: function link_setter(value) {\r\n\t if (value) delay(function () {\r\n\t var view = $$(this._settings.link);\r\n\r\n\t if (!view) {\r\n\t var top = this.getTopParentView();\r\n\t if (top.$$) view = top.$$(this._settings.link);\r\n\t }\r\n\r\n\t if (view.sync && view.filter) view.sync(this.files);else if (view.setValues) this.files.data.attachEvent(\"onStoreUpdated\", function () {\r\n\t view.setValues(this);\r\n\t });\r\n\t view._settings.uploader = this._settings.id;\r\n\t }, this);\r\n\t return value;\r\n\t },\r\n\t addFile: function addFile(name, size, type$$1, extra) {\r\n\t var file = null;\r\n\r\n\t if (_typeof(name) == \"object\") {\r\n\t file = name;\r\n\t name = file.name;\r\n\t size = file.size;\r\n\t }\r\n\r\n\t var format = this._format_size(size);\r\n\r\n\t type$$1 = type$$1 || name.split(\".\").pop();\r\n\t var file_struct = {\r\n\t file: file,\r\n\t name: name,\r\n\t id: uid(),\r\n\t size: size,\r\n\t sizetext: format,\r\n\t type: type$$1,\r\n\t context: this._last_file_context,\r\n\t status: \"client\"\r\n\t };\r\n\t if (file.webkitRelativePath) file_struct.name = file.webkitRelativePath;\r\n\t if (extra) exports.extend(file_struct, extra, true);\r\n\r\n\t if (this.callEvent(\"onBeforeFileAdd\", [file_struct])) {\r\n\t if (!this._settings.multiple) this.files.clearAll();\r\n\t var id = this.files.add(file_struct);\r\n\t this.callEvent(\"onAfterFileAdd\", [file_struct]);\r\n\t if (id && this._settings.autosend) this.send(id);\r\n\t }\r\n\r\n\t return file_struct;\r\n\t },\r\n\t _get_active_url: function _get_active_url(item) {\r\n\t var url = this._settings.upload;\r\n\t var urldata = exports.extend(item.urlData || {}, this._settings.urlData || {});\r\n\r\n\t if (url && urldata) {\r\n\t var subline = [];\r\n\r\n\t for (var key in urldata) {\r\n\t subline.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(urldata[key]));\r\n\t }\r\n\r\n\t if (subline.length) url += (url.indexOf(\"?\") == -1 ? \"?\" : \"&\") + subline.join(\"&\");\r\n\t }\r\n\r\n\t return url;\r\n\t },\r\n\t addDropZone: function addDropZone(id, hover_text) {\r\n\t var node = toNode(id);\r\n\t var extra_css = \"\";\r\n\t if (hover_text) extra_css = \" \" + createCss({\r\n\t content: \"\\\"\" + hover_text + \"\\\"\"\r\n\t }, \":before\");\r\n\t var fullcss = \"webix_drop_file\" + extra_css;\r\n\t var timer = null; //web\r\n\r\n\t _event(node, \"dragover\", preventEvent);\r\n\r\n\t _event(node, \"dragover\", function () {\r\n\t addCss(node, fullcss, true);\r\n\r\n\t if (timer) {\r\n\t clearTimeout(timer);\r\n\t timer = null;\r\n\t }\r\n\t });\r\n\r\n\t _event(node, \"dragleave\", function () {\r\n\t //when moving over html child elements\r\n\t //browser will issue dragleave and dragover events\r\n\t //ignore first one\r\n\t timer = setTimeout(function () {\r\n\t removeCss(node, fullcss);\r\n\t }, 150);\r\n\t });\r\n\r\n\t _event(node, \"drop\", bind(function (e) {\r\n\t removeCss(node, fullcss);\r\n\r\n\t this._drop(e);\r\n\r\n\t return preventEvent(e);\r\n\t }, this));\r\n\t },\r\n\t _format_size: function _format_size(size) {\r\n\t var index$$1 = 0;\r\n\r\n\t while (size > 1024) {\r\n\t index$$1++;\r\n\t size = size / 1024;\r\n\t }\r\n\r\n\t return Math.round(size * 100) / 100 + \" \" + i18n.fileSize[index$$1];\r\n\t },\r\n\t _complete: function _complete(id, response) {\r\n\t var item = this.files.getItem(id);\r\n\t exports.extend(item, response, true);\r\n\t item.status = \"server\";\r\n\t item.progress = 100;\r\n\t this.callEvent(\"onFileUpload\", [item, response]);\r\n\t this.callEvent(\"onChange\", []);\r\n\t this.files.updateItem(id);\r\n\t if (this.isUploaded()) this._upload_complete(response);\r\n\t },\r\n\t _upload_complete: function _upload_complete(response) {\r\n\t this.callEvent(\"onUploadComplete\", [response]);\r\n\r\n\t if (this._last_assigned_upload_callback) {\r\n\t this._last_assigned_upload_callback.call(this, response);\r\n\r\n\t this._last_assigned_upload_callback = 0;\r\n\t }\r\n\t },\r\n\t isUploaded: function isUploaded() {\r\n\t var order = this.files.data.order;\r\n\r\n\t for (var i = 0; i < order.length; i++) {\r\n\t if (this.files.getItem(order[i]).status != \"server\") return false;\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t $onUploadComplete: function $onUploadComplete() {},\r\n\t $updateProgress: function $updateProgress(id, percent) {\r\n\t var item = this.files.getItem(id);\r\n\t item.percent = Math.round(percent);\r\n\t this.files.updateItem(id);\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t if (typeof value == \"string\" && value) value = {\r\n\t value: value,\r\n\t status: \"server\"\r\n\t };\r\n\t this.files.clearAll();\r\n\t if (value) this.files.parse(value);\r\n\t this.callEvent(\"onChange\", []);\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t var data = [];\r\n\t this.files.data.each(function (obj) {\r\n\t if (obj.status == \"server\") data.push(obj.value || obj.name);\r\n\t });\r\n\t return data.join(\",\");\r\n\t }\r\n\t};\r\n\tvar view$11 = exports.protoUI(api$11, button$1.view);\r\n\r\n\tvar api$12 = {\r\n\t name: \"suggest\",\r\n\t defaults: {\r\n\t autofocus: false,\r\n\t type: \"list\",\r\n\t keyPressTimeout: 1,\r\n\t body: {\r\n\t yCount: 10,\r\n\t autoheight: true,\r\n\t body: true,\r\n\t select: true,\r\n\t borderless: true,\r\n\t navigation: true\r\n\t },\r\n\t filter: function filter(item, value) {\r\n\t if (item.value.toString().toLowerCase().indexOf(value.toLowerCase()) === 0) return true;\r\n\t return false;\r\n\t }\r\n\t },\r\n\t template_setter: template,\r\n\t filter_setter: function filter_setter(value) {\r\n\t return toFunctor(value, this.$scope);\r\n\t },\r\n\t $init: function $init(obj) {\r\n\t var temp = {};\r\n\t exports.extend(temp, copy(this.defaults.body));\r\n\t temp.view = obj.type || this.defaults.type;\r\n\r\n\t var etemp = this._get_extendable_cell(temp);\r\n\r\n\t if (obj.body) exports.extend(etemp, obj.body, true);\r\n\t if (obj.data) etemp.data = obj.data;\r\n\t if (obj.url) etemp.url = obj.url;\r\n\t if (obj.datatype) etemp.datatype = obj.datatype;\r\n\t if (obj.id) temp.id = temp.id || obj.id + \"_\" + temp.view;\r\n\t obj.body = temp;\r\n\t this.$ready.push(this._set_on_popup_click);\r\n\t this.attachEvent(\"onShow\", function () {\r\n\t if (this._settings.master) {\r\n\t var master = $$(this._settings.master);\r\n\r\n\t if (master) {\r\n\t var node = master._getInputDiv ? master._getInputDiv() : master.getInputNode();\r\n\t node.setAttribute(\"aria-expanded\", \"true\");\r\n\t }\r\n\t }\r\n\r\n\t this._show_selection();\r\n\t });\r\n\t this.attachEvent(\"onHide\", function () {\r\n\t if (this._settings.master) {\r\n\t var master = $$(this._settings.master);\r\n\r\n\t if (master) {\r\n\t var node = master._getInputDiv ? master._getInputDiv() : master.getInputNode();\r\n\t node.setAttribute(\"aria-expanded\", \"false\");\r\n\t }\r\n\t }\r\n\t });\r\n\t this._old_text = {};\r\n\t },\r\n\t _get_extendable_cell: function _get_extendable_cell(obj) {\r\n\t return obj;\r\n\t },\r\n\t _preselectMasterOption: function _preselectMasterOption(data) {\r\n\t var master,\r\n\t node,\r\n\t text = \"\";\r\n\r\n\t if (data) {\r\n\t if (this._settings.master) {\r\n\t master = $$(this._settings.master);\r\n\t node = master.getInputNode();\r\n\r\n\t if (node && master.$setValueHere) {\r\n\t master.$setValueHere(data.value);\r\n\t } else if (node) {\r\n\t if (master.options_setter) text = this.getItemText(data.id);else if (data.value) text = master._get_visible_text ? master._get_visible_text(data.value) : data.value.toString();\r\n\t if (isUndefined(node.value)) node.innerHTML = text;else node.value = text.replace(/<[^>]*>/g, \"\");\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t node = node || this._last_input_target;\r\n\t if (node) node.focus();\r\n\t },\r\n\t setMasterValue: function setMasterValue(data, refresh) {\r\n\t var text = data.id ? this.getItemText(data.id) : data.text || data.value;\r\n\r\n\t if (this._settings.master) {\r\n\t var master = $$(this._settings.master);\r\n\t if (refresh && data.id) master.refresh();else if (master.options_setter) master.setValue(data.$empty ? \"\" : data.id);else if (master.setValueHere) master.setValueHere(text);else master.setValue(text);\r\n\t } else if (this._last_input_target) {\r\n\t this._last_input_target.value = text;\r\n\t }\r\n\r\n\t if (!refresh) {\r\n\t this.hide(true);\r\n\t if (this._last_input_target) this._last_input_target.focus();\r\n\t }\r\n\r\n\t this.callEvent(\"onValueSuggest\", [data, text]);\r\n\t delay(function () {\r\n\t callEvent(\"onEditEnd\", []);\r\n\t });\r\n\t },\r\n\t getMasterValue: function getMasterValue() {\r\n\t if (this._settings.master) return $$(this._settings.master).getValue();\r\n\t return null;\r\n\t },\r\n\t getItemId: function getItemId(text) {\r\n\t var list = this.getList();\r\n\r\n\t for (var key in list.data.pull) {\r\n\t var obj = list.getItem(key);\r\n\t if (this._settings.filter.call(this, obj, text)) return obj.id;\r\n\t }\r\n\t },\r\n\t getItemText: function getItemText(id) {\r\n\t var item = this.getList().getItem(id);\r\n\t if (!item) return this._old_text[id] || \"\";\r\n\t if (this._settings.template) return this._settings.template.call(this, item, this.type);\r\n\t if (this._settings.textValue) return \"\" + item[this._settings.textValue] + \"\";\r\n\t var type = this.getList().type;\r\n\t var text = type.template.call(type, item, type);\r\n\t return this._old_text[id] = text;\r\n\t },\r\n\t getSuggestion: function getSuggestion(text) {\r\n\t var id,\r\n\t list = this.getList(),\r\n\t order = list.data.order;\r\n\t if (list.getSelectedId) id = list.getSelectedId();\r\n\r\n\t if (text && order.length && (!id || order.find(id) < 0)) {\r\n\t id = order[0]; //ensure that option really does match client-side filtering rules\r\n\r\n\t if (!list.config.dataFeed && !this.config.filter.call(this, list.data.pull[id], text)) return null;\r\n\t } //complex id in datatable\r\n\r\n\r\n\t if (id && _typeof(id) == \"object\") id = id + \"\";\r\n\t return id;\r\n\t },\r\n\t getList: function getList() {\r\n\t return this._body_cell;\r\n\t },\r\n\t _set_on_popup_click: function _set_on_popup_click() {\r\n\t var list = this.getList();\r\n\t var type = this._settings.type;\r\n\r\n\t if (list.count) {\r\n\t list.attachEvent(\"onItemClick\", bind(function (item) {\r\n\t this.setMasterValue(list.getItem(item));\r\n\t }, this));\r\n\t list.data.attachEvent(\"onstoreupdated\", bind(function (id, obj, mode) {\r\n\t if (mode == \"delete\" && id == this.getMasterValue()) this.setMasterValue({\r\n\t id: \"\",\r\n\t text: \"\"\r\n\t }, 1);else if (mode == \"update\" && id == this.getMasterValue()) {\r\n\t this.setMasterValue(obj, 1);\r\n\t }\r\n\t }, this));\r\n\t list.data.attachEvent(\"onAfterFilter\", bind(this._suggest_after_filter, this));\r\n\t list.data.attachEvent(\"onStoreLoad\", bind(this._suggest_after_filter, this));\r\n\t if (isUndefined(this._settings.fitMaster)) this._settings.fitMaster = true;\r\n\t } else if (type == \"calendar\") {\r\n\t list.attachEvent(\"onDateSelect\", function () {\r\n\t this.getParentView().setMasterValue({\r\n\t value: list.getSelectedDate()\r\n\t }, list.config.multiselect);\r\n\t });\r\n\t list.attachEvent(\"onTodaySet\", function (date) {\r\n\t this.getParentView().setMasterValue({\r\n\t value: date\r\n\t });\r\n\t });\r\n\t list.attachEvent(\"onDateClear\", function (date) {\r\n\t this.getParentView().setMasterValue({\r\n\t value: date\r\n\t });\r\n\t });\r\n\t } else if (type == \"colorboard\") {\r\n\t list.attachEvent(\"onItemClick\", function (value) {\r\n\t this.getParentView().setMasterValue({\r\n\t value: value\r\n\t });\r\n\t });\r\n\t }\r\n\t },\r\n\t input_setter: function input_setter(value) {\r\n\t this.linkInput(value);\r\n\t return 0;\r\n\t },\r\n\t linkInput: function linkInput(input) {\r\n\t var node;\r\n\r\n\t if (input.getInputNode) {\r\n\t node = input.getInputNode();\r\n\t node.webix_master_id = input._settings.id;\r\n\t } else node = toNode(input);\r\n\r\n\t _event(node, \"keydown\", function (e) {\r\n\t if ((node != document.body || this.isVisible()) && (input.config ? !input.config.readonly : !node.getAttribute(\"readonly\"))) this._suggestions(e);\r\n\t }, {\r\n\t bind: this\r\n\t });\r\n\r\n\t if (input._getInputDiv) node = input._getInputDiv();\r\n\t node.setAttribute(\"aria-autocomplete\", \"list\");\r\n\t node.setAttribute(\"aria-expanded\", \"false\");\r\n\r\n\t if (node.tagName === \"DIV\") {\r\n\t node.setAttribute(\"aria-live\", \"assertive\");\r\n\t node.setAttribute(\"aria-atomic\", \"true\");\r\n\t }\r\n\r\n\t this._non_ui_mode = true;\r\n\t },\r\n\t _suggestions: function _suggestions(e) {\r\n\t e = e || event;\r\n\t var list = this.getList();\r\n\t var trg = e.target || e.srcElement;\r\n\t if (trg == document.body && !this.isVisible() || trg.className == \"webix_clipbuffer\") return;\r\n\t this._last_input_target = trg;\r\n\t this._settings.master = trg.webix_master_id;\r\n\t window.clearTimeout(this._key_timer);\r\n\t var code = e.keyCode; //shift and ctrl\r\n\r\n\t if (code == 16 || code == 17) return; // tab - hide popup and do nothing\r\n\r\n\t if (code == 9) return this._tab_key(this, list); // escape - hide popup\r\n\r\n\t if (code == 27) return this._escape_key(this, list); // enter\r\n\r\n\t if (code == 13) return this.$enterKey(this, list); // up/down/right/left are used for navigation\r\n\r\n\t if (this._navigate(e)) {\r\n\t preventEvent(e);\r\n\t return false;\r\n\t }\r\n\r\n\t if (isUndefined(trg.value)) return;\r\n\t clearTimeout(this._last_delay);\r\n\t this._last_delay = delay(function () {\r\n\t //focus moved to the different control, suggest is not necessary\r\n\t if (!this._non_ui_mode && UIManager.getFocus() != $$(this._settings.master)) return;\r\n\t this._resolve_popup = true; //for multicombo\r\n\r\n\t var val = trg.value; // used to prevent showing popup when it was initialized\r\n\r\n\t if (list.config.dataFeed) list.filter(\"value\", val);else if (list.filter) {\r\n\t list.filter(bind(function (item) {\r\n\t return this._settings.filter.call(this, item, val);\r\n\t }, this));\r\n\t }\r\n\t }, this, [], this._settings.keyPressTimeout);\r\n\t },\r\n\t _suggest_after_filter: function _suggest_after_filter() {\r\n\t if (!this._resolve_popup) return true;\r\n\t this._resolve_popup = false;\r\n\t var list = this.getList(); // filtering is complete\r\n\t // if there are as min 1 variant it must be shown, hidden otherwise\r\n\r\n\t if (list.count() > 0) {\r\n\t this.adjust();\r\n\t if (!this.isVisible()) this._dont_unfilter = true;\r\n\t this.show(this._last_input_target, null, true);\r\n\t this._dont_unfilter = false;\r\n\t } else {\r\n\t this.hide(true);\r\n\t this._last_input_target = null;\r\n\t }\r\n\t },\r\n\t show: function show(node) {\r\n\t if (!this.isVisible()) {\r\n\t var list = this.getList();\r\n\r\n\t if (list.filter && !this._dont_unfilter) {\r\n\t list.filter(\"\");\r\n\t }\r\n\r\n\t if (this.$customWidth && (this._settings.fitMaster || !this._settings.width || isUndefined(this._settings.fitMaster))) {\r\n\t this.$customWidth(node);\r\n\t }\r\n\r\n\t if (node.tagName && this._settings.fitMaster) {\r\n\t this._settings.width = node.offsetWidth - 2; //2 - borders\r\n\t }\r\n\r\n\t if (list._zoom_level) list.render();\r\n\t this.adjust(); // needed to return focus\r\n\r\n\t if (node.tagName == \"INPUT\") this._last_input_target = node;\r\n\t }\r\n\r\n\t popup.api.show.apply(this, arguments);\r\n\t },\r\n\t _show_selection: function _show_selection(list) {\r\n\t list = list || this.getList();\r\n\t var value = this.getMasterValue();\r\n\r\n\t if (list.select && list.showItem) {\r\n\t if (value && list.exists && list.exists(value)) {\r\n\t list.select(value);\r\n\t list.showItem(value);\r\n\t } else {\r\n\t list.unselect();\r\n\t list.showItem(list.getFirstId());\r\n\t }\r\n\t } else if (list.setValue) {\r\n\t if (this._settings.master) value = $$(this._settings.master).$prepareValue(value);\r\n\t list.setValue(value);\r\n\t }\r\n\t },\r\n\t $enterKey: function $enterKey(popup$$1, list) {\r\n\t var value;\r\n\r\n\t if (popup$$1.isVisible()) {\r\n\t if (list.count && list.count()) {\r\n\t value = list.getSelectedId(false, true);\r\n\t if (list.count() == 1 && list.getFirstId() != value) value = list.getFirstId();\r\n\t if (value) value = list.getItem(value);\r\n\t } else if (list.getSelectedDate && list.getSelectedDate()) value = {\r\n\t value: list.getSelectedDate()\r\n\t };else if (list.getValue && list.getValue()) value = {\r\n\t value: list.getValue()\r\n\t };\r\n\r\n\t if (value) this.setMasterValue(value);\r\n\t popup$$1.hide(true);\r\n\t } else popup$$1.show(this._last_input_target);\r\n\t },\r\n\t _escape_key: function _escape_key(popup$$1) {\r\n\t return popup$$1.hide(true);\r\n\t },\r\n\t _tab_key: function _tab_key(popup$$1) {\r\n\t return popup$$1.hide(true);\r\n\t },\r\n\r\n\t /*! suggestions navigation: up/down buttons move selection\r\n\t *\t@param e\r\n\t *\t\tevent object\r\n\t **/\r\n\t _navigate: function _navigate(e) {\r\n\t var list = this.getList();\r\n\t var code = e.keyCode;\r\n\t var data;\r\n\r\n\t if (list.moveSelection && code < 41 && code > 32 && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey) {\r\n\t // down arrow\r\n\t if (code === 40) {\r\n\t var visible = this.isVisible();\r\n\t if (!visible) this.show(this._last_input_target);\r\n\t list.moveSelection(\"down\", false, false);\r\n\t } // other arrows\r\n\t else {\r\n\t if (list.count && code !== 38 || !list.count && !list.isVisible()) return false;\r\n\t var dir;\r\n\t if (code == 33) dir = \"pgup\";\r\n\t if (code == 34) dir = \"pgdown\";\r\n\t if (code == 35) dir = \"bottom\";\r\n\t if (code == 36) dir = \"top\";\r\n\t if (code == 37) dir = \"left\";\r\n\t if (code == 38) dir = \"up\";\r\n\t if (code == 39) dir = \"right\";\r\n\t list.moveSelection(dir, false, false);\r\n\t }\r\n\r\n\t if (list.count) data = list.getSelectedItem();else if (list.getSelectedDate) data = {\r\n\t value: list.getVisibleDate()\r\n\t };else if (list.getValue) data = {\r\n\t value: list.getValue()\r\n\t };\r\n\r\n\t this._preselectMasterOption(data);\r\n\r\n\t return true;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t getValue: function getValue$$1() {\r\n\t var list = this.getList();\r\n\t var value = (list.getValue ? list.getValue() : list.getSelectedId()) || \"\";\r\n\t value = value.id || value; // check empty\r\n\r\n\t if (list.getItem) {\r\n\t var item = list.getItem(value);\r\n\t if (item && item.$empty) return \"\";\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t var list = this.getList();\r\n\r\n\t if (value) {\r\n\t if (list.exists(value)) {\r\n\t list.select(value);\r\n\t list.showItem(value);\r\n\t }\r\n\t } else {\r\n\t list.unselect();\r\n\t list.showItem(list.getFirstId());\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$12 = exports.protoUI(api$12, popup.view);\r\n\tvar suggest = {\r\n\t api: api$12,\r\n\t view: view$12\r\n\t};\r\n\r\n\tvar api$13 = {\r\n\t name: \"multisuggest\",\r\n\t defaults: {\r\n\t separator: \",\",\r\n\t type: \"layout\",\r\n\t button: true,\r\n\t width: 0,\r\n\t filter: function filter(item, value) {\r\n\t var itemText = this.getItemText(item.id);\r\n\t return itemText.toString().toLowerCase().indexOf(value.toLowerCase()) > -1;\r\n\t },\r\n\t body: {\r\n\t rows: [{\r\n\t view: \"list\",\r\n\t type: \"multilist\",\r\n\t borderless: true,\r\n\t autoheight: true,\r\n\t yCount: 5,\r\n\t multiselect: \"touch\",\r\n\t select: true,\r\n\t on: {\r\n\t onItemClick: function onItemClick(id) {\r\n\t var popup = this.getParentView().getParentView();\r\n\t delay(function () {\r\n\t popup._toggleOption(id);\r\n\t });\r\n\t }\r\n\t }\r\n\t }, {\r\n\t view: \"button\",\r\n\t click: function click() {\r\n\t var suggest$$1 = this.getParentView().getParentView();\r\n\t suggest$$1.setMasterValue({\r\n\t id: suggest$$1.getValue()\r\n\t });\r\n\t suggest$$1.hide();\r\n\t }\r\n\t }]\r\n\t }\r\n\t },\r\n\t _toggleOption: function _toggleOption(id, ev, all) {\r\n\t var value = this.getValue();\r\n\t var values = all || toArray(value ? this.getValue().split(this._settings.separator) : []);\r\n\t var master = $$(this._settings.master);\r\n\r\n\t if (!all) {\r\n\t if (values.find(id) < 0) values.push(id);else values.remove(id);\r\n\t }\r\n\r\n\t if (master) {\r\n\t master.setValue(values.join(this._settings.separator));\r\n\t } else {\r\n\t var text = this.setValue(values);\r\n\t if (this._last_input_target) this._last_input_target.value = text.join(this._settings.separator);\r\n\t }\r\n\r\n\t if (ev) {\r\n\t //only for clicks in checksuggest\r\n\t var checkbox = this.getList().getItemNode(id).getElementsByTagName(\"SPAN\");\r\n\t if (checkbox && checkbox.length) checkbox[0].focus();\r\n\t }\r\n\t },\r\n\t _get_extendable_cell: function _get_extendable_cell(obj) {\r\n\t return obj.rows[0];\r\n\t },\r\n\t _set_on_popup_click: function _set_on_popup_click() {\r\n\t var button = this.getButton();\r\n\t var text = this._settings.button ? this._settings.buttonText || i18n.combo.select : 0;\r\n\r\n\t if (button) {\r\n\t if (text) {\r\n\t button._settings.value = text;\r\n\t button.refresh();\r\n\t } else button.hide();\r\n\t }\r\n\r\n\t if (this._settings.selectAll) return this.getBody().getChildViews()[0].show();\r\n\t var list = this.getList(); //for standalone suggests we need to have a normal show/hide logic\r\n\t //use a wrapper function, so it can later be cleared in multicombo\r\n\r\n\t list.data.attachEvent(\"onAfterFilter\", bind(function () {\r\n\t return this._suggest_after_filter();\r\n\t }, this));\r\n\t },\r\n\t _show_selection: function _show_selection() {\r\n\t var list = this.getList();\r\n\t var value = this.getMasterValue();\r\n\r\n\t if (value) {\r\n\t value = value.toString().split(this.config.separator);\r\n\r\n\t if (value[0]) {\r\n\t for (var i = 0; i < value.length; i++) {\r\n\t if (list.exists(value[i])) list.select(value[i], true);\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t getButton: function getButton() {\r\n\t return this.getBody().getChildViews()[1];\r\n\t },\r\n\t getList: function getList() {\r\n\t return this.getBody().getChildViews()[0];\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t var text = [];\r\n\t var list = this.getList();\r\n\t list.unselect();\r\n\r\n\t if (value) {\r\n\t if (!isArray(value)) value = value.toString().split(this.config.separator);\r\n\r\n\t if (value[0]) {\r\n\t for (var i = 0; i < value.length; i++) {\r\n\t if (list.getItem(value[i])) {\r\n\t if (list.exists(value[i])) list.select(value[i], true);\r\n\t text.push(this.getItemText(value[i]));\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t this._settings.value = value ? value.join(this.config.separator) : \"\";\r\n\t return text;\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this._settings.value;\r\n\t }\r\n\t};\r\n\tvar view$13 = exports.protoUI(api$13, suggest.view);\r\n\tvar multisuggest = {\r\n\t api: api$13,\r\n\t view: view$13\r\n\t};\r\n\r\n\tvar api$14 = {\r\n\t name: \"checksuggest\",\r\n\t defaults: {\r\n\t button: false,\r\n\t selectAll: false,\r\n\t body: {\r\n\t rows: [{\r\n\t view: \"checkbox\",\r\n\t hidden: true,\r\n\t customCheckbox: false,\r\n\t borderless: false,\r\n\t css: \"webix_checksuggest_select_all\",\r\n\t labelRight: i18n.combo.selectAll,\r\n\t labelWidth: 0,\r\n\t value: 0,\r\n\t height: 28,\r\n\t inputHeight: 20,\r\n\t on: {\r\n\t onItemClick: function onItemClick(e) {\r\n\t var popup = this.getParentView().getParentView();\r\n\t var check = popup.getList();\r\n\t var values = check.data.order;\r\n\r\n\t for (var i = 0; i < values.length; i++) {\r\n\t var value = check.getItem(values[i]);\r\n\t value.$checked = this.getValue();\r\n\t }\r\n\r\n\t var result = this.getValue() ? [].concat(values) : [];\r\n\r\n\t popup._toggleOption(values[0], e, result);\r\n\r\n\t check.refresh();\r\n\t },\r\n\t onChange: function onChange() {\r\n\t var link = this.$view.querySelector(\"label\");\r\n\t var locale = i18n.combo;\r\n\t link.textContent = this.getValue() ? locale.unselectAll : locale.selectAll;\r\n\t },\r\n\t onAfterRender: function onAfterRender() {\r\n\t this.callEvent(\"onChange\", []);\r\n\t }\r\n\t }\r\n\t }, {\r\n\t view: \"list\",\r\n\t css: \"webix_multilist\",\r\n\t borderless: true,\r\n\t autoheight: true,\r\n\t yCount: 5,\r\n\t select: true,\r\n\t type: \"checklist\",\r\n\t on: {\r\n\t onItemClick: function onItemClick(id, e) {\r\n\t var item = this.getItem(id);\r\n\t item.$checked = item.$checked ? 0 : 1;\r\n\t this.refresh(id);\r\n\t var popup = this.getParentView().getParentView();\r\n\t popup._click_stamp = new Date();\r\n\r\n\t popup._toggleOption(id, e);\r\n\r\n\t if (popup.config.selectAll) {\r\n\t if (!item.$checked) popup.getBody()._cells[0].setValue(0);else {\r\n\t var all = (popup.getValue() || \"\").split(\",\");\r\n\t if (all.length === this.count()) popup.getBody()._cells[0].setValue(1);\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\t }, {\r\n\t view: \"button\",\r\n\t click: function click() {\r\n\t var suggest = this.getParentView().getParentView();\r\n\t suggest.setMasterValue({\r\n\t id: suggest.getValue()\r\n\t });\r\n\t suggest.hide();\r\n\t }\r\n\t }]\r\n\t }\r\n\t },\r\n\t _get_extendable_cell: function _get_extendable_cell(obj) {\r\n\t return obj.rows[1];\r\n\t },\r\n\t getButton: function getButton() {\r\n\t return this.getBody().getChildViews()[2];\r\n\t },\r\n\t getList: function getList() {\r\n\t return this.getBody().getChildViews()[1];\r\n\t },\r\n\t $init: function $init() {\r\n\t this._valueHistory = {};\r\n\t this.$ready.push(this._onReady);\r\n\t },\r\n\t _onReady: function _onReady() {\r\n\t var list = this.getList();\r\n\r\n\t if (list.config.dataFeed) {\r\n\t var suggest = this;\r\n\t list.attachEvent(\"onAfterLoad\", function () {\r\n\t suggest.setValue(suggest._settings.value);\r\n\t });\r\n\r\n\t list.getItem = function (id) {\r\n\t return this.data.pull[id] || suggest._valueHistory[id];\r\n\t };\r\n\t }\r\n\r\n\t if (this.config.master && !this.config.selectAll) this.getBody().getChildViews()[0].hide();\r\n\t },\r\n\t $enterKey: function $enterKey(popup, list) {\r\n\t if (list.count && list.count()) {\r\n\t if (popup.isVisible()) {\r\n\t var value = list.getSelectedId(false, true);\r\n\r\n\t if (value) {\r\n\t this._toggleOption(value);\r\n\t }\r\n\r\n\t popup.hide(true);\r\n\t } else {\r\n\t popup.show(this._last_input_target);\r\n\t }\r\n\t } else {\r\n\t if (popup.isVisible()) popup.hide(true);\r\n\t }\r\n\t },\r\n\t _show_selection: function _show_selection() {\r\n\t var list = this.getList();\r\n\t if (list.select) list.unselect();\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t var i,\r\n\t list = this.getList(),\r\n\t text = [],\r\n\t values = {},\r\n\t changed = [];\r\n\t value = value || [];\r\n\t if (!isArray(value)) value = value.toString().split(this.config.separator);else if (list.config.dataFeed) value = this._toMultiValue(value);\r\n\r\n\t for (i = 0; i < value.length; i++) {\r\n\t values[value[i]] = 1;\r\n\r\n\t if (list.getItem(value[i])) {\r\n\t if (this._valueHistory) this._valueHistory[value[i]] = copy(list.getItem(value[i]));\r\n\t text.push(this.getItemText(value[i]));\r\n\t }\r\n\t }\r\n\r\n\t list.data.each(function (item) {\r\n\t if (item.$checked) {\r\n\t if (!values[item.id]) {\r\n\t item.$checked = 0;\r\n\t changed.push(item.id);\r\n\t }\r\n\t } else {\r\n\t if (values[item.id]) {\r\n\t item.$checked = 1;\r\n\t changed.push(item.id);\r\n\t }\r\n\t }\r\n\t }, this, true);\r\n\r\n\t for (i = 0; i < changed.length; i++) {\r\n\t list.refresh(changed[i]);\r\n\t }\r\n\r\n\t this._settings.value = value.length ? value.join(this.config.separator) : \"\";\r\n\t return text;\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this._settings.value;\r\n\t },\r\n\t _preselectMasterOption: function _preselectMasterOption() {\r\n\t var node, master;\r\n\r\n\t if (this._settings.master) {\r\n\t master = $$(this._settings.master);\r\n\t node = master.getInputNode();\r\n\t }\r\n\r\n\t node = node || this._last_input_target;\r\n\t if (node) node.focus();\r\n\t },\r\n\t _toMultiValue: function _toMultiValue(value) {\r\n\t if (value && isArray(value)) {\r\n\t var values = [];\r\n\r\n\t for (var i = 0; i < value.length; i++) {\r\n\t if (value[i].id) {\r\n\t this._valueHistory[value[i].id] = copy(value[i]);\r\n\t values.push(value[i].id);\r\n\t } else {\r\n\t values.push(value[i]);\r\n\t }\r\n\t }\r\n\r\n\t value = values;\r\n\t }\r\n\r\n\t return value;\r\n\t }\r\n\t};\r\n\tvar view$14 = exports.protoUI(api$14, multisuggest.view);\r\n\r\n\tvar api$15 = {\r\n\t name: \"datasuggest\",\r\n\t defaults: {\r\n\t type: \"dataview\",\r\n\t fitMaster: false,\r\n\t width: 0,\r\n\t body: {\r\n\t xCount: 3,\r\n\t autoheight: true,\r\n\t select: true\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$15 = exports.protoUI(api$15, suggest.view);\r\n\r\n\tvar api$16 = {\r\n\t name: \"gridsuggest\",\r\n\t defaults: {\r\n\t type: \"datatable\",\r\n\t fitMaster: false,\r\n\t width: 0,\r\n\t body: {\r\n\t navigation: true,\r\n\t autoheight: true,\r\n\t autowidth: true,\r\n\t select: true\r\n\t },\r\n\t filter: function filter(item, value) {\r\n\t var text = this.config.template(item);\r\n\t if (text.toString().toLowerCase().indexOf(value.toLowerCase()) === 0) return true;\r\n\t return false;\r\n\t }\r\n\t },\r\n\t $init: function $init(obj) {\r\n\t if (!obj.body.columns) obj.body.autoConfig = true;\r\n\t if (!obj.template) obj.template = bind(this._getText, this);\r\n\t },\r\n\t _getText: function _getText(item) {\r\n\t var grid = this.getBody();\r\n\t var value = this.config.textValue || grid.config.columns[0].id;\r\n\t return grid.getText(item.id, value);\r\n\t }\r\n\t};\r\n\tvar view$16 = exports.protoUI(api$16, suggest.view);\r\n\r\n\tvar api$17 = {\r\n\t name: \"daterangesuggest\",\r\n\t defaults: {\r\n\t type: \"daterange\",\r\n\t body: {\r\n\t view: \"daterange\",\r\n\t icons: true,\r\n\t button: true,\r\n\t borderless: true\r\n\t }\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this.getRange().getValue();\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this.getRange().setValue(copy(value));\r\n\t },\r\n\t getRange: function getRange() {\r\n\t return this.getBody();\r\n\t },\r\n\t getButton: function getButton() {\r\n\t return this.getBody().getChildViews()[1].getChildViews()[1];\r\n\t },\r\n\t _setValue: function _setValue(value, hide) {\r\n\t var master = $$(this._settings.master);\r\n\r\n\t if (master) {\r\n\t master.setValue(value);\r\n\t if (hide) this.hide();\r\n\t } else this.setValue(value);\r\n\t },\r\n\t _set_on_popup_click: function _set_on_popup_click() {\r\n\t var range = this.getRange();\r\n\t range.attachEvent(\"onAfterDateSelect\", bind(function (value) {\r\n\t this._setValue(value);\r\n\t }, this));\r\n\t range.attachEvent(\"onDateClear\", bind(function (value) {\r\n\t this._setValue(value);\r\n\t }, this));\r\n\t range.attachEvent(\"onTodaySet\", bind(function (value) {\r\n\t this._setValue(value);\r\n\t }, this));\r\n\t }\r\n\t};\r\n\tvar view$17 = exports.protoUI(api$17, suggest.view);\r\n\r\n\tvar api$18 = {\r\n\t $cssName: \"datepicker\",\r\n\t name: \"daterangepicker\",\r\n\t $init: function $init(config) {\r\n\t //set non-empty initial value\r\n\t this._settings.value = {}; // other types are not implemented\r\n\r\n\t delete config.type;\r\n\t },\r\n\t _init_popup: function _init_popup() {\r\n\t var obj = this._settings;\r\n\t if (obj.suggest) obj.popup = obj.suggest;else if (!obj.popup) {\r\n\t obj.popup = obj.suggest = this.suggest_setter({\r\n\t view: \"daterangesuggest\",\r\n\t body: {\r\n\t timepicker: obj.timepicker,\r\n\t calendarCount: obj.calendarCount,\r\n\t height: 250 + (obj.button || obj.icons ? 30 : 0)\r\n\t }\r\n\t });\r\n\t }\r\n\r\n\t this._init_once = function () {};\r\n\t },\r\n\t $prepareValue: function $prepareValue(value) {\r\n\t value = value || {};\r\n\t value.start = datepicker.api.$prepareValue.call(this, value.start ? value.start : null);\r\n\t value.end = datepicker.api.$prepareValue.call(this, value.end ? value.end : null);\r\n\t var daterange = $$(this._settings.popup).getRange();\r\n\t return copy(daterange._correct_value(value));\r\n\t },\r\n\t $compareValue: function $compareValue(oldvalue, value) {\r\n\t var compare = datepicker.api.$compareValue;\r\n\t var start = compare.call(this, oldvalue.start, value.start);\r\n\t var end = compare.call(this, oldvalue.end, value.end);\r\n\t return start && end;\r\n\t },\r\n\t $setValue: function $setValue(value) {\r\n\t value = value || {};\r\n\t this._settings.text = (value.start ? this._get_visible_text(value.start) : \"\") + (value.end ? \" - \" + this._get_visible_text(value.end) : \"\");\r\n\r\n\t this._set_visible_text();\r\n\t },\r\n\t $render: function $render(obj) {\r\n\t obj.value = this.$prepareValue(obj.value);\r\n\t this.$setValue(obj.value);\r\n\t },\r\n\t getValue: function getValue() {\r\n\t var value = this._settings.value;\r\n\r\n\t if (this._settings.stringResult) {\r\n\t var formatStr = i18n.parseFormatStr;\r\n\t return this._formatValue(formatStr, value);\r\n\t }\r\n\r\n\t return value || null;\r\n\t },\r\n\t _formatValue: function _formatValue(format, value) {\r\n\t if (value.start) value.start = format(value.start);\r\n\t if (value.end) value.end = format(value.end);\r\n\t return value;\r\n\t }\r\n\t};\r\n\tvar view$18 = exports.protoUI(api$18, datepicker.view);\r\n\r\n\tvar api$19 = {\r\n\t name: \"excelbar\",\r\n\t defaults: {\r\n\t padding: 0,\r\n\t type: \"line\"\r\n\t },\r\n\t $init: function $init(config) {\r\n\t config.cols = [{\r\n\t view: \"tabbar\",\r\n\t options: [\"\"],\r\n\t optionWidth: 200,\r\n\t borderless: true,\r\n\t on: {\r\n\t onaftertabclick: function onaftertabclick() {\r\n\t this.getParentView().callEvent(\"onExcelSheetSelect\", [this.getValue()]);\r\n\t }\r\n\t }\r\n\t }];\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this.getInput().getValue();\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t return this.getInput().setValue(value);\r\n\t },\r\n\t getInput: function getInput() {\r\n\t return this.getChildViews()[0];\r\n\t },\r\n\t setSheets: function setSheets(sheets) {\r\n\t var input = this.getInput();\r\n\t input.config.options = sheets;\r\n\t input.refresh();\r\n\t }\r\n\t};\r\n\tvar view$19 = exports.protoUI(api$19, toolbar.view);\r\n\r\n\tvar api$1a = {\r\n\t name: \"vscroll\",\r\n\t $apiOnly: true,\r\n\t defaults: {\r\n\t scroll: \"x\",\r\n\t scrollStep: 40,\r\n\t scrollPos: 0,\r\n\t scrollSize: 18,\r\n\t scrollVisible: 1,\r\n\t zoom: 1\r\n\t },\r\n\t $init: function $init(config) {\r\n\t var dir = config.scroll || \"x\";\r\n\t var node = this._viewobj = toNode(config.container);\r\n\t node.className += \" webix_vscroll_\" + dir;\r\n\t node.innerHTML = \"
    \";\r\n\r\n\t _event(node, \"scroll\", this._onscroll, {\r\n\t bind: this\r\n\t });\r\n\r\n\t this._last_set_size = 0;\r\n\t },\r\n\t reset: function reset() {\r\n\t this.config.scrollPos = 0;\r\n\t this._viewobj[this.config.scroll == \"x\" ? \"scrollLeft\" : \"scrollTop\"] = 0;\r\n\t },\r\n\t _check_quantum: function _check_quantum(value) {\r\n\t if (value > 1500000) {\r\n\t this._settings.zoom = value / 1000000;\r\n\t value = 1000000;\r\n\t } else {\r\n\t this._settings.zoom = 1;\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t scrollWidth_setter: function scrollWidth_setter(value) {\r\n\t value = this._check_quantum(value);\r\n\t this._viewobj.firstChild.style.width = value + \"px\";\r\n\t return value;\r\n\t },\r\n\t scrollHeight_setter: function scrollHeight_setter(value) {\r\n\t value = this._check_quantum(value);\r\n\t this._viewobj.firstChild.style.height = value + \"px\";\r\n\t return value;\r\n\t },\r\n\t sizeTo: function sizeTo(value, top, bottom) {\r\n\t value = value - (top || 0) - (bottom || 0);\r\n\t var width = this._settings.scrollSize; //IEFix\r\n\t //IE doesn't react on scroll-click if it has not at least 1 px of visible content\r\n\r\n\t if (env.isIE && width) width += 1;\r\n\r\n\t if (!width && this._settings.scrollVisible && !env.$customScroll) {\r\n\t this._viewobj.style.pointerEvents = \"none\";\r\n\t width = 14;\r\n\t }\r\n\r\n\t if (!width) {\r\n\t this._viewobj.style.display = \"none\";\r\n\t } else {\r\n\t this._viewobj.style.display = \"block\";\r\n\t if (top) this._viewobj.style.marginTop = top + \"px\";\r\n\t this._viewobj.style[this._settings.scroll == \"x\" ? \"width\" : \"height\"] = Math.max(0, value) + \"px\";\r\n\t this._viewobj.style[this._settings.scroll == \"x\" ? \"height\" : \"width\"] = width + \"px\";\r\n\t }\r\n\r\n\t this._last_set_size = value;\r\n\t },\r\n\t getScroll: function getScroll() {\r\n\t return Math.round(this._settings.scrollPos * this._settings.zoom);\r\n\t },\r\n\t getSize: function getSize() {\r\n\t return Math.round((this._settings.scrollWidth || this._settings.scrollHeight) * this._settings.zoom);\r\n\t },\r\n\t scrollTo: function scrollTo(value) {\r\n\t if (value < 0) value = 0;\r\n\t var config = this._settings;\r\n\t value = value / config.zoom; //safety check for negative values\r\n\r\n\t if (value < 0) value = 0; //apply new position\r\n\r\n\t if (value != this._settings.scrollPos) {\r\n\t this._viewobj[config.scroll == \"x\" ? \"scrollLeft\" : \"scrollTop\"] = value;\r\n\r\n\t this._onscroll_inner(value, true);\r\n\r\n\t return true;\r\n\t }\r\n\t },\r\n\t _onscroll: function _onscroll() {\r\n\t var x = this._viewobj[this._settings.scroll == \"x\" ? \"scrollLeft\" : \"scrollTop\"];\r\n\t if (Math.floor(x) != Math.floor(this._settings.scrollPos)) this._onscroll_inner(x, false);\r\n\t },\r\n\t _onscroll_inner: function _onscroll_inner(value, api) {\r\n\t //size of scroll area\r\n\t var height = this._settings.scrollWidth || this._settings.scrollHeight; //if we scrolled to the end of the area\r\n\r\n\t if (value >= height - this._last_set_size / (api ? this._settings.zoom : 1)) {\r\n\t //set value so the last row is visible\r\n\t value = Math.max(0, height - this._last_set_size / this._settings.zoom);\r\n\t }\r\n\r\n\t this._settings.scrollPos = value || 0;\r\n\t this.callEvent(\"onScroll\", [this.getScroll()]);\r\n\t },\r\n\t activeArea: function activeArea(area, x_mode) {\r\n\t this._x_scroll_mode = x_mode;\r\n\r\n\t _event(area, env.isIE8 ? \"mousewheel\" : \"wheel\", this._on_wheel, {\r\n\t bind: this\r\n\t });\r\n\r\n\t this._add_touch_events(area);\r\n\t },\r\n\t _add_touch_events: function _add_touch_events(area) {\r\n\t if (!env.touch && window.navigator.pointerEnabled) {\r\n\t addCss(area, \"webix_scroll_touch_ie\", true);\r\n\r\n\t _event(area, \"pointerdown\", function (e) {\r\n\t if (e.pointerType == \"touch\" || e.pointerType == \"pen\") {\r\n\t this._start_context = Touch._get_context_m(e);\r\n\t this._start_scroll_pos = this.getScroll();\r\n\t }\r\n\t }, {\r\n\t bind: this\r\n\t });\r\n\r\n\t event$1(document.body, \"pointermove\", function (e) {\r\n\t var scroll;\r\n\r\n\t if (this._start_context) {\r\n\t this._current_context = Touch._get_context_m(e);\r\n\r\n\t if (this._settings.scroll == \"x\") {\r\n\t scroll = this._current_context.x - this._start_context.x;\r\n\t } else if (this._settings.scroll == \"y\") {\r\n\t scroll = this._current_context.y - this._start_context.y;\r\n\t }\r\n\r\n\t if (scroll && Math.abs(scroll) > 5) {\r\n\t this.scrollTo(this._start_scroll_pos - scroll);\r\n\t }\r\n\t }\r\n\t }, {\r\n\t bind: this\r\n\t });\r\n\t event$1(window, \"pointerup\", function () {\r\n\t if (this._start_context) {\r\n\t this._start_context = this._current_context = null;\r\n\t }\r\n\t }, {\r\n\t bind: this\r\n\t });\r\n\t }\r\n\t },\r\n\t _on_wheel: function _on_wheel(e) {\r\n\t var dir = 0;\r\n\t var step = e.deltaMode === 0 ? 30 : 1;\r\n\t if (env.isIE8) dir = e.detail = -e.wheelDelta / 30;\r\n\r\n\t if (e.deltaX && Math.abs(e.deltaX) > Math.abs(e.deltaY)) {\r\n\t //x-scroll\r\n\t if (this._x_scroll_mode && this._settings.scrollVisible) dir = e.deltaX / step;\r\n\t } else {\r\n\t //y-scroll\r\n\t if (!this._x_scroll_mode && this._settings.scrollVisible) {\r\n\t if (isUndefined(e.deltaY)) dir = e.detail;else dir = e.deltaY / step;\r\n\t }\r\n\t } // Safari requires target preserving\r\n\t // (used in _check_rendered_cols of DataTable)\r\n\r\n\r\n\t if (env.isSafari) this._scroll_trg = e.target || e.srcElement;\r\n\t if (dir) if (this.scrollTo(this.getScroll() + dir * this._settings.scrollStep)) return preventEvent(e);\r\n\t }\r\n\t};\r\n\tvar view$1a = exports.protoUI(api$1a, EventSystem, Settings);\r\n\r\n\tvar Mixin = {\r\n\t _init_areaselect: function _init_areaselect() {\r\n\t this._arSelCheckKeys = true;\r\n\t this._areaSelStorage = {};\r\n\t this.define(\"select\", \"area\");\r\n\t this.attachEvent(\"onAfterScroll\", function () {\r\n\t this.refreshSelectArea();\r\n\t });\r\n\t this.attachEvent(\"onAfterRender\", function () {\r\n\t this.refreshSelectArea();\r\n\t });\r\n\t this.attachEvent(\"onBeforeColumnHide\", function (column) {\r\n\t this._areaSelHiddenIndex = this.getColumnIndex(column);\r\n\t });\r\n\t this.attachEvent(\"onAfterColumnHide\", function () {\r\n\t this._excludeColumnFromAreas(this._areaSelHiddenIndex);\r\n\t });\r\n\t this.attachEvent(\"onAfterRender\", function () {\r\n\t this._setTabindex();\r\n\t });\r\n\r\n\t this._bs_do_select = function (start, end, stopped, ev) {\r\n\t if (start.row && end.row) {\r\n\t if (stopped) {\r\n\t this.addSelectArea(start, end, true);\r\n\t this._arSelCheckKeys = true;\r\n\t return false;\r\n\t } else {\r\n\t if (this.callEvent(\"onAreaDrag\", [start, end, ev])) {\r\n\t if (!this._activeAreaSName && this._arSelCheckKeys && !(this._settings.multiselect && ev && ev.ctrlKey)) {\r\n\t this.removeSelectArea();\r\n\t this._arSelCheckKeys = false;\r\n\t }\r\n\t } else return false;\r\n\t }\r\n\t }\r\n\t };\r\n\r\n\t this.attachEvent(\"onBeforeAreaAdd\", this._span_correct_range);\r\n\r\n\t _event(this._body, \"mousedown\", this._ars_down, {\r\n\t bind: this\r\n\t });\r\n\t },\r\n\t _block_sel_flag: true,\r\n\t _excludeColumnFromAreas: function _excludeColumnFromAreas(index$$1) {\r\n\t var areas = this._areaSelStorage;\r\n\r\n\t for (var a in areas) {\r\n\t var area = areas[a];\r\n\r\n\t if (this.getColumnIndex(area.start.column) < 0) {\r\n\t if (area.start.column == area.end.column) this.removeSelectArea(area.name);else {\r\n\t var id = this.columnId(index$$1 + 1);\r\n\t if (id) this._updateSelectArea(area.name, {\r\n\t row: area.start.row,\r\n\t column: id\r\n\t }, null);\r\n\t }\r\n\t } else if (this.getColumnIndex(area.end.column) < 0) {\r\n\t var _id = this.columnId(index$$1 - 1);\r\n\r\n\t if (_id) this._updateSelectArea(area.name, null, {\r\n\t row: area.end.row,\r\n\t column: _id\r\n\t });\r\n\t }\r\n\t }\r\n\t },\r\n\t _extendAreaRange: function _extendAreaRange(id, area, mode, details) {\r\n\t var sci, eci, sri, eri, ci, ri, iri, ici;\r\n\r\n\t if (area) {\r\n\t sci = this.getColumnIndex(area.start.column);\r\n\t eci = this.getColumnIndex(area.end.column);\r\n\t sri = this.getIndexById(area.start.row);\r\n\t eri = this.getIndexById(area.end.row);\r\n\t ci = this.getColumnIndex(id.column);\r\n\t ri = this.getIndexById(id.row); //start cell of area\r\n\r\n\t iri = this.getIndexById(area.init.row);\r\n\t ici = this.getColumnIndex(area.init.column);\r\n\r\n\t if (sci > ci || mode == \"left\") {\r\n\t if (mode === \"left\" && details.ctrl) {\r\n\t sci = this._extendAreaToData(iri, sci, mode);\r\n\t eci = ici;\r\n\t } else if (mode === \"left\" && eci > ici) eci--;else sci = ci;\r\n\t } else if (eci <= ci || mode == \"right\") {\r\n\t if (mode == \"right\" && details.ctrl) {\r\n\t eci = this._extendAreaToData(iri, eci, mode);\r\n\t sci = ici;\r\n\t } else if (mode == \"right\" && sci < ici) sci++;else eci = ci;\r\n\t }\r\n\r\n\t if (sri > ri || mode == \"up\") {\r\n\t if (mode == \"up\" && details.ctrl) {\r\n\t sri = this._extendAreaToData(sri, ici, mode);\r\n\t eri = iri;\r\n\t } else if (mode == \"up\" && eri > iri) eri--;else sri = ri;\r\n\t } else if (eri < ri || mode == \"down\") {\r\n\t if (mode == \"down\" && details.ctrl) {\r\n\t eri = this._extendAreaToData(eri, ici, mode);\r\n\t sri = iri;\r\n\t } else if (mode == \"down\" && sri < iri) sri++;else eri = ri;\r\n\t }\r\n\r\n\t var start = {\r\n\t row: this.getIdByIndex(sri),\r\n\t column: this.columnId(sci)\r\n\t };\r\n\t var end = {\r\n\t row: this.getIdByIndex(eri),\r\n\t column: this.columnId(eci)\r\n\t };\r\n\r\n\t if (this.callEvent(\"onBeforeBlockSelect\", [start, end, true])) {\r\n\t this._updateSelectArea(area.name, start, end);\r\n\r\n\t this.callEvent(\"onSelectChange\", []);\r\n\t this.callEvent(\"onAfterBlockSelect\", [start, end]);\r\n\t }\r\n\t }\r\n\t },\r\n\t _extendAreaToData: function _extendAreaToData(rind, cind, mode) {\r\n\t var columns = this.config.columns;\r\n\t var order = this.data.order;\r\n\t var item = this.data.pull[order[rind]];\r\n\t var column = columns[cind].id;\r\n\t var res = 0; //iterate columns\r\n\r\n\t if (mode == \"right\") {\r\n\t for (var i = cind + 1; i < columns.length; i++) {\r\n\t if (item[columns[i].id]) {\r\n\t res = i;\r\n\t break;\r\n\t } else res = i;\r\n\t }\r\n\t } else if (mode == \"left\") {\r\n\t for (var _i = cind - 1; _i >= 0; _i--) {\r\n\t //check ss\r\n\t if (item[columns[_i].id]) {\r\n\t res = _i;\r\n\t break;\r\n\t }\r\n\t }\r\n\t } //iterate data\t\r\n\t else if (mode == \"down\") {\r\n\t for (var _i2 = rind + 1; _i2 < order.length; _i2++) {\r\n\t if (this.getItem(order[_i2])[column]) {\r\n\t res = _i2;\r\n\t break;\r\n\t } else res = _i2;\r\n\t }\r\n\t } else if (mode == \"up\") {\r\n\t for (var _i3 = rind - 1; _i3 >= 0; _i3--) {\r\n\t if (this.getItem(order[_i3])[column]) {\r\n\t res = _i3;\r\n\t break;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return res;\r\n\t },\r\n\t _updateSelectArea: function _updateSelectArea(name, start, end, bsUpdate) {\r\n\t var area = this._areaSelStorage[name];\r\n\t if (!area) return false;\r\n\t var old = copy(area);\r\n\t var range = {\r\n\t start: start || area.start,\r\n\t end: end || area.end\r\n\t };\r\n\r\n\t this._span_correct_range(range);\r\n\r\n\t exports.extend(area, range, true);\r\n\t this.refreshSelectArea();\r\n\r\n\t this._setTabindex(old);\r\n\r\n\t if (bsUpdate) this.callEvent(\"onSelectChange\", []);\r\n\t },\r\n\t areaselect_setter: function areaselect_setter(value) {\r\n\t if (value) {\r\n\t this._init_areaselect();\r\n\r\n\t this._init_areaselect = function () {};\r\n\t }\r\n\r\n\t this.define(\"blockselect\", value);\r\n\t return value;\r\n\t },\r\n\t addSelectArea: function addSelectArea(start, end, preserve, name, css, handle) {\r\n\t var i0, i1, j0, j1, temp;\r\n\t i0 = this.getIndexById(start.row);\r\n\t i1 = this.getIndexById(end.row);\r\n\t j0 = this.getColumnIndex(start.column);\r\n\t j1 = this.getColumnIndex(end.column);\r\n\r\n\t if (i0 > i1) {\r\n\t temp = i0;\r\n\t i0 = i1;\r\n\t i1 = temp;\r\n\t }\r\n\r\n\t if (j0 > j1) {\r\n\t temp = j0;\r\n\t j0 = j1;\r\n\t j1 = temp;\r\n\t }\r\n\r\n\t name = name || this._activeAreaSName || uid();\r\n\t this._activeAreaSName = null;\r\n\t var area = {\r\n\t start: {\r\n\t row: this.getIdByIndex(i0),\r\n\t column: this.columnId(j0)\r\n\t },\r\n\t end: {\r\n\t row: this.getIdByIndex(i1),\r\n\t column: this.columnId(j1)\r\n\t }\r\n\t };\r\n\t if (css) area.css = css;\r\n\t if (handle || handle === false) area.handle = handle;\r\n\r\n\t if (this._areaSelStorage[name]) {\r\n\t return this._updateSelectArea(name, area.start, area.end, true);\r\n\t } else {\r\n\t area.handle = true;\r\n\t }\r\n\r\n\t area.name = name;\r\n\t area.init = area.start;\r\n\r\n\t if (this.callEvent(\"onBeforeAreaAdd\", [area])) {\r\n\t this._lastDefArea = name;\r\n\t if (!preserve) this.removeSelectArea();\r\n\t this._areaSelStorage[area.name] = area;\r\n\r\n\t this._selected_areas.push(area);\r\n\r\n\t this.refreshSelectArea();\r\n\r\n\t this._setTabindex();\r\n\r\n\t this.callEvent(\"onAfterAreaAdd\", [area]);\r\n\t this.callEvent(\"onSelectChange\", []);\r\n\t }\r\n\t },\r\n\t _renderSelectAreaBox: function _renderSelectAreaBox() {\r\n\t var box = create(\"DIV\");\r\n\t box.className = \"webix_area_selection_layer\";\r\n\t box.style.top = this._render_scroll_shift + \"px\";\r\n\t return box;\r\n\t },\r\n\t refreshSelectArea: function refreshSelectArea() {\r\n\t var xr,\r\n\t yr,\r\n\t name,\r\n\t range,\r\n\t r0,\r\n\t r1,\r\n\t center = null,\r\n\t left = null,\r\n\t right = null,\r\n\t prerender = this._settings.prerender;\r\n\t if (!this._render_full_rows) return; // indexes of visible cols\r\n\r\n\t xr = this._get_x_range(prerender); // indexes of visible rows\r\n\r\n\t yr = this._get_y_range(prerender === true);\r\n\r\n\t if (!this._rselect_box) {\r\n\t this._rselect_box = this._renderSelectAreaBox();\r\n\r\n\t this._body.childNodes[1].appendChild(this._rselect_box);\r\n\r\n\t this._rselect_box_left = this._renderSelectAreaBox();\r\n\r\n\t this._body.childNodes[0].appendChild(this._rselect_box_left);\r\n\r\n\t this._rselect_box_right = this._renderSelectAreaBox();\r\n\r\n\t this._body.childNodes[2].appendChild(this._rselect_box_right);\r\n\t }\r\n\r\n\t this._rselect_box.innerHTML = \"\";\r\n\t this._rselect_box_left.innerHTML = \"\";\r\n\t this._rselect_box_right.innerHTML = \"\";\r\n\t var leftSplit = this._settings.leftSplit;\r\n\t var rightSplit = this._settings.rightSplit;\r\n\r\n\t for (name in this._areaSelStorage) {\r\n\t range = this._areaSelStorage[name];\r\n\r\n\t var ind = this._calcAreaSelectIndexes(range, xr, yr);\r\n\r\n\t if (ind === null) {\r\n\t this.removeSelectArea(name);\r\n\t continue;\r\n\t }\r\n\r\n\t var startIndex = this.getColumnIndex(range.start.column);\r\n\t var endIndex = this.getColumnIndex(range.end.column);\r\n\r\n\t if (ind.r0 <= ind.r1) {\r\n\t if (this._settings.topSplit && r0 >= this._settings.topSplit && r1 < this._render_scroll_top) return false;\r\n\t if (startIndex < leftSplit) left = this._getSelectAreaCellPositions(ind.r0, startIndex, ind.r1, Math.min(endIndex, leftSplit - 1));\r\n\t if (ind.c0 <= ind.c1) center = this._getSelectAreaCellPositions(ind.r0, ind.c0, ind.r1, ind.c1);\r\n\t if (rightSplit && endIndex >= this._rightSplit) right = this._getSelectAreaCellPositions(ind.r0, Math.max(startIndex, this._rightSplit), ind.r1, endIndex);\r\n\t if (left || center || right) this._setSelectAreaBorders(left, center, right, name, range.css, range.handle);\r\n\t }\r\n\t }\r\n\t },\r\n\t _calcAreaSelectIndexes: function _calcAreaSelectIndexes(range, xr, yr) {\r\n\t var r0, r1, c0, c1;\r\n\t var startIndex = this.getIndexById(range.start.row);\r\n\t var endIndex = this.getIndexById(range.end.row);\r\n\t var startColumn = this.getColumnIndex(range.start.column);\r\n\t var endColumn = this.getColumnIndex(range.end.column); //return null for broken select areas\r\n\r\n\t if (startColumn === -1 || endColumn === -1) return null;\r\n\t if (startIndex === -1 || endIndex === -1) return null;\r\n\t r1 = Math.min(yr[1], endIndex);\r\n\r\n\t if (this._settings.topSplit) {\r\n\t r0 = startIndex;\r\n\t if (r0 >= this._settings.topSplit) r0 = Math.max(yr[0] - this._settings.topSplit, startIndex);\r\n\r\n\t if (r1 >= this._settings.topSplit) {\r\n\t var endPos = this._cellPosition(this.getIdByIndex(endIndex), range.end.column);\r\n\r\n\t var splitPos = this._cellPosition(this.getIdByIndex(this._settings.topSplit - 1), range.end.column);\r\n\r\n\t if (splitPos.top + splitPos.height > endPos.top + endPos.height) r1 = this._settings.topSplit - 1;\r\n\t }\r\n\t } else r0 = Math.max(yr[0], this.getIndexById(range.start.row));\r\n\r\n\t c0 = Math.max(xr[0], startColumn);\r\n\t c1 = Math.min(this._rightSplit ? xr[1] - 1 : xr[1], endColumn);\r\n\t return {\r\n\t r0: r0,\r\n\t r1: r1,\r\n\t c0: c0,\r\n\t c1: c1\r\n\t };\r\n\t },\r\n\t _getSelectAreaCellPositions: function _getSelectAreaCellPositions(i0, j0, i1, j1) {\r\n\t var start = this._cellPosition(this.getIdByIndex(i0), this.columnId(j0));\r\n\r\n\t var end = this._cellPosition(this.getIdByIndex(i1), this.columnId(j1));\r\n\r\n\t return [start, end];\r\n\t },\r\n\t _setSelectAreaBorders: function _setSelectAreaBorders(left, center, right, name, css, handle) {\r\n\t var handleBox,\r\n\t handlePos,\r\n\t area = this._areaSelStorage[name],\r\n\t offset$$1 = 0;\r\n\t if (this._settings.topSplit) offset$$1 = this._getTopSplitOffset(area.start, true); //include split in calcs\r\n\r\n\t var renderArea = function renderArea(parentNode, start, end, skipLeft, skipRight) {\r\n\t var bName,\r\n\t height,\r\n\t width,\r\n\t top,\r\n\t left,\r\n\t hor,\r\n\t borders = {\r\n\t \"top\": 1,\r\n\t \"right\": 1,\r\n\t \"bottom\": 1,\r\n\t \"left\": 1\r\n\t };\r\n\t if (skipLeft) delete borders.left;\r\n\t if (skipRight) delete borders.right;\r\n\t height = end.top - start.top + end.height - 1;\r\n\t width = end.left - start.left + end.width;\r\n\r\n\t for (bName in borders) {\r\n\t top = start.top + offset$$1;\r\n\t if (bName == \"bottom\") top = end.top + end.height;\r\n\t left = start.left;\r\n\r\n\t if (bName == \"right\") {\r\n\t left = end.left + end.width;\r\n\t }\r\n\r\n\t hor = bName == \"top\" || bName == \"bottom\";\r\n\t parentNode.appendChild(create(\"DIV\", {\r\n\t \"class\": \"webix_area_selection webix_area_selection_\" + bName + (css ? \" \" + css : \"\"),\r\n\t \"style\": \"left:\" + left + \"px;top:\" + top + \"px;\" + (hor ? \"width:\" + width + \"px;\" : \"height:\" + (height - offset$$1) + \"px;\"),\r\n\t \"webix_area_name\": name\r\n\t }, \"\"));\r\n\t var elem = parentNode.lastChild;\r\n\t if (bName == \"right\") elem.style.left = left - elem.offsetWidth + \"px\";\r\n\t if (bName == \"bottom\") elem.style.top = top - elem.offsetHeight + \"px\";\r\n\r\n\t if (offset$$1) {\r\n\t //correct top split\r\n\t if (bName == \"top\") elem.style.display = \"none\";\r\n\t if (end.height == offset$$1 && bName == \"bottom\") elem.style.display = \"none\";\r\n\t }\r\n\t }\r\n\t };\r\n\r\n\t if (right) renderArea(this._rselect_box_right, right[0], right[1], !!center, false);\r\n\t if (center) renderArea(this._rselect_box, center[0], center[1], !!left, !!right);\r\n\t if (left) renderArea(this._rselect_box_left, left[0], left[1], false, !!center);\r\n\r\n\t if (handle) {\r\n\t handlePos = right ? right[1] : center ? center[1] : left[1];\r\n\t handleBox = right ? this._rselect_box_right : center ? this._rselect_box : this._rselect_box_left;\r\n\t handleBox.appendChild(create(\"DIV\", {\r\n\t \"class\": \"webix_area_selection_handle\" + (css ? \" \" + css : \"\"),\r\n\t \"style\": \"left:\" + (handlePos.left + handlePos.width) + \"px;top:\" + (handlePos.top + handlePos.height) + \"px;\",\r\n\t \"webix_area_name\": name\r\n\t }, \"\")); //correct top split\r\n\r\n\t if (offset$$1 && handlePos.height == offset$$1) handleBox.lastChild.style.display = \"none\";\r\n\t }\r\n\t },\r\n\t _removeAreaNodes: function _removeAreaNodes(name) {\r\n\t if (name) {\r\n\t var removeNodes = function removeNodes(parentNode) {\r\n\t var nodes = parentNode.childNodes;\r\n\r\n\t for (var i = nodes.length - 1; i >= 0; i--) {\r\n\t if (nodes[i].getAttribute(\"webix_area_name\") == name) {\r\n\t parentNode.removeChild(nodes[i]);\r\n\t }\r\n\t }\r\n\t };\r\n\r\n\t removeNodes(this._rselect_box);\r\n\t removeNodes(this._rselect_box_left);\r\n\t removeNodes(this._rselect_box_right);\r\n\t }\r\n\t },\r\n\t removeSelectArea: function removeSelectArea(name) {\r\n\t if (name && this._areaSelStorage[name]) {\r\n\t if (this.callEvent(\"onBeforeAreaRemove\", [name])) {\r\n\t this._setTabindex(copy(this._areaSelStorage[name]), true);\r\n\r\n\t delete this._areaSelStorage[name];\r\n\r\n\t this._removeAreaNodes(name); //reconstruct selected areas\r\n\r\n\r\n\t this._selected_areas = [];\r\n\r\n\t for (var key in this._areaSelStorage) {\r\n\t this._selected_areas.push(this._areaSelStorage[key]);\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterAreaRemove\", [name]);\r\n\t }\r\n\t } else {\r\n\t for (var n in this._areaSelStorage) {\r\n\t this.removeSelectArea(n);\r\n\t }\r\n\t }\r\n\t },\r\n\t _ars_down: function _ars_down(e) {\r\n\t var src = e.target || e.srcElement;\r\n\r\n\t var css = _getClassName(src);\r\n\r\n\t if (css && css.indexOf(\"webix_area_selection_handle\") != -1) {\r\n\t var name = src.getAttribute(\"webix_area_name\");\r\n\t this._activeAreaSName = name; // show block selection\r\n\r\n\t var area = this._areaSelStorage[name];\r\n\r\n\t var pos0 = this._cellPosition(area.start.row, area.start.column);\r\n\r\n\t var pos1 = this._cellPosition(area.end.row, area.end.column);\r\n\r\n\t var prerender = this._settings.prerender;\r\n\t var xCorrStart = this.getColumnIndex(area.start.column) < this._settings.leftSplit ? 0 : this._left_width;\r\n\t var xCorrEnd = this.getColumnIndex(area.end.column) < this._settings.leftSplit ? 0 : this._left_width;\r\n\t this._bs_ready = [pos0.left + 1 + xCorrStart - this._scrollLeft, pos0.top + 1 - (prerender ? this._scrollTop : 0), {\r\n\t row: area.start.row,\r\n\t column: area.start.column\r\n\t }];\r\n\t this._bs_position = offset(this._body);\r\n\r\n\t this._bs_start(e);\r\n\r\n\t this._bs_progress = [pos1.left + 1 + xCorrEnd - this._scrollLeft, pos1.top + 1 - (prerender ? this._scrollTop : 0)];\r\n\r\n\t this._bs_select(false, false, e);\r\n\r\n\t return preventEvent(e);\r\n\t }\r\n\t },\r\n\t getSelectArea: function getSelectArea(name) {\r\n\t return this._areaSelStorage[name || this._lastDefArea];\r\n\t },\r\n\t getAllSelectAreas: function getAllSelectAreas() {\r\n\t return this._areaSelStorage;\r\n\t },\r\n\t _span_correct_range: function _span_correct_range(range, inner_call) {\r\n\t var i,\r\n\t j,\r\n\t c0,\r\n\t c1,\r\n\t r0,\r\n\t r1,\r\n\t span,\r\n\t spanR0,\r\n\t spanC0,\r\n\t minR0,\r\n\t minC0,\r\n\t maxR1,\r\n\t maxC1,\r\n\t changed = false,\r\n\t start = range.start,\r\n\t end = range.end;\r\n\t minR0 = r0 = this.getIndexById(start.row);\r\n\t minC0 = c0 = this.getColumnIndex(start.column);\r\n\t maxR1 = r1 = this.getIndexById(end.row);\r\n\t maxC1 = c1 = this.getColumnIndex(end.column);\r\n\r\n\t for (i = r0; i <= r1; i++) {\r\n\t var item = this.getItem(this.getIdByIndex(i)); //check rows\r\n\r\n\t if (item.$row && !inner_call) {\r\n\t changed = true;\r\n\t maxC1 = this._columns.length - 1;\r\n\t } //check spans\r\n\t else if (this.config.spans) {\r\n\t for (j = c0; j <= c1; j++) {\r\n\t span = this.getSpan(this.getIdByIndex(i), this.columnId(j));\r\n\r\n\t if (span) {\r\n\t spanR0 = this.getIndexById(span[0]);\r\n\t spanC0 = this.getColumnIndex(span[1]);\r\n\r\n\t if (spanR0 < minR0) {\r\n\t minR0 = spanR0;\r\n\t changed = true;\r\n\t }\r\n\r\n\t if (spanC0 < minC0) {\r\n\t changed = true;\r\n\t minC0 = spanC0;\r\n\t }\r\n\r\n\t if (spanR0 + span[3] - 1 > maxR1) {\r\n\t changed = true;\r\n\t maxR1 = spanR0 + span[3] - 1;\r\n\t }\r\n\r\n\t if (spanC0 + span[2] - 1 > maxC1) {\r\n\t changed = true;\r\n\t maxC1 = spanC0 + span[2] - 1;\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (changed) {\r\n\t range.start = {\r\n\t row: this.getIdByIndex(minR0),\r\n\t column: this.columnId(minC0)\r\n\t };\r\n\t range.end = {\r\n\t row: this.getIdByIndex(maxR1),\r\n\t column: this.columnId(maxC1)\r\n\t };\r\n\r\n\t this._span_correct_range(range, true);\r\n\t }\r\n\t },\r\n\t _setTabindex: function _setTabindex(oldv, removeOnly) {\r\n\t if (oldv) {\r\n\t var numrows = this.getIndexById(oldv.end.row) - this.getIndexById(oldv.start.row) + 1;\r\n\t var numcols = this.getColumnIndex(oldv.end.column) - this.getColumnIndex(oldv.start.column) + 1;\r\n\t this.mapCells(oldv.start.row, oldv.start.column, numrows, numcols, bind(function (value, rid, cid) {\r\n\t var node = this.getItemNode({\r\n\t row: rid,\r\n\t column: cid\r\n\t });\r\n\t if (node) node.removeAttribute(\"tabindex\");\r\n\t }, this), true);\r\n\t }\r\n\r\n\t if (!removeOnly && this._selected_areas.length) {\r\n\t this.mapSelection(bind(function (value, rid, cid) {\r\n\t var node = this.getItemNode({\r\n\t row: rid,\r\n\t column: cid\r\n\t });\r\n\t if (node) node.setAttribute(\"tabindex\", \"1\");\r\n\t return value;\r\n\t }, this));\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$1 = {\r\n\t filterByAll: function filterByAll() {\r\n\t //we need to use dynamic function creating\r\n\t var server = false;\r\n\t this.data.silent(function () {\r\n\t this.filter();\r\n\t var first = false;\r\n\r\n\t for (var key in this._filter_elements) {\r\n\t assert(key, \"empty column id for column with filtering\");\r\n\t if (!this.isColumnVisible(key)) continue;\r\n\t var record = this._filter_elements[key];\r\n\t var originvalue = record[2].getValue(record[0]); //saving last filter value, for usage in getState\r\n\r\n\t var inputvalue = originvalue;\r\n\t if (record[1].prepare) inputvalue = record[1].prepare.call(record[2], inputvalue, record[1], this); //preserve original value\r\n\r\n\t record[1].value = originvalue;\r\n\t var compare = record[1].compare;\r\n\t if (!this.callEvent(\"onBeforeFilter\", [key, inputvalue, record[1]])) continue;\r\n\r\n\t if (record[2].$server || server) {\r\n\t //if one of filters is server side, do not run any client side filters\r\n\t server = true;\r\n\t } else {\r\n\t if (inputvalue === \"\") continue;\r\n\r\n\t if (compare) {\r\n\t compare = this._multi_compare(key, compare);\r\n\t this.filter(bind(function (obj, value) {\r\n\t if (!obj) return false;\r\n\t return compare(obj[key], value, obj);\r\n\t }, this), inputvalue, first);\r\n\t } else this.filter(key, inputvalue, first);\r\n\r\n\t first = true;\r\n\t }\r\n\t }\r\n\r\n\t if (server) this._runServerFilter();\r\n\t }, this);\r\n\r\n\t if (!server) {\r\n\t this.refresh();\r\n\t this.callEvent(\"onAfterFilter\", []);\r\n\t }\r\n\t },\r\n\t _multi_compare: function _multi_compare(key, compare) {\r\n\t var column = this.getColumnConfig(key);\r\n\t var separator = column ? column.optionslist : null; //default mode\r\n\r\n\t if (!separator) return compare;\r\n\t if (typeof separator != \"string\") separator = \",\";\r\n\t return function (itemValue, inputValue, obj) {\r\n\t if (!itemValue) return true;\r\n\t var ids = itemValue.split(separator);\r\n\r\n\t for (var i = 0; i < ids.length; i++) {\r\n\t if (compare(ids[i], inputValue, obj)) return true;\r\n\t }\r\n\t };\r\n\t },\r\n\t filterMode_setter: function filterMode_setter(mode) {\r\n\t return exports.extend(this.data._filterMode, mode, true);\r\n\t },\r\n\t getFilter: function getFilter(columnId) {\r\n\t var filter = this._filter_elements[columnId];\r\n\t assert(filter, \"Filter doesn't exists for column in question\");\r\n\t if (filter && filter[2].getInputNode) return filter[2].getInputNode(filter[0]);\r\n\t return null;\r\n\t },\r\n\t registerFilter: function registerFilter(node, config, obj) {\r\n\t this._filter_elements[config.columnId] = [node, config, obj];\r\n\t },\r\n\t collectValues: function collectValues(id) {\r\n\t var values = [];\r\n\t var checks = {\r\n\t \"\": true\r\n\t };\r\n\t var obj = this.getColumnConfig(id);\r\n\t var options = obj.options || obj.collection;\r\n\r\n\t if (options) {\r\n\t if (_typeof(options) == \"object\" && !options.loadNext) {\r\n\t //raw object\r\n\t if (isArray(options)) for (var i = 0; i < options.length; i++) {\r\n\t values.push({\r\n\t id: options[i],\r\n\t value: options[i]\r\n\t });\r\n\t } else for (var key in options) {\r\n\t values.push({\r\n\t id: key,\r\n\t value: options[key]\r\n\t });\r\n\t }\r\n\t return values;\r\n\t } else {\r\n\t //view\r\n\t if (typeof options === \"string\") options = $$(options);\r\n\t if (options.getBody) options = options.getBody();\r\n\r\n\t this._collectValues.call(options, \"id\", \"value\", values, checks);\r\n\t }\r\n\t } else this._collectValues(obj.id, obj.id, values, checks);\r\n\r\n\t var result = {\r\n\t values: values\r\n\t };\r\n\t this.callEvent(\"onCollectValues\", [id, result]);\r\n\t return result.values;\r\n\t },\r\n\t _collectValues: function _collectValues(id, value, values, checks) {\r\n\t this.data.each(function (obj) {\r\n\t var test = obj ? obj[id] : \"\";\r\n\r\n\t if (test !== undefined && !checks[test]) {\r\n\t checks[test] = true;\r\n\t var lineid = obj[id]; //special handling for 0 values\r\n\t //convert to string to create a valid ID\r\n\r\n\t if (lineid === 0) lineid = \"0\";\r\n\t values.push({\r\n\t id: lineid,\r\n\t value: obj[value]\r\n\t });\r\n\t }\r\n\t }, this, true);\r\n\r\n\t if (values.length) {\r\n\t var type = typeof values[0].value === \"string\" ? \"string\" : \"raw\";\r\n\t values.sort(this.data.sorting.create({\r\n\t as: type,\r\n\t by: \"value\",\r\n\t dir: \"asc\"\r\n\t }));\r\n\t }\r\n\t },\r\n\t _runServerFilter: function _runServerFilter() {\r\n\t this.loadNext(0, 0, {\r\n\t before: function before() {\r\n\t if (this.editStop) this.editStop();\r\n\t this.clearAll(true);\r\n\t },\r\n\t success: function success() {\r\n\t this.callEvent(\"onAfterFilter\", []);\r\n\t }\r\n\t }, 0, 1);\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$2 = {\r\n\t hover_setter: function hover_setter(value) {\r\n\t if (value && !this._hover_initialized) {\r\n\t this._enable_mouse_move();\r\n\r\n\t this.config.experimental = true;\r\n\t this.attachEvent(\"onMouseMoving\", function () {\r\n\t var row = this.locate(arguments[0]);\r\n\t row = row ? row.row : null;\r\n\r\n\t if (this._last_hover != row) {\r\n\t if (this._last_hover) this.removeRowCss(this._last_hover, this._settings.hover);\r\n\t this._last_hover = row;\r\n\t if (this._last_hover) this.addRowCss(this._last_hover, this._settings.hover);\r\n\t }\r\n\t });\r\n\t event$1(this.$view, \"mouseout\", bind(function (e) {\r\n\t if (this._last_hover && document.body.contains(e.target)) {\r\n\t this.removeRowCss(this._last_hover, this._settings.hover);\r\n\t this._last_hover = null;\r\n\t }\r\n\t }, this));\r\n\t this._hover_initialized = 1;\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t select_setter: function select_setter(value) {\r\n\t if (!this.select && value) {\r\n\t exports.extend(this, this._selections._commonselect, true);\r\n\t if (value === true) value = \"row\";else if (value == \"multiselect\") {\r\n\t value = \"row\";\r\n\t this._settings.multiselect = true;\r\n\t }\r\n\t assert(this._selections[value], \"Unknown selection mode: \" + value);\r\n\t exports.extend(this, this._selections[value], true);\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t getSelectedId: function getSelectedId(mode) {\r\n\t return mode ? [] : \"\"; //dummy placeholder\r\n\t },\r\n\t getSelectedItem: function getSelectedItem(mode) {\r\n\t return SelectionModel.getSelectedItem.call(this, mode);\r\n\t },\r\n\t _selections: {\r\n\t //shared methods for all selection models\r\n\t _commonselect: {\r\n\t _select_css: \" webix_cell_select\",\r\n\t $init: function $init() {\r\n\t this._reinit_selection();\r\n\r\n\t this.on_click.webix_cell = bind(this._click_before_select, this); //temporary stab, actual handlers need to be created\r\n\r\n\t this._data_cleared = this._data_filtered = function () {\r\n\t this.unselect();\r\n\t };\r\n\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(this._data_updated, this));\r\n\t this.data.attachEvent(\"onSyncApply\", bind(this._data_synced, this));\r\n\t this.data.attachEvent(\"onClearAll\", bind(this._data_cleared, this));\r\n\t this.data.attachEvent(\"onAfterFilter\", bind(this._data_filtered, this));\r\n\t this.data.attachEvent(\"onIdChange\", bind(this._id_changed, this));\r\n\t this.$ready.push(SelectionModel._set_noselect);\r\n\t },\r\n\t _id_changed: function _id_changed(oldid, newid) {\r\n\t for (var i = 0; i < this._selected_rows.length; i++) {\r\n\t if (this._selected_rows[i] == oldid) this._selected_rows[i] = newid;\r\n\t }\r\n\r\n\t for (var _i = 0; _i < this._selected_areas.length; _i++) {\r\n\t var item = this._selected_areas[_i];\r\n\r\n\t if (item.row == oldid) {\r\n\t oldid = this._select_key(item);\r\n\t item.row = newid;\r\n\t newid = this._select_key(item);\r\n\t item.id = newid;\r\n\t delete this._selected_pull[oldid];\r\n\t this._selected_pull[newid] = true;\r\n\t }\r\n\t }\r\n\t },\r\n\t _data_updated: function _data_updated(id, obj, type) {\r\n\t if (type == \"delete\") this.unselect(id);\r\n\t },\r\n\t _data_synced: function _data_synced() {\r\n\t for (var i = this._selected_areas.length - 1; i >= 0; i--) {\r\n\t var row = this._selected_areas[i].row;\r\n\r\n\t if (!this.exists(row)) {\r\n\t this._selected_areas.splice(i, 1);\r\n\r\n\t delete this._selected_pull[row];\r\n\t }\r\n\t }\r\n\t },\r\n\t _reinit_selection: function _reinit_selection() {\r\n\t //list of selected areas\r\n\t this._selected_areas = []; //key-value hash of selected areas, for fast search\r\n\r\n\t this._selected_pull = {}; //used to track selected cell objects\r\n\r\n\t this._selected_rows = [];\r\n\t },\r\n\t isSelected: function isSelected(id, column) {\r\n\t var key;\r\n\t if (!isUndefined(column)) key = this._select_key({\r\n\t row: id,\r\n\t column: column\r\n\t });else key = _typeof(id) === \"object\" ? this._select_key(id) : id;\r\n\t return this._selected_pull[key];\r\n\t },\r\n\t getSelectedId: function getSelectedId(asArray, plain) {\r\n\t var result; //if multiple selections was created - return array\r\n\t //in case of single selection, return value or array, when asArray parameter provided\r\n\r\n\t if (this._selected_areas.length > 1 || asArray) {\r\n\t result = [].concat(this._selected_areas);\r\n\t if (plain) for (var i = 0; i < result.length; i++) {\r\n\t result[i] = result[i].id;\r\n\t }\r\n\t } else {\r\n\t result = this._selected_areas[0];\r\n\t if (plain && result) return result.id;\r\n\t }\r\n\r\n\t return result;\r\n\t },\r\n\t _id_to_string: function _id_to_string() {\r\n\t return this.row;\r\n\t },\r\n\t _select: function _select(data, preserve) {\r\n\t var key = this._select_key(data); //don't allow selection on unnamed columns\r\n\r\n\r\n\t if (key === null) return;\r\n\t if (preserve === -1) return this._unselect(data);\r\n\t data.id = key;\r\n\t data.toString = this._id_to_string;\r\n\t if (!this.callEvent(\"onBeforeSelect\", [data, preserve])) return false; //ignore area, if it was already selected and\r\n\t // - we are preserving existing selection\r\n\t // - this is the only selected area\r\n\t // otherwise we need to clear other selected areas\r\n\r\n\t if (this._selected_pull[key] && (preserve || this._selected_areas.length == 1)) return;\r\n\t if (!preserve) this._clear_selection();\r\n\r\n\t this._selected_areas.push(data);\r\n\r\n\t this._selected_pull[key] = true;\r\n\t this.callEvent(\"onAfterSelect\", [data, preserve]);\r\n\r\n\t this._finalize_select(this._post_select(data));\r\n\r\n\t return true;\r\n\t },\r\n\t _clear_selection: function _clear_selection() {\r\n\t if (!this._selected_areas.length) return false;\r\n\r\n\t for (var i = 0; i < this._selected_areas.length; i++) {\r\n\t if (!this.callEvent(\"onBeforeUnSelect\", [this._selected_areas[i]])) return false;\r\n\t }\r\n\r\n\t for (var _i2 = 0; _i2 < this._selected_rows.length; _i2++) {\r\n\t this.data.removeMark(this._selected_rows[_i2], \"webix_selected\");\r\n\t }\r\n\r\n\t var cols = this._settings.columns;\r\n\t if (cols) for (var _i3 = 0; _i3 < cols.length; _i3++) {\r\n\t cols[_i3].$selected = null;\r\n\t }\r\n\t var data = this._selected_areas;\r\n\r\n\t this._reinit_selection();\r\n\r\n\t for (var _i4 = 0; _i4 < data.length; _i4++) {\r\n\t this.callEvent(\"onAfterUnSelect\", [data[_i4]]);\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t unselectAll: function unselectAll() {\r\n\t this.clearSelection();\r\n\t },\r\n\t selectAll: function selectAll() {\r\n\t this.selectRange();\r\n\t },\r\n\t clearSelection: function clearSelection() {\r\n\t if (this._clear_selection()) {\r\n\t this.callEvent(\"onSelectChange\", []);\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t _unselect: function _unselect(data) {\r\n\t var key = this._select_key(data);\r\n\r\n\t if (!key && this._selected_areas.length) {\r\n\t this.clearSelection();\r\n\t this.callEvent(\"onSelectChange\", []);\r\n\t } //ignore area, if it was already selected\r\n\r\n\r\n\t if (!this._selected_pull[key]) return;\r\n\t if (!this.callEvent(\"onBeforeUnSelect\", [data])) return false;\r\n\r\n\t for (var i = 0; i < this._selected_areas.length; i++) {\r\n\t if (this._selected_areas[i].id == key) {\r\n\t this._selected_areas.splice(i, 1);\r\n\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t delete this._selected_pull[key];\r\n\t this.callEvent(\"onAfterUnSelect\", [data]);\r\n\r\n\t this._finalize_select(0, this._post_unselect(data));\r\n\t },\r\n\t _add_item_select: function _add_item_select(id) {\r\n\t var item = this.getItem(id);\r\n\t return this.data.addMark(item.id, \"webix_selected\", 0, {\r\n\t $count: 0\r\n\t }, true);\r\n\t },\r\n\t _finalize_select: function _finalize_select(id) {\r\n\t if (id) this._selected_rows.push(id);\r\n\r\n\t if (!this._silent_selection) {\r\n\t this.render();\r\n\t this.callEvent(\"onSelectChange\", []);\r\n\t }\r\n\t },\r\n\t _click_before_select: function _click_before_select(e, id) {\r\n\t var preserve = e.ctrlKey || e.metaKey || this._settings.multiselect == \"touch\";\r\n\t var range = e.shiftKey;\r\n\t if (!this._settings.multiselect && this._settings.select != \"multiselect\" && this._settings.select != \"area\") preserve = range = false;\r\n\r\n\t if (range && this._selected_areas.length) {\r\n\t var last = this._selected_areas[this._selected_areas.length - 1];\r\n\r\n\t this._selectRange(id, last);\r\n\t } else {\r\n\t if (preserve && this._selected_pull[this._select_key(id)]) this._unselect(id);else this._select({\r\n\t row: id.row,\r\n\t column: id.column\r\n\t }, preserve);\r\n\t }\r\n\t },\r\n\t _mapSelection: function _mapSelection(callback, column, row) {\r\n\t var cols = this._settings.columns; //selected columns only\r\n\r\n\t if (column) {\r\n\t var temp = [];\r\n\r\n\t for (var i = 0; i < cols.length; i++) {\r\n\t if (cols[i].$selected) temp.push(cols[i]);\r\n\t }\r\n\r\n\t cols = temp;\r\n\t }\r\n\r\n\t var rows = this.data.order;\r\n\t var row_ind = 0;\r\n\r\n\t for (var _i5 = 0; _i5 < rows.length; _i5++) {\r\n\t var item = this.getItem(rows[_i5]);\r\n\t if (!item) continue; //dyn loading, row is not available\r\n\r\n\t var selection = this.data.getMark(item.id, \"webix_selected\");\r\n\r\n\t if (selection || column) {\r\n\t var col_ind = 0;\r\n\r\n\t for (var j = 0; j < cols.length; j++) {\r\n\t var id = cols[j].id;\r\n\r\n\t if (row || column || selection[id]) {\r\n\t if (callback) item[id] = callback(item[id], rows[_i5], id, row_ind, col_ind);else return {\r\n\t row: rows[_i5],\r\n\t column: id\r\n\t };\r\n\t col_ind++;\r\n\t }\r\n\t } //use separate row counter, to count only selected rows\r\n\r\n\r\n\t row_ind++;\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t row: {\r\n\t _select_css: \" webix_row_select\",\r\n\t _select_key: function _select_key(data) {\r\n\t return data.row;\r\n\t },\r\n\t select: function select(row_id, preserve) {\r\n\t //when we are using id from mouse events\r\n\t if (row_id) row_id = row_id.toString();\r\n\t assert(this.data.exists(row_id), \"Incorrect id in select command: \" + row_id);\r\n\r\n\t this._select({\r\n\t row: row_id\r\n\t }, preserve);\r\n\t },\r\n\t _post_select: function _post_select(data) {\r\n\t this._add_item_select(data.row).$row = true;\r\n\t return data.row;\r\n\t },\r\n\t unselect: function unselect(row_id) {\r\n\t this._unselect({\r\n\t row: row_id\r\n\t });\r\n\t },\r\n\t _post_unselect: function _post_unselect(data) {\r\n\t this.data.removeMark(data.row, \"webix_selected\", 0, 1);\r\n\t return data.row;\r\n\t },\r\n\t mapSelection: function mapSelection(callback) {\r\n\t return this._mapSelection(callback, false, true);\r\n\t },\r\n\t _selectRange: function _selectRange(a, b) {\r\n\t return this.selectRange(a.row, b.row);\r\n\t },\r\n\t selectRange: function selectRange(row_id, end_row_id, preserve) {\r\n\t if (isUndefined(preserve)) preserve = true;\r\n\t var row_start_ind = row_id ? this.getIndexById(row_id) : 0;\r\n\t var row_end_ind = end_row_id ? this.getIndexById(end_row_id) : this.data.order.length - 1;\r\n\r\n\t if (row_start_ind > row_end_ind) {\r\n\t var temp = row_start_ind;\r\n\t row_start_ind = row_end_ind;\r\n\t row_end_ind = temp;\r\n\t }\r\n\r\n\t this._silent_selection = true;\r\n\r\n\t for (var i = row_start_ind; i <= row_end_ind; i++) {\r\n\t var id = this.getIdByIndex(i);\r\n\r\n\t if (!id) {\r\n\t if (row_id) this.select(row_id);\r\n\t break;\r\n\t }\r\n\r\n\t this.select(id, preserve);\r\n\t }\r\n\r\n\t this._silent_selection = false;\r\n\r\n\t this._finalize_select();\r\n\t }\r\n\t },\r\n\t cell: {\r\n\t _select_key: function _select_key(data) {\r\n\t if (!data.column) return null;\r\n\t return data.row + \"_\" + data.column;\r\n\t },\r\n\t select: function select(row_id, column_id, preserve) {\r\n\t assert(this.data.exists(row_id), \"Incorrect id in select command: \" + row_id);\r\n\r\n\t this._select({\r\n\t row: row_id,\r\n\t column: column_id\r\n\t }, preserve);\r\n\t },\r\n\t _post_select: function _post_select(data) {\r\n\t var sel = this._add_item_select(data.row);\r\n\r\n\t sel.$count++;\r\n\t sel[data.column] = true;\r\n\t return data.row;\r\n\t },\r\n\t unselect: function unselect(row_id, column_id) {\r\n\t this._unselect({\r\n\t row: row_id,\r\n\t column: column_id\r\n\t });\r\n\t },\r\n\t _post_unselect: function _post_unselect(data) {\r\n\t var sel = this._add_item_select(data.row);\r\n\r\n\t sel.$count--;\r\n\t sel[data.column] = false;\r\n\t if (sel.$count <= 0) this.data.removeMark(data.row, \"webix_selected\");\r\n\t return data.row;\r\n\t },\r\n\t mapSelection: function mapSelection(callback) {\r\n\t return this._mapSelection(callback, false, false);\r\n\t },\r\n\t _selectRange: function _selectRange(a, b) {\r\n\t return this.selectRange(a.row, a.column, b.row, b.column);\r\n\t },\r\n\t selectRange: function selectRange(row_id, column_id, end_row_id, end_column_id, preserve) {\r\n\t if (isUndefined(preserve)) preserve = true;\r\n\t var row_start_ind = row_id ? this.getIndexById(row_id) : 0;\r\n\t var row_end_ind = end_row_id ? this.getIndexById(end_row_id) : this.data.order.length - 1;\r\n\t var col_start_ind = column_id ? this.getColumnIndex(column_id) : 0;\r\n\t var col_end_ind = end_column_id ? this.getColumnIndex(end_column_id) : this._columns.length - 1;\r\n\r\n\t if (row_start_ind > row_end_ind) {\r\n\t var temp = row_start_ind;\r\n\t row_start_ind = row_end_ind;\r\n\t row_end_ind = temp;\r\n\t }\r\n\r\n\t if (col_start_ind > col_end_ind) {\r\n\t var _temp = col_start_ind;\r\n\t col_start_ind = col_end_ind;\r\n\t col_end_ind = _temp;\r\n\t }\r\n\r\n\t this._silent_selection = true;\r\n\r\n\t for (var i = row_start_ind; i <= row_end_ind; i++) {\r\n\t for (var j = col_start_ind; j <= col_end_ind; j++) {\r\n\t this.select(this.getIdByIndex(i), this.columnId(j), preserve);\r\n\t }\r\n\t }\r\n\r\n\t this._silent_selection = false;\r\n\r\n\t this._finalize_select();\r\n\t }\r\n\t },\r\n\t column: {\r\n\t _select_css: \" webix_column_select\",\r\n\t _select_key: function _select_key(data) {\r\n\t return data.column;\r\n\t },\r\n\t _id_to_string: function _id_to_string() {\r\n\t return this.column;\r\n\t },\r\n\t //returns box-like area, with ordered selection cells\r\n\t select: function select(column_id, preserve) {\r\n\t this._select({\r\n\t column: column_id\r\n\t }, preserve);\r\n\t },\r\n\t _post_select: function _post_select(data) {\r\n\t this._settings.columns[this.getColumnIndex(data.column)].$selected = true;\r\n\t if (!this._silent_selection) this._render_header_and_footer();\r\n\t },\r\n\t unselect: function unselect(column_id) {\r\n\t this._unselect({\r\n\t column: column_id\r\n\t });\r\n\t },\r\n\t _post_unselect: function _post_unselect(data) {\r\n\t this._settings.columns[this.getColumnIndex(data.column)].$selected = null;\r\n\r\n\t this._render_header_and_footer();\r\n\t },\r\n\t mapSelection: function mapSelection(callback) {\r\n\t return this._mapSelection(callback, true, false);\r\n\t },\r\n\t _selectRange: function _selectRange(a, b) {\r\n\t return this.selectRange(a.column, b.column);\r\n\t },\r\n\t selectRange: function selectRange(column_id, end_column_id, preserve) {\r\n\t if (isUndefined(preserve)) preserve = true;\r\n\t var column_start_ind = column_id ? this.getColumnIndex(column_id) : 0;\r\n\t var column_end_ind = end_column_id ? this.getColumnIndex(end_column_id) : this._columns.length - 1;\r\n\r\n\t if (column_start_ind > column_end_ind) {\r\n\t var temp = column_start_ind;\r\n\t column_start_ind = column_end_ind;\r\n\t column_end_ind = temp;\r\n\t }\r\n\r\n\t this._silent_selection = true;\r\n\r\n\t for (var i = column_start_ind; i <= column_end_ind; i++) {\r\n\t this.select(this.columnId(i), preserve);\r\n\t }\r\n\r\n\t this._silent_selection = false;\r\n\r\n\t this._render_header_and_footer();\r\n\r\n\t this._finalize_select();\r\n\t },\r\n\t _data_synced: function _data_synced() {//do nothing, as columns are not changed\r\n\t }\r\n\t },\r\n\t area: {\r\n\t _select_key: function _select_key(data) {\r\n\t return data.row + \"_\" + data.column;\r\n\t },\r\n\t getSelectedId: function getSelectedId(asArray) {\r\n\t var area = this.getSelectArea();\r\n\t var result = [];\r\n\r\n\t if (area) {\r\n\t if (asArray && (area.start.row != area.end.row || area.start.column != area.end.column)) {\r\n\t var row_start_ind = this.getIndexById(area.start.row);\r\n\t var row_end_ind = this.getIndexById(area.end.row); //filtering in process\r\n\r\n\t if (row_start_ind == -1 || row_end_ind == -1) return result;\r\n\t var col_start_ind = this.getColumnIndex(area.start.column);\r\n\t var col_end_ind = this.getColumnIndex(area.end.column);\r\n\r\n\t for (var i = row_start_ind; i <= row_end_ind; i++) {\r\n\t for (var j = col_start_ind; j <= col_end_ind; j++) {\r\n\t result.push({\r\n\t row: this.getIdByIndex(i),\r\n\t column: this.columnId(j)\r\n\t });\r\n\t }\r\n\t }\r\n\t } else {\r\n\t result.push(area.end);\r\n\t }\r\n\t }\r\n\r\n\t return asArray ? result : result[0];\r\n\t },\r\n\t unselect: function unselect() {\r\n\t this._unselect();\r\n\t },\r\n\t _unselect: function _unselect() {\r\n\t this.removeSelectArea();\r\n\t this.callEvent(\"onSelectChange\", []);\r\n\t },\r\n\t mapSelection: function mapSelection(callback) {\r\n\t var select = this.getSelectArea();\r\n\r\n\t if (select) {\r\n\t var sind = this.getColumnIndex(select.start.column);\r\n\t var eind = this.getColumnIndex(select.end.column);\r\n\t var srow = this.getIndexById(select.start.row);\r\n\t var erow = this.getIndexById(select.end.row);\r\n\r\n\t for (var i = srow; i <= erow; i++) {\r\n\t var rid = this.data.order[i];\r\n\t var item = this.getItem(rid);\r\n\r\n\t for (var j = sind; j <= eind; j++) {\r\n\t var cid = this._columns[j].id;\r\n\t if (callback) item[cid] = callback(item[cid] || \"\", rid, cid, i - srow, j - sind);else return {\r\n\t row: rid,\r\n\t column: cid\r\n\t };\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t select: function select(row_id, column_id, preserve) {\r\n\t assert(this.data.exists(row_id), \"Incorrect id in select command: \" + row_id);\r\n\r\n\t this._select({\r\n\t row: row_id,\r\n\t column: column_id\r\n\t }, preserve);\r\n\t },\r\n\t _selectRange: function _selectRange(id, last) {\r\n\t this._extendAreaRange(id, last);\r\n\t },\r\n\t _select: function _select(cell) {\r\n\t //ctrl-selection is not supported yet, so ignoring the preserve flag\r\n\t this.addSelectArea(cell, cell, false);\r\n\t return true;\r\n\t },\r\n\t _data_synced: function _data_synced() {\r\n\t if (this._selected_areas.length) this.refreshSelectArea();\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$3 = {\r\n\t blockselect_setter: function blockselect_setter(value) {\r\n\t if (value && this._block_sel_flag) {\r\n\t _event(this._viewobj, env.mouse.move, this._bs_move, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(this._viewobj, env.mouse.down, this._bs_down, {\r\n\t bind: this\r\n\t });\r\n\r\n\t event$1(document.body, env.mouse.up, this._bs_up, {\r\n\t bind: this\r\n\t });\r\n\t this._block_sel_flag = this._bs_ready = this._bs_progress = false;\r\n\t this.attachEvent(\"onAfterScroll\", function () {\r\n\t this._update_block_selection();\r\n\t }); // auto scroll\r\n\r\n\t exports.extend(this, AutoScroll, true);\r\n\t this.attachEvent(\"onBeforeAutoScroll\", function () {\r\n\t return this._bs_progress;\r\n\t });\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t _block_sel_flag: true,\r\n\t _childOf: function _childOf(e, tag) {\r\n\t var src = e.target || e.srcElement;\r\n\r\n\t while (src) {\r\n\t if (src.getAttribute && src.getAttribute(\"webixignore\")) return false;\r\n\t if (src == tag) return true;\r\n\t src = src.parentNode;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t _bs_down: function _bs_down(e) {\r\n\t // do not listen to mousedown of subview on master\r\n\t if (this._settings.subview && this != $$(e.target || e.srcElement)) return;\r\n\r\n\t if (this._childOf(e, this._body)) {\r\n\t //disable block selection when we have an active editor\r\n\t if (e.target && e.target.tagName == \"INPUT\" || this._rs_process) return;\r\n\t this._bs_position = offset(this._body);\r\n\t var pos$$1 = pos(e);\r\n\t this._bs_ready = [pos$$1.x - this._bs_position.x, pos$$1.y - this._bs_position.y];\r\n\t preventEvent(e);\r\n\t }\r\n\t },\r\n\t _bs_up: function _bs_up(e) {\r\n\t if (this._block_panel) {\r\n\t this._bs_select(\"select\", true, e);\r\n\r\n\t this._block_panel = remove(this._block_panel);\r\n\t }\r\n\r\n\t removeCss(document.body, \"webix_noselect\");\r\n\t this._bs_ready = this._bs_progress = false;\r\n\t if (this._auto_scroll_delay) this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay);\r\n\t },\r\n\t _update_block_selection: function _update_block_selection() {\r\n\t if (this._bs_progress) this._bs_select(false, false);\r\n\t },\r\n\t _bs_select: function _bs_select(mode, theend, e) {\r\n\t var start = null;\r\n\t if (!this._bs_ready[2]) this._bs_ready[2] = this._locate_cell_xy.apply(this, this._bs_ready);\r\n\t start = this._bs_ready[2];\r\n\r\n\t var end = this._locate_cell_xy.apply(this, this._bs_progress);\r\n\r\n\t if (!this.callEvent(\"onBeforeBlockSelect\", [start, end, theend, e])) return;\r\n\r\n\t if ((!this._bs_do_select || this._bs_do_select(start, end, theend, e) !== false) && start.row && end.row) {\r\n\t if (mode === \"select\") {\r\n\t this._clear_selection();\r\n\r\n\t this._selectRange(start, end);\r\n\t } else {\r\n\t var startx, starty, endx, endy;\r\n\r\n\t if (mode === \"box\") {\r\n\t startx = Math.min(this._bs_ready[0], this._bs_progress[0]);\r\n\t endx = Math.max(this._bs_ready[0], this._bs_progress[0]);\r\n\t starty = Math.min(this._bs_ready[1], this._bs_progress[1]);\r\n\t endy = Math.max(this._bs_ready[1], this._bs_progress[1]);\r\n\t } else {\r\n\t var startn = this._cellPosition(start.row, start.column);\r\n\r\n\t var endn = this._cellPosition(end.row, end.column);\r\n\r\n\t var scroll = this.getScrollState();\r\n\t var startWidth = startn.width;\r\n\t var endWidth = endn.width;\r\n\r\n\t if (this._right_width && this._bs_ready[0] > this._left_width + this._center_width) {\r\n\t startn.left += this._left_width + this._center_width;\r\n\t } else if (this._left_width) {\r\n\t if (this._bs_ready[0] > this._left_width) {\r\n\t if (startn.left < scroll.x) {\r\n\t startWidth -= scroll.x - startn.left;\r\n\t startn.left = this._left_width;\r\n\t } else startn.left += this._left_width - scroll.x;\r\n\t }\r\n\t } else startn.left -= scroll.x;\r\n\r\n\t if (this._right_width && this._bs_progress[0] > this._left_width + this._center_width) {\r\n\t endn.left += this._left_width + this._center_width;\r\n\t } else if (this._left_width) {\r\n\t if (this._bs_progress[0] > this._left_width) {\r\n\t if (endn.left < scroll.x) {\r\n\t endWidth -= scroll.x - endn.left;\r\n\t endn.left = this._left_width;\r\n\t } else endn.left += this._left_width - scroll.x;\r\n\t }\r\n\t } else endn.left -= scroll.x;\r\n\r\n\t if (this._settings.prerender) {\r\n\t startn.top -= this._scrollTop;\r\n\t endn.top -= this._scrollTop;\r\n\t }\r\n\r\n\t startx = Math.min(startn.left, endn.left);\r\n\t endx = Math.max(startn.left + startWidth, endn.left + endWidth);\r\n\t starty = Math.min(startn.top, endn.top);\r\n\t endy = Math.max(startn.top + startn.height, endn.top + endn.height);\r\n\t if (this._settings.topSplit) starty += this._getTopSplitOffset(start);\r\n\t if (this._auto_scroll_delay) this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay);\r\n\t if (e) this._auto_scroll_delay = delay(this._auto_scroll, this, [pos(e)], 250);\r\n\t }\r\n\r\n\t var style = this._block_panel.style;\r\n\t style.left = startx + \"px\";\r\n\t style.top = starty + \"px\";\r\n\t style.width = endx - startx + \"px\";\r\n\t style.height = endy - starty + \"px\";\r\n\t }\r\n\t }\r\n\r\n\t if (theend) this.callEvent(\"onAfterBlockSelect\", [start, end]);\r\n\t },\r\n\t _bs_start: function _bs_start() {\r\n\t this._block_panel = create(\"div\", {\r\n\t \"class\": \"webix_block_selection\"\r\n\t }, \"\");\r\n\r\n\t this._body.appendChild(this._block_panel);\r\n\t },\r\n\t _bs_move: function _bs_move(e) {\r\n\t if (this._bs_ready !== false) {\r\n\t if (!this._bs_progress) addCss(document.body, \"webix_noselect\");\r\n\t var pos$$1 = pos(e);\r\n\t var progress = [pos$$1.x - this._bs_position.x, pos$$1.y - this._bs_position.y]; //prevent unnecessary block selection while dbl-clicking\r\n\r\n\t if (Math.abs(this._bs_ready[0] - progress[0]) < 5 && Math.abs(this._bs_ready[1] - progress[1]) < 5) return;\r\n\t if (this._bs_progress === false) this._bs_start(e);\r\n\t this._bs_progress = progress;\r\n\r\n\t this._bs_select(this.config.blockselect, false, e);\r\n\t }\r\n\t },\r\n\t _locate_cell_xy: function _locate_cell_xy(x, y) {\r\n\t var inTopSplit = false,\r\n\t row = null,\r\n\t column = null;\r\n\t if (this._right_width && x > this._left_width + this._center_width) x += this._x_scroll.getSize() - this._center_width - this._left_width - this._right_width;else if (!this._left_width || x > this._left_width) x += this._x_scroll.getScroll();\r\n\r\n\t if (this._settings.topSplit && this._render_scroll_top > this._settings.topSplit) {\r\n\t var splitPos = this._cellPosition(this.getIdByIndex(this._settings.topSplit - 1), this.columnId(0));\r\n\r\n\t if (splitPos.top + splitPos.height > y) {\r\n\t inTopSplit = true;\r\n\t }\r\n\t }\r\n\r\n\t if (!inTopSplit) y += this.getScrollState().y;\r\n\t if (x < 0) x = 0;\r\n\t if (y < 0) y = 0;\r\n\t var cols = this._settings.columns;\r\n\t var rows = this.data.order;\r\n\t var summ = 0;\r\n\r\n\t for (var i = 0; i < cols.length; i++) {\r\n\t summ += cols[i].width;\r\n\r\n\t if (summ >= x) {\r\n\t column = cols[i].id;\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t if (!column) column = cols[cols.length - 1].id;\r\n\t summ = 0;\r\n\t var start = this.data.$min || 0;\r\n\r\n\t if (this._settings.fixedRowHeight) {\r\n\t row = rows[start + Math.floor(y / this._settings.rowHeight)];\r\n\t } else for (var _i = start; _i < rows.length; _i++) {\r\n\t summ += this._getHeightByIndex(_i);\r\n\r\n\t if (summ >= y) {\r\n\t row = rows[_i];\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t if (!row) row = rows[rows.length - 1];\r\n\t return {\r\n\t row: row,\r\n\t column: column\r\n\t };\r\n\t },\r\n\t _getTopSplitOffset: function _getTopSplitOffset(cell, area) {\r\n\t var y = 0,\r\n\t startIndex = this.getIndexById(cell.row);\r\n\r\n\t if (startIndex >= this._settings.topSplit) {\r\n\t var startPos = this._cellPosition(this.getIdByIndex(startIndex), cell.column);\r\n\r\n\t var splitPos = this._cellPosition(this.getIdByIndex(this._settings.topSplit - 1), cell.column);\r\n\r\n\t if (splitPos.top + splitPos.height - startPos.top > 0) {\r\n\t y = splitPos.top + splitPos.height - (startPos.top > 0 || !area ? startPos.top : 0);\r\n\t }\r\n\t }\r\n\r\n\t return y;\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$4 = {\r\n\t resizeRow_setter: function resizeRow_setter(value) {\r\n\t this._settings.scrollAlignY = false;\r\n\t this._settings.fixedRowHeight = false;\r\n\t return this.resizeColumn_setter(value);\r\n\t },\r\n\t resizeColumn_setter: function resizeColumn_setter(value) {\r\n\t if (value && this._rs_init_flag) {\r\n\t _event(this._viewobj, \"mousemove\", this._rs_move, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(this._viewobj, \"mousedown\", this._rs_down, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(this._viewobj, \"mouseup\", this._rs_up, {\r\n\t bind: this\r\n\t });\r\n\r\n\t this._rs_init_flag = false;\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t _rs_init_flag: true,\r\n\t _rs_down: function _rs_down(e) {\r\n\t // do not listen to mousedown of subview on master\r\n\t if (this._settings.subview && this != $$(e.target || e.srcElement)) return; //if mouse was near border\r\n\r\n\t if (!this._rs_ready) return;\r\n\t this._rs_process = [pos(e), this._rs_ready[2]];\r\n\t addCss(document.body, \"webix_noselect\");\r\n\t denySelect();\r\n\t },\r\n\t _rs_up: function _rs_up() {\r\n\t this._rs_process = false;\r\n\t removeCss(document.body, \"webix_noselect\");\r\n\t allowSelect();\r\n\t },\r\n\t _rs_start: function _rs_start() {\r\n\t if (this._rs_progress) return;\r\n\t var dir = this._rs_ready[0];\r\n\t var node = this._rs_process[1];\r\n\r\n\t var obj = this._locate(node);\r\n\r\n\t if (!obj) return;\r\n\t var eventPos = this._rs_process[0];\r\n\t var start;\r\n\r\n\t if (dir == \"x\") {\r\n\t start = offset(node).x + this._rs_ready[1] - offset(this._body).x;\r\n\t eventPos = eventPos.x;\r\n\t if (!this._rs_ready[1]) obj.cind -= node.parentNode.colSpan || 1;\r\n\t } else {\r\n\t start = offset(node).y + this._rs_ready[1] - offset(this._body).y + this._header_height;\r\n\t eventPos = eventPos.y;\r\n\t if (!this._rs_ready[1]) obj.rind--;\r\n\t }\r\n\r\n\t if (obj.cind >= 0 && obj.rind >= 0) {\r\n\t this._rs_progress = [dir, obj, start];\r\n\t var resize = new ui.resizearea({\r\n\t container: this._viewobj,\r\n\t dir: dir,\r\n\t eventPos: eventPos,\r\n\t start: start,\r\n\t cursor: (dir == \"x\" ? \"col\" : \"row\") + \"-resize\"\r\n\t });\r\n\t resize.attachEvent(\"onResizeEnd\", bind(this._rs_end, this));\r\n\t }\r\n\r\n\t this._rs_down = this._rs_ready = false;\r\n\t },\r\n\t _rs_end: function _rs_end(result) {\r\n\t if (this._rs_progress) {\r\n\t var dir = this._rs_progress[0];\r\n\t var obj = this._rs_progress[1];\r\n\t var newsize = result - this._rs_progress[2];\r\n\r\n\t if (dir == \"x\") {\r\n\t //in case of right split - different sizing logic applied\r\n\t if (this._settings.rightSplit && obj.cind + 1 >= this._rightSplit && obj.cind !== this._columns.length - 1) {\r\n\t obj.cind++;\r\n\t newsize *= -1;\r\n\t }\r\n\r\n\t var column = this._columns[obj.cind];\r\n\t var oldwidth = column.width;\r\n\t delete column.fillspace;\r\n\t delete column.adjust;\r\n\r\n\t this._setColumnWidth(obj.cind, oldwidth + newsize, true, true);\r\n\r\n\t this._updateColsSizeSettings();\r\n\t } else {\r\n\t var rid = this.getIdByIndex(obj.rind);\r\n\r\n\t var oldheight = this._getRowHeight(this.getItem(rid));\r\n\r\n\t this.setRowHeight(rid, oldheight + newsize);\r\n\t }\r\n\r\n\t this._rs_up();\r\n\t }\r\n\r\n\t this._rs_progress = null;\r\n\t },\r\n\t _rs_move: function _rs_move(e) {\r\n\t var cell = null,\r\n\t config = this._settings;\r\n\t if (this._rs_ready && this._rs_process) return this._rs_start(e);\r\n\t e = e || event;\r\n\t var node = e.target || e.srcElement;\r\n\t var mode = false; //resize ready flag\r\n\r\n\t if (node.tagName == \"TD\" || node.tagName == \"TABLE\") return;\r\n\t var element_class = node.className || \"\";\r\n\t var in_body = typeof element_class === \"string\" && element_class.indexOf(\"webix_cell\") != -1; //ignore resize in case of drag-n-drop enabled\r\n\r\n\t if (in_body && config.drag) return;\r\n\t var in_header = typeof element_class === \"string\" && element_class.indexOf(\"webix_hcell\") != -1;\r\n\t this._rs_ready = false;\r\n\r\n\t if (in_body || in_header) {\r\n\t var dx = node.offsetWidth;\r\n\t var dy = node.offsetHeight;\r\n\t var pos$$1 = posRelative(e);\r\n\t var resizeRow = config.resizeRow; // if resize is only within the first column\r\n\r\n\t if (_typeof(resizeRow) == \"object\" && resizeRow.headerOnly) {\r\n\t cell = this._locate(node);\r\n\t if (cell.cind > 0) resizeRow = false;\r\n\t }\r\n\r\n\t if (in_body && resizeRow) {\r\n\t resizeRow = _typeof(resizeRow) == \"object\" && resizeRow.size ? resizeRow.size : 3;\r\n\r\n\t if (pos$$1.y < resizeRow) {\r\n\t if (!cell) cell = this._locate(node); // avoid resize header border\r\n\r\n\t if (cell.rind) {\r\n\t this._rs_ready = [\"y\", 0, node];\r\n\t mode = \"row-resize\";\r\n\t }\r\n\t } else if (dy - pos$$1.y < resizeRow + 1) {\r\n\t this._rs_ready = [\"y\", dy, node];\r\n\t mode = \"row-resize\";\r\n\t }\r\n\t }\r\n\r\n\t var resizeColumn = config.resizeColumn; // if resize is only within the header\r\n\r\n\t if (_typeof(resizeColumn) == \"object\" && resizeColumn.headerOnly && in_body) resizeColumn = false;\r\n\r\n\t if (resizeColumn) {\r\n\t resizeColumn = _typeof(resizeColumn) == \"object\" && resizeColumn.size ? resizeColumn.size : 3;\r\n\r\n\t if (pos$$1.x < resizeColumn) {\r\n\t this._rs_ready = [\"x\", 0, node];\r\n\t mode = \"col-resize\";\r\n\t } else if (dx - pos$$1.x < resizeColumn + 1) {\r\n\t this._rs_ready = [\"x\", dx, node];\r\n\t mode = \"col-resize\";\r\n\t }\r\n\t }\r\n\t } //mark or unmark resizing ready state\r\n\r\n\r\n\t if (this._cursor_timer) window.clearTimeout(this._cursor_timer);\r\n\t this._cursor_timer = delay(this._mark_resize_ready, this, [mode], mode ? 100 : 0);\r\n\t },\r\n\t _mark_resize_ready: function _mark_resize_ready(mode) {\r\n\t if (this._last_cursor_mode != mode) {\r\n\t this._last_cursor_mode = mode;\r\n\t this._viewobj.style.cursor = mode || \"default\";\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tattachEvent(\"onDataTable\", function (table, config) {\r\n\t if (env.touch) {\r\n\t Touch.$init();\r\n\t config.scrollSize = 0; // needed to show datatable scroll\r\n\r\n\t if (Touch._disabled) Touch.limit();\r\n\t table.$ready.push(table.$touch);\r\n\t }\r\n\t});\r\n\tvar Mixin$5 = {\r\n\t $touch: function $touch() {\r\n\t var config = this._settings;\r\n\t config.scrollAlignY = false;\r\n\t exports.extend(this, config.prerender === true ? this._touchNative : this._touch);\r\n\t var scrollMode = \"\";\r\n\t if (!config.autowidth && config.scrollX !== false) scrollMode += \"x\";\r\n\t if (!config.autoheight && config.scrollY !== false) scrollMode += \"y\";\r\n\r\n\t this._body.setAttribute(\"touch_scroll\", scrollMode);\r\n\r\n\t Touch._init_scroll_node(this._body.childNodes[1].firstChild);\r\n\r\n\t Touch._set_matrix(this._body.childNodes[1].firstChild, 0, 0, \"0ms\");\r\n\r\n\t this._sync_scroll(0, 0, \"0ms\");\r\n\t },\r\n\t _touchNative: {\r\n\t _scrollTo_touch: function _scrollTo_touch(x, y) {\r\n\t Touch._set_matrix(this._body.childNodes[1].firstChild, 0, 0, \"0ms\");\r\n\r\n\t this._sync_scroll(x, y, \"0ms\");\r\n\t },\r\n\t _getScrollState_touch: function _getScrollState_touch() {\r\n\t var temp = Touch._get_matrix(this._body.childNodes[1].firstChild);\r\n\r\n\t return {\r\n\t x: -temp.e,\r\n\t y: -temp.f\r\n\t };\r\n\t },\r\n\t $init: function $init() {\r\n\t this.attachEvent(\"onBeforeScroll\", function () {\r\n\t Touch._scroll_node = this._body.childNodes[1].firstChild;\r\n\r\n\t Touch._get_sizes(Touch._scroll_node);\r\n\r\n\t Touch._scroll_master = this;\r\n\t });\r\n\t this.attachEvent(\"onTouchEnd\", function () {\r\n\t Touch._scroll_master = null;\r\n\t });\r\n\t },\r\n\t _sync_scroll: function _sync_scroll(x, y, t) {\r\n\t if (this._settings.leftSplit) Touch._set_matrix(this._body.childNodes[0].firstChild, 0, y, t);\r\n\t if (this._settings.rightSplit) Touch._set_matrix(this._body.childNodes[2].firstChild, 0, y, t);\r\n\t if (this._settings.header) Touch._set_matrix(this._header.childNodes[1].firstChild, x, 0, t);\r\n\t if (this._settings.footer) Touch._set_matrix(this._footer.childNodes[1].firstChild, x, 0, t);\r\n\t this.callEvent(\"onSyncScroll\", [x, y, t]);\r\n\t },\r\n\t _sync_pos: function _sync_pos() {}\r\n\t },\r\n\t _touch: {\r\n\t _scrollTo_touch: function _scrollTo_touch(x, y) {\r\n\t delay(function () {\r\n\t this.callEvent(\"onAfterScroll\", [{\r\n\t e: -x,\r\n\t f: -y\r\n\t }]);\r\n\t }, this);\r\n\t },\r\n\t $scroll: {\r\n\t gravity: 0,\r\n\t elastic: false\r\n\t },\r\n\t $init: function $init() {\r\n\t //if the result column's width < container's width,\r\n\t this.attachEvent(\"onAfterColumnHide\", function () {\r\n\t this._scrollTo_touch(0, 0);\r\n\t });\r\n\t this.attachEvent(\"onBeforeScroll\", function () {\r\n\t var t = Touch;\r\n\t t._scroll_node = this._body.childNodes[1].firstChild;\r\n\r\n\t t._get_sizes(t._scroll_node);\r\n\r\n\t t._scroll_stat.left = this._scrollLeft;\r\n\t t._scroll_stat.hidden = this._x_scroll._settings.scrollVisible || this._y_scroll._settings.scrollVisible;\r\n\t t._scroll_stat.dy = this._dtable_height;\r\n\t t._scroll_master = this;\r\n\t });\r\n\t this.attachEvent(\"onAfterScroll\", function (result) {\r\n\t //onAfterScroll may be triggered by some non-touch related logic\r\n\t if (!result) return;\r\n\t var isScrollX = this._scrollLeft != -result.e;\r\n\t var isScrollY = this._scrollTop != -result.f;\r\n\t Touch._scroll_master = null;\r\n\t Touch._fix_f = null;\r\n\t this._scrollTop = 0;\r\n\t this._scrollLeft = 0; //ipad can delay content rendering if 3d transformation applied\r\n\t //switch back to 2d\r\n\r\n\t var temp = Touch.config.translate;\r\n\t Touch.config.translate = \"translate\";\r\n\r\n\t this._sync_scroll(this._x_scroll ? 0 : result.e, 0, \"0ms\");\r\n\r\n\t Touch.config.translate = temp;\r\n\t this._scrollLeft = -result.e;\r\n\t this._scrollTop = -result.f;\r\n\r\n\t this._correctScrollSize();\r\n\r\n\t this.render();\r\n\r\n\t if (isScrollX) {\r\n\t if (this._x_scroll) this._x_scroll.scrollTo(this._scrollLeft);\r\n\t this.callEvent(\"onScrollX\", []);\r\n\t }\r\n\r\n\t if (isScrollY) {\r\n\t if (this._y_scroll) this._y_scroll.scrollTo(this._scrollTop);\r\n\t this.callEvent(\"onScrollY\", []);\r\n\t }\r\n\r\n\t return false;\r\n\t });\r\n\t },\r\n\t _sync_scroll: function _sync_scroll(x, y, t) {\r\n\t y += this._scrollTop;\r\n\t x += this._scrollLeft;\r\n\r\n\t Touch._set_matrix(this._body.childNodes[1].firstChild, x, y, t);\r\n\r\n\t if (this._settings.leftSplit) Touch._set_matrix(this._body.childNodes[0].firstChild, 0, y, t);\r\n\t if (this._settings.rightSplit) Touch._set_matrix(this._body.childNodes[2].firstChild, 0, y, t);\r\n\t if (this._settings.header) Touch._set_matrix(this._header.childNodes[1].firstChild, x, 0, t);\r\n\t if (this._settings.footer) Touch._set_matrix(this._footer.childNodes[1].firstChild, x, 0, t);\r\n\t this.callEvent(\"onSyncScroll\", [x, y, t]);\r\n\t },\r\n\t _sync_pos: function _sync_pos(matrix) {\r\n\t matrix.f -= this._scrollTop;\r\n\t matrix.e -= this._scrollLeft;\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$6 = {\r\n\t $init: function $init() {\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(function (id) {\r\n\t if (!id) this._adjustColumns();\r\n\t }, this));\r\n\t this.attachEvent(\"onStructureLoad\", this._adjustColumns);\r\n\t this.attachEvent(\"onStructureUpdate\", this._resizeColumns);\r\n\t this.attachEvent(\"onColumnResize\", function (a, b, c, user) {\r\n\t if (user) this._resizeColumns();\r\n\t });\r\n\t this.attachEvent(\"onResize\", this._resizeColumns);\r\n\t },\r\n\t _adjustColumns: function _adjustColumns() {\r\n\t var resize = false;\r\n\t var cols = this._columns;\r\n\r\n\t for (var i = 0; i < cols.length; i++) {\r\n\t if (cols[i].adjust && (cols[i].adjust == \"header\" || this.count())) resize = this._adjustColumn(i, cols[i].adjust, true) || resize;\r\n\t }\r\n\r\n\t if (resize) {\r\n\t this._updateColsSizeSettings(true);\r\n\r\n\t this._resizeColumns();\r\n\t }\r\n\t },\r\n\t _resizeColumns: function _resizeColumns() {\r\n\t var cols = this._settings.columns;\r\n\t var fill = [];\r\n\t var summ = 0;\r\n\t if (cols && !this._settings.autowidth) for (var i = 0; i < cols.length; i++) {\r\n\t var colfil = cols[i].fillspace;\r\n\r\n\t if (colfil) {\r\n\t fill[i] = colfil;\r\n\t summ += colfil * 1 || 1;\r\n\t }\r\n\t }\r\n\t if (summ) this._fillColumnSize(fill, summ);\r\n\t },\r\n\t _fillColumnSize: function _fillColumnSize(fill, summ) {\r\n\t var cols = this._settings.columns;\r\n\t if (!cols) return;\r\n\t var width = this._content_width - this._scrollSizeY;\r\n\t var resize = false;\r\n\r\n\t if (width > 0) {\r\n\t for (var i = 0; i < cols.length; i++) {\r\n\t if (!fill[i]) width -= cols[i].width || this.config.columnWidth;\r\n\t }\r\n\r\n\t for (var _i = 0; _i < fill.length; _i++) {\r\n\t if (fill[_i]) {\r\n\t var request = Math.min(width, Math.round(width * fill[_i] / summ));\r\n\t resize = this._setColumnWidth(_i, request, true) || resize;\r\n\t width = width - cols[_i].width;\r\n\t summ = summ - fill[_i];\r\n\t }\r\n\t }\r\n\r\n\t if (resize) this._updateColsSizeSettings(true);\r\n\t }\r\n\t },\r\n\t _getColumnConfigSize: function _getColumnConfigSize(ind, headers) {\r\n\t var config = this._settings.columns[ind];\r\n\t var max = config.minColumnWidth || 10; //get max data width\r\n\r\n\t if (headers != \"header\") {\r\n\t var count = this.data.order.length;\r\n\t if (config.adjustBatch && config.adjustBatch < count) count = config.adjustBatch;\r\n\t var order = this.data.order.slice(0, count);\r\n\r\n\t for (var i = 0; i < count; i++) {\r\n\t order[i] = order[i] ? this._getValue(this.getItem(order[i]), config, 0) : \"\";\r\n\t }\r\n\r\n\t max = Math.max(max, getTextSize(order, \"webix_table_cell webix_cell\").width);\r\n\t } //get max header width\r\n\r\n\r\n\t if (headers != \"data\") {\r\n\t for (var _i2 = 0; _i2 < config.header.length; _i2++) {\r\n\t var header = config.header[_i2];\r\n\r\n\t if (header) {\r\n\t var width = 0;\r\n\t if (header.rotate) for (var h = 0; h < (header.rowspan || 1); h++) {\r\n\t width += this._headers[h];\r\n\t }\r\n\t var css = \"webix_table_cell webix_cell \" + (header.css || \"\") + (header.rotate ? \"webix_measure_rotate\" : \"\");\r\n\t var size = getTextSize([header.text], css, width);\r\n\t max = Math.max(max, header.rotate ? size.height : size.width);\r\n\t }\r\n\t }\r\n\r\n\t if (config.sort) max += 10; // add 10px for sort marker\r\n\t } //1px to compensate offsetWidth rounding\r\n\r\n\r\n\t return max + 1 + (env.isIE ? $active.layoutPadding.space : 0);\r\n\t },\r\n\t _adjustColumn: function _adjustColumn(ind, headers, ignore) {\r\n\t if (ind >= 0) {\r\n\t var width = this._getColumnConfigSize(ind, headers);\r\n\r\n\t return this._setColumnWidth(ind, width, ignore);\r\n\t }\r\n\t },\r\n\t adjustColumn: function adjustColumn(id, headers) {\r\n\t this._adjustColumn(this.getColumnIndex(id), headers);\r\n\t },\r\n\t adjustRowHeight: function adjustRowHeight(id, silent) {\r\n\t var _this = this;\r\n\r\n\t if (id) {\r\n\t var config = this.getColumnConfig(id);\r\n\t var container;\r\n\t var d = create(\"DIV\", {\r\n\t \"class\": \"webix_table_cell webix_measure_size webix_cell\"\r\n\t }, \"\");\r\n\t d.style.cssText = \"width:\" + config.width + \"px; height:1px; visibility:hidden; position:absolute; top:0px; left:0px; overflow:hidden;\";\r\n\t this.$view.appendChild(d);\r\n\r\n\t if (d.offsetHeight < 1) {\r\n\t //hidden container, height detection is broken\r\n\t //reattach to the body\r\n\t container = this.$view.cloneNode(true);\r\n\t document.body.appendChild(container);\r\n\t container.appendChild(d);\r\n\t }\r\n\r\n\t this.data.each(function (obj) {\r\n\t d.innerHTML = this._getValue(obj, config, 0);\r\n\t obj.$height = Math.max(d.scrollHeight, this._settings.rowHeight);\r\n\t }, this);\r\n\t d = remove(d);\r\n\t if (container) remove(container);\r\n\t } else {\r\n\t //set size of array based on data size\r\n\t //can be not-reliable for tree-like components anyway\r\n\t var heightsArr = new Array(this.data.order.length);\r\n\t var cols = this.config.columns; //set 0 as initial height\r\n\r\n\t var j = 0; //iterate through all possible items\r\n\t //we need to be sure that heightsArr is not lesser than real data count\r\n\r\n\t for (var key in this.data.pull) {\r\n\t //eslint-disable-line\r\n\t heightsArr[j] = 0;\r\n\t j++;\r\n\t }\r\n\r\n\t var _loop = function _loop(i) {\r\n\t //adjust size for single columns\r\n\t _this.adjustRowHeight(cols[i].id, true); //for each row, set height as maximum between all columns\r\n\r\n\r\n\t var j = 0;\r\n\r\n\t _this.data.each(function (obj) {\r\n\t //index is not reliable for tree-components, using a custom counter\r\n\t if (obj.$height > heightsArr[j]) {\r\n\t heightsArr[j] = obj.$height;\r\n\t }\r\n\r\n\t obj.$height = heightsArr[j];\r\n\t j++;\r\n\t });\r\n\t };\r\n\r\n\t for (var i = 0; i < cols.length; i++) {\r\n\t _loop(i);\r\n\t }\r\n\t }\r\n\r\n\t if (!silent) this.refresh();\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$7 = {\r\n\t math_setter: function math_setter(value) {\r\n\t if (value) this._math_init();\r\n\t return value;\r\n\t },\r\n\t _math_pref: \"$\",\r\n\t _math_init: function _math_init() {\r\n\t if (env.strict) return;\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(this._parse_row_math, this));\r\n\t this.data.attachEvent(\"onStoreLoad\", bind(this._parse_math, this));\r\n\t this.attachEvent(\"onStructureLoad\", this._parse_math);\r\n\t },\r\n\t _parse_row_math: function _parse_row_math(id, obj, action) {\r\n\t if (!id || action == \"delete\" || action == \"paint\") return;\r\n\t if (action == \"add\") this._exprs_by_columns(obj);\r\n\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t this._parse_cell_math(id, this._columns[i].id, action !== \"add\");\r\n\t }\r\n\r\n\t this._math_recalc = {};\r\n\t },\r\n\t _parse_cell_math: function _parse_cell_math(row, col, _inner_call) {\r\n\t var item = this.getItem(row);\r\n\t var value; // if it's outer call we should use inputted value otherwise to take formula, not calculated value\r\n\r\n\t if (_inner_call === true) value = item[this._math_pref + col] || item[col];else {\r\n\t value = item[col];\r\n\t this._math_recalc = {};\r\n\t }\r\n\t if (typeof value === \"undefined\" || value === null) return;\r\n\r\n\t if (value.length > 0 && value.substr(0, 1) === \"=\") {\r\n\t // calculate math value\r\n\t if (!item[this._math_pref + col] || _inner_call !== true) item[this._math_pref + col] = item[col];\r\n\t item[col] = this._calculate(value, row, col); //this.updateItem(item);\r\n\t } else {\r\n\t // just a string\r\n\t if (typeof item[this._math_pref + col] !== \"undefined\") delete item[this._math_pref + col]; // remove triggers if they were setted earlier\r\n\r\n\t this._remove_old_triggers(item, col);\r\n\t } // recalculate depending cells\r\n\r\n\r\n\t if (typeof item.depends !== \"undefined\" && typeof item.depends[col] !== \"undefined\") {\r\n\t for (var i in item.depends[col]) {\r\n\t var name = item.depends[col][i][0] + \"__\" + item.depends[col][i][1];\r\n\r\n\t if (typeof this._math_recalc[name] === \"undefined\") {\r\n\t this._math_recalc[name] = true;\r\n\r\n\t this._parse_cell_math(item.depends[col][i][0], item.depends[col][i][1], true);\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _set_original_value: function _set_original_value(row, col) {\r\n\t var item = this.getItem(row);\r\n\t if (typeof item[this._math_pref + col] !== \"undefined\") item[col] = item[this._math_pref + col];\r\n\t },\r\n\t _parse_math: function _parse_math() {\r\n\t if (!this._columns || !this.count()) return;\r\n\r\n\t this._exprs_by_columns();\r\n\r\n\t for (var j = 0; j < this._columns.length; j++) {\r\n\t var col = this.columnId(j);\r\n\t this.data.each(function (obj) {\r\n\t this._parse_cell_math(obj.id, col);\r\n\t }, this);\r\n\t }\r\n\r\n\t this._math_recalc = {};\r\n\t },\r\n\t _exprs_by_columns: function _exprs_by_columns(row) {\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t if (this._columns[i].math) {\r\n\t var col = this.columnId(i);\r\n\t var math = \"=\" + this._columns[i].math;\r\n\t math = math.replace(/\\$c/g, \"#$c#\");\r\n\r\n\t if (row) {\r\n\t row[col] = this._parse_relative_expr(math, row.id, col);\r\n\t delete row[this._math_pref + col];\r\n\r\n\t this._remove_old_triggers(row, col);\r\n\t } else this.data.each(function (obj) {\r\n\t obj[col] = this._parse_relative_expr(math, obj.id, col);\r\n\t delete obj[this._math_pref + col];\r\n\r\n\t this._remove_old_triggers(obj, col);\r\n\t }, this);\r\n\t }\r\n\t }\r\n\t },\r\n\t _parse_relative_expr: function _parse_relative_expr(expr, row, col) {\r\n\t return template(expr)({\r\n\t \"$r\": row,\r\n\t \"$c\": col\r\n\t });\r\n\t },\r\n\t _get_calc_value: function _get_calc_value(row, col) {\r\n\t var item;\r\n\t if (this.exists(row)) item = this.getItem(row);else return \"#out_of_range\";\r\n\t var value = item[this._math_pref + col] || item[col] || 0;\r\n\t value = value.toString();\r\n\t if (value.substring(0, 1) !== \"=\") // it's a string\r\n\t return value;else {\r\n\t // TODO: check if value shouldn't be recalculated\r\n\t // and return value calculated earlier\r\n\t // calculate math expr value right now\r\n\t if (typeof item[this._math_pref + col] === \"undefined\") item[this._math_pref + col] = item[col];\r\n\t item[col] = this._calculate(value, row, col, true);\r\n\t return item[col];\r\n\t }\r\n\t },\r\n\t _calculate: function _calculate(value, row, col, _inner_call) {\r\n\t // add coord in math trace to detect self-references\r\n\t if (_inner_call === true) {\r\n\t if (this._in_math_trace(row, col)) return \"#selfreference\";\r\n\t } else this._start_math_trace();\r\n\r\n\t this._to_math_trace(row, col);\r\n\r\n\t var item = this.getItem(row);\r\n\t value = value.substring(1); // get operations list\r\n\r\n\t var operations = this._get_operations(value);\r\n\r\n\t var triggers = this._get_refs(value, row);\r\n\r\n\t if (operations) {\r\n\t value = this._replace_refs(value, triggers);\r\n\t value = this._parse_args(value, operations);\r\n\t } else {\r\n\t value = this._replace_refs(value, triggers, true);\r\n\t }\r\n\r\n\t var exc = this._math_exception(value);\r\n\r\n\t if (exc !== false) return exc; // remove from coord from trace when calculations were finished - it's important!\r\n\r\n\t this._from_math_trace(row, col); // process triggers to know which cells should be recalculated when one was changed\r\n\r\n\r\n\t this._remove_old_triggers(item, col);\r\n\r\n\t for (var i = 0; i < triggers.length; i++) {\r\n\t this._add_trigger([row, col], triggers[i]);\r\n\t }\r\n\r\n\t exc = this._math_exception(value);\r\n\t if (exc !== false) return exc; // there aren't any operations here. returns number or value of another cell\r\n\r\n\t if (!value) return value; // process mathematical expression and getting final result\r\n\r\n\t value = this._compute(value.replace(/\\$r/g, item.id));\r\n\t exc = this._math_exception(value);\r\n\t if (exc !== false) return exc;\r\n\t return value;\r\n\t },\r\n\t _get_operations: function _get_operations(value) {\r\n\t // gettings operations list (+-*/)\r\n\t var splitter = /(\\+|-|\\*|\\/)/g;\r\n\t var operations = value.replace(/\\[[^)]*?\\]/g, \"\").match(splitter);\r\n\t return operations;\r\n\t },\r\n\r\n\t /*! gets list of referencies in formula\r\n\t **/\r\n\t _get_refs: function _get_refs(value, id) {\r\n\t var reg = /\\[([^\\]]+),([^\\]]+)\\]/g;\r\n\t var cells = value.match(reg);\r\n\t if (cells === null) cells = [];\r\n\r\n\t for (var i = 0; i < cells.length; i++) {\r\n\t var cell = cells[i];\r\n\t var tmp = cell;\r\n\t cell = cell.substr(1, cell.length - 2);\r\n\t cell = cell.split(\",\");\r\n\t cell[0] = this._trim(cell[0]);\r\n\t cell[1] = this._trim(cell[1]);\r\n\t if (cell[0].substr(0, 1) === \":\") cell[0] = this.getIdByIndex(cell[0].substr(1));\r\n\t if (cell[0] === \"$r\") cell[0] = id;\r\n\t if (cell[1].substr(0, 1) === \":\") cell[1] = this.columnId(cell[1].substr(1));\r\n\t cell[2] = tmp;\r\n\t cells[i] = cell;\r\n\t }\r\n\r\n\t return cells;\r\n\t },\r\n\t // replace given list of references by their values\r\n\t _replace_refs: function _replace_refs(value, cells, clean) {\r\n\t var dell = \"(\",\r\n\t delr = \")\";\r\n\t if (clean) dell = delr = \"\";\r\n\r\n\t for (var i = 0; i < cells.length; i++) {\r\n\t var cell = cells[i];\r\n\r\n\t var cell_value = this._get_calc_value(cell[0], cell[1]);\r\n\r\n\t if (isNaN(cell_value)) cell_value = \"\\\"\" + cell_value + \"\\\"\";\r\n\t value = value.replace(cell[2], dell + cell_value + delr);\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t _parse_args: function _parse_args(value, operations) {\r\n\t var args = [];\r\n\r\n\t for (var i = 0; i < operations.length; i++) {\r\n\t var op = operations[i];\r\n\r\n\t var temp = this._split_by(value, op);\r\n\r\n\t args.push(temp[0]);\r\n\t value = temp[1];\r\n\t }\r\n\r\n\t args.push(value); //var reg = /^(-?\\d|\\.|\\(|\\))+$/;\r\n\r\n\t for (var _i = 0; _i < args.length; _i++) {\r\n\t var arg = this._trim(args[_i]); //\tif (reg.test(arg) === false)\r\n\t //\t\treturn ''; //error\r\n\r\n\r\n\t args[_i] = arg;\r\n\t }\r\n\r\n\t var expr = \"\";\r\n\r\n\t for (var _i2 = 0; _i2 < args.length - 1; _i2++) {\r\n\t expr += args[_i2] + operations[_i2];\r\n\t }\r\n\r\n\t expr += args[args.length - 1];\r\n\t return expr;\r\n\t },\r\n\t _compute: function _compute(expr) {\r\n\t var result;\r\n\r\n\t try {\r\n\t result = window.eval(expr);\r\n\t } catch (ex) {\r\n\t assert(false, \"Math error in datatable
    \" + expr);\r\n\t result = \"\";\r\n\t }\r\n\r\n\t return result.toString();\r\n\t },\r\n\t _split_by: function _split_by(value, splitter) {\r\n\t var pos = value.indexOf(splitter);\r\n\t var before = value.substr(0, pos);\r\n\t var after = value.substr(pos + 1);\r\n\t return [before, after];\r\n\t },\r\n\t _trim: function _trim(value) {\r\n\t value = value.replace(/^ */g, \"\");\r\n\t value = value.replace(/ *$/g, \"\");\r\n\t return value;\r\n\t },\r\n\t _start_math_trace: function _start_math_trace() {\r\n\t this._math_trace = [];\r\n\t },\r\n\t _to_math_trace: function _to_math_trace(row, col) {\r\n\t this._math_trace[row + \"__\" + col] = true;\r\n\t },\r\n\t _from_math_trace: function _from_math_trace(row, col) {\r\n\t if (typeof this._math_trace[row + \"__\" + col] !== \"undefined\") delete this._math_trace[row + \"__\" + col];\r\n\t },\r\n\t _in_math_trace: function _in_math_trace(row, col) {\r\n\t if (typeof this._math_trace[row + \"__\" + col] !== \"undefined\") return true;else return false;\r\n\t },\r\n\t _add_trigger: function _add_trigger(depends, from) {\r\n\t var item = this.getItem(from[0]);\r\n\t if (typeof item.depends === \"undefined\") item.depends = {};\r\n\t if (typeof item.depends[from[1]] === \"undefined\") item.depends[from[1]] = {};\r\n\t item.depends[from[1]][depends[0] + \"__\" + depends[1]] = depends;\r\n\t item = this.getItem(depends[0]);\r\n\t if (typeof item.triggers === \"undefined\") item.triggers = {};\r\n\t if (typeof item.triggers[depends[1]] === \"undefined\") item.triggers[depends[1]] = {};\r\n\t item.triggers[depends[1]][from[0] + \"__\" + from[1]] = from;\r\n\t },\r\n\t _remove_old_triggers: function _remove_old_triggers(item, col) {\r\n\t if (!item) return;\r\n\t if (typeof item.triggers === \"undefined\") return;\r\n\r\n\t for (var i in item.triggers[col]) {\r\n\t var depend = item.triggers[col][i];\r\n\t var row = this.getItem(depend[0]);\r\n\t if (row) delete row.depends[depend[1]][item.id + \"__\" + col];\r\n\t }\r\n\t },\r\n\t // check if exception syntax exists and returns exception text or false\r\n\t _math_exception: function _math_exception(value) {\r\n\t var reg = /#\\w+/;\r\n\t var match = value.match(reg);\r\n\t if (match !== null && match.length > 0) return match[0];\r\n\t return false;\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$8 = {\r\n\t headermenu_setter: function headermenu_setter(value) {\r\n\t if (value) {\r\n\t if (value.data) this._preconfigured_hmenu = true;\r\n\t value = this._init_hmenu_once(value);\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t _init_hmenu_once: function _init_hmenu_once(value) {\r\n\t var menuobj = {\r\n\t view: \"contextmenu\",\r\n\t template: \"   #value#\",\r\n\t type: {\r\n\t hidden: function hidden(obj) {\r\n\t if (obj.hidden) return \"wxi-eye-slash\";else return \"wxi-eye\";\r\n\t }\r\n\t },\r\n\t on: {\r\n\t onMenuItemClick: bind(function (id) {\r\n\t var menu = $$(this._settings.headermenu);\r\n\t var state = menu.getItem(id).hidden;\r\n\t menu.getItem(id).hidden = !state;\r\n\t menu.refresh(id);\r\n\t menu.$blockRender = true;\r\n\t var opts = {\r\n\t spans: _typeof(value) == \"object\" && value.spans\r\n\t };\r\n\t if (state) this.showColumn(id, opts);else this.hideColumn(id, opts);\r\n\t menu.$blockRender = false;\r\n\t return false;\r\n\t }, this)\r\n\t },\r\n\t data: []\r\n\t };\r\n\t if (_typeof(value) == \"object\") exports.extend(menuobj, value, true);\r\n\t var menu = ui(menuobj);\r\n\t menu.attachTo(this._header);\r\n\r\n\t this._destroy_with_me.push(menu);\r\n\r\n\t this.attachEvent(\"onStructureLoad\", this._generate_menu_columns);\r\n\t this.attachEvent(\"onStructureUpdate\", this._generate_menu_columns);\r\n\r\n\t this._init_hmenu_once = function (v) {\r\n\t return v;\r\n\t };\r\n\r\n\t return menu._settings.id;\r\n\t },\r\n\t _generate_menu_columns: function _generate_menu_columns() {\r\n\t var menu = $$(this._settings.headermenu);\r\n\t var hhash = this._hidden_column_hash;\r\n\t if (menu.$blockRender) return;\r\n\r\n\t if (this._preconfigured_hmenu) {\r\n\t menu.data.each(function (obj) {\r\n\t obj.hidden = !!hhash[obj.id];\r\n\t });\r\n\t menu.refresh();\r\n\t return;\r\n\t }\r\n\r\n\t var data = [];\r\n\t var order = this._hidden_column_order; //if we have not hidden columns, hidden order is empty\r\n\t //fallback to the default column order\r\n\r\n\t if (!order.length) order = this._columns;\r\n\r\n\t for (var i = 0; i < order.length; i++) {\r\n\t var column = this.getColumnConfig(order[i].id || order[i]);\r\n\t var content = column.header[0];\r\n\t var hidden = !!hhash[column.id];\r\n\t if (column.headermenu !== false && content) data.push({\r\n\t id: column.id,\r\n\t value: hidden ? content.text : content.groupText || content.text,\r\n\t hidden: hidden\r\n\t });\r\n\t }\r\n\r\n\t if (data.length) menu.data.importData(data);\r\n\t }\r\n\t};\r\n\tdatafilter.headerMenu = {\r\n\t getValue: function getValue() {},\r\n\t setValue: function setValue() {},\r\n\t refresh: function refresh(master, node) {\r\n\t if (!master._settings.headermenu) {\r\n\t master.define(\"headermenu\", true);\r\n\r\n\t master._generate_menu_columns();\r\n\t }\r\n\r\n\t node.onclick = function () {\r\n\t $$(master.config.headermenu).show(node);\r\n\t };\r\n\t },\r\n\t render: function render() {\r\n\t return \"\";\r\n\t }\r\n\t};\r\n\r\n\t// #include core/edit.js\r\n\t// #include ui/inputs.js\r\n\r\n\tvar Mixin$9 = {\r\n\t /////////////////////////\r\n\t // edit start //\r\n\t /////////////////////////\r\n\t _get_editor_type: function _get_editor_type(id) {\r\n\t return this.getColumnConfig(id.column).editor;\r\n\t },\r\n\t getEditor: function getEditor(row, column) {\r\n\t if (!row) return this._last_editor;\r\n\r\n\t if (arguments.length == 1) {\r\n\t column = row.column;\r\n\t row = row.row;\r\n\t }\r\n\r\n\t return (this._editors[row] || {})[column];\r\n\t },\r\n\t _for_each_editor: function _for_each_editor(handler) {\r\n\t for (var row in this._editors) {\r\n\t var row_editors = this._editors[row];\r\n\r\n\t for (var column in row_editors) {\r\n\t if (column != \"$count\") handler.call(this, row_editors[column]);\r\n\t }\r\n\t }\r\n\t },\r\n\t _init_editor: function _init_editor(id, type, show) {\r\n\t var row = id.row;\r\n\t var column = id.column;\r\n\t var col_settings = type.config = this.getColumnConfig(column); //show it over cell\r\n\r\n\t if (show !== false) this.showCell(row, column);\r\n\t var node = type.render();\r\n\t if (type.$inline) node = this._locateInput(id);\r\n\t type.node = node;\r\n\t var item = this.getItem(row);\r\n\t var format = col_settings.editFormat;\r\n\t var value;\r\n\t if (this._settings.editMath) value = item[\"$\" + column];\r\n\t value = value || item[column];\r\n\t if (isUndefined(value)) value = \"\";\r\n\t type.setValue(format ? format(value) : value, item);\r\n\t type.value = item[column];\r\n\r\n\t this._addEditor(id, type);\r\n\r\n\t if (!type.$inline) this._sizeToCell(id, node, true);\r\n\t if (type.afterRender) type.afterRender();\r\n\r\n\t if (this._settings.liveValidation) {\r\n\t _event(type.node, \"keyup\", this._bind_live_validation(id, this));\r\n\r\n\t this.validateEditor(id);\r\n\t }\r\n\r\n\t return node;\r\n\t },\r\n\t _bind_live_validation: function _bind_live_validation(id, that) {\r\n\t return function () {\r\n\t that.validateEditor(id);\r\n\t };\r\n\t },\r\n\t _set_new_value: function _set_new_value(editor, new_value, copy$$1) {\r\n\t var parser = this.getColumnConfig(editor.column).editParse;\r\n\t var item = copy$$1 ? {} : this.getItem(editor.row);\r\n\t item[editor.column] = parser ? parser(new_value) : new_value;\r\n\t if (this._settings.editMath) item[\"$\" + editor.column] = null;\r\n\t return item;\r\n\t },\r\n\t //register editor in collection\r\n\t _addEditor: function _addEditor(id, type) {\r\n\t var row_editors = this._editors[id.row] = this._editors[id.row] || {};\r\n\t row_editors.$count = (row_editors.$count || 0) + 1;\r\n\t type.row = id.row;\r\n\t type.column = id.column;\r\n\t this._last_editor = row_editors[id.column] = type;\r\n\t this._in_edit_mode++;\r\n\t this._last_editor_scroll = this.getScrollState();\r\n\t },\r\n\t _removeEditor: function _removeEditor(editor) {\r\n\t if (this._last_editor == editor) this._last_editor = 0;\r\n\t if (editor.destroy) editor.destroy();\r\n\t var row = this._editors[editor.row];\r\n\t delete row[editor.column];\r\n\t row.$count--;\r\n\t if (!row.$count) delete this._editors[editor.row];\r\n\t this._in_edit_mode--;\r\n\t },\r\n\t _changeEditorId: function _changeEditorId(oldid, newid) {\r\n\t var editor = this._editors[oldid];\r\n\r\n\t if (editor) {\r\n\t this._editors[newid] = editor;\r\n\t delete this._editors[oldid];\r\n\r\n\t for (var key in editor) {\r\n\t editor[key].row = newid;\r\n\t }\r\n\t }\r\n\t },\r\n\t //get html cell by combined id\r\n\t _locate_cell: function _locate_cell(id) {\r\n\t var area,\r\n\t i,\r\n\t index,\r\n\t j,\r\n\t node,\r\n\t span,\r\n\t config = this.getColumnConfig(id.column),\r\n\t cell = 0;\r\n\r\n\t if (config && config.node && config.attached) {\r\n\t index = this.getIndexById(id.row);\r\n\r\n\t if (this._spans_pull) {\r\n\t span = this.getSpan(id.row, id.column);\r\n\r\n\t if (span) {\r\n\t for (i = 0; i < 3; i++) {\r\n\t area = this._spans_areas[i];\r\n\r\n\t for (j = 0; !cell && j < area.childNodes.length; j++) {\r\n\t node = area.childNodes[j];\r\n\t if (node.getAttribute(\"row\") == index && node.getAttribute(\"column\") == this.getColumnIndex(id.column)) cell = node;\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (!cell && index >= config._yr0 - this._settings.topSplit && index < config._yr1) cell = config.node.childNodes[index - config._yr0 + this._settings.topSplit];\r\n\t }\r\n\r\n\t return cell;\r\n\t },\r\n\t /////////////////////////\r\n\t // public methods //\r\n\t /////////////////////////\r\n\t editCell: function editCell(row, column, preserve, show) {\r\n\t column = column || this._settings.columns[0].id;\r\n\t return EditAbility.edit.call(this, {\r\n\t row: row,\r\n\t column: column\r\n\t }, preserve, show);\r\n\t },\r\n\t editRow: function editRow(id) {\r\n\t if (id && id.row) id = id.row;\r\n\t var next = false;\r\n\t this.eachColumn(function (column) {\r\n\t this.edit({\r\n\t row: id,\r\n\t column: column\r\n\t }, next, !next);\r\n\t next = true;\r\n\t });\r\n\t },\r\n\t editColumn: function editColumn(id) {\r\n\t if (id && id.column) id = id.column;\r\n\t var next = false;\r\n\t this.eachRow(function (row) {\r\n\t this.edit({\r\n\t row: row,\r\n\t column: id\r\n\t }, next, !next);\r\n\t next = true;\r\n\t });\r\n\t },\r\n\t eachRow: function eachRow(handler, all) {\r\n\t var order = this.data.order;\r\n\t if (all) order = this.data._filter_order || order;\r\n\r\n\t for (var i = 0; i < order.length; i++) {\r\n\t handler.call(this, order[i]);\r\n\t }\r\n\t },\r\n\t eachColumn: function eachColumn(handler, all) {\r\n\t for (var i in this._columns_pull) {\r\n\t var column = this._columns_pull[i];\r\n\t handler.call(this, column.id, column);\r\n\t }\r\n\r\n\t if (all) {\r\n\t for (var _i in this._hidden_column_hash) {\r\n\t var _column = this._hidden_column_hash[_i];\r\n\t handler.call(this, _column.id, _column);\r\n\t }\r\n\t }\r\n\t },\r\n\t ////////////////////\r\n\t // edit next //\r\n\t ////////////////////\r\n\t _after_edit_next: function _after_edit_next(editor_next) {\r\n\t if (this.getSelectedId) {\r\n\t //select related cell when possible\r\n\t var sel = this.getSelectedId(true);\r\n\r\n\t if (sel.length == 1) {\r\n\t this._select(editor_next);\r\n\r\n\t return false;\r\n\t }\r\n\t }\r\n\t },\r\n\t _custom_tab_handler: function _custom_tab_handler(tab, e) {\r\n\t if (this._settings.editable && !this._in_edit_mode) {\r\n\t //if we have focus in some custom input inside of datatable\r\n\t if (e.target && e.target.tagName == \"INPUT\") return true; //init editor related to a single selected row/column/cell\r\n\r\n\t var selection = this.getSelectedId(true);\r\n\r\n\t if (selection.length == 1) {\r\n\t var sel = selection[0];\r\n\t if (this._settings.select == \"row\") sel.column = this._settings.columns[e.shiftKey ? 0 : this._settings.columns.length - 1].id;\r\n\t this.editNext(tab, sel);\r\n\t return false;\r\n\t }\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t _find_cell_next: function _find_cell_next(start, check, direction) {\r\n\t var row = this.getIndexById(start.row);\r\n\t var column = this.getColumnIndex(start.column);\r\n\t var order = this.data.order;\r\n\t var cols = this._columns;\r\n\r\n\t if (direction) {\r\n\t for (var i = row; i < order.length; i++) {\r\n\t for (var j = column + 1; j < cols.length; j++) {\r\n\t var id = {\r\n\t row: order[i],\r\n\t column: cols[j].id\r\n\t };\r\n\r\n\t if (check.call(this, id) && (!this._checkCellMerge || !this._checkCellMerge(start, id))) {\r\n\t return id;\r\n\t }\r\n\t }\r\n\r\n\t column = -1;\r\n\t }\r\n\t } else {\r\n\t for (var _i2 = row; _i2 >= 0; _i2--) {\r\n\t for (var _j = column - 1; _j >= 0; _j--) {\r\n\t var _id = {\r\n\t row: order[_i2],\r\n\t column: cols[_j].id\r\n\t };\r\n\t if (check.call(this, _id)) return _id;\r\n\t }\r\n\r\n\t column = cols.length;\r\n\t }\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t /////////////////////////////\r\n\t // scroll correction //\r\n\t /////////////////////////////\r\n\t _correct_after_focus_y: function _correct_after_focus_y() {\r\n\t if (this._in_edit_mode) {\r\n\t if (this._ignore_after_focus_scroll) this._ignore_after_focus_scroll = false;else {\r\n\t this._y_scroll.scrollTo(this.getScrollState().y + this._body.childNodes[1].firstChild.scrollTop);\r\n\r\n\t this._body.childNodes[1].firstChild.scrollTop = 0;\r\n\t this._ignore_after_focus_scroll = true;\r\n\t }\r\n\t }\r\n\t },\r\n\t _correct_after_focus_x: function _correct_after_focus_x() {\r\n\t if (this._in_edit_mode) {\r\n\t this._x_scroll.scrollTo(this._body.childNodes[1].scrollLeft);\r\n\t }\r\n\t },\r\n\t _component_specific_edit_init: function _component_specific_edit_init() {\r\n\t this.attachEvent(\"onScrollY\", this._update_editor_y_pos);\r\n\t this.attachEvent(\"onScrollX\", this._update_editor_y_pos);\r\n\t this.attachEvent(\"onScrollY\", this._refocus_inline_editor);\r\n\t this.attachEvent(\"onColumnResize\", function () {\r\n\t this.editStop();\r\n\t });\r\n\t this.attachEvent(\"onAfterFilter\", function () {\r\n\t this.editStop();\r\n\t });\r\n\t this.attachEvent(\"onRowResize\", function () {\r\n\t this.editStop();\r\n\t });\r\n\t this.attachEvent(\"onAfterScroll\", function () {\r\n\t if (this._settings.topSplit) this.editStop();\r\n\t });\r\n\t this._body.childNodes[1].firstChild.onscroll = bind(this._correct_after_focus_y, this);\r\n\t this._body.childNodes[1].onscroll = bind(this._correct_after_focus_x, this);\r\n\t },\r\n\t _update_editor_y_pos: function _update_editor_y_pos() {\r\n\t if (this._in_edit_mode) {\r\n\t var old = this._last_editor_scroll;\r\n\t this._last_editor_scroll = this.getScrollState();\r\n\t var diff = this._last_editor_scroll.y - old.y;\r\n\r\n\t this._for_each_editor(function (editor) {\r\n\t if (editor.getPopup) {\r\n\t var node = this.getItemNode(editor);\r\n\t if (node) editor.getPopup().show(node);else editor.getPopup().show({\r\n\t x: -10000,\r\n\t y: -10000\r\n\t });\r\n\t } else if (!editor.$inline) {\r\n\t editor.node.top -= diff;\r\n\t editor.node.style.top = editor.node.top + \"px\";\r\n\t }\r\n\t });\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$a = {\r\n\t $init: function $init() {\r\n\t this._clear_hidden_state();\r\n\r\n\t this.attachEvent(\"onStructureLoad\", this._hideInitialColumns);\r\n\t },\r\n\t _clear_hidden_state: function _clear_hidden_state() {\r\n\t this._hidden_column_hash = {};\r\n\t this._hidden_column_order = toArray();\r\n\t this._hidden_split = [0, 0];\r\n\t },\r\n\t _hideInitialColumns: function _hideInitialColumns() {\r\n\t var cols = this._columns;\r\n\r\n\t for (var i = 0; i < cols.length; i++) {\r\n\t if (cols[i].header) this._getInitialSpans(cols, cols[i].header);\r\n\t if (cols[i].footer) this._getInitialSpans(cols, cols[i].footer);\r\n\t }\r\n\r\n\t for (var _i = cols.length - 1; _i >= 0; _i--) {\r\n\t if (cols[_i].hidden) this.hideColumn(cols[_i].id, {}, true, true);else if (cols[_i].batch && this.config.visibleBatch && cols[_i].batch != this.config.visibleBatch) {\r\n\t this.hideColumn(cols[_i].id, {}, true, true);\r\n\t }\r\n\t }\r\n\t },\r\n\t _getInitialSpans: function _getInitialSpans(cols, elements) {\r\n\t for (var h = 0; h < elements.length; h++) {\r\n\t var line = elements[h];\r\n\t if (line && line.colspan && !line.$colspan) line.$colspan = line.colspan;\r\n\t }\r\n\t },\r\n\t moveColumn: function moveColumn(id, index) {\r\n\t var start_index = this.getColumnIndex(id);\r\n\t if (start_index == index) return; //already in place\r\n\r\n\t var columns = this._settings.columns;\r\n\t var start = columns.splice(start_index, 1);\r\n\t var pos = index - (index > start_index ? 1 : 0);\r\n\t PowerArray.insertAt.call(columns, start[0], pos);\r\n\t var order = this._hidden_column_order; // order exists even if columns are not reordered, so checking for length\r\n\r\n\t if (order.length) {\r\n\t order = toArray(order);\r\n\t var hidden_index = order.find(id);\r\n\t order.removeAt(hidden_index);\r\n\t if (pos === 0) order.unshift(id);else {\r\n\t order.insertAt(id, order.find(columns[pos - 1].id) + 1);\r\n\t }\r\n\t } //TODO: split handling\r\n\t //we can move split line when column dropped after it\r\n\r\n\r\n\t this._refresh_columns();\r\n\t },\r\n\t _init_horder: function _init_horder() {\r\n\t var horder = this._hidden_column_order;\r\n\t var cols = this._settings.columns;\r\n\r\n\t if (!horder.length) {\r\n\t for (var i = 0; i < cols.length; i++) {\r\n\t horder[i] = cols[i].id;\r\n\t }\r\n\r\n\t this._hidden_split = [this._settings.leftSplit, this._rightSplit];\r\n\t }\r\n\t },\r\n\t isColumnVisible: function isColumnVisible(id) {\r\n\t return !this._hidden_column_hash[id];\r\n\t },\r\n\t hideColumn: function hideColumn(id, opts, silent, mode) {\r\n\t var cols = this._settings.columns;\r\n\t var horder = this._hidden_column_order;\r\n\t var hhash = this._hidden_column_hash;\r\n\t var column;\r\n\t var span = 1;\r\n\t opts = opts || {};\r\n\r\n\t if (mode !== false) {\r\n\t var index = this.getColumnIndex(id);\r\n\t assert(index != -1, \"hideColumn: invalid ID or already hidden\");\r\n\t if (index === -1 || !this.callEvent(\"onBeforeColumnHide\", [id])) return; //in case of second call to hide the same column, command will be ignored\r\n\r\n\t if (index == -1) return;\r\n\r\n\t this._init_horder();\r\n\r\n\t if (opts.spans) {\r\n\t var header = cols[index].header;\r\n\r\n\t for (var i = 0; i < header.length; i++) {\r\n\t if (header[i]) {\r\n\t header[i].$groupSpan = header[i].colspan || 1;\r\n\t span = Math.max(span, header[i].$groupSpan);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (index < this._settings.leftSplit) this._settings.leftSplit -= span;\r\n\t if (index >= this._rightSplit) this._settings.rightSplit -= span;else this._rightSplit -= span;\r\n\r\n\t for (var _i2 = index + span - 1; _i2 >= index; _i2--) {\r\n\t this._hideColumn(index);\r\n\r\n\t column = cols.splice(index, 1)[0];\r\n\t hhash[column.id] = column;\r\n\t column._yr0 = -1;\r\n\t delete this._columns_pull[column.id];\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterColumnHide\", [id]);\r\n\t } else {\r\n\t column = hhash[id];\r\n\t assert(column, \"showColumn: invalid ID or already visible\"); //in case of second show command for already visible column - ignoring\r\n\r\n\t if (!column || !this.callEvent(\"onBeforeColumnShow\", [id])) return;\r\n\t var prev = null;\r\n\t var _i3 = 0;\r\n\t var hindex = 0;\r\n\r\n\t for (; _i3 < horder.length; _i3++) {\r\n\t if (horder[_i3] == id) {\r\n\t hindex = _i3;\r\n\t break;\r\n\t }\r\n\r\n\t if (!hhash[horder[_i3]]) prev = horder[_i3];\r\n\t }\r\n\r\n\t var _index = prev ? this.getColumnIndex(prev) + 1 : 0;\r\n\r\n\t if (opts.spans) {\r\n\t var _header = column.header;\r\n\r\n\t for (var _i4 = 0; _i4 < _header.length; _i4++) {\r\n\t if (_header[_i4]) {\r\n\t _header[_i4].colspan = _header[_i4].$groupSpan || _header[_i4].colspan;\r\n\t delete _header[_i4].$groupSpan;\r\n\t span = Math.max(span, _header[_i4].colspan || 1);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t for (var _i5 = hindex + span - 1; _i5 >= hindex; _i5--) {\r\n\t var _column = hhash[horder[_i5]];\r\n\r\n\t if (_column) {\r\n\t //can be already shown by another action\r\n\t PowerArray.insertAt.call(cols, _column, _index);\r\n\t delete _column.hidden;\r\n\t delete hhash[_column.id];\r\n\t this._columns_pull[_column.id] = _column;\r\n\t } else span--;\r\n\t }\r\n\r\n\t if (hindex < this._hidden_split[0]) this._settings.leftSplit += span;\r\n\t if (hindex >= this._hidden_split[1]) this._settings.rightSplit += span;else this._rightSplit += span;\r\n\t this.callEvent(\"onAfterColumnShow\", [id]);\r\n\t }\r\n\r\n\t if (column.header) this._fixColspansHidden(column, mode !== false ? 0 : 1, \"header\");\r\n\t if (column.footer) this._fixColspansHidden(column, mode !== false ? 0 : 1, \"footer\");\r\n\t if (!silent) this._refresh_columns();\r\n\t },\r\n\t _fixColspansHidden: function _fixColspansHidden(config, mod, elName) {\r\n\t for (var i = config[elName].length - 1; i >= 0; i--) {\r\n\t var ind = this._hidden_column_order;\r\n\t var spanSource,\r\n\t isHidden = false,\r\n\t spanSize = 0;\r\n\r\n\t for (var j = 0; j < ind.length; j++) {\r\n\t var colConfig = this.getColumnConfig(ind[j]);\r\n\t var el = colConfig[elName][i];\r\n\r\n\t if (!this.isColumnVisible(ind[j])) {\r\n\t //hidden column\r\n\t if (el && el.$colspan && spanSize <= 0) {\r\n\t //start of colspan in hidden\r\n\t spanSize = el.colspan = el.$colspan;\r\n\t isHidden = spanSource = el;\r\n\t }\r\n\r\n\t if (spanSource && spanSize > 0) {\r\n\t //hidden column in colspan, decrease colspan size\r\n\t spanSource.colspan--;\r\n\t }\r\n\t } else {\r\n\t //visible column\r\n\t if (isHidden && spanSize > 0 && spanSource && spanSource.colspan > 0) {\r\n\t //bit start of colspan is hidden\r\n\t el = colConfig[elName][i] = spanSource;\r\n\t spanSource = el;\r\n\t } else if (el && el.$colspan && spanSize <= 0) {\r\n\t //visible start of colspan\r\n\t spanSize = el.colspan = el.$colspan;\r\n\t spanSource = el;\r\n\t }\r\n\r\n\t isHidden = null;\r\n\t }\r\n\r\n\t spanSize--;\r\n\t }\r\n\t }\r\n\t },\r\n\t refreshColumns: function refreshColumns(columns, reset) {\r\n\t if (columns && columns != this.config.columns || reset) {\r\n\t this._clear_hidden_state();\r\n\r\n\t this._filter_elements = {};\r\n\t if (columns) this._rightSplit = columns.length - (this.config.rightSplit || 0);\r\n\t }\r\n\r\n\t this._columns_pull = {}; //clear rendered data\r\n\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t var col = this._columns[i];\r\n\t this._columns_pull[col.id] = col;\r\n\t col.attached = col.node = null;\r\n\t }\r\n\r\n\t for (var _i6 = 0; _i6 < 3; _i6++) {\r\n\t this._header.childNodes[_i6].innerHTML = \"\";\r\n\t this._body.childNodes[_i6].firstChild.innerHTML = \"\";\r\n\t } //render new structure\r\n\r\n\r\n\t this._columns = this.config.columns = columns || this.config.columns;\r\n\t this._rightSplit = this._columns.length - this._settings.rightSplit;\r\n\t this._dtable_fully_ready = 0;\r\n\r\n\t this._define_structure();\r\n\r\n\t this.callEvent(\"onStructureUpdate\");\r\n\r\n\t this._update_scroll();\r\n\r\n\t this.render();\r\n\t },\r\n\t _refresh_columns: function _refresh_columns() {\r\n\t this._dtable_fully_ready = 0;\r\n\t this.callEvent(\"onStructureUpdate\");\r\n\r\n\t this._apply_headers();\r\n\r\n\t this.render();\r\n\t },\r\n\t showColumn: function showColumn(id, opts, silent) {\r\n\t return this.hideColumn(id, opts, silent, false);\r\n\t },\r\n\t showColumnBatch: function showColumnBatch(batch, mode) {\r\n\t var preserve = typeof mode != \"undefined\";\r\n\t mode = mode !== false;\r\n\t this.eachColumn(function (id, col) {\r\n\t if (col.batch) {\r\n\t var hidden = this._hidden_column_hash[col.id];\r\n\t if (!mode) hidden = !hidden;\r\n\t if (col.batch == batch && hidden) this.hideColumn(col.id, {\r\n\t spans: true\r\n\t }, true, !mode);else if (!preserve && col.batch != batch && !hidden) this.hideColumn(col.id, {\r\n\t spans: true\r\n\t }, true, mode);\r\n\t }\r\n\t }, true);\r\n\r\n\t this._refresh_columns();\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$b = {\r\n\t $init: function $init() {\r\n\t this.attachEvent(\"onAfterScroll\", this._set_focusable_item);\r\n\t },\r\n\t _set_focusable_item: function _set_focusable_item() {\r\n\t var sel = this._getVisibleSelection();\r\n\r\n\t if (!sel) {\r\n\t var node = this._dataobj.querySelector(\".webix_cell\");\r\n\r\n\t if (node) {\r\n\t node.setAttribute(\"tabindex\", \"0\");\r\n\t addCss(node, \"webix_focused\");\r\n\t }\r\n\t }\r\n\t },\r\n\t _getVisibleSelection: function _getVisibleSelection() {\r\n\t var sel = this.getSelectedId(true);\r\n\r\n\t for (var i = 0; i < sel.length; i++) {\r\n\t if (this.isColumnVisible(sel[i].column)) return this.getItemNode(sel[i]);\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t moveSelection: function moveSelection(mode, details, focus) {\r\n\t if (this._settings.disabled) return;\r\n\t details = details || {}; //get existing selection as array\r\n\r\n\t var t = this.getSelectedId(true);\r\n\t var index$$1 = t.length - 1;\r\n\t var preserve = this._settings.multiselect || this._settings.areaselect ? details.shift : false; //change defaults in case of multiselection\r\n\r\n\t if (t.length > 1 && this._settings.select !== \"cell\") {\r\n\t t = t.sort(bind(function (a, b) {\r\n\t if (this.getIndexById(a.row) > this.getIndexById(b.row) || this.getColumnIndex(a.column) > this.getColumnIndex(b.column)) return 1;else return -1;\r\n\t }, this));\r\n\t if (mode == \"up\" || mode == \"left\" || mode == \"top\" || mode == \"pgup\") index$$1 = 0;\r\n\t }\r\n\r\n\t if (index$$1 < 0 && this.count()) {\r\n\t //no selection\r\n\t if (mode == \"down\" || mode == \"right\") mode = \"top\";else if (mode == \"up\" || mode == \"left\") mode = \"bottom\";else return;\r\n\t index$$1 = 0;\r\n\t t = [{\r\n\t row: 1,\r\n\t column: 1\r\n\t }];\r\n\t }\r\n\r\n\t if (index$$1 >= 0) {\r\n\t var row = t[index$$1].row;\r\n\t var column = t[index$$1].column;\r\n\r\n\t if (mode == \"top\" || mode == \"bottom\") {\r\n\t if (row) {\r\n\t // first/last row setting\r\n\t if (mode == \"top\") row = this.data.getFirstId();else if (mode == \"bottom\") row = this.data.getLastId();\r\n\t }\r\n\r\n\t if (column) {\r\n\t // first/last column setting\r\n\t index$$1 = 0;\r\n\t if (mode == \"bottom\") index$$1 = this.config.columns.length - 1;\r\n\t column = this.columnId(index$$1);\r\n\t }\r\n\t } else if (mode == \"up\" || mode == \"down\" || mode == \"pgup\" || mode == \"pgdown\") {\r\n\t if (row) {\r\n\t //it seems row's can be seleted\r\n\t var _index = this.getIndexById(row);\r\n\r\n\t var step = 1;\r\n\t if (mode == \"pgup\" || mode == \"pgdown\") step = this._pager ? this._pager.config.size : Math.round(this._dtable_offset_height / this._settings.rowHeight); //get new selection row\r\n\r\n\t if (mode == \"up\" || mode == \"pgup\") _index -= step;else if (mode == \"down\" || mode == \"pgdown\") _index += step; //check that we in valid row range\r\n\r\n\t if (_index < 0) _index = 0;\r\n\t if (_index >= this.data.order.length) _index = this.data.order.length - 1;\r\n\t row = this.getIdByIndex(_index);\r\n\t if (!row && this._settings.pager) this.showItemByIndex(_index);\r\n\t }\r\n\t } else if (mode == \"right\" || mode == \"left\") {\r\n\t if (column && this.config.select != \"row\") {\r\n\t //it seems column's can be selected\r\n\t var _index2 = this.getColumnIndex(column); //get new selected column\r\n\r\n\r\n\t if (mode == \"right\") _index2++;else if (mode == \"left\") _index2--; //check that result column index is in valid range\r\n\r\n\t if (_index2 < 0) _index2 = 0;\r\n\t if (_index2 >= this.config.columns.length) _index2 = this.config.columns.length - 1;\r\n\t column = this.columnId(_index2);\r\n\t } else if ((this.open || this._subViewStorage) && mode == \"right\") {\r\n\t return this.open ? this.open(row) : this.openSub(row);\r\n\t } else if ((this.close || this._subViewStorage) && mode == \"left\") {\r\n\t return this.close ? this.close(row) : this.closeSub(row);\r\n\t }\r\n\t } else {\r\n\t assert(false, \"Not supported selection moving mode\");\r\n\t return;\r\n\t }\r\n\r\n\t if (row) {\r\n\t this.showCell(row, column);\r\n\r\n\t if (!this.select) {\r\n\t //switch on cell or row selection by default\r\n\t exports.extend(this, this._selections._commonselect, true);\r\n\t this._settings.select = this.open || this._subViewStorage ? \"row\" : \"cell\";\r\n\t exports.extend(this, this._selections[this._settings.select], true);\r\n\t }\r\n\r\n\t var cell = {\r\n\t row: row,\r\n\t column: column\r\n\t };\r\n\r\n\t if (preserve && this._settings.select == \"area\") {\r\n\t var last = this._selected_areas[this._selected_areas.length - 1];\r\n\r\n\t this._extendAreaRange(cell, last, mode, details);\r\n\t } else this._select(cell, preserve);\r\n\r\n\t if (!this._settings.clipboard && focus !== false) {\r\n\t var node = this.getItemNode(cell);\r\n\t if (node) node.focus();\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$c = {\r\n\t drag_setter: function drag_setter(value) {\r\n\t // disable drag-n-drop for frozen rows\r\n\t this.attachEvent(\"onBeforeDrag\", function (context) {\r\n\t return this._checkDragTopSplit(context.source);\r\n\t });\r\n\t this.attachEvent(\"onBeforeDragIn\", function (context) {\r\n\t return this._checkDragTopSplit(context.target);\r\n\t });\r\n\t this.attachEvent(\"onBeforeDropOrder\", function (startId, index$$1) {\r\n\t return index$$1 < 0 || index$$1 >= this._settings.topSplit;\r\n\t });\r\n\t return DragItem.drag_setter.call(this, value);\r\n\t },\r\n\t _checkDragTopSplit: function _checkDragTopSplit(ids) {\r\n\t var i,\r\n\t index$$1,\r\n\t frozen = false;\r\n\r\n\t if (this._settings.topSplit && ids) {\r\n\t if (!isArray(ids)) ids = [ids];\r\n\r\n\t for (i = 0; !frozen && i < ids.length; i++) {\r\n\t index$$1 = this.getIndexById(ids[i]);\r\n\t frozen = index$$1 < this._settings.topSplit;\r\n\t }\r\n\t }\r\n\r\n\t return !frozen;\r\n\t },\r\n\t $dragHTML: function $dragHTML(item) {\r\n\t var width = this._content_width - this._scrollSizeY;\r\n\t var html = \"
    \";\r\n\t var cols = this._settings.columns;\r\n\r\n\t for (var i = 0; i < cols.length; i++) {\r\n\t var value = this._getValue(item, cols[i]);\r\n\r\n\t html += \"
    \" + value + \"
    \";\r\n\t }\r\n\r\n\t return html + \"
    \";\r\n\t },\r\n\t getHeaderNode: function getHeaderNode(column_id, row_index) {\r\n\t return this._getHeaderNode(column_id, row_index, this._header);\r\n\t },\r\n\t getFooterNode: function getFooterNode(column_id, row_index) {\r\n\t return this._getHeaderNode(column_id, row_index, this._footer);\r\n\t },\r\n\t _getHeaderNode: function _getHeaderNode(column_id, row_index, group) {\r\n\t if (this.isColumnVisible(column_id)) {\r\n\t var ind = this.getColumnIndex(column_id);\r\n\t var hind = this._settings.leftSplit > ind ? 0 : this._rightSplit <= ind ? 2 : 1;\r\n\t row_index = row_index || 0;\r\n\t var rows = group.childNodes[hind].getElementsByTagName(\"TR\");\r\n\r\n\t if (rows.length) {\r\n\t var nodes = rows[row_index + 1].childNodes;\r\n\r\n\t for (var i = 0; i < nodes.length; i++) {\r\n\t if (nodes[i].getAttribute(\"column\") == ind) return nodes[i].firstChild;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t getItemNode: function getItemNode(id) {\r\n\t if (id && !id.header) {\r\n\t var row = id.row || id;\r\n\t var rowindex = this.getIndexById(row);\r\n\r\n\t var state = this._get_y_range();\r\n\r\n\t var minRow = state[0] - this._settings.topSplit; //row not visible\r\n\r\n\t if (rowindex < minRow && rowindex > state[1]) return; //get visible column\r\n\r\n\t var x_range = this._get_x_range();\r\n\r\n\t var colindex = this._settings.leftSplit ? 0 : x_range[0];\r\n\r\n\t if (id.column) {\r\n\t colindex = this.getColumnIndex(id.column); //column not visible\r\n\r\n\t if (colindex < this._rightSplit && colindex >= this._settings.leftSplit && (colindex < x_range[0] || colindex > x_range[1])) return;\r\n\t }\r\n\r\n\t var column = this._settings.columns[colindex];\r\n\r\n\t if (column.attached && column.node) {\r\n\t var nodeIndex = rowindex < this._settings.topSplit ? rowindex : rowindex - minRow;\r\n\t return column.node.childNodes[nodeIndex];\r\n\t }\r\n\t }\r\n\t },\r\n\t dragColumn_setter: function dragColumn_setter(value) {\r\n\t var control; //will be defined below\r\n\r\n\t if (value == \"order\") {\r\n\t control = {\r\n\t $drag: bind(function (s, e) {\r\n\t var id = this.locate(e);\r\n\t if (this._rs_process || !id || !this.callEvent(\"onBeforeColumnDrag\", [id.column, e])) return false;\r\n\t DragControl._drag_context = {\r\n\t from: control,\r\n\t start: id,\r\n\t custom: \"column_dnd\"\r\n\t };\r\n\t var column = this.getColumnConfig(id.column);\r\n\t this._relative_column_drag = posRelative(e);\r\n\t this._limit_column_drag = column.width;\r\n\t return \"
    \" + (column.header[0].text || \" \") + \"
    \";\r\n\t }, this),\r\n\t $dragPos: bind(function (pos$$1, e, node) {\r\n\t var context = DragControl.getContext();\r\n\t var box = offset(this.$view);\r\n\t node.style.display = \"none\";\r\n\t var html = document.elementFromPoint(pos$$1.x, box.y + 1);\r\n\t var id = html ? this.locate(html) : null;\r\n\t var start = DragControl.getContext().start.column;\r\n\r\n\t if (id && id.column != start && (!this._column_dnd_temp_block || id.column != this._last_sort_dnd_node)) {\r\n\t //ignore normal dnd , and dnd from other components\r\n\t if (context.custom == \"column_dnd\" && $$(html) == this) {\r\n\t if (!this.callEvent(\"onBeforeColumnDropOrder\", [start, id.column, e])) return;\r\n\t var start_index = this.getColumnIndex(start);\r\n\t var end_index = this.getColumnIndex(id.column); //on touch devices we need to preserve drag-start element till the end of dnd\r\n\r\n\t if (e.touches) {\r\n\t this._dragTarget = e.target;\r\n\t this._dragTarget.style.display = \"none\";\r\n\t this.$view.parentNode.appendChild(this._dragTarget);\r\n\t }\r\n\r\n\t this.moveColumn(start, end_index + (start_index < end_index ? 1 : 0));\r\n\t this._last_sort_dnd_node = id.column;\r\n\t this._column_dnd_temp_block = true;\r\n\t }\r\n\t }\r\n\r\n\t if (id && id.column == start) {\r\n\t //flag prevent flickering just after column move\r\n\t this._column_dnd_temp_block = false;\r\n\t }\r\n\r\n\t node.style.display = \"block\";\r\n\t pos$$1.x = pos$$1.x - this._relative_column_drag.x;\r\n\t pos$$1.y = box.y;\r\n\t if (pos$$1.x < box.x) pos$$1.x = box.x;else {\r\n\t var max = box.x + this.$view.offsetWidth - this._scrollSizeY - this._limit_column_drag;\r\n\t if (pos$$1.x > max) pos$$1.x = max;\r\n\t }\r\n\t DragControl._skip = true;\r\n\t }, this),\r\n\t $dragDestroy: bind(function (a, node) {\r\n\t remove(node); //clean dnd source element\r\n\r\n\t if (this._dragTarget) remove(this._dragTarget);\r\n\t var id = DragControl.getContext().start;\r\n\t this.callEvent(\"onAfterColumnDropOrder\", [id.column, this._last_sort_dnd_node, a]);\r\n\t }, this),\r\n\t $drop: function $drop() {}\r\n\t };\r\n\t } else if (value) {\r\n\t control = {\r\n\t _inner_drag_only: true,\r\n\t $drag: bind(function (s, e) {\r\n\t var id = this.locate(e);\r\n\t if (this._rs_process || !id || !this.callEvent(\"onBeforeColumnDrag\", [id.column, e])) return false;\r\n\t DragControl._drag_context = {\r\n\t from: control,\r\n\t start: id,\r\n\t custom: \"column_dnd\"\r\n\t };\r\n\t var header = this.getColumnConfig(id.column).header;\r\n\t var text = \" \";\r\n\r\n\t for (var i = 0; i < header.length; i++) {\r\n\t if (header[i]) {\r\n\t text = header[i].text;\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t return \"
    \" + text + \"
    \";\r\n\t }, this),\r\n\t $drop: bind(function (s, t, e) {\r\n\t var target = e; //on touch devices event doesn't point to the actual drop target\r\n\r\n\t if (e.touches && this._drag_column_last) target = this._drag_column_last;\r\n\t var id = this.locate(target);\r\n\t if (!id) return false;\r\n\t var start = DragControl.getContext().start.column;\r\n\r\n\t if (start != id.column) {\r\n\t if (!this.callEvent(\"onBeforeColumnDrop\", [start, id.column, e])) return;\r\n\t var start_index = this.getColumnIndex(start);\r\n\t var end_index = this.getColumnIndex(id.column);\r\n\t this.moveColumn(start, end_index + (start_index < end_index ? 1 : 0));\r\n\t this.callEvent(\"onAfterColumnDrop\", [start, id.column, e]);\r\n\t }\r\n\t }, this),\r\n\t $dragIn: bind(function (s, t, e) {\r\n\t var context = DragControl.getContext(); //ignore normal dnd , and dnd from other components\r\n\r\n\t if (context.custom != \"column_dnd\" || context.from != control) return false;\r\n\t var target = e.target || e.srcElement;\r\n\r\n\t while ((target.className || \"\").indexOf(\"webix_hcell\") == -1) {\r\n\t target = target.parentNode;\r\n\t if (!target) return;\r\n\t }\r\n\r\n\t if (target != this._drag_column_last) {\r\n\t //new target\r\n\t if (this._drag_column_last) removeCss(this._drag_column_last, \"webix_dd_over_column\");\r\n\t addCss(target, \"webix_dd_over_column\");\r\n\t }\r\n\r\n\t return this._drag_column_last = target;\r\n\t }, this),\r\n\t $dragDestroy: bind(function (a, h) {\r\n\t if (this._drag_column_last) removeCss(this._drag_column_last, \"webix_dd_over_column\");\r\n\t remove(h);\r\n\t }, this)\r\n\t };\r\n\t }\r\n\r\n\t if (value) {\r\n\t DragControl.addDrag(this._header, control);\r\n\t DragControl.addDrop(this._header, control, true);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$d = {\r\n\t clearValidation: function clearValidation() {\r\n\t for (var i in this.data._marks) {\r\n\t this._clear_invalid_css(i);\r\n\t }\r\n\r\n\t this.data.clearMark(\"webix_invalid\", true);\r\n\t },\r\n\t _mark_invalid: function _mark_invalid(id, details) {\r\n\t this._clear_invalid_css(id);\r\n\r\n\t for (var key in details) {\r\n\t this.addCellCss(id, key, \"webix_invalid_cell\");\r\n\t }\r\n\r\n\t this.addCss(id, \"webix_invalid\");\r\n\t },\r\n\t _clear_invalid: function _clear_invalid(id) {\r\n\t this._clear_invalid_css(id);\r\n\r\n\t this.removeCss(id, \"webix_invalid\");\r\n\t },\r\n\t _clear_invalid_css: function _clear_invalid_css(id) {\r\n\t var mark = this.data.getMark(id, \"$cellCss\");\r\n\r\n\t if (mark) {\r\n\t for (var key in mark) {\r\n\t mark[key] = mark[key].replace(\"webix_invalid_cell\", \"\").replace(\" \", \" \");\r\n\t }\r\n\t }\r\n\t },\r\n\t addRowCss: function addRowCss(id, css, silent) {\r\n\t this.addCss(id, css, silent);\r\n\t },\r\n\t removeRowCss: function removeRowCss(id, css, silent) {\r\n\t this.removeCss(id, css, silent);\r\n\t },\r\n\t addCellCss: function addCellCss(id, name, css, silent) {\r\n\t var mark = this.data.getMark(id, \"$cellCss\");\r\n\t var newmark = mark || {};\r\n\t var style = newmark[name] || \"\";\r\n\t newmark[name] = style.replace(css, \"\").replace(\" \", \" \") + \" \" + css;\r\n\t if (!mark) this.data.addMark(id, \"$cellCss\", false, newmark, true);\r\n\t if (!silent) this.refresh(id);\r\n\t },\r\n\t removeCellCss: function removeCellCss(id, name, css, silent) {\r\n\t var mark = this.data.getMark(id, \"$cellCss\");\r\n\r\n\t if (mark) {\r\n\t var style = mark[name] || \"\";\r\n\t if (style) mark[name] = style.replace(css, \"\").replace(\" \", \" \");\r\n\t if (!silent) this.refresh(id);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$e = {\r\n\t _prePrint: function _prePrint(options, htmlOnly) {\r\n\t if (options.scroll && !htmlOnly) return true;\r\n\t options.header = isUndefined(options.header) ? this.config.header ? true : false : options.header;\r\n\t options.footer = isUndefined(options.footer) ? this.config.footer ? true : false : options.footer;\r\n\t options.xCorrection = options.xCorrection || 0; //spreadsheet\r\n\t },\r\n\t _findIndex: function _findIndex(arr, func) {\r\n\t var result = -1;\r\n\r\n\t for (var i = 0; result < 0 && i < arr.length; i++) {\r\n\t if (func(arr[i])) result = i;\r\n\t }\r\n\r\n\t return result;\r\n\t },\r\n\t _getTableHeader: function _getTableHeader(base, columns, group) {\r\n\t var spans = {},\r\n\t start = 0;\r\n\t base.forEach(bind(function (tableArray, tid) {\r\n\t var row = tableArray[0],\r\n\t headerArray = [],\r\n\t length = row.length;\r\n\t row.forEach(bind(function (cell, cid) {\r\n\t var column = columns[cid + start];\r\n\r\n\t for (var h = 0; h < column[group].length; h++) {\r\n\t var header = column[group][h];\r\n\t if (!header && !(spans[tid] && spans[tid][h])) continue;\r\n\t header = copy(header || {\r\n\t text: \"\"\r\n\t });\r\n\r\n\t if (spans[tid] && spans[tid][h] && cid === 0) {\r\n\t header.colspan = spans[tid][h];\r\n\t spans[tid][h] = 0;\r\n\t }\r\n\r\n\t if (header.colspan) {\r\n\t var colspan = Math.min(header.colspan, length - cid);\r\n\t spans[tid + 1] = spans[tid + 1] || {};\r\n\t spans[tid + 1][h] = header.colspan - colspan;\r\n\t header.colspan = colspan;\r\n\t }\r\n\r\n\t if (header.rowspan && length === 1) {\r\n\t header.height = (header.height || this.config.headerRowHeight) * header.rowspan;\r\n\t header.rowspan = null;\r\n\t }\r\n\r\n\t var hcell = {\r\n\t txt: header.rotate ? this.getHeaderNode(column.id, h).innerHTML : header.text || (header.contentId ? this.getHeaderContent(header.contentId).getValue() : \"\"),\r\n\t className: \"webix_hcell \" + \"webix_\" + group + \"_cell \" + (header.css || \"\"),\r\n\t style: {\r\n\t height: (header.height || this.config.headerRowHeight) + \"px\",\r\n\t width: header.colspan ? \"auto\" : column.width + \"px\"\r\n\t },\r\n\t span: header.colspan || header.rowspan ? {\r\n\t colspan: header.colspan || 1,\r\n\t rowspan: header.rowspan || 1\r\n\t } : null\r\n\t };\r\n\t headerArray[h] = headerArray[h] || [];\r\n\t headerArray[h][cid] = hcell;\r\n\t }\r\n\t }, this));\r\n\t if (group == \"header\") base[tid] = headerArray.concat(tableArray);else base[tid] = tableArray.concat(headerArray);\r\n\t start += length;\r\n\t }, this));\r\n\t return base;\r\n\t },\r\n\t _getTableArray: function _getTableArray(options, base, start) {\r\n\t var columns = this.config.columns;\r\n\t var sel = this.getSelectedId(true);\r\n\r\n\t var maxWidth = this._getPageWidth(options);\r\n\r\n\t var rightRestriction = 0;\r\n\t var bottomRestriction = 0;\r\n\t var tableArray = [];\r\n\t var newTableStart = 0;\r\n\t start = start || 0 + options.xCorrection;\r\n\t base = base || [];\r\n\t this.eachRow(bind(function (row) {\r\n\t var width = 0;\r\n\t var rowItem = this.getItem(row);\r\n\t var rowIndex = this.getIndexById(row);\r\n\t var colrow = [];\r\n\t var datarow = false;\r\n\r\n\t for (var c = start; c < columns.length; c++) {\r\n\t var column = columns[c].id;\r\n\t var colIndex = this.getColumnIndex(column) - start;\r\n\r\n\t if (columns[c]) {\r\n\t width += columns[c].width;\r\n\r\n\t if (width > maxWidth && c > start) {\r\n\t // 'c>start' ensures that a single long column will have to fit the page\r\n\t newTableStart = c;\r\n\t break;\r\n\t }\r\n\r\n\t if (options.data !== \"selection\" || options.data == \"selection\" && this._findIndex(sel, function (obj) {\r\n\t return obj.column == column && obj.row == row;\r\n\t }) !== -1) {\r\n\t var span;\r\n\t if (this.getSpan) span = this.getSpan(row, column); //check span from previous table\r\n\r\n\t if (span && this.getColumnIndex(column) === start) {\r\n\t var spanStart = this.getColumnIndex(span[1]);\r\n\r\n\t if (spanStart < start) {\r\n\t span[2] = span[2] - (start - spanStart);\r\n\t span[4] = span[4] ? span[4] : rowItem[span[1]] ? this.getText(row, span[1]) : null;\r\n\t span[1] = column;\r\n\t }\r\n\t }\r\n\r\n\t if (!span || span && span[0] == row && span[1] == column) {\r\n\t var cellValue = span && span[4] ? span[4] : this._columns_pull[column] ? this.getText(row, column) : \"\";\r\n\t var className = this.getCss(row, column) + \" \" + (columns[c].css || \"\") + (span ? \" webix_dtable_span \" + (span[5] || \"\") : \"\");\r\n\t var style = {\r\n\t height: span && span[3] > 1 ? \"auto\" : (rowItem.$height || this.config.rowHeight) + \"px\",\r\n\t width: span && span[2] > 1 ? \"auto\" : columns[c].width + \"px\"\r\n\t };\r\n\t colrow.push({\r\n\t txt: cellValue,\r\n\t className: className,\r\n\t style: style,\r\n\t span: span ? {\r\n\t colspan: span[2],\r\n\t spanStart: this.getColumnIndex(span[1]),\r\n\t rowspan: span[3]\r\n\t } : null\r\n\t });\r\n\r\n\t if (cellValue) {\r\n\t rightRestriction = Math.max(colIndex + 1, rightRestriction);\r\n\t bottomRestriction = Math.max(rowIndex + 1, bottomRestriction);\r\n\t }\r\n\r\n\t datarow = datarow || !!cellValue;\r\n\t } else if (span) {\r\n\t colrow.push({\r\n\t $inspan: true\r\n\t });\r\n\t rightRestriction = Math.max(colIndex + 1, rightRestriction);\r\n\t bottomRestriction = Math.max(rowIndex + 1, bottomRestriction);\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (!options.skiprows || datarow) tableArray.push(colrow);\r\n\t }, this));\r\n\r\n\t if (bottomRestriction && rightRestriction) {\r\n\t if (options.trim) {\r\n\t tableArray.length = bottomRestriction;\r\n\t tableArray = tableArray.map(function (item) {\r\n\t for (var i = item.length - 1; i >= 0; i--) {\r\n\t if (item[i].span && item[i].span.colspan) {\r\n\t item[i].span.colspan = Math.min(item[i].span.colspan, item.length - i);\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t item.length = rightRestriction;\r\n\t return item;\r\n\t });\r\n\t }\r\n\r\n\t base.push(tableArray);\r\n\t }\r\n\r\n\t if (newTableStart) this._getTableArray(options, base, newTableStart);else {\r\n\t //keep this order as logic relies on the first data row\r\n\t if (options.footer) base = this._getTableHeader(base, columns, \"footer\");\r\n\t if (options.header) base = this._getTableHeader(base, columns, \"header\");\r\n\t }\r\n\t return base;\r\n\t },\r\n\t _getTableHTML: function _getTableHTML(tableData, options) {\r\n\t var container = create(\"div\");\r\n\t tableData.forEach(bind(function (table, i) {\r\n\t var tableHTML = create(\"table\", {\r\n\t \"class\": \"webix_table_print \" + this.$view.className + (options.borderless ? \" borderless\" : \"\"),\r\n\t \"style\": \"border-collapse:collapse\",\r\n\t \"id\": this.$view.getAttribute(\"id\")\r\n\t });\r\n\t table.forEach(function (row) {\r\n\t var tr = create(\"tr\");\r\n\t row.forEach(function (cell) {\r\n\t if (!cell.$inspan) {\r\n\t var td = create(\"td\");\r\n\t td.innerHTML = cell.txt;\r\n\t td.className = cell.className;\r\n\r\n\t for (var key in cell.style) {\r\n\t td.style[key] = cell.style[key];\r\n\t }\r\n\r\n\t if (cell.span) {\r\n\t td.colSpan = cell.span.colspan;\r\n\t td.rowSpan = cell.span.rowspan;\r\n\t }\r\n\r\n\t tr.appendChild(td);\r\n\t }\r\n\t });\r\n\t tableHTML.appendChild(tr);\r\n\t });\r\n\t container.appendChild(tableHTML);\r\n\r\n\t if (i + 1 < tableData.length) {\r\n\t var br = create(\"DIV\", {\r\n\t \"class\": \"webix_print_pagebreak\"\r\n\t });\r\n\t container.appendChild(br);\r\n\t }\r\n\t }, this));\r\n\t return container;\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$f = {\r\n\t $exportView: function $exportView(options) {\r\n\t if (this.isBranchOpen) //treetable\r\n\t exports.extend(options, {\r\n\t filterHTML: true\r\n\t });\r\n\t if (options.export_mode !== \"excel\" || options.dataOnly || !options.styles) return this;else {\r\n\t //excel export with styles\r\n\t options.dataOnly = true;\r\n\t options.heights = isUndefined(options.heights) ? \"all\" : options.heights;\r\n\t var data = toExcel(this, options);\r\n\t data[0].styles = this._getExportStyles(options);\r\n\t delete options.dataOnly;\r\n\t return data;\r\n\t }\r\n\t },\r\n\t _getExportStyles: function _getExportStyles(options) {\r\n\t var columns = this.config.columns,\r\n\t styles = [];\r\n\t this._style_hash = this._style_hash || {};\r\n\t if (options.docHeader) styles = [{\r\n\t 0: this._getExportDocStyle(options.docHeader.css)\r\n\t }, {\r\n\t 0: {}\r\n\t }];\r\n\t if (options.header !== false) styles = this._getExportHStyles(options, \"header\", styles);\r\n\t this.data.each(function (obj) {\r\n\t var row = {};\r\n\r\n\t for (var i = 0; i < columns.length; i++) {\r\n\t var cellCss = this.getCss(obj.id, columns[i].id);\r\n\t var columnCss = columns[i].node.className;\r\n\t var spanCss = \"\";\r\n\t var evenCss = this.getIndexById(obj.id) % 2 ? \"even\" : \"odd\"; //for skins like metro, web, air\r\n\r\n\t var span = null;\r\n\t var node = null;\r\n\r\n\t if (this._spans_pull && (span = this.getSpan(obj.id, columns[i].id))) {\r\n\t node = this.getSpanNode({\r\n\t row: span[0],\r\n\t column: span[1]\r\n\t });\r\n\t spanCss = \"webix_dtable_span \" + (span[5] || \"\");\r\n\t } else node = this.getItemNode({\r\n\t row: obj.id,\r\n\t column: columns[i].id\r\n\t });\r\n\r\n\t if (!node) {\r\n\t node = create(\"div\", {\r\n\t \"class\": cellCss,\r\n\t style: \"visibility:hidden\"\r\n\t });\r\n\t var cnode = columns[i].node;\r\n\r\n\t if (!columns[i].attached) {\r\n\t cnode = create(\"div\", {\r\n\t \"class\": columnCss,\r\n\t style: \"visibility:hidden\"\r\n\t });\r\n\r\n\t this._body.appendChild(cnode);\r\n\t }\r\n\r\n\t cnode.appendChild(node);\r\n\t }\r\n\r\n\t row[i] = this._getExportCellStyle(node, [cellCss, columnCss, spanCss, evenCss].join(\":\"));\r\n\t }\r\n\r\n\t styles[styles.length] = row;\r\n\t }, this);\r\n\t if (options.footer !== false && this.config.footer) styles = this._getExportHStyles(options, \"footer\", styles);\r\n\t if (options.docFooter) styles = styles.concat([{\r\n\t 0: {}\r\n\t }, {\r\n\t 0: this._getExportDocStyle(options.docFooter.css)\r\n\t }]);\r\n\t return styles;\r\n\t },\r\n\t _getExportHStyles: function _getExportHStyles(options, group, styles) {\r\n\t var columns = this.config.columns,\r\n\t hs = []; //spans\r\n\r\n\t for (var h = 0; h < columns[0][group].length; h++) {\r\n\t var hrow = {};\r\n\r\n\t for (var i = 0; i < columns.length; i++) {\r\n\t var header = columns[i][group][h]; //ToDo:make sure it is rendered and attached\r\n\r\n\t if (header) {\r\n\t //can be null\r\n\t var cid = header.colspan ? columns[i + header.colspan - 1].id : columns[i].id;\r\n\t var node = group == \"header\" ? this.getHeaderNode(cid, h) : this.getFooterNode(cid, h);\r\n\r\n\t if (node) {\r\n\t var name = [node.parentNode.className, header.css || \"\", \"webix_hcell\", group];\r\n\t hrow[i] = this._getExportCellStyle(node, name.join(\":\"));\r\n\t if (header.colspan || header.rowspan) hs.push([h, i, {\r\n\t colspan: header.colspan - 1 || 0,\r\n\t rowspan: header.rowspan - 1 || 0\r\n\t }, hrow[i]]);\r\n\t }\r\n\t } else {\r\n\t for (var s = 0; s < hs.length; s++) {\r\n\t var st = hs[s][2],\r\n\t hsc = hs[s][1],\r\n\t hsr = hs[s][0];\r\n\t if (hsc + st.colspan >= i && hsr + st.rowspan >= h) hrow[i] = hs[s][3];\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t styles[styles.length] = hrow;\r\n\t }\r\n\r\n\t return styles;\r\n\t },\r\n\t _getExportCellStyle: function _getExportCellStyle(node, name) {\r\n\t if (this._style_hash[name]) return this._style_hash[name];else {\r\n\t var base = this._getRules(node);\r\n\r\n\t var rules = {\r\n\t font: {},\r\n\t alignment: {},\r\n\t border: {}\r\n\t }; //font\r\n\r\n\t rules.font.name = base[\"font-family\"].replace(/,.*$/, \"\"); // cut off fallback font;\r\n\r\n\t rules.font.sz = base[\"font-size\"].replace(\"px\", \"\") * 0.75; //px to pt conversion\r\n\r\n\t rules.font.color = {\r\n\t rgb: color.rgbToHex(base[\"color\"])\r\n\t };\r\n\t if (base[\"font-weight\"] !== \"normal\") rules.font.bold = true;\r\n\t if (base[\"text-decoration-line\"] === \"underline\") rules.font.underline = true;\r\n\t if (base[\"font-style\"] === \"italic\") rules.font.italic = true;\r\n\t if (base[\"text-decoration-line\"] === \"line-through\") rules.font.strike = true; //alignment\r\n\r\n\t rules.alignment.horizontal = base[\"text-align\"];\r\n\t rules.alignment.vertical = base[\"height\"] == base[\"line-height\"] ? \"center\" : \"top\";\r\n\t if (base[\"white-space\"] == \"normal\") rules.alignment.wrapText = true; //rotated header\r\n\r\n\t if (node.firstChild && node.firstChild.className && node.firstChild.className.indexOf(\"webix_rotate\") !== -1) rules.alignment.textRotation = 90; //background\r\n\r\n\t var bg = color.rgbToHex(base[\"background-color\"]) || \"FFFFFF\";\r\n\t rules.fill = {\r\n\t fgColor: {\r\n\t rgb: bg\r\n\t }\r\n\t };\r\n\t if (base[\"background-image\"].indexOf(\"gradient\") !== -1) //air skins use gradient for header\r\n\t rules.fill = {\r\n\t fgColor: {\r\n\t rgb: color.rgbToHex(base[\"background-image\"].substring(base[\"background-image\"].lastIndexOf(\"(\")))\r\n\t }\r\n\t }; //borders\r\n\r\n\t if (node.parentNode && node.parentNode.nodeName == \"TD\") //borders for header are set for parent td, so we change base rules here\r\n\t base = this._getRules(node.parentNode);\r\n\t if (base[\"border-right-width\"] !== \"0px\") rules.border.right = {\r\n\t style: \"thin\",\r\n\t color: {\r\n\t rgb: color.rgbToHex(base[\"border-right-color\"]) || bg\r\n\t }\r\n\t };\r\n\t if (base[\"border-bottom-width\"] !== \"0px\") rules.border.bottom = {\r\n\t style: \"thin\",\r\n\t color: {\r\n\t rgb: color.rgbToHex(base[\"border-bottom-color\"]) || bg\r\n\t }\r\n\t };\r\n\t if (base[\"border-left-width\"] !== \"0px\") rules.border.left = {\r\n\t style: \"thin\",\r\n\t color: {\r\n\t rgb: color.rgbToHex(base[\"border-left-color\"]) || bg\r\n\t }\r\n\t };\r\n\t if (base[\"border-top-width\"] !== \"0px\") rules.border.top = {\r\n\t style: \"thin\",\r\n\t color: {\r\n\t rgb: color.rgbToHex(base[\"border-top-color\"]) || bg\r\n\t }\r\n\t };\r\n\t this._style_hash[name] = rules;\r\n\t return rules;\r\n\t }\r\n\t },\r\n\t _getExportDocStyle: function _getExportDocStyle(css) {\r\n\t css = exports.extend(css || {}, {\r\n\t visibility: \"hidden\",\r\n\t \"white-space\": \"nowrap\",\r\n\t \"text-align\": \"left\"\r\n\t });\r\n\t var cssStr = \"\";\r\n\r\n\t for (var i in css) {\r\n\t cssStr += i + \":\" + css[i] + \";\";\r\n\t }\r\n\r\n\t var node = create(\"div\", {\r\n\t style: cssStr\r\n\t });\r\n\r\n\t this._body.appendChild(node);\r\n\r\n\t var style = this._getExportCellStyle(node, cssStr);\r\n\r\n\t remove(node);\r\n\t return style;\r\n\t },\r\n\t _getRules: function _getRules(node) {\r\n\t var style = {};\r\n\t if (window.getComputedStyle) style = window.getComputedStyle(node);else style = node.currentStyle;\r\n\t return style;\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$g = {\r\n\t subrow_setter: function subrow_setter(value) {\r\n\t if (value) {\r\n\t this._init_subrow_once();\r\n\r\n\t this._settings.fixedRowHeight = false;\r\n\t return template(value);\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t subview_setter: function subview_setter(value) {\r\n\t if (value) this._settings.subrow = this.subrow_setter(\"
    \");\r\n\t return value;\r\n\t },\r\n\t defaults: {\r\n\t subRowHeight: 35\r\n\t },\r\n\t _refresh_sub_all: function _refresh_sub_all() {\r\n\t this.data.each(function (obj) {\r\n\t if (obj) obj.$sub = this._settings.subrow(obj, this.type);\r\n\t }, this);\r\n\r\n\t this._resize_sub_all();\r\n\t },\r\n\t _resize_sub_all: function _resize_sub_all(resize) {\r\n\t if (this._settings.subRowHeight === \"auto\" && this._content_width) this._adjustSubRowHeight();\r\n\r\n\t if (resize && this._settings.subview) {\r\n\t for (var key in this._subViewStorage) {\r\n\t var subview = $$(this._subViewStorage[key]);\r\n\t if (!subview._settings.hidden) subview.adjust();\r\n\t }\r\n\t }\r\n\t },\r\n\t _refresh_sub_one: function _refresh_sub_one(id) {\r\n\t var obj = this.getItem(id);\r\n\t obj.$sub = this._settings.subrow(obj, this.type);\r\n\t if (this._settings.subRowHeight === \"auto\") this._adjustSubRowHeight(obj.id, obj.$sub);\r\n\t },\r\n\t $init: function $init() {\r\n\t this._init_subrow_once = once(function () {\r\n\t var css = \"#\" + this._top_id + \" .webix_cell.webix_dtable_subview { line-height:normal;}\"; //if initial fixedRowHeight is true, preserve white-space for non sub cells\r\n\r\n\t if (this._settings.fixedRowHeight) css += \"#\" + this._top_id + \" .webix_column .webix_cell { white-space: nowrap;}\";\r\n\t addStyle(css);\r\n\t this._subViewStorage = {};\r\n\t this.attachEvent(\"onSubViewRender\", this._render_sub_view);\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(function (id, data, mode) {\r\n\t if (!id) this._refresh_sub_all();else if (mode == \"update\" || mode == \"add\") this._refresh_sub_one(id);\r\n\t }, this));\r\n\t this.attachEvent(\"onResize\", function (w, h, wo) {\r\n\t if (wo != w) this._resize_sub_all(true);\r\n\t });\r\n\t });\r\n\r\n\t this.type.subrow = function (obj) {\r\n\t if (obj.$sub) {\r\n\t if (obj.$subopen) return \"
    \";else return \"
    \";\r\n\t } else return \"
    \";\r\n\t };\r\n\r\n\t this.on_click.webix_sub_open = function (e, id) {\r\n\t this.closeSub(id);\r\n\t return false;\r\n\t };\r\n\r\n\t this.on_click.webix_sub_close = function (e, id) {\r\n\t this.openSub(id);\r\n\t return false;\r\n\t };\r\n\t },\r\n\t openSub: function openSub(id) {\r\n\t var obj = this.getItem(id);\r\n\t if (obj.$subopen) return;\r\n\t obj.$row = this._settings.subrow;\r\n\t obj.$subHeight = obj.$subHeight || this._settings.subRowHeight;\r\n\t obj.$subopen = true;\r\n\t var sub = this._subViewStorage[obj.$subContent];\r\n\t if (sub) sub.repaintMe = true;\r\n\t this.refresh(id);\r\n\t this.callEvent(\"onSubViewOpen\", [id]);\r\n\t },\r\n\t getSubView: function getSubView(id) {\r\n\t var obj = this.getItem(id);\r\n\r\n\t if (obj) {\r\n\t var sub = this._subViewStorage[obj.$subContent];\r\n\t if (sub) return $$(sub);\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t resizeSubView: function resizeSubView(id) {\r\n\t var view = this.getSubView(id);\r\n\t if (view) this._resizeSubView(this.getItem(id), view);\r\n\t },\r\n\t _resizeSubView: function _resizeSubView(obj, view) {\r\n\t var height = view.$getSize(0, 0)[2];\r\n\t var eheight = obj.$subHeight || this._settings.subRowHeight;\r\n\t var delta = Math.abs(height - (eheight || 0));\r\n\r\n\t if (delta > 2) {\r\n\t obj.$subHeight = height;\r\n\t this.refresh(obj.id);\r\n\t }\r\n\t },\r\n\t _checkSubWidth: function _checkSubWidth(view) {\r\n\t var width = view.$width; // if layout\r\n\r\n\t if (view._layout_sizes) {\r\n\t var number = view._cells.length - view._hiddencells;\r\n\t if (view._vertical_orientation) width -= view._paddingX * 2 + 2;else width -= view._margin * (number - 1) + view._paddingX * 2 + number * 2;\r\n\t }\r\n\r\n\t return width > 0;\r\n\t },\r\n\t _render_sub_view: function _render_sub_view(obj, row) {\r\n\t var sub = this._subViewStorage[obj.$subContent],\r\n\t view;\r\n\r\n\t if (sub) {\r\n\t row.firstChild.appendChild(sub);\r\n\t view = $$(obj.$subContent);\r\n\t if (!this._checkSubWidth(view)) view.adjust();\r\n\r\n\t if (sub.repaintMe) {\r\n\t delete sub.repaintMe;\r\n\t view.config.hidden = false;\r\n\r\n\t view._render_hidden_views();\r\n\t }\r\n\t } else {\r\n\t var subview = this._settings.subview;\r\n\t var config;\r\n\r\n\t if (typeof subview === \"function\") {\r\n\t view = subview.call(this, obj, row.firstChild);\r\n\t } else {\r\n\t config = copy(subview);\r\n\t config.$scope = this.$scope;\r\n\t view = ui(config, row.firstChild);\r\n\t }\r\n\r\n\t view.getMasterView = bind(function () {\r\n\t return this;\r\n\t }, this);\r\n\t obj.$subContent = view.config.id;\r\n\t this._subViewStorage[obj.$subContent] = view.$view; //special case, datatable inside of datatable\r\n\r\n\t view.attachEvent(\"onResize\", bind(function (w, h, wo, ho) {\r\n\t if (h && h != ho) this.refresh(obj.id);\r\n\t }, this));\r\n\t this.callEvent(\"onSubViewCreate\", [view, obj]);\r\n\t }\r\n\r\n\t this._resizeSubView(obj, view || $$(sub));\r\n\t },\r\n\t _destroy_sub_view: function _destroy_sub_view(id) {\r\n\t var obj = this.getItem(id);\r\n\t var div = this._subViewStorage[obj.$subContent];\r\n\r\n\t if (div) {\r\n\t delete obj.$subContent;\r\n\t var view = $$(div);\r\n\t if (view && view != this) view.destructor();\r\n\t }\r\n\t },\r\n\t _adjustSubRowHeight: function _adjustSubRowHeight(id, text) {\r\n\t var d = create(\"DIV\", {\r\n\t \"class\": \"webix_measure_size webix_cell webix_dtable_subrow\"\r\n\t }, \"\");\r\n\t d.style.cssText = \"width:\" + this._content_width + \"px; height:auto; visibility:hidden; position:absolute; top:0px; left:0px; overflow:hidden;\";\r\n\t this.$view.appendChild(d);\r\n\t this.data.each(function (obj) {\r\n\t if (obj && !id || obj.id == id && obj.$sub) {\r\n\t d.innerHTML = text || this._settings.subrow(obj, this.type);\r\n\t obj.$subHeight = d.offsetHeight;\r\n\t }\r\n\t }, this);\r\n\t d = remove(d);\r\n\t },\r\n\t closeSub: function closeSub(id) {\r\n\t var obj = this.getItem(id);\r\n\t if (!obj.$subopen) return;\r\n\t obj.$row = false;\r\n\t obj.$subopen = false;\r\n\t var sub = this._subViewStorage[obj.$subContent];\r\n\t if (sub) $$(sub).config.hidden = true;\r\n\t this.refresh(id);\r\n\t this.callEvent(\"onSubViewClose\", [id]);\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$h = {\r\n\t topSplit_setter: function topSplit_setter(value) {\r\n\t if (this.data) this.data.$freeze = value;\r\n\t return value;\r\n\t },\r\n\t freezeRow: function freezeRow(id, mode) {\r\n\t var index,\r\n\t freezeLine = this._settings.topSplit,\r\n\t order = this.data.order,\r\n\t filterOrder = this.data._filter_order;\r\n\r\n\t function moveFrozenRow(index, id, mode, order, skipSplitChange) {\r\n\t var i;\r\n\r\n\t if (mode && index >= freezeLine) {\r\n\t if (!skipSplitChange) freezeLine++;\r\n\r\n\t for (i = index; i >= freezeLine; i--) {\r\n\t order[i] = order[i - 1];\r\n\t }\r\n\r\n\t order[freezeLine - 1] = id;\r\n\t }\r\n\r\n\t if (!mode && index < freezeLine) {\r\n\t if (!skipSplitChange) freezeLine--;\r\n\r\n\t for (i = index; i < freezeLine; i++) {\r\n\t order[i] = order[i + 1];\r\n\t }\r\n\r\n\t order[freezeLine] = id;\r\n\t }\r\n\t }\r\n\r\n\t if (id) {\r\n\t index = this.getIndexById(id);\r\n\t id = id.toString();\r\n\t moveFrozenRow(index, id, mode, order);\r\n\t if (filterOrder) moveFrozenRow(filterOrder.find(id), id, mode, filterOrder, true);\r\n\t } else if (!mode) freezeLine = 0; // unfreeze all rows\r\n\r\n\r\n\t this.define(\"topSplit\", freezeLine);\r\n\t this.refresh();\r\n\t }\r\n\t};\r\n\r\n\tvar Mixin$i = {\r\n\t spans_setter: function spans_setter(value) {\r\n\t if (value && !this._spans_pull) this._init_spans_once();\r\n\t return value;\r\n\t },\r\n\t _init_spans_once: function _init_spans_once() {\r\n\t this._spans_pull = {};\r\n\t this._spans_areas = [];\r\n\t this.data.attachEvent(\"onStoreLoad\", bind(function (driver, data) {\r\n\t if (data && data.spans) this.addSpan(data.spans);\r\n\t }, this));\r\n\t this.data.attachEvent(\"onClearAll\", bind(function () {\r\n\t this._spans_pull = {};\r\n\t }, this)); // touch scroll\r\n\r\n\t this.attachEvent(\"onSyncScroll\", function (x, y, t) {\r\n\t for (var i = 0; i < 3; i++) {\r\n\t Touch._set_matrix(this._spans_areas[i], i == 1 ? x : 0, y, t);\r\n\t }\r\n\t });\r\n\t this.attachEvent(\"onScrollY\", this._adjust_spans_xy);\r\n\t this.attachEvent(\"onScrollX\", this._adjust_spans_xy);\r\n\t this.attachEvent(\"onAfterRender\", this._paint_spans);\r\n\t this.attachEvent(\"onColumnResize\", this._paint_spans);\r\n\t this.attachEvent(\"onSelectChange\", this._paint_spans_selection);\r\n\t },\r\n\t addSpan: function addSpan(id, index$$1, width, height, value, css) {\r\n\t //accept an array of objects\r\n\t if (_typeof(id) == \"object\") {\r\n\t for (var i = 0; i < id.length; i++) {\r\n\t this.addSpan.apply(this, id[i]);\r\n\t }\r\n\r\n\t return;\r\n\t }\r\n\r\n\t height = height || 1;\r\n\t width = width || 1;\r\n\t if (!this._spans_pull[id]) this._spans_pull[id] = {};\r\n\t this._spans_pull[id][index$$1] = [width, height, value, css];\r\n\t },\r\n\t removeSpan: function removeSpan(id, index$$1) {\r\n\t if (!arguments.length) this._spans_pull = {};\r\n\t var line = this._spans_pull[id];\r\n\t if (line) delete line[index$$1];\r\n\t },\r\n\t getSpan: function getSpan(row, column) {\r\n\t if (!row) return this._spans_pull;\r\n\t var i,\r\n\t iSpan,\r\n\t j,\r\n\t jSpan,\r\n\t span,\r\n\t spans = this._spans_pull;\r\n\t i = this.getIndexById(row);\r\n\t j = this.getColumnIndex(column);\r\n\r\n\t for (row in spans) {\r\n\t for (column in spans[row]) {\r\n\t span = spans[row][column];\r\n\t iSpan = this.getIndexById(row);\r\n\t jSpan = this.getColumnIndex(column);\r\n\r\n\t if (!(i > iSpan + span[1] - 1 || i < iSpan || j > jSpan + span[0] - 1 || j < jSpan)) {\r\n\t return [row, column].concat(span);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t _paint_spans: function _paint_spans() {\r\n\t var area,\r\n\t i,\r\n\t rightNum = this._columns.length - this._settings.rightSplit;\r\n\t remove(this._spans_areas);\r\n\r\n\t for (i = 0; i < 3; i++) {\r\n\t area = this._spans_areas[i] = create(\"DIV\", {\r\n\t \"class\": \"webix_span_layer\"\r\n\t });\r\n\r\n\t this._body.childNodes[i].appendChild(area);\r\n\t }\r\n\r\n\t this._adjust_spans_xy();\r\n\r\n\t if (this._settings.leftSplit) this._paint_spans_area(this._spans_areas[0], 0, this._settings.leftSplit);\r\n\t if (this._settings.rightSplit) this._paint_spans_area(this._spans_areas[2], rightNum, this._columns.length);\r\n\r\n\t this._paint_spans_area(this._spans_areas[1], this._settings.leftSplit, rightNum);\r\n\r\n\t if (this._settings.topSplit && !env.touch) this._paintSpansTop();\r\n\t },\r\n\t _getSplitSizesX: function _getSplitSizesX() {\r\n\t var i = 0,\r\n\t leftWidth = 0,\r\n\t centerWidth = 0,\r\n\t rightWidth = 0,\r\n\t rightNum;\r\n\r\n\t while (i < this._settings.leftSplit) {\r\n\t leftWidth += this._columns[i].width;\r\n\t i++;\r\n\t }\r\n\r\n\t i = this._columns.length - 1;\r\n\t rightNum = i - this._settings.rightSplit;\r\n\r\n\t while (i >= rightNum) {\r\n\t rightWidth += this._columns[i].width;\r\n\t i--;\r\n\t }\r\n\r\n\t for (i = this._settings.leftSplit; i < this._columns.length - this._settings.rightSplit; i++) {\r\n\t centerWidth += this._columns[i].width;\r\n\t }\r\n\r\n\t return [leftWidth, centerWidth, rightWidth];\r\n\t },\r\n\t _paintSpansTop: function _paintSpansTop() {\r\n\t var area,\r\n\t i,\r\n\t widths,\r\n\t rightNum = this._columns.length - this._settings.rightSplit;\r\n\r\n\t for (i = 3; i < 6; i++) {\r\n\t area = this._spans_areas[i] = create(\"DIV\", {\r\n\t \"class\": \"webix_span_layer_top\"\r\n\t });\r\n\r\n\t this._body.childNodes[i - 3].appendChild(area);\r\n\t }\r\n\r\n\t widths = this._getSplitSizesX();\r\n\r\n\t if (this._settings.leftSplit) {\r\n\t this._spans_areas[3].style.width = widths[0] + \"px\";\r\n\r\n\t this._paint_spans_area(this._spans_areas[3], 0, this._settings.leftSplit, true);\r\n\t }\r\n\r\n\t if (this._settings.rightSplit) {\r\n\t this._spans_areas[5].style.width = widths[2] + \"px\";\r\n\r\n\t this._paint_spans_area(this._spans_areas[5], rightNum, this._columns.length, true);\r\n\t }\r\n\r\n\t this._spans_areas[4].style.width = widths[1] + \"px\";\r\n\r\n\t this._paint_spans_area(this._spans_areas[4], this._settings.leftSplit, rightNum, true);\r\n\t },\r\n\t _paint_spans_area: function _paint_spans_area(area, start, end, topsplit) {\r\n\t var top = 0;\r\n\t var min = this.data.$min || 0;\r\n\t var max = this.data.$max || this.data.order.length;\r\n\r\n\t for (var i = min; i < max; i++) {\r\n\t var id = this.data.order[i];\r\n\t if (!id) continue;\r\n\t var line = this._spans_pull[id];\r\n\r\n\t if (line && (!topsplit || i < this._settings.topSplit)) {\r\n\t for (var j = start; j < end; j++) {\r\n\t var cid = this._columns[j].id;\r\n\t if (line[cid]) this._add_span_to_area(area, i, j, line, top, start, id, cid);\r\n\t }\r\n\t }\r\n\r\n\t top += this._getRowHeight(this.getItem(id));\r\n\t }\r\n\t },\r\n\t _paint_spans_selection: function _paint_spans_selection() {\r\n\t var config = this.config.select;\r\n\t var cell = config == \"cell\" || config == \"column\";\r\n\t var selected = this.getSelectedId(true);\r\n\t var newselected = [];\r\n\t var last = this._last_selected || [];\r\n\t var id = uid() + \"\";\r\n\t var repaint = false;\r\n\r\n\t for (var i = 0; i < selected.length; i++) {\r\n\t var line = this._spans_pull[selected[i]];\r\n\r\n\t if (line && (!cell || line[selected[i].column])) {\r\n\t if (!line.$selected || line.$selected.id != selected[i].id) repaint = true;\r\n\t line.$selected = selected[i];\r\n\t line.$time = id;\r\n\t newselected.push(selected[i].id);\r\n\t }\r\n\t }\r\n\r\n\t for (var _i = 0; _i < last.length; _i++) {\r\n\t var _line = this._spans_pull[last[_i]];\r\n\r\n\t if (_line && _line.$time !== id) {\r\n\t delete _line.$selected;\r\n\t repaint = true;\r\n\t }\r\n\t }\r\n\r\n\t this._last_selected = [].concat(selected);\r\n\t if (repaint) this._paint_spans();\r\n\t },\r\n\t _span_sum_width: function _span_sum_width(start, end) {\r\n\t var summ = 0;\r\n\r\n\t for (var i = start; i < end; i++) {\r\n\t var next = this._columns[i];\r\n\t summ += next ? next.width : 0;\r\n\t }\r\n\r\n\t return summ;\r\n\t },\r\n\t _span_sum_height: function _span_sum_height(start, end) {\r\n\t var summ = 0;\r\n\r\n\t for (var i = start; i < end; i++) {\r\n\t var next = this.getItem(this.data.order[i]);\r\n\t summ += next ? this._getRowHeight(next) : this._settings.rowHeight;\r\n\t }\r\n\r\n\t return summ;\r\n\t },\r\n\t _add_span_to_area: function _add_span_to_area(area, ind, cind, config, top, start, id, cid) {\r\n\t var line = config[cid];\r\n\t var value = line[2] || this.getText(id, cid);\r\n\t var selected = \"\";\r\n\t if (config.$selected && (this._settings.select === \"row\" || config.$selected.column === cid)) selected = \"webix_selected \";\r\n\t var attributes = {\r\n\t \"column\": cind,\r\n\t \"row\": ind,\r\n\t \"class\": selected + \"webix_cell webix_table_cell webix_dtable_span \" + (line[3] || \"\"),\r\n\t \"aria-colindex\": cind + 1,\r\n\t \"aria-rowindex\": ind + 1\r\n\t };\r\n\t if (line[0] > 1) attributes[\"aria-colspan\"] = line[0];\r\n\t if (line[1] > 1) attributes[\"aria-rowspan\"] = line[1];\r\n\t var span = create(\"DIV\", attributes, \"\" + value);\r\n\t span.style.top = top + \"px\";\r\n\t span.style.left = this._span_sum_width(start, cind) + \"px\";\r\n\t span.style.width = this._span_sum_width(cind, cind + line[0]) + \"px\";\r\n\t span.style.height = this._span_sum_height(ind, ind + line[1]) + \"px\";\r\n\t area.appendChild(span);\r\n\t },\r\n\t _adjust_spans_xy: function _adjust_spans_xy() {\r\n\t if (!this._settings.prerender) {\r\n\t var state = this.getScrollState();\r\n\r\n\t for (var i = 0; i < 3; i++) {\r\n\t this._spans_areas[i].style.top = \"-\" + (state.y || 0) + \"px\";\r\n\t }\r\n\t }\r\n\t },\r\n\t _checkCellMerge: function _checkCellMerge(id0, id1) {\r\n\t var span0,\r\n\t span1,\r\n\t result = false;\r\n\r\n\t if (this._spans_pull) {\r\n\t span0 = this.getSpan(id0.row, id0.column);\r\n\t span1 = this.getSpan(id1.row, id1.column);\r\n\t if (span0 && span1 && span0[0] == span1[0] && span0[1] == span1[1]) result = true;\r\n\t }\r\n\r\n\t return result;\r\n\t },\r\n\t getSpanNode: function getSpanNode(id) {\r\n\t var areas = this._spans_areas;\r\n\t var rind = this.getIndexById(id.row);\r\n\t var cind = this.getColumnIndex(id.column);\r\n\r\n\t for (var a = 0; a < areas.length; a++) {\r\n\t var parts = areas[a].childNodes;\r\n\r\n\t for (var i = 0; i < parts.length; i++) {\r\n\t if (parts[i].getAttribute(\"row\") == rind && parts[i].getAttribute(\"column\") == cind) return parts[i];\r\n\t }\r\n\t }\r\n\r\n\t return null;\r\n\t }\r\n\t};\r\n\r\n\tvar api$1b = {\r\n\t name: \"datatable\",\r\n\t defaults: {\r\n\t leftSplit: 0,\r\n\t rightSplit: 0,\r\n\t topSplit: 0,\r\n\t columnWidth: 100,\r\n\t minColumnWidth: 20,\r\n\t minColumnHeight: 26,\r\n\t prerender: false,\r\n\t autoheight: false,\r\n\t autowidth: false,\r\n\t header: true,\r\n\t fixedRowHeight: true,\r\n\t scrollAlignY: true,\r\n\t scrollX: true,\r\n\t scrollY: true,\r\n\t datafetch: 50,\r\n\t navigation: true\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.rowHeight = $active.rowHeight;\r\n\t this.defaults.headerRowHeight = $active.barHeight - $active.borderWidth * 2;\r\n\t },\r\n\t on_click: {\r\n\t webix_richfilter: function webix_richfilter() {\r\n\t return false;\r\n\t },\r\n\t webix_table_checkbox: function webix_table_checkbox(e, id) {\r\n\t id = this.locate(e);\r\n\t var item = this.getItem(id.row);\r\n\t var col = this.getColumnConfig(id.column);\r\n\t var trg = e.target || e.srcElement; //read actual value from HTML tag when possible\r\n\t //as it can be affected by dbl-clicks\r\n\r\n\t var check = trg.type == \"checkbox\" ? trg.checked : item[id.column] != col.checkValue;\r\n\t var value = check ? col.checkValue : col.uncheckValue;\r\n\t var update = {};\r\n\t update[id.column] = value;\r\n\t this.updateItem(id.row, update, this._settings.checkboxRefresh ? \"update\" : \"save\");\r\n\t this.callEvent(\"onCheck\", [id.row, id.column, value]);\r\n\t return false;\r\n\t },\r\n\t webix_table_radio: function webix_table_radio(e) {\r\n\t var id = this.locate(e);\r\n\t var item = this.getItem(id.row);\r\n\t var col = this.getColumnConfig(id.column);\r\n\t this.eachRow(function (rowid) {\r\n\t var item = this.data.pull[rowid];\r\n\t if (item && item[id.column] == col.checkValue) item[id.column] = col.uncheckValue;\r\n\t });\r\n\t item[id.column] = col.checkValue;\r\n\t this.callEvent(\"onCheck\", [id.row, id.column, true]);\r\n\t this.refresh();\r\n\t return false;\r\n\t }\r\n\t },\r\n\t on_dblclick: {\r\n\t webix_table_checkbox: function webix_table_checkbox() {\r\n\t return this.on_click.webix_table_checkbox.apply(this, arguments);\r\n\t }\r\n\t },\r\n\t on_context: {},\r\n\t $init: function $init(config) {\r\n\t this.on_click = exports.extend({}, this.on_click);\r\n\t var html = \"
    \";\r\n\t html += \"
    \";\r\n\t html += \"
    \";\r\n\t html += \"
    \";\r\n\t this._contentobj.innerHTML = html;\r\n\t this._top_id = this._contentobj.id = this.name + uid();\r\n\t this._contentobj.className += \" webix_dtable\";\r\n\t this._dataobj = this._contentobj;\r\n\t this._header = this._contentobj.firstChild;\r\n\t this._body = this._header.nextSibling;\r\n\t this._footer = this._body.nextSibling.nextSibling;\r\n\r\n\t this._viewobj.setAttribute(\"role\", \"grid\");\r\n\r\n\t if (!config.editable) this._viewobj.setAttribute(\"aria-readonly\", \"true\");\r\n\t this.data.provideApi(this, true);\r\n\t this.data.attachEvent(\"onParse\", bind(this._call_onparse, this));\r\n\t this.$ready.push(this._first_render);\r\n\t this._columns = [];\r\n\t this._hidden_column_order = [];\r\n\t this._headers = [];\r\n\t this._footers = [];\r\n\t this._rows_cache = [];\r\n\t this._active_headers = {};\r\n\t this._filter_elements = {};\r\n\t this._header_height = this._footer_height = 0; //component can create new view\r\n\r\n\t this._destroy_with_me = [];\r\n\t this.data.attachEvent(\"onServerConfig\", bind(this._config_table_from_file, this));\r\n\t this.data.attachEvent(\"onServerOptions\", bind(this._config_options_from_file, this));\r\n\t this.attachEvent(\"onViewShow\", function () {\r\n\t this._restore_scroll_state();\r\n\r\n\t this._refresh_any_header_content();\r\n\t });\r\n\t this.data.attachEvent(\"onClearAll\", bind(function (soft) {\r\n\t if (!soft) {\r\n\t this._scrollLeft = this._scrollTop = 0;\r\n\t if (this._x_scroll) this._x_scroll.reset();\r\n\t if (this._y_scroll) this._y_scroll.reset();\r\n\r\n\t this._setLeftScroll(0);\r\n\t }\r\n\t }, this));\r\n\t this.attachEvent(\"onDestruct\", this._clean_config_struct);\r\n\t this.attachEvent(\"onKeyPress\", this._onKeyPress);\r\n\t this.attachEvent(\"onScrollY\", this._adjust_rows);\r\n\t callEvent(\"onDataTable\", [this, config]);\r\n\t },\r\n\t _render_initial: function _render_initial() {\r\n\t this._scrollSizeX = this._scrollSizeY = env.scrollSize;\r\n\t addStyle(\"#\" + this._top_id + \" .webix_cell { height:\" + this._settings.rowHeight + \"px; line-height:\" + (this._settings.rowLineHeight || this._settings.rowHeight) + \"px;\" + (this._settings.fixedRowHeight ? \"\" : \"white-space:normal;\") + \" }\");\r\n\t addStyle(\"#\" + this._top_id + \" .webix_hcell { height:\" + this._settings.headerRowHeight + \"px; line-height:\" + this._settings.headerRowHeight + \"px;}\");\r\n\r\n\t this._render_initial = function () {};\r\n\t },\r\n\t _first_render: function _first_render() {\r\n\t this.data.attachEvent(\"onStoreLoad\", bind(this._refresh_any_header_content, this));\r\n\t this.data.attachEvent(\"onSyncApply\", bind(this._refresh_any_header_content, this));\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(function () {\r\n\t return this.render.apply(this, arguments);\r\n\t }, this));\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(this._refresh_tracking_header_content, this));\r\n\t this.render();\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this.render();\r\n\t },\r\n\t render: function render(id, data, mode) {\r\n\t //pure data saving call\r\n\t if (mode == \"save\") return; //during dnd we must not repaint anything in mobile webkit\r\n\r\n\t if (mode == \"move\") {\r\n\t var context = DragControl.getContext();\r\n\t if (context && context.fragile) return;\r\n\t }\r\n\r\n\t if (!this._columns.length) {\r\n\t var cols = this._settings.columns;\r\n\r\n\t if (!cols || !cols.length) {\r\n\t if (this._settings.autoConfig && this.data.order.length && !this._hidden_column_order.length) {\r\n\t this._dtable_fully_ready = 0;\r\n\r\n\t this._autoDetectConfig();\r\n\t } else return;\r\n\t }\r\n\r\n\t this._define_structure();\r\n\t }\r\n\r\n\t if (!this.isVisible(this._settings.id) || this.$blockRender) return this._render_initial(); //Chrome 34, Custom Font loading bug\r\n\r\n\t var fast_mode = this.config.experimental && !this._settings.subview; //replace multiple atomic updates by single big repaint\r\n\r\n\t if (id && data != -1 && (mode == \"paint\" || mode == \"update\") && !fast_mode) {\r\n\t if (this._render_timer) clearTimeout(this._render_timer);\r\n\r\n\t if (!this._render_timer || this._render_timer_id == id) {\r\n\t this._render_timer_id = id;\r\n\t this._render_timer = delay(function () {\r\n\t //if only one call - repaint single item\r\n\t this.render(id, -1, mode);\r\n\t }, this);\r\n\t } else {\r\n\t this._render_timer_id = null;\r\n\t this._render_timer = delay(function () {\r\n\t //if ther was a serie of calls - replace them with single full repaint\r\n\t this.render();\r\n\t }, this);\r\n\t }\r\n\r\n\t return;\r\n\t } else if (this._render_timer) {\r\n\t clearTimeout(this._render_timer);\r\n\t this._render_timer = 0;\r\n\t }\r\n\r\n\t if (this.callEvent(\"onBeforeRender\", [this.data])) {\r\n\t this._render_initial();\r\n\r\n\t if (!this._dtable_fully_ready) this._apply_headers();\r\n\r\n\t if (this._content_width) {\r\n\t if (fast_mode && (mode == \"paint\" || mode == \"update\") && id) this._repaint_single_row(id);else this._check_rendered_cols(true, true);\r\n\t }\r\n\r\n\t if (!id || mode != \"update\") {\r\n\t this._dtable_height = this._get_total_height();\r\n\r\n\t this._set_split_sizes_y();\r\n\t } //don't depend on hidden rows/rolumns\r\n\r\n\r\n\t this._viewobj.setAttribute(\"aria-colcount\", Math.max(this._hidden_column_order.length, this._columns.length));\r\n\r\n\t this._viewobj.setAttribute(\"aria-rowcount\", this.data.count());\r\n\r\n\t this.callEvent(\"onAfterRender\", [this.data]);\r\n\t return true;\r\n\t }\r\n\t },\r\n\t getColumnConfig: function getColumnConfig(id) {\r\n\t return this._columns_pull[id] || this._hidden_column_hash[id];\r\n\t },\r\n\t _config_options_from_file: function _config_options_from_file(colls) {\r\n\t for (var key in colls) {\r\n\t var column = this.getColumnConfig(key);\r\n\t assert(column, \"Orphan collection: \" + key);\r\n\t var temp = new DataCollection({\r\n\t data: colls[key]\r\n\t });\r\n\r\n\t this._destroy_with_me.push(temp);\r\n\r\n\t this._bind_collection(temp, column);\r\n\t }\r\n\t },\r\n\t //xml has different configuration structure, fixing\r\n\t _config_table_from_file: function _config_table_from_file(config) {\r\n\t if (config.columns && this._dtable_fully_ready) this.refreshColumns(null, true);\r\n\t },\r\n\t _define_structure: function _define_structure() {\r\n\t if (this._settings.columns) {\r\n\t this._columns = this._settings.columns;\r\n\t this._columns_pull = {};\r\n\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t var col = this._columns[i];\r\n\t this._columns_pull[col.id] = col;\r\n\t var format = col.cssFormat;\r\n\t if (format) col.cssFormat = toFunctor(format, this.$scope);\r\n\t col.width = col.width || this._settings.columnWidth;\r\n\t if (typeof col.format == \"string\") col.format = i18n[col.format] || window[col.format];\r\n\r\n\t if (col.numberFormat) {\r\n\t var nformat = col.numberFormat;\r\n\t if (typeof nformat === \"string\") col.numberFormat = nformat = Number.getConfig(nformat);\r\n\t col.format = Number.numToStr(nformat);\r\n\r\n\t col.editFormat = col.editFormat || function (val) {\r\n\t return Number.format(val, nformat);\r\n\t };\r\n\r\n\t col.editParse = col.editParse || function (val) {\r\n\t return Number.parse(val, nformat);\r\n\t };\r\n\t } //default settings for checkboxes and radios\r\n\r\n\r\n\t if (isUndefined(col.checkValue)) col.checkValue = 1;\r\n\t if (isUndefined(col.uncheckValue)) col.uncheckValue = 0;\r\n\t if (col.css && _typeof(col.css) == \"object\") col.css = createCss(col.css);\r\n\t var rawTemplate = col.template;\r\n\r\n\t if (rawTemplate) {\r\n\t if (typeof rawTemplate == \"string\") rawTemplate = rawTemplate.replace(/#\\$value#/g, \"#\" + col.id + \"#\");\r\n\t col.template = template(rawTemplate);\r\n\t }\r\n\t }\r\n\r\n\t this._normalize_headers(\"header\", this._headers);\r\n\r\n\t this._normalize_headers(\"footer\", this._footers);\r\n\r\n\t this.callEvent(\"onStructureLoad\", []);\r\n\t }\r\n\t },\r\n\t _define_structure_and_render: function _define_structure_and_render() {\r\n\t this._apply_headers();\r\n\t },\r\n\t _clean_config_struct: function _clean_config_struct() {\r\n\t //remove column technical info from the column\r\n\t //it allows to reuse the same config object for new grid\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t delete this._columns[i].attached;\r\n\t delete this._columns[i].node;\r\n\t }\r\n\t },\r\n\t _apply_headers: function _apply_headers() {\r\n\t this._rightSplit = this._columns.length - this._settings.rightSplit;\r\n\t this._dtable_width = 0;\r\n\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t if (!this._columns[i].node) {\r\n\t var temp = create(\"DIV\");\r\n\t temp.style.width = this._columns[i].width + \"px\";\r\n\t this._columns[i].node = temp;\r\n\t }\r\n\r\n\t if (i >= this._settings.leftSplit && i < this._rightSplit) this._dtable_width += this._columns[i].width;\r\n\t }\r\n\r\n\t var marks = [];\r\n\r\n\t if (this._settings.rightSplit) {\r\n\t var nr = this._columns.length - this._settings.rightSplit;\r\n\t marks[nr] = \" webix_first\";\r\n\t marks[nr - 1] = \" webix_last\";\r\n\t }\r\n\r\n\t if (this._settings.leftSplit) {\r\n\t var nl = this._settings.leftSplit;\r\n\t marks[nl] = \" webix_first\";\r\n\t marks[nl - 1] = \" webix_last\";\r\n\t }\r\n\r\n\t marks[0] = (marks[0] || \"\") + \" webix_first webix_select_mark\";\r\n\t var last_index = this._columns.length - 1;\r\n\t marks[last_index] = (marks[last_index] || \"\") + \" webix_last\";\r\n\r\n\t for (var _i = 0; _i < this._columns.length; _i++) {\r\n\t var node = this._columns[_i].node;\r\n\t node.setAttribute(\"column\", _i);\r\n\t node.className = \"webix_column \" + (this._columns[_i].css || \"\") + (marks[_i] || \"\");\r\n\t }\r\n\r\n\t this._create_scrolls();\r\n\r\n\t this._set_columns_positions();\r\n\r\n\t this._set_split_sizes_x();\r\n\r\n\t this._render_header_and_footer();\r\n\r\n\t this._dtable_fully_ready = true;\r\n\t },\r\n\t _set_columns_positions: function _set_columns_positions() {\r\n\t var left = 0;\r\n\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t var column = this._columns[i];\r\n\t if (i == this._settings.leftSplit || i == this._rightSplit) left = 0;\r\n\r\n\t if (column.node) {\r\n\t column.node.style.left = left + \"px\";\r\n\r\n\t if (this._settings.leftSplit || this._settings.rightSplit) {\r\n\t remove(column.node);\r\n\t column.attached = false;\r\n\t }\r\n\t }\r\n\r\n\t left += column.width;\r\n\t }\r\n\t },\r\n\t _render_header_and_footer: function _render_header_and_footer() {\r\n\t if (!this._header_fix_width) this._header_fix_width = 0;\r\n\t this._header_height = this._footer_height = 0;\r\n\r\n\t if (this._settings.header) {\r\n\t this._refreshHeaderContent(this._header, 0, 1);\r\n\r\n\t this._normalize_headers(\"header\", this._headers);\r\n\r\n\t this._header_height = this._headers._summ;\r\n\r\n\t this._render_header_section(this._header, \"header\", this._headers);\r\n\t }\r\n\r\n\t if (this._settings.footer) {\r\n\t this._refreshHeaderContent(this._footer, 0, 1);\r\n\r\n\t this._normalize_headers(\"footer\", this._footers);\r\n\r\n\t this._footer_height = this._footers._summ;\r\n\r\n\t this._render_header_section(this._footer, \"footer\", this._footers);\r\n\t }\r\n\r\n\t this.refreshHeaderContent(false, false);\r\n\r\n\t this._size_header_footer_fix();\r\n\r\n\t if (this._last_sorted) this.markSorting(this._last_sorted, this._last_order);\r\n\t },\r\n\t _getHeaderHeight: function _getHeaderHeight(header, column, ind) {\r\n\t var width = 0;\r\n\t var colspan = header.colspan || 1;\r\n\t var css = \"webix_hcell \" + (header.css || \"\");\r\n\t if (header.rotate) css += \" webix_measure_rotate\";else for (var i = 0; i < colspan; i++) {\r\n\t width += this._columns[ind + i] ? this._columns[ind + i].width : this.config.columnWidth;\r\n\t }\r\n\t var size = getTextSize([header.text], css, width); //+1 to compensate for scrollHeight rounding\r\n\r\n\t return (header.rotate ? size.width : size.height) + 1;\r\n\t },\r\n\t _normalize_headers: function _normalize_headers(collection, heights) {\r\n\t var rows = 0;\r\n\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t var data = this._columns[i][collection];\r\n\r\n\t if (!data || _typeof(data) != \"object\" || !data.length) {\r\n\t if (isUndefined(data)) {\r\n\t if (collection == \"header\") data = this._columns[i].id;else data = \"\";\r\n\t }\r\n\r\n\t data = [data];\r\n\t }\r\n\r\n\t for (var j = 0; j < data.length; j++) {\r\n\t if (_typeof(data[j]) != \"object\") data[j] = {\r\n\t text: data[j]\r\n\t };\r\n\t if (data[j] && data[j].height) heights[j] = data[j].height;\r\n\t if (data[j] && data[j].autoheight) heights[j] = this._getHeaderHeight(data[j], this._columns[i], i);\r\n\t }\r\n\r\n\t rows = Math.max(rows, data.length);\r\n\t this._columns[i][collection] = data;\r\n\t }\r\n\r\n\t heights._summ = rows;\r\n\r\n\t for (var _i2 = rows - 1; _i2 >= 0; _i2--) {\r\n\t heights[_i2] = heights[_i2] || this._settings.headerRowHeight;\r\n\t heights._summ += heights[_i2] * 1;\r\n\t } //set null to cells included in col|row spans\r\n\r\n\r\n\t for (var _i3 = 0; _i3 < this._columns.length; _i3++) {\r\n\t var col = this._columns[_i3][collection];\r\n\r\n\t for (var _j = 0; _j < col.length; _j++) {\r\n\t if (col[_j] && col[_j].rowspan) for (var z = 1; z < col[_j].rowspan; z++) {\r\n\t col[_j + z] = null;\r\n\t }\r\n\t if (col[_j] && col[_j].colspan) for (var _z = 1; _z < col[_j].colspan; _z++) {\r\n\t this._columns[_i3 + _z][collection][_j] = null;\r\n\t }\r\n\t }\r\n\t } //auto-rowspan cells, which has not enough header lines\r\n\r\n\r\n\t for (var _i4 = 0; _i4 < this._columns.length; _i4++) {\r\n\t var _data = this._columns[_i4][collection];\r\n\r\n\t if (_data.length < rows) {\r\n\t var end = _data.length - 1;\r\n\t _data[end].rowspan = rows - _data.length + 1;\r\n\r\n\t for (var _j2 = end + 1; _j2 < rows; _j2++) {\r\n\t _data[_j2] = null;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return rows;\r\n\t },\r\n\t _find_header_content: function _find_header_content(sec, id) {\r\n\t var alltd = sec.getElementsByTagName(\"TD\");\r\n\r\n\t for (var i = 0; i < alltd.length; i++) {\r\n\t if (alltd[i].getAttribute(\"active_id\") == id) return alltd[i];\r\n\t }\r\n\t },\r\n\t getHeaderContent: function getHeaderContent(id) {\r\n\t var obj = this._find_header_content(this._header, id);\r\n\r\n\t if (!obj) obj = this._find_header_content(this._footer, id);\r\n\r\n\t if (obj) {\r\n\t var config = this._active_headers[id];\r\n\t var type$$1 = datafilter[config.content];\r\n\t if (type$$1.getHelper) return type$$1.getHelper(obj, config);\r\n\t return {\r\n\t type: type$$1,\r\n\t getValue: function getValue$$1() {\r\n\t return type$$1.getValue(obj);\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t return type$$1.setValue(obj, value);\r\n\t }\r\n\t };\r\n\t }\r\n\t },\r\n\t _summ_next: function _summ_next(heights, start, i) {\r\n\t var summ = i ? -1 : 0;\r\n\t i += start;\r\n\r\n\t for (start; start < i; start++) {\r\n\t summ += heights[start] + 1;\r\n\t }\r\n\r\n\t return summ;\r\n\t },\r\n\t _render_subheader: function _render_subheader(start, end, width, name, heights) {\r\n\t if (start == end) return \"\";\r\n\t var html = \"\";\r\n\t html += \"\";\r\n\r\n\t for (var i = start; i < end; i++) {\r\n\t html += \"\";\r\n\t }\r\n\r\n\t html += \"\";\r\n\t var count = this._columns[0][name].length;\r\n\r\n\t for (var j = 0; j < count; j++) {\r\n\t html += \"\";\r\n\r\n\t for (var _i5 = start; _i5 < end; _i5++) {\r\n\t var header = this._columns[_i5][name][j];\r\n\t if (header === null) continue;\r\n\r\n\t if (header.content) {\r\n\t header.contentId = header.contentId || uid();\r\n\t header.columnId = this._columns[_i5].id;\r\n\t header.format = this._columns[_i5].format;\r\n\t assert(datafilter, \"Filtering extension was not included\");\r\n\t assert(datafilter[header.content], \"Unknown content type: \" + header.content);\r\n\t header.text = datafilter[header.content].render(this, header);\r\n\t this._active_headers[header.contentId] = header;\r\n\t this._has_active_headers = true;\r\n\t }\r\n\r\n\t html += \"\";\r\n\t }\r\n\r\n\t html += \"\";\r\n\t }\r\n\r\n\t html += \"
    = end - 1) hcss += \" webix_last\";\r\n\t if (header.rowspan && j + header.rowspan === count || j === count - 1) hcss += \" webix_last_row\";\r\n\t if (hcss) html += \" class=\\\"\" + hcss + \"\\\"\";\r\n\t var cell_height = heights[j];\r\n\t var sheight = \"\";\r\n\t if (header.contentId) html += \" active_id='\" + header.contentId + \"'\";\r\n\t if (header.colspan) html += \" colspan='\" + header.colspan + \"'\";\r\n\r\n\t if (header.rowspan) {\r\n\t html += \" rowspan='\" + header.rowspan + \"'\";\r\n\t cell_height = this._summ_next(this._headers, j, header.rowspan);\r\n\t }\r\n\r\n\t if (cell_height != this._settings.headerRowHeight) sheight = \" style='line-height:\" + cell_height + \"px; height:\" + cell_height + \"px;'\";\r\n\t var css = \"webix_hcell\";\r\n\t var header_css = header.css;\r\n\r\n\t if (header_css) {\r\n\t if (_typeof(header_css) == \"object\") header.css = header_css = createCss(header_css);\r\n\t css += \" \" + header_css;\r\n\t }\r\n\r\n\t if (this._columns[_i5].$selected) css += \" webix_sel_hcell\";\r\n\t html += \">
    \";\r\n\t var text = header.text === \"\" ? \" \" : header.text;\r\n\t if (header.rotate) text = \"
    \" + text + \"
    \";\r\n\t html += text + \"
    \";\r\n\t return html;\r\n\t },\r\n\t showItemByIndex: function showItemByIndex(row_ind, column_ind) {\r\n\t var pager = this._settings.pager;\r\n\r\n\t if (pager) {\r\n\t var target = Math.floor(row_ind / pager.size);\r\n\t if (target != pager.page) $$(pager.id).select(target);\r\n\t } //parameter will be set to -1, to mark that scroll need not to be adjusted\r\n\r\n\r\n\t if (row_ind != -1) {\r\n\t var state = this._get_y_range();\r\n\r\n\t if (row_ind < state[0] + 1 || row_ind >= state[1] - 1) {\r\n\t //not visible currently\r\n\t var summ = this._getHeightByIndexSumm(pager ? this.data.$min : 0, row_ind);\r\n\r\n\t if (row_ind < state[0] + 1) {\r\n\t //scroll top - show row at top of screen\r\n\t summ = Math.max(0, summ - 1) - this._top_split_height;\r\n\t } else {\r\n\t //scroll bottom - show row at bottom of screen\r\n\t summ += this._getHeightByIndex(row_ind) - this._dtable_offset_height; //because of row rounding we neet to scroll some extra\r\n\t //TODO: create a better heuristic\r\n\r\n\t if (row_ind > 0) summ += this._getHeightByIndex(row_ind - 1) - 1;\r\n\t }\r\n\r\n\t this._y_scroll.scrollTo(summ);\r\n\t }\r\n\t }\r\n\r\n\t if (column_ind != -1) {\r\n\t //ignore split columns - they are always visible\r\n\t if (column_ind < this._settings.leftSplit) return;\r\n\t if (column_ind >= this._rightSplit) return; //very similar to y-logic above\r\n\r\n\t var _state = this._get_x_range();\r\n\r\n\t if (column_ind < _state[0] + 1 || column_ind >= _state[1] - 1) {\r\n\t //not visible currently\r\n\t var _summ = 0;\r\n\r\n\t for (var i = this._settings.leftSplit; i < column_ind; i++) {\r\n\t _summ += this._columns[i].width;\r\n\t }\r\n\t /*jsl:ignore*/\r\n\r\n\r\n\t if (column_ind < _state[0] + 1) ; else {\r\n\t //scroll to right border\r\n\t _summ += this._columns[column_ind].width - this._center_width;\r\n\t }\r\n\t /*jsl:end*/\r\n\r\n\r\n\t this._x_scroll.scrollTo(_summ);\r\n\t }\r\n\t }\r\n\t },\r\n\t showCell: function showCell(row, column) {\r\n\t if (!column || !row) {\r\n\t //if column or row not provided - take from current selection\r\n\t var t = this.getSelectedId(true);\r\n\r\n\t if (t.length == 1) {\r\n\t column = column || t[0].column;\r\n\t row = row || t[0].row;\r\n\t }\r\n\t } //convert id to index\r\n\r\n\r\n\t column = column ? this.getColumnIndex(column) : -1;\r\n\t row = row ? this.getIndexById(row) : -1;\r\n\t this.showItemByIndex(row, column);\r\n\t },\r\n\t scrollTo: function scrollTo(x, y) {\r\n\t if (!this._x_scroll) return;\r\n\t if (this._scrollTo_touch) return this._scrollTo_touch(x, y);\r\n\t if (x !== null) this._x_scroll.scrollTo(x);\r\n\t if (y !== null) this._y_scroll.scrollTo(y);\r\n\t },\r\n\t getScrollState: function getScrollState() {\r\n\t if (this._getScrollState_touch) return this._getScrollState_touch();\r\n\t var diff = this._render_scroll_shift ? 0 : this._render_scroll_diff || 0;\r\n\t return {\r\n\t x: this._scrollLeft || 0,\r\n\t y: this._scrollTop + diff\r\n\t };\r\n\t },\r\n\t showItem: function showItem(id) {\r\n\t this.showItemByIndex(this.getIndexById(id), -1);\r\n\t },\r\n\t _render_header_section: function _render_header_section(sec, name, heights) {\r\n\t sec.childNodes[0].innerHTML = this._render_subheader(0, this._settings.leftSplit, this._left_width, name, heights);\r\n\t sec.childNodes[1].innerHTML = this._render_subheader(this._settings.leftSplit, this._rightSplit, this._dtable_width, name, heights);\r\n\t sec.childNodes[1].onscroll = bind(this._scroll_with_header, this);\r\n\t sec.childNodes[2].innerHTML = this._render_subheader(this._rightSplit, this._columns.length, this._right_width, name, heights);\r\n\t },\r\n\t _scroll_with_header: function _scroll_with_header() {\r\n\t var active = this.getScrollState().x;\r\n\t var header = this._header.childNodes[1].scrollLeft;\r\n\t if (header != active) this.scrollTo(header, null);\r\n\t },\r\n\t _refresh_tracking_header_content: function _refresh_tracking_header_content() {\r\n\t this.refreshHeaderContent(true, true);\r\n\t },\r\n\t _refresh_any_header_content: function _refresh_any_header_content() {\r\n\t this.refreshHeaderContent(false, true);\r\n\t },\r\n\t //[DEPRECATE] - v3.0, move to private\r\n\t refreshHeaderContent: function refreshHeaderContent(trackedOnly, preserve, id) {\r\n\t if (this._settings.header) {\r\n\t if (preserve) this._refreshHeaderContent(this._header, trackedOnly, 1, id);\r\n\r\n\t this._refreshHeaderContent(this._header, trackedOnly, 0, id);\r\n\t }\r\n\r\n\t if (this._settings.footer) {\r\n\t if (preserve) this._refreshHeaderContent(this._footer, trackedOnly, 1, id);\r\n\r\n\t this._refreshHeaderContent(this._footer, trackedOnly, 0, id);\r\n\t }\r\n\t },\r\n\t refreshFilter: function refreshFilter(id) {\r\n\t this.refreshHeaderContent(false, true, id);\r\n\t },\r\n\t _refreshHeaderContent: function _refreshHeaderContent(sec, cellTrackOnly, getOnly, byId) {\r\n\t if (this._has_active_headers && sec) {\r\n\t var alltd = sec.getElementsByTagName(\"TD\");\r\n\r\n\t for (var i = 0; i < alltd.length; i++) {\r\n\t if (alltd[i].getAttribute(\"active_id\")) {\r\n\t var obj = this._active_headers[alltd[i].getAttribute(\"active_id\")];\r\n\r\n\t if (byId && byId != obj.columnId) continue;\r\n\t var content = datafilter[obj.content];\r\n\r\n\t if (getOnly) {\r\n\t if (content.getValue) obj.value = content.getValue(alltd[i]);\r\n\t } else if (!cellTrackOnly || content.trackCells) {\r\n\t content.refresh(this, alltd[i], obj);\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t headerContent: [],\r\n\t _set_size_scroll_area: function _set_size_scroll_area(obj, height, hdx) {\r\n\t if (this._scrollSizeY) {\r\n\t obj.style.height = Math.max(height, 1) - 1 + \"px\";\r\n\t obj.style.width = (this._rightSplit ? 0 : hdx) + this._scrollSizeY - 1 + \"px\"; // temp. fix: Chrome [DIRTY]\r\n\r\n\t if (env.isWebKit) var w = obj.offsetWidth; //eslint-disable-line\r\n\t } else obj.style.display = \"none\";\r\n\t },\r\n\t _size_header_footer_fix: function _size_header_footer_fix() {\r\n\t if (this._settings.header) this._set_size_scroll_area(this._header_scroll, this._header_height, this._header_fix_width);\r\n\t if (this._settings.footer) this._set_size_scroll_area(this._footer_scroll, this._footer_height, this._header_fix_width);\r\n\t },\r\n\t _update_scroll: function _update_scroll() {\r\n\t var hasX = !(this._settings.autowidth || this._settings.scrollX === false);\r\n\t this._scrollSizeX = hasX ? env.scrollSize : 0;\r\n\t var hasY = !(this._settings.autoheight || this._settings.scrollY === false);\r\n\t this._scrollSizeY = hasY ? env.scrollSize : 0;\r\n\t if (env.touch) hasX = hasY = false;\r\n\r\n\t if (this._x_scroll) {\r\n\t this._x_scroll._settings.scrollSize = this._scrollSizeX;\r\n\t this._x_scroll._settings.scrollVisible = hasX;\r\n\t }\r\n\r\n\t if (this._y_scroll) {\r\n\t this._y_scroll._settings.scrollSize = this._scrollSizeY;\r\n\t this._y_scroll._settings.scrollVisible = hasY;\r\n\t }\r\n\t },\r\n\t _create_scrolls: function _create_scrolls() {\r\n\t this._scrollTop = 0;\r\n\t this._scrollLeft = 0;\r\n\t var scrx, scry;\r\n\t scrx = scry = 1;\r\n\t if (this._settings.autoheight || this._settings.scrollY === false) scry = this._scrollSizeY = 0;\r\n\t if (this._settings.autowidth || this._settings.scrollX === false) scrx = this._scrollSizeX = 0;\r\n\t if (env.touch) scrx = scry = 0;\r\n\r\n\t if (!this._x_scroll) {\r\n\t this._x_scroll = ui({\r\n\t view: \"vscroll\",\r\n\t container: this._footer.previousSibling,\r\n\t scrollWidth: this._dtable_width,\r\n\t scrollSize: this._scrollSizeX,\r\n\t scrollVisible: scrx\r\n\t }); //fix for scroll space on Mac\r\n\r\n\t if (scrx && !this._scrollSizeX && !env.$customScroll) this._x_scroll._viewobj.style.position = \"absolute\";\r\n\r\n\t this._x_scroll.attachEvent(\"onScroll\", bind(this._onscroll_x, this));\r\n\t }\r\n\r\n\t if (!this._y_scroll) {\r\n\t this._header_scroll = this._footer.nextSibling;\r\n\t var vscroll_view = this._header_scroll.nextSibling;\r\n\t this._footer_scroll = vscroll_view.nextSibling;\r\n\t this._y_scroll = ui({\r\n\t view: \"vscroll\",\r\n\t container: vscroll_view,\r\n\t scrollHeight: 100,\r\n\t scroll: \"y\",\r\n\t scrollSize: this._scrollSizeY,\r\n\t scrollVisible: scry\r\n\t });\r\n\r\n\t this._y_scroll.activeArea(this._body);\r\n\r\n\t this._x_scroll.activeArea(this._body, true);\r\n\r\n\t this._y_scroll.attachEvent(\"onScroll\", bind(this._onscroll_y, this));\r\n\t }\r\n\r\n\t if (this._content_width) this.callEvent(\"onResize\", [this._content_width, this._content_height]);\r\n\t if (env.$customScroll) CustomScroll.enable(this);\r\n\r\n\t this._create_scrolls = function () {};\r\n\t },\r\n\t columnId: function columnId(index$$1) {\r\n\t return this._columns[index$$1].id;\r\n\t },\r\n\t getColumnIndex: function getColumnIndex(id) {\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t if (this._columns[i].id == id) return i;\r\n\t }\r\n\r\n\t return -1;\r\n\t },\r\n\t _getNodeBox: function _getNodeBox(rid, cid) {\r\n\t var xs = 0,\r\n\t xe = 0,\r\n\t ye = 0,\r\n\t ys = 0;\r\n\t var i;\r\n\t var zone = 0;\r\n\r\n\t for (i = 0; i < this._columns.length; i++) {\r\n\t if (this._rightSplit == i || this._settings.leftSplit == i) {\r\n\t xs = 0;\r\n\t zone++;\r\n\t }\r\n\r\n\t if (this._columns[i].id == cid) break;\r\n\t xs += this._columns[i].width;\r\n\t }\r\n\r\n\t xe += this._columns[i].width;\r\n\r\n\t for (i = 0; i < this.data.order.length; i++) {\r\n\t if (this.data.order[i] == rid) break;\r\n\t ys += this._getHeightByIndex(i);\r\n\t }\r\n\r\n\t ye += this._getHeightByIndex(i);\r\n\t return [xs, xe, ys - this._scrollTop, ye, this._body.childNodes[zone]];\r\n\t },\r\n\t _id_to_string: function _id_to_string() {\r\n\t return this.row;\r\n\t },\r\n\t locate: function locate$$1(node, idOnly) {\r\n\t if (this._settings.subview && this != $$(node)) return null;\r\n\t node = node.target || node.srcElement || node;\r\n\r\n\t while (node && node.getAttribute) {\r\n\t if (node === this.$view) break;\r\n\r\n\t var cs = _getClassName(node).toString();\r\n\r\n\t var pos$$1 = null;\r\n\r\n\t if (cs.indexOf(\"webix_cell\") != -1) {\r\n\t pos$$1 = this._locate(node);\r\n\t if (pos$$1) pos$$1.row = this.data.order[pos$$1.rind];\r\n\t }\r\n\r\n\t if (cs.indexOf(\"webix_hcell\") != -1) {\r\n\t pos$$1 = this._locate(node);\r\n\t if (pos$$1) pos$$1.header = true;\r\n\t }\r\n\r\n\t if (pos$$1) {\r\n\t if (idOnly) return pos$$1.header ? null : pos$$1.row;\r\n\t pos$$1.column = this._columns[pos$$1.cind].id;\r\n\t pos$$1.toString = this._id_to_string;\r\n\t return pos$$1;\r\n\t }\r\n\r\n\t node = node.parentNode;\r\n\t }\r\n\r\n\t return null;\r\n\t },\r\n\t _locate: function _locate(node) {\r\n\t var cdiv = node.parentNode;\r\n\t if (!cdiv) return null;\r\n\t var column = (node.getAttribute(\"column\") || cdiv.getAttribute(\"column\")) * 1;\r\n\t var row = node.getAttribute(\"row\") || 0;\r\n\t var span = (node.getAttribute(\"colspan\") || cdiv.getAttribute(\"colspan\")) * 1;\r\n\t if (!row) for (var i = 0; i < cdiv.childNodes.length; i++) {\r\n\t if (cdiv.childNodes[i] == node) {\r\n\t if (i >= this._settings.topSplit) row = i + this._columns[column]._yr0 - this._settings.topSplit;else row = i;\r\n\t }\r\n\t }\r\n\t return {\r\n\t rind: row,\r\n\t cind: column,\r\n\t span: span\r\n\t };\r\n\t },\r\n\t _correctScrollSize: function _correctScrollSize() {\r\n\t var center = -this._center_width;\r\n\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t center += this._columns[i].width;\r\n\t }\r\n\r\n\t this._scrollLeft = Math.min(this._scrollLeft, Math.max(0, center));\r\n\t },\r\n\t _updateColsSizeSettings: function _updateColsSizeSettings(silent) {\r\n\t if (!this._dtable_fully_ready) return;\r\n\r\n\t this._correctScrollSize();\r\n\r\n\t this._set_columns_positions();\r\n\r\n\t this._set_split_sizes_x();\r\n\r\n\t this._render_header_and_footer();\r\n\r\n\t if (!silent) this._check_rendered_cols(false, false);\r\n\t },\r\n\t setColumnWidth: function setColumnWidth(col, width, skip_update) {\r\n\t return this._setColumnWidth(this.getColumnIndex(col), width, skip_update);\r\n\t },\r\n\t _setColumnWidth: function _setColumnWidth(col, width, skip_update, by_user) {\r\n\t if (isNaN(width) || col < 0) return;\r\n\t var column = this._columns[col];\r\n\t if (column.minWidth && width < column.minWidth) width = column.minWidth;else if (width < this._settings.minColumnWidth) width = this._settings.minColumnWidth;\r\n\t var old = column.width;\r\n\r\n\t if (old != width) {\r\n\t if (col >= this._settings.leftSplit && col < this._rightSplit) this._dtable_width += width - old;\r\n\t column.width = width;\r\n\t if (column.node) //method can be called from onStructLoad\r\n\t column.node.style.width = width + \"px\";else return false;\r\n\t if (!skip_update) this._updateColsSizeSettings();\r\n\t this.callEvent(\"onColumnResize\", [column.id, width, old, !!by_user]);\r\n\t return true;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t _getRowHeight: function _getRowHeight(row) {\r\n\t return (row.$height || this._settings.rowHeight) + (row.$subopen ? row.$subHeight : 0);\r\n\t },\r\n\t _getHeightByIndex: function _getHeightByIndex(index$$1) {\r\n\t var id = this.data.order[index$$1];\r\n\t if (!id) return this._settings.rowHeight;\r\n\t return this._getRowHeight(this.data.pull[id]);\r\n\t },\r\n\t _getHeightByIndexSumm: function _getHeightByIndexSumm(index1, index2) {\r\n\t if (this._settings.fixedRowHeight) return (index2 - index1) * this._settings.rowHeight;else {\r\n\t var summ = 0;\r\n\r\n\t for (; index1 < index2; index1++) {\r\n\t summ += this._getHeightByIndex(index1);\r\n\t }\r\n\r\n\t return summ;\r\n\t }\r\n\t },\r\n\t _cellPosition: function _cellPosition(row, column) {\r\n\t var top;\r\n\r\n\t if (arguments.length == 1) {\r\n\t column = row.column;\r\n\t row = row.row;\r\n\t }\r\n\r\n\t var item = this.getItem(row);\r\n\t var config = this.getColumnConfig(column);\r\n\t var left = 0;\r\n\t var parent = 0;\r\n\r\n\t for (var index$$1 = 0; index$$1 < this._columns.length; index$$1++) {\r\n\t if (index$$1 == this._settings.leftSplit || index$$1 == this._rightSplit) left = 0;\r\n\t var leftcolumn = this._columns[index$$1];\r\n\r\n\t if (leftcolumn.id == column) {\r\n\t var split_column = index$$1 < this._settings.leftSplit ? 0 : index$$1 >= this._rightSplit ? 2 : 1;\r\n\t parent = this._body.childNodes[split_column].firstChild;\r\n\t break;\r\n\t }\r\n\r\n\t left += leftcolumn.width;\r\n\t }\r\n\r\n\t if (this.getIndexById(row) < this._settings.topSplit) top = this._getHeightByIndexSumm(0, this.getIndexById(row));else top = this._getHeightByIndexSumm((this._render_scroll_top || 0) - this._settings.topSplit, this.getIndexById(row)) + (this._render_scroll_shift || 0);\r\n\t return {\r\n\t parent: parent,\r\n\t top: top,\r\n\t left: left,\r\n\t width: config.width,\r\n\t height: item.$height || this._settings.rowHeight\r\n\t };\r\n\t },\r\n\t _get_total_height: function _get_total_height() {\r\n\t var pager = this._settings.pager;\r\n\t var start = 0;\r\n\t var max = this.data.order.length;\r\n\r\n\t if (pager) {\r\n\t start = pager.size * pager.page;\r\n\t max = Math.min(max, start + pager.size);\r\n\r\n\t if (pager.level) {\r\n\t start = this.data.$min;\r\n\t max = this.data.$max;\r\n\t }\r\n\t }\r\n\r\n\t return this._getHeightByIndexSumm(start, max);\r\n\t },\r\n\t setRowHeight: function setRowHeight(rowId, height) {\r\n\t if (isNaN(height)) return;\r\n\t if (height < this._settings.minColumnHeight) height = this._settings.minColumnHeight;\r\n\t var item = this.getItem(rowId);\r\n\t var old_height = item.$height || this._settings.rowHeight;\r\n\r\n\t if (old_height != height) {\r\n\t item.$height = height;\r\n\t this.config.fixedRowHeight = false;\r\n\t this.render();\r\n\t this.callEvent(\"onRowResize\", [rowId, height, old_height]);\r\n\t }\r\n\t },\r\n\t _onscroll_y: function _onscroll_y(value) {\r\n\t var scrollChange = this._scrollTop !== value;\r\n\t this._scrollTop = value;\r\n\r\n\t if (!this._settings.prerender) {\r\n\t this._check_rendered_cols();\r\n\t } else {\r\n\t var conts = this._body.childNodes;\r\n\r\n\t for (var i = 0; i < conts.length; i++) {\r\n\t conts[i].scrollTop = value;\r\n\t }\r\n\t }\r\n\r\n\t if (env.$customScroll) CustomScroll._update_scroll(this._body);\r\n\r\n\t if (scrollChange) {\r\n\t this.callEvent(\"onScrollY\", []);\r\n\t this.callEvent(\"onAfterScroll\", []);\r\n\t }\r\n\t },\r\n\t _setLeftScroll: function _setLeftScroll(value) {\r\n\t this._body.childNodes[1].scrollLeft = this._scrollLeft = value;\r\n\t if (this._settings.header) this._header.childNodes[1].scrollLeft = value;\r\n\t if (this._settings.footer) this._footer.childNodes[1].scrollLeft = value;\r\n\t },\r\n\t _onscroll_x: function _onscroll_x(value) {\r\n\t var scrollChange = this._scrollLeft !== value;\r\n\r\n\t this._setLeftScroll(value);\r\n\r\n\t if (this._settings.prerender === false) this._check_rendered_cols(this._minimize_dom_changes ? false : true);\r\n\t if (env.$customScroll) CustomScroll._update_scroll(this._body);\r\n\r\n\t if (scrollChange) {\r\n\t this.callEvent(\"onScrollX\", []);\r\n\t this.callEvent(\"onAfterScroll\", []);\r\n\t }\r\n\t },\r\n\t _get_x_range: function _get_x_range(full) {\r\n\t if (full) return [0, this._columns.length];\r\n\t var t = this._scrollLeft;\r\n\t var xind = this._settings.leftSplit;\r\n\r\n\t while (t > 0 && this._columns.length - 1 > xind) {\r\n\t t -= this._columns[xind].width;\r\n\t xind++;\r\n\t }\r\n\r\n\t var xend = xind;\r\n\t if (t && xind > 0) xind--;\r\n\t t += this._center_width;\r\n\r\n\t while (t > 0 && xend < this._rightSplit) {\r\n\t t -= this._columns[xend].width;\r\n\t xend++;\r\n\t }\r\n\r\n\t return [xind, xend];\r\n\t },\r\n\t getVisibleCount: function getVisibleCount() {\r\n\t return Math.floor(this._dtable_offset_height / this.config.rowHeight);\r\n\t },\r\n\t //returns info about y-scroll position\r\n\t _get_y_range: function _get_y_range(full) {\r\n\t var t = this._scrollTop;\r\n\t var start = 0;\r\n\t var end = this.count(); //apply pager, if defined\r\n\r\n\t var pager = this._settings.pager;\r\n\r\n\t if (pager) {\r\n\t start = pager.page * pager.size;\r\n\t end = Math.min(end, start + pager.size);\r\n\r\n\t if (pager.level) {\r\n\t start = this.data.$min;\r\n\t end = this.data.$max;\r\n\t }\r\n\t } //in case of autoheight - request full rendering\r\n\r\n\r\n\t if (this._settings.autoheight) return [start, end, 0];\r\n\t if (full) return [start, end, 0];\r\n\t var xind = start;\r\n\t var topSplit = this._settings.topSplit || 0;\r\n\t if (topSplit) xind += topSplit;\r\n\t var rowHeight = this._settings.fixedRowHeight ? this._settings.rowHeight : 0;\r\n\r\n\t if (rowHeight) {\r\n\t var dep = Math.ceil(t / rowHeight);\r\n\t t -= dep * rowHeight;\r\n\t xind += dep;\r\n\t } else while (t > 0) {\r\n\t t -= this._getHeightByIndex(xind);\r\n\t xind++;\r\n\t } //how much of the first cell is scrolled out\r\n\r\n\r\n\t var xdef = xind > 0 && t ? -(this._getHeightByIndex(xind - 1) + t) : 0;\r\n\t var xend = xind;\r\n\t if (t) xind--;\r\n\t t += (this._dtable_offset_height || this._content_height) - (this._top_split_height || 0);\r\n\r\n\t if (rowHeight) {\r\n\t var _dep = Math.ceil(t / rowHeight);\r\n\r\n\t t -= _dep * rowHeight;\r\n\t xend += _dep;\r\n\t } else {\r\n\t while (t > 0 && xend < end) {\r\n\t t -= this._getHeightByIndex(xend);\r\n\t xend++;\r\n\t }\r\n\t }\r\n\r\n\t if (xend > end) xend = end;\r\n\t return [xind, xend, xdef];\r\n\t },\r\n\t _repaint_single_row: function _repaint_single_row(id) {\r\n\t var item = this.getItem(id);\r\n\t var rowindex = this.getIndexById(id);\r\n\r\n\t var state = this._get_y_range();\r\n\r\n\t var freeze = this.config.topSplit;\r\n\t var freezeCss = \"\";\r\n\r\n\t if (rowindex >= freeze) {\r\n\t //row not visible\r\n\t if (rowindex < state[0] || rowindex >= state[1]) return;\r\n\t rowindex -= state[0] - freeze;\r\n\t } else {\r\n\t freezeCss = rowindex == freeze - 1 ? \" webix_topcell webix_last_topcell\" : \" webix_topcell\";\r\n\t } //get visible column\r\n\r\n\r\n\t var x_range = this._get_x_range();\r\n\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t var column = this._columns[i]; //column not visible\r\n\r\n\t if (i < this._rightSplit && i >= this._settings.leftSplit && (i < x_range[0] || i > x_range[1])) column._yr0 = -999; //ensure that column will not be reused\r\n\r\n\t if (column.attached && column.node) {\r\n\t var node = column.node.childNodes[rowindex];\r\n\t if (!node) continue;\r\n\r\n\t var value = this._getValue(item, this._columns[i], 0);\r\n\r\n\t node.innerHTML = value;\r\n\t node.className = this._getCss(this._columns[i], value, item, id) + freezeCss;\r\n\t }\r\n\t }\r\n\t },\r\n\t _check_rendered_cols: function _check_rendered_cols(x_scroll, force) {\r\n\t if (!this._columns.length) return;\r\n\t if (force) this._clearColumnCache();\r\n\r\n\t var xr = this._get_x_range(this._settings.prerender);\r\n\r\n\t var yr = this._get_y_range(this._settings.prerender === true);\r\n\r\n\t if (x_scroll) {\r\n\t for (var i = this._settings.leftSplit; i < xr[0]; i++) {\r\n\t this._hideColumn(i, force);\r\n\t }\r\n\r\n\t for (var _i6 = xr[1]; _i6 < this._rightSplit; _i6++) {\r\n\t this._hideColumn(_i6, force);\r\n\t }\r\n\t }\r\n\r\n\t this._render_full_rows = [];\r\n\r\n\t for (var _i7 = 0; _i7 < this._settings.leftSplit; _i7++) {\r\n\t this._renderColumn(_i7, yr, force);\r\n\t }\r\n\r\n\t for (var _i8 = xr[0]; _i8 < xr[1]; _i8++) {\r\n\t this._renderColumn(_i8, yr, force, _i8 == xr[0]);\r\n\t }\r\n\r\n\t for (var _i9 = this._rightSplit; _i9 < this._columns.length; _i9++) {\r\n\t this._renderColumn(_i9, yr, force);\r\n\t }\r\n\r\n\t this._check_and_render_full_rows(yr[0], yr[1], force);\r\n\r\n\t this._check_load_next(yr);\r\n\t },\r\n\t _delete_full_rows: function _delete_full_rows(start, end) {\r\n\t this._rows_cache_start = start;\r\n\t this._rows_cache_end = end;\r\n\t remove(this._rows_cache);\r\n\t this._rows_cache = [];\r\n\t },\r\n\t _adjust_rows: function _adjust_rows() {\r\n\t if (this._settings.prerender && this._rows_body) {\r\n\t var state = this.getScrollState();\r\n\t this._rows_body.style.top = \"-\" + (state.y || 0) + \"px\";\r\n\t }\r\n\t },\r\n\t _check_and_render_full_rows: function _check_and_render_full_rows(start, end, force) {\r\n\t if (this._rows_body) this._rows_body.style.top = this._render_scroll_shift + \"px\";\r\n\r\n\t if (!force && start == this._rows_cache_start && end == this._rows_cache_end) {\r\n\t if (this.config.topSplit) {\r\n\t //don't move split rows\r\n\t for (var i = 0; i < this._render_full_rows.length; i++) {\r\n\t var row = this._rows_cache[i];\r\n\r\n\t if (this._render_full_rows[i].index < this.config.topSplit) {\r\n\t row.style.top = this._render_full_rows[i].top - this._render_scroll_shift + \"px\";\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return;\r\n\t }\r\n\r\n\t this._delete_full_rows(start, end);\r\n\r\n\t if (this._render_full_row_some) this._render_full_row_some = false;else return;\r\n\r\n\t for (var _i10 = 0; _i10 < this._render_full_rows.length; _i10++) {\r\n\t var info = this._render_full_rows[_i10];\r\n\t var item = this.getItem(info.id);\r\n\t var value;\r\n\r\n\t if (typeof item.$row == \"function\") {\r\n\t value = item.$row.call(this, item, this.type);\r\n\t } else {\r\n\t value = this._getValue(item, this.getColumnConfig(item.$row), _i10);\r\n\t }\r\n\r\n\t var _row = this._rows_cache[_i10] = create(\"DIV\", null, value);\r\n\r\n\t _row.className = \"webix_cell \" + (item.$sub ? \"webix_dtable_sub\" + (this._settings.subview ? \"view\" : \"row\") : \"webix_dtable_colrow\" + (item.$row ? \" webix_topcell\" + (this.data.getMark(item.id, \"webix_selected\") ? \" webix_selected\" : \"\") : \"\"));\r\n\r\n\t _row.setAttribute(\"column\", 0);\r\n\r\n\t _row.setAttribute(\"row\", info.index);\r\n\r\n\t var height = item.$height || this._settings.rowHeight;\r\n\t if (item.$subopen) _row.style.height = item.$subHeight + \"px\";else _row.style.height = height + \"px\";\r\n\t _row.style.paddingRight = env.scrollSize + \"px\";\r\n\t var topDelta = this._render_full_rows[_i10].index < this.config.topSplit ? -this._render_scroll_shift : 0;\r\n\t _row.style.top = topDelta + info.top + (item.$subopen ? height - 1 : 0) + \"px\";\r\n\r\n\t if (!this._rows_body) {\r\n\t this._rows_body = create(\"DIV\");\r\n\t this._rows_body.style.position = \"relative\";\r\n\t this._rows_body.style.top = this._render_scroll_shift + \"px\";\r\n\r\n\t this._body.appendChild(this._rows_body);\r\n\t }\r\n\r\n\t this._rows_body.appendChild(_row);\r\n\r\n\t this.attachEvent(\"onSyncScroll\", function (x, y, t) {\r\n\t Touch._set_matrix(this._rows_body, 0, y, t);\r\n\t });\r\n\t if (this._settings.subview) this.callEvent(\"onSubViewRender\", [item, _row]);\r\n\t }\r\n\t },\r\n\t _check_load_next: function _check_load_next(yr) {\r\n\t var paging = this._settings.pager;\r\n\t var fetch = this._settings.datafetch;\r\n\t var direction = !this._last_valid_render_pos || yr[0] >= this._last_valid_render_pos;\r\n\t this._last_valid_render_pos = yr[0];\r\n\r\n\t if (this._data_request_flag) {\r\n\t if (paging && (!fetch || fetch >= paging.size)) if (this._check_rows([0, paging.size * paging.page], Math.max(fetch, paging.size), true)) return this._data_request_flag = null;\r\n\r\n\t this._run_load_next(this._data_request_flag, direction);\r\n\r\n\t this._data_request_flag = null;\r\n\t } else {\r\n\t if (this._settings.loadahead) this._check_rows(yr, this._settings.loadahead, direction);\r\n\t }\r\n\t },\r\n\t _check_rows: function _check_rows(view, count, dir) {\r\n\t var start = view[1];\r\n\t var end = start + count;\r\n\r\n\t if (!dir) {\r\n\t start = view[0] - count;\r\n\t end = view[0];\r\n\t }\r\n\r\n\t if (start < 0) start = 0;\r\n\t end = Math.min(end, this.data.order.length - 1);\r\n\t var result = false;\r\n\r\n\t for (var i = start; i < end; i++) {\r\n\t if (!this.data.order[i]) {\r\n\t if (!result) result = {\r\n\t start: i,\r\n\t count: end - start\r\n\t };else {\r\n\t result.last = i;\r\n\t result.count = i - start;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (result) {\r\n\t this._run_load_next(result, dir);\r\n\r\n\t return true;\r\n\t }\r\n\t },\r\n\t _run_load_next: function _run_load_next(conf, direction) {\r\n\t var count = Math.max(conf.count, this._settings.datafetch || this._settings.loadahead || 0);\r\n\t var start = direction ? conf.start : conf.last - count + 1;\r\n\t if (this._maybe_loading_already(conf.count, conf.start)) return;\r\n\t this.loadNext(count, start);\r\n\t },\r\n\t // necessary for safari only\r\n\t _preserveScrollTarget: function _preserveScrollTarget(columnNode) {\r\n\t if (env.isSafari) {\r\n\t var i,\r\n\t node,\r\n\t newNode,\r\n\t scroll,\r\n\t dir = [this._x_scroll, this._y_scroll];\r\n\r\n\t for (i = 0; i < 2; i++) {\r\n\t scroll = dir[i];\r\n\r\n\t if (scroll && scroll._scroll_trg && scroll._scroll_trg.parentNode == columnNode) {\r\n\t node = scroll._scroll_trg;\r\n\t }\r\n\t }\r\n\r\n\t if (node) {\r\n\t if (this._scrollWheelTrg) remove(this._scrollWheelTrg);\r\n\t this._scrollWheelTrg = node;\r\n\t newNode = node.cloneNode(true); // required for _hideColumn\r\n\r\n\t node.parentNode.insertBefore(newNode, node);\r\n\t this._scrollWheelTrg.style.display = \"none\";\r\n\r\n\t this._body.appendChild(this._scrollWheelTrg);\r\n\t }\r\n\t }\r\n\t },\r\n\t _hideColumn: function _hideColumn(index$$1) {\r\n\t var col = this._columns[index$$1]; // preserve target node for Safari wheel event\r\n\r\n\t this._preserveScrollTarget(col.node);\r\n\r\n\t remove(col.node);\r\n\t col.attached = false;\r\n\t },\r\n\t _clearColumnCache: function _clearColumnCache() {\r\n\t for (var i = 0; i < this._columns.length; i++) {\r\n\t this._columns[i]._yr0 = -1;\r\n\t }\r\n\r\n\t if (this._rows_cache.length) {\r\n\t remove(this._rows_cache);\r\n\t this._rows_cache = [];\r\n\t }\r\n\t },\r\n\t getText: function getText(row_id, column_id) {\r\n\t return this._getValue(this.getItem(row_id), this.getColumnConfig(column_id), 0);\r\n\t },\r\n\t getCss: function getCss(row_id, column_id) {\r\n\t var item = this.getItem(row_id);\r\n\t return this._getCss(this.getColumnConfig(column_id), item[column_id], item, row_id);\r\n\t },\r\n\t _getCss: function _getCss(config, value, item, id) {\r\n\t var css = \"webix_cell\";\r\n\r\n\t if (config.cssFormat) {\r\n\t var per_css = config.cssFormat(value, item, id, config.id);\r\n\r\n\t if (per_css) {\r\n\t if (_typeof(per_css) == \"object\") css += \" \" + createCss(per_css);else css += \" \" + per_css;\r\n\t }\r\n\t }\r\n\r\n\t var row_css = item.$css;\r\n\r\n\t if (row_css) {\r\n\t if (_typeof(row_css) == \"object\") item.$css = row_css = createCss(row_css);\r\n\t css += \" \" + row_css;\r\n\t }\r\n\r\n\t var mark = this.data._marks[id];\r\n\r\n\t if (mark) {\r\n\t if (mark.$css) css += \" \" + mark.$css;\r\n\r\n\t if (mark.$cellCss) {\r\n\t var mark_marker = mark.$cellCss[config.id];\r\n\t if (mark_marker) css += \" \" + mark_marker;\r\n\t }\r\n\t }\r\n\r\n\t if (item.$cellCss) {\r\n\t var css_marker = item.$cellCss[config.id];\r\n\r\n\t if (css_marker) {\r\n\t if (_typeof(css_marker) == \"object\") css_marker = createCss(css_marker);\r\n\t css += \" \" + css_marker;\r\n\t }\r\n\t } //cell-selection\r\n\r\n\r\n\t var selected = this.data.getMark(item.id, \"webix_selected\");\r\n\t if (selected && (selected.$row || selected[config.id]) || config.$selected) css += this._select_css;\r\n\t return css;\r\n\t },\r\n\t _getValue: function _getValue(item, config, i) {\r\n\t if (!item) return \"\";\r\n\t var value;\r\n\t value = item[config.id];\r\n\t if (value === undefined || value === null) value = \"\";\r\n\t if (config.format) value = config.format(value);\r\n\t if (config.template) value = config.template(item, this.type, value, config, i);\r\n\t return value;\r\n\t },\r\n\t //we don't use render-stack, but still need a place for common helpers\r\n\t //so creating a simple \"type\" holder\r\n\t type: {\r\n\t checkbox: function checkbox(obj, common, value, config) {\r\n\t var checked = value == config.checkValue ? \"checked=\\\"true\\\"\" : \"\";\r\n\t return \"\";\r\n\t },\r\n\t radio: function radio(obj, common, value, config) {\r\n\t var checked = value == config.checkValue ? \"checked=\\\"true\\\"\" : \"\";\r\n\t return \"\";\r\n\t },\r\n\t editIcon: function editIcon() {\r\n\t return \"\";\r\n\t },\r\n\t trashIcon: function trashIcon() {\r\n\t return \"\";\r\n\t }\r\n\t },\r\n\t type_setter: function type_setter(value) {\r\n\t if (!this.types || !this.types[value]) type(this, value);else {\r\n\t this.type = clone(this.types[value]);\r\n\t if (this.type.css) this._contentobj.className += \" \" + this.type.css;\r\n\t }\r\n\t if (this.type.on_click) exports.extend(this.on_click, this.type.on_click);\r\n\t return value;\r\n\t },\r\n\t _renderColumn: function _renderColumn(index$$1, yr, force, single$$1) {\r\n\t var col = this._columns[index$$1];\r\n\r\n\t if (!col.attached) {\r\n\t var split_column = index$$1 < this._settings.leftSplit ? 0 : index$$1 >= this._rightSplit ? 2 : 1;\r\n\r\n\t this._body.childNodes[split_column].firstChild.appendChild(col.node);\r\n\r\n\t col.attached = true;\r\n\t col.split = split_column;\r\n\t }\r\n\r\n\t this._render_scroll_top = yr[0];\r\n\t this._render_scroll_shift = 0;\r\n\t this._render_scroll_diff = yr[2]; //if columns not aligned during scroll - set correct scroll top value for each column\r\n\r\n\t if (this._settings.scrollAlignY) {\r\n\t if (yr[1] == this.data.order.length || this.data.$pagesize && yr[1] % this.data.$pagesize === 0) {\r\n\t col.node.style.top = (this._render_scroll_shift = yr[2]) + \"px\";\r\n\t } else if (col._yr2) col.node.style.top = \"0px\";\r\n\t } else {\r\n\t this._render_scroll_shift = yr[2];\r\n\t col.node.style.top = yr[2] + \"px\";\r\n\t }\r\n\r\n\t if (!force && col._yr0 == yr[0] && col._yr1 == yr[1] && (!this._settings.topSplit || col._render_scroll_shift == this._render_scroll_shift)) return 0;\r\n\t var html = \"\";\r\n\t var config = this._settings.columns[index$$1];\r\n\t var state = {\r\n\t row: this._settings.rowHeight,\r\n\t total: 0,\r\n\t single: single$$1\r\n\t };\r\n\r\n\t for (var i = 0; i < this._settings.topSplit; i++) {\r\n\t html += this._render_single_cell(i, config, yr, state, -this._render_scroll_shift);\r\n\t } // ignore not available rows in top-split area\r\n\r\n\r\n\t this._data_request_flag = null;\r\n\r\n\t for (var _i11 = Math.max(yr[0], this._settings.topSplit); _i11 < yr[1]; _i11++) {\r\n\t html += this._render_single_cell(_i11, config, yr, state, -1);\r\n\t } // preserve target node for Safari wheel event\r\n\r\n\r\n\t this._preserveScrollTarget(col.node);\r\n\r\n\t col.node.innerHTML = html;\r\n\t col._yr0 = yr[0];\r\n\t col._yr1 = yr[1];\r\n\t col._yr2 = yr[2];\r\n\t col._render_scroll_shift = this._render_scroll_shift;\r\n\t return 1;\r\n\t },\r\n\t _render_single_cell: function _render_single_cell(i, config, yr, state, top) {\r\n\t var id = this.data.order[i];\r\n\t var item = this.data.getItem(id);\r\n\t var html = \"\";\r\n\r\n\t if (item) {\r\n\t var aria = \" role='gridcell' aria-rowindex='\" + (i + 1) + \"' aria-colindex='\" + (this.getColumnIndex(config.id) + 1) + \"'\" + (item.$count || item.$sub ? \" aria-expanded='\" + (item.open || item.$subopen ? \"true\" : \"false\") + \"'\" : \"\") + (item.$level ? \" aria-level='\" + item.$level + \"'\" : \"\");\r\n\r\n\t if (state.single && item.$row) {\r\n\t this._render_full_row_some = true;\r\n\r\n\t this._render_full_rows.push({\r\n\t top: state.total,\r\n\t id: item.id,\r\n\t index: i\r\n\t });\r\n\r\n\t if (!item.$sub) {\r\n\t var rowHeight = item.$height || state.row;\r\n\t state.total += rowHeight;\r\n\t return \"
    \";\r\n\t }\r\n\t }\r\n\r\n\t var value = this._getValue(item, config, i);\r\n\r\n\t var css = this._getCss(config, value, item, id);\r\n\r\n\t if (css.indexOf(\"select\") !== -1) aria += \" aria-selected='true' tabindex='0'\";\r\n\t var isOpen = !!item.$subopen;\r\n\t var margin = isOpen ? \"margin-bottom:\" + item.$subHeight + \"px;\" : \"\";\r\n\r\n\t if (top >= 0) {\r\n\t if (top > 0) margin += \"top:\" + top + \"px;'\";\r\n\t css = \"webix_topcell \" + css;\r\n\t if (i == this._settings.topSplit - 1) css = \"webix_last_topcell \" + css;\r\n\t }\r\n\r\n\t if (item.$height) {\r\n\t html = \"\" + value + \"
    \";\r\n\t state.total += item.$height - state.row;\r\n\t } else {\r\n\t html = \"\" + value + \"\";\r\n\t }\r\n\r\n\t if (isOpen) state.total += item.$subHeight;\r\n\t } else {\r\n\t html = \"
    \";\r\n\t if (!this._data_request_flag) this._data_request_flag = {\r\n\t start: i,\r\n\t count: yr[1] - i\r\n\t };else this._data_request_flag.last = i;\r\n\t }\r\n\r\n\t state.total += state.row;\r\n\t return html;\r\n\t },\r\n\t _set_split_sizes_y: function _set_split_sizes_y() {\r\n\t if (!this._columns.length || isNaN(this._content_height * 1)) return;\r\n\t debug_size_box(this, [\"y-sizing\"], true);\r\n\t var wanted_height = this._dtable_height + (this._scrollSizeX ? this._scrollSizeX : 0);\r\n\t if ((this._settings.autoheight || this._settings.yCount) && this.resize()) return;\r\n\r\n\t this._y_scroll.sizeTo(this._content_height, this._header_height, this._footer_height);\r\n\r\n\t this._y_scroll.define(\"scrollHeight\", wanted_height);\r\n\r\n\t this._top_split_height = this._settings.topSplit ? this._getHeightByIndexSumm(0, this._settings.topSplit) : 0;\r\n\t this._dtable_offset_height = Math.max(0, this._content_height - this._scrollSizeX - this._header_height - this._footer_height);\r\n\r\n\t for (var i = 0; i < 3; i++) {\r\n\t this._body.childNodes[i].style.height = this._dtable_offset_height + \"px\";\r\n\t if (this._settings.prerender) this._body.childNodes[i].firstChild.style.height = this._dtable_height + \"px\";else this._body.childNodes[i].firstChild.style.height = this._dtable_offset_height + \"px\";\r\n\t } //prevent float overflow, when we have split and very small\r\n\r\n\r\n\t this._header.style.height = this._header_height + \"px\";\r\n\t },\r\n\t _set_split_sizes_x: function _set_split_sizes_x() {\r\n\t if (!this._columns.length) return;\r\n\t var index$$1 = 0;\r\n\t this._left_width = 0;\r\n\t this._right_width = 0;\r\n\t this._center_width = 0;\r\n\r\n\t while (index$$1 < this._settings.leftSplit) {\r\n\t this._left_width += this._columns[index$$1].width;\r\n\t index$$1++;\r\n\t }\r\n\r\n\t index$$1 = this._columns.length - 1;\r\n\r\n\t while (index$$1 >= this._rightSplit) {\r\n\t this._right_width += this._columns[index$$1].width;\r\n\t index$$1--;\r\n\t }\r\n\r\n\t if (!this._content_width) return;\r\n\t if (this._settings.autowidth && this.resize()) return;\r\n\t this._center_width = this._content_width - this._right_width - this._left_width - this._scrollSizeY;\r\n\t this._body.childNodes[1].firstChild.style.width = this._dtable_width + \"px\";\r\n\t this._body.childNodes[0].style.width = this._left_width + \"px\";\r\n\t this._body.childNodes[1].style.width = this._center_width + \"px\";\r\n\t this._body.childNodes[2].style.width = this._right_width + \"px\";\r\n\t this._header.childNodes[0].style.width = this._left_width + \"px\";\r\n\t this._header.childNodes[1].style.width = this._center_width + \"px\";\r\n\t this._header.childNodes[2].style.width = this._right_width + \"px\";\r\n\t this._footer.childNodes[0].style.width = this._left_width + \"px\";\r\n\t this._footer.childNodes[1].style.width = this._center_width + \"px\";\r\n\t this._footer.childNodes[2].style.width = this._right_width + \"px\";\r\n\t var delta = this._center_width - this._dtable_width;\r\n\t if (delta < 0) delta = 0; //negative header space has not sense\r\n\r\n\t if (delta != this._header_fix_width) {\r\n\t this._header_fix_width = delta;\r\n\r\n\t this._size_header_footer_fix();\r\n\t } // temp. fix: Chrome [DIRTY]\r\n\r\n\r\n\t if (env.isWebKit) {\r\n\t var w = this._body.childNodes[0].offsetWidth; //eslint-disable-line\r\n\r\n\t w = this._body.childNodes[1].offsetWidth;\r\n\t w = this._body.childNodes[1].firstChild.offsetWidth;\r\n\t w = this._body.childNodes[2].offsetWidth;\r\n\t }\r\n\r\n\t this._x_scroll.sizeTo(this._content_width - this._scrollSizeY);\r\n\r\n\t this._x_scroll.define(\"scrollWidth\", this._dtable_width + this._left_width + this._right_width);\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t if ((this._settings.autoheight || this._settings.yCount) && this._settings.columns) {\r\n\t //if limit set - use it\r\n\t var desired = (this._settings.yCount || 0) * this._settings.rowHeight; //else try to use actual rendered size\r\n\t //if component invisible - this is not valid, so fallback to all rows\r\n\r\n\t if (!desired) desired = this.isVisible() ? this._dtable_height : this.count() * this._settings.rowHeight; //add scroll and check minHeight limit\r\n\r\n\t this._settings.height = Math.max(desired + (this._scrollSizeX ? this._scrollSizeX : 0) - 1, this._settings.minHeight || 0) + this._header_height + this._footer_height;\r\n\t }\r\n\r\n\t if (this._settings.autowidth && this._settings.columns) this._settings.width = Math.max(this._dtable_width + this._left_width + this._right_width + this._scrollSizeY, this._settings.minWidth || 0);\r\n\t var minwidth = this._left_width + this._right_width + this._scrollSizeY;\r\n\t var sizes = base.api.$getSize.call(this, dx, dy);\r\n\t sizes[0] = Math.max(sizes[0] || minwidth);\r\n\t return sizes;\r\n\t },\r\n\t _restore_scroll_state: function _restore_scroll_state() {\r\n\t if (this._x_scroll && !env.touch) {\r\n\t var state = this.getScrollState();\r\n\t this._x_scroll._last_scroll_pos = this._y_scroll._last_scroll_pos = -1;\r\n\t this.scrollTo(state.x, state.y);\r\n\t }\r\n\t },\r\n\t $setSize: function $setSize() {\r\n\t var oldw = this._content_width;\r\n\t var oldh = this._content_height;\r\n\r\n\t if (base.api.$setSize.apply(this, arguments)) {\r\n\t if (this._dtable_fully_ready) {\r\n\t this.callEvent(\"onResize\", [this._content_width, this._content_height, oldw, oldh]);\r\n\r\n\t this._set_split_sizes_x();\r\n\r\n\t this._set_split_sizes_y();\r\n\t }\r\n\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t _on_header_click: function _on_header_click(column) {\r\n\t var col = this.getColumnConfig(column);\r\n\t if (!col.sort) return;\r\n\t var order = \"asc\";\r\n\t if (col.id == this._last_sorted) order = this._last_order == \"asc\" ? \"desc\" : \"asc\";\r\n\r\n\t this._sort(col.id, order, col.sort);\r\n\t },\r\n\t markSorting: function markSorting(column, order) {\r\n\t if (!this._sort_sign) this._sort_sign = create(\"DIV\");\r\n\t var parent = this._sort_sign.parentNode;\r\n\r\n\t if (parent) {\r\n\t parent.removeAttribute(\"aria-sort\");\r\n\t parent.removeAttribute(\"tabindex\");\r\n\t }\r\n\r\n\t remove(this._sort_sign);\r\n\r\n\t if (order) {\r\n\t var cell = this._get_header_cell(this.getColumnIndex(column));\r\n\r\n\t if (cell) {\r\n\t this._sort_sign.className = \"webix_ss_sort_\" + order;\r\n\t cell.style.position = \"relative\";\r\n\t cell.appendChild(this._sort_sign);\r\n\t cell.setAttribute(\"aria-sort\", order + \"ending\");\r\n\t cell.setAttribute(\"tabindex\", \"0\");\r\n\t }\r\n\r\n\t this._last_sorted = column;\r\n\t this._last_order = order;\r\n\t } else {\r\n\t this._last_sorted = this._last_order = null;\r\n\t }\r\n\t },\r\n\t scroll_setter: function scroll_setter(mode) {\r\n\t if (typeof mode == \"string\") {\r\n\t this._settings.scrollX = mode.indexOf(\"x\") != -1;\r\n\t this._settings.scrollY = mode.indexOf(\"y\") != -1;\r\n\t return mode;\r\n\t } else return this._settings.scrollX = this._settings.scrollY = mode;\r\n\t },\r\n\t _get_header_cell: function _get_header_cell(column) {\r\n\t var cells = this._header.getElementsByTagName(\"TD\");\r\n\r\n\t var maybe = null;\r\n\r\n\t for (var i = 0; i < cells.length; i++) {\r\n\t if (cells[i].getAttribute(\"column\") == column && !cells[i].getAttribute(\"active_id\")) {\r\n\t maybe = cells[i].firstChild;\r\n\t if ((cells[i].colSpan || 0) < 2) return maybe;\r\n\t }\r\n\t }\r\n\r\n\t return maybe;\r\n\t },\r\n\t _sort: function _sort(col_id, direction, type$$1) {\r\n\t direction = direction || \"asc\";\r\n\t this.markSorting(col_id, direction);\r\n\r\n\t if (type$$1 == \"server\") {\r\n\t this.callEvent(\"onBeforeSort\", [col_id, direction, type$$1]);\r\n\t this.loadNext(0, 0, {\r\n\t before: function before() {\r\n\t this.clearAll(true);\r\n\t },\r\n\t success: function success() {\r\n\t this.callEvent(\"onAfterSort\", [col_id, direction, type$$1]);\r\n\t }\r\n\t }, 0, 1);\r\n\t } else {\r\n\t if (type$$1 == \"text\") {\r\n\t this.data.each(function (obj) {\r\n\t obj.$text = this.getText(obj.id, col_id);\r\n\t }, this);\r\n\t type$$1 = \"string\";\r\n\t col_id = \"$text\";\r\n\t }\r\n\r\n\t if (typeof type$$1 == \"function\") this.data.sort(type$$1, direction);else this.data.sort(col_id, direction, type$$1 || \"string\");\r\n\t }\r\n\t },\r\n\t _mouseEventCall: function _mouseEventCall(css_call, e, id, trg) {\r\n\t var functor, i, res;\r\n\r\n\t if (css_call.length) {\r\n\t for (i = 0; i < css_call.length; i++) {\r\n\t functor = toFunctor(css_call[i], this.$scope);\r\n\t res = functor.call(this, e, id, trg);\r\n\t if (res === false) return false;\r\n\t }\r\n\t }\r\n\t },\r\n\t //because we using non-standard rendering model, custom logic for mouse detection need to be used\r\n\t _mouseEvent: function _mouseEvent(e, hash, name, pair) {\r\n\t e = e || event;\r\n\t var trg = e.target || e.srcElement;\r\n\t if (this._settings.subview && this != $$(trg)) return; //define some vars, which will be used below\r\n\r\n\t var css = \"\",\r\n\t css_call = [],\r\n\t found = false,\r\n\t id = null,\r\n\t res; //loop through all parents\r\n\r\n\t while (trg && trg.parentNode && trg != this._viewobj.parentNode) {\r\n\t var trgCss = _getClassName(trg);\r\n\r\n\t if (css = trgCss) {\r\n\t css = css.toString().split(\" \");\r\n\r\n\t for (var i = css.length - 1; i >= 0; i--) {\r\n\t if (hash[css[i]]) css_call.push(hash[css[i]]);\r\n\t }\r\n\t }\r\n\r\n\t if (trg.parentNode.getAttribute && !id) {\r\n\t var column = trg.parentNode.getAttribute(\"column\") || trg.getAttribute(\"column\");\r\n\r\n\t if (column) {\r\n\t //we need to ignore TD - which is header|footer\r\n\t var isBody = trg.parentNode.tagName == \"DIV\"; //column already hidden or removed\r\n\r\n\t if (!this._columns[column]) return;\r\n\t found = true;\r\n\r\n\t if (isBody) {\r\n\t var index$$1 = trg.parentNode.getAttribute(\"row\") || trg.getAttribute(\"row\");\r\n\r\n\t if (!index$$1) {\r\n\t //click event occurs on column holder, we can't detect cell\r\n\t if (trg.getAttribute(\"column\")) return;\r\n\t index$$1 = index(trg);\r\n\t if (index$$1 >= this._settings.topSplit) index$$1 += this._columns[column]._yr0 - this._settings.topSplit;\r\n\t }\r\n\r\n\t this._item_clicked = id = {\r\n\t row: this.data.order[index$$1],\r\n\t column: this._columns[column].id\r\n\t };\r\n\t id.toString = this._id_to_string;\r\n\t } else this._item_clicked = id = {\r\n\t column: this._columns[column].id\r\n\t }; //some custom css handlers was found\r\n\r\n\r\n\t res = this._mouseEventCall(css_call, e, id, trg);\r\n\t if (res === false) return; //call inner handler\r\n\r\n\t if (isBody) {\r\n\t if (this.callEvent(\"on\" + name, [id, e, trg]) && pair) {\r\n\t this.callEvent(\"on\" + pair, [id, e, trg]);\r\n\t }\r\n\t } else if (name == \"ItemClick\") {\r\n\t var isHeader = trg.parentNode.parentNode.getAttribute(\"section\") == \"header\";\r\n\t if (isHeader && this.callEvent(\"onHeaderClick\", [id, e, trg])) this._on_header_click(id.column);\r\n\t }\r\n\r\n\t css_call = [];\r\n\t }\r\n\t }\r\n\r\n\t trg = trg.parentNode;\r\n\t }\r\n\r\n\t this._mouseEventCall(css_call, e, id, this.$view);\r\n\r\n\t return found; //returns true if item was located and event was triggered\r\n\t },\r\n\t showOverlay: function showOverlay(message) {\r\n\t if (!this._datatable_overlay) {\r\n\t var t = create(\"DIV\", {\r\n\t \"class\": \"webix_overlay\"\r\n\t }, \"\");\r\n\r\n\t this._body.appendChild(t);\r\n\r\n\t this._datatable_overlay = t;\r\n\t }\r\n\r\n\t this._datatable_overlay.innerHTML = message;\r\n\t },\r\n\t hideOverlay: function hideOverlay() {\r\n\t if (this._datatable_overlay) {\r\n\t remove(this._datatable_overlay);\r\n\t this._datatable_overlay = null;\r\n\t }\r\n\t },\r\n\t mapCells: function mapCells(startrow, startcol, numrows, numcols, callback, getOnly) {\r\n\t if (startrow === null && this.data.order.length > 0) startrow = this.data.order[0];\r\n\t if (startcol === null) startcol = this.columnId(0);\r\n\t if (numrows === null) numrows = this.data.order.length;\r\n\t if (numcols === null) numcols = this._settings.columns.length;\r\n\t if (!this.exists(startrow)) return;\r\n\t startrow = this.getIndexById(startrow);\r\n\t startcol = this.getColumnIndex(startcol);\r\n\t if (startcol === null) return;\r\n\r\n\t for (var i = 0; i < numrows && startrow + i < this.data.order.length; i++) {\r\n\t var row_ind = startrow + i;\r\n\t var row_id = this.data.order[row_ind];\r\n\r\n\t if (row_id) {\r\n\t //dyn loading\r\n\t var item = this.getItem(row_id);\r\n\r\n\t for (var j = 0; j < numcols && startcol + j < this._settings.columns.length; j++) {\r\n\t var col_ind = startcol + j;\r\n\t var col_id = this.columnId(col_ind);\r\n\t var result = callback(item[col_id], row_id, col_id, i, j);\r\n\t if (!getOnly) item[col_id] = result;\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _call_onparse: function _call_onparse(driver, data) {\r\n\t if (!this._settings.columns && driver.getConfig) this.define(\"columns\", driver.getConfig(data));\r\n\t },\r\n\t _autoDetectConfig: function _autoDetectConfig() {\r\n\t var test = this.getItem(this.getFirstId());\r\n\t var res = this._settings.columns = [];\r\n\r\n\t for (var key in test) {\r\n\t if (key != \"id\" && key[0] != \"$\") res.push({\r\n\t id: key,\r\n\t header: key[0].toUpperCase() + key.substr(1),\r\n\t sort: \"string\",\r\n\t editor: \"text\"\r\n\t });\r\n\t }\r\n\r\n\t if (res.length) res[0].fillspace = true;\r\n\t if (typeof this._settings.select == \"undefined\") this.define(\"select\", \"row\");\r\n\t }\r\n\t}; // #include ui/datatable/datatable_filter.js\r\n\t// #include ui/datatable/datatable_selection.js\r\n\t// #include ui/datatable/datatable_blockselect.js\r\n\t// #include ui/datatable/datatable_resize.js\r\n\t// #include ui/datatable/datatable_paging.js\r\n\t// #include ui/datatable/datatable_clipboard.js\r\n\t// #include ui/datatable/datatable_state.js\r\n\t// #include ui/datatable/datatable_touch.js\r\n\t// #include ui/datatable/datatable_size.js\r\n\t// #include ui/datatable/datatable_math.js\r\n\t// #include ui/datatable/datatable_edit.js\r\n\t// #include ui/datatable/datatable_columns.js\r\n\t// #include ui/datatable/datatable_keynav.js\r\n\t// #include ui/datatable/datatable_dnd.js\r\n\t// #include ui/datatable/datatable_validation.js\r\n\t// #include ui/datatable/datatable_sparklines.js\r\n\t// #include ui/datatable/datatable_print.js\r\n\t// #include ui/datatable/datatable_export.js\r\n\r\n\tvar view$1b = exports.protoUI(api$1b, Mixin, DataState, TablePaste, DataMove, EditAbility, KeysNavigation, PagingAbility, CustomPrint, Mixin$e, ValidateCollection, Mixin$d, Mixin$f, DragItem, Mixin$c, Mixin$b, Mixin$a, Mixin$9, Mixin$7, Mixin$8, Mixin$6, Mixin$5, Mixin$4, Mixin$g, Mixin$3, Mixin$2, Mixin$1, Mixin$h, Mixin$i, AutoTooltip, Group, DataMarks, DataLoader, MouseEvents, MapCollection, base.view, EventSystem, Settings);\r\n\tvar datatable = {\r\n\t api: api$1b,\r\n\t view: view$1b\r\n\t};\r\n\r\n\tvar api$1c = {\r\n\t name: \"excelviewer\",\r\n\t $init: function $init() {\r\n\t this.$ready.push(function () {\r\n\t if (this._settings.toolbar) $$(this._settings.toolbar).attachEvent(\"onExcelSheetSelect\", bind(this.showSheet, this));\r\n\t });\r\n\t },\r\n\t defaults: {\r\n\t datatype: \"excel\"\r\n\t },\r\n\t $onLoad: function $onLoad(data) {\r\n\t if (data.sheets) {\r\n\t this._excel_data = data;\r\n\t if (this._settings.toolbar) $$(this._settings.toolbar).setSheets(data.names);\r\n\t var now = data.names[0];\r\n\t this.showSheet(now.id || now);\r\n\t return true;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t $exportView: function $exportView(options) {\r\n\t if (options.export_mode !== \"excel\" || options.dataOnly) return this;\r\n\t if (options.sheets === true) options.sheets = this.getSheets();else if (!options.sheets || !options.sheets.length) options.sheets = [this._activeSheet];else if (typeof options.sheets == \"string\") options.sheets = [options.sheets];\r\n\t options.dataOnly = true;\r\n\t options.heights = isUndefined(options.heights) && options.styles ? \"all\" : options.heights;\r\n\t var temp = [];\r\n\t var active = this._activeSheet;\r\n\r\n\t for (var i = 0; i < options.sheets.length; i++) {\r\n\t this.showSheet(options.sheets[i]);\r\n\t temp = temp.concat(toExcel(this, options));\r\n\t if (options.styles) temp[i].styles = this._getExportStyles(options);\r\n\t }\r\n\r\n\t this.showSheet(active);\r\n\t delete options.dataOnly;\r\n\t return temp;\r\n\t },\r\n\t showSheet: function showSheet(name) {\r\n\t this.clearAll();\r\n\t var obj = this.data.driver.sheetToArray(this._excel_data.sheets[name], {\r\n\t spans: this._settings.spans\r\n\t });\r\n\t var header = this._settings.excelHeader;\r\n\t var letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\r\n\t var cols = {},\r\n\t rows = {};\r\n\r\n\t if (obj.sizes) {\r\n\t for (var i = 0; i < obj.sizes.length; i++) {\r\n\t if (obj.sizes[i][0] == \"column\") cols[obj.sizes[i][1]] = Math.round(obj.sizes[i][2]);else if (obj.sizes[i][0] == \"row\") rows[obj.sizes[i][1]] = Math.round(obj.sizes[i][2]);\r\n\t }\r\n\t }\r\n\r\n\t if (!header) {\r\n\t header = copy(obj.data[0]);\r\n\r\n\t for (var _i = 0; _i < header.length; _i++) {\r\n\t header[_i] = {\r\n\t header: letters[_i],\r\n\t id: \"data\" + _i,\r\n\t width: cols[_i],\r\n\t adjust: !cols[_i],\r\n\t editor: \"text\",\r\n\t sort: \"string\"\r\n\t };\r\n\t }\r\n\t } else if (header === true) {\r\n\t header = obj.data.splice(0, 1)[0];\r\n\r\n\t for (var _i2 = 0; _i2 < header.length; _i2++) {\r\n\t header[_i2] = {\r\n\t header: header[_i2],\r\n\t id: \"data\" + _i2,\r\n\t width: cols[_i2],\r\n\t adjust: !cols[_i2],\r\n\t editor: \"text\",\r\n\t sort: \"string\"\r\n\t };\r\n\t }\r\n\t } else header = copy(header);\r\n\r\n\t this.config.columns = header;\r\n\t this.refreshColumns();\r\n\t this.parse(obj, this._settings.datatype);\r\n\t this._activeSheet = name;\r\n\r\n\t var paintspans = this._paintSpans(obj.spans);\r\n\r\n\t var paintrows = this._paintRowHeight(rows);\r\n\r\n\t var paintstyles = this._paintStyles(obj.styles, paintspans);\r\n\r\n\t if (paintspans || paintrows || paintstyles) this.refresh();\r\n\t },\r\n\t getSheets: function getSheets() {\r\n\t return this._excel_data.names;\r\n\t },\r\n\t _getSpanCss: function _getSpanCss(spans, id, cid, style) {\r\n\t var found = false;\r\n\r\n\t for (var s = 0; s < spans.length; s++) {\r\n\t if (spans[s][0] === id && spans[s][1] === cid) {\r\n\t spans[s][5] = createCss(this._toCellStyle(style));\r\n\t this.addSpan(spans[s][0], spans[s][1], spans[s][2], spans[s][3], spans[s][4], spans[s][5]);\r\n\t found = true;\r\n\t break;\r\n\t }\r\n\t }\r\n\r\n\t return found;\r\n\t },\r\n\t _paintStyles: function _paintStyles(styles, spans) {\r\n\t var count = 0;\r\n\r\n\t if (styles && styles.length) {\r\n\t for (var i = 0; i < styles.length; i++) {\r\n\t var rind = styles[i][0] - (this.config.excelHeader ? 1 : 0);\r\n\r\n\t if (rind >= 0) {\r\n\t var id = this.getIdByIndex(rind);\r\n\r\n\t if (this.exists(id)) {\r\n\t var item = this.getItem(id);\r\n\t var cid = this.columnId(styles[i][1]);\r\n\r\n\t if (cid) {\r\n\t if (!spans.length || !this._getSpanCss(spans, id, cid, styles[i][2])) {\r\n\t item.$cellCss = item.$cellCss || {};\r\n\t item.$cellCss[cid] = this._toCellStyle(styles[i][2]);\r\n\t }\r\n\r\n\t count++;\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return count;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t //ARGB conversion\r\n\t _safeColor: function _safeColor(str) {\r\n\t str = str || \"000000\";\r\n\t if (str.length === 8) str = str.substring(2);\r\n\t return \"#\" + str;\r\n\t },\r\n\t _toCellStyle: function _toCellStyle(st) {\r\n\t var res = {};\r\n\t if (st.fill && st.fill.fgColor) res[\"background-color\"] = this._safeColor(st.fill.fgColor.rgb);\r\n\r\n\t if (st.font) {\r\n\t var f = st.font;\r\n\t if (f.name) res[\"font-family\"] = f.name;\r\n\t if (f.sz) res[\"font-size\"] = f.sz / 0.75 + \"px\";\r\n\t if (f.color && f.color.rgb) res[\"color\"] = this._safeColor(f.color.rgb);\r\n\t if (f.bold) res[\"font-weight\"] = \"bold\";\r\n\t if (f.underline) res[\"text-decoration\"] = \"underline\";\r\n\t if (f.italic) res[\"font-style\"] = \"italic\";\r\n\t if (f.strike) res[\"text-decoration\"] = \"line-through\";\r\n\t }\r\n\r\n\t if (st.alignment) {\r\n\t var a = st.alignment;\r\n\r\n\t if (a.vertical && a.vertical == \"center\") {\r\n\t res[\"display\"] = \"flex\";\r\n\t res[\"justify-content\"] = \"flex-start\";\r\n\t res[\"align-items\"] = \"center\";\r\n\t }\r\n\r\n\t if (a.vertical && a.vertical == \"bottom\") {\r\n\t res[\"display\"] = \"flex\";\r\n\t res[\"justify-content\"] = \"flex-end\";\r\n\t res[\"align-items\"] = \"flex-end\";\r\n\t }\r\n\r\n\t if (a.horizontal) {\r\n\t if (a.vertical && (a.vertical == \"center\" || a.vertical == \"bottom\")) res[\"justify-content\"] = \"center\";else res[\"text-align\"] = a.horizontal;\r\n\t }\r\n\r\n\t if (a.wrapText) res[\"white-space\"] = \"normal\";\r\n\t }\r\n\r\n\t if (st.border) {\r\n\t var b = st.border;\r\n\t if (b.top) res[\"border-top\"] = \"1px solid \" + this._safeColor(b.top.color.rgb);\r\n\t if (b.bottom) res[\"border-bottom\"] = \"1px solid \" + this._safeColor(b.bottom.color.rgb) + \" !important\";\r\n\t if (b.left) res[\"border-left\"] = \"1px solid \" + this._safeColor(b.left.color.rgb);\r\n\t if (b.right) res[\"border-right\"] = \"1px solid \" + this._safeColor(b.right.color.rgb) + \" !important\";\r\n\t }\r\n\r\n\t return res;\r\n\t },\r\n\t _paintRowHeight: function _paintRowHeight(rows) {\r\n\t var count = 0;\r\n\r\n\t for (var i in rows) {\r\n\t var index$$1 = this.config.excelHeader ? i - 1 : i;\r\n\r\n\t if (index$$1 >= 0) {\r\n\t var id = this.getIdByIndex(index$$1);\r\n\r\n\t if (this.exists(id)) {\r\n\t this.getItem(id).$height = rows[i];\r\n\t count++;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t this.config.fixedRowHeight = !count;\r\n\t return count;\r\n\t },\r\n\t _paintSpans: function _paintSpans(spans) {\r\n\t var res = [];\r\n\r\n\t if (this._settings.spans && spans && spans.length) {\r\n\t this._spans_pull = {};\r\n\r\n\t for (var i = 0; i < spans.length; i++) {\r\n\t if (this.config.excelHeader) spans[i][0]--;\r\n\r\n\t if (spans[i][0] >= 0) {\r\n\t spans[i][0] = this.getIdByIndex(spans[i][0]);\r\n\t spans[i][1] = \"data\" + spans[i][1];\r\n\t res.push(spans[i]);\r\n\t }\r\n\t }\r\n\r\n\t this.addSpan(res);\r\n\t return res;\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\t};\r\n\tvar view$1c = exports.protoUI(api$1c, datatable.view);\r\n\r\n\tvar api$1d = {\r\n\t name: \"pdfbar\",\r\n\t reset: function reset() {\r\n\t this.setPage(0);\r\n\t this.setValues(0, \"auto\");\r\n\t },\r\n\t $init: function $init(config) {\r\n\t this.$view.className += \" pdf_bar\";\r\n\t config.cols = [{\r\n\t view: \"button\",\r\n\t type: \"icon\",\r\n\t icon: \"wxi-angle-left\",\r\n\t width: 35,\r\n\t click: function click() {\r\n\t this.getParentView()._navigate(\"prev\");\r\n\t }\r\n\t }, {\r\n\t view: \"text\",\r\n\t width: 70,\r\n\t value: \"0\",\r\n\t on: {\r\n\t onBlur: function onBlur() {\r\n\t this.getParentView()._navigate(this.getValue());\r\n\t },\r\n\t onKeyPress: function onKeyPress(code) {\r\n\t if (code === 13) this.getParentView()._navigate(this.getValue());\r\n\t }\r\n\t }\r\n\t }, {\r\n\t template: i18n.PDFviewer.of + \" #limit#\",\r\n\t width: 70,\r\n\t data: {\r\n\t limit: 0\r\n\t },\r\n\t borderless: true\r\n\t }, {\r\n\t view: \"button\",\r\n\t type: \"icon\",\r\n\t icon: \"wxi-angle-right\",\r\n\t width: 35,\r\n\t click: function click() {\r\n\t this.getParentView()._navigate(\"next\");\r\n\t }\r\n\t }, {}, {\r\n\t view: \"button\",\r\n\t type: \"icon\",\r\n\t icon: \"wxi-minus\",\r\n\t width: 35,\r\n\t click: function click() {\r\n\t this.getParentView().zoom(\"out\");\r\n\t }\r\n\t }, {\r\n\t view: \"richselect\",\r\n\t options: [],\r\n\t maxWidth: 195,\r\n\t suggest: {\r\n\t padding: 0,\r\n\t css: \"pdf_opt_list\",\r\n\t borderless: true,\r\n\t body: {\r\n\t type: {\r\n\t height: 25\r\n\t },\r\n\t scroll: false,\r\n\t yCount: 13\r\n\t }\r\n\t },\r\n\t on: {\r\n\t onChange: function onChange() {\r\n\t this.getParentView().setMasterScale(this.getValue());\r\n\t }\r\n\t }\r\n\t }, {\r\n\t view: \"button\",\r\n\t type: \"icon\",\r\n\t icon: \"wxi-plus\",\r\n\t width: 35,\r\n\t click: function click() {\r\n\t this.getParentView().zoom(\"in\");\r\n\t }\r\n\t }, {\r\n\t view: \"button\",\r\n\t type: \"icon\",\r\n\t icon: \"wxi-download\",\r\n\t width: 35,\r\n\t click: function click() {\r\n\t this.getParentView().download();\r\n\t }\r\n\t }];\r\n\t this.$ready.push(this._setScaleOptions);\r\n\t },\r\n\t _setScaleOptions: function _setScaleOptions() {\r\n\t var list = this.getChildViews()[6].getPopup().getBody();\r\n\t list.clearAll();\r\n\t list.parse([{\r\n\t id: \"auto\",\r\n\t value: i18n.PDFviewer.automaticZoom\r\n\t }, {\r\n\t id: \"page-actual\",\r\n\t value: i18n.PDFviewer.actualSize\r\n\t }, {\r\n\t id: \"page-fit\",\r\n\t value: i18n.PDFviewer.pageFit\r\n\t }, {\r\n\t id: \"page-width\",\r\n\t value: i18n.PDFviewer.pageWidth\r\n\t }, {\r\n\t id: \"page-height\",\r\n\t value: i18n.PDFviewer.pageHeight\r\n\t }, {\r\n\t id: \"0.5\",\r\n\t value: \"50%\"\r\n\t }, {\r\n\t id: \"0.75\",\r\n\t value: \"75%\"\r\n\t }, {\r\n\t id: \"1\",\r\n\t value: \"100%\"\r\n\t }, {\r\n\t id: \"1.25\",\r\n\t value: \"125%\"\r\n\t }, {\r\n\t id: \"1.5\",\r\n\t value: \"150%\"\r\n\t }, {\r\n\t id: \"2\",\r\n\t value: \"200%\"\r\n\t }, {\r\n\t id: \"3\",\r\n\t value: \"300%\"\r\n\t }, {\r\n\t id: \"4\",\r\n\t value: \"400%\"\r\n\t }]);\r\n\t var width = 0;\r\n\t list.data.each(function (obj) {\r\n\t width = Math.max(getTextSize(obj.value, \"webixbutton\").width, width);\r\n\t });\r\n\t this.getChildViews()[6].define(\"width\", width + 20);\r\n\t this.getChildViews()[6].resize();\r\n\t },\r\n\t _navigate: function _navigate(num) {\r\n\t this.setMasterPage(num);\r\n\t this.setPage(this.$master.$pageNum);\r\n\t },\r\n\t setScale: function setScale(scale) {\r\n\t var sel = this.getChildViews()[6];\r\n\t sel.blockEvent();\r\n\t if (sel.getPopup().getList().exists(scale)) sel.setValue(scale);else {\r\n\t sel.setValue(\"\");\r\n\t sel.getInputNode().innerHTML = (scale * 100).toFixed(0) + \"%\";\r\n\t }\r\n\t sel.unblockEvent();\r\n\t },\r\n\t setMasterScale: function setMasterScale(value) {\r\n\t if (!this.$master) return;\r\n\t this.$master.setScale(value);\r\n\t },\r\n\t setMasterPage: function setMasterPage(num) {\r\n\t if (!this.$master) return;\r\n\t if (num === \"prev\") this.$master.prevPage();else if (num === \"next\") this.$master.nextPage();else if (!isNaN(parseInt(num))) this.$master.renderPage(parseInt(num));\r\n\t },\r\n\t zoom: function zoom(dir) {\r\n\t if (!this.$master) return;\r\n\t if (dir === \"out\") this.$master.zoomOut();else if (dir === \"in\") this.$master.zoomIn();\r\n\t },\r\n\t setPage: function setPage(num) {\r\n\t this.getChildViews()[1].setValue(num);\r\n\t },\r\n\t setValues: function setValues(num, scale) {\r\n\t this.getChildViews()[2].data.limit = num;\r\n\t this.getChildViews()[2].refresh();\r\n\t this.setScale(scale);\r\n\t },\r\n\t download: function download$$1() {\r\n\t if (!this.$master) return;\r\n\t this.$master.download();\r\n\t }\r\n\t};\r\n\tvar view$1d = exports.protoUI(api$1d, toolbar.view);\r\n\r\n\tvar api$1e = {\r\n\t name: \"pdfviewer\",\r\n\t defaults: {\r\n\t scale: \"auto\"\r\n\t },\r\n\t $init: function $init(config) {\r\n\t this.$view.className += \" webix_pdf\";\r\n\t var elm_wrapper = document.createElement(\"DIV\");\r\n\t elm_wrapper.className = \"canvas_wrapper\";\r\n\t var elm = document.createElement(\"canvas\");\r\n\t this._currentPage = this.$view;\r\n\t this._container = this.$view.appendChild(elm_wrapper);\r\n\t this._canvas = this._container.appendChild(elm);\r\n\t this.$pdfDoc = null;\r\n\t this.$pageNum = 0;\r\n\t this.$numPages = 0;\r\n\t this._pageRendering = false;\r\n\t this._pageNumPending = null;\r\n\t this._ctx = this._canvas.getContext(\"2d\");\r\n\t this._init_scale_value = 0.1;\r\n\t this._default_scale_delta = config.scaleDelta || 1.1;\r\n\t this._min_scale = config.minScale || 0.25;\r\n\t this._max_scale = config.maxScale || 10.0;\r\n\t this._max_auto_scale = 1.25;\r\n\t this._hPadding = 40;\r\n\t this._vPadding = 10;\r\n\t this.$ready.push(this._attachHandlers);\r\n\t },\r\n\t toolbar_setter: function toolbar_setter(toolbar) {\r\n\t if (typeof toolbar == \"string\") {\r\n\t var ui_toolbar = $$(toolbar);\r\n\r\n\t if (ui_toolbar) {\r\n\t ui_toolbar.$master = this;\r\n\t ui_toolbar.refresh();\r\n\t }\r\n\r\n\t this.attachEvent(\"onDocumentReady\", function () {\r\n\t if (ui_toolbar) {\r\n\t ui_toolbar.setPage(this.$pageNum);\r\n\t ui_toolbar.setValues(this.$numPages, this._settings.scale);\r\n\t } else this.toolbar_setter(toolbar);\r\n\t });\r\n\t return toolbar;\r\n\t }\r\n\t },\r\n\t _attachHandlers: function _attachHandlers() {\r\n\t delete this._settings.datatype; // cheat(\r\n\r\n\t this.attachEvent(\"onScaleChange\", function (scale, update) {\r\n\t if (update && this._settings.toolbar && $$(this._settings.toolbar).setScale) $$(this._settings.toolbar).setScale(scale);\r\n\t });\r\n\r\n\t if (env.touch) {\r\n\t this._touchDelta = false;\r\n\r\n\t _event(this._viewobj, \"touchstart\", bind(function (e) {\r\n\t var touches = e.targetTouches;\r\n\r\n\t if (touches.length === 2) {\r\n\t preventEvent(e);\r\n\t this._touchDelta = Math.abs(touches[0].pageY - touches[1].pageY);\r\n\t }\r\n\t }, this));\r\n\r\n\t _event(this.$view, \"touchmove\", bind(function (e) {\r\n\t var touches = e.targetTouches;\r\n\r\n\t if (touches.length === 2 && this._touchDelta !== false) {\r\n\t preventEvent(e);\r\n\t if (Math.abs(touches[0].pageY - touches[1].pageY) > this._touchDelta) this.zoomIn();else this.zoomOut();\r\n\t this._touchDelta = false;\r\n\t }\r\n\t }, this));\r\n\r\n\t this.attachEvent(\"onSwipeX\", function (start, end) {\r\n\t this.$view.scrollLeft = this.$view.scrollLeft - (end.x - start.x);\r\n\t });\r\n\t this.attachEvent(\"onSwipeY\", function (start, end) {\r\n\t var ch = this.$view.clientHeight,\r\n\t sh = this.$view.scrollHeight,\r\n\t oh = this.$view.offsetHeight,\r\n\t stop = this.$view.scrollTop,\r\n\t delta = end.y - start.y;\r\n\r\n\t if (ch === sh || delta < 0 && stop > sh - oh || delta > 0 && stop === 0) {\r\n\t var page = this.$pageNum + (delta > 0 ? -1 : 1);\r\n\r\n\t if (page > 0 && page <= this.$numPages) {\r\n\t this.$pageNum = page;\r\n\r\n\t this._queueRenderPage(this.$pageNum);\r\n\r\n\t this.$view.scrollTop = delta > 0 ? sh : 0;\r\n\t }\r\n\t } else this.$view.scrollTop = stop - delta;\r\n\t });\r\n\t } else {\r\n\t var evt = env.isFF ? \"DOMMouseScroll\" : \"mousewheel\";\r\n\t event$1(window, evt, bind(function (e) {\r\n\t var ticks = e.type === \"DOMMouseScroll\" ? -e.detail : e.wheelDelta;\r\n\t var dir = ticks < 0 ? \"out\" : \"in\";\r\n\r\n\t if (e.ctrlKey) {\r\n\t // Only zoom the pages, not the entire viewer\r\n\t preventEvent(e);\r\n\t if (dir == \"in\") this.zoomIn();else this.zoomOut();\r\n\t }\r\n\t }, this));\r\n\t }\r\n\t },\r\n\t _getDocument: function _getDocument(data) {\r\n\t if (data.name) {\r\n\t //File structure\r\n\t var reader = new FileReader();\r\n\t reader.onload = bind(function (e) {\r\n\t this._getDocument({\r\n\t data: e.target.result\r\n\t });\r\n\t }, this);\r\n\t reader.readAsArrayBuffer(data);\r\n\t } else {\r\n\t /* global PDFJS */\r\n\t PDFJS.getDocument({\r\n\t data: data.data\r\n\t }).then(bind(function (pdfDoc_) {\r\n\t this.clear();\r\n\t this.$pdfDoc = pdfDoc_;\r\n\t this.$numPages = this.$pdfDoc.numPages;\r\n\t this.$pageNum = 1;\r\n\r\n\t this._renderPage(this.$pageNum).then(bind(function () {\r\n\t this.callEvent(\"onDocumentReady\");\r\n\t }, this));\r\n\t }, this));\r\n\t }\r\n\t },\r\n\t $onLoad: function $onLoad(data) {\r\n\t if (!window.PDFJS) {\r\n\t //for cross browser and compatibility\r\n\t require([env.cdn + \"/extras/pdfjs/compatibility.min.js\", env.cdn + \"/extras/pdfjs/pdf.min.js\"], function () {\r\n\t /* global PDFJS */\r\n\t PDFJS.workerSrc = env.cdn + \"/extras/pdfjs/pdf.worker.min.js\";\r\n\r\n\t this._getDocument(data);\r\n\t }, this);\r\n\t } else this._getDocument(data);\r\n\r\n\t return true;\r\n\t },\r\n\t _getViewPort: function _getViewPort(page, scale) {\r\n\t var viewport = page.getViewport(scale);\r\n\t this._canvas.height = viewport.height;\r\n\t this._canvas.width = viewport.width;\r\n\t this._container.style.width = viewport.width + \"px\";\r\n\t this._container.style.height = viewport.height + \"px\";\r\n\t return viewport;\r\n\t },\r\n\t _renderPage: function _renderPage(num) {\r\n\t var viewer = this;\r\n\t viewer._pageRendering = true; // Using promise to fetch the page\r\n\r\n\t return this.$pdfDoc.getPage(num).then(function (page) {\r\n\t //Getting 'safe' scale value\r\n\t var scale = isNaN(parseFloat(viewer._settings.scale)) ? viewer._init_scale_value : viewer._settings.scale;\r\n\r\n\t var viewport = viewer._getViewPort(page, scale); //recalc viewport if \"string\" scale is set\r\n\r\n\r\n\t if (scale !== viewer._settings.scale) {\r\n\t scale = viewer._getScale(viewer._settings.scale);\r\n\t viewport = viewer._getViewPort(page, scale);\r\n\t viewer._settings.scale = scale;\r\n\t } // Render PDF page into canvas context\r\n\r\n\r\n\t var renderContext = {\r\n\t canvasContext: viewer._ctx,\r\n\t viewport: viewport\r\n\t };\r\n\t page.cleanupAfterRender = true; // Wait for rendering to finish\r\n\r\n\t return page.render(renderContext).promise.then(function () {\r\n\t viewer.callEvent(\"onPageRender\", [viewer.$pageNum]);\r\n\t viewer._pageRendering = false;\r\n\r\n\t if (viewer._pageNumPending !== null) {\r\n\t // New page rendering is pending\r\n\t viewer._renderPage(viewer._pageNumPending);\r\n\r\n\t viewer._pageNumPending = null;\r\n\t }\r\n\t });\r\n\t });\r\n\t },\r\n\t _queueRenderPage: function _queueRenderPage(num) {\r\n\t if (this._pageRendering) this._pageNumPending = num;else this._renderPage(num);\r\n\t },\r\n\t renderPage: function renderPage(num) {\r\n\t if (!this.$pdfDoc || num < 0 || num > this.$numPages) return;\r\n\t this.$pageNum = num;\r\n\r\n\t this._queueRenderPage(this.$pageNum);\r\n\t },\r\n\t prevPage: function prevPage() {\r\n\t if (this.$pageNum <= 1) return;\r\n\t this.$pageNum--;\r\n\r\n\t this._queueRenderPage(this.$pageNum);\r\n\t },\r\n\t nextPage: function nextPage() {\r\n\t if (this.$pageNum >= this.$numPages) return;\r\n\t this.$pageNum++;\r\n\r\n\t this._queueRenderPage(this.$pageNum);\r\n\t },\r\n\t zoomIn: function zoomIn() {\r\n\t var newScale = this._settings.scale;\r\n\t newScale = (newScale * this._default_scale_delta).toFixed(2);\r\n\t newScale = Math.ceil(newScale * 10) / 10;\r\n\t newScale = Math.min(this._max_scale, newScale);\r\n\t this.setScale(newScale, true);\r\n\t },\r\n\t zoomOut: function zoomOut() {\r\n\t var newScale = this._settings.scale;\r\n\t newScale = (newScale / this._default_scale_delta).toFixed(2);\r\n\t newScale = Math.floor(newScale * 10) / 10;\r\n\t newScale = Math.max(this._min_scale, newScale);\r\n\t this.setScale(newScale, true);\r\n\t },\r\n\t _getScale: function _getScale(value) {\r\n\t if (!isNaN(parseFloat(value))) return value;\r\n\t if (isNaN(parseFloat(this._settings.scale))) this._settings.scale = this._init_scale_value;\r\n\t var scale = 1; //default value\r\n\r\n\t var pageWidthScale = ((this._currentPage.clientWidth - this._hPadding) * this._settings.scale / this._canvas.clientWidth).toFixed(2);\r\n\r\n\t var pageHeightScale = ((this._currentPage.clientHeight - this._vPadding) * this._settings.scale / this._canvas.clientHeight).toFixed(2);\r\n\r\n\t switch (value) {\r\n\t case \"page-actual\":\r\n\t scale = 1;\r\n\t break;\r\n\r\n\t case \"page-width\":\r\n\t scale = pageWidthScale;\r\n\t break;\r\n\r\n\t case \"page-height\":\r\n\t scale = pageHeightScale;\r\n\t break;\r\n\r\n\t case \"page-fit\":\r\n\t scale = Math.min(pageWidthScale, pageHeightScale);\r\n\t break;\r\n\r\n\t case \"auto\":\r\n\t var isLandscape = this._currentPage.clientWidth > this._currentPage.clientHeight;\r\n\t var horizontalScale = isLandscape ? Math.min(pageHeightScale, pageWidthScale) : pageWidthScale;\r\n\t scale = Math.min(this._max_auto_scale, horizontalScale);\r\n\t break;\r\n\t }\r\n\r\n\t return scale;\r\n\t },\r\n\t setScale: function setScale(value, update) {\r\n\t if (!isNaN(parseFloat(value))) {\r\n\t this._setScale(value, update);\r\n\t } else {\r\n\t var scale = this._getScale(value);\r\n\r\n\t this._setScale(scale, update);\r\n\t }\r\n\t },\r\n\t _setScale: function _setScale(newScale, update) {\r\n\t this._settings.scale = newScale;\r\n\t this.renderPage(this.$pageNum);\r\n\t this.callEvent(\"onScaleChange\", [newScale, update]);\r\n\t },\r\n\t download: function download$$1() {\r\n\t if (!this.$pdfDoc) return;\r\n\t var filename = (this._settings.downloadName || \"document\") + \".pdf\";\r\n\t this.$pdfDoc.getData().then(function (data) {\r\n\t /* global PDFJS */\r\n\t var blob = PDFJS.createBlob(data, \"application/pdf\");\r\n\r\n\t download(blob, filename);\r\n\t });\r\n\t },\r\n\t clear: function clear() {\r\n\t if (this.$pdfDoc) {\r\n\t this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\r\n\r\n\t this._container.style.height = this._container.style.width = this._canvas.width = this._canvas.height = 0;\r\n\t this._settings.scale = \"auto\";\r\n\t this.$pageNum = this.$numPages = 0;\r\n\t this.$pdfDoc.transport.startCleanup();\r\n\t this.$pdfDoc.destroy();\r\n\t this.$pdfDoc = null;\r\n\t if (this._settings.toolbar && $$(this._settings.toolbar)) $$(this._settings.toolbar).reset();\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$1e = exports.protoUI(api$1e, EventSystem, AtomDataLoader, base.view);\r\n\r\n\t/*\r\n\t\tUI:Video\r\n\t*/\r\n\t// #include ui/view.js\r\n\r\n\tvar api$1f = {\r\n\t name: \"video\",\r\n\t $init: function $init(config) {\r\n\t if (!config.id) config.id = uid();\r\n\t this.$ready.push(this._init_video);\r\n\t },\r\n\t _init_video: function _init_video() {\r\n\t var c = this._settings;\r\n\t this._contentobj = create(\"video\", {\r\n\t \"class\": \"webix_view_video\",\r\n\t \"style\": \"width:100%;height:100%;\",\r\n\t \"autobuffer\": \"autobuffer\"\r\n\t }, \"\");\r\n\t if (c.poster) this._contentobj.poster = c.poster;\r\n\r\n\t if (c.src) {\r\n\t if (_typeof(c.src) != \"object\") c.src = [c.src];\r\n\r\n\t for (var i = 0; i < c.src.length; i++) {\r\n\t this._contentobj.innerHTML += \" \";\r\n\t }\r\n\t }\r\n\r\n\t if (c.controls) this._contentobj.controls = true;\r\n\t if (c.autoplay) this._contentobj.autoplay = true;\r\n\r\n\t this._viewobj.appendChild(this._contentobj);\r\n\t },\r\n\t getVideo: function getVideo() {\r\n\t return this._contentobj;\r\n\t },\r\n\t defaults: {\r\n\t src: \"\",\r\n\t controls: true\r\n\t }\r\n\t};\r\n\tvar view$1f = exports.protoUI(api$1f, base.view);\r\n\r\n\tvar api$1g = {\r\n\t name: \"gage\",\r\n\t defaults: {\r\n\t value: 0,\r\n\t minRange: 0,\r\n\t maxRange: 100,\r\n\t minWidth: 250,\r\n\t minHeight: 200,\r\n\t smoothFlow: true,\r\n\t scale: 3,\r\n\t stroke: 7\r\n\t },\r\n\t $init: function $init() {\r\n\t this.$ready.push(bind(this._setDefaultView, this));\r\n\t this.attachEvent(\"onDestruct\", function () {\r\n\t this._circleGradient = this._gageGradientPoint = this._gage = null;\r\n\t });\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t this._refresh();\r\n\t }\r\n\t },\r\n\t _refresh: function _refresh() {\r\n\t this._value = this.config.value;\r\n\t var curves = this.$view.querySelector(\".webix_gage_curves\"),\r\n\t gageInfo = this.$view.querySelector(\".webix_gage_info\"),\r\n\t kx = this.config.scale,\r\n\t x = this.$width;\r\n\t curves.setAttribute(\"r\", x / kx);\r\n\t curves.setAttribute(\"strokeDasharray\", Math.round(Math.PI * x / kx));\r\n\t curves.style.r = x / kx;\r\n\t curves.style.strokeDasharray = Math.round(Math.PI * x / kx);\r\n\t gageInfo.setAttribute(\"style\", \"width: \" + Math.round(x / kx * 2) + \"px;\");\r\n\r\n\t this._gage.setAttribute(\"style\", \"height: \" + (x / kx + 20) + \"px;\");\r\n\r\n\t this._circleGradient.setAttribute(\"r\", x / kx);\r\n\r\n\t this._circleGradient.setAttribute(\"style\", \"stroke-dasharray: \" + Math.round(this.gradientLength * Math.PI * x / kx) + \", 1900;\");\r\n\r\n\t this._draw_line(curves.style.r);\r\n\r\n\t this._animate();\r\n\t },\r\n\t _safeValue: function _safeValue(value) {\r\n\t return Math.min(Math.max(value, this._settings.minRange), this._settings.maxRange);\r\n\t },\r\n\t _draw_line: function _draw_line(radius) {\r\n\t var svgCoord = this.$width,\r\n\t arrowSpace = 0.05,\r\n\t value = this.config.value;\r\n\t value = this._safeValue(value);\r\n\t var currentChartValue = value - this.config.minRange;\r\n\t var degrees = Math.round(currentChartValue * 180 / (this.config.maxRange - this.config.minRange));\r\n\r\n\t if (degrees === 0 || degrees === 180) {\r\n\t this._gage.style.paddingTop = \"3px\";\r\n\t }\r\n\r\n\t this._gageGradientPoint.style.transformOrigin = svgCoord / 2 - (0.5 + arrowSpace) + \"px 0 0\";\r\n\r\n\t this._gageGradientPoint.setAttribute(\"y1\", \"0\");\r\n\r\n\t this._gageGradientPoint.setAttribute(\"x1\", Math.round(svgCoord * (0.5 + arrowSpace)));\r\n\r\n\t this._gageGradientPoint.setAttribute(\"y2\", 0);\r\n\r\n\t this._gageGradientPoint.setAttribute(\"x2\", Math.round(svgCoord * (0.5 + arrowSpace / 2) + parseInt(radius)));\r\n\t },\r\n\t _animate: function _animate() {\r\n\t var value = this.config.value;\r\n\t var webixGageValue = this.$view.querySelector(\".webix_gage-value\");\r\n\t var currentChartValue = this._safeValue(value) - this.config.minRange;\r\n\t var degrees = Math.round(currentChartValue * 180 / (this.config.maxRange - this.config.minRange));\r\n\t var viewSize = this.$width;\r\n\t viewSize = Math.floor(viewSize / 10);\r\n\t this.$view.style.fontSize = viewSize + \"px\";\r\n\t webixGageValue.innerHTML = value;\r\n\t this._circleGradient.style.stroke = this.color;\r\n\r\n\t this._circleGradient.setAttribute(\"stroke\", this.color);\r\n\r\n\t this._gageGradientPoint.setAttribute(\"transform\", \"rotate(\" + degrees + \" \" + this.$width / 2 + \" 0)\");\r\n\r\n\t this._gageGradientPoint.style.transform = \"rotate(\" + degrees + \"deg)\";\r\n\t },\r\n\t _setDash: function _setDash() {\r\n\t assert(this.config.minRange < this.config.maxRange, \"Invalid Range Values\");\r\n\t this.gradientLength = (this._safeValue(this.config.value) - this.config.minRange) / (this.config.maxRange - this.config.minRange);\r\n\t var template = this.config.color;\r\n\r\n\t if (template) {\r\n\t if (typeof template === \"function\") this.color = template.call(this, this.config.value);else this.color = template;\r\n\t } else this.color = \"hsl(\" + (120 - Math.round(this.gradientLength * 120)) + \", 100%, 50%)\";\r\n\r\n\t if (this.config.animation === true) {\r\n\t this.defaultColor = \"hsl(125, 100%, 50%)\";\r\n\t } else {\r\n\t this.defaultColor = \"hsl(\" + (120 - Math.round(this.gradientLength * 120)) + \", 100%, 50%)\";\r\n\t }\r\n\t },\r\n\t _setDefaultView: function _setDefaultView() {\r\n\t this.gradientLength = 0;\r\n\r\n\t this._setDash();\r\n\r\n\t this.$view.innerHTML = \"
    \" + (this.config.label || \"\") + \"
    \" + this.config.minRange + \"
    \" + this.config.maxRange + \"
    \" + this.config.value + \"
    \" + (this.config.placeholder || \"\") + \"
    \";\r\n\t this._circleGradient = this.$view.querySelector(\".webix_gage_gradient\");\r\n\t this._gageGradientPoint = this.$view.querySelector(\".webix_gage_gradient_point\");\r\n\t this._gage = this.$view.querySelector(\".webix_gage\");\r\n\r\n\t if (this.isVisible() === true && this.config.smoothFlow === true && env.svganimation && !env.isEdge) {\r\n\t this._circleGradient.setAttribute(\"class\", \"webix_gage_gradient webix_gage_animated\");\r\n\r\n\t this._gageGradientPoint.setAttribute(\"class\", \"webix_gage_gradient_point webix_gage_gradient_point_animated\");\r\n\t }\r\n\t },\r\n\t refresh: function refresh() {\r\n\t //for animated gages, if value changes - repaint with old value first, then set new value for nice animation\r\n\t var value = this.config.value;\r\n\t if (this.config.smoothFlow && value != this._value) this.config.value = this._value;\r\n\r\n\t this._setDefaultView();\r\n\r\n\t this._refresh();\r\n\r\n\t if (this._value != value) {\r\n\t //refresh dom, needed for animation\r\n\t if (this._viewobj.parentNode.clientHeight) this.setValue(value);\r\n\t }\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this.config.value = value;\r\n\r\n\t this._setDash();\r\n\r\n\t this._refresh();\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this.config.value;\r\n\t }\r\n\t};\r\n\tvar view$1g = exports.protoUI(api$1g, EventSystem, base.view);\r\n\r\n\tvar api$1h = {\r\n\t name: \"barcode\",\r\n\t defaults: {\r\n\t type: \"ean13\",\r\n\t height: 160,\r\n\t width: 220,\r\n\t paddingY: 10,\r\n\t paddingX: 20,\r\n\t textHeight: 20,\r\n\t color: \"#000\",\r\n\t ariaLabel: \"bars\"\r\n\t },\r\n\t $init: function $init() {\r\n\t this.$view.className += \" webix_barcode\";\r\n\r\n\t if (!this.types) {\r\n\t this.types = {\r\n\t \"default\": this.type\r\n\t };\r\n\t this.type.name = \"default\";\r\n\t }\r\n\t },\r\n\t type: {},\r\n\t render: function render() {\r\n\t if (this.isVisible(this._settings.id)) {\r\n\t if (this.canvas) this.canvas.clearCanvas(true);\r\n\t this.$view.innerHTML = \"\";\r\n\r\n\t this._renderCanvas();\r\n\t }\r\n\t },\r\n\t _renderCanvas: function _renderCanvas() {\r\n\t this.canvas = new Canvas({\r\n\t container: this.$view,\r\n\t name: this.name,\r\n\t title: this._settings.ariaLabel,\r\n\t width: this.$width,\r\n\t height: this.$height\r\n\t });\r\n\r\n\t this._drawBars();\r\n\t },\r\n\t _drawBars: function _drawBars() {\r\n\t var code,\r\n\t ctx,\r\n\t i,\r\n\t len,\r\n\t value = this._settings.value,\r\n\t type$$1 = this._settings.type;\r\n\t if (!type$$1 || !this.types[type$$1] || !value) return false;\r\n\t code = this.type.encode(value);\r\n\t len = code.length;\r\n\t ctx = this.canvas.getCanvas();\r\n\r\n\t if (len) {\r\n\t var unitWidth = (this.$width - this.config.paddingX * 2) / len;\r\n\t var unitNum = 0;\r\n\r\n\t for (i = 0; i < len; i++) {\r\n\t var ch1 = parseInt(code.charAt(i), 10);\r\n\r\n\t if (ch1) {\r\n\t unitNum++;\r\n\r\n\t if (i == len - 1) {\r\n\t this._drawBar(ctx, i + 1, unitWidth, unitNum, len);\r\n\t }\r\n\t } else if (unitNum) {\r\n\t this._drawBar(ctx, i, unitWidth, unitNum, len);\r\n\r\n\t unitNum = 0;\r\n\t }\r\n\t } // add text\r\n\r\n\r\n\t this._addText(value, unitWidth);\r\n\t }\r\n\t },\r\n\t _drawBar: function _drawBar(ctx, i, unitWidth, unitNum, num) {\r\n\t var x0, x1, y0, y1;\r\n\t x1 = parseInt(i * unitWidth + this.config.paddingX, 10);\r\n\t x0 = parseInt(x1 - unitNum * unitWidth, 10);\r\n\t y0 = this.config.paddingY;\r\n\t y1 = this.$height - this.config.paddingY - this.config.textHeight;\r\n\r\n\t if (this._isEAN() && (i < 4 || i > num - 4 || i < num / 2 + 2 && i > num / 2 - 2)) {\r\n\t y1 += this.config.textHeight / 2;\r\n\t }\r\n\r\n\t ctx.fillStyle = this.config.color;\r\n\t ctx.beginPath();\r\n\t ctx.moveTo(x0, y0);\r\n\t ctx.lineTo(x1, y0);\r\n\t ctx.lineTo(x1, y1);\r\n\t ctx.lineTo(x0, y1);\r\n\t ctx.lineTo(x0, y0);\r\n\t ctx.fill();\r\n\t },\r\n\t _addText: function _addText(value, barWidth) {\r\n\t var i, len, x;\r\n\t if (this.type.template) value = this.type.template(value);\r\n\r\n\t if (this._isEAN()) {\r\n\t if (this.type.firstDigit) {\r\n\t this.canvas.renderTextAt(true, \"left\", this.config.paddingX, this.$height - this.config.paddingY, value.charAt(0));\r\n\t value = value.slice(1);\r\n\t }\r\n\r\n\t len = value.length;\r\n\t if (this.type.lastDigit) len--;\r\n\r\n\t if (len) {\r\n\t var tUnitWidth = (this.$width - this.config.paddingX * 2 - barWidth * 11) / len;\r\n\r\n\t for (i = 0; i < len; i++) {\r\n\t x = this.config.paddingX + i * tUnitWidth + (i < len / 2 ? 3 : 8) * barWidth + tUnitWidth / 2;\r\n\t this.canvas.renderTextAt(true, true, x, this.$height - this.config.paddingY, value.charAt(i));\r\n\t }\r\n\r\n\t if (this.type.lastDigit) {\r\n\t x = this.config.paddingX + len * tUnitWidth + 11 * barWidth;\r\n\t this.canvas.renderTextAt(true, false, x, this.$height - this.config.paddingY, value.charAt(len));\r\n\t }\r\n\t }\r\n\t } else {\r\n\t this.canvas.renderTextAt(true, true, this.$width / 2, this.$height - this.config.paddingY, value);\r\n\t }\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this._settings.value = value;\r\n\t this.render();\r\n\t return value;\r\n\t },\r\n\t getValue: function getValue() {\r\n\t var value = this._settings.value;\r\n\t return this.type.template ? this.type.template(value) : value;\r\n\t },\r\n\t type_setter: function type_setter(value) {\r\n\t if (!this.types[value]) this.customize(value);else {\r\n\t this.type = clone(this.types[value]);\r\n\t if (this.type.css) this._contentobj.className += \" \" + this.type.css;\r\n\t }\r\n\t return value;\r\n\t },\r\n\t _isEAN: function _isEAN() {\r\n\t var type$$1 = this.config.type;\r\n\t return type$$1.indexOf(\"ean\") === 0 || type$$1.indexOf(\"upcA\") != -1;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t this.render();\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$1h = exports.protoUI(api$1h, base.view);\r\n\ttype(view$1h, {\r\n\t name: \"upcA\",\r\n\t firstDigit: true,\r\n\t lastDigit: true,\r\n\t encode: function encode(value) {\r\n\t if (value.length < 12) {\r\n\t value = \"0\" + value;\r\n\t }\r\n\r\n\t return ean13.encode(value);\r\n\t },\r\n\t template: function template(value) {\r\n\t return value.replace(/[^0-9]/g, \"\").substring(0, 11) + this.checksum(value);\r\n\t },\r\n\t checksum: function checksum(value) {\r\n\t if (value.length < 12) {\r\n\t value = \"0\" + value;\r\n\t }\r\n\r\n\t return ean13.checksum(value);\r\n\t }\r\n\t});\r\n\t/*\r\n\t * EAN8\r\n\t * */\r\n\r\n\ttype(view$1h, {\r\n\t name: \"ean8\",\r\n\t encodings: [[\"0001101\", \"1110010\"], [\"0011001\", \"1100110\"], [\"0010011\", \"1101100\"], [\"0111101\", \"1000010\"], [\"0100011\", \"1011100\"], [\"0110001\", \"1001110\"], [\"0101111\", \"1010000\"], [\"0111011\", \"1000100\"], [\"0110111\", \"1001000\"], [\"0001011\", \"1110100\"]],\r\n\t encode: function encode(value) {\r\n\t var code, i;\r\n\t value = value.replace(/[^0-9]/g, \"\").substring(0, 7);\r\n\t if (value.length != 7) return \"\";\r\n\t value = value + this.checksum(value);\r\n\t code = \"101\";\r\n\r\n\t for (i = 0; i < 4; i++) {\r\n\t code += this.encodings[parseInt(value.charAt(i), 10)][0];\r\n\t }\r\n\r\n\t code += \"01010\";\r\n\r\n\t for (i = 4; i < 8; i++) {\r\n\t code += this.encodings[parseInt(value.charAt(i), 10)][1];\r\n\t }\r\n\r\n\t code += \"101\";\r\n\t return code;\r\n\t },\r\n\t template: function template(value) {\r\n\t return value.replace(/[^0-9]/g, \"\").substring(0, 7) + this.checksum(value);\r\n\t },\r\n\t checksum: function checksum(value) {\r\n\t value = value.substring(0, 7);\r\n\t var i,\r\n\t odd = true,\r\n\t sum = 0;\r\n\r\n\t for (i = 0; i < 7; i++) {\r\n\t sum += (odd ? 3 : 1) * parseInt(value.charAt(i), 10);\r\n\t odd = !odd;\r\n\t }\r\n\r\n\t return ((10 - sum % 10) % 10).toString();\r\n\t }\r\n\t});\r\n\t/*\r\n\t * EAN13\r\n\t * */\r\n\r\n\tvar ean13 = {\r\n\t name: \"ean13\",\r\n\t firstDigit: true,\r\n\t encodings: [[\"0001101\", \"0100111\", \"1110010\", \"000000\"], [\"0011001\", \"0110011\", \"1100110\", \"001011\"], [\"0010011\", \"0011011\", \"1101100\", \"001101\"], [\"0111101\", \"0100001\", \"1000010\", \"001110\"], [\"0100011\", \"0011101\", \"1011100\", \"010011\"], [\"0110001\", \"0111001\", \"1001110\", \"011001\"], [\"0101111\", \"0000101\", \"1010000\", \"011100\"], [\"0111011\", \"0010001\", \"1000100\", \"010101\"], [\"0110111\", \"0001001\", \"1001000\", \"010110\"], [\"0001011\", \"0010111\", \"1110100\", \"011010\"]],\r\n\t encode: function encode(value) {\r\n\t var code, columnIndexes, i;\r\n\t value = value.replace(/[^0-9]/g, \"\").substring(0, 12);\r\n\t if (value.length != 12) return \"\";\r\n\t value += this.checksum(value);\r\n\t code = \"101\";\r\n\t columnIndexes = this.encodings[parseInt(value.charAt(0), 10)][3];\r\n\r\n\t for (i = 1; i < 7; i++) {\r\n\t code += this.encodings[parseInt(value.charAt(i), 10)][parseInt(columnIndexes.charAt(i - 1), 10)];\r\n\t }\r\n\r\n\t code += \"01010\";\r\n\r\n\t for (i = 7; i < 13; i++) {\r\n\t code += this.encodings[parseInt(value.charAt(i), 10)][2];\r\n\t }\r\n\r\n\t code += \"101\";\r\n\t return code;\r\n\t },\r\n\t template: function template(value) {\r\n\t return value.replace(/[^0-9]/g, \"\").substring(0, 12) + this.checksum(value);\r\n\t },\r\n\t checksum: function checksum(value) {\r\n\t var i,\r\n\t odd = false,\r\n\t sum = 0;\r\n\t value = value.substring(0, 12);\r\n\r\n\t for (i = 0; i < 12; i++) {\r\n\t sum += (odd ? 3 : 1) * parseInt(value.charAt(i), 10);\r\n\t odd = !odd;\r\n\t }\r\n\r\n\t return ((10 - sum % 10) % 10).toString();\r\n\t }\r\n\t};\r\n\ttype(view$1h, ean13);\r\n\r\n\tvar api$1i = {\r\n\t name: \"bullet\",\r\n\t defaults: {\r\n\t color: \"#394646\",\r\n\t marker: false,\r\n\t layout: \"x\",\r\n\t barWidth: 40,\r\n\t flowTime: 500,\r\n\t labelWidth: 150,\r\n\t minRange: 0,\r\n\t maxRange: 100,\r\n\t stroke: 8,\r\n\t value: 0,\r\n\t smoothFlow: true,\r\n\t tickSize: 10,\r\n\t bands: [{\r\n\t value: 100,\r\n\t color: \"#5be5d6\"\r\n\t }, {\r\n\t value: 80,\r\n\t color: \"#fff07e\"\r\n\t }, {\r\n\t value: 60,\r\n\t color: \"#fd8b8c\"\r\n\t }],\r\n\t scale: {\r\n\t step: 10\r\n\t }\r\n\t },\r\n\t label_setter: template,\r\n\t placeholder_setter: template,\r\n\t $init: function $init(obj) {\r\n\t var ticks = typeof obj.tickSize != \"undefined\" ? obj.tickSize : this.defaults.tickSize;\r\n\r\n\t if (obj) {\r\n\t if ((!obj.layout || obj.layout === \"x\") && !obj.height) obj.height = obj.scale === false ? 60 : ticks ? 76 + ticks : 74;\r\n\t if (obj.layout === \"y\" && !obj.width) obj.width = obj.scale === false ? 60 : ticks ? 87 + ticks : 87;\r\n\t }\r\n\t },\r\n\t scale_setter: function scale_setter(config) {\r\n\t if (config) {\r\n\t config.step = config.step || 10;\r\n\t config.template = template(config.template || \"#value#\");\r\n\t }\r\n\r\n\t return config;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t this._setDefaultView(this._settings.layout === \"y\" ? y : x);\r\n\r\n\t if (this._settings.value || this._settings.value === 0) this._animate(0, this._settings.value);\r\n\t }\r\n\t },\r\n\t _safeValue: function _safeValue(value) {\r\n\t return Math.min(Math.max(value, this._settings.minRange), this._settings.maxRange);\r\n\t },\r\n\t _animateFrame: function _animateFrame(timestamp) {\r\n\t this._dt = timestamp - (this._time || timestamp);\r\n\t this._time = timestamp;\r\n\t var fps;\r\n\r\n\t if (this._settings.flowTime > this._dt) {\r\n\t fps = this._settings.flowTime / this._dt;\r\n\t } else {\r\n\t fps = this._settings.flowTime;\r\n\t }\r\n\r\n\t if (fps > 1000 || fps < 5) fps = 30;\r\n\t var step = (this._settings.value - this._prevValue) / fps;\r\n\t this._nowValue += step;\r\n\t if (Math.abs(this._nowValue - this._settings.value) < Math.abs(step)) this._nowValue = this._settings.value;\r\n\r\n\t if (this._nowValue != this._settings.value) {\r\n\t this._requestId = requestAnimationFrame(this._animateFrame.bind(this));\r\n\t } else {\r\n\t cancelAnimationFrame(this._requestId);\r\n\t this._requestId = null;\r\n\t }\r\n\r\n\t this._bulletValue.setAttribute(\"width\", Math.floor(this._nowValue * this._scale));\r\n\r\n\t this._bulletValue.style.fill = this._getColor();\r\n\t },\r\n\t _animate: function _animate(from, to) {\r\n\t this._prevValue = this._nowValue = from;\r\n\t this._settings.value = this._value = to;\r\n\r\n\t if (this.isVisible() === true && this._settings.smoothFlow === true && window.requestAnimationFrame) {\r\n\t if (!this._requestId) this._requestId = requestAnimationFrame(this._animateFrame.bind(this));\r\n\t } else {\r\n\t this._bulletValue.setAttribute(\"width\", Math.floor(to * this._scale));\r\n\r\n\t this._bulletValue.style.fill = this._getColor();\r\n\t }\r\n\t },\r\n\t _getColor: function _getColor() {\r\n\t var color = this._settings.color;\r\n\t return typeof color === \"function\" ? color(this._value) : color;\r\n\t },\r\n\t _setAttr: function _setAttr(tag, names, values) {\r\n\t for (var i = 0; i < names.length; i++) {\r\n\t tag.setAttribute(names[i], values[i]);\r\n\t }\r\n\t },\r\n\t _createNS: function _createNS(tag, names, values) {\r\n\t var ns = \"http://www.w3.org/2000/svg\";\r\n\t var el = document.createElementNS(ns, tag);\r\n\t if (names) this._setAttr(el, names, values);\r\n\t return el;\r\n\t },\r\n\t _dom: function _dom(data) {\r\n\t var top = this._createNS(data[0], data[1], data[2]);\r\n\r\n\t var child = data[3];\r\n\t if (child) for (var i = 0; i < child.length; i++) {\r\n\t top.appendChild(this._dom(child[i]));\r\n\t }\r\n\t return top;\r\n\t },\r\n\t _setView: function _setView() {\r\n\t var id = \"d\" + uid();\r\n\r\n\t var svg = this._createNS(\"svg\", [\"class\"], [\"webix_bullet_graph_svg\"]);\r\n\r\n\t var container = this._createNS(\"g\");\r\n\r\n\t var containerBand = this._createNS(\"g\");\r\n\r\n\t var value = this._createNS(\"rect\", [\"x\", \"y\", \"width\", \"height\", \"class\", \"style\"], [this._leftStart, this._topStart, 100, this._settings.stroke, \"webix_bullet_value\", \"filter:url(#\" + id + \");fill:\" + this._getColor()]);\r\n\r\n\t var valueMarker = this._createNS(\"rect\", [\"x\", \"y\", \"width\", \"height\", \"fill\"], [0, 5, 3, this._settings.barWidth - 10, \"rgba(0,0,0,0.5)\"]);\r\n\r\n\t var division = this._createNS(\"g\", [\"stroke\", \"stroke-width\", \"fill\"], [\"#8b94ac\", \"2\", \"none\"]);\r\n\r\n\t var text = this._createNS(\"text\", [\"text-anchor\", \"stroke\", \"fill\"], [\"end\", \"none\", \"#8b94ac\"]);\r\n\r\n\t var leftA = this._settings.layout == \"y\" ? \"50%\" : this._leftStart - 10;\r\n\t var topA = this._settings.layout == \"y\" ? 11 : 17;\r\n\r\n\t var textRow1 = this._createNS(\"tspan\", [\"x\", \"y\", \"class\"], [leftA, topA, \"webix_bullet_header\"]);\r\n\r\n\t var textRow2 = this._createNS(\"tspan\", [\"x\", \"y\", \"class\"], [leftA, topA + 17, \"webix_bullet_subheader\"]);\r\n\r\n\t var range = this._createNS(\"text\", [\"text-anchor\", \"stroke\", \"class\", \"fill\"], [\"middle\", \"none\", \"webix_bullet_scale\", \"#8b94ac\"]);\r\n\r\n\t var filter = this._dom([\"filter\", [\"id\", \"x\", \"y\", \"width\", \"height\"], [id, \"0\", \"-150%\", \"110%\", \"400%\"], [[\"feOffset\", [\"in\", \"dx\", \"dy\"], [\"SourceAlpha\", 0, 0]], [\"feGaussianBlur\", [\"stdDeviation\"], [\"2\"]], [\"feComponentTransfer\", 0, 0, [[\"feFuncA\", [\"type\", \"slope\"], [\"linear\", \"0.5\"]]]], [\"feMerge\", 0, 0, [[\"feMergeNode\"], [\"feMergeNode\", [\"in\"], [\"SourceGraphic\"]]]]]]);\r\n\r\n\t svg.appendChild(filter);\r\n\t var tempContainer = document.createElement(\"div\");\r\n\t container.appendChild(containerBand);\r\n\r\n\t if (this._settings.marker !== false) {\r\n\t valueMarker.setAttribute(\"x\", this._leftStart + this._safeValue(this._settings.marker) * this._scale - 2);\r\n\t container.appendChild(valueMarker);\r\n\t }\r\n\r\n\t container.appendChild(value);\r\n\t text.appendChild(textRow1);\r\n\t text.appendChild(textRow2);\r\n\t svg.appendChild(text);\r\n\t var vertical = this._settings.layout === \"y\";\r\n\t var ticks = this._settings.tickSize;\r\n\r\n\t if (this._settings.scale) {\r\n\t var label = this._leftStart;\r\n\r\n\t for (var i = this._settings.minRange; i <= this._settings.maxRange; i += this._settings.scale.step) {\r\n\t var left = Math.floor(i * this._scale - (i ? 0.1 : -1));\r\n\t var x = vertical ? (this.$width - this._settings.barWidth) / 2 + (ticks ? 2 - ticks : 4) : left + label;\r\n\t var y = vertical ? this._chartWidth + label - left + 6 : this._settings.barWidth + (ticks ? 16 + ticks : 14);\r\n\t var z = vertical ? -4 : this._settings.barWidth + 3 + ticks;\r\n\t var align = vertical ? \"end\" : \"middle\";\r\n\r\n\t var bulletRangeChild = this._createNS(\"tspan\", [\"x\", \"y\", \"text-anchor\"], [x, y, align]);\r\n\r\n\t var bulletDivChild = this._createNS(\"line\", [\"x1\", \"y1\", \"x2\", \"y2\", \"stroke-width\"], [left + label, z, left + label, z - ticks, 1]);\r\n\r\n\t tempContainer.innerHTML = this._settings.scale.template({\r\n\t value: i\r\n\t });\r\n\t bulletRangeChild.appendChild(tempContainer.childNodes[0]);\r\n\t range.appendChild(bulletRangeChild);\r\n\t division.appendChild(bulletDivChild);\r\n\t }\r\n\r\n\t container.appendChild(division);\r\n\t svg.appendChild(range);\r\n\t }\r\n\r\n\t for (var _i = 0; _i < this._settings.bands.length; _i++) {\r\n\t var obj = this._settings.bands[_i];\r\n\r\n\t var band = this._createNS(\"path\");\r\n\r\n\t var _value = this._safeValue(obj.value) * this._scale;\r\n\r\n\t band.setAttribute(\"d\", \"M \" + this._leftStart + \",0 l \" + _value + \",0 l 0,\" + this._settings.barWidth + \" l -\" + _value + \",0 z\");\r\n\t band.setAttribute(\"fill\", obj.color);\r\n\t containerBand.appendChild(band);\r\n\t }\r\n\r\n\t svg.appendChild(container);\r\n\r\n\t if (this._settings.layout === \"y\") {\r\n\t var w = this._settings.scale ? this.$width / 2 - 10 : 0;\r\n\t var h = this.$height + this._leftStart - 28;\r\n\t container.setAttribute(\"transform\", \"translate(\" + w + \", \" + h + \") rotate(270)\");\r\n\t text.setAttribute(\"text-anchor\", \"middle\");\r\n\t text.childNodes[0].setAttribute(\"x\", \"55%\");\r\n\t text.childNodes[1].setAttribute(\"x\", \"55%\");\r\n\t range.setAttribute(\"text-anchor\", \"right\");\r\n\t }\r\n\r\n\t svg.setAttribute(\"viewBox\", \"0 0 \" + this.$width + \" \" + this.$height + \"\");\r\n\t return svg;\r\n\t },\r\n\t _setDefaultView: function _setDefaultView(size) {\r\n\t assert(this.config.minRange < this.config.maxRange, \"Invalid Range Values\");\r\n\t size = size || (this._settings.layout == \"x\" ? this.$width : this.$height);\r\n\t var _view = this.$view;\r\n\t _view.innerHTML = \"\";\r\n\t var config = this._settings;\r\n\t var isLabel = config.label && config.label(config) || config.placeholder && config.placeholder(config);\r\n\t this._leftStart = isLabel ? config.labelHeight || config.labelWidth : 7;\r\n\t this._topStart = Math.floor((this._settings.barWidth - this._settings.stroke) / 2);\r\n\t this._chartWidth = size - this._leftStart - 30;\r\n\t this._scale = this._chartWidth / (this._settings.maxRange - this._settings.minRange);\r\n\r\n\t var svg = this._setView(); // scale height fix for ie\r\n\r\n\r\n\t svg.setAttribute(\"height\", this.$height);\r\n\t svg.setAttribute(\"width\", this.$width);\r\n\r\n\t _view.appendChild(svg);\r\n\r\n\t this._bulletValue = _view.querySelector(\".webix_bullet_value\");\r\n\t var label = this._settings.label;\r\n\t if (label) this.$view.querySelector(\".webix_bullet_header\").textContent = label(this._settings);\r\n\t var placeholder = this._settings.placeholder;\r\n\t if (placeholder) this.$view.querySelector(\".webix_bullet_subheader\").textContent = placeholder(this._settings);\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this._setDefaultView();\r\n\r\n\t this._animate(this._value, this._settings.value);\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t if (this._settings.value != value) {\r\n\t this._animate(this._settings.value, value);\r\n\t }\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this._settings.value;\r\n\t }\r\n\t};\r\n\tvar view$1i = exports.protoUI(api$1i, base.view);\r\n\r\n\tvar google, script;\r\n\tvar api$1j = {\r\n\t name: \"geochart\",\r\n\t defaults: {\r\n\t chart: {\r\n\t displayMode: \"auto\",\r\n\t region: \"world\",\r\n\t resolution: \"countries\"\r\n\t }\r\n\t },\r\n\t $init: function $init(config) {\r\n\t this.$view.innerHTML = \"
    \";\r\n\t this._contentobj = this.$view.firstChild;\r\n\t this._waitMap = Deferred.defer();\r\n\t config.chart = exports.extend(config.chart || {}, this.defaults.chart);\r\n\t this.data.provideApi(this, true);\r\n\t this.$ready.push(this.render);\r\n\t this.data.attachEvent(\"onClearAll\", bind(this._refreshColumns, this));\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(this._drawData, this));\r\n\t },\r\n\t getMap: function getMap(waitMap) {\r\n\t return waitMap ? this._waitMap : this._map;\r\n\t },\r\n\t _getCallBack: function _getCallBack(prev) {\r\n\t return bind(function () {\r\n\t if (typeof prev === \"function\") prev();\r\n\t google = google || window.google;\r\n\r\n\t this._initMap();\r\n\t }, this);\r\n\t },\r\n\t render: function render() {\r\n\t if (typeof window.google == \"undefined\" || typeof window.google.charts == \"undefined\") {\r\n\t if (!script) {\r\n\t script = document.createElement(\"script\");\r\n\t script.type = \"text/javascript\";\r\n\t script.src = \"//www.gstatic.com/charts/loader.js\";\r\n\t document.getElementsByTagName(\"head\")[0].appendChild(script);\r\n\t }\r\n\r\n\t script.onload = this._getCallBack(script.onload);\r\n\t } else //there's a custom link to google api in document head\r\n\t this._getCallBack()();\r\n\t },\r\n\t _initMap: function _initMap() {\r\n\t if (!google.visualization || !google.visualization.GeoChart) {\r\n\t google.charts.load(\"current\", {\r\n\t \"packages\": [\"geochart\"],\r\n\t \"mapsApiKey\": this._settings.key\r\n\t });\r\n\t google.charts.setOnLoadCallback(bind(function () {\r\n\t this._initMap();\r\n\t }, this));\r\n\t } else {\r\n\t this._map = new google.visualization.GeoChart(this._contentobj);\r\n\r\n\t this._mapEvents();\r\n\r\n\t this._waitMap.resolve(this._map);\r\n\t }\r\n\t },\r\n\t $onLoad: function $onLoad(obj) {\r\n\t if (!this._map) {\r\n\t this._waitMap.then(bind(function () {\r\n\t this.parse(obj, this._settings.datatype);\r\n\t }, this));\r\n\r\n\t return true;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t _drawData: function _drawData() {\r\n\t if (!this._map) {\r\n\t if (!this._map) this._waitMap.then(bind(this._drawData, this));\r\n\t return;\r\n\t }\r\n\r\n\t var columns = this._columns && this._columns.length ? this._columns : this._defineColumns();\r\n\t var data = [];\r\n\t this.data.each(function (obj) {\r\n\t var line = [];\r\n\r\n\t for (var c = 0; c < columns.length; c++) {\r\n\t var value = obj[columns[c].label];\r\n\t if (columns[c].type == \"number\") value = value * 1;else if (columns[c].role == \"tooltip\") value = this._settings.tooltip(obj);\r\n\t line.push(value);\r\n\t }\r\n\r\n\t data.push(line);\r\n\t }, this);\r\n\r\n\t if (columns.length) {\r\n\t var table = new google.visualization.DataTable();\r\n\r\n\t for (var i = 0; i < columns.length; i++) {\r\n\t table.addColumn(columns[i]);\r\n\t }\r\n\r\n\t table.addRows(data);\r\n\t var view = new google.visualization.DataView(table);\r\n\r\n\t this._map.draw(view, this._settings.chart);\r\n\t } else //draw clean chart\r\n\t this._map.draw(google.visualization.arrayToDataTable([[\"\", \"\"]]), {});\r\n\t },\r\n\t setDisplayMode: function setDisplayMode(value) {\r\n\t this._settings.chart.displayMode = value;\r\n\t this.refresh();\r\n\t },\r\n\t setRegion: function setRegion(value) {\r\n\t this._settings.chart.region = value;\r\n\t this.refresh();\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this._map.clearChart();\r\n\r\n\t this._drawData();\r\n\t },\r\n\t tooltip_setter: function tooltip_setter(value) {\r\n\t var tooltip = this._settings.chart.tooltip;\r\n\t this._settings.chart.tooltip = exports.extend(tooltip || {}, {\r\n\t isHtml: true\r\n\t });\r\n\t return template(value);\r\n\t },\r\n\t $setSize: function $setSize(w, h) {\r\n\t if (base.api.$setSize.apply(this, arguments) && this._map) {\r\n\t exports.extend(this._settings, {\r\n\t width: w,\r\n\t height: h\r\n\t });\r\n\t this.refresh();\r\n\t }\r\n\t },\r\n\t _refreshColumns: function _refreshColumns() {\r\n\t this._columns = null;\r\n\r\n\t this._drawData();\r\n\t },\r\n\t _getColumnType: function _getColumnType(item, key) {\r\n\t if (!item || isUndefined(item[key])) return \"string\";\r\n\r\n\t var type = _typeof(item[key]);\r\n\r\n\t if (type == \"string\" && !isNaN(item[key] * 1)) type = \"number\";\r\n\t return type;\r\n\t },\r\n\t _defineColumns: function _defineColumns() {\r\n\t var columns = this._settings.columns || [];\r\n\t var item = this.data.pull[this.data.order[0]]; //auto columns\r\n\r\n\t if (!columns.length && item) {\r\n\t for (var key in item) {\r\n\t if (key !== \"id\") columns.push(key);\r\n\t }\r\n\t } //[\"title\", \"area\"]\r\n\r\n\r\n\t for (var i = 0; i < columns.length; i++) {\r\n\t if (_typeof(columns[i]) !== \"object\") {\r\n\t columns[i] = {\r\n\t type: this._getColumnType(item, columns[i]),\r\n\t label: columns[i]\r\n\t };\r\n\t }\r\n\t }\r\n\r\n\t if (this._settings.tooltip) columns.push({\r\n\t type: \"string\",\r\n\t role: \"tooltip\",\r\n\t p: {\r\n\t \"html\": true\r\n\t }\r\n\t });\r\n\t this._columns = columns;\r\n\t return columns;\r\n\t },\r\n\t _mapEvents: function _mapEvents() {\r\n\t google.visualization.events.addListener(this._map, \"error\", bind(function () {\r\n\t this.callEvent(\"onMapError\", arguments);\r\n\t }, this));\r\n\t google.visualization.events.addListener(this._map, \"ready\", bind(function () {\r\n\t this.callEvent(\"onMapReady\", arguments);\r\n\t }, this));\r\n\t google.visualization.events.addListener(this._map, \"regionClick\", bind(function () {\r\n\t this.callEvent(\"onRegionClick\", arguments);\r\n\t }, this));\r\n\t google.visualization.events.addListener(this._map, \"select\", bind(function () {\r\n\t var selnow = this._map.getSelection()[0];\r\n\r\n\t var sel = selnow || this._selprev;\r\n\r\n\t if (sel) {\r\n\t var id = this.data.order[sel.row];\r\n\t this._selprev = sel;\r\n\t this.callEvent(\"onItemClick\", [id, !!selnow]);\r\n\t }\r\n\t }, this));\r\n\t }\r\n\t};\r\n\tvar view$1j = exports.protoUI(api$1j, DataLoader, EventSystem, base.view);\r\n\r\n\tvar google$1, script$1;\r\n\tvar api$1k = {\r\n\t name: \"google-map\",\r\n\t $init: function $init() {\r\n\t this.$view.innerHTML = \"
    \";\r\n\t this._contentobj = this.$view.firstChild;\r\n\t this._waitMap = Deferred.defer();\r\n\t this.data.provideApi(this, true);\r\n\t this.$ready.push(this.render);\r\n\t },\r\n\t getMap: function getMap(waitMap) {\r\n\t return waitMap ? this._waitMap : this._map;\r\n\t },\r\n\t _getCallBack: function _getCallBack(prev) {\r\n\t return bind(function () {\r\n\t if (typeof prev === \"function\") prev();\r\n\t google$1 = google$1 || window.google;\r\n\r\n\t this._initMap.call(this);\r\n\t }, this);\r\n\t },\r\n\t render: function render() {\r\n\t if (typeof window.google == \"undefined\" || typeof window.google.maps == \"undefined\") {\r\n\t if (!script$1) {\r\n\t script$1 = document.createElement(\"script\");\r\n\t script$1.type = \"text/javascript\";\r\n\t var config = this._settings;\r\n\t var src = config.src || \"//maps.google.com/maps/api/js\";\r\n\t src += src.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n\t if (config.key) src += \"&key=\" + config.key;\r\n\t if (config.libraries) src += \"&libraries=\" + config.libraries;\r\n\t script$1.src = src;\r\n\t document.getElementsByTagName(\"head\")[0].appendChild(script$1);\r\n\t }\r\n\r\n\t script$1.onload = this._getCallBack(script$1.onload);\r\n\t } else //there's a custom link to google api in document head\r\n\t this._getCallBack()();\r\n\t },\r\n\t _initMap: function _initMap() {\r\n\t var c = this.config;\r\n\r\n\t if (this.isVisible(c.id)) {\r\n\t this._map = new google$1.maps.Map(this._contentobj, {\r\n\t zoom: c.zoom,\r\n\t center: new google$1.maps.LatLng(c.center[0], c.center[1]),\r\n\t mapTypeId: google$1.maps.MapTypeId[c.mapType]\r\n\t });\r\n\r\n\t this._waitMap.resolve(this._map);\r\n\t }\r\n\t },\r\n\t center_setter: function center_setter(config) {\r\n\t if (this._map) this._map.setCenter(new google$1.maps.LatLng(config[0], config[1]));\r\n\t return config;\r\n\t },\r\n\t mapType_setter: function mapType_setter(config) {\r\n\t /*ROADMAP,SATELLITE,HYBRID,TERRAIN*/\r\n\t if (this._map) this._map.setMapTypeId(google$1.maps.MapTypeId[config]);\r\n\t return config;\r\n\t },\r\n\t zoom_setter: function zoom_setter(config) {\r\n\t if (this._map) this._map.setZoom(config);\r\n\t return config;\r\n\t },\r\n\t layerType_setter: function layerType_setter(config) {\r\n\t if (config == \"heatmap\") this.config.libraries = \"visualization\";\r\n\r\n\t if (this._layerApi[config]) {\r\n\t exports.extend(this, this._layerApi[config], true);\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(function () {\r\n\t this._waitMap.then(bind(function () {\r\n\t this.drawData.call(this, arguments);\r\n\t }, this));\r\n\t }, this));\r\n\t }\r\n\r\n\t return config;\r\n\t },\r\n\t defaults: {\r\n\t zoom: 5,\r\n\t center: [39.5, -98.5],\r\n\t mapType: \"ROADMAP\",\r\n\t layerType: \"marker\"\r\n\t },\r\n\t $setSize: function $setSize() {\r\n\t base.api.$setSize.apply(this, arguments);\r\n\t if (this._map) google$1.maps.event.trigger(this._map, \"resize\");\r\n\t },\r\n\t $onLoad: function $onLoad(data) {\r\n\t if (!this._map) {\r\n\t this._waitMap.then(bind(function () {\r\n\t this.parse(data);\r\n\t }, this));\r\n\r\n\t return true;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t _layerApi: {\r\n\t marker: {\r\n\t drawData: function drawData(id, item, operation) {\r\n\t switch (operation) {\r\n\t case \"add\":\r\n\t item.$marker = this._getItemConfig(item);\r\n\t break;\r\n\r\n\t case \"update\":\r\n\t item.$marker = this._getItemConfig(item);\r\n\t break;\r\n\r\n\t case \"delete\":\r\n\t item.$marker.setMap(null);\r\n\t break;\r\n\r\n\t default:\r\n\t this.data.each(function (item) {\r\n\t item.$marker = this._getItemConfig(item);\r\n\t }, this);\r\n\t break;\r\n\t }\r\n\t },\r\n\t clearAll: function clearAll(soft) {\r\n\t this.data.each(function (obj) {\r\n\t obj.$marker.setMap(null);\r\n\t });\r\n\t this.data.clearAll(soft);\r\n\t },\r\n\t showItem: function showItem(id) {\r\n\t var item = this.getItem(id);\r\n\r\n\t this._map.setCenter(new google$1.maps.LatLng(item.lat, item.lng));\r\n\t },\r\n\t _getItemConfig: function _getItemConfig(item) {\r\n\t var obj = {};\r\n\r\n\t for (var i in item) {\r\n\t obj[i] = item[i];\r\n\t }\r\n\r\n\t obj.position = new google$1.maps.LatLng(item.lat, item.lng);\r\n\t obj.map = item.hidden ? null : this._map;\r\n\t var marker = item.$marker;\r\n\r\n\t if (!marker) {\r\n\t marker = new google$1.maps.Marker(obj);\r\n\r\n\t this._events(marker);\r\n\t } else {\r\n\t item.$marker.setMap(obj.map);\r\n\t }\r\n\r\n\t this.callEvent(\"onItemRender\", [item]);\r\n\t return marker;\r\n\t },\r\n\t _events: function _events(marker) {\r\n\t var map = this;\r\n\t marker.addListener(\"click\", function () {\r\n\t map.callEvent(\"onItemClick\", [this.id, this]);\r\n\t });\r\n\r\n\t if (marker.getDraggable()) {\r\n\t marker.addListener(\"dragend\", function () {\r\n\t map._onDrag(this, true);\r\n\t });\r\n\t marker.addListener(\"drag\", function () {\r\n\t map._onDrag(this);\r\n\t });\r\n\t }\r\n\t },\r\n\t _onDrag: function _onDrag(marker, end) {\r\n\t var item = this.getItem(marker.id);\r\n\t var pos = marker.getPosition();\r\n\t var ev = end ? \"onAfterDrop\" : \"onDrag\";\r\n\t item.lat = pos.lat();\r\n\t item.lng = pos.lng();\r\n\t this.callEvent(ev, [item.id, item]);\r\n\t }\r\n\t },\r\n\t heatmap: {\r\n\t heatmapConfig_setter: function heatmapConfig_setter(value) {\r\n\t value = value || {};\r\n\t return value;\r\n\t },\r\n\t drawData: function drawData() {\r\n\t if (this._heatmap) {\r\n\t this._heatmap.setMap(null);\r\n\r\n\t this._heatmap = null;\r\n\t }\r\n\r\n\t var hdata = [];\r\n\t this.data.each(function (item) {\r\n\t hdata.push(this._getConfig(item));\r\n\t }, this);\r\n\r\n\t if (hdata.length) {\r\n\t var data = exports.extend(this.config.heatmapConfig, {\r\n\t data: hdata,\r\n\t map: this._map\r\n\t }, true);\r\n\t this._heatmap = new google$1.maps.visualization.HeatmapLayer(data);\r\n\t this.callEvent(\"onHeatMapRender\", [this._heatmap]);\r\n\t }\r\n\t },\r\n\t getHeatmap: function getHeatmap() {\r\n\t return this._heatmap;\r\n\t },\r\n\t _getConfig: function _getConfig(item) {\r\n\t var obj = {};\r\n\r\n\t for (var i in item) {\r\n\t obj[i] = item[i];\r\n\t }\r\n\r\n\t obj.location = new google$1.maps.LatLng(item.lat, item.lng);\r\n\t return obj;\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$1k = exports.protoUI(api$1k, DataLoader, EventSystem, base.view);\r\n\r\n\t/*\r\n\t\tUI:Organogram\r\n\t*/\r\n\r\n\tvar api$1l = {\r\n\t name: \"organogram\",\r\n\t defaults: {\r\n\t scroll: \"auto\",\r\n\t ariaLabel: \"lines\"\r\n\t },\r\n\t $init: function $init() {\r\n\t this._viewobj.className += \" webix_organogram\"; //map API of DataStore on self\r\n\r\n\t this._html = document.createElement(\"DIV\");\r\n\t this.$ready.push(this._afterInit);\r\n\t exports.extend(this.data, TreeStore, true);\r\n\t this.data.provideApi(this, true);\r\n\t },\r\n\t //attribute , which will be used for ID storing\r\n\t _id: \"webix_dg_id\",\r\n\t //supports custom context menu\r\n\t on_click: {\r\n\t webix_organogram_item: function webix_organogram_item(e, id) {\r\n\t if (this._settings.select) {\r\n\t if (this._settings.select == \"multiselect\" || this._settings.multiselect) this.select(id, false, e.ctrlKey || e.metaKey || this._settings.multiselect == \"touch\", e.shiftKey); //multiselection\r\n\t else this.select(id);\r\n\t this._no_animation = false;\r\n\t }\r\n\t }\r\n\t },\r\n\t on_context: {},\r\n\t on_dblclick: {},\r\n\t _afterInit: function _afterInit() {\r\n\t this._dataobj.style.position = \"relative\";\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(this.render, this));\r\n\t },\r\n\t _toHTMLItem: function _toHTMLItem(obj) {\r\n\t var mark = this.data._marks[obj.id];\r\n\t this.callEvent(\"onItemRender\", [obj]);\r\n\t return this.type.templateStart.call(this, obj, this.type, mark) + (obj.$template ? this.type[\"template\" + obj.$template].call(this, obj, this.type, mark) : this.type.template.call(this, obj, this.type, mark)) + this.type.templateEnd.call(this);\r\n\t },\r\n\t _toHTML: function _toHTML(obj) {\r\n\t //check if related template exist\r\n\t var html = this._toHTMLItem(obj);\r\n\r\n\t if (this.data.branch[obj.id]) html += this._renderBranch(obj.id);\r\n\t return html;\r\n\t },\r\n\t _isListBlocks: function _isListBlocks() {\r\n\t return this.type.listMarginX || this.type.listMarginY;\r\n\t },\r\n\t _renderBranch: function _renderBranch(pId, leftOffset) {\r\n\t var i,\r\n\t id,\r\n\t html = \"\",\r\n\t leaves = this.data.branch[pId],\r\n\t marks = this.data._marks[pId],\r\n\t pItem = this.getItem(pId),\r\n\t sizes,\r\n\t totalWidth,\r\n\t type = pItem ? pItem.$type : false;\r\n\t leftOffset = leftOffset || 0;\r\n\t if (type === \"list\") leftOffset += this.type.listMarginX;\r\n\r\n\t if (!pId) {\r\n\t this._colHeight = [];\r\n\t this.$xy = {};\r\n\t totalWidth = this.$width - this.type.padding * 2;\r\n\t this.$xy[0] = {\r\n\t totalWidth: totalWidth,\r\n\t start: this.type.padding,\r\n\t width: 0,\r\n\t height: 0,\r\n\t left: totalWidth / 2,\r\n\t top: this.type.padding || 0\r\n\t };\r\n\t }\r\n\r\n\t if (leaves) {\r\n\t sizes = this.$xy[pId]; // draw items inside list container\r\n\r\n\t if (type == \"list\" && !this._isListBlocks()) {\r\n\t html += this.type.templateListStart.call(this, pItem, this.type, marks);\r\n\t } // render items and calculate heights\r\n\r\n\r\n\t var sumTotalWidth = 0;\r\n\t var childHeight = 0;\r\n\r\n\t for (i = 0; i < leaves.length; i++) {\r\n\t id = leaves[i];\r\n\t totalWidth = this._tw[id];\r\n\t var obj = this.getItem(id);\r\n\t if (obj.open == undefined) obj.open = true;\r\n\t if (type == \"list\") this.data.addMark(id, \"list_item\", \"\", 1, true);\r\n\r\n\t var height = this._getItemHeight(id);\r\n\r\n\t if (type == \"list\") {\r\n\t var itemMargin = 0;\r\n\t if (this._isListBlocks()) itemMargin = this.type.listMarginY;else if (!i) itemMargin = this.type.marginY;\r\n\t this.$xy[id] = {\r\n\t totalWidth: totalWidth,\r\n\t start: sizes.start,\r\n\t width: this.type.width,\r\n\t height: height,\r\n\t left: sizes.start + totalWidth / 2 - this.type.width / 2 + leftOffset,\r\n\t top: i ? this.$xy[leaves[i - 1]].top + this.$xy[leaves[i - 1]].height + itemMargin + childHeight : sizes.top + sizes.height + itemMargin\r\n\t };\r\n\t childHeight = this.data.branch[id] ? this._getBranchHeight(id) : 0;\r\n\t } else {\r\n\t this.$xy[id] = {\r\n\t totalWidth: totalWidth,\r\n\t start: sizes.start + sumTotalWidth,\r\n\t width: this.type.width,\r\n\t height: height,\r\n\t left: sizes.start + sumTotalWidth + totalWidth / 2 - this.type.width / 2,\r\n\t top: sizes.top + sizes.height + (pId ? this.type.marginY : 0)\r\n\t };\r\n\t }\r\n\r\n\t html += this._toHTMLItem(obj);\r\n\t sumTotalWidth += totalWidth;\r\n\t } // draw child branches\r\n\r\n\r\n\t for (i = 0; i < leaves.length; i++) {\r\n\t id = leaves[i];\r\n\r\n\t if (this.data.branch[id] && this.getItem(id).open) {\r\n\t html += this._renderBranch(id, leftOffset);\r\n\t } else if (pItem) {\r\n\t if (pItem.$type != \"list\") this._colHeight.push(this.$xy[id].top + this.$xy[id].height);else if (i == leaves.length - 1) {\r\n\t this._colHeight.push(this.$xy[id].top + this.$xy[id].height);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t var leftmost = 0;\r\n\r\n\t for (var key in this.$xy) {\r\n\t var _obj = this.$xy[key];\r\n\t leftmost = Math.max(_obj.left + _obj.width, leftmost);\r\n\t }\r\n\r\n\t this._dataobj.style.width = leftmost + this.type.padding + this.type.marginX / 2 + \"px\";\r\n\t if (type == \"list\" && !this._isListBlocks()) html += this.type.templateListEnd(pItem, this.type, marks);\r\n\t }\r\n\r\n\t return html;\r\n\t },\r\n\t _getBranchHeight: function _getBranchHeight(id) {\r\n\t var items = this.data.branch[id];\r\n\t var height = 0;\r\n\r\n\t for (var i = 0; i < items.length; i++) {\r\n\t height += this._getItemHeight(items[i]) + this.type.listMarginY;\r\n\t if (this.data.branch[items[i]]) height += this._getBranchHeight(items[i]);\r\n\t }\r\n\r\n\t return height + this.type.marginY;\r\n\t },\r\n\t _getItemHeight: function _getItemHeight(id) {\r\n\t var item = this.getItem(id);\r\n\t var height = this.type.height;\r\n\r\n\t if (typeof height == \"function\") {\r\n\t height = height.call(item, this.type, this.data._marks[id]);\r\n\t }\r\n\r\n\t if (!this._hDiv) {\r\n\t this._hDiv = create(\"div\");\r\n\r\n\t this._dataobj.appendChild(this._hDiv);\r\n\t }\r\n\r\n\t this._hDiv.className = this.type.classname(item, this.type, this.data._marks[id]);\r\n\t this._hDiv.style.cssText = \"width:\" + this.type.width + \"px;height:\" + height + (height == \"auto\" ? \"\" : \"px\") + \";\";\r\n\t this._hDiv.innerHTML = this.type.template.call(this, item, this.type, this.data._marks[id]);\r\n\t return this._hDiv.scrollHeight;\r\n\t },\r\n\t _calcTotalWidth: function _calcTotalWidth() {\r\n\t var tw = {};\r\n\t var width = this.type.width;\r\n\t var margin = this.type.marginX;\r\n\t this.data.each(function (obj) {\r\n\t tw[obj.id] = width + margin;\r\n\t var parentId = this.getParentId(obj.id);\r\n\t if (parentId && this.getItem(parentId).$type != \"list\") while (parentId) {\r\n\t var leaves = this.branch[parentId];\r\n\t tw[parentId] = 0;\r\n\r\n\t for (var i = 0; i < leaves.length; i++) {\r\n\t tw[parentId] += tw[leaves[i]] || 0;\r\n\t }\r\n\r\n\t parentId = this.getParentId(parentId);\r\n\t }\r\n\t });\r\n\t this._tw = tw;\r\n\t return tw;\r\n\t },\r\n\t getItemNode: function getItemNode(searchId) {\r\n\t if (this._htmlmap) return this._htmlmap[searchId]; //fill map if it doesn't created yet\r\n\r\n\t this._htmlmap = {};\r\n\t var t = this._dataobj.childNodes;\r\n\r\n\t for (var i = 0; i < t.length; i++) {\r\n\t var id = t[i].getAttribute(this._id); //get item's\r\n\r\n\t if (id) this._htmlmap[id] = t[i];\r\n\r\n\t if (t[i].className.indexOf(\"webix_organogram_list\") != -1 && !this._isListBlocks()) {\r\n\t var listNodes = t[i].childNodes;\r\n\r\n\t for (var j = 0; j < listNodes.length; j++) {\r\n\t id = listNodes[j].getAttribute(this._id); //get item's\r\n\r\n\t if (id) this._htmlmap[id] = listNodes[j];\r\n\t }\r\n\t }\r\n\t } //call locator again, when map is filled\r\n\r\n\r\n\t return this.getItemNode(searchId);\r\n\t },\r\n\t _toHTMLObject: function _toHTMLObject(obj) {\r\n\t this._html.innerHTML = this._toHTMLItem(obj);\r\n\t return this._html.firstChild;\r\n\t },\r\n\t render: function render(id, data, type) {\r\n\t if (!this.isVisible(this._settings.id) || this.$blockRender) return;\r\n\r\n\t if (type == \"update\") {\r\n\t var cont = this.getItemNode(id); //get html element of updated item\r\n\r\n\t var t = this._htmlmap[id] = this._toHTMLObject(data);\r\n\r\n\t insertBefore(t, cont);\r\n\t remove(cont);\r\n\t return true;\r\n\t } else {\r\n\t //full reset\r\n\t if (this.callEvent(\"onBeforeRender\", [this.data])) {\r\n\t this._calcTotalWidth();\r\n\r\n\t this._htmlmap = null;\r\n\t this._dataobj.innerHTML = this._renderBranch(0);\r\n\t this._hDiv = null;\r\n\t this._dataobj.style.height = Math.max.apply(Math, this._colHeight) + this.type.padding + \"px\";\r\n\r\n\t this._renderCanvas();\r\n\r\n\t this.resize();\r\n\t this.callEvent(\"onAfterRender\", []);\r\n\t }\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t _renderCanvas: function _renderCanvas() {\r\n\t if (this.canvas) this.canvas.clearCanvas(true);\r\n\t this.canvas = new Canvas({\r\n\t container: this._dataobj,\r\n\t name: this.name,\r\n\t title: this._settings.ariaLabel,\r\n\t width: this._dataobj.offsetWidth,\r\n\t height: this._dataobj.offsetHeight\r\n\t });\r\n\r\n\t this._drawLines(0);\r\n\t },\r\n\t _drawLine: function _drawLine(ctx, x1, y1, x2, y2, color, width) {\r\n\t ctx.strokeStyle = color;\r\n\t ctx.lineCap = \"square\";\r\n\t ctx.lineWidth = width;\r\n\t ctx.beginPath();\r\n\t ctx.moveTo(x1, y1);\r\n\t ctx.lineTo(x2, y2);\r\n\t ctx.stroke();\r\n\t ctx.lineWidth = 1;\r\n\t },\r\n\t _drawLines: function _drawLines(id, ctx) {\r\n\t var i, item, leaves, p, s, x12, y1, y2, start, end;\r\n\t if (!ctx) ctx = this.canvas.getCanvas();\r\n\r\n\t if (!this.$xy) {\r\n\t return;\r\n\t }\r\n\r\n\t id = id || 0;\r\n\t leaves = this.data.branch[id];\r\n\t item = this.getItem(id);\r\n\r\n\t if (leaves && leaves.length) {\r\n\t p = this.$xy[id]; // draw a vertical line between parent and nodes\r\n\r\n\t if (id) {\r\n\t x12 = parseInt(p.left + p.width / 2, 10) + 0.5;\r\n\t y1 = parseInt(p.top + p.height, 10);\r\n\t y2 = parseInt(p.top + p.height + this.type.marginY / 2, 10);\r\n\r\n\t if (item.$type == \"list\") {\r\n\t if (!this._isListBlocks()) {\r\n\t y2 = parseInt(p.top + p.height + this.type.marginY, 10);\r\n\r\n\t this._drawLine(ctx, x12, y1, x12, y2, this.type.lineColor);\r\n\r\n\t return;\r\n\t }\r\n\t } else this._drawLine(ctx, x12, y1, x12, y2, this.type.lineColor);\r\n\t }\r\n\r\n\t y1 = parseInt(p.top + p.height + this.type.marginY / 2, 10) + 0.5;\r\n\r\n\t for (i = 0; i < leaves.length; i++) {\r\n\t if (id) {\r\n\t s = this.$xy[leaves[i]];\r\n\r\n\t if (item.$type == \"list\" && this._isListBlocks()) {\r\n\t x12 = parseInt(p.left + this.type.listMarginX / 2, 10) + 0.5;\r\n\t if (!i) start = x12;else if (i == leaves.length - 1) end = x12;\r\n\t y2 = parseInt(s.top + s.height / 2, 10);\r\n\r\n\t this._drawLine(ctx, x12, y1 - this.type.marginY / 2, x12, y2, this.type.lineColor);\r\n\r\n\t this._drawLine(ctx, x12, y2, x12 + this.type.listMarginX / 2, y2, this.type.lineColor);\r\n\t } else {\r\n\t x12 = parseInt(s.left + s.width / 2, 10) + 0.5;\r\n\t if (!i) start = x12;else if (i == leaves.length - 1) end = x12;\r\n\t y2 = parseInt(s.top, 10);\r\n\r\n\t this._drawLine(ctx, x12, y1, x12, y2, this.type.lineColor);\r\n\t }\r\n\t }\r\n\r\n\t if (this.getItem(leaves[i]).open) this._drawLines(leaves[i], ctx);\r\n\t }\r\n\r\n\t if (id) this._drawLine(ctx, start, y1, end, y1, this.type.lineColor);\r\n\t }\r\n\t },\r\n\t //autowidth, autoheight - no inner scroll\r\n\t //scrollable - width, height, auto, with scroll\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t var aW = this._settings.autowidth;\r\n\t var aH = this._settings.autoheight;\r\n\r\n\t if (aW) {\r\n\t dx = this._dataobj.offsetWidth + (this._dataobj.offsetHeight > dy && !aH ? env.scrollSize : 0);\r\n\t }\r\n\r\n\t if (aH) {\r\n\t dy = this._dataobj.offsetHeight + (this._dataobj.offsetWidth > dx && !aW ? env.scrollSize : 0);\r\n\t }\r\n\r\n\t return base.api.$getSize.call(this, dx, dy);\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t this._dataobj.style.width = this.$width + \"px\";\r\n\t this._dataobj.style.height = this.$height + \"px\";\r\n\t this.render();\r\n\t }\r\n\t },\r\n\t //css class to action map, for dblclick event\r\n\t type: {\r\n\t width: 120,\r\n\t height: \"auto\",\r\n\t padding: 20,\r\n\t marginX: 20,\r\n\t marginY: 20,\r\n\t listMarginX: 0,\r\n\t listMarginY: 0,\r\n\t lineColor: $active.organogramLineColor || \"#90caf9\",\r\n\t classname: function classname(obj, common, marks) {\r\n\t var css = \"webix_organogram_item \";\r\n\r\n\t if (obj.$css) {\r\n\t if (_typeof(obj.$css) == \"object\") obj.$css = createCss(obj.$css);\r\n\t css += \" \" + obj.$css;\r\n\t }\r\n\r\n\t if (marks && marks.list_item) css += \" webix_organogram_list_item \";\r\n\t if (marks && marks.$css) css += marks.$css;\r\n\t css += \" webix_organogram_level_\" + obj.$level;\r\n\t return css;\r\n\t },\r\n\t listClassName: function listClassName(obj) {\r\n\t var css = \"webix_organogram_list webix_organogram_list_\" + obj.$level;\r\n\r\n\t if (obj.$listCss) {\r\n\t if (_typeof(obj.$listCss) == \"object\") obj.$listCss = createCss(obj.$listCss);\r\n\t css += \" \" + obj.$listCss;\r\n\t }\r\n\r\n\t return css;\r\n\t },\r\n\t template: template(\"#value#\"),\r\n\t templateStart: function templateStart(obj, type, marks) {\r\n\t var style = \"\";\r\n\r\n\t if ((!(marks && marks.list_item) || type.listMarginX || type.listMarginY) && this.$xy) {\r\n\t var xy = this.$xy[obj.id];\r\n\t style += \"width: \" + xy.width + \"px; height: \" + xy.height + \"px;\";\r\n\t style += \"top: \" + xy.top + \"px; left: \" + xy.left + \"px;\";\r\n\t }\r\n\r\n\t return \"
    \";\r\n\t },\r\n\t templateEnd: template(\"
    \"),\r\n\t templateListStart: function templateListStart(obj, type, marks) {\r\n\t var style = \"\";\r\n\r\n\t if (this.$xy) {\r\n\t var xy = this.$xy[obj.id];\r\n\t style += \"width: \" + xy.width + \"px;\";\r\n\t style += \"top: \" + (xy.top + xy.height + type.marginY) + \"px; left: \" + xy.left + \"px;\";\r\n\t }\r\n\r\n\t return \"
    \";\r\n\t },\r\n\t templateListEnd: template(\"
    \")\r\n\t }\r\n\t};\r\n\tvar view$1l = exports.protoUI(api$1l, AutoTooltip, Group, TreeAPI, DataMarks, SelectionModel, MouseEvents, Scrollable, RenderStack, TreeDataLoader, DataLoader, base.view, EventSystem);\r\n\r\n\tvar Pie$1 = {\r\n\t $render_pie: function $render_pie(ctx, data, x, y, sIndex, map) {\r\n\t this._renderPie(ctx, data, x, y, 1, map, sIndex);\r\n\t },\r\n\r\n\t /**\r\n\t * renders a pie chart\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: x - the width of the container\r\n\t * @param: y - the height of the container\r\n\t * @param: ky - value from 0 to 1 that defines an angle of inclination (0= 0 || a1 >= 0 && a2 <= Math.PI || Math.abs(a1 - Math.PI) > 0.003 && a1 <= Math.PI && a2 >= Math.PI)) return;\r\n\r\n\t if (a1 <= 0 && a2 >= 0) {\r\n\t a1 = 0;\r\n\t line = false;\r\n\r\n\t this._drawSectorLine(ctx, x0, y0, R, a1, a2);\r\n\t }\r\n\r\n\t if (a1 <= Math.PI && a2 >= Math.PI) {\r\n\t a2 = Math.PI;\r\n\t line = false;\r\n\r\n\t this._drawSectorLine(ctx, x0, y0, R, a1, a2);\r\n\t }\r\n\t /*the height of 3D pie*/\r\n\r\n\r\n\t var offset = (this._settings.pieHeight || Math.floor(R / 4)) / this._settings.cant;\r\n\r\n\t ctx.beginPath();\r\n\t ctx.arc(x0, y0, R, a1, a2, false);\r\n\t ctx.lineTo(x0 + R * Math.cos(a2), y0 + R * Math.sin(a2) + offset);\r\n\t ctx.arc(x0, y0 + offset, R, a2, a1, true);\r\n\t ctx.lineTo(x0 + R * Math.cos(a1), y0 + R * Math.sin(a1));\r\n\t ctx.fill();\r\n\t if (line) ctx.stroke();\r\n\t },\r\n\r\n\t /**\r\n\t * draws a serctor arc\r\n\t */\r\n\t _drawSectorLine: function _drawSectorLine(ctx, x0, y0, R, a1, a2) {\r\n\t ctx.beginPath();\r\n\t ctx.arc(x0, y0, R, a1, a2, false);\r\n\t ctx.stroke();\r\n\t },\r\n\r\n\t /**\r\n\t * adds a shadow to pie\r\n\t * @param: ctx - canvas object\r\n\t * @param: x - the horizontal position of the pie center\r\n\t * @param: y - the vertical position of the pie center\r\n\t * @param: R - pie radius\r\n\t */\r\n\t _addShadow: function _addShadow(ctx, x, y, R) {\r\n\t ctx.globalAlpha = 0.5;\r\n\t var shadows = [\"#c4c4c4\", \"#c6c6c6\", \"#cacaca\", \"#dcdcdc\", \"#dddddd\", \"#e0e0e0\", \"#eeeeee\", \"#f5f5f5\", \"#f8f8f8\"];\r\n\r\n\t for (var i = shadows.length - 1; i > -1; i--) {\r\n\t ctx.beginPath();\r\n\t ctx.fillStyle = shadows[i];\r\n\t ctx.arc(x + 1, y + 1, R + i, 0, Math.PI * 2, true);\r\n\t ctx.fill();\r\n\t }\r\n\r\n\t ctx.globalAlpha = 1;\r\n\t },\r\n\r\n\t /**\r\n\t * returns a gray gradient\r\n\t * @param: gradient - gradient object\r\n\t */\r\n\t _getGrayGradient: function _getGrayGradient(gradient) {\r\n\t gradient.addColorStop(0.0, \"#ffffff\");\r\n\t gradient.addColorStop(0.7, \"#7a7a7a\");\r\n\t gradient.addColorStop(1.0, \"#000000\");\r\n\t return gradient;\r\n\t },\r\n\r\n\t /**\r\n\t * adds gray radial gradient\r\n\t * @param: ctx - canvas object\r\n\t * @param: x - the horizontal position of the pie center\r\n\t * @param: y - the vertical position of the pie center\r\n\t * @param: radius - pie radius\r\n\t * @param: x0 - the horizontal position of a gradient center\r\n\t * @param: y0 - the vertical position of a gradient center\r\n\t */\r\n\t _showRadialGradient: function _showRadialGradient(ctx, x, y, radius, x0, y0) {\r\n\t //ctx.globalAlpha = 0.3;\r\n\t ctx.beginPath();\r\n\t var gradient;\r\n\r\n\t if (typeof this._settings.gradient != \"function\") {\r\n\t gradient = ctx.createRadialGradient(x0, y0, radius / 4, x, y, radius);\r\n\t gradient = this._getGrayGradient(gradient);\r\n\t } else gradient = this._settings.gradient(gradient);\r\n\r\n\t ctx.fillStyle = gradient;\r\n\t ctx.arc(x, y, radius, 0, Math.PI * 2, true);\r\n\t ctx.fill(); //ctx.globalAlpha = 1;\r\n\r\n\t ctx.globalAlpha = 0.7;\r\n\t },\r\n\r\n\t /**\r\n\t * returns the calculates pie parameters: center position and radius\r\n\t * @param: ctx - canvas object\r\n\t * @param: x0 - the horizontal position of the pie center\r\n\t * @param: y0 - the vertical position of the pie center\r\n\t * @param: R - pie radius\r\n\t * @param: alpha1 - the angle that defines the 1st edge of a sector\r\n\t * @param: alpha2 - the angle that defines the 2nd edge of a sector\r\n\t * @param: ky - the value that defines an angle of inclination\r\n\t * @param: text - label text\r\n\t * @param: in_width (boolean) - if label needs being displayed inside a pie\r\n\t */\r\n\t _drawSectorLabel: function _drawSectorLabel(x0, y0, R, alpha1, alpha2, ky, text, in_width) {\r\n\t var t = this.canvases[0].renderText(0, 0, text, 0, 1);\r\n\t if (!t) return; //get existing width of text\r\n\r\n\t var labelWidth = t.scrollWidth;\r\n\t t.style.width = labelWidth + \"px\"; //adjust text label to fit all text\r\n\r\n\t if (labelWidth > x0) labelWidth = x0; //the text can't be greater than half of view\r\n\t //calculate expected correction based on default font metrics\r\n\r\n\t var width = alpha2 - alpha1 < 0.2 ? 4 : 8;\r\n\t if (in_width) width = labelWidth / 1.8;\r\n\t var alpha = alpha1 + (alpha2 - alpha1) / 2; //position and its correction\r\n\r\n\t R = R - (width - 8) / 2;\r\n\t var corr_x = -width;\r\n\t var corr_y = -8;\r\n\t var align = \"right\"; //for items in left upper and lower sector\r\n\r\n\t if (alpha >= Math.PI / 2 && alpha < Math.PI || alpha <= 3 * Math.PI / 2 && alpha >= Math.PI) {\r\n\t corr_x = -labelWidth - corr_x + 1;\r\n\t /*correction for label width*/\r\n\r\n\t align = \"left\";\r\n\t }\r\n\t /*\r\n\t calculate position of text\r\n\t basically get point at center of pie sector\r\n\t */\r\n\r\n\r\n\t var offset = 0;\r\n\t if (!in_width && ky < 1 && alpha > 0 && alpha < Math.PI) offset = (this._settings.height || Math.floor(R / 4)) / ky;\r\n\t var y = (y0 + Math.floor((R + offset) * Math.sin(alpha))) * ky + corr_y;\r\n\t var x = x0 + Math.floor((R + width / 2) * Math.cos(alpha)) + corr_x;\r\n\t /*\r\n\t if pie sector starts in left of right part pie,\r\n\t related text\tmust be placed to the left of to the right of pie as well\r\n\t */\r\n\r\n\t var left_end = alpha2 < Math.PI / 2 + 0.01;\r\n\t var left_start = alpha1 < Math.PI / 2;\r\n\r\n\t if (left_start && left_end) {\r\n\t x = Math.max(x, x0 + 3); //right part of pie\r\n\r\n\t /*if(alpha2-alpha1<0.2)\r\n\t \tx = x0;*/\r\n\t } else if (!left_start && !left_end) x = Math.min(x, x0 - labelWidth); //left part of pie\r\n\t else if (!in_width && (alpha >= Math.PI / 2 && alpha < Math.PI || alpha <= 3 * Math.PI / 2 && alpha >= Math.PI)) {\r\n\t x += labelWidth / 3;\r\n\t } //we need to set position of text manually, based on above calculations\r\n\r\n\r\n\t t.style.top = y + \"px\";\r\n\t t.style.left = x + \"px\";\r\n\t t.style.width = labelWidth + \"px\";\r\n\t t.style.textAlign = align;\r\n\t t.style.whiteSpace = \"nowrap\";\r\n\t },\r\n\t $render_pie3D: function $render_pie3D(ctx, data, x, y, sIndex, map) {\r\n\t this._renderPie(ctx, data, x, y, this._settings.cant, map);\r\n\t },\r\n\t $render_donut: function $render_donut(ctx, data, point0, point1, sIndex, map) {\r\n\t if (!data.length) return;\r\n\r\n\t this._renderPie(ctx, data, point0, point1, 1, map, sIndex);\r\n\r\n\t var config = this._settings;\r\n\r\n\t var coord = this._getPieParameters(point0, point1);\r\n\r\n\t var pieRadius = config.radius ? config.radius : coord.radius;\r\n\t var innerRadius = config.innerRadius && config.innerRadius < pieRadius ? config.innerRadius : pieRadius / 3;\r\n\t var x0 = config.x ? config.x : coord.x;\r\n\t var y0 = config.y ? config.y : coord.y;\r\n\t ctx.fillStyle = \"#ffffff\";\r\n\t ctx.beginPath();\r\n\t ctx.arc(x0, y0, innerRadius, 0, Math.PI * 2, true);\r\n\t ctx.fill();\r\n\t }\r\n\t};\r\n\r\n\tvar BarChart = {\r\n\t /**\r\n\t * renders a bar chart\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: x - the width of the container\r\n\t * @param: y - the height of the container\r\n\t * @param: sIndex - index of drawing chart\r\n\t */\r\n\t $render_bar: function $render_bar(ctx, data, point0, point1, sIndex, map) {\r\n\t var barWidth,\r\n\t cellWidth,\r\n\t i,\r\n\t limits,\r\n\t maxValue,\r\n\t minValue,\r\n\t relValue,\r\n\t valueFactor,\r\n\t relativeValues,\r\n\t startValue,\r\n\t unit,\r\n\t xax,\r\n\t yax,\r\n\t totalHeight = point1.y - point0.y;\r\n\t yax = !!this._settings.yAxis;\r\n\t xax = !!this._settings.xAxis;\r\n\t limits = this._getLimits();\r\n\t maxValue = limits.max;\r\n\t minValue = limits.min;\r\n\t /*an available width for one bar*/\r\n\r\n\t cellWidth = (point1.x - point0.x) / data.length;\r\n\t /*draws x and y scales*/\r\n\r\n\t if (!sIndex && !(this._settings.origin != \"auto\" && !yax)) {\r\n\t this._drawScales(data, point0, point1, minValue, maxValue, cellWidth);\r\n\t }\r\n\t /*necessary for automatic scale*/\r\n\r\n\r\n\t if (yax) {\r\n\t maxValue = parseFloat(this._settings.yAxis.end);\r\n\t minValue = parseFloat(this._settings.yAxis.start);\r\n\t }\r\n\t /*unit calculation (bar_height = value*unit)*/\r\n\r\n\r\n\t relativeValues = this._getRelativeValue(minValue, maxValue);\r\n\t relValue = relativeValues[0];\r\n\t valueFactor = relativeValues[1];\r\n\t unit = relValue ? totalHeight / relValue : relValue;\r\n\r\n\t if (!yax && !(this._settings.origin != \"auto\" && xax)) {\r\n\t /*defines start value for better representation of small values*/\r\n\t startValue = 10;\r\n\t unit = relValue ? (totalHeight - startValue) / relValue : startValue;\r\n\t }\r\n\t /*if yAxis isn't set, but with custom origin */\r\n\r\n\r\n\t if (!sIndex && this._settings.origin != \"auto\" && !yax && this._settings.origin > minValue) {\r\n\t this._drawXAxis(ctx, data, point0, point1, cellWidth, point1.y - unit * (this._settings.origin - minValue));\r\n\t }\r\n\t /*a real bar width */\r\n\r\n\r\n\t barWidth = parseInt(this._settings.barWidth, 10);\r\n\t var seriesNumber = 0;\r\n\t var seriesIndex = 0;\r\n\r\n\t for (i = 0; i < this._series.length; i++) {\r\n\t if (i == sIndex) {\r\n\t seriesIndex = seriesNumber;\r\n\t }\r\n\r\n\t if (this._series[i].type == \"bar\") seriesNumber++;\r\n\t }\r\n\r\n\t if (this._series && barWidth * seriesNumber + 4 > cellWidth) barWidth = parseInt(cellWidth / seriesNumber - 4, 10);\r\n\t /*the half of distance between bars*/\r\n\r\n\t var barOffset = (cellWidth - barWidth * seriesNumber) / 2;\r\n\t /*the radius of rounding in the top part of each bar*/\r\n\r\n\t var radius = typeof this._settings.radius != \"undefined\" ? parseInt(this._settings.radius, 10) : Math.round(barWidth / 5);\r\n\t var inner_gradient = false;\r\n\t var gradient = this._settings.gradient;\r\n\r\n\t if (gradient && typeof gradient != \"function\") {\r\n\t inner_gradient = gradient;\r\n\t gradient = false;\r\n\t } else if (gradient) {\r\n\t gradient = ctx.createLinearGradient(0, point1.y, 0, point0.y);\r\n\r\n\t this._settings.gradient(gradient);\r\n\t }\r\n\t /*draws a black line if the horizontal scale isn't defined*/\r\n\r\n\r\n\t if (!xax) {\r\n\t this._drawLine(ctx, point0.x, point1.y + 0.5, point1.x, point1.y + 0.5, \"#edeff0\", 1); //hardcoded color!\r\n\r\n\t }\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t var value = parseFloat(this._settings.value(data[i]) || 0);\r\n\t if (this._logScaleCalc) value = this._log10(value);\r\n\t if (value > maxValue) value = maxValue;\r\n\t value -= minValue;\r\n\t value *= valueFactor;\r\n\t /*start point (bottom left)*/\r\n\r\n\t var x0 = point0.x + barOffset + i * cellWidth + (barWidth + 1) * seriesIndex;\r\n\t var y0 = point1.y;\r\n\r\n\t var color$$1 = gradient || this._settings.color.call(this, data[i]);\r\n\r\n\t var border = this._settings.border ? 1 : 0;\r\n\r\n\t var label = this._settings.label(data[i]);\r\n\t /* don't draw borders and labels for not painted values (on y-Axis or lower) */\r\n\r\n\r\n\t if (value == this._settings.origin || this._settings.origin == \"auto\" && this._settings.value(data[i]) == minValue) {\r\n\t border = 0;\r\n\t label = \"\";\r\n\t } else if (value < 0 || this._settings.yAxis && value === 0 && !(this._settings.origin != \"auto\" && this._settings.origin > minValue)) {\r\n\t value = border = 0;\r\n\t label = \"\";\r\n\t }\r\n\t /*takes start value into consideration */\r\n\t else if (!yax && !(this._settings.origin != \"auto\" && xax)) value += startValue / unit;\r\n\t /*drawing bar body*/\r\n\r\n\r\n\t ctx.globalAlpha = this._settings.alpha.call(this, data[i]);\r\n\r\n\t var points = this._drawBar(ctx, point0, x0, y0, barWidth, minValue, radius, unit, value, color$$1, gradient, inner_gradient, border);\r\n\r\n\t if (inner_gradient) {\r\n\t this._drawBarGradient(ctx, x0, y0, barWidth, minValue, radius, unit, value, color$$1, inner_gradient, border);\r\n\t }\r\n\t /*drawing the gradient border of a bar*/\r\n\r\n\r\n\t if (border) this._drawBarBorder(ctx, x0, y0, barWidth, minValue, radius, unit, value, color$$1);\r\n\t ctx.globalAlpha = 1;\r\n\t /*sets a bar label*/\r\n\r\n\t if (points[0] != x0) this.canvases[sIndex].renderTextAt(false, true, x0 + Math.floor(barWidth / 2), points[1], label);else this.canvases[sIndex].renderTextAt(true, true, x0 + Math.floor(barWidth / 2), points[3], label);\r\n\t /*defines a map area for a bar*/\r\n\r\n\t map.addRect(data[i].id, [x0 - point0.x, points[3] - point0.y, points[2] - point0.x, points[1] - point0.y], sIndex); //this._addMapRect(map,data[i].id,[{x:x0,y:points[3]},{x:points[2],y:points[1]}],point0,sIndex);\r\n\t }\r\n\t },\r\n\t _correctBarParams: function _correctBarParams(ctx, x, y, value, unit, barWidth, minValue) {\r\n\t var xax = this._settings.xAxis;\r\n\t var axisStart = y;\r\n\r\n\t if (!!xax && this._settings.origin != \"auto\" && this._settings.origin > minValue) {\r\n\t y -= (this._settings.origin - minValue) * unit;\r\n\t axisStart = y;\r\n\t value = value - (this._settings.origin - minValue);\r\n\r\n\t if (value < 0) {\r\n\t value *= -1;\r\n\t ctx.translate(x + barWidth, y);\r\n\t ctx.rotate(Math.PI);\r\n\t x = 0;\r\n\t y = 0;\r\n\t }\r\n\r\n\t y -= 0.5;\r\n\t }\r\n\r\n\t return {\r\n\t value: value,\r\n\t x0: x,\r\n\t y0: y,\r\n\t start: axisStart\r\n\t };\r\n\t },\r\n\t _drawBar: function _drawBar(ctx, point0, x0, y0, barWidth, minValue, radius, unit, value, color$$1, gradient, inner_gradient, border) {\r\n\t ctx.save();\r\n\t ctx.fillStyle = color$$1;\r\n\r\n\t var p = this._correctBarParams(ctx, x0, y0, value, unit, barWidth, minValue);\r\n\r\n\t var points = this._setBarPoints(ctx, p.x0, p.y0, barWidth, radius, unit, p.value, border);\r\n\r\n\t if (gradient && !inner_gradient) ctx.lineTo(p.x0 + border, point0.y); //fix gradient sphreading\r\n\r\n\t ctx.fill();\r\n\t ctx.restore();\r\n\t var x1 = p.x0;\r\n\t var x2 = p.x0 != x0 ? x0 + points[0] : points[0];\r\n\t var y1 = p.x0 != x0 ? p.start - points[1] - p.y0 : p.y0;\r\n\t var y2 = p.x0 != x0 ? p.start - p.y0 : points[1];\r\n\t return [x1, y1, x2, y2];\r\n\t },\r\n\t _setBorderStyles: function _setBorderStyles(ctx, rawColor) {\r\n\t var hsv, rgb;\r\n\t rgb = color.toRgb(rawColor);\r\n\t hsv = color.rgbToHsv(rgb[0], rgb[1], rgb[2]);\r\n\t hsv[2] /= 1.4;\r\n\t var rgbColor = \"rgb(\" + color.hsvToRgb(hsv[0], hsv[1], hsv[2]) + \")\";\r\n\t ctx.strokeStyle = rgbColor;\r\n\t if (ctx.globalAlpha == 1) ctx.globalAlpha = 0.9;\r\n\t },\r\n\t _drawBarBorder: function _drawBarBorder(ctx, x0, y0, barWidth, minValue, radius, unit, value, color$$1) {\r\n\t var p;\r\n\t ctx.save();\r\n\t p = this._correctBarParams(ctx, x0, y0, value, unit, barWidth, minValue);\r\n\r\n\t this._setBorderStyles(ctx, color$$1);\r\n\r\n\t this._setBarPoints(ctx, p.x0, p.y0, barWidth, radius, unit, p.value, ctx.lineWidth / 2, 1);\r\n\r\n\t ctx.stroke();\r\n\t /*ctx.fillStyle = color;\r\n\t this._setBarPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,0);\r\n\t ctx.lineTo(p.x0,0);\r\n\t ctx.fill()\r\n\t \t\t ctx.fillStyle = \"#000000\";\r\n\t ctx.globalAlpha = 0.37;\r\n\t \t this._setBarPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,0);\r\n\t ctx.fill()\r\n\t */\r\n\r\n\t ctx.restore();\r\n\t },\r\n\t _drawBarGradient: function _drawBarGradient(ctx, x0, y0, barWidth, minValue, radius, unit, value, color$$1, inner_gradient, border) {\r\n\t ctx.save();\r\n\r\n\t var p = this._correctBarParams(ctx, x0, y0, value, unit, barWidth, minValue);\r\n\r\n\t var gradParam = this._setBarGradient(ctx, p.x0, p.y0, p.x0 + barWidth, p.y0 - unit * p.value + 2, inner_gradient, color$$1, \"y\");\r\n\r\n\t ctx.fillStyle = gradParam.gradient;\r\n\r\n\t this._setBarPoints(ctx, p.x0 + gradParam.offset, p.y0, barWidth - gradParam.offset * 2, radius, unit, p.value, gradParam.offset + border);\r\n\r\n\t ctx.fill();\r\n\t ctx.restore();\r\n\t },\r\n\r\n\t /**\r\n\t * sets points for bar and returns the position of the bottom right point\r\n\t * @param: ctx - canvas object\r\n\t * @param: x0 - the x position of start point\r\n\t * @param: y0 - the y position of start point\r\n\t * @param: barWidth - bar width\r\n\t * @param: radius - the rounding radius of the top\r\n\t * @param: unit - the value defines the correspondence between item value and bar height\r\n\t * @param: value - item value\r\n\t * @param: offset - the offset from expected bar edge (necessary for drawing border)\r\n\t */\r\n\t _setBarPoints: function _setBarPoints(ctx, x0, y0, barWidth, radius, unit, value, offset, skipBottom) {\r\n\t /*correction for displaing small values (when rounding radius is bigger than bar height)*/\r\n\t ctx.beginPath(); //y0 = 0.5;\r\n\r\n\t var angle_corr = 0;\r\n\r\n\t if (radius > unit * value) {\r\n\t var cosA = (radius - unit * value) / radius;\r\n\t if (cosA <= 1 && cosA >= -1) angle_corr = -Math.acos(cosA) + Math.PI / 2;\r\n\t }\r\n\t /*start*/\r\n\r\n\r\n\t ctx.moveTo(x0 + offset, y0);\r\n\t /*start of left rounding*/\r\n\r\n\t var y1 = y0 - Math.floor(unit * value) + radius + (radius ? 0 : offset);\r\n\t if (radius < unit * value) ctx.lineTo(x0 + offset, y1);\r\n\t /*left rounding*/\r\n\r\n\t var x2 = x0 + radius;\r\n\t if (radius && radius > 0) ctx.arc(x2, y1, Math.max(radius - offset, 0), -Math.PI + angle_corr, -Math.PI / 2, false);\r\n\t /*start of right rounding*/\r\n\r\n\t var x3 = x0 + barWidth - radius - offset;\r\n\t var y3 = y1 - radius + (radius ? offset : 0);\r\n\t ctx.lineTo(x3, y3);\r\n\t /*right rounding*/\r\n\r\n\t if (radius && radius > 0) ctx.arc(x3 + offset, y1, Math.max(radius - offset, 0), -Math.PI / 2, 0 - angle_corr, false);\r\n\t /*bottom right point*/\r\n\r\n\t var x5 = x0 + barWidth - offset;\r\n\t ctx.lineTo(x5, y0);\r\n\t /*line to the start point*/\r\n\r\n\t if (!skipBottom) {\r\n\t ctx.lineTo(x0 + offset, y0);\r\n\t } //\tctx.lineTo(x0,0); //IE fix!\r\n\r\n\r\n\t return [x5, y3];\r\n\t }\r\n\t};\r\n\r\n\tvar LineChart = {\r\n\t /**\r\n\t * renders a graphic\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: width - the width of the container\r\n\t * @param: height - the height of the container\r\n\t * @param: sIndex - index of drawing chart\r\n\t */\r\n\t $render_line: function $render_line(ctx, data, point0, point1, sIndex, map) {\r\n\t var config, i, items, params, x0, x1, x2, y1, y2, y0, res1, res2;\r\n\t params = this._calculateLineParams(ctx, data, point0, point1, sIndex);\r\n\t config = this._settings;\r\n\r\n\t if (data.length) {\r\n\t x0 = config.offset ? point0.x + params.cellWidth * 0.5 : point0.x; //finds items with data (excludes scale units)\r\n\r\n\t items = [];\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t res2 = this._getPointY(data[i], point0, point1, params);\r\n\r\n\t if (res2 || res2 == \"0\") {\r\n\t x2 = !i ? x0 : params.cellWidth * i - 0.5 + x0;\r\n\t y2 = _typeof(res2) == \"object\" ? res2.y0 : res2;\r\n\r\n\t if (i && this._settings.fixOverflow) {\r\n\t res1 = this._getPointY(data[i - 1], point0, point1, params);\r\n\r\n\t if (res1.out && res1.out == res2.out) {\r\n\t continue;\r\n\t }\r\n\r\n\t x1 = params.cellWidth * (i - 1) - 0.5 + x0;\r\n\t y1 = _typeof(res1) == \"object\" ? res1.y0 : res1;\r\n\r\n\t if (res1.out) {\r\n\t y0 = res1.out == \"min\" ? point1.y : point0.y;\r\n\t items.push({\r\n\t x: this._calcOverflowX(x1, x2, y1, y2, y0),\r\n\t y: y0\r\n\t });\r\n\t }\r\n\r\n\t if (res2.out) {\r\n\t y0 = res2.out == \"min\" ? point1.y : point0.y;\r\n\t items.push({\r\n\t x: this._calcOverflowX(x1, x2, y1, y2, y0),\r\n\t y: y0\r\n\t });\r\n\t }\r\n\t }\r\n\r\n\t if (!res2.out) items.push({\r\n\t x: x2,\r\n\t y: res2,\r\n\t index: i\r\n\t });\r\n\t }\r\n\t }\r\n\r\n\t this._mapStart = point0;\r\n\r\n\t for (i = 1; i <= items.length; i++) {\r\n\t //line start position\r\n\t x1 = items[i - 1].x;\r\n\t y1 = items[i - 1].y;\r\n\r\n\t if (i < items.length) {\r\n\t //line end position\r\n\t x2 = items[i].x;\r\n\t y2 = items[i].y; //line\r\n\r\n\t this._drawLine(ctx, x1, y1, x2, y2, config.line.color.call(this, data[i - 1]), config.line.width); //line shadow\r\n\r\n\r\n\t if (config.line && config.line.shadow) {\r\n\t ctx.globalAlpha = 0.3;\r\n\r\n\t this._drawLine(ctx, x1 + 2, y1 + config.line.width + 8, x2 + 2, y2 + config.line.width + 8, \"#eeeeee\", config.line.width + 3);\r\n\r\n\t ctx.globalAlpha = 1;\r\n\t }\r\n\t } //item\r\n\r\n\r\n\t if (typeof items[i - 1].index != \"undefined\") {\r\n\t this._drawItem(ctx, x1, y1, data[items[i - 1].index], config.label(data[items[i - 1].index]), sIndex, map, point0);\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t _calcOverflowX: function _calcOverflowX(x1, x2, y1, y2, y) {\r\n\t return x1 + (y - y1) * (x2 - x1) / (y2 - y1);\r\n\t },\r\n\r\n\t /**\r\n\t * draws an item and its label\r\n\t * @param: ctx - canvas object\r\n\t * @param: x0 - the x position of a circle\r\n\t * @param: y0 - the y position of a circle\r\n\t * @param: obj - data object\r\n\t * @param: label - (boolean) defines wherether label needs being drawn\r\n\t */\r\n\t _drawItem: function _drawItem(ctx, x0, y0, obj, label, sIndex, map) {\r\n\t var config = this._settings.item;\r\n\t var R = parseInt(config.radius.call(this, obj), 10) || 0;\r\n\t var mapStart = this._mapStart;\r\n\t var item = config.type.call(this, obj);\r\n\r\n\t if (R) {\r\n\t ctx.save();\r\n\r\n\t if (config.shadow) {\r\n\t ctx.lineWidth = 1;\r\n\t ctx.strokeStyle = \"#bdbdbd\";\r\n\t ctx.fillStyle = \"#bdbdbd\";\r\n\t var alphas = [0.1, 0.2, 0.3];\r\n\r\n\t for (var i = alphas.length - 1; i >= 0; i--) {\r\n\t ctx.globalAlpha = alphas[i];\r\n\t ctx.strokeStyle = \"#d0d0d0\";\r\n\t ctx.beginPath();\r\n\r\n\t this._strokeChartItem(ctx, x0, y0 + 2 * R / 3, R + i + 1, item);\r\n\r\n\t ctx.stroke();\r\n\t }\r\n\r\n\t ctx.beginPath();\r\n\t ctx.globalAlpha = 0.3;\r\n\t ctx.fillStyle = \"#bdbdbd\";\r\n\r\n\t this._strokeChartItem(ctx, x0, y0 + 2 * R / 3, R + 1, item);\r\n\r\n\t ctx.fill();\r\n\t }\r\n\r\n\t ctx.restore();\r\n\t ctx.lineWidth = config.borderWidth;\r\n\t ctx.fillStyle = config.color.call(this, obj);\r\n\t ctx.strokeStyle = config.borderColor.call(this, obj);\r\n\t ctx.globalAlpha = config.alpha.call(this, obj);\r\n\t ctx.beginPath();\r\n\r\n\t this._strokeChartItem(ctx, x0, y0, R + 1, item);\r\n\r\n\t ctx.fill();\r\n\t ctx.stroke();\r\n\t ctx.globalAlpha = 1;\r\n\t }\r\n\t /*item label*/\r\n\r\n\r\n\t if (label) {\r\n\t this.canvases[sIndex].renderTextAt(false, true, x0, y0 - R - this._settings.labelOffset, this._settings.label.call(this, obj));\r\n\t }\r\n\r\n\t if (map) {\r\n\t var areaPos = this._settings.eventRadius || R + 1; //this._addMapRect(map,obj.id,[{x:x0-areaPos,y:y0-areaPos},{x0+areaPos,y:y0+areaPos}],point0,sIndex);\r\n\r\n\t map.addRect(obj.id, [x0 - areaPos - mapStart.x, y0 - areaPos - mapStart.y, x0 + areaPos - mapStart.x, y0 + areaPos - mapStart.y], sIndex);\r\n\t }\r\n\t },\r\n\t _strokeChartItem: function _strokeChartItem(ctx, x0, y0, R, type) {\r\n\t var p = [];\r\n\r\n\t if (type && (type == \"square\" || type == \"s\")) {\r\n\t R *= Math.sqrt(2) / 2;\r\n\t p = [[x0 - R - ctx.lineWidth / 2, y0 - R], [x0 + R, y0 - R], [x0 + R, y0 + R], [x0 - R, y0 + R], [x0 - R, y0 - R]];\r\n\t } else if (type && (type == \"diamond\" || type == \"d\")) {\r\n\t var corr = ctx.lineWidth > 1 ? ctx.lineWidth * Math.sqrt(2) / 4 : 0;\r\n\t p = [[x0, y0 - R], [x0 + R, y0], [x0, y0 + R], [x0 - R, y0], [x0 + corr, y0 - R - corr]];\r\n\t } else if (type && (type == \"triangle\" || type == \"t\")) {\r\n\t p = [[x0, y0 - R], [x0 + Math.sqrt(3) * R / 2, y0 + R / 2], [x0 - Math.sqrt(3) * R / 2, y0 + R / 2], [x0, y0 - R]];\r\n\t } else p = [[x0, y0, R, 0, Math.PI * 2, true]];\r\n\r\n\t this._path(ctx, p);\r\n\t },\r\n\r\n\t /**\r\n\t * gets the vertical position of the item\r\n\t * @param: data - data object\r\n\t * @param: y0 - the y position of chart start\r\n\t * @param: y1 - the y position of chart end\r\n\t * @param: params - the object with elements: minValue, maxValue, unit, valueFactor (the value multiple of 10)\r\n\t */\r\n\t _getPointY: function _getPointY(data, point0, point1, params) {\r\n\t var minValue = params.minValue;\r\n\t var maxValue = params.maxValue;\r\n\t var unit = params.unit;\r\n\t var valueFactor = params.valueFactor;\r\n\t /*the real value of an object*/\r\n\r\n\t var value = this._settings.value(data);\r\n\r\n\t if (this._logScaleCalc) {\r\n\t value = this._log10(value);\r\n\t }\r\n\t /*a relative value*/\r\n\r\n\r\n\t var v = (parseFloat(value || 0) - minValue) * valueFactor;\r\n\t if (!this._settings.yAxis) v += params.startValue / unit;\r\n\t /*a vertical coordinate*/\r\n\r\n\t var y = point1.y - unit * v;\r\n\t /*the limit of the max and min values*/\r\n\r\n\t if (this._settings.fixOverflow && (this._settings.type == \"line\" || this._settings.type == \"area\")) {\r\n\t if (value > maxValue) y = {\r\n\t y: point0.y,\r\n\t y0: y,\r\n\t out: \"max\"\r\n\t };else if (v < 0 || value < minValue) y = {\r\n\t y: point1.y,\r\n\t y0: y,\r\n\t out: \"min\"\r\n\t };\r\n\t } else {\r\n\t if (value > maxValue) y = point0.y;\r\n\t if (v < 0 || value < minValue) y = point1.y;\r\n\t }\r\n\r\n\t return y;\r\n\t },\r\n\t _calculateLineParams: function _calculateLineParams(ctx, data, point0, point1, sIndex) {\r\n\t var params = {};\r\n\t /*maxValue - minValue*/\r\n\r\n\t var relValue;\r\n\t /*available height*/\r\n\r\n\t params.totalHeight = point1.y - point0.y;\r\n\t /*a space available for a single item*/\r\n\t //params.cellWidth = Math.round((point1.x-point0.x)/((!this._settings.offset&&this._settings.yAxis)?(data.length-1):data.length));\r\n\r\n\t if (this._settings.cellWidth) params.cellWidth = Math.min(point1.x - point0.x, this._settings.cellWidth);else params.cellWidth = (point1.x - point0.x) / (!this._settings.offset ? data.length - 1 : data.length);\r\n\t /*scales*/\r\n\r\n\t var yax = !!this._settings.yAxis;\r\n\t var limits = this._settings.type.indexOf(\"stacked\") != -1 ? this._getStackedLimits(data) : this._getLimits();\r\n\t params.maxValue = limits.max;\r\n\t params.minValue = limits.min;\r\n\t /*draws x and y scales*/\r\n\r\n\t if (!sIndex) this._drawScales(data, point0, point1, params.minValue, params.maxValue, params.cellWidth);\r\n\t /*necessary for automatic scale*/\r\n\r\n\t if (yax) {\r\n\t params.maxValue = parseFloat(this._settings.yAxis.end);\r\n\t params.minValue = parseFloat(this._settings.yAxis.start);\r\n\t }\r\n\t /*unit calculation (y_position = value*unit)*/\r\n\r\n\r\n\t var relativeValues = this._getRelativeValue(params.minValue, params.maxValue);\r\n\r\n\t relValue = relativeValues[0];\r\n\t params.valueFactor = relativeValues[1];\r\n\t params.unit = relValue ? params.totalHeight / relValue : 10;\r\n\t params.startValue = 0;\r\n\r\n\t if (!yax) {\r\n\t /*defines start value for better representation of small values*/\r\n\t params.startValue = 10;\r\n\t if (params.unit != params.totalHeight) params.unit = relValue ? (params.totalHeight - params.startValue) / relValue : 10;\r\n\t }\r\n\r\n\t return params;\r\n\t }\r\n\t};\r\n\r\n\tvar BarHChart = {\r\n\t /**\r\n\t * renders a bar chart\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: x - the width of the container\r\n\t * @param: y - the height of the container\r\n\t * @param: sIndex - index of drawing chart\r\n\t */\r\n\t $render_barH: function $render_barH(ctx, data, point0, point1, sIndex, map) {\r\n\t var barOffset, barWidth, cellWidth, color, gradient, i, limits, maxValue, minValue, innerGradient, valueFactor, relValue, radius, relativeValues, startValue, totalWidth, value, unit, x0, y0, xax;\r\n\t /*an available width for one bar*/\r\n\r\n\t cellWidth = (point1.y - point0.y) / data.length;\r\n\t limits = this._getLimits(\"h\");\r\n\t maxValue = limits.max;\r\n\t minValue = limits.min;\r\n\t totalWidth = point1.x - point0.x;\r\n\t xax = !!this._settings.xAxis;\r\n\t /*draws x and y scales*/\r\n\r\n\t if (!sIndex) this._drawHScales(ctx, data, point0, point1, minValue, maxValue, cellWidth);\r\n\t /*necessary for automatic scale*/\r\n\r\n\t if (xax) {\r\n\t maxValue = parseFloat(this._settings.xAxis.end);\r\n\t minValue = parseFloat(this._settings.xAxis.start);\r\n\t }\r\n\t /*unit calculation (bar_height = value*unit)*/\r\n\r\n\r\n\t relativeValues = this._getRelativeValue(minValue, maxValue);\r\n\t relValue = relativeValues[0];\r\n\t valueFactor = relativeValues[1];\r\n\t unit = relValue ? totalWidth / relValue : 10;\r\n\r\n\t if (!xax) {\r\n\t /*defines start value for better representation of small values*/\r\n\t startValue = 10;\r\n\t unit = relValue ? (totalWidth - startValue) / relValue : 10;\r\n\t }\r\n\t /*a real bar width */\r\n\r\n\r\n\t barWidth = parseInt(this._settings.barWidth, 10);\r\n\t if (barWidth * this._series.length + 4 > cellWidth) barWidth = cellWidth / this._series.length - 4;\r\n\t /*the half of distance between bars*/\r\n\r\n\t barOffset = Math.floor((cellWidth - barWidth * this._series.length) / 2);\r\n\t /*the radius of rounding in the top part of each bar*/\r\n\r\n\t radius = typeof this._settings.radius != \"undefined\" ? parseInt(this._settings.radius, 10) : Math.round(barWidth / 5);\r\n\t innerGradient = false;\r\n\t gradient = this._settings.gradient;\r\n\r\n\t if (gradient && typeof gradient != \"function\") {\r\n\t innerGradient = gradient;\r\n\t gradient = false;\r\n\t } else if (gradient) {\r\n\t gradient = ctx.createLinearGradient(point0.x, point0.y, point1.x, point0.y);\r\n\r\n\t this._settings.gradient(gradient);\r\n\t }\r\n\t /*draws a black line if the horizontal scale isn't defined*/\r\n\r\n\r\n\t if (!xax) {\r\n\t this._drawLine(ctx, point0.x - 0.5, point0.y, point0.x - 0.5, point1.y, \"#edeff0\", 1); //hardcoded color!\r\n\r\n\t }\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t value = parseFloat(this._settings.value(data[i] || 0));\r\n\t if (this._logScaleCalc) value = this._log10(value);\r\n\t if (!value || isNaN(value)) continue;\r\n\t if (value > maxValue) value = maxValue;\r\n\t value -= minValue;\r\n\t value *= valueFactor;\r\n\t /*start point (bottom left)*/\r\n\r\n\t x0 = point0.x;\r\n\t y0 = point0.y + barOffset + i * cellWidth + (barWidth + 1) * sIndex;\r\n\r\n\t if (value < 0 && this._settings.origin == \"auto\" || this._settings.xAxis && value === 0 && !(this._settings.origin != \"auto\" && this._settings.origin > minValue)) {\r\n\t this.canvases[sIndex].renderTextAt(\"middle\", \"right\", x0 + 10, y0 + barWidth / 2 + barOffset, this._settings.label(data[i]));\r\n\t continue;\r\n\t }\r\n\r\n\t if (value < 0 && this._settings.origin != \"auto\" && this._settings.origin > minValue) {\r\n\t value = 0;\r\n\t }\r\n\t /*takes start value into consideration*/\r\n\r\n\r\n\t if (!xax) value += startValue / unit;\r\n\t color = gradient || this._settings.color.call(this, data[i]);\r\n\t /*drawing the gradient border of a bar*/\r\n\r\n\t if (this._settings.border) {\r\n\t this._drawBarHBorder(ctx, x0, y0, barWidth, minValue, radius, unit, value, color);\r\n\t }\r\n\t /*drawing bar body*/\r\n\r\n\r\n\t ctx.globalAlpha = this._settings.alpha.call(this, data[i]);\r\n\r\n\t var points = this._drawBarH(ctx, point1, x0, y0, barWidth, minValue, radius, unit, value, color, gradient, innerGradient);\r\n\r\n\t if (innerGradient) {\r\n\t this._drawBarHGradient(ctx, x0, y0, barWidth, minValue, radius, unit, value, color, innerGradient);\r\n\t }\r\n\r\n\t ctx.globalAlpha = 1;\r\n\t /*sets a bar label and map area*/\r\n\r\n\t if (points[3] == y0) {\r\n\t this.canvases[sIndex].renderTextAt(\"middle\", \"left\", points[0] - 5, points[3] + Math.floor(barWidth / 2), this._settings.label(data[i]));\r\n\t map.addRect(data[i].id, [points[0] - point0.x, points[3] - point0.y, points[2] - point0.x, points[3] + barWidth - point0.y], sIndex);\r\n\t } else {\r\n\t this.canvases[sIndex].renderTextAt(\"middle\", false, points[2] + 5, points[1] + Math.floor(barWidth / 2), this._settings.label(data[i]));\r\n\t map.addRect(data[i].id, [points[0] - point0.x, y0 - point0.y, points[2] - point0.x, points[3] - point0.y], sIndex);\r\n\t }\r\n\t }\r\n\t },\r\n\r\n\t /**\r\n\t * sets points for bar and returns the position of the bottom right point\r\n\t * @param: ctx - canvas object\r\n\t * @param: x0 - the x position of start point\r\n\t * @param: y0 - the y position of start point\r\n\t * @param: barWidth - bar width\r\n\t * @param: radius - the rounding radius of the top\r\n\t * @param: unit - the value defines the correspondence between item value and bar height\r\n\t * @param: value - item value\r\n\t * @param: offset - the offset from expected bar edge (necessary for drawing border)\r\n\t */\r\n\t _setBarHPoints: function _setBarHPoints(ctx, x0, y0, barWidth, radius, unit, value, offset, skipLeft) {\r\n\t /*correction for displaing small values (when rounding radius is bigger than bar height)*/\r\n\t var angle_corr = 0;\r\n\r\n\t if (radius > unit * value) {\r\n\t var sinA = (radius - unit * value) / radius;\r\n\t angle_corr = -Math.asin(sinA) + Math.PI / 2;\r\n\t }\r\n\t /*start*/\r\n\r\n\r\n\t ctx.moveTo(x0, y0 + offset);\r\n\t /*start of left rounding*/\r\n\r\n\t var x1 = x0 + unit * value - radius - (radius ? 0 : offset);\r\n\t x1 = Math.max(x0, x1);\r\n\t if (radius < unit * value) ctx.lineTo(x1, y0 + offset);\r\n\t /*left rounding*/\r\n\r\n\t var y2 = y0 + radius;\r\n\t if (radius && radius > 0) ctx.arc(x1, y2, radius - offset, -Math.PI / 2 + angle_corr, 0, false);\r\n\t /*start of right rounding*/\r\n\r\n\t var y3 = y0 + barWidth - radius - (radius ? 0 : offset);\r\n\t var x3 = x1 + radius - (radius ? offset : 0);\r\n\t ctx.lineTo(x3, y3);\r\n\t /*right rounding*/\r\n\r\n\t if (radius && radius > 0) ctx.arc(x1, y3, radius - offset, 0, Math.PI / 2 - angle_corr, false);\r\n\t /*bottom right point*/\r\n\r\n\t var y5 = y0 + barWidth - offset;\r\n\t ctx.lineTo(x0, y5);\r\n\t /*line to the start point*/\r\n\r\n\t if (!skipLeft) {\r\n\t ctx.lineTo(x0, y0 + offset);\r\n\t } //\tctx.lineTo(x0,0); //IE fix!\r\n\r\n\r\n\t return [x3, y5];\r\n\t },\r\n\t _drawHScales: function _drawHScales(ctx, data, point0, point1, start, end, cellWidth) {\r\n\t var x = 0;\r\n\r\n\t if (this._settings.xAxis) {\r\n\t if (!this.canvases[\"x\"]) this.canvases[\"x\"] = this._createCanvas(\"axis_x\");\r\n\t x = this._drawHXAxis(this.canvases[\"x\"].getCanvas(), data, point0, point1, start, end);\r\n\t }\r\n\r\n\t if (this._settings.yAxis) {\r\n\t if (!this.canvases[\"y\"]) this.canvases[\"y\"] = this._createCanvas(\"axis_y\");\r\n\r\n\t this._drawHYAxis(this.canvases[\"y\"].getCanvas(), data, point0, point1, cellWidth, x);\r\n\t }\r\n\t },\r\n\t _drawHYAxis: function _drawHYAxis(ctx, data, point0, point1, cellWidth, yAxisX) {\r\n\t if (!this._settings.yAxis) return;\r\n\t var unitPos;\r\n\t var x0 = parseInt(yAxisX ? yAxisX : point0.x, 10) - 0.5;\r\n\t var y0 = point1.y + 0.5;\r\n\t var y1 = point0.y;\r\n\r\n\t this._drawLine(ctx, x0, y0, x0, y1, this._settings.yAxis.color, 1);\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t /*scale labels*/\r\n\t var right = this._settings.origin != \"auto\" && this._settings.type == \"barH\" && parseFloat(this._settings.value(data[i])) < this._settings.origin;\r\n\r\n\t unitPos = y1 + cellWidth / 2 + i * cellWidth;\r\n\t this.canvases[\"y\"].renderTextAt(\"middle\", right ? false : \"left\", right ? x0 + 5 : x0 - 5, unitPos, this._settings.yAxis.template(data[i]), \"webix_axis_item_y\", right ? 0 : x0 - 10);\r\n\t if (this._settings.yAxis.lines.call(this, data[i])) this._drawLine(ctx, point0.x, unitPos, point1.x, unitPos, this._settings.yAxis.lineColor.call(this, data[i]), 1);\r\n\t }\r\n\r\n\t if (this._settings.yAxis.lines.call(this, {})) this._drawLine(ctx, point0.x + 0.5, y1 + 0.5, point1.x, y1 + 0.5, this._settings.yAxis.lineColor.call(this, {}), 1);\r\n\r\n\t this._setYAxisTitle(point0, point1);\r\n\t },\r\n\t _drawHXAxis: function _drawHXAxis(ctx, data, point0, point1, start, end) {\r\n\t var step;\r\n\t var scaleParam = {};\r\n\t var axis = this._settings.xAxis;\r\n\t if (!axis) return;\r\n\t var y0 = point1.y + 0.5;\r\n\t var x0 = point0.x - 0.5;\r\n\t var x1 = point1.x - 0.5;\r\n\t var yAxisStart = point0.x;\r\n\r\n\t this._drawLine(ctx, x0, y0, x1, y0, axis.color, 1);\r\n\r\n\t if (axis.step) step = parseFloat(axis.step);\r\n\r\n\t if (typeof this._configXAxis.step == \"undefined\" || typeof this._configXAxis.start == \"undefined\" || typeof this._configXAxis.end == \"undefined\") {\r\n\t scaleParam = this._calculateScale(start, end);\r\n\t start = scaleParam.start;\r\n\t end = scaleParam.end;\r\n\t step = scaleParam.step;\r\n\t this._settings.xAxis.end = end;\r\n\t this._settings.xAxis.start = start;\r\n\t this._settings.xAxis.step = step;\r\n\t }\r\n\r\n\t if (step === 0) return;\r\n\t var stepHeight = (x1 - x0) * step / (end - start);\r\n\t var c = 0;\r\n\r\n\t for (var i = start; i <= end; i += step) {\r\n\t var value = this._logScaleCalc ? Math.pow(10, i) : i;\r\n\t if (scaleParam.fixNum) value = parseFloat(value).toFixed(scaleParam.fixNum);\r\n\t var xi = Math.floor(x0 + c * stepHeight) + 0.5;\r\n\t /*canvas line fix*/\r\n\r\n\t if (!(i == start && this._settings.origin == \"auto\") && axis.lines.call(this, i)) this._drawLine(ctx, xi, y0, xi, point0.y, this._settings.xAxis.lineColor.call(this, i), 1);\r\n\t if (i == this._settings.origin) yAxisStart = xi + 1;\r\n\t /*correction for JS float calculation*/\r\n\r\n\t if (step < 1 && !this._logScaleCalc) {\r\n\t var power = Math.min(Math.floor(this._log10(step)), start <= 0 ? 0 : Math.floor(this._log10(start)));\r\n\t var corr = Math.pow(10, -power);\r\n\t value = Math.round(value * corr) / corr;\r\n\t i = value;\r\n\t }\r\n\r\n\t this.canvases[\"x\"].renderTextAt(false, true, xi, y0 + 2, axis.template(value.toString()), \"webix_axis_item_x\");\r\n\t c++;\r\n\t }\r\n\r\n\t this.canvases[\"x\"].renderTextAt(true, false, x0, point1.y + this._settings.padding.bottom - 3, this._settings.xAxis.title, \"webix_axis_title_x\", point1.x - point0.x);\r\n\t return yAxisStart;\r\n\t },\r\n\t _correctBarHParams: function _correctBarHParams(ctx, x, y, value, unit, barWidth, minValue) {\r\n\t var yax = this._settings.yAxis;\r\n\t var axisStart = x;\r\n\r\n\t if (!!yax && this._settings.origin != \"auto\" && this._settings.origin > minValue) {\r\n\t x += (this._settings.origin - minValue) * unit;\r\n\t axisStart = x;\r\n\t value = value - (this._settings.origin - minValue);\r\n\r\n\t if (value < 0) {\r\n\t value *= -1;\r\n\t ctx.translate(x, y + barWidth);\r\n\t ctx.rotate(Math.PI);\r\n\t x = 0.5;\r\n\t y = 0;\r\n\t }\r\n\r\n\t x += 0.5;\r\n\t }\r\n\r\n\t return {\r\n\t value: value,\r\n\t x0: x,\r\n\t y0: y,\r\n\t start: axisStart\r\n\t };\r\n\t },\r\n\t _drawBarH: function _drawBarH(ctx, point1, x0, y0, barWidth, minValue, radius, unit, value, color, gradient, inner_gradient) {\r\n\t ctx.save();\r\n\r\n\t var p = this._correctBarHParams(ctx, x0, y0, value, unit, barWidth, minValue);\r\n\r\n\t ctx.fillStyle = color;\r\n\t ctx.beginPath();\r\n\r\n\t var points = this._setBarHPoints(ctx, p.x0, p.y0, barWidth, radius, unit, p.value, this._settings.border ? 1 : 0);\r\n\r\n\t if (gradient && !inner_gradient) ctx.lineTo(point1.x, p.y0 + (this._settings.border ? 1 : 0)); //fix gradient sphreading\r\n\r\n\t ctx.fill();\r\n\t ctx.restore();\r\n\t var y1 = p.y0;\r\n\t var y2 = p.y0 != y0 ? y0 : points[1];\r\n\t var x1 = p.y0 != y0 ? p.start - points[0] : p.start;\r\n\t var x2 = p.y0 != y0 ? p.start : points[0];\r\n\t return [x1, y1, x2, y2];\r\n\t },\r\n\t _drawBarHBorder: function _drawBarHBorder(ctx, x0, y0, barWidth, minValue, radius, unit, value, color) {\r\n\t ctx.save();\r\n\r\n\t var p = this._correctBarHParams(ctx, x0, y0, value, unit, barWidth, minValue);\r\n\r\n\t ctx.beginPath();\r\n\r\n\t this._setBorderStyles(ctx, color);\r\n\r\n\t ctx.globalAlpha = 0.9;\r\n\r\n\t this._setBarHPoints(ctx, p.x0, p.y0, barWidth, radius, unit, p.value, ctx.lineWidth / 2, 1);\r\n\r\n\t ctx.stroke();\r\n\t ctx.restore();\r\n\t },\r\n\t _drawBarHGradient: function _drawBarHGradient(ctx, x0, y0, barWidth, minValue, radius, unit, value, color, inner_gradient) {\r\n\t ctx.save();\r\n\r\n\t var p = this._correctBarHParams(ctx, x0, y0, value, unit, barWidth, minValue);\r\n\r\n\t var gradParam = this._setBarGradient(ctx, p.x0, p.y0 + barWidth, p.x0 + unit * p.value, p.y0, inner_gradient, color, \"x\");\r\n\r\n\t ctx.fillStyle = gradParam.gradient;\r\n\t ctx.beginPath();\r\n\r\n\t this._setBarHPoints(ctx, p.x0, p.y0 + gradParam.offset, barWidth - gradParam.offset * 2, radius, unit, p.value, gradParam.offset);\r\n\r\n\t ctx.fill();\r\n\t ctx.globalAlpha = 1;\r\n\t ctx.restore();\r\n\t }\r\n\t};\r\n\r\n\tvar StackedBarChart = {\r\n\t /**\r\n\t * renders a bar chart\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: x - the width of the container\r\n\t * @param: y - the height of the container\r\n\t * @param: sIndex - index of drawing chart\r\n\t */\r\n\t $render_stackedBar: function $render_stackedBar(ctx, data, point0, point1, sIndex, map) {\r\n\t var maxValue, minValue, xAxisY, x0, y0;\r\n\t /*necessary if maxValue - minValue < 0*/\r\n\r\n\t var valueFactor;\r\n\t /*maxValue - minValue*/\r\n\r\n\t var relValue;\r\n\t var config = this._settings;\r\n\t var total_height = point1.y - point0.y;\r\n\t var yax = !!config.yAxis;\r\n\t var xax = !!config.xAxis;\r\n\r\n\t var limits = this._getStackedLimits(data);\r\n\r\n\t var origin = config.origin === 0;\r\n\t maxValue = limits.max;\r\n\t minValue = limits.min;\r\n\t /*an available width for one bar*/\r\n\r\n\t var cellWidth = Math.floor((point1.x - point0.x) / data.length);\r\n\t /*draws x and y scales*/\r\n\r\n\t if (!sIndex) {\r\n\t xAxisY = this._drawScales(data, point0, point1, minValue, maxValue, cellWidth);\r\n\t }\r\n\t /*necessary for automatic scale*/\r\n\r\n\r\n\t if (yax) {\r\n\t maxValue = parseFloat(config.yAxis.end);\r\n\t minValue = parseFloat(config.yAxis.start);\r\n\t }\r\n\t /*unit calculation (bar_height = value*unit)*/\r\n\r\n\r\n\t var relativeValues = this._getRelativeValue(minValue, maxValue);\r\n\r\n\t relValue = relativeValues[0];\r\n\t valueFactor = relativeValues[1];\r\n\t var unit = relValue ? total_height / relValue : 10;\r\n\t /*a real bar width */\r\n\r\n\t var barWidth = parseInt(config.barWidth, 10);\r\n\t if (barWidth + 4 > cellWidth) barWidth = cellWidth - 4;\r\n\t /*the half of distance between bars*/\r\n\r\n\t var barOffset = Math.floor((cellWidth - barWidth) / 2);\r\n\t var inner_gradient = config.gradient ? config.gradient : false;\r\n\t /*draws a black line if the horizontal scale isn't defined*/\r\n\r\n\t if (!xax) {\r\n\t //scaleY = y-bottomPadding;\r\n\t this._drawLine(ctx, point0.x, point1.y + 0.5, point1.x, point1.y + 0.5, \"#edeff0\", 1); //hardcoded color!\r\n\r\n\t }\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t var value = Math.abs(parseFloat(config.value(data[i] || 0)));\r\n\t if (this._logScaleCalc) value = this._log10(value);\r\n\t /*start point (bottom left)*/\r\n\r\n\t x0 = point0.x + barOffset + i * cellWidth;\r\n\t var negValue = origin && value < 0;\r\n\r\n\t if (!sIndex) {\r\n\t y0 = xAxisY - 1;\r\n\t data[i].$startY = y0;\r\n\r\n\t if (origin) {\r\n\t if (negValue) y0 = xAxisY + 1;\r\n\t data[i].$startYN = xAxisY + 1;\r\n\t }\r\n\t } else {\r\n\t y0 = negValue ? data[i].$startYN : data[i].$startY;\r\n\t }\r\n\r\n\t if (!value || isNaN(value)) continue;\r\n\t /*adjusts the first tab to the scale*/\r\n\r\n\t if (!sIndex && !origin) value -= minValue;\r\n\t value *= valueFactor;\r\n\t /*the max height limit*/\r\n\r\n\t if (y0 < point0.y + 1) continue;\r\n\r\n\t var color = this._settings.color.call(this, data[i]);\r\n\r\n\t var firstSector = Math.abs(y0 - (origin ? point1.y + minValue * unit : point1.y)) < 3;\r\n\t /*drawing bar body*/\r\n\r\n\t ctx.globalAlpha = config.alpha.call(this, data[i]);\r\n\t ctx.fillStyle = ctx.strokeStyle = config.color.call(this, data[i]);\r\n\t ctx.beginPath();\r\n\t var y1 = y0 - unit * value + (firstSector ? negValue ? -1 : 1 : 0);\r\n\r\n\t var points = this._setStakedBarPoints(ctx, x0 - (config.border ? 0.5 : 0), y0, barWidth + (config.border ? 0.5 : 0), y1, 0, point0.y);\r\n\r\n\t ctx.fill();\r\n\t ctx.stroke();\r\n\t /*gradient*/\r\n\r\n\t if (inner_gradient) {\r\n\t ctx.save();\r\n\r\n\t var gradParam = this._setBarGradient(ctx, x0, y0, x0 + barWidth, points[1], inner_gradient, color, \"y\");\r\n\r\n\t ctx.fillStyle = gradParam.gradient;\r\n\t ctx.beginPath();\r\n\t points = this._setStakedBarPoints(ctx, x0 + gradParam.offset, y0, barWidth - gradParam.offset * 2, y1, config.border ? 1 : 0, point0.y);\r\n\t ctx.fill();\r\n\t ctx.restore();\r\n\t }\r\n\t /*drawing the gradient border of a bar*/\r\n\r\n\r\n\t if (config.border) {\r\n\t ctx.save();\r\n\t if (typeof config.border == \"string\") ctx.strokeStyle = config.border;else this._setBorderStyles(ctx, color);\r\n\t ctx.beginPath();\r\n\r\n\t this._setStakedBarPoints(ctx, x0 - 0.5, parseInt(y0, 10) + 0.5, barWidth + 1, parseInt(y1, 10) + 0.5, 0, point0.y, firstSector);\r\n\r\n\t ctx.stroke();\r\n\t ctx.restore();\r\n\t }\r\n\r\n\t ctx.globalAlpha = 1;\r\n\t /*sets a bar label*/\r\n\r\n\t this.canvases[sIndex].renderTextAt(false, true, x0 + Math.floor(barWidth / 2), points[1] + (y0 - points[1]) / 2 - 7, this._settings.label(data[i]));\r\n\t /*defines a map area for a bar*/\r\n\r\n\t map.addRect(data[i].id, [x0 - point0.x, points[1] - point0.y, points[0] - point0.x, data[i][negValue ? \"$startYN\" : \"$startY\"] - point0.y], sIndex);\r\n\t /*the start position for the next series*/\r\n\r\n\t data[i][negValue ? \"$startYN\" : \"$startY\"] = points[1];\r\n\t }\r\n\t },\r\n\r\n\t /**\r\n\t * sets points for bar and returns the position of the bottom right point\r\n\t * @param: ctx - canvas object\r\n\t * @param: x0 - the x position of start point\r\n\t * @param: y0 - the y position of start point\r\n\t * @param: barWidth - bar width\r\n\t * @param: radius - the rounding radius of the top\r\n\t * @param: unit - the value defines the correspondence between item value and bar height\r\n\t * @param: value - item value\r\n\t * @param: offset - the offset from expected bar edge (necessary for drawing border)\r\n\t * @param: minY - the minimum y position for the bars ()\r\n\t */\r\n\t _setStakedBarPoints: function _setStakedBarPoints(ctx, x0, y0, barWidth, y1, offset, minY, skipBottom) {\r\n\t /*start*/\r\n\t ctx.moveTo(x0, y0);\r\n\t /*maximum height limit*/\r\n\r\n\t if (y1 < minY) y1 = minY;\r\n\t ctx.lineTo(x0, y1);\r\n\t var x3 = x0 + barWidth;\r\n\t var y3 = y1;\r\n\t ctx.lineTo(x3, y3);\r\n\t /*right rounding*/\r\n\r\n\t /*bottom right point*/\r\n\r\n\t var x5 = x0 + barWidth;\r\n\t ctx.lineTo(x5, y0);\r\n\t /*line to the start point*/\r\n\r\n\t if (!skipBottom) {\r\n\t ctx.lineTo(x0, y0);\r\n\t } //\tctx.lineTo(x0,0); //IE fix!\r\n\r\n\r\n\t return [x5, y3];\r\n\t }\r\n\t};\r\n\r\n\tvar StackedBarHChart = {\r\n\t /**\r\n\t \t* renders a bar chart\r\n\t \t* @param: ctx - canvas object\r\n\t \t* @param: data - object those need to be displayed\r\n\t \t* @param: x - the width of the container\r\n\t \t* @param: y - the height of the container\r\n\t \t* @param: sIndex - index of drawing chart\r\n\t \t* @param: map - map object\r\n\t \t*/\r\n\t $render_stackedBarH: function $render_stackedBarH(ctx, data, point0, point1, sIndex, map) {\r\n\t var maxValue, minValue;\r\n\t /*necessary if maxValue - minValue < 0*/\r\n\r\n\t var valueFactor;\r\n\t /*maxValue - minValue*/\r\n\r\n\t var relValue;\r\n\t var total_width = point1.x - point0.x;\r\n\t var yax = !!this._settings.yAxis;\r\n\r\n\t var limits = this._getStackedLimits(data);\r\n\r\n\t maxValue = limits.max;\r\n\t minValue = limits.min;\r\n\t /*an available width for one bar*/\r\n\r\n\t var cellWidth = Math.floor((point1.y - point0.y) / data.length);\r\n\t /*draws x and y scales*/\r\n\r\n\t if (!sIndex) this._drawHScales(ctx, data, point0, point1, minValue, maxValue, cellWidth);\r\n\t /*necessary for automatic scale*/\r\n\r\n\t if (yax) {\r\n\t maxValue = parseFloat(this._settings.xAxis.end);\r\n\t minValue = parseFloat(this._settings.xAxis.start);\r\n\t }\r\n\t /*unit calculation (bar_height = value*unit)*/\r\n\r\n\r\n\t var relativeValues = this._getRelativeValue(minValue, maxValue);\r\n\r\n\t relValue = relativeValues[0];\r\n\t valueFactor = relativeValues[1];\r\n\t var unit = relValue ? total_width / relValue : 10;\r\n\t var startValue = 0;\r\n\r\n\t if (!yax) {\r\n\t /*defines start value for better representation of small values*/\r\n\t startValue = 10;\r\n\t unit = relValue ? (total_width - startValue) / relValue : 10;\r\n\t }\r\n\t /*a real bar width */\r\n\r\n\r\n\t var barWidth = parseInt(this._settings.barWidth, 10);\r\n\t if (barWidth + 4 > cellWidth) barWidth = cellWidth - 4;\r\n\t /*the half of distance between bars*/\r\n\r\n\t var barOffset = (cellWidth - barWidth) / 2;\r\n\t /*the radius of rounding in the top part of each bar*/\r\n\r\n\t var radius = 0;\r\n\t var inner_gradient = false;\r\n\t var gradient = this._settings.gradient;\r\n\r\n\t if (gradient) {\r\n\t inner_gradient = true;\r\n\t }\r\n\t /*draws a black line if the horizontal scale isn't defined*/\r\n\r\n\r\n\t if (!yax) {\r\n\t this._drawLine(ctx, point0.x - 0.5, point0.y, point0.x - 0.5, point1.y, \"#edeff0\", 1); //hardcoded color!\r\n\r\n\t }\r\n\r\n\t var seriesNumber = 0;\r\n\t var seriesIndex = 0;\r\n\r\n\t for (i = 0; i < this._series.length; i++) {\r\n\t if (i == sIndex) {\r\n\t seriesIndex = seriesNumber;\r\n\t }\r\n\r\n\t if (this._series[i].type == \"stackedBarH\") seriesNumber++;\r\n\t }\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t if (!seriesIndex) data[i].$startX = point0.x;\r\n\t var value = Math.abs(parseFloat(this._settings.value(data[i] || 0)));\r\n\t if (value > maxValue) value = maxValue;\r\n\t value -= minValue;\r\n\t value *= valueFactor;\r\n\t /*start point (bottom left)*/\r\n\r\n\t var x0 = point0.x;\r\n\t var y0 = point0.y + barOffset + i * cellWidth;\r\n\t if (!seriesIndex) data[i].$startX = x0;else x0 = data[i].$startX;\r\n\t if (!value || isNaN(value)) continue;\r\n\t /*takes start value into consideration*/\r\n\r\n\t if (!yax) value += startValue / unit;\r\n\r\n\t var color = this._settings.color.call(this, data[i]);\r\n\t /*drawing bar body*/\r\n\r\n\r\n\t ctx.globalAlpha = this._settings.alpha.call(this, data[i]);\r\n\t ctx.fillStyle = this._settings.color.call(this, data[i]);\r\n\t ctx.beginPath();\r\n\r\n\t var points = this._setBarHPoints(ctx, x0, y0, barWidth, radius, unit, value, 0);\r\n\r\n\t if (gradient && !inner_gradient) ctx.lineTo(point0.x + total_width, y0 + (this._settings.border ? 1 : 0)); //fix gradient sphreading\r\n\r\n\t ctx.fill();\r\n\r\n\t if (inner_gradient) {\r\n\t var gradParam = this._setBarGradient(ctx, x0, y0 + barWidth, x0, y0, inner_gradient, color, \"x\");\r\n\r\n\t ctx.fillStyle = gradParam.gradient;\r\n\t ctx.beginPath();\r\n\t points = this._setBarHPoints(ctx, x0, y0, barWidth, radius, unit, value, 0);\r\n\t ctx.fill();\r\n\t }\r\n\t /*drawing the gradient border of a bar*/\r\n\r\n\r\n\t if (this._settings.border) {\r\n\t this._drawBarHBorder(ctx, x0, y0, barWidth, minValue, radius, unit, value, color);\r\n\t }\r\n\r\n\t ctx.globalAlpha = 1;\r\n\t /*sets a bar label*/\r\n\r\n\t this.canvases[sIndex].renderTextAt(\"middle\", true, data[i].$startX + (points[0] - data[i].$startX) / 2 - 1, y0 + (points[1] - y0) / 2, this._settings.label(data[i]));\r\n\t /*defines a map area for a bar*/\r\n\r\n\t map.addRect(data[i].id, [data[i].$startX - point0.x, y0 - point0.y, points[0] - point0.x, points[1] - point0.y], sIndex);\r\n\t /*the start position for the next series*/\r\n\r\n\t data[i].$startX = points[0];\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Spline$1 = {\r\n\t /**\r\n\t * renders a spline chart\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: width - the width of the container\r\n\t * @param: height - the height of the container\r\n\t * @param: sIndex - index of drawing chart\r\n\t */\r\n\t $render_spline: function $render_spline(ctx, data, point0, point1, sIndex, map) {\r\n\t var config, i, items, j, params, sparam, x, x0, x1, x2, y, y1, y2;\r\n\t params = this._calculateLineParams(ctx, data, point0, point1, sIndex);\r\n\t config = this._settings;\r\n\t this._mapStart = point0;\r\n\t /*array of all points*/\r\n\r\n\t items = [];\r\n\t /*drawing all items*/\r\n\r\n\t if (data.length) {\r\n\t /*getting all points*/\r\n\t x0 = config.offset ? point0.x + params.cellWidth * 0.5 : point0.x;\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t y = this._getPointY(data[i], point0, point1, params);\r\n\r\n\t if (y || y == \"0\") {\r\n\t x = !i ? x0 : params.cellWidth * i - 0.5 + x0;\r\n\t items.push({\r\n\t x: x,\r\n\t y: y,\r\n\t v: this._settings.value(data[i]),\r\n\t index: i\r\n\t });\r\n\t }\r\n\t }\r\n\r\n\t sparam = this._getSplineParameters(items);\r\n\r\n\t for (i = 0; i < items.length; i++) {\r\n\t x1 = items[i].x;\r\n\t y1 = items[i].y;\r\n\r\n\t if (i < items.length - 1) {\r\n\t x2 = items[i + 1].x;\r\n\t y2 = items[i + 1].y;\r\n\r\n\t for (j = x1; j < x2; j++) {\r\n\t var sY1 = this._getSplineYPoint(j, x1, i, sparam.a, sparam.b, sparam.c, sparam.d);\r\n\r\n\t if (sY1 < point0.y) sY1 = point0.y;\r\n\t if (sY1 > point1.y) sY1 = point1.y;\r\n\r\n\t var sY2 = this._getSplineYPoint(j + 1, x1, i, sparam.a, sparam.b, sparam.c, sparam.d);\r\n\r\n\t if (sY2 < point0.y) sY2 = point0.y;\r\n\t if (sY2 > point1.y) sY2 = point1.y;\r\n\r\n\t this._drawLine(ctx, j, sY1, j + 1, sY2, config.line.color(data[i]), config.line.width);\r\n\t }\r\n\r\n\t this._drawLine(ctx, x2 - 1, this._getSplineYPoint(j, x1, i, sparam.a, sparam.b, sparam.c, sparam.d), x2, y2, config.line.color(data[i]), config.line.width);\r\n\t }\r\n\r\n\t this._drawItem(ctx, x1, y1, data[items[i].index], config.label(data[items[i].index]), sIndex, map);\r\n\t }\r\n\t }\r\n\t },\r\n\r\n\t /*gets spline parameter*/\r\n\t _getSplineParameters: function _getSplineParameters(points) {\r\n\t var a,\r\n\t b,\r\n\t c,\r\n\t d,\r\n\t i,\r\n\t s,\r\n\t u,\r\n\t v,\r\n\t h = [],\r\n\t m = [],\r\n\t n = points.length;\r\n\r\n\t for (i = 0; i < n - 1; i++) {\r\n\t h[i] = points[i + 1].x - points[i].x;\r\n\t m[i] = (points[i + 1].y - points[i].y) / h[i];\r\n\t }\r\n\r\n\t u = [];\r\n\t v = [];\r\n\t u[0] = 0;\r\n\t u[1] = 2 * (h[0] + h[1]);\r\n\t v[0] = 0;\r\n\t v[1] = 6 * (m[1] - m[0]);\r\n\r\n\t for (i = 2; i < n - 1; i++) {\r\n\t u[i] = 2 * (h[i - 1] + h[i]) - h[i - 1] * h[i - 1] / u[i - 1];\r\n\t v[i] = 6 * (m[i] - m[i - 1]) - h[i - 1] * v[i - 1] / u[i - 1];\r\n\t }\r\n\r\n\t s = [];\r\n\t s[n - 1] = s[0] = 0;\r\n\r\n\t for (i = n - 2; i >= 1; i--) {\r\n\t s[i] = (v[i] - h[i] * s[i + 1]) / u[i];\r\n\t }\r\n\r\n\t a = [];\r\n\t b = [];\r\n\t c = [];\r\n\t d = [];\r\n\r\n\t for (i = 0; i < n - 1; i++) {\r\n\t a[i] = points[i].y;\r\n\t b[i] = -h[i] * s[i + 1] / 6 - h[i] * s[i] / 3 + (points[i + 1].y - points[i].y) / h[i];\r\n\t c[i] = s[i] / 2;\r\n\t d[i] = (s[i + 1] - s[i]) / (6 * h[i]);\r\n\t }\r\n\r\n\t for (i = 0; i < points.length - 1; i++) {\r\n\t if (points[i].v === 0 && points[i + 1].v === 0) {\r\n\t a[i] = points[i].y;\r\n\t d[i] = c[i] = b[i] = 0;\r\n\t }\r\n\t }\r\n\r\n\t return {\r\n\t a: a,\r\n\t b: b,\r\n\t c: c,\r\n\t d: d\r\n\t };\r\n\t },\r\n\r\n\t /*returns the y position of the spline point */\r\n\t _getSplineYPoint: function _getSplineYPoint(x, xi, i, a, b, c, d) {\r\n\t return a[i] + (x - xi) * (b[i] + (x - xi) * (c[i] + (x - xi) * d[i]));\r\n\t }\r\n\t};\r\n\r\n\tvar AreaChart = {\r\n\t /**\r\n\t * renders an area chart\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: width - the width of the container\r\n\t * @param: height - the height of the container\r\n\t * @param: sIndex - index of drawing chart\r\n\t */\r\n\t $render_area: function $render_area(ctx, data, point0, point1, sIndex, map) {\r\n\t var align, config, i, mapRect, obj, params, path, res1, res2, x0, x1, y1, x2, y2, y0;\r\n\t params = this._calculateLineParams(ctx, data, point0, point1, sIndex);\r\n\t config = this._settings; //the size of map area\r\n\r\n\t mapRect = config.eventRadius || Math.floor(params.cellWidth / 2);\r\n\r\n\t if (data.length) {\r\n\t // area points\r\n\t path = []; //the x position of the first item\r\n\r\n\t x0 = !config.offset ? point0.x : point0.x + params.cellWidth * 0.5;\r\n\t /*\r\n\t iterates over all data items:\r\n\t calculates [x,y] for area path, adds rect to chart map and renders labels\r\n\t */\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t obj = data[i];\r\n\t res2 = this._getPointY(obj, point0, point1, params);\r\n\t x2 = x0 + params.cellWidth * i;\r\n\r\n\t if (res2) {\r\n\t y2 = _typeof(res2) == \"object\" ? res2.y0 : res2;\r\n\r\n\t if (i && this._settings.fixOverflow) {\r\n\t res1 = this._getPointY(data[i - 1], point0, point1, params);\r\n\r\n\t if (res1.out && res1.out == res2.out) {\r\n\t continue;\r\n\t }\r\n\r\n\t x1 = params.cellWidth * (i - 1) - 0.5 + x0;\r\n\t y1 = _typeof(res1) == \"object\" ? res1.y0 : res1;\r\n\r\n\t if (res1.out) {\r\n\t y0 = res1.out == \"min\" ? point1.y : point0.y;\r\n\t path.push([this._calcOverflowX(x1, x2, y1, y2, y0), y0]);\r\n\t }\r\n\r\n\t if (res2.out) {\r\n\t y0 = res2.out == \"min\" ? point1.y : point0.y;\r\n\t path.push([this._calcOverflowX(x1, x2, y1, y2, y0), y0]);\r\n\t if (i == data.length - 1 && y0 == point0.y) path.push([x2, point0.y]);\r\n\t }\r\n\t }\r\n\r\n\t if (!res2.out) {\r\n\t path.push([x2, y2]); //map\r\n\r\n\t map.addRect(obj.id, [x2 - mapRect - point0.x, y2 - mapRect - point0.y, x2 + mapRect - point0.x, y2 + mapRect - point0.y], sIndex);\r\n\t } //labels\r\n\r\n\r\n\t if (!config.yAxis) {\r\n\t align = !config.offset && i == data.length - 1 ? \"left\" : \"center\";\r\n\t this.canvases[sIndex].renderTextAt(false, align, x2, y2 - config.labelOffset, config.label(obj));\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (path.length) {\r\n\t path.push([x2, point1.y]);\r\n\t path.push([path[0][0], point1.y]);\r\n\t } //filling area\r\n\r\n\r\n\t ctx.globalAlpha = this._settings.alpha.call(this, data[0]);\r\n\t ctx.fillStyle = this._settings.color.call(this, data[0]);\r\n\t ctx.beginPath();\r\n\r\n\t this._path(ctx, path);\r\n\r\n\t ctx.fill();\r\n\t ctx.lineWidth = 1;\r\n\t ctx.globalAlpha = 1; //border\r\n\r\n\t if (config.border) {\r\n\t ctx.lineWidth = config.borderWidth || 1;\r\n\t if (config.borderColor) ctx.strokeStyle = config.borderColor.call(this, data[0]);else this._setBorderStyles(ctx, ctx.fillStyle);\r\n\t ctx.beginPath();\r\n\r\n\t this._path(ctx, path);\r\n\r\n\t ctx.stroke();\r\n\t }\r\n\t }\r\n\t },\r\n\r\n\t /**\r\n\t * renders an area chart\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: width - the width of the container\r\n\t * @param: height - the height of the container\r\n\t * @param: sIndex - index of drawing chart\r\n\t */\r\n\t $render_stackedArea: function $render_stackedArea(ctx, data, point0, point1, sIndex, map) {\r\n\t var a0, a1, align, config, i, j, lastItem, mapRect, obj, params, path, x, y, yPos;\r\n\t params = this._calculateLineParams(ctx, data, point0, point1, sIndex);\r\n\t config = this._settings;\r\n\t /*the value that defines the map area position*/\r\n\r\n\t mapRect = config.eventRadius || Math.floor(params.cellWidth / 2);\r\n\t /*drawing all items*/\r\n\r\n\t if (data.length) {\r\n\t // area points\r\n\t path = []; // y item positions\r\n\r\n\t yPos = []; //the x position of the first item\r\n\r\n\t x = !config.offset ? point0.x : point0.x + params.cellWidth * 0.5;\r\n\r\n\t var setOffset = function setOffset(i, y) {\r\n\t return sIndex ? data[i].$startY ? y - point1.y + data[i].$startY : 0 : y;\r\n\t };\r\n\r\n\t var solveEquation = function solveEquation(x, p0, p1) {\r\n\t var k = (p1.y - p0.y) / (p1.x - p0.x);\r\n\t return k * x + p0.y - k * p0.x;\r\n\t };\r\n\t /*\r\n\t iterates over all data items:\r\n\t calculates [x,y] for area path, adds rect to chart map and renders labels\r\n\t */\r\n\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t obj = data[i];\r\n\r\n\t if (!i) {\r\n\t y = setOffset(i, point1.y);\r\n\t path.push([x, y]);\r\n\t } else {\r\n\t x += params.cellWidth;\r\n\t }\r\n\r\n\t y = setOffset(i, this._getPointY(obj, point0, point1, params));\r\n\t yPos.push(isNaN(y) && !i ? data[i].$startY || point1.y : y);\r\n\r\n\t if (y) {\r\n\t path.push([x, y]); //map\r\n\r\n\t map.addRect(obj.id, [x - mapRect - point0.x, y - mapRect - point0.y, x + mapRect - point0.x, y + mapRect - point0.y], sIndex); //labels\r\n\r\n\t if (!config.yAxis) {\r\n\t align = !config.offset && lastItem ? \"left\" : \"center\";\r\n\t this.canvases[sIndex].renderTextAt(false, align, x, y - config.labelOffset, config.label(obj));\r\n\t }\r\n\t }\r\n\t } // bottom right point\r\n\r\n\r\n\t path.push([x, setOffset(i - 1, point1.y)]); // lower border from the end to start\r\n\r\n\t if (sIndex) {\r\n\t for (i = data.length - 2; i > 0; i--) {\r\n\t x -= params.cellWidth;\r\n\t y = data[i].$startY;\r\n\t if (y) path.push([x, y]);\r\n\t }\r\n\t } // go to start point\r\n\r\n\r\n\t path.push([path[0][0], path[0][1]]); // filling path\r\n\r\n\t ctx.globalAlpha = this._settings.alpha.call(this, data[0]);\r\n\t ctx.fillStyle = this._settings.color.call(this, data[0]);\r\n\t ctx.beginPath();\r\n\r\n\t this._path(ctx, path);\r\n\r\n\t ctx.fill(); // set y positions of the next series\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t y = yPos[i];\r\n\r\n\t if (!y) {\r\n\t if (i == data.length - 1) {\r\n\t y = data[i].$startY;\r\n\t }\r\n\r\n\t for (j = i + 1; j < data.length; j++) {\r\n\t if (yPos[j]) {\r\n\t a0 = {\r\n\t x: point0.x,\r\n\t y: yPos[0]\r\n\t };\r\n\t a1 = {\r\n\t x: point0.x + params.cellWidth * j,\r\n\t y: yPos[j]\r\n\t };\r\n\t y = solveEquation(point0.x + params.cellWidth * i, a0, a1);\r\n\t break;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t data[i].$startY = y;\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar Radar = {\r\n\t $render_radar: function $render_radar(ctx, data, x, y, sIndex, map) {\r\n\t this._renderRadarChart(ctx, data, x, y, sIndex, map);\r\n\t },\r\n\r\n\t /**\r\n\t * renders a pie chart\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: x - the width of the container\r\n\t * @param: y - the height of the container\r\n\t * @param: ky - value from 0 to 1 that defines an angle of inclination (0 2) this._strokeRadarChart(ctx, posArr, data);\r\n\t if (!config.disableItems || data.length < 3) this._drawRadarItemMarkers(ctx, posArr, data, sIndex, map);\r\n\t posArr = null;\r\n\t },\r\n\t _drawRadarItemMarkers: function _drawRadarItemMarkers(ctx, points, data, sIndex, map) {\r\n\t for (var i = 0; i < points.length; i++) {\r\n\t this._drawItem(ctx, points[i].x, points[i].y, data[i], this._settings.label.call(this, data), sIndex, map);\r\n\t }\r\n\t },\r\n\t _fillRadarChart: function _fillRadarChart(ctx, points, data) {\r\n\t var pos0, pos1;\r\n\t ctx.globalAlpha = this._settings.alpha.call(this, {});\r\n\t ctx.beginPath();\r\n\r\n\t for (var i = 0; i < points.length; i++) {\r\n\t ctx.fillStyle = this._settings.fill.call(this, data[i]);\r\n\t pos0 = points[i];\r\n\t pos1 = points[i + 1] || points[0];\r\n\r\n\t if (!i) {\r\n\t ctx.moveTo(pos0.x, pos0.y);\r\n\t }\r\n\r\n\t ctx.lineTo(pos1.x, pos1.y);\r\n\t }\r\n\r\n\t ctx.fill();\r\n\t ctx.globalAlpha = 1;\r\n\t },\r\n\t _strokeRadarChart: function _strokeRadarChart(ctx, points, data) {\r\n\t var pos0, pos1;\r\n\r\n\t for (var i = 0; i < points.length; i++) {\r\n\t pos0 = points[i];\r\n\t pos1 = points[i + 1] || points[0];\r\n\r\n\t this._drawLine(ctx, pos0.x, pos0.y, pos1.x, pos1.y, this._settings.line.color.call(this, data[i]), this._settings.line.width);\r\n\t }\r\n\t },\r\n\t _drawRadarAxises: function _drawRadarAxises(ratios, x, y, radius, data) {\r\n\t var configY = this._settings.yAxis;\r\n\t var configX = this._settings.xAxis;\r\n\t var start = configY.start;\r\n\t var end = configY.end;\r\n\t var step = configY.step;\r\n\t var scaleParam = {};\r\n\t var config = this._configYAxis;\r\n\r\n\t if (typeof config.step == \"undefined\" || typeof config.start == \"undefined\" || typeof config.end == \"undefined\") {\r\n\t var limits = this._getLimits();\r\n\r\n\t scaleParam = this._calculateScale(limits.min, limits.max);\r\n\t start = scaleParam.start;\r\n\t end = scaleParam.end;\r\n\t step = scaleParam.step;\r\n\t configY.end = end;\r\n\t configY.start = start;\r\n\t }\r\n\r\n\t var units = [];\r\n\t var i, j, p;\r\n\t var c = 0;\r\n\t var stepHeight = radius * step / (end - start);\r\n\t /*correction for small step*/\r\n\r\n\t var power, corr;\r\n\r\n\t if (step < 1) {\r\n\t power = Math.min(this._log10(step), start <= 0 ? 0 : this._log10(start));\r\n\t corr = Math.pow(10, -power);\r\n\t }\r\n\r\n\t var angles = [];\r\n\t if (!this.canvases[\"scale\"]) this.canvases[\"scale\"] = this._createCanvas(\"radar_scale\");\r\n\t var ctx = this.canvases[\"scale\"].getCanvas();\r\n\r\n\t for (i = end; i >= start; i -= step) {\r\n\t var value = this._logScaleCalc ? Math.pow(10, i) : i;\r\n\t if (scaleParam.fixNum) value = parseFloat(i).toFixed(scaleParam.fixNum);\r\n\t units.push(Math.floor(c * stepHeight) + 0.5);\r\n\r\n\t if (corr && !this._logScaleCalc) {\r\n\t value = Math.round(value * corr) / corr;\r\n\t i = value;\r\n\t }\r\n\r\n\t var unitY = y - radius + units[units.length - 1];\r\n\t this.canvases[\"scale\"].renderTextAt(\"middle\", \"left\", x, unitY, configY.template(value.toString()), \"webix_axis_item_y webix_radar\");\r\n\r\n\t if (ratios.length < 2) {\r\n\t this._drawScaleSector(ctx, \"arc\", x, y, radius - units[units.length - 1], -Math.PI / 2, 3 * Math.PI / 2, i);\r\n\r\n\t return;\r\n\t }\r\n\r\n\t var startAlpha = -Math.PI / 2;\r\n\t /*possibly need to moved in config*/\r\n\r\n\t var alpha0 = startAlpha;\r\n\t var alpha1;\r\n\r\n\t for (j = 0; j < ratios.length; j++) {\r\n\t if (!c) angles.push(alpha0);\r\n\t alpha1 = startAlpha + ratios[j] - 0.0001;\r\n\r\n\t this._drawScaleSector(ctx, ratios.length > 2 ? config.lineShape || \"line\" : \"arc\", x, y, radius - units[units.length - 1], alpha0, alpha1, i, j, data[i]);\r\n\r\n\t alpha0 = alpha1;\r\n\t }\r\n\r\n\t c++;\r\n\t }\r\n\t /*renders radius lines and labels*/\r\n\r\n\r\n\t for (i = 0; i < angles.length; i++) {\r\n\t p = this._getPositionByAngle(angles[i], x, y, radius);\r\n\t if (configX.lines.call(this, data[i], i)) this._drawLine(ctx, x, y, p.x, p.y, configX ? configX.lineColor.call(this, data[i]) : \"#cfcfcf\", 1);\r\n\r\n\t this._drawRadarScaleLabel(ctx, x, y, radius, angles[i], configX ? configX.template.call(this, data[i]) : \" \");\r\n\t }\r\n\t },\r\n\t _drawScaleSector: function _drawScaleSector(ctx, shape, x, y, radius, a1, a2, i, j) {\r\n\t var pos1, pos2;\r\n\t if (radius < 0) return false;\r\n\t pos1 = this._getPositionByAngle(a1, x, y, radius);\r\n\t pos2 = this._getPositionByAngle(a2, x, y, radius);\r\n\t var configY = this._settings.yAxis;\r\n\r\n\t if (configY.bg) {\r\n\t ctx.beginPath();\r\n\t ctx.moveTo(x, y);\r\n\t if (shape == \"arc\") ctx.arc(x, y, radius, a1, a2, false);else {\r\n\t ctx.lineTo(pos1.x, pos1.y);\r\n\t ctx.lineTo(pos2.x, pos2.y);\r\n\t }\r\n\t ctx.fillStyle = configY.bg(i, j);\r\n\t ctx.moveTo(x, y);\r\n\t ctx.fill();\r\n\t ctx.closePath();\r\n\t }\r\n\r\n\t if (configY.lines.call(this, i)) {\r\n\t ctx.lineWidth = 1;\r\n\t ctx.beginPath();\r\n\t if (shape == \"arc\") ctx.arc(x, y, radius, a1, a2, false);else {\r\n\t ctx.moveTo(pos1.x, pos1.y);\r\n\t ctx.lineTo(pos2.x, pos2.y);\r\n\t }\r\n\t ctx.strokeStyle = configY.lineColor.call(this, i);\r\n\t ctx.stroke();\r\n\t }\r\n\t },\r\n\t _drawRadarScaleLabel: function _drawRadarScaleLabel(ctx, x, y, r, a, text) {\r\n\t if (!text) return false;\r\n\t var t = this.canvases[\"scale\"].renderText(0, 0, text, \"webix_axis_radar_title\", 1);\r\n\t var width = t.scrollWidth;\r\n\t var height = t.offsetHeight;\r\n\t var delta = 0.001;\r\n\r\n\t var pos = this._getPositionByAngle(a, x, y, r + 5);\r\n\r\n\t var corr_x = 0,\r\n\t corr_y = 0;\r\n\r\n\t if (a < 0 || a > Math.PI) {\r\n\t corr_y = -height;\r\n\t }\r\n\r\n\t if (a > Math.PI / 2) {\r\n\t corr_x = -width;\r\n\t }\r\n\r\n\t if (Math.abs(a + Math.PI / 2) < delta || Math.abs(a - Math.PI / 2) < delta) {\r\n\t corr_x = -width / 2;\r\n\t } else if (Math.abs(a) < delta || Math.abs(a - Math.PI) < delta) {\r\n\t corr_y = -height / 2;\r\n\t }\r\n\r\n\t t.style.top = pos.y + corr_y + \"px\";\r\n\t t.style.left = pos.x + corr_x + \"px\";\r\n\t t.style.width = width + \"px\";\r\n\t t.style.whiteSpace = \"nowrap\";\r\n\t }\r\n\t};\r\n\r\n\tvar Scatter = {\r\n\t /**\r\n\t * renders a graphic\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: point0 - top left point of a chart\r\n\t * @param: point1 - right bottom point of a chart\r\n\t * @param: sIndex - index of drawing chart\r\n\t * @param: map - map object\r\n\t */\r\n\t $render_scatter: function $render_scatter(ctx, data, point0, point1, sIndex, map) {\r\n\t if (!this._settings.xValue) return;\r\n\t var config = this._settings;\r\n\t var lines = !(config.disableLines || typeof config.disableLines == \"undefined\");\r\n\t /*max in min values*/\r\n\r\n\t var limitsY = this._getLimits();\r\n\r\n\t var limitsX = this._getLimits(\"h\", \"xValue\");\r\n\t /*render scale*/\r\n\r\n\r\n\t if (!sIndex) {\r\n\t if (!this.canvases[\"x\"]) this.canvases[\"x\"] = this._createCanvas(\"axis_x\");\r\n\t if (!this.canvases[\"y\"]) this.canvases[\"y\"] = this._createCanvas(\"axis_y\");\r\n\r\n\t this._drawYAxis(this.canvases[\"y\"].getCanvas(), data, point0, point1, limitsY.min, limitsY.max);\r\n\r\n\t this._drawHXAxis(this.canvases[\"x\"].getCanvas(), data, point0, point1, limitsX.min, limitsX.max);\r\n\t }\r\n\r\n\t limitsY = {\r\n\t min: config.yAxis.start,\r\n\t max: config.yAxis.end\r\n\t };\r\n\t limitsX = {\r\n\t min: config.xAxis.start,\r\n\t max: config.xAxis.end\r\n\t };\r\n\r\n\t var params = this._getScatterParams(ctx, data, point0, point1, limitsX, limitsY);\r\n\r\n\t this._mapStart = point0;\r\n\t var items = [];\r\n\r\n\t for (var i = 0; i < data.length; i++) {\r\n\t var x = this._calculateScatterItemPosition(params, point1, point0, limitsX, data[i], \"X\");\r\n\r\n\t var y = this._calculateScatterItemPosition(params, point0, point1, limitsY, data[i], \"Y\");\r\n\r\n\t if (isNaN(x) || isNaN(y)) continue;\r\n\t items.push({\r\n\t x: x,\r\n\t y: y,\r\n\t index: i\r\n\t });\r\n\t }\r\n\r\n\t var x1, y1, x2, y2, di;\r\n\r\n\t for (var _i = 0; _i < items.length; _i++) {\r\n\t di = items[_i].index;\r\n\r\n\t if (lines) {\r\n\t var color = config.line.color.call(this, data[di]); //line start position\r\n\r\n\t x1 = items[_i].x;\r\n\t y1 = items[_i].y;\r\n\r\n\t if (_i == items.length - 1) {\r\n\t //connecting last and first items\r\n\t if (config.shape && items.length > 2) {\r\n\t this._drawLine(ctx, x2, y2, items[0].x, items[0].y, color, config.line.width); //render shape on top of the line\r\n\r\n\r\n\t if (!config.disableItems) this._drawScatterItem(ctx, map, items[0], data[0], sIndex);\r\n\t if (config.fill) this._fillScatterChart(ctx, items, data);\r\n\t }\r\n\t } else {\r\n\t // line between two points\r\n\t x2 = items[_i + 1].x;\r\n\t y2 = items[_i + 1].y;\r\n\r\n\t this._drawLine(ctx, x1, y1, x2, y2, color, config.line.width);\r\n\t }\r\n\t } //item\r\n\r\n\r\n\t if (!config.disableItems && items[_i]) {\r\n\t this._drawScatterItem(ctx, map, items[_i], data[di], sIndex);\r\n\t }\r\n\t }\r\n\t },\r\n\t _fillScatterChart: function _fillScatterChart(ctx, points, data) {\r\n\t var pos0, pos1;\r\n\t ctx.globalAlpha = this._settings.alpha.call(this, {});\r\n\t ctx.beginPath();\r\n\r\n\t for (var i = 0; i < points.length; i++) {\r\n\t ctx.fillStyle = this._settings.fill.call(this, data[i]);\r\n\t pos0 = points[i];\r\n\t pos1 = points[i + 1] || points[0];\r\n\r\n\t if (!i) {\r\n\t ctx.moveTo(pos0.x, pos0.y);\r\n\t }\r\n\r\n\t ctx.lineTo(pos1.x, pos1.y);\r\n\t }\r\n\r\n\t ctx.fill();\r\n\t ctx.globalAlpha = 1;\r\n\t },\r\n\t _getScatterParams: function _getScatterParams(ctx, data, point0, point1, limitsX, limitsY) {\r\n\t var params = {};\r\n\t /*available space*/\r\n\r\n\t params.totalHeight = point1.y - point0.y;\r\n\t /*available width*/\r\n\r\n\t params.totalWidth = point1.x - point0.x;\r\n\t /*unit calculation (y_position = value*unit)*/\r\n\r\n\t this._calcScatterUnit(params, limitsX.min, limitsX.max, params.totalWidth, \"X\");\r\n\r\n\t this._calcScatterUnit(params, limitsY.min, limitsY.max, params.totalHeight, \"Y\");\r\n\r\n\t return params;\r\n\t },\r\n\t _drawScatterItem: function _drawScatterItem(ctx, map, item, obj, sIndex) {\r\n\t this._drawItem(ctx, item.x, item.y, obj, this._settings.label.call(this, obj), sIndex, map);\r\n\t },\r\n\t _calculateScatterItemPosition: function _calculateScatterItemPosition(params, point0, point1, limits, obj, axis) {\r\n\t /*the real value of an object*/\r\n\t var value = this._settings[axis == \"X\" ? \"xValue\" : \"value\"].call(this, obj);\r\n\t /*a relative value*/\r\n\r\n\r\n\t var valueFactor = params[\"valueFactor\" + axis];\r\n\t var v = (parseFloat(value || 0) - limits.min) * valueFactor;\r\n\t /*a vertical coordinate*/\r\n\r\n\t var unit = params[\"unit\" + axis];\r\n\t var pos = point1[axis.toLowerCase()] - (axis == \"X\" ? -1 : 1) * Math.floor(unit * v);\r\n\t /*the limit of the minimum value is the minimum visible value*/\r\n\r\n\t if (v < 0) pos = point1[axis.toLowerCase()];\r\n\t /*the limit of the maximum value*/\r\n\r\n\t if (value > limits.max) pos = point0[axis.toLowerCase()];\r\n\t /*the limit of the minimum value*/\r\n\r\n\t if (value < limits.min) pos = point1[axis.toLowerCase()];\r\n\t return pos;\r\n\t },\r\n\t _calcScatterUnit: function _calcScatterUnit(p, min, max, size, axis) {\r\n\t var relativeValues = this._getRelativeValue(min, max);\r\n\r\n\t axis = axis || \"\";\r\n\t p[\"relValue\" + axis] = relativeValues[0];\r\n\t p[\"valueFactor\" + axis] = relativeValues[1];\r\n\t p[\"unit\" + axis] = p[\"relValue\" + axis] ? size / p[\"relValue\" + axis] : 10;\r\n\t }\r\n\t};\r\n\r\n\tvar Presets = {\r\n\t presets: {\r\n\t \"simple\": {\r\n\t item: {\r\n\t borderColor: \"#ffffff\",\r\n\t color: \"#2b7100\",\r\n\t shadow: false,\r\n\t borderWidth: 2\r\n\t },\r\n\t line: {\r\n\t color: \"#8ecf03\",\r\n\t width: 2\r\n\t }\r\n\t },\r\n\t \"plot\": {\r\n\t color: \"#8664C6\",\r\n\t item: {\r\n\t borderColor: \"#8664C6\",\r\n\t borderWidth: 1,\r\n\t color: \"#ffffff\",\r\n\t type: \"r\",\r\n\t shadow: false\r\n\t },\r\n\t line: {\r\n\t color: \"#8664C6\",\r\n\t width: 2\r\n\t }\r\n\t },\r\n\t \"diamond\": {\r\n\t color: \"#FF5C4C\",\r\n\t item: {\r\n\t borderColor: \"#FF5C4C\",\r\n\t color: \"#FF5C4C\",\r\n\t type: \"d\",\r\n\t radius: 3,\r\n\t shadow: true\r\n\t },\r\n\t line: {\r\n\t color: \"#FF5C4C\",\r\n\t width: 2\r\n\t }\r\n\t },\r\n\t \"point\": {\r\n\t color: \"#1ca1c1\",\r\n\t disableLines: true,\r\n\t fill: false,\r\n\t disableItems: false,\r\n\t item: {\r\n\t color: \"#1ca1c1\",\r\n\t borderColor: \"#1ca1c1\",\r\n\t radius: 2,\r\n\t borderWidth: 2,\r\n\t type: \"r\"\r\n\t },\r\n\t alpha: 1\r\n\t },\r\n\t \"line\": {\r\n\t line: {\r\n\t color: \"#1ca1c1\",\r\n\t width: 2\r\n\t },\r\n\t item: {\r\n\t color: \"#ffffff\",\r\n\t borderColor: \"#1ca1c1\",\r\n\t radius: 2,\r\n\t borderWidth: 2,\r\n\t type: \"d\"\r\n\t },\r\n\t fill: false,\r\n\t disableItems: false,\r\n\t disableLines: false,\r\n\t alpha: 1\r\n\t },\r\n\t \"area\": {\r\n\t fill: \"#1ca1c1\",\r\n\t line: {\r\n\t color: \"#1ca1c1\",\r\n\t width: 1\r\n\t },\r\n\t disableItems: true,\r\n\t alpha: 0.2,\r\n\t disableLines: false\r\n\t },\r\n\t \"round\": {\r\n\t item: {\r\n\t radius: 3,\r\n\t borderColor: \"#1ca1c1\",\r\n\t borderWidth: 1,\r\n\t color: \"#1ca1c1\",\r\n\t type: \"r\",\r\n\t shadow: false,\r\n\t alpha: 0.6\r\n\t }\r\n\t },\r\n\t \"square\": {\r\n\t item: {\r\n\t radius: 3,\r\n\t borderColor: \"#00a497\",\r\n\t borderWidth: 2,\r\n\t color: \"#ffffff\",\r\n\t type: \"s\",\r\n\t shadow: false,\r\n\t alpha: 1\r\n\t },\r\n\t line: {\r\n\t color: \"#00a497\"\r\n\t }\r\n\t },\r\n\r\n\t /*bar*/\r\n\t \"column\": {\r\n\t color: \"RAINBOW\",\r\n\t gradient: false,\r\n\t barWidth: 45,\r\n\t radius: 0,\r\n\t alpha: 1,\r\n\t border: true\r\n\t },\r\n\t \"stick\": {\r\n\t barWidth: 5,\r\n\t gradient: false,\r\n\t color: \"#1ca1c1\",\r\n\t radius: 2,\r\n\t alpha: 1,\r\n\t border: false\r\n\t },\r\n\t \"alpha\": {\r\n\t color: \"#b9a8f9\",\r\n\t barWidth: 70,\r\n\t gradient: \"falling\",\r\n\t radius: 0,\r\n\t alpha: 0.5,\r\n\t border: true\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar SplineArea$1 = {\r\n\t /**\r\n\t * renders an splineArea chart\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: width - the width of the container\r\n\t * @param: height - the height of the container\r\n\t * @param: sIndex - index of drawing chart\r\n\t */\r\n\t $render_splineArea: function $render_splineArea(ctx, data, point0, point1, sIndex, map) {\r\n\t var color,\r\n\t i,\r\n\t items,\r\n\t j,\r\n\t mapRect,\r\n\t params,\r\n\t sParams,\r\n\t x,\r\n\t x0,\r\n\t x1,\r\n\t x2,\r\n\t y,\r\n\t y2,\r\n\t config = this._settings,\r\n\t path = [];\r\n\t params = this._calculateLineParams(ctx, data, point0, point1, sIndex);\r\n\t mapRect = config.eventRadius || Math.floor(params.cellWidth / 2);\r\n\t /*array of all points*/\r\n\r\n\t items = [];\r\n\r\n\t if (data.length) {\r\n\t /*getting all points*/\r\n\t x0 = point0.x;\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t y = this._getPointY(data[i], point0, point1, params);\r\n\r\n\t if (y || y == \"0\") {\r\n\t x = !i ? x0 : params.cellWidth * i - 0.5 + x0;\r\n\t items.push({\r\n\t x: x,\r\n\t y: y,\r\n\t index: i\r\n\t });\r\n\t map.addRect(data[i].id, [x - mapRect - point0.x, y - mapRect - point0.y, x + mapRect - point0.x, y + mapRect - point0.y], sIndex);\r\n\t }\r\n\t }\r\n\r\n\t sParams = this._getSplineParameters(items);\r\n\r\n\t for (i = 0; i < items.length; i++) {\r\n\t x1 = items[i].x;\r\n\r\n\t if (i < items.length - 1) {\r\n\t x2 = items[i + 1].x;\r\n\t y2 = items[i + 1].y;\r\n\r\n\t for (j = x1; j < x2; j++) {\r\n\t var sY1 = this._getSplineYPoint(j, x1, i, sParams.a, sParams.b, sParams.c, sParams.d);\r\n\r\n\t if (sY1 < point0.y) sY1 = point0.y;\r\n\t if (sY1 > point1.y) sY1 = point1.y;\r\n\r\n\t var sY2 = this._getSplineYPoint(j + 1, x1, i, sParams.a, sParams.b, sParams.c, sParams.d);\r\n\r\n\t if (sY2 < point0.y) sY2 = point0.y;\r\n\t if (sY2 > point1.y) sY2 = point1.y;\r\n\t path.push([j, sY1]);\r\n\t path.push([j + 1, sY2]);\r\n\t }\r\n\r\n\t path.push([x2, y2]);\r\n\t }\r\n\t }\r\n\r\n\t color = this._settings.color.call(this, data[0]);\r\n\r\n\t if (path.length) {\r\n\t path.push([x2, point1.y]);\r\n\t path.push([path[0][0], point1.y]);\r\n\t } //filling area\r\n\r\n\r\n\t ctx.globalAlpha = this._settings.alpha.call(this, data[0]);\r\n\t ctx.fillStyle = color;\r\n\t ctx.beginPath();\r\n\r\n\t this._path(ctx, path);\r\n\r\n\t ctx.fill();\r\n\t ctx.lineWidth = 1;\r\n\t ctx.globalAlpha = 1; // draw line\r\n\r\n\t if (config.border) {\r\n\t ctx.lineWidth = config.borderWidth || 1;\r\n\t if (config.borderColor) ctx.strokeStyle = config.borderColor.call(this, data[0]);else this._setBorderStyles(ctx, color);\r\n\t ctx.beginPath();\r\n\t path.splice(path.length - 3);\r\n\r\n\t this._path(ctx, path);\r\n\r\n\t ctx.stroke();\r\n\t }\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\tvar animateDuration = 400,\r\n\t cellWidth = 30;\r\n\tvar DynamicChart = {\r\n\t dynamic_setter: function dynamic_setter(value) {\r\n\t if (value) init(this);\r\n\t return value;\r\n\t }\r\n\t};\r\n\t/**\r\n\t * Sets event handlers and properties for a stock chart\r\n\t * @param {object} chart - chart view\r\n\t */\r\n\r\n\tfunction init(chart) {\r\n\t if (chart._stockRenderHandler) return;\r\n\t var config = chart._settings;\r\n\t if (!config.cellWidth) config.cellWidth = cellWidth;\r\n\t if (!config.animateDuration) config.animateDuration = animateDuration;\r\n\t config.offset = false;\r\n\t chart._stockRenderHandler = chart.attachEvent(\"onBeforeRender\", function (data, type) {\r\n\t var bounds = chart._getChartBounds(chart._content_width, chart._content_height);\r\n\r\n\t resizeStockCanvases(chart);\r\n\t filterStockData(data, bounds.start, bounds.end, config.cellWidth);\r\n\t if (type == \"add\") startAnimation(chart);\r\n\t });\r\n\t chart._stockXAxisHandler = chart.attachEvent(\"onBeforeXAxis\", function (ctx, data, point0, point1, cellWidth, y) {\r\n\t drawXAxis(chart, ctx, data, point0, point1, cellWidth, y);\r\n\t return false;\r\n\t });\r\n\t}\r\n\t/**\r\n\t * Starts stock animation\r\n\t * @param {object} chart - chart view\r\n\t */\r\n\r\n\r\n\tfunction startAnimation(chart) {\r\n\t var cellWidth = chart._settings.cellWidth;\r\n\r\n\t if (chart._stockAnimationOffset != cellWidth) {\r\n\t chart._stockAnimationOffset = cellWidth;\r\n\t chart.render();\r\n\t }\r\n\r\n\t chart._stockAnimationOffset = 0;\r\n\t chart._stockAnimationStart = null;\r\n\t if (window.requestAnimationFrame && !document.hidden) window.requestAnimationFrame(function (t) {\r\n\t animate$2(chart, t);\r\n\t });\r\n\t if (!chart._stockAnimateHandler) chart._stockAnimateHandler = chart.attachEvent(\"onAfterRender\", function (data) {\r\n\t applyStockOffset(chart, data);\r\n\t });\r\n\t}\r\n\t/**\r\n\t * Animates a chart\r\n\t * @param {object} chart - chart view\r\n\t * @param {number} timestamp - timestamp\r\n\t */\r\n\r\n\r\n\tfunction animate$2(chart, timestamp) {\r\n\t var progress,\r\n\t duration = chart._settings.animateDuration,\r\n\t cellWidth = chart._settings.cellWidth;\r\n\r\n\t if (cellWidth && chart.count() > 1) {\r\n\t if (!chart._stockAnimationStart) chart._stockAnimationStart = timestamp;\r\n\t progress = timestamp - chart._stockAnimationStart;\r\n\t chart._stockAnimationOffset = Math.min(Math.max(progress / duration * cellWidth, 1), cellWidth);\r\n\t chart.render();\r\n\t if (progress < duration) window.requestAnimationFrame(function (t) {\r\n\t animate$2(chart, t);\r\n\t });\r\n\t }\r\n\t}\r\n\t/**\r\n\t * Applies animation offset to \"series\" and \"x-axis\" canvases\r\n\t * @param {object} chart - chart view\r\n\t * @param {object} data - data array\r\n\t */\r\n\r\n\r\n\tfunction applyStockOffset(chart, data) {\r\n\t var count = chart.count(),\r\n\t bounds = chart._getChartBounds(chart._content_width, chart._content_height),\r\n\t cellWidth = chart._settings.cellWidth,\r\n\t offset$$1 = chart._stockAnimationOffset || 0,\r\n\t isScroll = data.length < count || (data.length - 1) * cellWidth > bounds.end.x - bounds.start.x;\r\n\r\n\t function setCanvasOffset(canvas, x0, x1, skipRight) {\r\n\t var ctx = canvas.getCanvas(),\r\n\t elem = canvas._canvas,\r\n\t labels = canvas._canvas_labels,\r\n\t series = canvas._canvas_series; // if we need to display less values than they are\r\n\r\n\t if (offset$$1 && (data.length < count || (data.length - 1) * cellWidth > x1 - x0)) {\r\n\t // move canvas to the left\r\n\t elem.style.left = -offset$$1 + \"px\";\r\n\r\n\t if (data.length > 1) {\r\n\t setLabelsOffset(labels, offset$$1, series); // clear out of the scale parts\r\n\r\n\t ctx.clearRect(0, 0, x0 + offset$$1, elem.offsetHeight);\r\n\t ctx.clearRect(x1 + offset$$1, 0, elem.offsetWidth, elem.offsetHeight);\r\n\t }\r\n\t } // animation for the right part (added item)\r\n\t else {\r\n\t elem.style.left = \"0px\";\r\n\t if (!skipRight && offset$$1 != cellWidth) ctx.clearRect(x0 + (data.length - 1) * cellWidth - cellWidth + offset$$1, 0, elem.offsetWidth, elem.offsetHeight);\r\n\t } // show label for the last label after finishing animation\r\n\r\n\r\n\t if (labels.length > 1 && offset$$1 && offset$$1 != cellWidth) {\r\n\t var last = labels.length - 1;\r\n\t if (isAxisTitle(series, labels[last])) last -= 1;\r\n\t labels[last].style.display = \"none\";\r\n\t }\r\n\t }\r\n\r\n\t eachStockCanvas(chart, function (name, canvas) {\r\n\t setCanvasOffset(canvas, bounds.start.x, bounds.end.x, name == \"x\");\r\n\t });\r\n\t setHtmlMapSizes(chart, bounds, isScroll ? offset$$1 : 0);\r\n\t}\r\n\r\n\tfunction isAxisTitle(series, label) {\r\n\t return series === \"axis_x\" && label.className.indexOf(\"webix_axis_title_x\") !== -1;\r\n\t}\r\n\r\n\tfunction setLabelsOffset(labels, offset$$1, series) {\r\n\t if (labels.length) {\r\n\t remove(labels[0]);\r\n\r\n\t for (var i = 1; i < labels.length; i++) {\r\n\t //don't move axis title\r\n\t if (isAxisTitle(series, labels[i])) continue;\r\n\t labels[i].style.left = labels[i].offsetLeft - offset$$1 + \"px\";\r\n\t }\r\n\t }\r\n\t}\r\n\t/**\r\n\t * Gets visible chart data\r\n\t * @param {object} data - an array with all chart data\r\n\t * @param {object} point0 - a top left point of a plot\r\n\t * @param {object} point1 - a bottom right point of a plot\r\n\t * @param {number} cellWidth - a unit width\r\n\t */\r\n\r\n\r\n\tfunction filterStockData(data, point0, point1, cellWidth) {\r\n\t if (cellWidth && data.length) {\r\n\t var limit = Math.ceil((point1.x - point0.x) / cellWidth);\r\n\t if (data.length > limit + 1) data.splice(0, data.length - limit - 1);\r\n\t }\r\n\t}\r\n\t/**\r\n\t * Calls a function for \"series\" and \"x-axis\" canvases\r\n\t * @param {object} chart - chart view\r\n\t * @param {function} func - function to call\r\n\t */\r\n\r\n\r\n\tfunction eachStockCanvas(chart, func) {\r\n\t if (chart.canvases) {\r\n\t for (var i = 0; i < chart._series.length; i++) {\r\n\t if (chart.canvases[i]) func(i, chart.canvases[i]);\r\n\t }\r\n\r\n\t if (chart.canvases[\"x\"]) func(\"x\", chart.canvases[\"x\"]);\r\n\t }\r\n\t}\r\n\t/**\r\n\t * Set sizes for animated canvases\r\n\t * @param {object} chart - chart view\r\n\t */\r\n\r\n\r\n\tfunction resizeStockCanvases(chart) {\r\n\t eachStockCanvas(chart, function (name, canvas) {\r\n\t canvas._resizeCanvas(chart._content_width + 2 * chart._settings.cellWidth, chart._content_height);\r\n\t });\r\n\t}\r\n\t/**\r\n\t * Set sizes for an html map of a chart\r\n\t * @param {object} chart - a chart view\r\n\t * @param {object} bounds - start and end points of a plot\r\n\t * @param {number} offset - an offset to apply\r\n\t */\r\n\r\n\r\n\tfunction setHtmlMapSizes(chart, bounds, offset$$1) {\r\n\t chart._contentobj._htmlmap.style.left = bounds.start.x - offset$$1 + \"px\";\r\n\t chart._contentobj._htmlmap.style.width = bounds.end.x - bounds.start.x + offset$$1 + \"px\";\r\n\t}\r\n\t/**\r\n\t * Renders lines and labels of an x-axis\r\n\t * @param {object} chart - a chart view\r\n\t * @param {object} ctx - a canvas Context\r\n\t * @param {object} data - a data array\r\n\t * @param {object} point0 - a top left point of a plot\r\n\t * @param {object} point1 - a bottom right point of a plot\r\n\t * @param {number} cellWidth - a width of a unit\r\n\t * @param {number} y - the vertical position of an \"x-axis\" line\r\n\t */\r\n\r\n\r\n\tfunction drawXAxis(chart, ctx, data, point0, point1, cellWidth, y) {\r\n\t var center,\r\n\t i,\r\n\t isScroll,\r\n\t unitPos,\r\n\t config = chart._settings,\r\n\t x0 = point0.x - 0.5,\r\n\t y0 = parseInt(y ? y : point1.y, 10) + 0.5,\r\n\t x1 = point1.x;\r\n\t if (!config.dynamic) return false;\r\n\t isScroll = (data.length - 1) * cellWidth > x1 - x0 || data.length < chart.count();\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t unitPos = x0 + i * cellWidth;\r\n\t center = isScroll ? i > 1 : !!i;\r\n\t unitPos = Math.ceil(unitPos) - 0.5; //scale labels\r\n\r\n\t chart._drawXAxisLabel(unitPos, y0, data[i], center); //draws a vertical line for the horizontal scale\r\n\r\n\r\n\t if (i && config.xAxis.lines.call(chart, data[i])) chart._drawXAxisLine(ctx, unitPos, point1.y, point0.y, data[i]);\r\n\t }\r\n\r\n\t chart.canvases[\"x\"].renderTextAt(true, false, x0, point1.y + config.padding.bottom - 3, config.xAxis.title, \"webix_axis_title_x\", point1.x - point0.x);\r\n\r\n\t chart._drawLine(ctx, x0, y0, x1 + (isScroll ? chart._stockAnimationOffset : 0), y0, config.xAxis.color, 1);\r\n\t}\r\n\r\n\tvar api$1m = {\r\n\t name: \"chart\",\r\n\t $init: function $init(config) {\r\n\t this._series = [this._settings];\r\n\t this._legend_labels = [];\r\n\t this._contentobj.className += \" webix_chart\";\r\n\t this.$ready.push(this._after_init_call);\r\n\t /*preset*/\r\n\r\n\t if (config.preset) {\r\n\t this._definePreset(config);\r\n\t } // move series to end of configuration properties hash\r\n\t // so it will be parsed after other settings\r\n\r\n\r\n\t if (config.series) {\r\n\t var series = config.series;\r\n\t delete config.series;\r\n\t config.series = series;\r\n\t }\r\n\r\n\t this.attachEvent(\"onMouseMove\", this._switchSeries);\r\n\t this.data.provideApi(this, true);\r\n\t },\r\n\t _after_init_call: function _after_init_call() {\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(function () {\r\n\t this.render.apply(this, arguments);\r\n\t }, this));\r\n\t },\r\n\t defaults: {\r\n\t ariaLabel: \"chart\",\r\n\t color: \"default\",\r\n\t alpha: \"1\",\r\n\t radius: 0,\r\n\t label: false,\r\n\t value: \"{obj.value}\",\r\n\t padding: {},\r\n\t type: \"pie\",\r\n\t lineColor: \"#ffffff\",\r\n\t cant: 0.5,\r\n\t barWidth: 30,\r\n\t line: {\r\n\t width: 2,\r\n\t color: \"#1ca1c1\"\r\n\t },\r\n\t item: {\r\n\t radius: 3,\r\n\t borderColor: \"#1ca1c1\",\r\n\t borderWidth: 2,\r\n\t color: \"#ffffff\",\r\n\t alpha: 1,\r\n\t type: \"r\",\r\n\t shadow: false\r\n\t },\r\n\t shadow: false,\r\n\t gradient: false,\r\n\t border: false,\r\n\t labelOffset: 20,\r\n\t origin: \"auto\",\r\n\t scale: \"linear\"\r\n\t },\r\n\t _id: \"webix_area_id\",\r\n\t on_click: {\r\n\t webix_chart_legend_item: function webix_chart_legend_item(e, id, obj) {\r\n\t var series = obj.getAttribute(\"series_id\");\r\n\r\n\t if (this.callEvent(\"onLegendClick\", [e, series, obj])) {\r\n\t if (typeof series != \"undefined\" && this._series.length > 1) {\r\n\t var config = this._settings;\r\n\t var values = config.legend.values;\r\n\t var toggle = values && values[series].toggle || config.legend.toggle; // hide action\r\n\r\n\t if (toggle) {\r\n\t if (obj.className.indexOf(\"hidden\") != -1) {\r\n\t this.showSeries(series);\r\n\t } else {\r\n\t this.hideSeries(series);\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t on_dblclick: {},\r\n\t on_mouse_move: {},\r\n\t locate: function locate$$1(e) {\r\n\t return locate(e, this._id);\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t var res = base.api.$setSize.call(this, x, y);\r\n\r\n\t if (res) {\r\n\t for (var c in this.canvases) {\r\n\t this.canvases[c]._resizeCanvas(this._content_width, this._content_height);\r\n\t }\r\n\r\n\t this.render();\r\n\t }\r\n\r\n\t return res;\r\n\t },\r\n\t type_setter: function type_setter(val) {\r\n\t assert(this[\"$render_\" + val], \"Chart type is not supported, or extension is not loaded: \" + val);\r\n\r\n\t if (typeof this._settings.offset == \"undefined\") {\r\n\t this._settings.offset = !(val.toLowerCase().indexOf(\"area\") != -1);\r\n\t }\r\n\r\n\t if (val == \"radar\" && !this._settings.yAxis) this.define(\"yAxis\", {});\r\n\r\n\t if (val == \"scatter\") {\r\n\t if (!this._settings.yAxis) this.define(\"yAxis\", {});\r\n\t if (!this._settings.xAxis) this.define(\"xAxis\", {});\r\n\t }\r\n\r\n\t return val;\r\n\t },\r\n\t destructor: function destructor() {\r\n\t this.removeAllSeries();\r\n\t Destruction.destructor.apply(this, arguments);\r\n\t },\r\n\t removeAllSeries: function removeAllSeries() {\r\n\t this.clearCanvas();\r\n\r\n\t if (this._legendObj) {\r\n\t this._legendObj.innerHTML = \"\";\r\n\r\n\t this._legendObj.parentNode.removeChild(this._legendObj);\r\n\r\n\t this._legendObj = null;\r\n\t }\r\n\r\n\t if (this.canvases) {\r\n\t this.canvases = {};\r\n\t }\r\n\r\n\t this._contentobj.innerHTML = \"\";\r\n\r\n\t for (var i = 0; i < this._series.length; i++) {\r\n\t if (this._series[i].tooltip) this._series[i].tooltip.destructor();\r\n\t } //\tthis.callEvent(\"onDestruct\",[]);\r\n\r\n\r\n\t this._series = [];\r\n\t },\r\n\t clearCanvas: function clearCanvas() {\r\n\t if (this.canvases && _typeof(this.canvases) == \"object\") for (var c in this.canvases) {\r\n\t this.canvases[c].clearCanvas();\r\n\t }\r\n\t },\r\n\t render: function render(id, changes, type) {\r\n\t var bounds, data, map, temp;\r\n\t if (!this.isVisible(this._settings.id)) return;\r\n\t data = this._getChartData();\r\n\t if (!this.callEvent(\"onBeforeRender\", [data, type])) return;\r\n\r\n\t if (this.canvases && _typeof(this.canvases) == \"object\") {\r\n\t for (var i in this.canvases) {\r\n\t this.canvases[i].clearCanvas();\r\n\t }\r\n\t } else this.canvases = {};\r\n\r\n\t if (this._settings.legend) {\r\n\t if (!this.canvases[\"legend\"]) this.canvases[\"legend\"] = this._createCanvas(\"legend\");\r\n\r\n\t this._drawLegend(this.data.getRange(), this._content_width, this._content_height);\r\n\t }\r\n\r\n\t this._map = map = new HtmlMap(this._id);\r\n\t temp = this._settings;\r\n\t bounds = this._getChartBounds(this._content_width, this._content_height);\r\n\r\n\t if (this._series) {\r\n\t for (var _i = 0; _i < this._series.length; _i++) {\r\n\t this._settings = this._series[_i];\r\n\t if (!this.canvases[_i]) this.canvases[_i] = this._createCanvas(this.name + \" \" + _i, \"z-index:\" + (2 + _i), null, _i, this._settings.ariaLabel);\r\n\r\n\t this[\"$render_\" + this._settings.type](this.canvases[_i].getCanvas(), data, bounds.start, bounds.end, _i, map);\r\n\t }\r\n\t }\r\n\r\n\t map.render(this._contentobj);\r\n\t this._contentobj.lastChild.style.zIndex = 100;\r\n\r\n\t this._applyBounds(this._contentobj.lastChild, bounds);\r\n\r\n\t this.callEvent(\"onAfterRender\", [data]);\r\n\t this._settings = temp; // hide hidden series\r\n\r\n\t if (this._settings.legend && this._settings.legend.values) {\r\n\t var series = this._settings.legend.values;\r\n\r\n\t for (var _i2 = 0; _i2 < series.length; _i2++) {\r\n\t if (series[_i2].$hidden) this.hideSeries(_i2);\r\n\t }\r\n\t }\r\n\t },\r\n\t _applyBounds: function _applyBounds(elem, bounds) {\r\n\t var style = {};\r\n\t style.left = bounds.start.x;\r\n\t style.top = bounds.start.y;\r\n\t style.width = bounds.end.x - bounds.start.x;\r\n\t style.height = bounds.end.y - bounds.start.y;\r\n\r\n\t for (var prop in style) {\r\n\t elem.style[prop] = style[prop] + \"px\";\r\n\t }\r\n\t },\r\n\t _getChartData: function _getChartData() {\r\n\t var axis, axisConfig, config, data, i, newData, start, units, value, valuesHash;\r\n\t data = this.data.getRange();\r\n\t axis = this._settings.type.toLowerCase().indexOf(\"barh\") != -1 ? \"yAxis\" : \"xAxis\";\r\n\t axisConfig = this._settings[axis];\r\n\r\n\t if (axisConfig && axisConfig.units && _typeof(axisConfig.units) == \"object\") {\r\n\t config = axisConfig.units;\r\n\t units = [];\r\n\r\n\t if (typeof config.start != \"undefined\" && typeof config.end != \"undefined\" && typeof config.next != \"undefined\") {\r\n\t start = config.start;\r\n\r\n\t while (start <= config.end) {\r\n\t units.push(start);\r\n\t start = config.next.call(this, start);\r\n\t }\r\n\t } else if (Object.prototype.toString.call(config) === \"[object Array]\") {\r\n\t units = config;\r\n\t }\r\n\r\n\t newData = [];\r\n\r\n\t if (units.length) {\r\n\t value = axisConfig.value;\r\n\t valuesHash = {};\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t valuesHash[value(data[i])] = i;\r\n\t }\r\n\r\n\t for (i = 0; i < units.length; i++) {\r\n\t if (typeof valuesHash[units[i]] != \"undefined\") {\r\n\t data[valuesHash[units[i]]].$unit = units[i];\r\n\t newData.push(data[valuesHash[units[i]]]);\r\n\t } else {\r\n\t newData.push({\r\n\t $unit: units[i]\r\n\t });\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return newData;\r\n\t }\r\n\r\n\t return data;\r\n\t },\r\n\t series_setter: function series_setter(config) {\r\n\t if (_typeof(config) != \"object\") {\r\n\t assert(config, \"Chart :: Series must be an array or object\");\r\n\t } else {\r\n\t this._parseSettings(!config.length ? config : config[0]);\r\n\r\n\t this._series = [this._settings];\r\n\r\n\t for (var i = 1; i < config.length; i++) {\r\n\t this.addSeries(config[i]);\r\n\t }\r\n\t }\r\n\r\n\t return config;\r\n\t },\r\n\t value_setter: template,\r\n\t xValue_setter: template,\r\n\t yValue_setter: function yValue_setter(config) {\r\n\t this.define(\"value\", config);\r\n\t },\r\n\t alpha_setter: template,\r\n\t label_setter: template,\r\n\t lineColor_setter: template,\r\n\t borderColor_setter: template,\r\n\t pieInnerText_setter: template,\r\n\t gradient_setter: function gradient_setter(config) {\r\n\t if (typeof config != \"function\" && config && config === true) config = \"light\";\r\n\t return config;\r\n\t },\r\n\t colormap: {\r\n\t \"RAINBOW\": function RAINBOW(obj) {\r\n\t var pos$$1 = Math.floor(this.getIndexById(obj.id) / this.count() * 1536);\r\n\t if (pos$$1 == 1536) pos$$1 -= 1;\r\n\t return this._rainbow[Math.floor(pos$$1 / 256)](pos$$1 % 256);\r\n\t },\r\n\t \"default\": function _default(obj) {\r\n\t var count = this.count();\r\n\t var colorsCount = this._defColors.length;\r\n\t var i = this.getIndexById(obj.id);\r\n\r\n\t if (colorsCount > count) {\r\n\t if (i) {\r\n\t if (i < colorsCount - count) i = this._defColorsCursor + 2;else i = this._defColorsCursor + 1;\r\n\t }\r\n\r\n\t this._defColorsCursor = i;\r\n\t } else i = i % colorsCount;\r\n\r\n\t return this._defColors[i];\r\n\t }\r\n\t },\r\n\t color_setter: function color_setter(value) {\r\n\t return this.colormap[value] || template(value);\r\n\t },\r\n\t fill_setter: function fill_setter(value) {\r\n\t return !value || value == \"0\" ? false : template(value);\r\n\t },\r\n\t _definePreset: function _definePreset(obj) {\r\n\t this.define(\"preset\", obj.preset);\r\n\t delete obj.preset;\r\n\t },\r\n\t preset_setter: function preset_setter(value) {\r\n\t var a, b, preset;\r\n\t this.defaults = exports.extend({}, this.defaults);\r\n\t preset = this.presets[value];\r\n\r\n\t if (_typeof(preset) == \"object\") {\r\n\t for (a in preset) {\r\n\t if (_typeof(preset[a]) == \"object\") {\r\n\t if (!this.defaults[a] || _typeof(this.defaults[a]) != \"object\") {\r\n\t this.defaults[a] = exports.extend({}, preset[a]);\r\n\t } else {\r\n\t this.defaults[a] = exports.extend({}, this.defaults[a]);\r\n\r\n\t for (b in preset[a]) {\r\n\t this.defaults[a][b] = preset[a][b];\r\n\t }\r\n\t }\r\n\t } else {\r\n\t this.defaults[a] = preset[a];\r\n\t }\r\n\t }\r\n\r\n\t return value;\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t legend_setter: function legend_setter(config) {\r\n\t if (!config) {\r\n\t if (this._legendObj) {\r\n\t this._legendObj.innerHTML = \"\";\r\n\t this._legendObj = null;\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\r\n\t if (_typeof(config) != \"object\") //allow to use template string instead of object\r\n\t config = {\r\n\t template: config\r\n\t };\r\n\r\n\t this._mergeSettings(config, {\r\n\t width: 150,\r\n\t height: 18,\r\n\t layout: \"y\",\r\n\t align: \"left\",\r\n\t valign: \"bottom\",\r\n\t template: \"\",\r\n\t toggle: this._settings.type.toLowerCase().indexOf(\"stacked\") != -1 ? \"\" : \"hide\",\r\n\t marker: {\r\n\t type: \"square\",\r\n\t width: 15,\r\n\t height: 15,\r\n\t radius: 3\r\n\t },\r\n\t margin: 4,\r\n\t padding: 3\r\n\t });\r\n\r\n\t config.template = template(config.template);\r\n\t return config;\r\n\t },\r\n\t item_setter: function item_setter(config) {\r\n\t if (_typeof(config) != \"object\") config = {\r\n\t color: config,\r\n\t borderColor: config\r\n\t };\r\n\r\n\t this._mergeSettings(config, exports.extend({}, this.defaults.item));\r\n\r\n\t var settings = [\"alpha\", \"borderColor\", \"color\", \"radius\", \"type\"];\r\n\r\n\t this._converToTemplate(settings, config);\r\n\r\n\t return config;\r\n\t },\r\n\t line_setter: function line_setter(config) {\r\n\t if (_typeof(config) != \"object\") config = {\r\n\t color: config\r\n\t };\r\n\t config = exports.extend(config, this.defaults.line);\r\n\t config.color = template(config.color);\r\n\t return config;\r\n\t },\r\n\t padding_setter: function padding_setter(config) {\r\n\t if (_typeof(config) != \"object\") config = {\r\n\t left: config,\r\n\t right: config,\r\n\t top: config,\r\n\t bottom: config\r\n\t };\r\n\r\n\t this._mergeSettings(config, {\r\n\t left: 50,\r\n\t right: 20,\r\n\t top: 35,\r\n\t bottom: 40\r\n\t });\r\n\r\n\t return config;\r\n\t },\r\n\t xAxis_setter: function xAxis_setter(config) {\r\n\t if (!config) return false;\r\n\t if (_typeof(config) != \"object\") config = {\r\n\t template: config\r\n\t };\r\n\r\n\t this._mergeSettings(config, {\r\n\t title: \"\",\r\n\t color: \"#edeff0\",\r\n\t lineColor: \"#edeff0\",\r\n\t template: \"{obj}\",\r\n\t lines: true\r\n\t });\r\n\r\n\t var templates = [\"lineColor\", \"template\", \"lines\"];\r\n\r\n\t this._converToTemplate(templates, config);\r\n\r\n\t this._configXAxis = exports.extend({}, config);\r\n\t return config;\r\n\t },\r\n\t yAxis_setter: function yAxis_setter(config) {\r\n\t this._mergeSettings(config, {\r\n\t title: \"\",\r\n\t color: \"#edeff0\",\r\n\t lineColor: \"#edeff0\",\r\n\t template: \"{obj}\",\r\n\t lines: true,\r\n\t bg: \"#ffffff\"\r\n\t });\r\n\r\n\t var templates = [\"lineColor\", \"template\", \"lines\", \"bg\"];\r\n\r\n\t this._converToTemplate(templates, config);\r\n\r\n\t this._configYAxis = exports.extend({}, config);\r\n\t return config;\r\n\t },\r\n\t _converToTemplate: function _converToTemplate(arr, config) {\r\n\t for (var i = 0; i < arr.length; i++) {\r\n\t config[arr[i]] = template(config[arr[i]]);\r\n\t }\r\n\t },\r\n\t _createCanvas: function _createCanvas(name, style, container, index$$1, title) {\r\n\t var params = {\r\n\t container: container || this._contentobj,\r\n\t name: name,\r\n\t title: isUndefined(title) ? name : title || \"\",\r\n\t series: index$$1,\r\n\t style: style || \"\",\r\n\t width: this._content_width,\r\n\t height: this._content_height\r\n\t };\r\n\t return new Canvas(params);\r\n\t },\r\n\t _drawScales: function _drawScales(data, point0, point1, start, end, cellWidth) {\r\n\t var ctx,\r\n\t y = 0;\r\n\r\n\t if (this._settings.yAxis) {\r\n\t if (!this.canvases[\"y\"]) this.canvases[\"y\"] = this._createCanvas(\"axis_y\");\r\n\t y = this._drawYAxis(this.canvases[\"y\"].getCanvas(), data, point0, point1, start, end);\r\n\t }\r\n\r\n\t if (this._settings.xAxis) {\r\n\t if (!this.canvases[\"x\"]) this.canvases[\"x\"] = this._createCanvas(\"axis_x\");\r\n\t ctx = this.canvases[\"x\"].getCanvas();\r\n\t if (this.callEvent(\"onBeforeXAxis\", [ctx, data, point0, point1, cellWidth, y])) this._drawXAxis(ctx, data, point0, point1, cellWidth, y);\r\n\t }\r\n\r\n\t return y;\r\n\t },\r\n\t _drawXAxis: function _drawXAxis(ctx, data, point0, point1, cellWidth, y) {\r\n\t var i,\r\n\t unitPos,\r\n\t config = this._settings,\r\n\t x0 = point0.x - 0.5,\r\n\t y0 = parseInt(y ? y : point1.y, 10) + 0.5,\r\n\t x1 = point1.x,\r\n\t center = true,\r\n\t labelY = config.type == \"stackedBar\" ? point1.y + 0.5 : y0;\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t if (config.offset === true) unitPos = x0 + cellWidth / 2 + i * cellWidth;else {\r\n\t unitPos = i == data.length - 1 && !config.cellWidth ? point1.x : x0 + i * cellWidth;\r\n\t center = !!i;\r\n\t }\r\n\t unitPos = Math.ceil(unitPos) - 0.5;\r\n\t /*scale labels*/\r\n\r\n\t var top = config.origin != \"auto\" && config.type == \"bar\" && parseFloat(config.value(data[i])) < config.origin;\r\n\r\n\t this._drawXAxisLabel(unitPos, labelY, data[i], center, top);\r\n\t /*draws a vertical line for the horizontal scale*/\r\n\r\n\r\n\t if ((config.offset || i || config.cellWidth) && config.xAxis.lines.call(this, data[i])) this._drawXAxisLine(ctx, unitPos, point1.y, point0.y, data[i]);\r\n\t }\r\n\r\n\t this.canvases[\"x\"].renderTextAt(true, false, x0, point1.y + config.padding.bottom - 3, config.xAxis.title, \"webix_axis_title_x\", point1.x - point0.x);\r\n\r\n\t this._drawLine(ctx, x0, y0, x1, y0, config.xAxis.color, 1);\r\n\t /*the right border in lines in scale are enabled*/\r\n\r\n\r\n\t if (!config.xAxis.lines.call(this, {}) || !config.offset) return;\r\n\r\n\t this._drawLine(ctx, x1 + 0.5, point1.y, x1 + 0.5, point0.y + 0.5, config.xAxis.lineColor.call(this, {}), 1);\r\n\t },\r\n\t _drawYAxis: function _drawYAxis(ctx, data, point0, point1, start, end) {\r\n\t var step;\r\n\t var scaleParam = {};\r\n\t if (!this._settings.yAxis) return;\r\n\t var x0 = point0.x - 0.5;\r\n\t var y0 = point1.y;\r\n\t var y1 = point0.y;\r\n\t var lineX = point1.y + 0.5; //this._drawLine(ctx,x0,y0,x0,y1,this._settings.yAxis.color,1);\r\n\r\n\t if (this._settings.yAxis.step) step = parseFloat(this._settings.yAxis.step);\r\n\r\n\t if (typeof this._configYAxis.step == \"undefined\" || typeof this._configYAxis.start == \"undefined\" || typeof this._configYAxis.end == \"undefined\") {\r\n\t scaleParam = this._calculateScale(start, end);\r\n\t start = scaleParam.start;\r\n\t end = scaleParam.end;\r\n\t step = scaleParam.step;\r\n\t this._settings.yAxis.end = end;\r\n\t this._settings.yAxis.start = start;\r\n\t } else if (this.config.scale == \"logarithmic\") this._logScaleCalc = true;\r\n\r\n\t this._setYAxisTitle(point0, point1);\r\n\r\n\t if (step === 0) return;\r\n\r\n\t if (end == start) {\r\n\t return y0;\r\n\t }\r\n\r\n\t var stepHeight = (y0 - y1) * step / (end - start);\r\n\t var c = 0;\r\n\r\n\t for (var i = start; i <= end; i += step) {\r\n\t var value = this._logScaleCalc ? Math.pow(10, i) : i;\r\n\t if (scaleParam.fixNum) value = parseFloat(value).toFixed(scaleParam.fixNum);\r\n\t var yi = Math.floor(y0 - c * stepHeight) + 0.5;\r\n\t /*canvas line fix*/\r\n\r\n\t if (!(i == start && this._settings.origin == \"auto\") && this._settings.yAxis.lines.call(this, i)) this._drawLine(ctx, x0, yi, point1.x, yi, this._settings.yAxis.lineColor.call(this, i), 1);\r\n\t if (i == this._settings.origin) lineX = yi;\r\n\t /*correction for JS float calculation*/\r\n\r\n\t if (step < 1 && !this._logScaleCalc) {\r\n\t var power = Math.min(Math.floor(this._log10(step)), start <= 0 ? 0 : Math.floor(this._log10(start)));\r\n\t var corr = Math.pow(10, -power);\r\n\t value = Math.round(value * corr) / corr;\r\n\t i = value;\r\n\t }\r\n\r\n\t this.canvases[\"y\"].renderText(0, yi - 5, this._settings.yAxis.template(value.toString()), \"webix_axis_item_y\", point0.x - 5);\r\n\t c++;\r\n\t }\r\n\r\n\t this._drawLine(ctx, x0, y0 + 1, x0, y1, this._settings.yAxis.color, 1);\r\n\r\n\t return lineX;\r\n\t },\r\n\t _setYAxisTitle: function _setYAxisTitle(point0, point1) {\r\n\t var className = \"webix_axis_title_y\";\r\n\t var text = this.canvases[\"y\"].renderTextAt(\"middle\", false, 0, parseInt((point1.y - point0.y) / 2 + point0.y, 10), this._settings.yAxis.title, className);\r\n\t if (text) text.style.left = (env.transform ? (text.offsetHeight - text.offsetWidth) / 2 : 0) + \"px\";\r\n\t },\r\n\t _calculateLogScale: function _calculateLogScale(nmin, nmax) {\r\n\t var startPower = Math.floor(this._log10(nmin));\r\n\t var endPower = Math.ceil(this._log10(nmax));\r\n\t return {\r\n\t start: startPower,\r\n\t step: 1,\r\n\t end: endPower\r\n\t };\r\n\t },\r\n\t _normStep: function _normStep(step) {\r\n\t var power = Math.floor(this._log10(step));\r\n\t var calculStep = Math.pow(10, power);\r\n\t var stepVal = step / calculStep;\r\n\t stepVal = stepVal > 5 ? 10 : 5;\r\n\t return parseInt(stepVal, 10) * calculStep;\r\n\t },\r\n\t _calculateScale: function _calculateScale(nmin, nmax) {\r\n\t this._logScaleCalc = false;\r\n\r\n\t if (this._settings.scale == \"logarithmic\") {\r\n\t var logMin = Math.floor(this._log10(nmin));\r\n\t var logMax = Math.ceil(this._log10(nmax));\r\n\r\n\t if (nmin > 0 && nmax > 0 && logMax - logMin > 1) {\r\n\t this._logScaleCalc = true;\r\n\t return this._calculateLogScale(nmin, nmax);\r\n\t }\r\n\t }\r\n\r\n\t if (this._settings.origin != \"auto\" && this._settings.origin < nmin) nmin = this._settings.origin;\r\n\t var step, start, end;\r\n\t step = this._normStep((nmax - nmin) / 8 || 1);\r\n\t if (step > Math.abs(nmin)) start = nmin < 0 ? -step : 0;else {\r\n\t var absNmin = Math.abs(nmin);\r\n\t var powerStart = Math.floor(this._log10(absNmin));\r\n\t var nminVal = absNmin / Math.pow(10, powerStart);\r\n\t start = Math.ceil(nminVal * 10) / 10 * Math.pow(10, powerStart) - step;\r\n\r\n\t if (absNmin > 1 && step > 0.1) {\r\n\t start = Math.ceil(start);\r\n\t }\r\n\r\n\t while (nmin < 0 ? start <= nmin : start >= nmin) {\r\n\t start -= step;\r\n\t }\r\n\r\n\t if (nmin < 0) start = -start - 2 * step;\r\n\t }\r\n\t if (nmax - start > 10) step = this._normStep((nmax - start) / 8 || 1);\r\n\t end = start;\r\n\t var power = Math.floor(this._log10(step));\r\n\r\n\t while (end < nmax) {\r\n\t end += step;\r\n\t end = parseFloat((end * 1.0).toFixed(Math.abs(power)));\r\n\t }\r\n\r\n\t return {\r\n\t start: start,\r\n\t end: end,\r\n\t step: step,\r\n\t fixNum: power < 0 ? Math.abs(power) : 0\r\n\t };\r\n\t },\r\n\t _getLimits: function _getLimits(orientation, value) {\r\n\t var data = this.data._obj_array();\r\n\r\n\t var maxValue, minValue;\r\n\t var axis = arguments.length && orientation == \"h\" ? this._configXAxis : this._configYAxis;\r\n\t value = value || \"value\";\r\n\r\n\t if (axis && typeof axis.end != \"undefined\" && typeof axis.start != \"undefined\" && axis.step) {\r\n\t maxValue = parseFloat(axis.end);\r\n\t minValue = parseFloat(axis.start);\r\n\t } else {\r\n\t maxValue = GroupMethods.max(this._series[0][value], data);\r\n\t minValue = axis && typeof axis.start != \"undefined\" ? parseFloat(axis.start) : GroupMethods.min(this._series[0][value], data);\r\n\t if (this._series.length > 1) for (var i = 1; i < this._series.length; i++) {\r\n\t var maxI = GroupMethods.max(this._series[i][value], data);\r\n\t var minI = GroupMethods.min(this._series[i][value], data);\r\n\t if (maxI > maxValue) maxValue = maxI;\r\n\t if (minI < minValue) minValue = minI;\r\n\t }\r\n\t }\r\n\r\n\t return {\r\n\t max: maxValue,\r\n\t min: minValue\r\n\t };\r\n\t },\r\n\t _log10: function _log10(n) {\r\n\t var method_name = \"log\";\r\n\t return Math[method_name](n) / Math.LN10;\r\n\t },\r\n\t _drawXAxisLabel: function _drawXAxisLabel(x, y, obj, center, top) {\r\n\t if (!this._settings.xAxis) return;\r\n\t var elem = this.canvases[\"x\"].renderTextAt(top, center, x, y - (top ? 2 : 0), this._settings.xAxis.template(obj));\r\n\t if (elem) elem.className += \" webix_axis_item_x\";\r\n\t },\r\n\t _drawXAxisLine: function _drawXAxisLine(ctx, x, y1, y2, obj) {\r\n\t if (!this._settings.xAxis || !this._settings.xAxis.lines) return;\r\n\r\n\t this._drawLine(ctx, x, y1, x, y2, this._settings.xAxis.lineColor.call(this, obj), 1);\r\n\t },\r\n\t _drawLine: function _drawLine(ctx, x1, y1, x2, y2, color$$1, width) {\r\n\t ctx.strokeStyle = color$$1;\r\n\t ctx.lineWidth = width;\r\n\t ctx.beginPath();\r\n\t ctx.moveTo(x1, y1);\r\n\t ctx.lineTo(x2, y2);\r\n\t ctx.stroke();\r\n\t ctx.lineWidth = 1;\r\n\t },\r\n\t _getRelativeValue: function _getRelativeValue(minValue, maxValue) {\r\n\t var relValue;\r\n\t var valueFactor = 1;\r\n\r\n\t if (maxValue != minValue) {\r\n\t relValue = maxValue - minValue;\r\n\t } else relValue = minValue;\r\n\r\n\t return [relValue, valueFactor];\r\n\t },\r\n\t _rainbow: [function (pos$$1) {\r\n\t return \"#FF\" + color.toHex(pos$$1 / 2, 2) + \"00\";\r\n\t }, function (pos$$1) {\r\n\t return \"#FF\" + color.toHex(pos$$1 / 2 + 128, 2) + \"00\";\r\n\t }, function (pos$$1) {\r\n\t return \"#\" + color.toHex(255 - pos$$1, 2) + \"FF00\";\r\n\t }, function (pos$$1) {\r\n\t return \"#00FF\" + color.toHex(pos$$1, 2);\r\n\t }, function (pos$$1) {\r\n\t return \"#00\" + color.toHex(255 - pos$$1, 2) + \"FF\";\r\n\t }, function (pos$$1) {\r\n\t return \"#\" + color.toHex(pos$$1, 2) + \"00FF\";\r\n\t }],\r\n\t _defColors: [\"#f55b50\", \"#ff6d3f\", \"#ffa521\", \"#ffc927\", \"#ffee54\", \"#d3e153\", \"#9acb61\", \"#63b967\", \"#21a497\", \"#21c5da\", \"#3ea4f5\", \"#5868bf\", \"#7b53c0\", \"#a943ba\", \"#ec3b77\", \"#9eb0b8\"],\r\n\t _defColorsCursor: 0,\r\n\r\n\t /**\r\n\t * adds series to the chart (value and color properties)\r\n\t * @param: obj - obj with configuration properties\r\n\t */\r\n\t addSeries: function addSeries(obj) {\r\n\t var temp = exports.extend({}, this._settings);\r\n\t this._settings = exports.extend({}, temp);\r\n\r\n\t this._parseSettings(obj, {});\r\n\r\n\t this._series.push(this._settings);\r\n\r\n\t this._settings = temp;\r\n\t },\r\n\r\n\t /*switch global settings to serit in question*/\r\n\t _switchSeries: function _switchSeries(id, e, tag) {\r\n\t var tip;\r\n\t if (!tag.getAttribute(\"userdata\")) return;\r\n\t this._active_serie = this._series.length == 1 ? this._getActiveSeries(e) : tag.getAttribute(\"userdata\");\r\n\t if (!this._series[this._active_serie]) return;\r\n\r\n\t for (var i = 0; i < this._series.length; i++) {\r\n\t tip = this._series[i].tooltip;\r\n\t if (tip) tip.disable();\r\n\t }\r\n\r\n\t if (!tag.getAttribute(\"disabled\")) {\r\n\t tip = this._series[this._active_serie].tooltip;\r\n\t if (tip) tip.enable();\r\n\t }\r\n\t },\r\n\t _getActiveSeries: function _getActiveSeries(e) {\r\n\t var a, areas, i, offset$$1, pos$$1, selection, x, y;\r\n\t areas = this._map._areas;\r\n\t offset$$1 = offset(this._contentobj._htmlmap);\r\n\t pos$$1 = pos(e);\r\n\t x = pos$$1.x - offset$$1.x;\r\n\t y = pos$$1.y - offset$$1.y;\r\n\r\n\t for (i = 0; i < areas.length; i++) {\r\n\t a = areas[i].points;\r\n\r\n\t if (x <= a[2] && x >= a[0] && y <= a[3] && y >= a[1]) {\r\n\t if (selection) {\r\n\t if (areas[i].index > selection.index) selection = areas[i];\r\n\t } else selection = areas[i];\r\n\t }\r\n\t }\r\n\r\n\t return selection ? selection.index : 0;\r\n\t },\r\n\t hideSeries: function hideSeries(series) {\r\n\t this.canvases[series].hideCanvas();\r\n\t var legend = this._settings.legend;\r\n\r\n\t if (legend && legend.values && legend.values[series]) {\r\n\t legend.values[series].$hidden = true;\r\n\r\n\t this._drawLegend();\r\n\t }\r\n\r\n\t this._map.hide(this._contentobj, series, true);\r\n\t },\r\n\t showSeries: function showSeries(series) {\r\n\t this.canvases[series].showCanvas();\r\n\t var legend = this._settings.legend;\r\n\r\n\t if (legend && legend.values && legend.values[series]) {\r\n\t delete legend.values[series].$hidden;\r\n\r\n\t this._drawLegend();\r\n\t }\r\n\r\n\t this._map.hide(this._contentobj, series, false);\r\n\t },\r\n\r\n\t /**\r\n\t * renders legend block\r\n\t * @param: ctx - canvas object\r\n\t * @param: data - object those need to be displayed\r\n\t * @param: width - the width of the container\r\n\t * @param: height - the height of the container\r\n\t */\r\n\t _drawLegend: function _drawLegend(data, width) {\r\n\t /*position of the legend block*/\r\n\t var i,\r\n\t legend,\r\n\t legendContainer,\r\n\t legendHeight,\r\n\t legendItems,\r\n\t legendWidth,\r\n\t style,\r\n\t x = 0,\r\n\t y = 0,\r\n\t ctx,\r\n\t itemColor,\r\n\t disabled,\r\n\t item;\r\n\t data = data || [];\r\n\t width = width || this._content_width;\r\n\t ctx = this.canvases[\"legend\"].getCanvas();\r\n\t /*legend config*/\r\n\r\n\t legend = this._settings.legend;\r\n\t /*the legend sizes*/\r\n\r\n\t style = this._settings.legend.layout != \"x\" ? \"width:\" + legend.width + \"px\" : \"\";\r\n\t /*creation of legend container*/\r\n\r\n\t if (this._legendObj) {\r\n\t this._legendObj.innerHTML = \"\";\r\n\r\n\t this._legendObj.parentNode.removeChild(this._legendObj);\r\n\t }\r\n\r\n\t this.canvases[\"legend\"].clearCanvas(true);\r\n\t legendContainer = create(\"DIV\", {\r\n\t \"class\": \"webix_chart_legend\",\r\n\t \"style\": \"left:\" + x + \"px; top:\" + y + \"px;\" + style\r\n\t }, \"\");\r\n\r\n\t if (legend.padding) {\r\n\t legendContainer.style.padding = legend.padding + \"px\";\r\n\t }\r\n\r\n\t this._legendObj = legendContainer;\r\n\r\n\t this._contentobj.appendChild(legendContainer);\r\n\t /*rendering legend text items*/\r\n\r\n\r\n\t legendItems = [];\r\n\t if (!legend.values) for (i = 0; i < data.length; i++) {\r\n\t legendItems.push(this._drawLegendText(legendContainer, legend.template(data[i]), data[i].id));\r\n\t } else for (i = 0; i < legend.values.length; i++) {\r\n\t legendItems.push(this._drawLegendText(legendContainer, legend.values[i].text, typeof legend.values[i].id != \"undefined\" ? _typeof(legend.values[i].id) : i, legend.values[i].$hidden));\r\n\t }\r\n\t if (legendContainer.offsetWidth === 0) legendContainer.style.width = \"auto\";\r\n\t legendWidth = legendContainer.offsetWidth;\r\n\t legendHeight = legendContainer.offsetHeight;\r\n\t /*this._settings.legend.width = legendWidth;\r\n\t this._settings.legend.height = legendHeight;*/\r\n\r\n\t /*setting legend position*/\r\n\r\n\t if (legendWidth < width) {\r\n\t if (legend.layout == \"x\" && legend.align == \"center\") {\r\n\t x = (width - legendWidth) / 2;\r\n\t }\r\n\r\n\t if (legend.align == \"right\") {\r\n\t x = width - legendWidth;\r\n\t }\r\n\r\n\t if (legend.margin && legend.align != \"center\") {\r\n\t x += (legend.align == \"left\" ? 1 : -1) * legend.margin;\r\n\t }\r\n\t }\r\n\r\n\t if (legendHeight < this._content_height) {\r\n\t if (legend.valign == \"middle\" && legend.align != \"center\" && legend.layout != \"x\") y = (this._content_height - legendHeight) / 2;else if (legend.valign == \"bottom\") y = this._content_height - legendHeight;\r\n\r\n\t if (legend.margin && legend.valign != \"middle\") {\r\n\t y += (legend.valign == \"top\" ? 1 : -1) * legend.margin;\r\n\t }\r\n\t }\r\n\r\n\t legendContainer.style.left = x + \"px\";\r\n\t legendContainer.style.top = y + \"px\";\r\n\t /*drawing colorful markers*/\r\n\r\n\t ctx.save();\r\n\r\n\t for (i = 0; i < legendItems.length; i++) {\r\n\t item = legendItems[i];\r\n\r\n\t if (legend.values && legend.values[i].$hidden) {\r\n\t disabled = true;\r\n\t itemColor = legend.values[i].disableColor ? legend.values[i].disableColor : \"#edeff0\";\r\n\t } else {\r\n\t disabled = false;\r\n\t itemColor = legend.values ? legend.values[i].color : this._settings.color.call(this, data[i]);\r\n\t }\r\n\r\n\t this._drawLegendMarker(ctx, item.offsetLeft + x, item.offsetTop + y, itemColor, item.offsetHeight, disabled, i);\r\n\t }\r\n\r\n\t ctx.restore();\r\n\t legendItems = null;\r\n\t },\r\n\r\n\t /**\r\n\t * appends legend item to legend block\r\n\t * @param: ctx - canvas object\r\n\t * @param: obj - data object that needs being represented\r\n\t */\r\n\t _drawLegendText: function _drawLegendText(cont, value, series, disabled) {\r\n\t var style = \"\";\r\n\t if (this._settings.legend.layout == \"x\") style = \"float:left;\";\r\n\t /*the text of the legend item*/\r\n\r\n\t var text = create(\"DIV\", {\r\n\t \"style\": style + \"padding-left:\" + (10 + this._settings.legend.marker.width) + \"px\",\r\n\t \"class\": \"webix_chart_legend_item\" + (disabled ? \" hidden\" : \"\"),\r\n\t \"role\": \"button\",\r\n\t \"tabindex\": \"0\",\r\n\t \"aria-label\": i18n.aria[(disabled ? \"show\" : \"hide\") + \"Chart\"] + \" \" + value\r\n\t }, value);\r\n\t if (arguments.length > 2) text.setAttribute(\"series_id\", series);\r\n\t cont.appendChild(text);\r\n\t return text;\r\n\t },\r\n\r\n\t /**\r\n\t * draw legend colorful marder\r\n\t * @param: ctx - canvas object\r\n\t * @param: x - the horizontal position of the marker\r\n\t * @param: y - the vertical position of the marker\r\n\t * @param: obj - data object which color needs being used\r\n\t */\r\n\t _drawLegendMarker: function _drawLegendMarker(ctx, x, y, color$$1, height, disabled, i) {\r\n\t var p = [];\r\n\t var marker = this._settings.legend.marker;\r\n\t var values = this._settings.legend.values;\r\n\t var type = values && values[i].markerType ? values[i].markerType : marker.type;\r\n\r\n\t if (color$$1) {\r\n\t ctx.strokeStyle = ctx.fillStyle = color$$1;\r\n\t }\r\n\r\n\t if (type == \"round\" || !marker.radius) {\r\n\t ctx.beginPath();\r\n\t ctx.lineWidth = marker.height;\r\n\t ctx.lineCap = marker.type;\r\n\t /*start of marker*/\r\n\r\n\t x += ctx.lineWidth / 2 + 5;\r\n\t y += height / 2;\r\n\t ctx.moveTo(x, y);\r\n\t var x1 = x + marker.width - marker.height + 1;\r\n\t ctx.lineTo(x1, y);\r\n\t ctx.stroke();\r\n\t ctx.fill();\r\n\t } else if (type == \"item\") {\r\n\t /*copy of line*/\r\n\t if (this._settings.line && this._settings.type != \"scatter\" && !this._settings.disableLines) {\r\n\t ctx.beginPath();\r\n\t ctx.lineWidth = this._series[i].line.width;\r\n\t ctx.strokeStyle = disabled ? color$$1 : this._series[i].line.color.call(this, {});\r\n\t var x0 = x + 5;\r\n\t var y0 = y + height / 2;\r\n\t ctx.moveTo(x0, y0);\r\n\r\n\t var _x = x0 + marker.width;\r\n\r\n\t ctx.lineTo(_x, y0);\r\n\t ctx.stroke();\r\n\t }\r\n\t /*item copy*/\r\n\r\n\r\n\t var config = this._series[i].item;\r\n\t var radius = parseInt(config.radius.call(this, {}), 10) || 0;\r\n\t var markerType = config.type.call(this, {});\r\n\r\n\t if (radius) {\r\n\t ctx.beginPath();\r\n\r\n\t if (disabled) {\r\n\t ctx.lineWidth = config.borderWidth;\r\n\t ctx.strokeStyle = color$$1;\r\n\t ctx.fillStyle = color$$1;\r\n\t } else {\r\n\t ctx.lineWidth = config.borderWidth;\r\n\t ctx.fillStyle = config.color.call(this, {});\r\n\t ctx.strokeStyle = config.borderColor.call(this, {});\r\n\t ctx.globalAlpha = config.alpha.call(this, {});\r\n\t }\r\n\r\n\t ctx.beginPath();\r\n\t x += marker.width / 2 + 5;\r\n\t y += height / 2;\r\n\r\n\t this._strokeChartItem(ctx, x, y, radius + 1, markerType);\r\n\r\n\t ctx.fill();\r\n\t ctx.stroke();\r\n\t }\r\n\r\n\t ctx.globalAlpha = 1;\r\n\t } else {\r\n\t ctx.beginPath();\r\n\t ctx.lineWidth = 1;\r\n\t x += 5;\r\n\t y += height / 2 - marker.height / 2;\r\n\t p = [[x + marker.radius, y + marker.radius, marker.radius, Math.PI, 3 * Math.PI / 2, false], [x + marker.width - marker.radius, y], [x + marker.width - marker.radius, y + marker.radius, marker.radius, -Math.PI / 2, 0, false], [x + marker.width, y + marker.height - marker.radius], [x + marker.width - marker.radius, y + marker.height - marker.radius, marker.radius, 0, Math.PI / 2, false], [x + marker.radius, y + marker.height], [x + marker.radius, y + marker.height - marker.radius, marker.radius, Math.PI / 2, Math.PI, false], [x, y + marker.radius]];\r\n\r\n\t this._path(ctx, p);\r\n\r\n\t ctx.stroke();\r\n\t ctx.fill();\r\n\t }\r\n\t },\r\n\r\n\t /**\r\n\t * gets the points those represent chart left top and right bottom bounds\r\n\t * @param: width - the width of the chart container\r\n\t * @param: height - the height of the chart container\r\n\t */\r\n\t _getChartBounds: function _getChartBounds(width, height) {\r\n\t var chartX0, chartY0, chartX1, chartY1;\r\n\t chartX0 = this._settings.padding.left;\r\n\t chartY0 = this._settings.padding.top;\r\n\t chartX1 = width - this._settings.padding.right;\r\n\t chartY1 = height - this._settings.padding.bottom;\r\n\r\n\t if (this._settings.legend) {\r\n\t var legend = this._settings.legend;\r\n\t /*legend size*/\r\n\r\n\t var legendWidth = this._settings.legend.width;\r\n\t var legendHeight = this._settings.legend.height;\r\n\t /*if legend is horizontal*/\r\n\r\n\t if (legend.layout == \"x\") {\r\n\t if (legend.valign == \"center\") {\r\n\t if (legend.align == \"right\") chartX1 -= legendWidth;else if (legend.align == \"left\") chartX0 += legendWidth;\r\n\t } else if (legend.valign == \"bottom\") {\r\n\t chartY1 -= legendHeight;\r\n\t } else {\r\n\t chartY0 += legendHeight;\r\n\t }\r\n\t }\r\n\t /*vertical scale*/\r\n\t else {\r\n\t if (legend.align == \"right\") chartX1 -= legendWidth;else if (legend.align == \"left\") chartX0 += legendWidth;\r\n\t }\r\n\t }\r\n\r\n\t return {\r\n\t start: {\r\n\t x: chartX0,\r\n\t y: chartY0\r\n\t },\r\n\t end: {\r\n\t x: chartX1,\r\n\t y: chartY1\r\n\t }\r\n\t };\r\n\t },\r\n\r\n\t /**\r\n\t * gets the maximum and minimum values for the stacked chart\r\n\t * @param: data - data set\r\n\t */\r\n\t _getStackedLimits: function _getStackedLimits(data) {\r\n\t var i, j, maxValue, minValue, value;\r\n\r\n\t if (this._settings.yAxis && typeof this._settings.yAxis.end != \"undefined\" && typeof this._settings.yAxis.start != \"undefined\" && this._settings.yAxis.step) {\r\n\t maxValue = parseFloat(this._settings.yAxis.end);\r\n\t minValue = parseFloat(this._settings.yAxis.start);\r\n\t } else {\r\n\t for (i = 0; i < data.length; i++) {\r\n\t data[i].$sum = 0;\r\n\t data[i].$min = Infinity;\r\n\r\n\t for (j = 0; j < this._series.length; j++) {\r\n\t value = Math.abs(parseFloat(this._series[j].value(data[i]) || 0));\r\n\t if (isNaN(value)) continue;\r\n\t if (this._series[j].type.toLowerCase().indexOf(\"stacked\") != -1) data[i].$sum += value;\r\n\t if (value < data[i].$min) data[i].$min = value;\r\n\t }\r\n\t }\r\n\r\n\t maxValue = -Infinity;\r\n\t minValue = Infinity;\r\n\r\n\t for (i = 0; i < data.length; i++) {\r\n\t if (data[i].$sum > maxValue) maxValue = data[i].$sum;\r\n\t if (data[i].$min < minValue) minValue = data[i].$min;\r\n\t }\r\n\r\n\t if (minValue > 0) minValue = 0;\r\n\t }\r\n\r\n\t return {\r\n\t max: maxValue,\r\n\t min: minValue\r\n\t };\r\n\t },\r\n\r\n\t /*adds colors to the gradient object*/\r\n\t _setBarGradient: function _setBarGradient(ctx, x1, y1, x2, y2, type, rawColor, axis) {\r\n\t var gradient, offset$$1, rgb, hsv, rawColor0, stops;\r\n\r\n\t if (type == \"light\") {\r\n\t if (axis == \"x\") gradient = ctx.createLinearGradient(x1, y1, x2, y1);else gradient = ctx.createLinearGradient(x1, y1, x1, y2);\r\n\t stops = [[0, \"#FFFFFF\"], [0.9, rawColor], [1, rawColor]];\r\n\t offset$$1 = 2;\r\n\t } else if (type == \"falling\" || type == \"rising\") {\r\n\t if (axis == \"x\") gradient = ctx.createLinearGradient(x1, y1, x2, y1);else gradient = ctx.createLinearGradient(x1, y1, x1, y2);\r\n\t rgb = color.toRgb(rawColor);\r\n\t hsv = color.rgbToHsv(rgb[0], rgb[1], rgb[2]);\r\n\t hsv[1] *= 1 / 2;\r\n\t rawColor0 = \"rgb(\" + color.hsvToRgb(hsv[0], hsv[1], hsv[2]) + \")\";\r\n\r\n\t if (type == \"falling\") {\r\n\t stops = [[0, rawColor0], [0.7, rawColor], [1, rawColor]];\r\n\t } else if (type == \"rising\") {\r\n\t stops = [[0, rawColor], [0.3, rawColor], [1, rawColor0]];\r\n\t }\r\n\r\n\t offset$$1 = 0;\r\n\t } else {\r\n\t ctx.globalAlpha = 0.37;\r\n\t offset$$1 = 0;\r\n\t if (axis == \"x\") gradient = ctx.createLinearGradient(x1, y2, x1, y1);else gradient = ctx.createLinearGradient(x1, y1, x2, y1);\r\n\t stops = [[0, \"#9d9d9d\"], [0.3, \"#e8e8e8\"], [0.45, \"#ffffff\"], [0.55, \"#ffffff\"], [0.7, \"#e8e8e8\"], [1, \"#9d9d9d\"]];\r\n\t }\r\n\r\n\t this._gradient(gradient, stops);\r\n\r\n\t return {\r\n\t gradient: gradient,\r\n\t offset: offset$$1\r\n\t };\r\n\t },\r\n\r\n\t /**\r\n\t * returns the x and y position\r\n\t * @param: a - angle\r\n\t * @param: x - start x position\r\n\t * @param: y - start y position\r\n\t * @param: r - destination to the point\r\n\t */\r\n\t _getPositionByAngle: function _getPositionByAngle(a, x, y, r) {\r\n\t a *= -1;\r\n\t x = x + Math.cos(a) * r;\r\n\t y = y - Math.sin(a) * r;\r\n\t return {\r\n\t x: x,\r\n\t y: y\r\n\t };\r\n\t },\r\n\t _gradient: function _gradient(gradient, stops) {\r\n\t for (var i = 0; i < stops.length; i++) {\r\n\t gradient.addColorStop(stops[i][0], stops[i][1]);\r\n\t }\r\n\t },\r\n\t _path: function _path(ctx, points) {\r\n\t var i, method;\r\n\r\n\t for (i = 0; i < points.length; i++) {\r\n\t method = i ? \"lineTo\" : \"moveTo\";\r\n\t if (points[i].length > 2) method = \"arc\";\r\n\t ctx[method].apply(ctx, points[i]);\r\n\t }\r\n\t },\r\n\t _addMapRect: function _addMapRect(map, id, points, bounds, sIndex) {\r\n\t map.addRect(id, [points[0].x - bounds.x, points[0].y - bounds.y, points[1].x - bounds.x, points[1].y - bounds.y], sIndex);\r\n\t }\r\n\t};\r\n\tvar view$1m = exports.protoUI(api$1m, Pie$1, BarChart, LineChart, BarHChart, StackedBarChart, StackedBarHChart, Spline$1, AreaChart, Radar, Scatter, Presets, SplineArea$1, DynamicChart, Group, AutoTooltip, DataLoader, MouseEvents, EventSystem, base.view);\r\n\tvar chart = {\r\n\t api: api$1m,\r\n\t view: view$1m\r\n\t};\r\n\r\n\tvar api$1n = {\r\n\t name: \"rangechart\",\r\n\t $init: function $init() {\r\n\t this.attachEvent(\"onAfterRender\", this._init_frame);\r\n\r\n\t this._set_full_range();\r\n\t },\r\n\t _init_frame: function _init_frame() {\r\n\t assert(this._settings.type.indexOf(\"pie\") === -1 && this._settings.type !== \"radar\" && this._settings.type !== \"donut\", \"Not suppored chart type\");\r\n\r\n\t if (!this._map._areas.length || this._frame) {\r\n\t this._setHandle(true);\r\n\r\n\t return;\r\n\t }\r\n\r\n\t this._setMap();\r\n\r\n\t this._item_radius = (this._map._areas[0].points[2] - this._map._areas[0].points[0]) / 2;\r\n\t this._rHandle = create(\"div\", {\r\n\t \"class\": \"webix_chart_resizer right\",\r\n\t \"tabindex\": \"0\",\r\n\t \"role\": \"button\",\r\n\t \"aria-label\": i18n.aria.resizeChart\r\n\t });\r\n\t this._lHandle = create(\"div\", {\r\n\t \"class\": \"webix_chart_resizer left\",\r\n\t \"tabindex\": \"0\",\r\n\t \"role\": \"button\",\r\n\t \"aria-label\": i18n.aria.resizeChart\r\n\t });\r\n\t this._frame = create(\"div\", {\r\n\t \"class\": \"webix_chart_frame\"\r\n\t });\r\n\r\n\t this._viewobj.appendChild(this._lHandle);\r\n\r\n\t this._viewobj.appendChild(this._frame);\r\n\r\n\t this._viewobj.appendChild(this._rHandle);\r\n\r\n\t this._setHandle();\r\n\r\n\t _event(this._rHandle, env.mouse.down, this._frDown, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(this._lHandle, env.mouse.down, this._frDown, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(this._frame, env.mouse.down, this._frDown, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(toNode(this._rHandle), \"keydown\", this._keyShift, {\r\n\t bind: this\r\n\t });\r\n\r\n\t _event(toNode(this._lHandle), \"keydown\", this._keyShift, {\r\n\t bind: this\r\n\t });\r\n\r\n\t if (this._value) this._settings.range = this._set_full_range(this._value);\r\n\r\n\t this._refresh_range();\r\n\r\n\t this.callEvent(\"onAfterRangeChange\", [this._value]);\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(this._refresh_range, this));\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (chart.api.$setSize.call(this, x, y)) {\r\n\t this._setMap();\r\n\r\n\t this._refresh_range();\r\n\t }\r\n\t },\r\n\t _setHandle: function _setHandle(update) {\r\n\t if (this._rHandle && !this._handle_radius) {\r\n\t this._handle_radius = this._rHandle.clientWidth / 2;\r\n\t if (update) this._refresh_range();\r\n\t }\r\n\t },\r\n\t _setMap: function _setMap() {\r\n\t var bounds = this._getChartBounds(this._content_width, this._content_height);\r\n\r\n\t this._mapStart = bounds.start;\r\n\t this._mapEnd = bounds.end;\r\n\t },\r\n\t removeAllSeries: function removeAllSeries() {\r\n\t this._frame = this._rHandle = this._lHandle = null;\r\n\t chart.api.removeAllSeries.apply(this, arguments);\r\n\t },\r\n\t _keyShift: function _keyShift(e) {\r\n\t var code = e.which || e.keyCode;\r\n\r\n\t if (code === 37 || code === 39) {\r\n\t preventEvent(e);\r\n\t var index$$1 = e.target.className.indexOf(\"right\") !== -1 ? \"eindex\" : \"sindex\";\r\n\t var id = e.target.className.indexOf(\"right\") !== -1 ? \"end\" : \"start\";\r\n\t var range = this._value;\r\n\t range[index$$1] = range[index$$1] + (code === 37 ? -1 : 1);\r\n\r\n\t if (this._map._areas[range[index$$1]]) {\r\n\t range[id] = this._get_id_by_index(range[index$$1]);\r\n\t this.setFrameRange(range);\r\n\t }\r\n\t }\r\n\t },\r\n\t _frDown: function _frDown(e) {\r\n\t if (e.target.className.indexOf(\"webix_chart_resizer\") !== -1) this._activeHandle = e.target;else if (this._map._areas.length) {\r\n\t var spos = this._map._areas[this._value.sindex].points[2] - this._item_radius;\r\n\t var epos = this._map._areas[this._value.eindex].points[2] - this._item_radius;\r\n\t this._activeFrame = {\r\n\t ex: pos(e).x,\r\n\t fx: spos + this._mapStart.x,\r\n\t fw: epos - spos\r\n\t };\r\n\t }\r\n\t addCss(this._viewobj, \"webix_noselect webix_wresize_cursor\");\r\n\r\n\t this._frClear();\r\n\r\n\t this._resizeHandlerMove = event$1(document.body, env.mouse.move, this._frMove, {\r\n\t bind: this\r\n\t });\r\n\t this._resizeHandlerUp = event$1(document.body, env.mouse.up, this._frUp, {\r\n\t bind: this\r\n\t });\r\n\t },\r\n\t _frClear: function _frClear() {\r\n\t if (state._events[this._resizeHandlerMove]) {\r\n\t eventRemove(this._resizeHandlerMove);\r\n\t eventRemove(this._resizeHandlerUp);\r\n\t }\r\n\t },\r\n\t _frMove: function _frMove(e) {\r\n\t if (this._activeHandle) {\r\n\t var pos_x = pos(e).x - offset(this.$view).x;\r\n\r\n\t if (pos_x >= this._mapStart.x && pos_x <= this._mapEnd.x) {\r\n\t if (this._activeHandle.className.indexOf(\"left\") !== -1) {\r\n\t if (pos_x < this._rHandle.offsetLeft) {\r\n\t this._activeHandle.style.left = pos_x - this._handle_radius + \"px\";\r\n\t this._frame.style.left = pos_x + \"px\";\r\n\t this._frame.style.width = this._rHandle.offsetLeft - this._lHandle.offsetLeft - 1 + \"px\";\r\n\t }\r\n\t } else if (pos_x > this._lHandle.offsetLeft + this._handle_radius) {\r\n\t this._activeHandle.style.left = pos_x - this._handle_radius + \"px\";\r\n\t this._frame.style.width = this._rHandle.offsetLeft - this._lHandle.offsetLeft - 1 + \"px\";\r\n\t }\r\n\t }\r\n\t } else if (this._activeFrame) {\r\n\t var shift = pos(e).x - this._activeFrame.ex;\r\n\r\n\t var lx = this._activeFrame.fx + shift;\r\n\t var rx = lx + this._activeFrame.fw;\r\n\r\n\t if (this._mapStart.x <= lx && this._mapEnd.x >= rx) {\r\n\t exports.extend(this._activeFrame, {\r\n\t lx: lx,\r\n\t rx: rx\r\n\t }, true);\r\n\t this._lHandle.style.left = lx - this._handle_radius + \"px\";\r\n\t this._rHandle.style.left = rx - this._handle_radius + \"px\";\r\n\t this._frame.style.left = lx + \"px\";\r\n\t }\r\n\t }\r\n\t },\r\n\t _frUp: function _frUp(e) {\r\n\t this._frClear();\r\n\r\n\t removeCss(this._viewobj, \"webix_noselect\");\r\n\t removeCss(this._viewobj, \"webix_wresize_cursor\");\r\n\t if (!this.count()) return;\r\n\r\n\t if (this._activeHandle) {\r\n\t var pos_x = env.touch ? e.changedTouches[0].pageX : pos(e).x;\r\n\t pos_x -= offset(this.$view).x + this._mapStart.x;\r\n\r\n\t var ind = this._get_index_by_pos(pos_x);\r\n\r\n\t var id = this._get_id_by_index(ind);\r\n\r\n\t if (this._activeHandle === this._lHandle) {\r\n\t if (ind >= this._value.eindex) {\r\n\t ind = this._value.eindex;\r\n\t id = this._get_id_by_index(ind);\r\n\t }\r\n\r\n\t this._value.start = id;\r\n\t this._value.sindex = ind;\r\n\t } else {\r\n\t if (ind <= this._value.sindex) {\r\n\t ind = this._value.sindex;\r\n\t id = this._get_id_by_index(ind);\r\n\t }\r\n\r\n\t this._value.end = id;\r\n\t this._value.eindex = ind;\r\n\t }\r\n\r\n\t this._activeHandle = null;\r\n\t } else if (this._activeFrame && this._activeFrame.lx) {\r\n\t var lind = this._value.sindex = this._get_index_by_pos(this._activeFrame.lx - this._mapStart.x);\r\n\r\n\t var rind = this._value.eindex = this._get_index_by_pos(this._activeFrame.rx - this._mapStart.x);\r\n\r\n\t this._value.start = this._get_id_by_index(lind);\r\n\t this._value.end = this._get_id_by_index(rind);\r\n\t this._activeFrame = null;\r\n\t }\r\n\r\n\t this._refresh_range();\r\n\r\n\t this.callEvent(\"onAfterRangeChange\", [this._value.start, this._value.end]);\r\n\t },\r\n\t _get_id_by_index: function _get_id_by_index(ind) {\r\n\t if (ind >= this.data.order.length) ind = this.data.order.length - 1;\r\n\t return this.getItem(this.data.order[ind])[this._settings.frameId || \"id\"];\r\n\t },\r\n\t _get_index_by_pos: function _get_index_by_pos(pos$$1) {\r\n\t var areas = this._map._areas;\r\n\r\n\t for (var i = 0; i < areas.length; i++) {\r\n\t if (pos$$1 <= areas[i].points[2] - this._item_radius) return i;\r\n\t }\r\n\r\n\t return areas.length - 1;\r\n\t },\r\n\t _get_frame_index: function _get_frame_index(value) {\r\n\t var key = this._settings.frameId || \"id\";\r\n\r\n\t for (var i = 0; i < this.data.order.length; i++) {\r\n\t if (this.getItem(this.data.order[i])[key] == value) return i;\r\n\t }\r\n\r\n\t return -1;\r\n\t },\r\n\t _set_full_range: function _set_full_range(value) {\r\n\t if (!value) value = {\r\n\t start: 0,\r\n\t end: 0,\r\n\t sindex: 0,\r\n\t eindex: 0\r\n\t };else {\r\n\t if (value.start) value.sindex = this._get_frame_index(value.start);\r\n\t if (value.end) value.eindex = this._get_frame_index(value.end);\r\n\t value.start = value.start || this._get_id_by_index(value.sindex);\r\n\t value.end = value.end || this._get_id_by_index(value.eindex);\r\n\t }\r\n\t this._value = value;\r\n\t },\r\n\t range_setter: function range_setter(value) {\r\n\t this._set_full_range(value);\r\n\r\n\t return this._value;\r\n\t },\r\n\t getFrameData: function getFrameData() {\r\n\t var res = [];\r\n\r\n\t for (var i = this._value.sindex; i <= this._value.eindex; i++) {\r\n\t var item = this.getItem(this.data.order[i]);\r\n\t if (item) res.push(item);\r\n\t }\r\n\r\n\t return res;\r\n\t },\r\n\t setFrameRange: function setFrameRange(range) {\r\n\t this._set_full_range(range);\r\n\r\n\t this._refresh_range();\r\n\r\n\t this.callEvent(\"onAfterRangeChange\", [range]);\r\n\t },\r\n\t _refresh_range: function _refresh_range() {\r\n\t if (!this._map) return;\r\n\t var areas = this._map._areas;\r\n\r\n\t if (areas.length) {\r\n\t var sx = areas[this._value.sindex].points[0] + this._mapStart.x + this._item_radius - 1;\r\n\t var ex = areas[this._value.eindex].points[0] + this._mapStart.x + this._item_radius - 1;\r\n\t this._lHandle.style.left = sx - this._handle_radius + \"px\";\r\n\t this._rHandle.style.left = ex - this._handle_radius + \"px\";\r\n\t this._frame.style.left = sx + \"px\";\r\n\t this._frame.style.width = ex - sx + \"px\";\r\n\t this._settings.range = this._value;\r\n\t }\r\n\t },\r\n\t getFrameRange: function getFrameRange() {\r\n\t return this._settings.range;\r\n\t }\r\n\t};\r\n\tvar view$1n = exports.protoUI(api$1n, chart.view);\r\n\r\n\tvar api$1o = {\r\n\t name: \"grouplist\",\r\n\t defaults: {\r\n\t animate: {}\r\n\t },\r\n\t _listClassName: \"webix_grouplist\",\r\n\t $init: function $init() {\r\n\t exports.extend(this.data, TreeStore, true); //needed for getRange\r\n\r\n\t this.data.count = function () {\r\n\t return this.order.length;\r\n\t };\r\n\r\n\t this.data.provideApi(this, true);\r\n\t this.data.attachEvent(\"onClearAll\", bind(this._onClear, this));\r\n\r\n\t this._onClear();\r\n\t },\r\n\t _onClear: function _onClear() {\r\n\t this._nested_cursor = [];\r\n\t this._nested_chain = [];\r\n\t },\r\n\t $setSize: function $setSize() {\r\n\t if (base.api.$setSize.apply(this, arguments)) {\r\n\t //critical for animations in group list\r\n\t this._dataobj.style.width = this._content_width;\r\n\t }\r\n\t },\r\n\t on_click: {\r\n\t webix_list_item: function webix_list_item(e, id) {\r\n\t if (this._in_animation) {\r\n\t return false;\r\n\t }\r\n\r\n\t for (var i = 0; i < this._nested_chain.length; i++) {\r\n\t if (this._nested_chain[i] == id) {\r\n\t //one level up\r\n\t for (var j = i; j < this._nested_chain.length; j++) {\r\n\t this.data.getItem(this._nested_chain[j]).$template = \"\";\r\n\t }\r\n\r\n\t if (!i) {\r\n\t //top level\r\n\t this._nested_cursor = this.data.branch[0];\r\n\t this._nested_chain = [];\r\n\t } else {\r\n\t this._nested_cursor = this.data.branch[this._nested_chain[i - 1]];\r\n\r\n\t this._nested_chain.splice(i);\r\n\t }\r\n\r\n\t this._is_level_down = false;\r\n\t return this.render();\r\n\t }\r\n\t }\r\n\r\n\t var obj = this.getItem(id);\r\n\r\n\t if (obj.$count) {\r\n\t //one level down\r\n\t this._is_level_down = true;\r\n\r\n\t this._nested_chain.push(id);\r\n\r\n\t obj.$template = \"Back\";\r\n\t this._nested_cursor = this.data.branch[obj.id];\r\n\t return this.render();\r\n\t } else {\r\n\t if (this._settings.select) {\r\n\t this._no_animation = true;\r\n\t if (this._settings.select == \"multiselect\" || this._settings.multiselect) this.select(id, false, this._settings.multiselect == \"touch\" || e.ctrlKey || e.metaKey, e.shiftKey); //multiselection\r\n\t else this.select(id);\r\n\t this._no_animation = false;\r\n\t }\r\n\t }\r\n\t }\r\n\t },\r\n\t getOpenState: function getOpenState() {\r\n\t return {\r\n\t parents: this._nested_chain,\r\n\t branch: this._nested_cursor\r\n\t };\r\n\t },\r\n\t render: function render() {\r\n\t var i, lastChain; //start filtering processing=>\r\n\r\n\t this._nested_chain = copy(this._nested_chain);\r\n\t this._nested_cursor = copy(this._nested_cursor);\r\n\r\n\t if (this._nested_chain.length) {\r\n\t for (i = 0; i < this._nested_chain.length; i++) {\r\n\t if (!this.data.branch[this._nested_chain[i]]) {\r\n\t this._nested_chain.splice(i, 1);\r\n\r\n\t i--;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t lastChain = this._nested_chain.length ? this._nested_chain[this._nested_chain.length - 1] : 0;\r\n\t this._nested_cursor = copy(this.data.branch[lastChain]);\r\n\r\n\t if (!this._nested_cursor.length && this._nested_chain.length) {\r\n\t this._nested_cursor = [lastChain];\r\n\r\n\t this._nested_chain.pop();\r\n\t } //<= end filtering processing\r\n\r\n\r\n\t if (this._in_animation) {\r\n\t return delay(this.render, this, arguments, 100);\r\n\t }\r\n\r\n\t for (i = 0; i < this._nested_cursor.length; i++) {\r\n\t this.data.getItem(this._nested_cursor[i]).$template = \"\";\r\n\t }\r\n\r\n\t if (!this._nested_cursor.length) this._nested_cursor = this.data.branch[0];\r\n\t this.data.order = toArray([].concat(this._nested_chain).concat(this._nested_cursor));\r\n\r\n\t if (this.callEvent(\"onBeforeRender\", [this.data])) {\r\n\t if (this._no_animation || !this._dataobj.innerHTML || !(animate.isSupported() && this._settings.animate) || this._prev_nested_chain_length == this._nested_chain.length) {\r\n\t // if dataobj is empty or animation is not supported\r\n\t RenderStack.render.apply(this, arguments);\r\n\t } else {\r\n\t //getRange - returns all elements\r\n\t if (this.callEvent(\"onBeforeRender\", [this.data])) {\r\n\t if (!this._back_scroll_states) this._back_scroll_states = [];\r\n\r\n\t var next_div = this._dataobj.cloneNode(false);\r\n\r\n\t next_div.innerHTML = this.data.getRange().map(this._toHTML, this).join(\"\");\r\n\t var aniset = exports.extend({}, this._settings.animate);\r\n\t aniset.direction = this._is_level_down ? \"left\" : \"right\";\r\n\t /*scroll position restore*/\r\n\r\n\t var animArr = [clone(aniset), clone(aniset)];\r\n\r\n\t if (this._is_level_down) {\r\n\t this._back_scroll_states.push(this.getScrollState());\r\n\r\n\t if (Touch && Touch.$active) {\r\n\t animArr[0].y = 0;\r\n\t animArr[1].y = -this.getScrollState().y;\r\n\t }\r\n\t } else {\r\n\t var getScrollState = this._back_scroll_states.pop();\r\n\r\n\t if (Touch && Touch.$active) {\r\n\t animArr[0].y = -getScrollState.y;\r\n\t animArr[1].y = -this.getScrollState().y;\r\n\t }\r\n\t }\r\n\r\n\t var line = animate.formLine(next_div, this._dataobj, aniset);\r\n\t /*keeping scroll position*/\r\n\r\n\t if (Touch && Touch.$active) Touch._set_matrix(next_div, 0, this._is_level_down ? 0 : animArr[0].y, \"0ms\");\r\n\t aniset.master = this;\r\n\r\n\t aniset.callback = function () {\r\n\t this._dataobj = next_div;\r\n\t /*scroll position restore*/\r\n\r\n\t if (!this._is_level_down) {\r\n\t if (Touch && Touch.$active) {\r\n\t delay(function () {\r\n\t Touch._set_matrix(next_div, 0, animArr[0].y, \"0ms\");\r\n\t }, this);\r\n\t } else if (getScrollState) this.scrollTo(0, getScrollState.y);\r\n\t } else if (!(Touch && Touch.$active)) {\r\n\t this.scrollTo(0, 0);\r\n\t }\r\n\r\n\t animate.breakLine(line);\r\n\t aniset.master = aniset.callback = null;\r\n\t this._htmlmap = null; //clear map, it will be filled at first getItemNode\r\n\r\n\t this._in_animation = false;\r\n\t this.callEvent(\"onAfterRender\", []);\r\n\t };\r\n\r\n\t this._in_animation = true;\r\n\t animate(line, animArr);\r\n\t }\r\n\t }\r\n\r\n\t this._prev_nested_chain_length = this._nested_chain.length;\r\n\t }\r\n\t },\r\n\t templateBack_setter: function templateBack_setter(config) {\r\n\t this.type.templateBack = template(config);\r\n\t },\r\n\t templateItem_setter: function templateItem_setter(config) {\r\n\t this.type.templateItem = template(config);\r\n\t },\r\n\t templateGroup_setter: function templateGroup_setter(config) {\r\n\t this.type.templateGroup = template(config);\r\n\t },\r\n\t type: {\r\n\t template: function template$$1(obj, common) {\r\n\t if (obj.$count) return common.templateGroup(obj, common);\r\n\t return common.templateItem(obj, common);\r\n\t },\r\n\t css: \"group\",\r\n\t classname: function classname(obj, common, marks) {\r\n\t return \"webix_list_item webix_\" + (obj.$count ? \"group\" : \"item\") + (obj.$template ? \"_back\" : \"\") + (marks && marks.webix_selected ? \" webix_selected \" : \"\") + (obj.$css ? obj.$css : \"\");\r\n\t },\r\n\t templateStart: template(\"
    \"),\r\n\t templateBack: template(\"#value#\"),\r\n\t templateItem: template(\"#value#\"),\r\n\t templateGroup: template(\"#value#\"),\r\n\t templateEnd: function templateEnd(obj) {\r\n\t var html = \"\";\r\n\t if (obj.$count) html += \"
    \";\r\n\t html += \"
    \";\r\n\t return html;\r\n\t }\r\n\t },\r\n\t showItem: function showItem(id) {\r\n\t var obj, parent;\r\n\r\n\t if (id) {\r\n\t obj = this.getItem(id);\r\n\t parent = obj.$parent;\r\n\t if (obj.$count) parent = obj.id;\r\n\t }\r\n\r\n\t this._nested_cursor = this.data.branch[parent || 0];\r\n\t this._nested_chain = []; //build _nested_chain\r\n\r\n\t while (parent) {\r\n\t this.getItem(parent).$template = \"Back\";\r\n\r\n\t this._nested_chain.unshift(parent);\r\n\r\n\t parent = this.getItem(parent).$parent;\r\n\t } //render\r\n\r\n\r\n\t this._no_animation = true;\r\n\t this.render();\r\n\t this._no_animation = false; //scroll if necessary\r\n\r\n\t RenderStack.showItem.call(this, id);\r\n\t }\r\n\t};\r\n\tvar view$1o = exports.protoUI(api$1o, Group, list.view);\r\n\r\n\ttype(view$1o, {});\r\n\r\n\tvar api$1p = {\r\n\t name: \"unitlist\",\r\n\t _id: \"webix_item_id\",\r\n\t uniteBy_setter: template,\r\n\t render: function render(id, data, type) {\r\n\t var config = this._settings;\r\n\t if (!this.isVisible(config.id)) return;\r\n\t if (!config.uniteBy) return;\r\n\r\n\t if (id) {\r\n\t var cont = this.getItemNode(id); //get html element of updated item\r\n\r\n\t if (cont && type == \"update\" && this._settings.uniteBy.call(this, data) == this.getItem(id).$unitValue) {\r\n\t var t = this._htmlmap[id] = this._toHTMLObject(data);\r\n\r\n\t insertBefore(t, cont);\r\n\t remove(cont);\r\n\t return;\r\n\t }\r\n\t } //full reset\r\n\r\n\r\n\t if (this.callEvent(\"onBeforeRender\", [this.data])) {\r\n\t this.units = null;\r\n\r\n\t this._setUnits();\r\n\r\n\t if (this.units) {\r\n\t this._dataobj.innerHTML = this._getUnitRange().map(this._toHTML, this).join(\"\");\r\n\t this._htmlmap = null;\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterRender\", []);\r\n\t }\r\n\t },\r\n\t getUnits: function getUnits() {\r\n\t var result = [];\r\n\r\n\t if (this.units) {\r\n\t for (var b in this.units) {\r\n\t result.push(b);\r\n\t }\r\n\t }\r\n\r\n\t return result;\r\n\t },\r\n\t getUnitList: function getUnitList(id) {\r\n\t return this.units ? this.units[id] : null;\r\n\t },\r\n\t _toHTML: function _toHTML(obj) {\r\n\t //check if related template exist\r\n\t var mark = this.data._marks[obj.id];\r\n\t assert(!obj.$template || this.type[\"template\" + obj.$template], \"RenderStack :: Unknown template: \" + obj.$template);\r\n\t this.callEvent(\"onItemRender\", [obj]);\r\n\r\n\t if (obj.$unit) {\r\n\t return this.type.templateStartHeader(obj, this.type) + this.type.templateHeader.call(this, obj.$unit) + this.type.templateEnd(obj, this.type);\r\n\t }\r\n\r\n\t return this.type.templateStart(obj, this.type, mark) + (obj.$template ? this.type[\"template\" + obj.$template] : this.type.template)(obj, this.type) + this.type.templateEnd(obj, this.type);\r\n\t },\r\n\t _getUnitRange: function _getUnitRange() {\r\n\t var data, i, u, unit;\r\n\t data = [];\r\n\t var min = this.data.$min || 0;\r\n\t var max = this.data.$max || Infinity;\r\n\t var count = 0;\r\n\r\n\t for (u in this.units) {\r\n\t data.push({\r\n\t $unit: u\r\n\t });\r\n\t unit = this.units[u];\r\n\r\n\t for (i = 0; i < unit.length; i++) {\r\n\t if (count == min) data = [{\r\n\t $unit: u\r\n\t }];\r\n\t data.push(this.getItem(unit[i]));\r\n\t if (count == max) return toArray(data);\r\n\t count++;\r\n\t }\r\n\t }\r\n\r\n\t return toArray(data);\r\n\t },\r\n\t _setUnits: function _setUnits() {\r\n\t var list$$1 = this;\r\n\t this.units = {};\r\n\t this.data.each(function (obj) {\r\n\t var result = list$$1._settings.uniteBy.call(this, obj);\r\n\r\n\t obj.$unitValue = result;\r\n\t if (!list$$1.units[result]) list$$1.units[result] = [];\r\n\t list$$1.units[result].push(obj.id);\r\n\t });\r\n\t },\r\n\t type: {\r\n\t headerHeight: 20,\r\n\t templateHeader: function templateHeader(value) {\r\n\t return \"\" + value + \"\";\r\n\t },\r\n\t templateStart: function templateStart(obj, type, marks) {\r\n\t if (obj.$unit) return type.templateStartHeader.apply(this, arguments);\r\n\t var className = \"webix_list_item webix_list_\" + type.css + \"_item\" + (marks && marks.webix_selected ? \" webix_selected\" : \"\") + (obj.$css ? obj.$css : \"\");\r\n\t var style = \"width:\" + type.widthSize(obj, type, marks) + \"; height:\" + type.heightSize(obj, type, marks) + \"; overflow:hidden;\" + (type.layout && type.layout == \"x\" ? \"float:left;\" : \"\");\r\n\t return \"
    \";\r\n\t },\r\n\t templateStartHeader: function templateStartHeader(obj, type, marks) {\r\n\t var className = \"webix_unit_header webix_unit_\" + type.css + \"_header\" + (obj.$selected ? \"_selected\" : \"\");\r\n\t var style = \"width:\" + type.widthSize(obj, type, marks) + \"; height:\" + type.headerHeight + \"px; overflow:hidden;\";\r\n\t return \"
    \";\r\n\t }\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.type.headerHeight = $active.unitHeaderHeight;\r\n\t }\r\n\t};\r\n\tvar view$1p = exports.protoUI(api$1p, list.view);\r\n\r\n\ti18n.dbllist = {\r\n\t selectAll: \"\",\r\n\t selectOne: \"\",\r\n\t deselectAll: \"\",\r\n\t deselectOne: \"\"\r\n\t};\r\n\tvar api$1q = {\r\n\t name: \"dbllist\",\r\n\t defaults: {\r\n\t borderless: true\r\n\t },\r\n\t $init: function $init() {\r\n\t this._moved = {};\r\n\t this._inRight = bind(function (obj) {\r\n\t return this._moved[obj.id];\r\n\t }, this);\r\n\t this._inLeft = bind(function (obj) {\r\n\t return !this._moved[obj.id];\r\n\t }, this);\r\n\t this.$view.className += \" webix_dbllist\";\r\n\t this.$ready.unshift(this._setLayout);\r\n\t },\r\n\t $onLoad: function $onLoad(data, driver) {\r\n\t this._updateAndResize(function () {\r\n\t this.$$(\"left\").data.driver = driver;\r\n\t this.$$(\"left\").parse(data);\r\n\t this.$$(\"right\").data.driver = driver;\r\n\t this.$$(\"right\").parse(data);\r\n\t });\r\n\r\n\t this._refresh();\r\n\r\n\t return true;\r\n\t },\r\n\t _getButtons: function _getButtons() {\r\n\t if (this._settings.buttons === false) return {\r\n\t width: 10\r\n\t };\r\n\t var locale = i18n.dbllist;\r\n\t var buttons = [this._getButton(\"deselect_all\", locale.deselectAll), this._getButton(\"select_all\", locale.selectAll), this._getButton(\"deselect_one\", locale.deselectOne), this._getButton(\"select_one\", locale.selectOne)];\r\n\t buttons = {\r\n\t width: 120,\r\n\t template: buttons.join(\"\"),\r\n\t onClick: {\r\n\t dbllist_button: function dbllist_button(e, id, trg) {\r\n\t this.getTopParentView()._update_list(trg.getAttribute(\"action\"));\r\n\t }\r\n\t }\r\n\t };\r\n\t if (this._settings.buttons) buttons.template = this._settings.buttons;\r\n\t return buttons;\r\n\t },\r\n\t _getButton: function _getButton(action, label) {\r\n\t return \"\";\r\n\t },\r\n\t _getList: function _getList(id, action, label, bottom) {\r\n\t var list = {\r\n\t view: \"list\",\r\n\t select: \"multiselect\",\r\n\t multiselect: \"touch\",\r\n\t id: id,\r\n\t action: action,\r\n\t drag: true,\r\n\t type: {\r\n\t margin: 3,\r\n\t id: id\r\n\t },\r\n\t on: {\r\n\t onBeforeDrop: function onBeforeDrop(context) {\r\n\t var source = context.from;\r\n\t var target = context.to;\r\n\t var top = source.getTopParentView();\r\n\r\n\t if (top === this.getTopParentView()) {\r\n\t var mode = target._settings.action != \"select_one\";\r\n\t top.select(context.source, mode);\r\n\t }\r\n\r\n\t return false;\r\n\t },\r\n\t onItemDblClick: function onItemDblClick() {\r\n\t return this.getTopParentView()._update_list(this.config.action);\r\n\t }\r\n\t }\r\n\t };\r\n\t if (this._settings.list) exports.extend(list, this._settings.list, true);\r\n\t if (label) list = {\r\n\t rows: [{\r\n\t view: \"label\",\r\n\t label: label,\r\n\t css: \"webix_inp_top_label\"\r\n\t }, list]\r\n\t };\r\n\t if (bottom) return {\r\n\t rows: [list, {\r\n\t view: \"label\",\r\n\t height: 20,\r\n\t label: bottom,\r\n\t css: \"bottom_label\"\r\n\t }]\r\n\t };\r\n\t return list;\r\n\t },\r\n\t _setLayout: function _setLayout() {\r\n\t var cols = [{\r\n\t margin: 10,\r\n\t type: \"clean\",\r\n\t cols: [this._getList(\"left\", \"select_one\", this._settings.labelLeft, this._settings.labelBottomLeft), this._getButtons(), this._getList(\"right\", \"deselect_one\", this._settings.labelRight, this._settings.labelBottomRight)]\r\n\t }];\r\n\t this.cols_setter(cols);\r\n\t },\r\n\t _update_list: function _update_list(action) {\r\n\t var top = this;\r\n\t var id = null;\r\n\t var mode = false;\r\n\r\n\t if (action === \"select_all\") {\r\n\t id = top.$$(\"left\").data.order;\r\n\t mode = true;\r\n\t } else if (action === \"select_one\") {\r\n\t id = top.$$(\"left\").getSelectedId(true);\r\n\t mode = true;\r\n\t } else if (action === \"deselect_all\") {\r\n\t id = top.$$(\"right\").data.order;\r\n\t mode = false;\r\n\t } else if (action === \"deselect_one\") {\r\n\t id = top.$$(\"right\").getSelectedId(true);\r\n\t mode = false;\r\n\t }\r\n\r\n\t top.select(id, mode);\r\n\t },\r\n\t select: function select(id, mode) {\r\n\t var i;\r\n\t if (_typeof(id) !== \"object\") id = [id];\r\n\r\n\t if (mode) {\r\n\t for (i = 0; i < id.length; i++) {\r\n\t this._moved[id[i]] = true;\r\n\t }\r\n\t } else {\r\n\t for (i = 0; i < id.length; i++) {\r\n\t delete this._moved[id[i]];\r\n\t }\r\n\t }\r\n\r\n\t this._refresh();\r\n\r\n\t this.callEvent(\"onChange\", []);\r\n\t },\r\n\t _updateAndResize: function _updateAndResize(handler, size) {\r\n\t freeze(bind(handler, this), false);\r\n\t if (size && (this.$$(\"left\")._settings.autoheight || this.$$(\"right\")._settings.autoheight)) this.resize();\r\n\t },\r\n\t _refresh: function _refresh() {\r\n\t var left = this.$$(\"left\");\r\n\t var right = this.$$(\"right\");\r\n\t if (left) this._updateAndResize(function () {\r\n\t left.filter(this._inLeft);\r\n\t right.filter(this._inRight);\r\n\t }, true);\r\n\t },\r\n\t focus: function focus() {\r\n\t UIManager.setFocus(this);\r\n\t },\r\n\t value_setter: function value_setter(val) {\r\n\t this.setValue(val);\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this._moved = {};\r\n\t if (_typeof(value) !== \"object\") value = value.toString().split(\",\");\r\n\r\n\t for (var i = 0; i < value.length; i++) {\r\n\t this._moved[value[i]] = true;\r\n\t }\r\n\r\n\t this._refresh();\r\n\t },\r\n\t getValue: function getValue() {\r\n\t var value = [];\r\n\r\n\t for (var key in this._moved) {\r\n\t value.push(key);\r\n\t }\r\n\r\n\t return value.join(\",\");\r\n\t }\r\n\t};\r\n\tvar view$1q = exports.protoUI(api$1q, AtomDataLoader, IdSpace, layout.view);\r\n\r\n\tvar api$1r = {\r\n\t name: \"tree\",\r\n\t defaults: {\r\n\t scroll: \"a\",\r\n\t navigation: true\r\n\t },\r\n\t $init: function $init() {\r\n\t this._viewobj.className += \" webix_tree\"; //map API of DataStore on self\r\n\r\n\t exports.extend(this.data, TreeStore, true);\r\n\t exports.extend(this.on_click, TreeClick);\r\n\t this.attachEvent(\"onAfterRender\", this._refresh_scroll);\r\n\t this.attachEvent(\"onPartialRender\", this._refresh_scroll);\r\n\t this.data.provideApi(this, true);\r\n\r\n\t this._viewobj.setAttribute(\"role\", \"tree\");\r\n\t },\r\n\t //attribute , which will be used for ID storing\r\n\t _id: \"webix_tm_id\",\r\n\t //supports custom context menu\r\n\t on_context: {},\r\n\t on_dblclick: {\r\n\t webix_tree_checkbox: function webix_tree_checkbox() {\r\n\t if (this.on_click.webix_tree_checkbox) return this.on_click.webix_tree_checkbox.apply(this, arguments);\r\n\t }\r\n\t },\r\n\t $fixEditor: function $fixEditor(editor) {\r\n\t var item = this.getItemNode(editor.id).querySelector(\"span\");\r\n\r\n\t if (item) {\r\n\t if (item.innerHTML === \"\") item.innerHTML = \" \";\r\n\t var padding = 10;\r\n\t var pos$$1 = item.offsetLeft;\r\n\t editor.node.style.width = this.$view.scrollWidth - pos$$1 - padding + \"px\";\r\n\t editor.node.style.marginLeft = pos$$1 + \"px\";\r\n\t editor.node.style.left = \"0px\";\r\n\t }\r\n\t },\r\n\t //css class to action map, for onclick event\r\n\t on_click: {\r\n\t webix_tree_item: function webix_tree_item(e, id) {\r\n\t if (this._settings.activeTitle) {\r\n\t var item = this.getItem(id);\r\n\t if (item.open) this.close(id);else this.open(id);\r\n\t }\r\n\r\n\t if (this._settings.select) {\r\n\t if (this._settings.select == \"multiselect\" || this._settings.multiselect) {\r\n\t var multimode = e.ctrlKey || e.metaKey || this._settings.multiselect == \"touch\";\r\n\r\n\t if (this._settings.multiselect == \"level\" && (multimode || e.shiftKey)) {\r\n\t //allow only selection on the same level\r\n\t var select = this.getSelectedId(true)[0];\r\n\t if (select && this.getParentId(id) != this.getParentId(select)) return;\r\n\t }\r\n\r\n\t this.select(id, false, multimode, e.shiftKey); //multiselection\r\n\t } else this.select(id);\r\n\t }\r\n\t }\r\n\t },\r\n\t _paste: {\r\n\t // insert new item with pasted value\r\n\t insert: function insert(text) {\r\n\t var parent = this.getSelectedId() || \"0\";\r\n\t this.add({\r\n\t value: text\r\n\t }, null, parent);\r\n\t },\r\n\t // change value of each selected item\r\n\t modify: function modify(text) {\r\n\t var sel = this.getSelectedId(true);\r\n\r\n\t for (var i = 0; i < sel.length; i++) {\r\n\t this.getItem(sel[i]).value = text;\r\n\t this.refresh(sel[i]);\r\n\t }\r\n\t },\r\n\t // do nothing\r\n\t custom: function custom() {}\r\n\t },\r\n\t _drag_order_complex: true,\r\n\t $dragHTML: function $dragHTML(obj) {\r\n\t return \"
    \" + this.type.template(obj, this.type) + \"
    \";\r\n\t },\r\n\t //css class to action map, for dblclick event\r\n\t type: exports.extend({\r\n\t //normal state of item\r\n\t template: function template$$1(obj, common) {\r\n\t var template$$1 = common[\"template\" + obj.level] || common.templateCommon;\r\n\t return template$$1.apply(this, arguments);\r\n\t },\r\n\t classname: function classname(obj, common, marks) {\r\n\t var css = \"webix_tree_item\";\r\n\r\n\t if (obj.$css) {\r\n\t if (_typeof(obj.$css) == \"object\") obj.$css = createCss(obj.$css);\r\n\t css += \" \" + obj.$css;\r\n\t }\r\n\r\n\t if (marks && marks.$css) css += \" \" + marks.$css;\r\n\t return css;\r\n\t },\r\n\t aria: function aria(obj, common, marks) {\r\n\t return \"role=\\\"treeitem\\\"\" + (marks && marks.webix_selected ? \" aria-selected=\\\"true\\\" tabindex=\\\"0\\\"\" : \" tabindex=\\\"-1\\\"\") + (obj.$count ? \"aria-expanded=\\\"\" + (obj.open ? \"true\" : \"false\") + \"\\\"\" : \"\") + \"aria-level=\\\"\" + obj.$level + \"\\\"\";\r\n\t },\r\n\t templateCommon: template(\"{common.icon()} {common.folder()} #value#\"),\r\n\t templateStart: template(\"
    \"),\r\n\t templateEnd: template(\"
    \"),\r\n\t templateCopy: template(\"#value#\")\r\n\t }, TreeType)\r\n\t};\r\n\tvar view$1r = exports.protoUI(api$1r, TreeStateCheckbox, AutoTooltip, Group, TreeAPI, DragItem, TreeDataMove, SelectionModel, KeysNavigation, MouseEvents, Scrollable, TreeDataLoader, proto.view, TreeRenderStack, CopyPaste, EventSystem);\r\n\tvar tree = {\r\n\t api: api$1r,\r\n\t view: view$1r\r\n\t};\r\n\ttype(view$1r, {\r\n\t name: \"lineTree\",\r\n\t css: \"webixLineTree\",\r\n\t icon: function icon(obj, common) {\r\n\t var html = \"\";\r\n\t var open = \"\";\r\n\r\n\t for (var i = 1; i <= obj.$level; i++) {\r\n\t if (i == obj.$level) open = obj.$count ? obj.open ? \"webix_tree_open \" : \"webix_tree_close \" : \"webix_tree_none \";\r\n\r\n\t var icon = common._icon_src(obj, common, i);\r\n\r\n\t if (icon) html += \"
    \";\r\n\t }\r\n\r\n\t return html;\r\n\t },\r\n\t _icon_src: function _icon_src(obj, common, level) {\r\n\t var lines = common._tree_branch_render_state;\r\n\t var tree = TreeRenderStack._obj;\r\n\r\n\t if (lines === 0 && tree) {\r\n\t //we are in standalone rendering \r\n\t //need to reconstruct rendering state\r\n\t var lines_level = obj.$level;\r\n\t var branch_id = obj.id;\r\n\t lines = [];\r\n\r\n\t while (lines_level) {\r\n\t var parent_id = tree.getParentId(branch_id);\r\n\t var pbranch = tree.data.branch[parent_id];\r\n\t if (pbranch[pbranch.length - 1] == branch_id) lines[lines_level] = true;\r\n\t branch_id = parent_id;\r\n\t lines_level--;\r\n\t } //store for next round\r\n\r\n\r\n\t common._tree_branch_render_state = lines;\r\n\t }\r\n\r\n\t if (!lines) return 0; //need to be replaced with image urls\r\n\r\n\t if (level == obj.$level) {\r\n\t var mode = 3; //3-way line\r\n\r\n\t if (!obj.$parent) {\r\n\t //top level\r\n\t if (obj.$index === 0) mode = 4; //firts top item\r\n\t }\r\n\r\n\t if (lines[obj.$level]) mode = 2;\r\n\r\n\t if (obj.$count) {\r\n\t if (obj.open) return \"minus\" + mode;else return \"plus\" + mode;\r\n\t } else return \"line\" + mode;\r\n\t } else {\r\n\t if (!lines[level]) return \"line1\";\r\n\t return \"blank\";\r\n\t }\r\n\t }\r\n\t});\r\n\r\n\tvar api$1s = {\r\n\t name: \"treemap\",\r\n\t defaults: {\r\n\t activeItem: false,\r\n\t subRender: true,\r\n\t header: true,\r\n\t headerHeight: 35,\r\n\t value: template(\"#value#\"),\r\n\t headerTemplate: \"\",\r\n\t navigation: true\r\n\t },\r\n\t value_setter: template,\r\n\t headerTemplate_setter: template,\r\n\t header_setter: function header_setter(value) {\r\n\t if (value && value !== true) {\r\n\t this.type.header = value;\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t $init: function $init() {\r\n\t this.$view.className += \" webix_treemap\";\r\n\r\n\t this._viewobj.setAttribute(\"role\", \"tree\");\r\n\r\n\t this._htmlElement = document.createElement(\"DIV\");\r\n\t exports.extend(this.data, TreeStore, true);\r\n\t this.data.provideApi(this, true);\r\n\t this.data.attachEvent(\"onClearAll\", bind(function () {\r\n\t this._html = \"\";\r\n\t this.$values = {};\r\n\t this.$xy = {};\r\n\t }, this));\r\n\t this.attachEvent(\"onKeyPress\", this._onKeyPress);\r\n\t },\r\n\t _toHTMLItem: function _toHTMLItem(obj) {\r\n\t var mark = this.data._marks[obj.id];\r\n\t this.callEvent(\"onItemRender\", [obj]);\r\n\t var template$$1 = obj.$template ? this.type[\"template\" + obj.$template].call(this, obj, this.type, mark) : this.type.template.call(this, obj, this.type, mark);\r\n\t return this.type.templateStart.call(this, obj, this.type, mark) + template$$1 + this.type.templateEnd.call(this);\r\n\t },\r\n\t _renderHeader: function _renderHeader(id) {\r\n\t var item = this.getItem(id);\r\n\t var height = this._settings.headerHeight;\r\n\t var html = \"
    \";\r\n\t html += this.type.header.call(this, item, this.type);\r\n\t html += \"
    \";\r\n\t return html;\r\n\t },\r\n\t _renderBranch: function _renderBranch(pId) {\r\n\t var sizes,\r\n\t row,\r\n\t value,\r\n\t sum,\r\n\t leaves = [];\r\n\r\n\t if (!this.$width || !this.count()) {\r\n\t this._html = \"\";\r\n\t return false;\r\n\t }\r\n\r\n\t if (!pId) {\r\n\t pId = this.config.branch || 0;\r\n\t this._html = \"\";\r\n\t this.$values = {};\r\n\t this.$xy = {};\r\n\t this.$xy[pId] = {\r\n\t width: this.$width,\r\n\t height: this.$height,\r\n\t top: 0,\r\n\t left: 0\r\n\t }; // header\r\n\r\n\t if (pId && this._settings.header) {\r\n\t this.$xy[pId].height -= this._settings.headerHeight;\r\n\t this.$xy[pId].top = this._settings.headerHeight;\r\n\t this._html += this._renderHeader(pId);\r\n\t } // values calculation\r\n\r\n\r\n\t sum = 0;\r\n\t this.data.each(function (item) {\r\n\t var parentId = this.getParentId(item.id);\r\n\r\n\t if (!this.data.branch[item.id]) {\r\n\t value = this.config.value.call(this, item) * 1;\r\n\r\n\t if (!isNaN(value) && value) {\r\n\t this.$values[item.id] = value;\r\n\t sum += value;\r\n\r\n\t while (parentId) {\r\n\t if (!this.$values[parentId]) this.$values[parentId] = 0;\r\n\t this.$values[parentId] += value;\r\n\t parentId = this.getParentId(parentId);\r\n\t }\r\n\t }\r\n\t }\r\n\t }, this, false, pId);\r\n\t }\r\n\r\n\t this.data.eachChild(pId, function (item) {\r\n\t if (this.$values[item.id]) leaves.push(copy(item));\r\n\t }, this);\r\n\t sum = sum || this.$values[pId];\r\n\r\n\t if (leaves.length && sum) {\r\n\t sizes = this.$xy[pId];\r\n\t row = {\r\n\t top: sizes.top,\r\n\t left: sizes.left,\r\n\t dx: sizes.width,\r\n\t dy: sizes.height,\r\n\t set: [],\r\n\t sum: 0\r\n\t };\r\n\t row.dim = Math.min(row.dx, row.dy);\r\n\t var delta = row.dx * row.dy / sum; //total area\r\n\r\n\t for (var _i = 0; _i < leaves.length; _i++) {\r\n\t leaves[_i].$value = this.$values[leaves[_i].id] * delta;\r\n\t } //normalized value\r\n\r\n\r\n\t leaves.sort(function (a, b) {\r\n\t return a.$value > b.$value ? -1 : 1;\r\n\t });\r\n\t var bad = Infinity;\r\n\t var i = 0;\r\n\r\n\t while (leaves[i]) {\r\n\t var check = this._worst(row, leaves[i]);\r\n\r\n\t if (check < bad) {\r\n\t row.sum += leaves[i].$value;\r\n\t row.set.push(leaves[i]);\r\n\t bad = check;\r\n\t i++;\r\n\t } else {\r\n\t this._renderRow(row);\r\n\r\n\t var r = {\r\n\t top: row.top,\r\n\t left: row.left,\r\n\t dx: row.dx,\r\n\t dy: row.dy,\r\n\t set: [],\r\n\t sum: 0\r\n\t };\r\n\r\n\t var _delta = row.sum / row.dim;\r\n\r\n\t if (row.dx > row.dy) {\r\n\t r.left += _delta;\r\n\t r.dx -= _delta;\r\n\t } else {\r\n\t r.top += _delta;\r\n\t r.dy -= _delta;\r\n\t }\r\n\r\n\t row = r;\r\n\t row.dim = Math.min(row.dx, row.dy);\r\n\t bad = Infinity;\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (row) this._renderRow(row);\r\n\t },\r\n\t _renderRow: function _renderRow(row) {\r\n\t var i,\r\n\t id,\r\n\t x,\r\n\t y,\r\n\t top = row.top,\r\n\t left = row.left;\r\n\t row.mode = row.dy < row.dx;\r\n\t row.contra = row.sum / row.dim;\r\n\r\n\t for (i = 0; i < row.set.length; i++) {\r\n\t id = row.set[i].id;\r\n\r\n\t if (row.mode) {\r\n\t x = row.contra;\r\n\t y = row.set[i].$value / row.contra;\r\n\t } else {\r\n\t x = row.set[i].$value / row.contra;\r\n\t y = row.contra;\r\n\t }\r\n\r\n\t this.$xy[id] = {};\r\n\t this.$xy[id].top = top;\r\n\t this.$xy[id].left = left;\r\n\t if (row.mode) top += y;else left += x;\r\n\t this.$xy[id].width = x;\r\n\t this.$xy[id].height = y;\r\n\t this._html += this._toHTMLItem(this.getItem(id));\r\n\t if (this._settings.subRender && this.data.branch[id]) this._renderBranch(id);\r\n\t }\r\n\t },\r\n\t _worst: function _worst(row, add) {\r\n\t var s = row.sum + add.$value;\r\n\t var a = s * s / (row.dim * row.dim * add.$value);\r\n\r\n\t if (row.set.length) {\r\n\t a = Math.max(row.dim * row.dim * row.set[0].$value / (s * s), a);\r\n\t }\r\n\r\n\t return a > 1 ? a : 1 / a;\r\n\t },\r\n\t _toHTMLObject: function _toHTMLObject(obj) {\r\n\t this._htmlElement.innerHTML = this._toHTMLItem(obj);\r\n\t return this._htmlElement.firstChild;\r\n\t },\r\n\t showBranch: function showBranch(id) {\r\n\t this._settings.branch = id;\r\n\t this.refresh();\r\n\t },\r\n\t render: function render(id, data, type) {\r\n\t if (!this.isVisible(this._settings.id) || this.$blockRender) return;\r\n\r\n\t if (type == \"update\") {\r\n\t var cont = this.getItemNode(id); //get html element of updated item\r\n\r\n\t if (cont) {\r\n\t var t = this._htmlmap[id] = this._toHTMLObject(data);\r\n\r\n\t insertBefore(t, cont);\r\n\t remove(cont);\r\n\t }\r\n\t } else if (this.data.branch && (!this._settings.branch || this.data.branch[this._settings.branch])) {\r\n\t this._htmlmap = null;\r\n\t this.callEvent(\"onBeforeRender\", []);\r\n\r\n\t this._renderBranch();\r\n\r\n\t this._dataobj.innerHTML = this._html;\r\n\t this.callEvent(\"onAfterRender\", []);\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t _id: \"webix_dm_id\",\r\n\t on_click: {\r\n\t webix_treemap_item: function webix_treemap_item(e, id) {\r\n\t if (this._settings.select) {\r\n\t if (this._settings.select == \"multiselect\" || this._settings.multiselect) this.select(id, false, e.ctrlKey || e.metaKey || this._settings.multiselect == \"touch\", e.shiftKey);else this.select(id);\r\n\t }\r\n\r\n\t if (this._settings.activeItem && this.isBranch(id)) {\r\n\t this.showBranch(id);\r\n\t }\r\n\t },\r\n\t webix_treemap_header_item: function webix_treemap_header_item(e) {\r\n\t var id = locate(e, \"webix_dm_header_id\");\r\n\t this.define(\"branch\", id);\r\n\t this.refresh();\r\n\t },\r\n\t webix_treemap_reset: function webix_treemap_reset() {\r\n\t this.define(\"branch\", 0);\r\n\t this.refresh();\r\n\t }\r\n\t },\r\n\t on_dblclick: {},\r\n\t on_mouse_move: {},\r\n\t _getCssText: function _getCssText(style) {\r\n\t var css = \"\";\r\n\r\n\t for (var property in style) {\r\n\t css += property + \":\" + style[property] + \";\";\r\n\t }\r\n\r\n\t return css;\r\n\t },\r\n\t type: {\r\n\t //normal state of item\r\n\t template: template(\"#value#\"),\r\n\t header: function header(obj, common) {\r\n\t var id = obj.id;\r\n\t var resetIcon = \"
    \";\r\n\t var arr = [];\r\n\r\n\t while (id) {\r\n\t obj = this.getItem(id);\r\n\t arr.push(common.headerItem.call(this, obj, common));\r\n\t id = this.getParentId(id);\r\n\t }\r\n\r\n\t arr.reverse();\r\n\t return resetIcon + arr.join(\"\");\r\n\t },\r\n\t headerItem: function headerItem(obj) {\r\n\t var template$$1 = this.config.headerTemplate(obj);\r\n\t var html = \"\";\r\n\t html += template$$1;\r\n\t html += \"\";\r\n\t return html;\r\n\t },\r\n\t classname: function classname(obj, common, marks) {\r\n\t var css = \"webix_treemap_item\";\r\n\t if (common.css) css += common.css + \" \";\r\n\r\n\t if (obj.$css) {\r\n\t if (_typeof(obj.$css) == \"object\") obj.$css = createCss(obj.$css);\r\n\t css += \" \" + obj.$css;\r\n\t }\r\n\r\n\t var xy = this.$xy[obj.id];\r\n\t if (marks && marks.$css) css += \" \" + marks.$css;\r\n\t css += \" webix_treemap_level_\" + this.getItem(obj.id).$level;\r\n\t var parentId = this.getParentId(obj.id);\r\n\t if (!parentId || parentId == this._settings.branch) css += \" webix_treemap_level_top\";\r\n\t if (this.$height - xy.top - xy.height < 1) css += \" webix_treemap_item_bottom\";\r\n\t if (this.$width - xy.left - xy.width < 1) css += \" webix_treemap_item_right\";\r\n\r\n\t if (common.cssClass) {\r\n\t var cssClass = common.cssClass.call(this, obj, common, marks);\r\n\r\n\t if (cssClass) {\r\n\t if (_typeof(cssClass) == \"object\") {\r\n\t css += \" \" + createCss(cssClass);\r\n\t } else css += \" \" + cssClass;\r\n\t }\r\n\t }\r\n\r\n\t return css;\r\n\t },\r\n\t templateStart: function templateStart(obj, type, marks) {\r\n\t var style = \"\";\r\n\r\n\t if (this.$xy) {\r\n\t var xy = this.$xy[obj.id];\r\n\t style += \"width: \" + xy.width + \"px; height: \" + xy.height + \"px;\";\r\n\t style += \"top: \" + xy.top + \"px; left: \" + xy.left + \"px;\";\r\n\t }\r\n\r\n\t return \"
    \";\r\n\t },\r\n\t templateEnd: template(\"
    \")\r\n\t }\r\n\t};\r\n\tvar view$1s = exports.protoUI(api$1s, AutoTooltip, Group, TreeAPI, SelectionModel, KeysNavigation, MouseEvents, Scrollable, TreeDataLoader, proto.view, TreeRenderStack, CopyPaste, EventSystem);\r\n\r\n\t/*\r\n\t\tUI:DataView\r\n\t*/\r\n\t// #include ui/component.js\r\n\t// #include core/mouse.js \t\r\n\t// #include core/edit.js \r\n\t// #include core/selection.js \r\n\t// #include core/drag.js\r\n\t// #include core/move.js\r\n\t// #include core/virtual_render.js\r\n\t// #include core/keynav.js\r\n\t// #include core/print.js\r\n\r\n\tvar api$1t = {\r\n\t name: \"dataview\",\r\n\t $init: function $init(config) {\r\n\t if (config.sizeToContent) //method need to be called before data-loaders\r\n\t //so we are using unshift to place it at start\r\n\t this.$ready.unshift(this._after_init_call);\r\n\t var type = config.type || config.item;\r\n\t var prerender = config.prerender || this.defaults.prerender || type && type.width == \"auto\";\r\n\t if (!prerender && !config.autoheight) exports.extend(this, VirtualRenderStack, true);\r\n\t if (config.autoheight) config.scroll = false;\r\n\r\n\t if (type && type.type == \"tiles\") {\r\n\t this._viewobj.firstChild.style.padding = \"8px\";\r\n\t this._tilesPadding = 8;\r\n\t }\r\n\r\n\t this._contentobj.className += \" webix_dataview\";\r\n\r\n\t this._viewobj.setAttribute(\"role\", \"listbox\");\r\n\t },\r\n\t _after_init_call: function _after_init_call() {\r\n\t var test = create(\"DIV\", 0, this.type.template({}));\r\n\t test.style.position = \"absolute\";\r\n\t document.body.appendChild(test);\r\n\t this.type.width = test.offsetWidth;\r\n\t this.type.height = test.offsetHeight;\r\n\t remove(test);\r\n\t },\r\n\t defaults: {\r\n\t scroll: true,\r\n\t datafetch: 50,\r\n\t navigation: true\r\n\t },\r\n\t _id: \"webix_l_id\",\r\n\t _itemClassName: \"webix_dataview_item\",\r\n\t _tilesPadding: 0,\r\n\t on_click: {\r\n\t webix_dataview_item: function webix_dataview_item(e, id) {\r\n\t if (this._settings.select) {\r\n\t if (this._settings.select == \"multiselect\" || this._settings.multiselect) this.select(id, false, this._settings.multiselect == \"touch\" || e.ctrlKey || e.metaKey, e.shiftKey); //multiselection\r\n\t else this.select(id);\r\n\t }\r\n\t }\r\n\t },\r\n\t on_dblclick: {},\r\n\t on_mouse_move: {},\r\n\t type: {\r\n\t //normal state of item\r\n\t template: template(\"#value#\"),\r\n\t //in case of dyn. loading - temporary spacer\r\n\t templateLoading: template(\"Loading...\"),\r\n\t width: 160,\r\n\t height: 50,\r\n\t classname: function classname(obj, common, marks) {\r\n\t var css = \"webix_dataview_item \";\r\n\t if (common.css) css += common.css + \" \";\r\n\t if (common.type && common.type.toString() == \"tiles\") css += \"tiles \";\r\n\r\n\t if (obj.$css) {\r\n\t if (_typeof(obj.$css) == \"object\") obj.$css = createCss(obj.$css);\r\n\t css += obj.$css + \" \";\r\n\t }\r\n\r\n\t if (marks && marks.$css) css += marks.$css + \" \";\r\n\t return css;\r\n\t },\r\n\t tilesStart: function tilesStart(obj, common) {\r\n\t if (common.type == \"tiles\") return \"
    \";\r\n\t return \"\";\r\n\t },\r\n\t tilesEnd: function tilesEnd(obj, common) {\r\n\t if (common.type == \"tiles\") return \"
    \";\r\n\t return \"\";\r\n\t },\r\n\t aria: function aria(obj, common, marks) {\r\n\t return \"role=\\\"option\\\"\" + (marks && marks.webix_selected ? \" aria-selected=\\\"true\\\" tabindex=\\\"0\\\"\" : \" tabindex=\\\"-1\\\"\");\r\n\t },\r\n\t templateStart: template(\"
    {common.tilesStart()}\"),\r\n\t templateEnd: template(\"{common.tilesEnd()}
    \")\r\n\t },\r\n\t _calck_autoheight: function _calck_autoheight(width) {\r\n\t return this._settings.height = this.type.height * Math.ceil(this.data.count() / Math.floor(width / this.type.width));\r\n\t },\r\n\t autoheight_setter: function autoheight_setter(mode) {\r\n\t if (mode) {\r\n\t this.data.attachEvent(\"onStoreLoad\", bind(this.resize, this));\r\n\t this._contentobj.style.overflowY = \"hidden\";\r\n\t }\r\n\r\n\t return mode;\r\n\t },\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t if (this._settings.xCount > 0 && this.type.width != \"auto\" && !this._autowidth) this._settings.width = this.type.width * this._settings.xCount + (this._scroll_y ? env.scrollSize : 0);\r\n\t if (this._settings.yCount && this.type.height != \"auto\") this._settings.height = this.type.height * this._settings.yCount;\r\n\t var width = this._settings.width || this._content_width;\r\n\r\n\t if (this._settings.autoheight && width) {\r\n\t this._calck_autoheight(width);\r\n\r\n\t this.scroll_setter(false);\r\n\t }\r\n\r\n\t return base.api.$getSize.call(this, dx, dy);\r\n\t },\r\n\t _recalk_counts: function _recalk_counts() {\r\n\t var render = false;\r\n\r\n\t if (this._settings.yCount && this.type.height == \"auto\") {\r\n\t this.type.height = Math.floor((this._content_height - this._tilesPadding) / this._settings.yCount);\r\n\t render = true;\r\n\t }\r\n\r\n\t if (this._settings.xCount && (this.type.width == \"auto\" || this._autowidth)) {\r\n\t this._autowidth = true; //flag marks that width was set to \"auto\" initially\r\n\r\n\t this.type.width = Math.floor((this._content_width - this._tilesPadding * 2) / this._settings.xCount);\r\n\t render = true;\r\n\t } else this._autowidth = false;\r\n\r\n\t return render;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (base.api.$setSize.call(this, x, y)) {\r\n\t if (this._settings.autoheight && this._calck_autoheight() != this._content_height) return delay(this.resize, this);\r\n\t if (this._recalk_counts() || this._render_visible_rows) this.render();\r\n\t }\r\n\t }\r\n\t};\r\n\tvar view$1t = exports.protoUI(api$1t, DataMove, DragItem, MouseEvents, KeysNavigation, SelectionModel, Scrollable, CustomPrint, proto.view);\r\n\r\n\ti18n.pager = {\r\n\t first: \"\",\r\n\t last: \"\",\r\n\t next: \"\",\r\n\t prev: \"\"\r\n\t};\r\n\tvar api$1u = {\r\n\t defaults: {\r\n\t size: 10,\r\n\t //items on page\r\n\t page: 0,\r\n\t //current page\r\n\t group: 5,\r\n\t template: \"{common.pages()}\",\r\n\t maxWidth: 100000,\r\n\t height: 30,\r\n\t borderless: true\r\n\t },\r\n\t name: \"pager\",\r\n\t on_click: {\r\n\t //on paging button click\r\n\t \"webix_pager_item\": function webix_pager_item(e, id) {\r\n\t this.select(id);\r\n\t }\r\n\t },\r\n\t $init: function $init(config) {\r\n\t this.data = this._settings;\r\n\t this._dataobj = this._viewobj;\r\n\t this._viewobj.className += \" webix_pager\" + (config.autowidth ? \" webix_pager_auto\" : \"\");\r\n\t if (config.master === false || config.master === 0) this.$ready.push(this._remove_master);\r\n\t },\r\n\t _remove_master: function _remove_master() {\r\n\t this.refresh();\r\n\t this.$master = {\r\n\t refresh: function refresh() {},\r\n\t select: function select() {}\r\n\t };\r\n\t },\r\n\t select: function select(id) {\r\n\t if (this.$master && this.$master.name == \"pager\") return this.$master.select(id); //id - id of button, number for page buttons\r\n\r\n\t switch (id) {\r\n\t case \"next\":\r\n\t id = this._settings.page + 1;\r\n\t break;\r\n\r\n\t case \"prev\":\r\n\t id = this._settings.page - 1;\r\n\t break;\r\n\r\n\t case \"first\":\r\n\t id = 0;\r\n\t break;\r\n\r\n\t case \"last\":\r\n\t id = this._settings.limit - 1;\r\n\t break;\r\n\r\n\t default:\r\n\t //use incoming id\r\n\t break;\r\n\t }\r\n\r\n\t if (id < 0) id = 0;\r\n\t if (id >= this.data.limit) id = this.data.limit - 1;\r\n\t var old = this.data.page;\r\n\r\n\t if (this.callEvent(\"onBeforePageChange\", [id, old])) {\r\n\t this.data.page = id * 1; //must be int\r\n\r\n\t if (this.refresh()) {\r\n\t if (!this._settings.animate || !this._animate(old, id * 1, this._settings.animate)) this.$master.refresh();\r\n\t }\r\n\r\n\t this.callEvent(\"onAfterPageChange\", [id]);\r\n\t }\r\n\t },\r\n\t _id: \"webix_p_id\",\r\n\t template_setter: template,\r\n\t type: {\r\n\t template: function template$$1(a, b) {\r\n\t return a.template.call(this, a, b);\r\n\t },\r\n\t //list of page numbers\r\n\t pages: function pages(obj) {\r\n\t var html = \"\"; //skip rendering if paging is not fully initialized\r\n\r\n\t if (obj.page == -1) return \"\"; //current page taken as center of view, calculate bounds of group\r\n\r\n\t obj.$min = obj.page - Math.round((obj.group - 1) / 2);\r\n\t obj.$max = obj.$min + obj.group * 1 - 1;\r\n\r\n\t if (obj.$min < 0) {\r\n\t obj.$max += obj.$min * -1;\r\n\t obj.$min = 0;\r\n\t }\r\n\r\n\t if (obj.$max >= obj.limit) {\r\n\t obj.$min -= Math.min(obj.$min, obj.$max - obj.limit + 1);\r\n\t obj.$max = obj.limit - 1;\r\n\t } //generate HTML code of buttons\r\n\r\n\r\n\t for (var i = obj.$min || 0; i <= obj.$max; i++) {\r\n\t html += this.button({\r\n\t id: i,\r\n\t index: i + 1,\r\n\t selected: i == obj.page ? \"_selected\" : \"\",\r\n\t label: i18n.aria.page + \" \" + (i + 1)\r\n\t });\r\n\t }\r\n\r\n\t return html;\r\n\t },\r\n\t page: function page(obj) {\r\n\t return obj.page + 1;\r\n\t },\r\n\t //go-to-first page button\r\n\t first: function first() {\r\n\t return this.button({\r\n\t id: \"first\",\r\n\t index: i18n.pager.first,\r\n\t selected: \"\",\r\n\t label: i18n.aria.pages[0]\r\n\t });\r\n\t },\r\n\t //go-to-last page button\r\n\t last: function last() {\r\n\t return this.button({\r\n\t id: \"last\",\r\n\t index: i18n.pager.last,\r\n\t selected: \"\",\r\n\t label: i18n.aria.pages[3]\r\n\t });\r\n\t },\r\n\t //go-to-prev page button\r\n\t prev: function prev() {\r\n\t return this.button({\r\n\t id: \"prev\",\r\n\t index: i18n.pager.prev,\r\n\t selected: \"\",\r\n\t label: i18n.aria.pages[1]\r\n\t });\r\n\t },\r\n\t //go-to-next page button\r\n\t next: function next() {\r\n\t return this.button({\r\n\t id: \"next\",\r\n\t index: i18n.pager.next,\r\n\t selected: \"\",\r\n\t label: i18n.aria.pages[2]\r\n\t });\r\n\t },\r\n\t button: template(\"\")\r\n\t },\r\n\t clone: function clone$$1(pager) {\r\n\t if (!pager.$view) {\r\n\t pager.view = \"pager\";\r\n\t pager = ui(pager);\r\n\t }\r\n\r\n\t this._clone = pager;\r\n\t pager.$master = this;\r\n\r\n\t this._refresh_clone();\r\n\t },\r\n\t refresh: function refresh() {\r\n\t var s = this._settings;\r\n\t if (!s.count) return; //max page number\r\n\r\n\t s.limit = Math.ceil(s.count / s.size);\r\n\t var newPage = Math.min(s.limit - 1, s.page);\r\n\t if (newPage != s.page) return this.$master.setPage(newPage);\r\n\t s.page = newPage;\r\n\r\n\t if (newPage >= 0 && newPage != s.old_page || s.limit != s.old_limit || s.old_count != s.count) {\r\n\t //refresh self only if current page or total limit was changed\r\n\t this.render();\r\n\r\n\t this._refresh_clone();\r\n\r\n\t s.old_limit = s.limit; //save for onchange check in next iteration\r\n\r\n\t s.old_page = s.page;\r\n\t s.old_count = s.count;\r\n\t return true;\r\n\t }\r\n\t },\r\n\t apiOnly_setter: function apiOnly_setter(value) {\r\n\t return this.$apiOnly = value;\r\n\t },\r\n\t _refresh_clone: function _refresh_clone() {\r\n\t if (this._clone) {\r\n\t this._clone._settings.count = this._settings.count;\r\n\t this._clone._settings.page = this._settings.page;\r\n\r\n\t this._clone.refresh();\r\n\t }\r\n\t },\r\n\t _animate: function _animate(old, id, config) {\r\n\t if (old == id) return false;\r\n\r\n\t if (this._pgInAnimation) {\r\n\t if (this._pgAnimateTimeout) {\r\n\t window.clearTimeout(this._pgAnimateTimeout);\r\n\t }\r\n\r\n\t return this._pgAnimateTimeout = delay(this._animate, this, [old, id, config], 100);\r\n\t }\r\n\r\n\t var direction = id > old ? \"left\" : \"right\";\r\n\t if (config.direction == \"top\" || config.direction == \"bottom\") direction = id > old ? \"top\" : \"bottom\";\r\n\t if (config.flip) direction = \"\"; //make copy of existing view\r\n\r\n\t var top = 0;\r\n\t var snode = this.$master._dataobj;\r\n\t var isDataTable = !!this.$master._body;\r\n\r\n\t if (isDataTable) {\r\n\t snode = this.$master._body;\r\n\t top = snode.offsetTop;\r\n\t addCss(this.$master.$view, \"webix_animation\");\r\n\t }\r\n\r\n\t var onode = snode.cloneNode(true);\r\n\t onode.style.width = snode.style.width = \"100%\"; //redraw page\r\n\r\n\t this.$master.refresh(); //append copy next to original\r\n\r\n\t insertBefore(onode, snode.nextSibling, snode.parentNode);\r\n\t if (isDataTable) onode.childNodes[1].scrollLeft = snode.childNodes[1].scrollLeft; //animation config\r\n\r\n\t var line;\r\n\t var base$$1 = config !== true ? config : {};\r\n\t var aniset = exports.extend({\r\n\t direction: direction,\r\n\t callback: bind(function () {\r\n\t aniset.callback = null;\r\n\t animate.breakLine(line);\r\n\t this._pgInAnimation = false;\r\n\t if (this.$master._body) removeCss(this.$master.$view, \"webix_animation\");\r\n\t }, this),\r\n\t top: top,\r\n\t keepViews: isDataTable\r\n\t }, base$$1); //run animation\r\n\r\n\t line = animate.formLine(snode, onode, aniset);\r\n\t animate([snode, onode], aniset);\r\n\t this._pgInAnimation = true;\r\n\t }\r\n\t};\r\n\tvar view$1u = exports.protoUI(api$1u, MouseEvents, SingleRender, base.view, EventSystem);\r\n\r\n\t// #include ui/list.js\r\n\r\n\tvar api$1v = {\r\n\t name: \"menu\",\r\n\t _listClassName: \"webix_menu\",\r\n\t $init: function $init(config) {\r\n\t this.data._scheme_init = bind(function (obj) {\r\n\t if (obj.disabled) this.data.addMark(obj.id, \"webix_disabled\", true, 1, true);\r\n\t }, this);\r\n\r\n\t if (config.autowidth) {\r\n\t this._autowidth_submenu = true;\r\n\t delete config.autowidth;\r\n\t }\r\n\r\n\t this.data.attachEvent(\"onStoreUpdated\", bind(function () {\r\n\t this._hide_sub_menu();\r\n\t }, this));\r\n\t this.attachEvent(\"onMouseMove\", this._mouse_move_menu);\r\n\t this.attachEvent(\"onMouseOut\", function (e) {\r\n\t if (this._menu_was_activated() && this._settings.openAction == \"click\") return;\r\n\t if (!this._child_menu_active && e.relatedTarget) this._hide_sub_menu();\r\n\t });\r\n\t this.attachEvent(\"onItemClick\", function (id, e, trg) {\r\n\t var item = this.getItem(id);\r\n\r\n\t if (item) {\r\n\t if (item.$template) return;\r\n\t var parent = this.getTopMenu(); //ignore disabled items\r\n\r\n\t if (!this.data.getMark(id, \"webix_disabled\")) {\r\n\t if (!parent.callEvent(\"onMenuItemClick\", [id, e, trg])) {\r\n\t e.showpopup = true;\r\n\t return;\r\n\t }\r\n\r\n\t if (this != parent) parent._call_onclick(id, e, trg); //click on group - do not close submenus\r\n\r\n\t if (!item.submenu && !parent._show_child_on_click) {\r\n\t parent._hide_sub_menu(true);\r\n\r\n\t if (parent._hide_on_item_click) parent.hide();\r\n\t } else {\r\n\t if ((this === parent || env.touch) && parent._settings.openAction == \"click\") {\r\n\t this._mouse_move_activation(id, trg);\r\n\t } //do not close popups when clicking on menu folder\r\n\r\n\r\n\t e.showpopup = true;\r\n\t }\r\n\t }\r\n\t }\r\n\t });\r\n\t this.attachEvent(\"onKeyPress\", function (code) {\r\n\t if (code === 9) this.getTopMenu()._hide_sub_menu();else if (code === 13 || code === 32) {\r\n\t var sel = this.getSelectedId(),\r\n\t node;\r\n\t if (sel) node = this.getItemNode(sel);\r\n\t if (node) triggerEvent(node, \"MouseEvents\", \"click\");\r\n\t }\r\n\t });\r\n\t this.data.attachEvent(\"onClearAll\", function () {\r\n\t this._hidden_items = [];\r\n\t });\r\n\t this.data._hidden_items = [];\r\n\r\n\t this._viewobj.setAttribute(\"role\", \"menubar\"); //component can create new view\r\n\r\n\r\n\t this._destroy_with_me = [];\r\n\t },\r\n\t sizeToContent: function sizeToContent() {\r\n\t if (this._settings.layout == \"y\") {\r\n\t var texts = [];\r\n\t var isSubmenu = false;\r\n\t this.data.each(function (obj) {\r\n\t texts.push(this._toHTML(obj));\r\n\t if (obj.submenu) isSubmenu = true;\r\n\t }, this); // text width + padding + borders+ arrow\r\n\r\n\t this.config.width = getTextSize(texts, this.$view.className).width + 8 * 2 + 2 + (isSubmenu ? 15 : 0);\r\n\t this.resize();\r\n\t } else assert(false, \"sizeToContent will work for vertical menu only\");\r\n\t },\r\n\t getTopMenu: function getTopMenu() {\r\n\t var parent = this;\r\n\r\n\t while (parent._parent_menu) {\r\n\t parent = $$(parent._parent_menu);\r\n\t }\r\n\r\n\t return parent;\r\n\t },\r\n\t _auto_height_calc: function _auto_height_calc(count) {\r\n\t if (this._settings.autoheight) count = this.count();\r\n\t var value = this.count(),\r\n\t height = 0;\r\n\r\n\t for (var i = 0; i < count; i++) {\r\n\t var item = this.data.pull[this.data.order[i]];\r\n\r\n\t if (item && item.$template == \"Separator\") {\r\n\t height += 4;\r\n\t if (!this._settings.autoheight) count++;\r\n\t } else height += this.type.height;\r\n\t }\r\n\r\n\t this._onoff_scroll(count && count < value, \"y\");\r\n\r\n\t return height;\r\n\t },\r\n\t on_mouse_move: {},\r\n\t type: {\r\n\t _submenu: function _submenu(obj) {\r\n\t return obj.submenu || obj.data || obj.item;\r\n\t },\r\n\t css: \"menu\",\r\n\t width: \"auto\",\r\n\t aria: function aria(obj, common, marks) {\r\n\t return \"role=\\\"menuitem\\\"\" + (marks && marks.webix_selected ? \" aria-selected=\\\"true\\\" tabindex=\\\"0\\\"\" : \"tabindex=\\\"-1\\\"\") + (common._submenu(obj) ? \"aria-haspopup=\\\"true\\\"\" : \"\") + (marks && marks.webix_disabled ? \" aria-disabled=\\\"true\\\"\" : \"\");\r\n\t },\r\n\t templateStart: function templateStart(obj, common, mark) {\r\n\t if (obj.$template === \"Separator\" || obj.$template === \"Spacer\") {\r\n\t return \"
    \";\r\n\t }\r\n\r\n\t var link = (obj.href ? \" href='\" + obj.href + \"' \" : \"\") + (obj.target ? \" target='\" + obj.target + \"' \" : \"\");\r\n\t return list.api.type.templateStart(obj, common, mark).replace(/^
    \" : \"\");\r\n\t },\r\n\t templateEnd: function templateEnd(obj) {\r\n\t return obj.$template === \"Separator\" || obj.$template === \"Spacer\" ? \"
    \" : \"\";\r\n\t },\r\n\t templateSeparator: template(\"
    \"),\r\n\t templateSpacer: template(\"
    \")\r\n\t },\r\n\t getMenu: function getMenu(id) {\r\n\t if (!this.data.pull[id]) {\r\n\t for (var subid in this.data.pull) {\r\n\t var obj = this.getItem(subid);\r\n\r\n\t if (obj.submenu) {\r\n\t var search = this._get_submenu(obj).getMenu(id);\r\n\r\n\t if (search) return search;\r\n\t }\r\n\t }\r\n\t } else return this;\r\n\t },\r\n\t getSubMenu: function getSubMenu(id) {\r\n\t var menu = this.getMenu(id);\r\n\t var obj = menu.getItem(id);\r\n\t return obj.submenu ? menu._get_submenu(obj) : null;\r\n\t },\r\n\t getMenuItem: function getMenuItem(id) {\r\n\t return this.getMenu(id).getItem(id);\r\n\t },\r\n\t _get_submenu: function _get_submenu(data) {\r\n\t var sub = $$(data.submenu);\r\n\r\n\t if (!sub) {\r\n\t data.submenu = this._create_sub_menu(data);\r\n\t sub = $$(data.submenu);\r\n\t }\r\n\r\n\t return sub;\r\n\t },\r\n\t _mouse_move_menu: function _mouse_move_menu(id, e, target) {\r\n\t if (!this._menu_was_activated()) return;\r\n\r\n\t this._mouse_move_activation(id, target);\r\n\t },\r\n\t _menu_was_activated: function _menu_was_activated() {\r\n\t var top = this.getTopMenu();\r\n\r\n\t if (top._settings.openAction == \"click\") {\r\n\t if (env.touch) return false;\r\n\t var sub = top._open_sub_menu;\r\n\t if (sub && $$(sub).isVisible()) return true;\r\n\t return false;\r\n\t }\r\n\r\n\t return true;\r\n\t },\r\n\t _mouse_move_activation: function _mouse_move_activation(id, target) {\r\n\t var data = this.getItem(id);\r\n\t if (!data) return; //clear flag of submenu usage\r\n\r\n\t this._child_menu_active = null; //hide previously opened sub-menu\r\n\r\n\t if (this._open_sub_menu && data.submenu != this._open_sub_menu) this._hide_sub_menu(true); //show submenu\r\n\r\n\t if (this.type._submenu(data) && !this.config.hidden) {\r\n\t var sub = this._get_submenu(data);\r\n\r\n\t if (this.data.getMark(id, \"webix_disabled\")) return;\r\n\t sub.show(target, {\r\n\t pos: this._settings.subMenuPos\r\n\t });\r\n\t sub._parent_menu = this._settings.id;\r\n\t this._open_sub_menu = data.submenu;\r\n\t }\r\n\t },\r\n\t disableItem: function disableItem(id) {\r\n\t this.getMenu(id).addCss(id, \"webix_disabled\");\r\n\t },\r\n\t enableItem: function enableItem(id) {\r\n\t this.getMenu(id).removeCss(id, \"webix_disabled\");\r\n\t },\r\n\t _set_item_hidden: function _set_item_hidden(id, state) {\r\n\t var menu = this.data;\r\n\r\n\t if (menu._hidden_items[id] != state) {\r\n\t menu._hidden_items[id] = state;\r\n\t menu.filter(function (obj) {\r\n\t return !menu._hidden_items[obj.id];\r\n\t });\r\n\t this.resize();\r\n\t }\r\n\t },\r\n\t hideItem: function hideItem(id) {\r\n\t var menu = this.getMenu(id);\r\n\t if (menu) menu._set_item_hidden(id, true);\r\n\t },\r\n\t showItem: function showItem(id) {\r\n\t var menu = this.getMenu(id);\r\n\r\n\t if (menu) {\r\n\t menu._set_item_hidden(id, false);\r\n\r\n\t return list.api.showItem.call(menu, id);\r\n\t }\r\n\t },\r\n\t _hide_sub_menu: function _hide_sub_menu(mode) {\r\n\t if (this._open_sub_menu) {\r\n\t //recursive sub-closing\r\n\t var sub = $$(this._open_sub_menu);\r\n\t if (sub._hide_sub_menu) //custom context may not have submenu\r\n\t sub._hide_sub_menu(mode);\r\n\r\n\t if (mode || !sub._show_on_mouse_out) {\r\n\t sub.hide();\r\n\t this._open_sub_menu = null;\r\n\t }\r\n\t }\r\n\t },\r\n\t _create_sub_menu: function _create_sub_menu(data) {\r\n\t var listConfig = {\r\n\t view: \"submenu\",\r\n\t data: this.type._submenu(data)\r\n\t };\r\n\r\n\t var settings = this.getTopMenu()._settings.submenuConfig;\r\n\r\n\t if (settings) exports.extend(listConfig, settings, true);\r\n\t var parentData = this.getMenuItem(data.id);\r\n\t if (parentData && parentData.config) exports.extend(listConfig, parentData.config, true);\r\n\t var menu = ui(listConfig);\r\n\r\n\t this._destroy_with_me.push(menu);\r\n\r\n\t menu._parent_menu = this;\r\n\t return menu._settings.id;\r\n\t },\r\n\t _skip_item: function _skip_item(id, prev, mode) {\r\n\t var item = this.getItem(id);\r\n\r\n\t if (item.$template == \"Separator\" || item.$template == \"Spacer\" || this.data.getMark(id, \"webix_disabled\")) {\r\n\t var index$$1 = this.getIndexById(id) + (mode == \"up\" ? -1 : 1);\r\n\t id = index$$1 >= 0 ? this.getIdByIndex(index$$1) : null;\r\n\t return id ? this._skip_item(id, prev, mode) : prev;\r\n\t } else return id;\r\n\t },\r\n\t $skin: function $skin() {\r\n\t list.api.$skin.call(this);\r\n\t this.type.height = $active.menuHeight;\r\n\t },\r\n\t defaults: {\r\n\t scroll: \"\",\r\n\t layout: \"x\",\r\n\t mouseEventDelay: 100,\r\n\t subMenuPos: \"bottom\"\r\n\t }\r\n\t};\r\n\tvar view$1v = exports.protoUI(api$1v, list.view);\r\n\tvar menu = {\r\n\t api: api$1v,\r\n\t view: view$1v\r\n\t};\r\n\r\n\tvar api$1w = {\r\n\t name: \"submenu\",\r\n\t $init: function $init() {\r\n\t this._body_cell = clone(this._dummy_cell_interface);\r\n\t this._body_cell._view = this;\r\n\t this.attachEvent(\"onMouseOut\", function (e) {\r\n\t if (this.getTopMenu()._settings.openAction == \"click\") return;\r\n\t if (!this._child_menu_active && !this._show_on_mouse_out && e.relatedTarget) this.hide();\r\n\t }); //inform parent that focus is still in menu\r\n\r\n\t this.attachEvent(\"onMouseMoving\", function () {\r\n\t if (this._parent_menu) $$(this._parent_menu)._child_menu_active = true;\r\n\t });\r\n\t this.attachEvent(\"onBeforeShow\", function () {\r\n\t if (this.getTopMenu()._autowidth_submenu && this.sizeToContent && !this.isVisible()) this.sizeToContent();\r\n\t });\r\n\r\n\t this._dataobj.setAttribute(\"role\", \"menu\");\r\n\t },\r\n\t $skin: function $skin() {\r\n\t menu.api.$skin.call(this);\r\n\t popup.api.$skin.call(this);\r\n\t this.type.height = $active.menuHeight;\r\n\t },\r\n\t _dummy_cell_interface: {\r\n\t $getSize: function $getSize(dx, dy) {\r\n\t //we saving height and width, as list can hardcode new values\r\n\t var h = this._view._settings.height * 1;\r\n\t var w = this._view._settings.width * 1;\r\n\t var size = menu.api.$getSize.call(this._view, dx, dy); //restoring\r\n\r\n\t this._view._settings.height = h;\r\n\t this._view._settings.width = w;\r\n\t return size;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t if (this._view._settings.scroll) this._view._bodyobj.style.height = y + \"px\";\r\n\t },\r\n\t destructor: function destructor() {\r\n\t this._view = null;\r\n\t }\r\n\t },\r\n\t //ignore body element\r\n\t body_setter: function body_setter() {},\r\n\t getChildViews: function getChildViews() {\r\n\t return [];\r\n\t },\r\n\t defaults: {\r\n\t width: 150,\r\n\t subMenuPos: \"right\",\r\n\t layout: \"y\",\r\n\t autoheight: true\r\n\t },\r\n\t type: {\r\n\t height: $active.menuHeight,\r\n\t subsign: true\r\n\t }\r\n\t};\r\n\tvar view$1w = exports.protoUI(api$1w, menu.view, popup.view);\r\n\tvar submenu = {\r\n\t api: api$1w,\r\n\t view: view$1w\r\n\t};\r\n\r\n\tvar api$1x = {\r\n\t name: \"sidemenu\",\r\n\t defaults: {\r\n\t animate: true,\r\n\t position: \"left\",\r\n\t width: 200,\r\n\t borderless: true\r\n\t },\r\n\t $init: function $init() {\r\n\t this.$view.className += \" webix_sidemenu\";\r\n\t },\r\n\t $skin: function $skin() {\r\n\t this.defaults.padding = 0;\r\n\t },\r\n\t position_setter: function position_setter(value) {\r\n\t var prevPosition = this._settings.position;\r\n\t if (prevPosition) removeCss(this.$view, \" webix_sidemenu_\" + prevPosition);\r\n\t addCss(this.$view, \" webix_sidemenu_\" + value);\r\n\t return value;\r\n\t },\r\n\t $getSize: function $getSize() {\r\n\t var sizes = window$1.api.$getSize.apply(this, arguments);\r\n\t this._desired_sizes = sizes;\r\n\t return sizes;\r\n\t },\r\n\t $setSize: function $setSize(x, y) {\r\n\t base.api.$setSize.call(this, x, y);\r\n\t x = this._content_width - this._settings.padding * 2;\r\n\t y = this._content_height - this._settings.padding * 2;\r\n\t this._contentobj.style.padding = this._settings.padding + \"px\";\r\n\t this._headobj.style.display = \"none\";\r\n\t this._bodyobj.style.height = y + \"px\";\r\n\r\n\t this._body_cell.$setSize(x, y);\r\n\t },\r\n\t show: function show() {\r\n\t if (!this.callEvent(\"onBeforeShow\", arguments)) return false;\r\n\t this._settings.hidden = false;\r\n\t this._viewobj.style.zIndex = this._settings.zIndex || zIndex();\r\n\r\n\t if (this._settings.modal || this._modal) {\r\n\t this._modal_set(true);\r\n\r\n\t this._modal = null; // hidden_setter handling\r\n\t }\r\n\r\n\t this._viewobj.style.display = \"block\";\r\n\r\n\t this._render_hidden_views();\r\n\r\n\t if (this._settings.position) this._setPosition();\r\n\t this._hide_timer = 1;\r\n\t delay(function () {\r\n\t this._hide_timer = 0;\r\n\t }, this, [], env.touch ? 400 : 100);\r\n\r\n\t if (this.config.autofocus) {\r\n\t this._prev_focus = UIManager.getFocus();\r\n\t UIManager.setFocus(this);\r\n\t }\r\n\r\n\t if (-1 == state._popups.find(this)) state._popups.push(this);\r\n\t this.callEvent(\"onShow\", []);\r\n\t },\r\n\t _setPosition: function _setPosition(x) {\r\n\t var width,\r\n\t height,\r\n\t maxWidth,\r\n\t maxHeight,\r\n\t position,\r\n\t left = 0,\r\n\t top = 0,\r\n\t state$$1 = {};\r\n\t this.$view.style.position = \"fixed\";\r\n\t maxWidth = document.documentElement.offsetWidth;\r\n\t maxHeight = document.documentElement.offsetHeight;\r\n\t width = this._desired_sizes[0] || maxWidth;\r\n\t height = this._desired_sizes[2] || maxHeight;\r\n\t assert(width && height, \"Attempt to show not rendered window\");\r\n\t position = this._settings.position;\r\n\r\n\t if (position == \"top\") {\r\n\t width = maxWidth;\r\n\t } else if (position == \"right\") {\r\n\t height = maxHeight;\r\n\t left = maxWidth - width;\r\n\t } else if (position == \"bottom\") {\r\n\t width = maxWidth;\r\n\t top = maxHeight - height;\r\n\t } else {\r\n\t height = maxHeight;\r\n\t }\r\n\r\n\t state$$1 = {\r\n\t left: left,\r\n\t top: top,\r\n\t width: width,\r\n\t height: height,\r\n\t maxWidth: maxWidth,\r\n\t maxHeight: maxHeight\r\n\t };\r\n\t if (typeof this._settings.state == \"function\") this._settings.state.call(this, state$$1);\r\n\t this._state = state$$1;\r\n\t this.$setSize(state$$1.width, state$$1.height);\r\n\r\n\t if (typeof x == \"undefined\" && this._isAnimationSupported()) {\r\n\t removeCss(this.$view, \"webix_animate\", true); // set initial state\r\n\r\n\t this._animate[this._settings.position].beforeShow.call(this, state$$1); // set apply animation css\r\n\r\n\r\n\t delay(function () {\r\n\t addCss(this.$view, \"webix_animate\", true);\r\n\t }, this, null, 1); // animate popup\r\n\r\n\t delay(function () {\r\n\t this._animate[this._settings.position].show.call(this, state$$1);\r\n\t }, this, null, 10);\r\n\t } else {\r\n\t if (this._settings.position === \"right\") state$$1.left = state$$1.right ? maxWidth - state$$1.width - state$$1.right : maxWidth - state$$1.width;\r\n\t this.setPosition(state$$1.left, state$$1.top);\r\n\t }\r\n\t },\r\n\t _isAnimationSupported: function _isAnimationSupported() {\r\n\t return animate.isSupported() && this._settings.animate && !(env.isIE && navigator.appVersion.indexOf(\"MSIE 9\") != -1);\r\n\t },\r\n\t hidden_setter: function hidden_setter(value) {\r\n\t if (value) this.hide(true);else this.show();\r\n\t return !!value;\r\n\t },\r\n\t _animate: {\r\n\t left: {\r\n\t beforeShow: function beforeShow(state$$1) {\r\n\t this.$view.style.left = -state$$1.width + \"px\";\r\n\t this.$view.style.top = state$$1.top + \"px\";\r\n\t },\r\n\t show: function show(state$$1) {\r\n\t this.$view.style.left = state$$1.left ? state$$1.left + \"px\" : \"0px\";\r\n\t },\r\n\t hide: function hide(state$$1) {\r\n\t this.$view.style.left = -state$$1.width + \"px\";\r\n\t }\r\n\t },\r\n\t right: {\r\n\t beforeShow: function beforeShow(state$$1) {\r\n\t this.$view.style.left = \"auto\";\r\n\t this.$view.style.right = -state$$1.width + \"px\";\r\n\t this.$view.style.top = state$$1.top + \"px\";\r\n\t },\r\n\t show: function show(state$$1) {\r\n\t this.$view.style.right = state$$1.right ? state$$1.right + \"px\" : \"0px\";\r\n\t },\r\n\t hide: function hide(state$$1) {\r\n\t this.$view.style.right = -state$$1.width + \"px\";\r\n\t }\r\n\t },\r\n\t top: {\r\n\t beforeShow: function beforeShow(state$$1) {\r\n\t this.setPosition(state$$1.left, state$$1.top);\r\n\t this.$view.style.height = \"0px\";\r\n\t this._bodyobj.style.height = \"0px\";\r\n\t },\r\n\t show: function show(state$$1) {\r\n\t this.$view.style.height = state$$1.height + \"px\";\r\n\t this._bodyobj.style.height = state$$1.height + \"px\";\r\n\t },\r\n\t hide: function hide() {\r\n\t this.$view.style.height = \"0px\";\r\n\t this._bodyobj.style.height = \"0px\";\r\n\t }\r\n\t },\r\n\t bottom: {\r\n\t beforeShow: function beforeShow(state$$1) {\r\n\t this.$view.style.left = state$$1.left + \"px\";\r\n\t this.$view.style.top = \"auto\";\r\n\t var bottom = state$$1.bottom != undefined ? state$$1.bottom : state$$1.maxHeight - state$$1.top - state$$1.height;\r\n\t this.$view.style.bottom = bottom + \"px\";\r\n\t this.$view.style.height = \"0px\";\r\n\t },\r\n\t show: function show(state$$1) {\r\n\t this.$view.style.height = state$$1.height + \"px\";\r\n\t },\r\n\t hide: function hide() {\r\n\t this.$view.style.height = \"0px\";\r\n\t }\r\n\t }\r\n\t },\r\n\t hide: function hide(force) {\r\n\t if (this.$destructed) return;\r\n\t if (this._settings.modal) this._modal_set(false);\r\n\t var maxWidth = document.documentElement.offsetWidth;\r\n\t var maxHeight = document.documentElement.offsetHeight;\r\n\r\n\t if (!force && this._isAnimationSupported() && maxWidth == this._state.maxWidth && maxHeight == this._state.maxHeight) {\r\n\t // call 'hide' animation handler\r\n\t this._animate[this._settings.position].hide.call(this, this._state); // hide popup\r\n\r\n\r\n\t var tid = event$1(this.$view, env.transitionEnd, bind(function () {\r\n\t this._hide_callback();\r\n\r\n\t eventRemove(tid);\r\n\t }, this));\r\n\t } else {\r\n\t this._hide_callback();\r\n\t }\r\n\r\n\t if (this._settings.autofocus) {\r\n\t var el = document.activeElement;\r\n\r\n\t if (el && this._viewobj && this._viewobj.contains(el)) {\r\n\t UIManager.setFocus(this._prev_focus);\r\n\t this._prev_focus = null;\r\n\t }\r\n\t }\r\n\r\n\t this._hide_sub_popups();\r\n\t }\r\n\t};\r\n\tvar view$1x = exports.protoUI(api$1x, popup.view);\r\n\r\n\tvar api$1y = {\r\n\t name: \"sidebar\",\r\n\t defaults: {\r\n\t titleHeight: $active.sidebarTitleHeight || 40,\r\n\t type: \"sideBar\",\r\n\t activeTitle: true,\r\n\t select: true,\r\n\t scroll: false,\r\n\t collapsed: false,\r\n\t collapsedWidth: 44,\r\n\t position: \"left\",\r\n\t width: 250,\r\n\t mouseEventDelay: 10\r\n\t },\r\n\t $init: function $init() {\r\n\t this.$ready.push(this._initSidebar);\r\n\t this.$ready.push(this._initContextMenu);\r\n\r\n\t this.data._scheme_init = function (obj) {\r\n\t if (obj.data) obj.menu = copy(obj.data);else if (obj.item) //xml child records, can be {} or []\r\n\t obj.menu = copy(obj.item.length ? obj.item : [obj.item]);\r\n\t };\r\n\t },\r\n\t on_context: {},\r\n\t on_mouse_move: {},\r\n\t _initSidebar: function _initSidebar() {\r\n\t this._fullWidth = this.config.width;\r\n\t this.attachEvent(\"onBeforeOpen\", function (id) {\r\n\t if (!this.config.multipleOpen) {\r\n\t var open = this.getOpenItems();\r\n\r\n\t for (var i = 0; i < open.length; i++) {\r\n\t if (this.getParentId(id) == this.getParentId(open[i])) this.close(open[i]);\r\n\t }\r\n\t }\r\n\r\n\t return !this.config.collapsed;\r\n\t });\r\n\t this.attachEvent(\"onItemClick\", function (id, ev, node) {\r\n\t if (this.getPopup() && !this.getPopup().config.hidden) ev.showpopup = true;\r\n\t if (env.touch) this._showPopup(id, node);\r\n\t });\r\n\t this.attachEvent(\"onBeforeSelect\", function (id) {\r\n\t if (!this.getItem(id).$count) {\r\n\t this.clearCss(\"webix_sidebar_selected\");\r\n\t return true;\r\n\t }\r\n\r\n\t return false;\r\n\t });\r\n\t this.attachEvent(\"onAfterSelect\", function (id) {\r\n\t this._markMenu(this, id, !$active.sidebarMarkAll);\r\n\r\n\t this.getPopup()._onMasterSelect(id);\r\n\t });\r\n\t this.attachEvent(\"onMouseMove\", function (id, ev, node) {\r\n\t this._showPopup(id, node);\r\n\t });\r\n\t if (this.config.collapsed) this.collapse();\r\n\t },\r\n\t _showPopup: function _showPopup(id, node) {\r\n\t if (this.config.collapsed) {\r\n\t var popup = this.getPopup();\r\n\r\n\t if (popup) {\r\n\t this._updateTitle(id);\r\n\r\n\t this._updateList(id);\r\n\r\n\t popup.show(node, {\r\n\t x: this.config.position == \"left\" ? this.config.collapsedWidth : -popup.config.width,\r\n\t y: -1\r\n\t });\r\n\t }\r\n\t }\r\n\t },\r\n\t _updateTitle: function _updateTitle(id) {\r\n\t var popup = this.getPopup();\r\n\t var title = popup.getBody().getChildViews()[0];\r\n\t if (!title) return;\r\n\t var selectedId = this.getSelectedId();\r\n\t title.masterId = id;\r\n\t title.parse(this.getItem(id));\r\n\r\n\t if (selectedId && this.getParentId(selectedId) == id) {\r\n\t addCss(title.$view, \"webix_sidebar_selected\", true);\r\n\t } else {\r\n\t removeCss(title.$view, \"webix_sidebar_selected\");\r\n\t }\r\n\r\n\t if (selectedId == id) {\r\n\t addCss(title.$view, \"webix_selected\", true);\r\n\t } else {\r\n\t removeCss(title.$view, \"webix_selected\");\r\n\t }\r\n\t },\r\n\t _updateList: function _updateList(id) {\r\n\t var popup = this.getPopup();\r\n\t var list = popup.getBody().getChildViews()[1];\r\n\t if (!list) return;\r\n\t list.clearCss(\"webix_sidebar_selected\");\r\n\t list.masterId = id;\r\n\t var selectedId = this.getSelectedId();\r\n\t var data = this.getItem(id).menu ? copy(this.getItem(id).menu) : [].concat(copy(this.data.getBranch(id)));\r\n\t list.unselect();\r\n\r\n\t if (data.length) {\r\n\t list.show();\r\n\t list.data.importData(data);\r\n\t if (list.exists(selectedId)) list.select(selectedId);else if (selectedId) this._markMenu(list, selectedId);\r\n\t } else list.hide();\r\n\t },\r\n\t _initContextMenu: function _initContextMenu() {\r\n\t var master = this,\r\n\t config = master.config,\r\n\t popup;\r\n\r\n\t if (config.popup) {\r\n\t popup = $$(config.popup);\r\n\t }\r\n\r\n\t if (!popup) {\r\n\t var dirClassName = config.position == \"left\" ? \"webix_sidebar_popup_left\" : \"webix_sidebar_popup_right\";\r\n\t var subMenuPos = config.position == \"left\" ? \"right\" : \"left\";\r\n\r\n\t var menuTemplate = function menuTemplate(obj) {\r\n\t var icon = \"wxi-angle-\" + (config.position == \"left\" ? \"right\" : \"left\");\r\n\t var arrow = obj.submenu || obj.data ? \"
    \" : \"\";\r\n\t return arrow + obj.value;\r\n\t };\r\n\r\n\t var popupConfig = {\r\n\t view: \"popup\",\r\n\t css: \"webix_sidebar_popup \" + dirClassName + \" \" + config.css,\r\n\t autofit: false,\r\n\t width: this._fullWidth - this.config.collapsedWidth,\r\n\t borderless: true,\r\n\t padding: 0,\r\n\t body: {\r\n\t rows: [{\r\n\t view: \"template\",\r\n\t borderless: true,\r\n\t css: \"webix_sidebar_popup_title\",\r\n\t template: \"#value#\",\r\n\t height: this.config.titleHeight + 2,\r\n\t onClick: {\r\n\t webix_template: function webix_template() {\r\n\t var id = this.masterId;\r\n\t if (!master.getItem(id).$count) master.select(id);\r\n\t }\r\n\t }\r\n\t }, {\r\n\t view: \"menu\",\r\n\t submenu: \"data\",\r\n\t layout: \"y\",\r\n\t subMenuPos: subMenuPos,\r\n\t select: true,\r\n\t borderless: true,\r\n\t autoheight: true,\r\n\t css: \"webix_sidebar_popup_list \" + dirClassName + \" \" + config.css,\r\n\t template: menuTemplate,\r\n\t type: {\r\n\t subsign: false\r\n\t },\r\n\t submenuConfig: {\r\n\t padding: 0,\r\n\t subMenuPos: subMenuPos,\r\n\t template: menuTemplate,\r\n\t select: true,\r\n\t type: {\r\n\t subsign: false\r\n\t },\r\n\t css: \"webix_sidebar_popup_list \" + dirClassName + \" \" + config.css,\r\n\t on: {\r\n\t onShow: function onShow() {\r\n\t this.clearCss(\"webix_sidebar_selected\");\r\n\t this.unselectAll();\r\n\t var sel = master.getSelectedId();\r\n\t if (sel && this.exists(sel)) this.select(sel);else if (sel) master._markMenu(this, sel);\r\n\t },\r\n\t onBeforeSelect: function onBeforeSelect(id) {\r\n\t if (this.getSubMenu(id)) return false;\r\n\t },\r\n\t onAfterSelect: function onAfterSelect(id) {\r\n\t var menu = master.getPopup().queryView({\r\n\t view: \"menu\"\r\n\t });\r\n\t var parent = master.getParentId(id);\r\n\r\n\t while (parent) {\r\n\t var sub = menu.getMenu(parent);\r\n\r\n\t if (sub) {\r\n\t sub.unselectAll();\r\n\r\n\t master._markMenu(sub, id);\r\n\t }\r\n\r\n\t parent = master.getParentId(parent);\r\n\t }\r\n\r\n\t master._markMenu(this, id);\r\n\t }\r\n\t }\r\n\t },\r\n\t on: {\r\n\t onBeforeSelect: function onBeforeSelect(id) {\r\n\t if (this.getSubMenu(id)) return false;\r\n\t },\r\n\t onMenuItemClick: function onMenuItemClick(id) {\r\n\t if (!this.getSubMenu(id)) master.select(id);\r\n\t }\r\n\t }\r\n\t }]\r\n\t }\r\n\t };\r\n\t exports.extend(popupConfig, config.popup || {}, true);\r\n\t popup = ui(popupConfig);\r\n\r\n\t popup._onMasterSelect = function (id) {\r\n\t if (master && master.getParentId(id) == this.masterId) {\r\n\t addCss(this.$view, \"webix_sidebar_selected\", true);\r\n\t }\r\n\r\n\t if (master.config.collapsed && master.getItem(id).$level == 1) {\r\n\t addCss(this.$view, \"webix_selected\", true);\r\n\t }\r\n\t };\r\n\r\n\t popup.queryView({\r\n\t view: \"menu\"\r\n\t })._show_child_on_click = true;\r\n\t }\r\n\r\n\t popup.attachEvent(\"onBeforeShow\", function () {\r\n\t return config.collapsed;\r\n\t });\r\n\t this._destroy_with_me = [popup];\r\n\t config.popupId = popup.config.id;\r\n\r\n\t _event(document.body, \"mousemove\", function (e) {\r\n\t var trg = e.target || e.srcElement;\r\n\r\n\t if (!popup.config.hidden && !popup.$view.contains(trg) && !this.$view.firstChild.contains(trg) && !popup.queryView({\r\n\t view: \"menu\"\r\n\t })._open_sub_menu) {\r\n\t popup.hide();\r\n\t }\r\n\t }, {\r\n\t bind: this\r\n\t });\r\n\t },\r\n\t _markMenu: function _markMenu(view, sel, topOnly) {\r\n\t var css = \"webix_sidebar_selected\";\r\n\t view.data.each(function (obj) {\r\n\t if (this._isChild(sel, obj.id) && (!topOnly || this.getParentId(obj.id) == \"0\")) view.addCss(obj.id, css);else if (view.hasCss(obj.id, css)) view.removeCss(obj.id, css);\r\n\t }, this);\r\n\t },\r\n\t _isChild: function _isChild(cid, pid) {\r\n\t var parent = this.getParentId(cid);\r\n\t if (pid == parent) return true;\r\n\t if (parent) return this._isChild(parent, pid);\r\n\t return false;\r\n\t },\r\n\t getPopup: function getPopup() {\r\n\t return $$(this.config.popupId);\r\n\t },\r\n\t position_setter: function position_setter(value) {\r\n\t var newPos = value;\r\n\t var oldPos = value == \"left\" ? \"right\" : \"left\";\r\n\t removeCss(this.$view, \"webix_sidebar_\" + oldPos);\r\n\t addCss(this.$view, \"webix_sidebar_\" + newPos, true);\r\n\t var popup = this.getPopup();\r\n\r\n\t if (popup) {\r\n\t var popupEl = popup.$view;\r\n\t removeCss(popupEl, \"webix_sidebar_popup_\" + oldPos);\r\n\t addCss(popupEl, \"webix_sidebar_popup_\" + newPos, true);\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\t collapse: function collapse() {\r\n\t this.define(\"collapsed\", true);\r\n\t },\r\n\t expand: function expand() {\r\n\t this.define(\"collapsed\", false);\r\n\t },\r\n\t toggle: function toggle() {\r\n\t var collapsed = !this.config.collapsed;\r\n\t this.define(\"collapsed\", collapsed);\r\n\t },\r\n\t collapsed_setter: function collapsed_setter(value) {\r\n\t var width;\r\n\r\n\t if (!value) {\r\n\t width = this._fullWidth;\r\n\t this.type.collapsed = false;\r\n\t addCss(this.$view, \"webix_sidebar_expanded\", true);\r\n\t } else {\r\n\t width = this.config.collapsedWidth;\r\n\t this.closeAll();\r\n\t this.type.collapsed = true;\r\n\t removeCss(this.$view, \"webix_sidebar_expanded\");\r\n\t }\r\n\r\n\t this.define(\"width\", width);\r\n\t this.resize();\r\n\t return value;\r\n\t }\r\n\t};\r\n\ttype(tree.view, {\r\n\t name: \"sideBar\",\r\n\t height: \"auto\",\r\n\t css: \"webix_sidebar\",\r\n\t template: function template(obj, common) {\r\n\t if (common.collapsed) return common.icon(obj, common);\r\n\t return common.arrow(obj, common) + common.icon(obj, common) + \"\" + obj.value + \"\";\r\n\t },\r\n\t arrow: function arrow(obj) {\r\n\t var html = \"\";\r\n\r\n\t for (var i = 1; i <= obj.$level; i++) {\r\n\t if (i == obj.$level && obj.$count) {\r\n\t var icon = \"wxi-angle-\" + (obj.open ? \"down\" : \"left\");\r\n\t var className = \"webix_sidebar_dir_icon webix_icon \" + icon;\r\n\t html += \"\";\r\n\t }\r\n\t }\r\n\r\n\t return html;\r\n\t },\r\n\t icon: function icon(obj) {\r\n\t var style = \"\";\r\n\r\n\t if (obj.$level > 2) {\r\n\t style = \"style=\\\"padding-left:\" + 40 * (obj.$level - 2) + \"px\\\"\";\r\n\t }\r\n\r\n\t if (obj.icon) return \"\";\r\n\t return \"\";\r\n\t }\r\n\t});\r\n\tvar view$1y = exports.protoUI(api$1y, tree.view);\r\n\r\n\tvar api$1z = {\r\n\t name: \"context\"\r\n\t};\r\n\tvar view$1z = exports.protoUI(api$1z, ContextHelper, popup.view);\r\n\r\n\tvar api$1A = {\r\n\t name: \"contextmenu\",\r\n\t _hide_on_item_click: true,\r\n\t $init: function $init(config) {\r\n\t if (config.submenuConfig) exports.extend(config, config.submenuConfig);\r\n\t }\r\n\t};\r\n\tvar view$1A = exports.protoUI(api$1A, ContextHelper, submenu.view);\r\n\r\n\tvar api$1B = {\r\n\t name: \"treetable\",\r\n\t $init: function $init() {\r\n\t exports.extend(this.data, TreeStore, true);\r\n\t exports.extend(this.type, TreeType);\r\n\t exports.extend(this, TreeDataMove, true);\r\n\r\n\t for (var key in TreeClick) {\r\n\t if (!this.on_click[key]) this.on_click[key] = this._unwrap_id(TreeClick[key]);\r\n\t }\r\n\r\n\t this.type.treetable = template(\"{common.space()}{common.icon()} {common.folder()}\");\r\n\r\n\t this.type.treecheckbox = function (obj) {\r\n\t if (obj.indeterminate && !obj.nocheckbox) return \"
    \";else return TreeType.checkbox.apply(this, arguments);\r\n\t };\r\n\r\n\t this.data.provideApi(this, true);\r\n\r\n\t this._viewobj.setAttribute(\"role\", \"treegrid\");\r\n\t },\r\n\t _drag_order_complex: false,\r\n\t _unwrap_id: function _unwrap_id(original) {\r\n\t return function (e, id) {\r\n\t id = id.row;\r\n\t return original.call(this, e, id);\r\n\t };\r\n\t },\r\n\t getState: function getState() {\r\n\t var state = DataState.getState.call(this);\r\n\t exports.extend(state, TreeAPI.getState.call(this));\r\n\t return state;\r\n\t },\r\n\t setState: function setState(state) {\r\n\t if (TreeAPI.setState.call(this, state)) {\r\n\t //run grid-state only when tree component was fully loaded \r\n\t DataState.setState.call(this, state);\r\n\t }\r\n\t },\r\n\t clipboard_setter: function clipboard_setter(value) {\r\n\t exports.extend(this._paste, TreeTablePaste);\r\n\t return TablePaste.clipboard_setter.call(this, value);\r\n\t },\r\n\t _run_load_next: function _run_load_next(conf, direction) {\r\n\t for (var i = 0; i < conf.start; i++) {\r\n\t var id = this.data.order[i];\r\n\t if (id && this.getItem(id).$level != 1) conf.start--;\r\n\t }\r\n\r\n\t return datatable.api._run_load_next.call(this, conf, direction);\r\n\t }\r\n\t};\r\n\tvar view$1B = exports.protoUI(api$1B, TreeAPI, TreeStateCheckbox, TreeDataLoader, datatable.view);\r\n\r\n\t/* eslint no-constant-condition: 0 */\r\n\r\n\t/* eslint no-inner-declarations: 0 */\r\n\r\n\t{\r\n\t var get_inspector_config = function get_inspector_config(view) {\r\n\t var values = {};\r\n\t var options = [];\r\n\t view = $$(view);\r\n\r\n\t for (var key in view.config) {\r\n\t if (ignore[key]) continue;\r\n\t if (_typeof(view.config[key]) == \"object\") continue;\r\n\t if (typeof view.config[key] == \"undefined\") continue;\r\n\t if (typeof view.config[key] == \"function\") continue;\r\n\t if (key == \"view\" || key == \"id\") options.push({\r\n\t label: key,\r\n\t id: key\r\n\t });else options.push({\r\n\t label: key,\r\n\t type: \"text\",\r\n\t id: key\r\n\t });\r\n\t if (view.defaults[key] == view.config[key]) options[options.length - 1].css = {\r\n\t \"color\": \"#888\"\r\n\t };\r\n\t values[key] = view.config[key];\r\n\t }\r\n\r\n\t options.sort(function (a, b) {\r\n\t if (!a.css && b.css) return -1;\r\n\t if (a.css && !b.css) return 1;\r\n\t return a.id > b.id ? 1 : a.id == b.id ? 0 : -1;\r\n\t });\r\n\t return {\r\n\t elements: options,\r\n\t data: values,\r\n\t head: \" [\" + view.name + \"] \" + view._settings.id + \"\"\r\n\t };\r\n\t };\r\n\r\n\t var create_inspector = function create_inspector() {\r\n\t if (!$$(\"webix_debug_inspector_win\")) ui({\r\n\t id: \"webix_debug_inspector_win\",\r\n\t view: \"window\",\r\n\t top: 2,\r\n\t left: 0,\r\n\t width: 350,\r\n\t height: 350,\r\n\t head: false,\r\n\t autofit: false,\r\n\t body: {\r\n\t cols: [{\r\n\t width: 10\r\n\t }, {\r\n\t type: \"clean\",\r\n\t rows: [{\r\n\t view: \"toolbar\",\r\n\t elements: [{\r\n\t view: \"label\",\r\n\t value: \"\",\r\n\t id: \"webix_debug_inspector_head\"\r\n\t }, {\r\n\t view: \"button\",\r\n\t width: 100,\r\n\t value: \"Hide\",\r\n\t type: \"custom\",\r\n\t click: function click() {\r\n\t show_inspector();\r\n\t }\r\n\t }]\r\n\t }, {\r\n\t id: \"webix_debug_inspector\",\r\n\t nameWidth: 150,\r\n\t view: \"property\",\r\n\t scroll: \"y\",\r\n\t elements: [],\r\n\t on: {\r\n\t onaftereditstop: function onaftereditstop(state, editor) {\r\n\t if (state.old == state.value) return;\r\n\t var value = state.value;\r\n\r\n\t if (value === \"true\" || value === \"false\") {\r\n\t value = value === \"true\";\r\n\t } else {\r\n\t var intvalue = parseInt(value, 10);\r\n\t if (intvalue == value) value = intvalue;\r\n\t }\r\n\r\n\t var view = $$(this.config.view);\r\n\t view.define(editor.id, value);\r\n\t if (view.refreshColumns) view.refreshColumns();else if (view.refresh) view.refresh();\r\n\t view.resize();\r\n\t }\r\n\t }\r\n\t }]\r\n\t }]\r\n\t }\r\n\t });\r\n\t };\r\n\r\n\t var show_inspector = function show_inspector(view, ev) {\r\n\t create_inspector();\r\n\t var win = $$(\"webix_debug_inspector_win\");\r\n\r\n\t if (view) {\r\n\t var config = get_inspector_config(view);\r\n\t var winx = document.body.offsetWidth;\r\n\t var winy = document.body.offsetHeight;\r\n\t var pos$$1 = ev ? pos(ev) : {\r\n\t x: 0,\r\n\t y: 0\r\n\t };\r\n\t win.define(\"height\", Math.max(350, winy - 4));\r\n\t win.resize();\r\n\t var props = $$(\"webix_debug_inspector\");\r\n\t props.define(\"elements\", config.elements);\r\n\t props.define(\"view\", view);\r\n\t win.show({\r\n\t x: pos$$1.x > winx / 2 ? 0 : winx - 370,\r\n\t y: 0\r\n\t });\r\n\t $$(\"webix_debug_inspector\").setValues(config.data);\r\n\t $$(\"webix_debug_inspector_head\").setValue(config.head);\r\n\t } else win.hide();\r\n\t };\r\n\r\n\t var infi = function infi(value) {\r\n\t if (value >= 100000) return \"Any\";\r\n\t return value;\r\n\t };\r\n\r\n\t var log_level = function log_level(data, prefix, now) {\r\n\t window.console.log((data == now ? \">>\" : \" \") + prefix + data.name + \" / \" + data.config.id);\r\n\t prefix += \" \";\r\n\t if (data._cells) for (var i = 0; i < data._cells.length; i++) {\r\n\t log_level(data._cells[i], prefix, now);\r\n\t }\r\n\t if (data._head_cell) log_level(data._head_cell, prefix, now);\r\n\t if (data._body_cell) log_level(data._body_cell, prefix, now);\r\n\t };\r\n\r\n\t attachEvent(\"onLoadError\", function (text, xml, xhttp, owner) {\r\n\t text = text || \"[EMPTY DATA]\";\r\n\t var error_text = \"Data loading error, check console for details\";\r\n\t if (text.indexOf(\"not as file://\",\r\n\t expire: -1\r\n\t });\r\n\t }\r\n\t });\r\n\t var ignore = {\r\n\t \"_inner\": true,\r\n\t \"awidth\": true,\r\n\t \"cheight\": true,\r\n\t \"bheight\": true,\r\n\t \"aheight\": true\r\n\t };\r\n\t var uiConfig = {\r\n\t view: \"contextmenu\",\r\n\t id: \"webix:debugmenu\",\r\n\t on: {\r\n\t onBeforeShow: function onBeforeShow(e) {\r\n\t if (!e.ctrlKey) return false;\r\n\t var view = locate(e, \"view_id\");\r\n\t if (!view) return false;\r\n\t this.config.lastTarget = view;\r\n\t blockEvent();\r\n\t delay(function () {\r\n\t unblockEvent();\r\n\t });\r\n\t },\r\n\t onShow: function onShow() {\r\n\t var view = $$(this.config.lastTarget);\r\n\t var info = \"\" + view._settings.id + \"[\" + view.name + \"]\";\r\n\t document.getElementById(\"webix_debug_cmx\").innerHTML = info;\r\n\t }\r\n\t },\r\n\t data: [\"
    \", {\r\n\t id: \"inspect\",\r\n\t value: \"Inspect\"\r\n\t }, {\r\n\t id: \"docs\",\r\n\t value: \"Documentation\"\r\n\t }, {\r\n\t value: \"Log to Console\",\r\n\t submenu: [{\r\n\t id: \"size\",\r\n\t value: \"Sizes\"\r\n\t }, {\r\n\t id: \"tree\",\r\n\t value: \"Tree\"\r\n\t }, {\r\n\t id: \"dump\",\r\n\t value: \"Dump\"\r\n\t }]\r\n\t }],\r\n\t click: function click(id, ev) {\r\n\t //mixing two object result in confusion\r\n\t var obj = $$(this.config.lastTarget);\r\n\r\n\t if (id == \"dump\") {\r\n\t window.console.info(\"\\n\" + obj.name + \" / \" + obj.config.id);\r\n\t window.console.log(\"\\nView: \", obj, \", Config: \", obj.config, \", Data: \", obj.data);\r\n\t window.console.log(obj.$view);\r\n\t }\r\n\r\n\t if (id == \"tree\") {\r\n\t var now = obj;\r\n\r\n\t while (obj.getParentView()) {\r\n\t obj = obj.getParentView();\r\n\t }\r\n\r\n\t window.console.log(\"\");\r\n\t log_level(obj, \"\", now);\r\n\t }\r\n\r\n\t if (id == \"size\") {\r\n\t window.console.info(\"\");\r\n\t window.console.info(\"\\n\" + obj.name + \" / \" + obj.config.id);\r\n\t window.console.info(\"\\n[min] \", obj.config.width, \" x \", obj.config.height);\r\n\t var sizes = obj.$getSize(0, 0);\r\n\t window.console.info(\"[max] \", infi(sizes[1]), \" x \", infi(sizes[3]) + (obj.config.autoheight ? \", auto height\" : \"\"));\r\n\t window.console.info(\"[gravity] \", obj.config.gravity);\r\n\t window.console.info(\"\\n[content] \", obj._content_width, \" x \", obj._content_height);\r\n\t window.console.info(\"[last set] \", obj._last_size[0], \" x \", obj._last_size[1]);\r\n\t if (obj._settings._inner) window.console.info(\"\\n[borders] \", \"left:\", !obj._settings._inner.left, \"\\ttop:\", !obj._settings._inner.top, \"\\tright:\", !obj._settings._inner.right, \"\\tbottom:\", !obj._settings._inner.bottom);else window.console.info(\"\\n[borders] none\");\r\n\t }\r\n\r\n\t if (id == \"docs\") window.open(\"http://docs.webix.com/api__refs__ui.\" + obj.name + \".html\", \"__blank\");\r\n\r\n\t if (id == \"inspect\") {\r\n\t show_inspector(this.config.lastTarget, ev);\r\n\t }\r\n\t }\r\n\t };\r\n\t ready(function () {\r\n\t uiConfig.master = document.body;\r\n\t ui(uiConfig);\r\n\t });\r\n\t}\r\n\r\n\tvar DataRecord = exports.proto({\r\n\t name: \"DataRecord\",\r\n\t isVisible: function isVisible() {\r\n\t return true;\r\n\t },\r\n\t $init: function $init(config) {\r\n\t this.data = config || {};\r\n\t var id = config && config.id ? config.id : uid();\r\n\t this._settings = {\r\n\t id: id\r\n\t };\r\n\t ui.views[id] = this;\r\n\t },\r\n\t getValues: function getValues() {\r\n\t return this.data;\r\n\t },\r\n\t setValues: function setValues(data, update) {\r\n\t this.data = update ? exports.extend(this.data, data, true) : data;\r\n\t this.callEvent(\"onChange\", [data]);\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this.callEvent(\"onBindRequest\");\r\n\t }\r\n\t}, EventSystem, BaseBind, AtomDataLoader, Settings);\r\n\r\n\tvar DataValue = exports.proto({\r\n\t name: \"DataValue\",\r\n\t isVisible: function isVisible() {\r\n\t return true;\r\n\t },\r\n\t $init: function $init(config) {\r\n\t if (!config || isUndefined(config.value)) this.data = config || \"\";\r\n\t var id = config && config.id ? config.id : uid();\r\n\t this._settings = {\r\n\t id: id\r\n\t };\r\n\t ui.views[id] = this;\r\n\t },\r\n\t setValue: function setValue(value) {\r\n\t this.data = value;\r\n\t this.callEvent(\"onChange\", [value]);\r\n\t },\r\n\t getValue: function getValue() {\r\n\t return this.data;\r\n\t },\r\n\t refresh: function refresh() {\r\n\t this.callEvent(\"onBindRequest\");\r\n\t }\r\n\t}, EventSystem, BaseBind);\r\n\r\n\tvar TreeCollection = exports.proto({\r\n\t name: \"TreeCollection\",\r\n\t $init: function $init() {\r\n\t exports.extend(this.data, TreeStore, true);\r\n\t this.data.provideApi(this, true);\r\n\t exports.extend(this, TreeDataMove, true);\r\n\t }\r\n\t}, TreeDataLoader, DataCollection);\r\n\r\n\texports.Date = wDate;\r\n\texports.Number = Number;\r\n\texports.promise = Deferred;\r\n\texports.DataCollection = DataCollection;\r\n\texports.DataRecord = DataRecord;\r\n\texports.DataValue = DataValue;\r\n\texports.TreeCollection = TreeCollection;\r\n\texports.ActiveContent = ActiveContent;\r\n\texports.AtomDataLoader = AtomDataLoader;\r\n\texports.AtomRender = AtomRender;\r\n\texports.AutoScroll = AutoScroll;\r\n\texports.AutoTooltip = AutoTooltip;\r\n\texports.BaseBind = BaseBind;\r\n\texports.BindSource = BindSource;\r\n\texports.Canvas = Canvas;\r\n\texports.CodeParser = CodeParser;\r\n\texports.CollectionBind = CollectionBind;\r\n\texports.ContextHelper = ContextHelper;\r\n\texports.CopyPaste = CopyPaste;\r\n\texports.CustomPrint = CustomPrint;\r\n\texports.CustomScroll = CustomScroll;\r\n\texports.DataMarks = DataMarks;\r\n\texports.DataMove = DataMove;\r\n\texports.DataLoader = DataLoader;\r\n\texports.DataState = DataState;\r\n\texports.DataStore = DataStore;\r\n\texports.Destruction = Destruction;\r\n\texports.DragControl = DragControl;\r\n\texports.DragItem = DragItem;\r\n\texports.DragOrder = DragOrder;\r\n\texports.EditAbility = EditAbility;\r\n\texports.EventSystem = EventSystem;\r\n\texports.FlexLayout = FlexLayout;\r\n\texports.Group = Group;\r\n\texports.GroupMethods = GroupMethods;\r\n\texports.GroupStore = GroupStore;\r\n\texports.HTMLOptions = HTMLOptions;\r\n\texports.HtmlMap = HtmlMap;\r\n\texports.IdSpace = IdSpace;\r\n\texports.KeysNavigation = KeysNavigation;\r\n\texports.MapCollection = MapCollection;\r\n\texports.Modality = Modality;\r\n\texports.MouseEvents = MouseEvents;\r\n\texports.Movable = Movable;\r\n\texports.NavigationButtons = NavigationButtons;\r\n\texports.OverlayBox = OverlayBox;\r\n\texports.PagingAbility = PagingAbility;\r\n\texports.ProgressBar = ProgressBar;\r\n\texports.RecordBind = RecordBind;\r\n\texports.RenderStack = RenderStack;\r\n\texports.ResizeArea = ResizeArea;\r\n\texports.SingleRender = SingleRender;\r\n\texports.Scrollable = Scrollable;\r\n\texports.SelectionModel = SelectionModel;\r\n\texports.Settings = Settings;\r\n\texports.Sparklines = Sparklines;\r\n\texports.TablePaste = TablePaste;\r\n\texports.Touch = Touch;\r\n\texports.TreeAPI = TreeAPI;\r\n\texports.TreeClick = TreeClick;\r\n\texports.TreeDataLoader = TreeDataLoader;\r\n\texports.TreeDataMove = TreeDataMove;\r\n\texports.TreeRenderStack = TreeRenderStack;\r\n\texports.TreeStateCheckbox = TreeStateCheckbox;\r\n\texports.TreeStore = TreeStore;\r\n\texports.TreeTablePaste = TreeTablePaste;\r\n\texports.TreeType = TreeType;\r\n\texports.UIManager = UIManager;\r\n\texports.Undo = Undo;\r\n\texports.UploadDriver = UploadDriver;\r\n\texports.ValidateCollection = ValidateCollection;\r\n\texports.ValidateData = ValidateData;\r\n\texports.ValueBind = ValueBind;\r\n\texports.Values = Values;\r\n\texports.VirtualRenderStack = VirtualRenderStack;\r\n\texports.VRenderStack = VRenderStack;\r\n\texports.html = html;\r\n\texports.skin = skin$6;\r\n\texports.debug = debug;\r\n\texports.i18n = i18n;\r\n\texports.ready = ready;\r\n\texports.env = env;\r\n\texports.color = color;\r\n\texports.csv = csv$1;\r\n\texports.clipbuffer = clipbuffer;\r\n\texports.history = history;\r\n\texports.storage = storage;\r\n\texports.template = template;\r\n\texports.type = type;\r\n\texports.markup = markup;\r\n\texports.editors = editors;\r\n\texports.animate = animate;\r\n\texports.print = print;\r\n\texports.rules = rules;\r\n\texports.patterns = patterns;\r\n\texports.version = version$1;\r\n\texports.name = name$1;\r\n\texports.level_in = level_in;\r\n\texports.level_out = level_out;\r\n\texports.clone = clone;\r\n\texports.copy = copy;\r\n\texports.single = single;\r\n\texports.bind = bind;\r\n\texports.exec = exec;\r\n\texports.wrap = wrap;\r\n\texports.isUndefined = isUndefined;\r\n\texports.delay = delay;\r\n\texports.once = once;\r\n\texports.uid = uid;\r\n\texports.toNode = toNode;\r\n\texports.toArray = toArray;\r\n\texports.toFunctor = toFunctor;\r\n\texports.isArray = isArray;\r\n\texports.isDate = isDate;\r\n\texports.PowerArray = PowerArray;\r\n\texports._events_final_destructor = _events_final_destructor;\r\n\texports._event = _event;\r\n\texports.event = event$1;\r\n\texports.eventRemove = eventRemove;\r\n\texports.callEvent = callEvent;\r\n\texports.attachEvent = attachEvent;\r\n\texports.detachEvent = detachEvent;\r\n\texports.blockEvent = blockEvent;\r\n\texports.unblockEvent = unblockEvent;\r\n\texports.mapEvent = mapEvent;\r\n\texports.hasEvent = hasEvent;\r\n\texports.stringify = stringify;\r\n\texports.toPNG = toPNG;\r\n\texports.toExcel = toExcel;\r\n\texports.toCSV = toCSV;\r\n\texports.toPDF = toPDF;\r\n\texports.alert = alert;\r\n\texports.confirm = confirm;\r\n\texports.modalbox = modalbox;\r\n\texports.message = message;\r\n\texports.editStop = editStop;\r\n\texports.ajax = ajax;\r\n\texports.jsonp = jsonp;\r\n\texports.DataDriver = DataDriver;\r\n\texports.dp = dp;\r\n\texports.DataProcessor = DataProcessor;\r\n\texports.remote = remote;\r\n\texports.require = require;\r\n\texports.proxy = proxy$b;\r\n\texports.send = send;\r\n\texports.ui = ui;\r\n\texports.$$ = $$;\r\n\r\n\tObject.defineProperty(exports, '__esModule', { value: true });\r\n\r\n})));\r\n","var xhr;\r\n\r\nwebix.editors.popupWindowCombo = {\r\n focus: function () {\r\n this.getInputNode(this.node).focus();\r\n this.getInputNode(this.node).select();\r\n },\r\n getValue: function () {\r\n return this.getInputNode(this.node).value;\r\n },\r\n setValue: function (value) {\r\n this.getInputNode(this.node).value = value;\r\n },\r\n getInputNode: function () {\r\n return this.node.firstChild;\r\n },\r\n render: function () {\r\n return webix.html.create(\"div\", {\r\n \"class\": \"webix_dt_editor\"\r\n }, \"\");\r\n }\r\n};\r\n\r\nwebix.editors.number = {\r\n focus: function () {\r\n this.getInputNode(this.node).focus();\r\n this.getInputNode(this.node).select();\r\n },\r\n getValue: function () {\r\n return this.getInputNode(this.node).value;\r\n },\r\n setValue: function (value) {\r\n this.getInputNode(this.node).value = value;\r\n },\r\n getInputNode: function () {\r\n return this.node.firstChild;\r\n },\r\n render: function () {\r\n return webix.html.create(\"div\", {\r\n \"class\": \"webix_dt_editor\"\r\n }, \"\");\r\n }\r\n};\r\n\r\nwebix.editors.startTime = {\r\n focus: function () {\r\n this.getInputNode(this.node).focus();\r\n this.getInputNode(this.node).select();\r\n },\r\n getValue: function () {\r\n return this.getInputNode(this.node).value;\r\n },\r\n setValue: function (value) {\r\n this.getInputNode(this.node).value = value;\r\n },\r\n getInputNode: function () {\r\n return this.node.firstChild;\r\n },\r\n render: function () {\r\n return webix.html.create(\"div\", {\r\n \"class\": \"webix_dt_editor\"\r\n }, \"\");\r\n }\r\n};\r\n\r\nwebix.editors.stopTime = {\r\n focus: function () {\r\n this.getInputNode(this.node).focus();\r\n this.getInputNode(this.node).select();\r\n },\r\n getValue: function () {\r\n return this.getInputNode(this.node).value;\r\n },\r\n setValue: function (value) {\r\n this.getInputNode(this.node).value = value;\r\n },\r\n getInputNode: function () {\r\n return this.node.firstChild;\r\n },\r\n render: function () {\r\n return webix.html.create(\"div\", {\r\n \"class\": \"webix_dt_editor\"\r\n }, \"\");\r\n }\r\n};\r\n\r\nwebix.proxy.valueLookupProxy = {\r\n $proxy: true,\r\n load: function (view, callback, requestParams) {\r\n var rowData = JSON.stringify(requestParams.rowData);\r\n if (xhr && xhr.readyState != 4) {\r\n xhr.abort();\r\n }\r\n xhr = $.ajax({\r\n dataType: \"json\",\r\n url: \"/timecard/GetCellPossibleValues\",\r\n type: 'POST',\r\n contentType: 'application/json',\r\n headers: { 'X-XSRF-Token': $('input[name=\"__RequestVerificationToken\"]').val() },\r\n data: rowData,\r\n success: function (response) {\r\n var possibleValues = response.PossibleValues;\r\n for (var i = 0; i < possibleValues.length; i++) {\r\n possibleValues[i].Value = possibleValues[i].Value.replace(/(\\r\\n|\\n|\\r)/gm, \"\");\r\n possibleValues[i].PopUpLabel = possibleValues[i].Label.replace(/(\\r\\n|\\n|\\r)/gm, \"\");\r\n possibleValues[i].Label = escapeHtml(possibleValues[i].Label.replace(/(\\r\\n|\\n|\\r)/gm, \"\"));\r\n }\r\n if (requestParams.currentCell.column == \"Employee\") {\r\n requestParams.employeesToExclude;\r\n var callcount = 0;\r\n for (var i = possibleValues.length - 1; i >= 0; i--) {\r\n if (requestParams.employeesToExclude.indexOf(possibleValues[i].Value) > -1) {\r\n possibleValues.splice(i, 1);\r\n callcount++;\r\n if (callcount == requestParams.employeesToExclude.length)\r\n break;\r\n }\r\n }\r\n }\r\n var options = [];\r\n for (var i = 0; i < possibleValues.length; i++) {\r\n var option = {}\r\n option.id = possibleValues[i].Value + \"@row_\" + requestParams.currentCell.row;\r\n option.value = possibleValues[i].Label;\r\n option.popUpLabel = possibleValues[i].PopUpLabel;\r\n options.push(option);\r\n }\r\n //bind employee list if current request is for employee\r\n\r\n lastUsedList = options;\r\n view.parse(options);\r\n \r\n if (callback.length > 1) {\r\n callback[1](options);\r\n }\r\n \r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction escapeHtml(unsafe) {\r\n return unsafe\r\n .replace(/&/g, \"&\")\r\n .replace(//g, \">\")\r\n .replace(/\"/g, \""\")\r\n .replace(/'/g, \"'\");\r\n}\r\n\r\nwebix.ui.datafilter.summFixedColumn = webix.extend({\r\n refresh: function (master, node, value) {\r\n var result = 0;\r\n var num = 0;\r\n var expenses = 0;\r\n master.mapCells(null, value.columnId, null, 1, function (value, row_id) {\r\n var valueCopy = value;\r\n if ($$(\"crewTimecard\") != null && $$(\"crewTimecard\").getItem(row_id) != null) {\r\n var row = $$(\"crewTimecard\").getItem(row_id);\r\n var exclude = false;\r\n if (row.Type != null && row.Type != \"\") {\r\n var index = row.Type.indexOf(\"@\");\r\n var typeValue = index > -1 ? row.Type.substr(0, index) : row.Type;\r\n if (typeValue == \"S\") {\r\n if (row.SMPayType != null && row.SMPayType != \"\" && row.SMPayType != \"null\") {\r\n var payType = row.SMPayType.substr(0, row.SMPayType.indexOf(\"@\"));\r\n if (amountPayTypes.indexOf(payType) > -1) {\r\n exclude = true;\r\n }\r\n }\r\n }\r\n else {\r\n if (row.EarnCode != null && row.EarnCode != \"\" && row.EarnCode != \"null\") {\r\n var earnCode = row.EarnCode.substr(0, row.EarnCode.indexOf(\"@\"));\r\n if (amountEarnCodes.indexOf(earnCode) > -1) {\r\n exclude = true;\r\n }\r\n }\r\n }\r\n\r\n }\r\n else {\r\n if (row.EarnCode != null && row.EarnCode != \"\" && row.EarnCode != \"null\") {\r\n var earnCode = row.EarnCode.substr(0, row.EarnCode.indexOf(\"@\"));\r\n if (amountEarnCodes.indexOf(earnCode) > -1) {\r\n exclude = true;\r\n }\r\n }\r\n }\r\n if (!exclude) {\r\n valueCopy = valueCopy * 1;\r\n if (!isNaN(valueCopy))\r\n result += valueCopy;\r\n\r\n }\r\n else {\r\n if (!isNaN(valueCopy)) {\r\n expenses += parseFloat(valueCopy);\r\n }\r\n }\r\n return value;\r\n\r\n }\r\n else {\r\n valueCopy = value * 1;\r\n if (!isNaN(valueCopy))\r\n result += valueCopy;\r\n return value;\r\n }\r\n });\r\n //scope.expenses = expenses;\r\n node.firstChild.innerHTML = result.toFixed(2);\r\n }\r\n}, webix.ui.datafilter.summColumn);"],"names":[],"sourceRoot":"webpack:///","x_google_ignoreList":[]}