{"version":3,"sources":["jsdelivr-header.js","/npm/knockout@3.4.2/build/output/knockout-latest.debug.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;CCEC,SAAS,GAGN,IAKM,EALF,EAAS,OAAQ,EAAI,MAAM,QAC3B,EAAW,EAAiB,SAC5B,EAAY,EAAkB,UAC9B,EAAiB,EAAe,OAChC,EAAO,EAAa,KAClB,EAYR,SAAS,EAAW,GAGtB,IAAI,OAA0B,IAAd,EAA4B,EAAY,CAAC,EAEzD,EAAG,aAAe,SAAS,EAAQ,GAO/B,IANA,IAAI,EAAS,EAAO,MAAM,KAItB,EAAS,EAEJ,EAAI,EAAG,EAAI,EAAO,OAAS,EAAG,IACnC,EAAS,EAAO,EAAO,IAC3B,EAAO,EAAO,EAAO,OAAS,IAAM,CACxC,EACA,EAAG,eAAiB,SAAS,EAAO,EAAY,GAC5C,EAAM,GAAc,CACxB,EACA,EAAG,QAAU,QAEb,EAAG,aAAa,UAAW,EAAG,SAE9B,EAAG,QAAU,CACT,cAAgB,EAChB,qBAAuB,GAI3B,EAAG,MAAS,WACR,SAAS,EAAc,EAAK,GACxB,IAAK,IAAI,KAAQ,EACT,EAAI,eAAe,IACnB,EAAO,EAAM,EAAI,GAG7B,CAEA,SAAS,EAAO,EAAQ,GACpB,GAAI,EACA,IAAI,IAAI,KAAQ,EACT,EAAO,eAAe,KACrB,EAAO,GAAQ,EAAO,IAIlC,OAAO,CACX,CAEA,SAAS,EAAe,EAAK,GAEzB,OADA,EAAI,UAAY,EACT,CACX,CAEA,IAAI,EAAmB,CAAE,UAAW,cAAgB,MAIhD,EAAc,CAAC,EAAG,EAA6B,CAAC,EAEpD,EADwB,GAAa,cAAc,KAAK,EAAU,WAAc,gBAAkB,YAClE,CAAC,QAAS,UAAW,YACrD,EAAyB,YAAI,CAAC,QAAS,WAAY,YAAa,UAAW,YAAa,YAAa,WAAY,aAAc,cAC/H,EAAc,GAAa,SAAS,EAAW,GAC3C,GAAI,EAAmB,OACnB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAmB,OAAQ,EAAI,EAAG,IAClD,EAA2B,EAAmB,IAAM,CAEhE,IACA,IAAI,EAA6C,CAAE,gBAAkB,GAMjE,EAAY,GAAa,WAIzB,IAHA,IAAI,EAAU,EAAG,EAAM,EAAS,cAAc,OAAQ,EAAS,EAAI,qBAAqB,KAIpF,EAAI,UAAY,uBAAsB,EAAW,2BACjD,EAAO,KAEX,OAAO,EAAU,EAAI,EAAU,CACnC,CAT4B,GAsBxB,EAAoB,OAoBxB,SAAS,EAAgC,EAAK,EAAM,EAAY,GAE5D,IAAI,EAAoB,EAAI,GAAM,MAAM,IAAsB,GAC9D,EAAG,MAAM,aAAa,EAAW,MAAM,IAAoB,SAAS,GAChE,EAAG,MAAM,gBAAgB,EAAmB,EAAW,EAC3D,IACA,EAAI,GAAQ,EAAkB,KAAK,IACvC,CAEA,MAAO,CACH,2BAA4B,CAAC,qBAAsB,sCAEnD,aAAc,SAAU,EAAO,GAC3B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,EAAI,EAAG,IACrC,EAAO,EAAM,GAAI,EACzB,EAEA,aAAc,SAAU,EAAO,GAC3B,GAAsC,mBAA3B,MAAM,UAAU,QACvB,OAAO,MAAM,UAAU,QAAQ,KAAK,EAAO,GAC/C,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,EAAI,EAAG,IACrC,GAAI,EAAM,KAAO,EACb,OAAO,EACf,OAAQ,CACZ,EAEA,WAAY,SAAU,EAAO,EAAW,GACpC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,EAAI,EAAG,IACrC,GAAI,EAAU,KAAK,EAAgB,EAAM,GAAI,GACzC,OAAO,EAAM,GACrB,OAAO,IACX,EAEA,gBAAiB,SAAU,EAAO,GAC9B,IAAI,EAAQ,EAAG,MAAM,aAAa,EAAO,GACrC,EAAQ,EACR,EAAM,OAAO,EAAO,GAEL,IAAV,GACL,EAAM,OAEd,EAEA,uBAAwB,SAAU,GAG9B,IADA,IAAI,EAAS,GACJ,EAAI,EAAG,GAFhB,EAAQ,GAAS,IAES,OAAQ,EAAI,EAAG,IACjC,EAAG,MAAM,aAAa,EAAQ,EAAM,IAAM,GAC1C,EAAO,KAAK,EAAM,IAE1B,OAAO,CACX,EAEA,SAAU,SAAU,EAAO,GAGvB,IADA,IAAI,EAAS,GACJ,EAAI,EAAG,GAFhB,EAAQ,GAAS,IAES,OAAQ,EAAI,EAAG,IACrC,EAAO,KAAK,EAAQ,EAAM,GAAI,IAClC,OAAO,CACX,EAEA,YAAa,SAAU,EAAO,GAG1B,IADA,IAAI,EAAS,GACJ,EAAI,EAAG,GAFhB,EAAQ,GAAS,IAES,OAAQ,EAAI,EAAG,IACjC,EAAU,EAAM,GAAI,IACpB,EAAO,KAAK,EAAM,IAC1B,OAAO,CACX,EAEA,aAAc,SAAU,EAAO,GAC3B,GAAI,aAAwB,MACxB,EAAM,KAAK,MAAM,EAAO,QAExB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAa,OAAQ,EAAI,EAAG,IAC5C,EAAM,KAAK,EAAa,IAChC,OAAO,CACX,EAEA,gBAAiB,SAAS,EAAO,EAAO,GACpC,IAAI,EAAqB,EAAG,MAAM,aAAa,EAAG,MAAM,eAAe,GAAQ,GAC3E,EAAqB,EACjB,GACA,EAAM,KAAK,GAEV,GACD,EAAM,OAAO,EAAoB,EAE7C,EAEA,gBAAiB,EAEjB,OAAQ,EAER,eAAgB,EAEhB,uBAAwB,EAAkB,EAAiB,EAE3D,cAAe,EAEf,UAAW,SAAS,EAAQ,GACxB,IAAK,EACD,OAAO,EACX,IAAI,EAAS,CAAC,EACd,IAAK,IAAI,KAAQ,EACT,EAAO,eAAe,KACtB,EAAO,GAAQ,EAAQ,EAAO,GAAO,EAAM,IAGnD,OAAO,CACX,EAEA,aAAc,SAAU,GACpB,KAAO,EAAQ,YACX,EAAG,WAAW,EAAQ,WAE9B,EAEA,mCAAoC,SAAS,GAOzC,IAJA,IAAI,EAAa,EAAG,MAAM,UAAU,GAGhC,GAFoB,EAAW,IAAM,EAAW,GAAG,eAAkB,GAExC,cAAc,OACtC,EAAI,EAAG,EAAI,EAAW,OAAQ,EAAI,EAAG,IAC1C,EAAU,YAAY,EAAG,UAAU,EAAW,KAElD,OAAO,CACX,EAEA,WAAY,SAAU,EAAY,GAC9B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,OAAQ,EAAgB,GAAI,EAAI,EAAG,IAAK,CACnE,IAAI,EAAa,EAAW,GAAG,WAAU,GACzC,EAAc,KAAK,EAAmB,EAAG,UAAU,GAAc,EACrE,CACA,OAAO,CACX,EAEA,mBAAoB,SAAU,EAAS,GAEnC,GADA,EAAG,MAAM,aAAa,GAClB,EACA,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,OAAQ,EAAI,EAAG,IAC1C,EAAQ,YAAY,EAAW,GAE3C,EAEA,gBAAiB,SAAU,EAA0B,GACjD,IAAI,EAAsB,EAAyB,SAAW,CAAC,GAA4B,EAC3F,GAAI,EAAoB,OAAS,EAAG,CAGhC,IAFA,IAAI,EAAiB,EAAoB,GACrC,EAAS,EAAe,WACnB,EAAI,EAAG,EAAI,EAAc,OAAQ,EAAI,EAAG,IAC7C,EAAO,aAAa,EAAc,GAAI,GAC1C,IAAS,EAAI,EAAG,EAAI,EAAoB,OAAQ,EAAI,EAAG,IACnD,EAAG,WAAW,EAAoB,GAE1C,CACJ,EAEA,yBAA0B,SAAS,EAAqB,GAiBpD,GAAI,EAAoB,OAAQ,CAK5B,IAHA,EAAsC,IAAxB,EAAW,UAAkB,EAAW,YAAe,EAG9D,EAAoB,QAAU,EAAoB,GAAG,aAAe,GACvE,EAAoB,OAAO,EAAG,GAGlC,KAAO,EAAoB,OAAS,GAAK,EAAoB,EAAoB,OAAS,GAAG,aAAe,GACxG,EAAoB,SAGxB,GAAI,EAAoB,OAAS,EAAG,CAChC,IAAI,EAAU,EAAoB,GAAI,EAAO,EAAoB,EAAoB,OAAS,GAG9F,IADA,EAAoB,OAAS,EACtB,IAAY,GACf,EAAoB,KAAK,GACzB,EAAU,EAAQ,YAEtB,EAAoB,KAAK,EAC7B,CACJ,CACA,OAAO,CACX,EAEA,4BAA6B,SAAU,EAAY,GAE3C,EAAY,EACZ,EAAW,aAAa,WAAY,GAEpC,EAAW,SAAW,CAC9B,EAEA,WAAY,SAAU,GAClB,OAAkB,OAAX,GAAmB,IAAW,EAAY,GAC7C,EAAO,KACH,EAAO,OACP,EAAO,WAAW,QAAQ,yBAA0B,GAChE,EAEA,iBAAkB,SAAU,EAAQ,GAEhC,OADA,EAAS,GAAU,KACf,EAAW,OAAS,EAAO,SAExB,EAAO,UAAU,EAAG,EAAW,UAAY,CACtD,EAEA,qBAAsB,SAAU,EAAM,GAClC,GAAI,IAAS,EACT,OAAO,EACX,GAAsB,KAAlB,EAAK,SACL,OAAO,EACX,GAAI,EAAgB,SAChB,OAAO,EAAgB,SAA2B,IAAlB,EAAK,SAAiB,EAAK,WAAa,GAC5E,GAAI,EAAgB,wBAChB,QAA+D,IAAvD,EAAgB,wBAAwB,IACpD,KAAO,GAAQ,GAAQ,GACnB,EAAO,EAAK,WAEhB,QAAS,CACb,EAEA,4BAA6B,SAAU,GACnC,OAAO,EAAG,MAAM,qBAAqB,EAAM,EAAK,cAAc,gBAClE,EAEA,+BAAgC,SAAS,GACrC,QAAS,EAAG,MAAM,WAAW,EAAO,EAAG,MAAM,4BACjD,EAEA,aAAc,SAAS,GAInB,OAAO,GAAW,EAAQ,SAAW,EAAQ,QAAQ,aACzD,EAEA,oBAAqB,SAAU,GAC3B,OAAO,EAAY,QAAI,WACnB,IACI,OAAO,EAAS,MAAM,KAAM,UAChC,CAAE,MAAO,GAEL,MADA,EAAY,SAAK,EAAY,QAAE,GACzB,CACV,CACJ,EAAI,CACR,EAEA,WAAY,SAAU,EAAS,GAC3B,OAAO,WAAW,EAAG,MAAM,oBAAoB,GAAU,EAC7D,EAEA,WAAY,SAAU,GAClB,YAAW,WAEP,MADA,EAAY,SAAK,EAAY,QAAE,GACzB,CACV,GAAG,EACP,EAEA,qBAAsB,SAAU,EAAS,EAAW,GAChD,IAAI,EAAiB,EAAG,MAAM,oBAAoB,GAE9C,EAAqB,GAAa,EAA2C,GACjF,GAAK,EAAG,QAA6B,qBAAM,IAAsB,EAE1D,GAAK,GAAyD,mBAA5B,EAAQ,iBAE5C,SAAkC,IAAvB,EAAQ,YAWpB,MAAM,IAAI,MAAM,2DAVhB,IAAI,EAAqB,SAAU,GAAS,EAAe,KAAK,EAAS,EAAQ,EAC7E,EAAkB,KAAO,EAC7B,EAAQ,YAAY,EAAiB,GAIrC,EAAG,MAAM,gBAAgB,mBAAmB,GAAS,WACjD,EAAQ,YAAY,EAAiB,EACzC,GAE0E,MAZ1E,EAAQ,iBAAiB,EAAW,GAAgB,QAFpD,EAAe,GAAe,KAAE,EAAW,EAenD,EAEA,aAAc,SAAU,EAAS,GAC7B,IAAM,IAAW,EAAQ,SACrB,MAAM,IAAI,MAAM,wDAMpB,IAAI,EAjVZ,SAAmC,EAAS,GACxC,GAAwC,UAAnC,EAAG,MAAM,aAAa,KAA0B,EAAQ,KAAM,OAAO,EAC1E,GAA+B,SAA3B,EAAU,cAA0B,OAAO,EAC/C,IAAI,EAAY,EAAQ,KACxB,MAAqB,YAAb,GAA0C,SAAb,CACzC,CA4UiC,CAA0B,EAAS,GAE5D,GAAK,EAAG,QAA6B,sBAAK,GAAmB,EAEtD,GAAmC,mBAAxB,EAAS,YAA2B,CAClD,GAAoC,mBAAzB,EAAQ,cAOf,MAAM,IAAI,MAAM,sDANhB,IAAI,EAAgB,EAA2B,IAAc,aACzD,EAAQ,EAAS,YAAY,GACjC,EAAM,UAAU,GAAW,GAAM,EAAM,EAAQ,EAAG,EAAG,EAAG,EAAG,GAAG,GAAO,GAAO,GAAO,EAAO,EAAG,GAC7F,EAAQ,cAAc,EAI9B,MAAO,GAAI,GAAsB,EAAQ,MACrC,EAAQ,YACL,SAAgC,IAArB,EAAQ,UAGtB,MAAM,IAAI,MAAM,6CAFhB,EAAQ,UAAU,KAAO,EAG7B,MAhBI,EAAe,GAAkB,QAAE,EAiB3C,EAEA,iBAAkB,SAAU,GACxB,OAAO,EAAG,aAAa,GAAS,IAAU,CAC9C,EAEA,eAAgB,SAAU,GACtB,OAAO,EAAG,aAAa,GAAS,EAAM,OAAS,CACnD,EAEA,sBApWJ,SAA+B,EAAM,EAAY,GAC7C,IAAI,EACA,IAC8B,iBAAnB,EAAK,WACZ,EAAgB,EAAK,UAAU,EAAkB,MAAQ,UACzD,EAAG,MAAM,aAAa,EAAW,MAAM,IAAoB,SAAS,GAChE,EAAc,KAAK,EAAK,UAAW,EACvC,KAC4C,iBAA9B,EAAK,UAAmB,QAEtC,EAAgC,EAAK,UAAW,UAAW,EAAY,GAGvE,EAAgC,EAAM,YAAa,EAAY,GAG3E,EAsVI,eAAgB,SAAS,EAAS,GAC9B,IAAI,EAAQ,EAAG,MAAM,iBAAiB,GACvB,OAAV,GAAoB,IAAU,IAC/B,EAAQ,IAKZ,IAAI,EAAgB,EAAG,gBAAgB,WAAW,IAC7C,GAA2C,GAA1B,EAAc,UAAiB,EAAG,gBAAgB,YAAY,GAChF,EAAG,gBAAgB,mBAAmB,EAAS,CAAC,EAAQ,cAAc,eAAe,KAErF,EAAc,KAAO,EAGzB,EAAG,MAAM,aAAa,EAC1B,EAEA,eAAgB,SAAS,EAAS,GAM9B,GALA,EAAQ,KAAO,EAKX,GAAa,EACb,IACI,EAAQ,gBAAgB,EAAS,cAAc,gBAAkB,EAAQ,KAAO,QAAQ,EAC5F,CACA,MAAM,GAAI,CAElB,EAEA,aAAc,SAAS,GAEnB,GAAI,GAAa,EAAG,CAEhB,IAAI,EAAwB,GAAjB,EAAK,SAAgB,EAAO,EAAK,WACxC,EAAK,QACL,EAAK,MAAM,KAAO,EAAK,MAAM,KACrC,CACJ,EAEA,uCAAwC,SAAS,GAI7C,GAAI,EAAW,CACX,IAAI,EAAgB,EAAc,MAAM,MACxC,EAAc,MAAM,MAAQ,EAC5B,EAAc,MAAM,MAAQ,CAChC,CACJ,EAEA,MAAO,SAAU,EAAK,GAClB,EAAM,EAAG,MAAM,iBAAiB,GAChC,EAAM,EAAG,MAAM,iBAAiB,GAEhC,IADA,IAAI,EAAS,GACJ,EAAI,EAAK,GAAK,EAAK,IACxB,EAAO,KAAK,GAChB,OAAO,CACX,EAEA,UAAW,SAAS,GAEhB,IADA,IAAI,EAAS,GACJ,EAAI,EAAG,EAAI,EAAgB,OAAQ,EAAI,EAAG,IAC/C,EAAO,KAAK,EAAgB,IAEhC,OAAO,CACX,EAEA,qBAAsB,SAAS,GAC3B,OAA4C,CAChD,EAEA,MA9bsB,IAAd,EA+bR,MA9bsB,IAAd,EA+bR,UAAY,EAEZ,cAAe,SAAS,EAAM,GAM1B,IALA,IAAI,EAAS,EAAG,MAAM,UAAU,EAAK,qBAAqB,UAAU,OAAO,EAAG,MAAM,UAAU,EAAK,qBAAqB,cACpH,EAAuC,iBAAb,EACxB,SAAS,GAAS,OAAO,EAAM,OAAS,CAAU,EAClD,SAAS,GAAS,OAAO,EAAU,KAAK,EAAM,KAAM,EACtD,EAAU,GACL,EAAI,EAAO,OAAS,EAAG,GAAK,EAAG,IAChC,EAAgB,EAAO,KACvB,EAAQ,KAAK,EAAO,IAE5B,OAAO,CACX,EAEA,UAAW,SAAU,GACjB,MAAyB,iBAAd,IACP,EAAa,EAAG,MAAM,WAAW,IAEzB,GAAQ,EAAK,MACN,EAAK,MAAM,GACf,IAAK,SAAS,UAAY,EAA1B,GAGR,IACX,EAEA,cAAe,SAAU,EAAM,EAAU,GACrC,IAAK,IAAS,EAAK,UACf,MAAM,IAAI,MAAM,4MACpB,OAAO,EAAK,UAAU,EAAG,MAAM,iBAAiB,GAAO,EAAU,EACrE,EAEA,SAAU,SAAU,EAAW,EAAM,GAEjC,IAAI,GADJ,EAAU,GAAW,CAAC,GACO,QAAK,CAAC,EAC/B,EAAgB,EAAuB,eAAK,KAAK,2BACjD,EAAM,EAGV,GAAwB,iBAAb,GAAgE,SAArC,EAAG,MAAM,aAAa,GAAwB,CAChF,IAAI,EAAe,EACnB,EAAM,EAAa,OACnB,IAAK,IAAI,EAAI,EAAc,OAAS,EAAG,GAAK,EAAG,IAE3C,IADA,IAAI,EAAS,EAAG,MAAM,cAAc,EAAc,EAAc,IACvD,EAAI,EAAO,OAAS,EAAG,GAAK,EAAG,IACpC,EAAO,EAAO,GAAG,MAAQ,EAAO,GAAG,KAE/C,CAEA,EAAO,EAAG,MAAM,iBAAiB,GACjC,IAAI,EAAO,EAAS,cAAc,QAIlC,IAAK,IAAI,KAHT,EAAK,MAAM,QAAU,OACrB,EAAK,OAAS,EACd,EAAK,OAAS,OACE,EAAM,CAElB,IAAI,EAAQ,EAAS,cAAc,SACnC,EAAM,KAAO,SACb,EAAM,KAAO,EACb,EAAM,MAAQ,EAAG,MAAM,cAAc,EAAG,MAAM,iBAAiB,EAAK,KACpE,EAAK,YAAY,EACrB,CACA,EAAc,GAAQ,SAAS,EAAK,GAChC,IAAI,EAAQ,EAAS,cAAc,SACnC,EAAM,KAAO,SACb,EAAM,KAAO,EACb,EAAM,MAAQ,EACd,EAAK,YAAY,EACrB,IACA,EAAS,KAAK,YAAY,GAC1B,EAAmB,UAAI,EAAmB,UAAE,GAAQ,EAAK,SACzD,YAAW,WAAc,EAAK,WAAW,YAAY,EAAO,GAAG,EACnE,EAER,CAlkBW,GAokBX,EAAG,aAAa,QAAS,EAAG,OAC5B,EAAG,aAAa,qBAAsB,EAAG,MAAM,cAC/C,EAAG,aAAa,mBAAoB,EAAG,MAAM,YAC7C,EAAG,aAAa,oBAAqB,EAAG,MAAM,aAC9C,EAAG,aAAa,+BAAgC,EAAG,MAAM,wBACzD,EAAG,aAAa,qBAAsB,EAAG,MAAM,cAC/C,EAAG,aAAa,iBAAkB,EAAG,MAAM,UAC3C,EAAG,aAAa,qBAAsB,EAAG,MAAM,cAC/C,EAAG,aAAa,wBAAyB,EAAG,MAAM,iBAClD,EAAG,aAAa,eAAgB,EAAG,MAAM,QACzC,EAAG,aAAa,mCAAoC,EAAG,MAAM,4BAC7D,EAAG,aAAa,sBAAuB,EAAG,MAAM,eAChD,EAAG,aAAa,uBAAwB,EAAG,MAAM,gBACjD,EAAG,aAAa,iBAAkB,EAAG,MAAM,UAC3C,EAAG,aAAa,kBAAmB,EAAG,MAAM,WAC5C,EAAG,aAAa,6BAA8B,EAAG,MAAM,sBACvD,EAAG,aAAa,sBAAuB,EAAG,MAAM,eAChD,EAAG,aAAa,cAAe,EAAG,MAAM,OACxC,EAAG,aAAa,8BAA+B,EAAG,MAAM,uBACxD,EAAG,aAAa,qBAAsB,EAAG,MAAM,cAC/C,EAAG,aAAa,yBAA0B,EAAG,MAAM,kBACnD,EAAG,aAAa,sBAAuB,EAAG,MAAM,eAChD,EAAG,aAAa,wBAAyB,EAAG,MAAM,iBAClD,EAAG,aAAa,uBAAwB,EAAG,MAAM,gBACjD,EAAG,aAAa,SAAU,EAAG,MAAM,kBAE9B,SAAS,UAAgB,OAG1B,SAAS,UAAgB,KAAI,SAAU,GACnC,IAAI,EAAmB,KACvB,GAAyB,IAArB,UAAU,OACV,OAAO,WACH,OAAO,EAAiB,MAAM,EAAQ,UAC1C,EAEA,IAAI,EAAc,MAAM,UAAU,MAAM,KAAK,UAAW,GACxD,OAAO,WACH,IAAI,EAAO,EAAY,MAAM,GAE7B,OADA,EAAK,KAAK,MAAM,EAAM,WACf,EAAiB,MAAM,EAAQ,EAC1C,CAER,GAGJ,EAAG,MAAM,QAAU,IAAI,WACnB,IAAI,EAAW,EACX,EAAkC,UAAW,IAAK,MAAM,UACxD,EAAY,CAAC,EAEjB,SAAS,EAAO,EAAM,GAClB,IAAI,EAAe,EAAK,GAExB,IAD2B,GAAkC,SAAjB,IAA4B,EAAU,GACvD,CACvB,IAAK,EACD,OAAO,EACX,EAAe,EAAK,GAAmC,KAAO,IAC9D,EAAU,GAAgB,CAAC,CAC/B,CACA,OAAO,EAAU,EACrB,CAEA,MAAO,CACH,IAAK,SAAU,EAAM,GACjB,IAAI,EAAiB,EAAO,GAAM,GAClC,OAAO,IAAmB,EAAY,EAAY,EAAe,EACrE,EACA,IAAK,SAAU,EAAM,EAAK,GAClB,IAAU,GAEN,EAAO,GAAM,KAAW,IAGX,EAAO,GAAM,GACnB,GAAO,EAC1B,EACA,MAAO,SAAU,GACb,IAAI,EAAe,EAAK,GACxB,QAAI,WACO,EAAU,GACjB,EAAK,GAAmC,MACjC,EAGf,EAEA,QAAS,WACL,OAAQ,IAAc,CAC1B,EAEP,EAED,EAAG,aAAa,gBAAiB,EAAG,MAAM,SAC1C,EAAG,aAAa,sBAAuB,EAAG,MAAM,QAAQ,OAExD,EAAG,MAAM,gBAAkB,IAAI,WAC3B,IAAI,EAAa,EAAG,MAAM,QAAQ,UAC9B,EAAqB,CAAE,GAAG,EAAM,GAAG,EAAM,GAAG,GAC5C,EAAoC,CAAE,GAAG,EAAM,GAAG,GAEtD,SAAS,EAA8B,EAAM,GACzC,IAAI,EAAsB,EAAG,MAAM,QAAQ,IAAI,EAAM,GAKrD,OAJK,IAAwB,GAAc,IACvC,EAAsB,GACtB,EAAG,MAAM,QAAQ,IAAI,EAAM,EAAY,IAEpC,CACX,CAKA,SAAS,EAAgB,GAErB,IAAI,EAAY,EAA8B,GAAM,GACpD,GAAI,EAAW,CACX,EAAY,EAAU,MAAM,GAC5B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAU,OAAQ,IAClC,EAAU,GAAG,EACrB,CAGA,EAAG,MAAM,QAAQ,MAAM,GAGvB,EAAG,MAAM,gBAAmC,kBAAE,GAI1C,EAAkC,EAAK,WAI/C,SAA2C,GAEvC,IADA,IAAI,EAAO,EAAY,EAAiB,WACjC,EAAQ,GACX,EAAY,EAAM,YACK,IAAnB,EAAM,UACN,EAAgB,EAE5B,CAVQ,CAAkC,EAC1C,CAWA,MAAO,CACH,mBAAqB,SAAS,EAAM,GAChC,GAAuB,mBAAZ,EACP,MAAM,IAAI,MAAM,+BACpB,EAA8B,GAAM,GAAM,KAAK,EACnD,EAEA,sBAAwB,SAAS,EAAM,GACnC,IAAI,EAAsB,EAA8B,GAAM,GAC1D,IACA,EAAG,MAAM,gBAAgB,EAAqB,GACZ,GAA9B,EAAoB,QA7CpC,SAAoC,GAChC,EAAG,MAAM,QAAQ,IAAI,EAAM,EAAY,EAC3C,CA4CgB,CAA2B,GAEvC,EAEA,UAAY,SAAS,GAEjB,GAAI,EAAmB,EAAK,YACxB,EAAgB,GAGZ,EAAkC,EAAK,WAAW,CAElD,IAAI,EAAc,GAClB,EAAG,MAAM,aAAa,EAAa,EAAK,qBAAqB,MAC7D,IAAK,IAAI,EAAI,EAAG,EAAI,EAAY,OAAQ,EAAI,EAAG,IAC3C,EAAgB,EAAY,GACpC,CAEJ,OAAO,CACX,EAEA,WAAa,SAAS,GAClB,EAAG,UAAU,GACT,EAAK,YACL,EAAK,WAAW,YAAY,EACpC,EAEA,kBAAsB,SAAU,GAIxB,GAAyD,mBAA/B,EAA0B,WACpD,EAA0B,UAAE,CAAC,GACrC,EAEP,EACD,EAAG,UAAY,EAAG,MAAM,gBAAgB,UACxC,EAAG,WAAa,EAAG,MAAM,gBAAgB,WACzC,EAAG,aAAa,YAAa,EAAG,WAChC,EAAG,aAAa,aAAc,EAAG,YACjC,EAAG,aAAa,wBAAyB,EAAG,MAAM,iBAClD,EAAG,aAAa,2CAA4C,EAAG,MAAM,gBAAgB,oBACrF,EAAG,aAAa,8CAA+C,EAAG,MAAM,gBAAgB,uBACxF,WACI,IAAI,EAAO,CAAC,EAAG,GAAI,IACf,EAAQ,CAAC,EAAG,UAAW,YAEvB,EAAK,CAAC,EAAG,qBAAsB,yBAC/B,EAAS,CAAC,EAAG,+BAAgC,aAC7C,EAAS,CACL,MAAS,EACT,MAAS,EACT,MAAS,EACT,GAPI,CAAC,EAAG,iBAAkB,oBAQ1B,GAAM,EACN,GAAM,EACN,OAAU,EACV,SAAY,GAIhB,EAA8B,EAAG,MAAM,WAAa,EAOxD,SAAS,EAAgB,EAAM,GAC3B,IAAoB,EAAkB,GACtC,IAAI,EAAgB,EAA8B,cAAK,EAA6B,aAAK,EAWrF,EAAO,EAAG,MAAM,WAAW,GAAM,cAAe,EAAM,EAAgB,cAAc,OACpF,EAnBR,SAAiB,GACb,IAAI,EAAI,EAAK,MAAM,kBACnB,OAAQ,GAAK,EAAO,EAAE,KAAQ,CAClC,CAgBe,CAAQ,GACf,EAAQ,EAAK,GAIb,EAAS,eAAiB,EAAK,GAAK,EAAO,EAAK,GAAK,SAqBzD,IApByC,mBAA9B,EAAyB,UAIhC,EAAI,YAAY,EAAyB,UAAE,KAEvC,GAGA,EAAgB,YAAY,GAGhC,EAAI,UAAY,EAEZ,GACA,EAAI,WAAW,YAAY,IAK5B,KACH,EAAM,EAAI,UAEd,OAAO,EAAG,MAAM,UAAU,EAAI,UAAU,WAC5C,CA2BA,EAAG,MAAM,kBAAoB,SAAS,EAAM,GACxC,OAAO,EA1BX,SAAyB,EAAM,GAE3B,GAAI,EAA0B,UAC1B,OAAO,EAA0B,UAAE,EAAM,IAAoB,GAG7D,IAAI,EAAQ,EAAsB,MAAE,CAAC,GAAO,GAK5C,GAAI,GAAS,EAAM,GAAI,CAGnB,IADA,IAAI,EAAO,EAAM,GACV,EAAK,YAA2C,KAA7B,EAAK,WAAW,UACtC,EAAO,EAAK,WAEZ,EAAK,YACL,EAAK,WAAW,YAAY,EACpC,CAEA,OAAO,CAEf,CAIQ,CAAgB,EAAM,GACtB,EAAgB,EAAM,EAC9B,EAEA,EAAG,MAAM,QAAU,SAAS,EAAM,GAM9B,GALA,EAAG,MAAM,aAAa,GAKR,QAFd,EAAO,EAAG,MAAM,iBAAiB,KAET,IAAS,EAO7B,GANmB,iBAAR,IACP,EAAO,EAAK,YAKZ,EACA,EAAe,GAAY,KAAE,QAI7B,IADA,IAAI,EAAc,EAAG,MAAM,kBAAkB,EAAM,EAAK,eAC/C,EAAI,EAAG,EAAI,EAAY,OAAQ,IACpC,EAAK,YAAY,EAAY,GAG7C,CACH,CA7HD,GA+HA,EAAG,aAAa,0BAA2B,EAAG,MAAM,mBACpD,EAAG,aAAa,gBAAiB,EAAG,MAAM,SAE1C,EAAG,YAAc,WACb,IAAI,EAAQ,CAAC,EAEb,SAAS,IACL,OAA+B,YAArB,EAAI,KAAK,UAA2B,GAAG,SAAS,IAAI,UAAU,EAC5E,CAIA,SAAS,EAAc,EAAU,GAC7B,GAAK,EAEL,GAAyB,GAArB,EAAS,SAAe,CACxB,IAAI,EAAS,EAAG,YAAY,cAAc,EAAS,WACrC,MAAV,GACA,EAAc,KAAK,CAAE,QAAS,EAAU,OAAQ,GACxD,MAAO,GAAyB,GAArB,EAAS,SAChB,IAAK,IAAI,EAAI,EAAG,EAAa,EAAS,WAAY,EAAI,EAAW,OAAQ,EAAI,EAAG,IAC5E,EAAc,EAAW,GAAI,EAEzC,CAEA,MAAO,CACH,QAAS,SAAU,GACf,GAAuB,mBAAZ,EACP,MAAM,IAAI,MAAM,4DACpB,IAAI,EAnBD,IAAuB,IAqB1B,OADA,EAAM,GAAU,EACT,mBAAkB,EAAS,SACtC,EAEA,UAAW,SAAU,EAAQ,GACzB,IAAI,EAAW,EAAM,GACrB,GAAI,IAAa,EACb,MAAM,IAAI,MAAM,kCAAoC,EAAS,2CACjE,IAEI,OADA,EAAS,MAAM,KAAM,GAAkB,KAChC,CACX,CACA,eAAiB,EAAM,EAAS,CACpC,EAEA,+BAAgC,SAAU,EAAS,GAC/C,IAAI,EAAQ,GACZ,EAAc,EAAS,GACvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,EAAI,EAAG,IAAK,CAC1C,IAAI,EAAO,EAAM,GAAG,QAChB,EAAiB,CAAC,GAClB,GACA,EAAG,MAAM,aAAa,EAAgB,GAC1C,EAAG,YAAY,UAAU,EAAM,GAAG,OAAQ,GAC1C,EAAK,UAAY,GACb,EAAK,YACL,EAAK,WAAW,YAAY,EACpC,CACJ,EAEA,cAAe,SAAU,GACrB,IAAI,EAAQ,EAAS,MAAM,wBAC3B,OAAO,EAAQ,EAAM,GAAK,IAC9B,EAEP,CA9DgB,GAgEjB,EAAG,aAAa,cAAe,EAAG,aAClC,EAAG,aAAa,sBAAuB,EAAG,YAAY,SACtD,EAAG,aAAa,wBAAyB,EAAG,YAAY,WACxD,EAAG,aAAa,4BAA6B,EAAG,YAAY,eAC5D,EAAG,aAAa,6CAA8C,EAAG,YAAY,gCAC7E,EAAG,MAAQ,WACP,IAAI,EASuB,EACf,EATR,EAAY,GACZ,EAAkB,EAClB,EAAa,EACb,EAAqB,EA6BzB,SAAS,IACL,GAAI,EAMA,IAHA,IAGS,EAHL,EAAO,EAAiB,EAAa,EAG1B,EAAqB,GAChC,GAAI,EAAO,EAAU,KAAuB,CACxC,GAAI,EAAqB,EAAM,CAC3B,KAAM,GAAc,IAAM,CACtB,EAAqB,EACrB,EAAG,MAAM,WAAW,MAAM,yCAA2C,EAAa,kBAClF,KACJ,CACA,EAAO,CACX,CACA,IACI,GACJ,CAAE,MAAO,GACL,EAAG,MAAM,WAAW,EACxB,CACJ,CAGZ,CAEA,SAAS,IACL,IAGA,EAAqB,EAAkB,EAAU,OAAS,CAC9D,CAmCA,OA9FI,EAAyB,kBAGF,EAIpB,EAHK,EAAM,EAAS,cAAc,OACjC,IAAI,iBAAiB,GAAU,QAAQ,EAAK,CAAC,YAAY,IAF7D,EAGW,WAAc,EAAI,UAAU,OAAO,MAAQ,GAKtD,EAHO,GAAY,uBAAwB,EAAS,cAAc,UAGtD,SAAU,GAClB,IAAI,EAAS,EAAS,cAAc,UACpC,EAAO,mBAAqB,WACxB,EAAO,mBAAqB,KAC5B,EAAS,gBAAgB,YAAY,GACrC,EAAS,KACT,GACJ,EACA,EAAS,gBAAgB,YAAY,EACzC,EAEY,SAAU,GAClB,WAAW,EAAU,EACzB,EAyCQ,CACR,UAAa,EAEb,SAAU,SAAU,GAMhB,OALK,GAPT,EAAG,MAAiB,UAAE,GAWlB,EAAU,KAAqB,EACxB,GACX,EAEA,OAAQ,SAAU,GACd,IAAI,EAAQ,GAAU,EAAa,GAC/B,GAAS,GAAsB,EAAQ,IACvC,EAAU,GAAS,KAE3B,EAGA,gBAAmB,WACf,IAAI,EAAS,EAAkB,EAE/B,OADA,EAAqB,EAAkB,EAAU,OAAS,EACnD,CACX,EAEA,SAAU,EAIjB,CAtGU,GAwGX,EAAG,aAAa,QAAS,EAAG,OAC5B,EAAG,aAAa,iBAAkB,EAAG,MAAM,UAE3C,EAAG,aAAa,iBAAkB,EAAG,MAAM,UAC3C,EAAG,UAAY,CACX,SAAY,SAAS,EAAQ,GAKzB,EAA2B,mBAAI,EAI/B,IAAI,EAAuB,KAC3B,OAAO,EAAG,oBAAoB,CAC1B,KAAQ,EACR,MAAS,SAAS,GACd,aAAa,GACb,EAAuB,EAAG,MAAM,YAAW,WACvC,EAAO,EACX,GAAG,EACP,GAER,EAEA,UAAa,SAAS,EAAQ,GAC1B,IAAI,EAAS,EAAQ,EAEC,iBAAX,EACP,EAAU,GAEV,EAAU,EAAiB,QAC3B,EAAS,EAAgB,QAI7B,EAAO,eAAgB,EAEvB,EAA0B,yBAAV,EAAqC,EAAW,EAChE,EAAO,OAAM,SAAS,GAClB,OAAO,EAAc,EAAU,EACnC,GACJ,EAEA,SAAY,SAAS,EAAQ,GACzB,IAAgB,IAAZ,EACA,MAAM,IAAI,MAAM,yHAGf,EAAO,gBACR,EAAO,eAAgB,EACvB,EAAO,OAAM,SAAU,GACnB,IAAI,EACA,GAAgB,EACpB,OAAO,WACH,IAAK,EAAe,CAChB,EAAG,MAAM,OAAO,GAChB,EAAS,EAAG,MAAM,SAAS,GAE3B,IACI,GAAgB,EAChB,EAA0B,kBAAE,EAAW,QAC3C,CAAE,QACE,GAAgB,CACpB,CACJ,CACJ,CACJ,IAER,EAEA,OAAU,SAAS,EAAQ,GACvB,EAAyB,iBAAkB,UAAd,EACzB,KACA,CACR,GAGJ,IAAI,EAAiB,CAAE,UAAY,EAAG,QAAU,EAAG,OAAS,EAAG,OAAS,GACxE,SAAS,EAA2B,EAAG,GAEnC,QADiC,OAAN,YAAsB,KAAO,KAC1B,IAAM,CACxC,CAEA,SAAS,EAAS,EAAU,GACxB,IAAI,EACJ,OAAO,WACE,IACD,EAAkB,EAAG,MAAM,YAAW,WAClC,EAAkB,EAClB,GACJ,GAAG,GAEX,CACJ,CAEA,SAAS,EAAS,EAAU,GACxB,IAAI,EACJ,OAAO,WACH,aAAa,GACb,EAAkB,EAAG,MAAM,WAAW,EAAU,EACpD,CACJ,CAeA,EAAG,aAAa,YAAa,EAAG,WAEhC,EAAG,aAAe,SAAU,EAAQ,EAAU,GAC1C,KAAK,QAAU,EACf,KAAK,SAAW,EAChB,KAAK,gBAAkB,EACvB,KAAK,YAAa,EAClB,EAAG,eAAe,KAAM,UAAW,KAAK,QAC5C,EACA,EAAG,aAAa,UAAU,QAAU,WAChC,KAAK,YAAa,EAClB,KAAK,iBACT,EAEA,EAAG,aAAe,WACd,EAAG,MAAM,uBAAuB,KAAM,GACtC,EAAmB,KAAK,KAC5B,EAEA,IAAI,EAAe,SAGnB,SAAS,EAAuB,EAAO,GAC9B,GAAS,IAAU,EAEH,iBAAV,EACP,KAAK,mBAAmB,GAExB,KAAK,uBAAuB,EAAO,GAJnC,KAAK,aAAa,EAM1B,CAEA,IAAI,EAAqB,CACrB,KAAM,SAAS,GACX,EAAS,eAAiB,CAAE,OAAU,IACtC,EAAS,eAAiB,CAC9B,EAEA,UAAW,SAAU,EAAU,EAAgB,GAC3C,IAAI,EAAO,KAEX,EAAQ,GAAS,EACjB,IAAI,EAAgB,EAAiB,EAAS,KAAK,GAAkB,EAEjE,EAAe,IAAI,EAAG,aAAa,EAAM,GAAe,WACxD,EAAG,MAAM,gBAAgB,EAAK,eAAe,GAAQ,GACjD,EAAK,yBACL,EAAK,wBAAwB,EACrC,IASA,OAPI,EAAK,uBACL,EAAK,sBAAsB,GAE1B,EAAK,eAAe,KACrB,EAAK,eAAe,GAAS,IACjC,EAAK,eAAe,GAAO,KAAK,GAEzB,CACX,EAEA,kBAAqB,SAAU,EAAe,GAK1C,IAJA,EAAQ,GAAS,KACH,GACV,KAAK,gBAEL,KAAK,yBAAyB,GAAQ,CACtC,IAAI,EAAO,IAAU,GAAgB,KAAK,sBAAwB,KAAK,eAAe,GAAO,MAAM,GACnG,IACI,EAAG,oBAAoB,QACvB,IAAK,IAAW,EAAP,EAAI,EAAiB,EAAe,EAAK,KAAM,EAG/C,EAAa,YACd,EAAa,SAAS,EAElC,CAAE,QACE,EAAG,oBAAoB,KAC3B,CACJ,CACJ,EAEA,WAAY,WACR,OAAO,KAAK,cAChB,EAEA,WAAY,SAAU,GAClB,OAAO,KAAK,eAAiB,CACjC,EAEA,cAAe,aACT,KAAK,cACX,EAEA,MAAO,SAAS,GACZ,IACI,EAAoB,EAAkB,EAAe,EADrD,EAAO,KAAM,EAAmB,EAAG,aAAa,GAG/C,EAAK,yBACN,EAAK,uBAAyB,EAAwB,kBACtD,EAAwB,kBAAI,GAGhC,IAAI,EAAS,GAAc,WACvB,EAAK,wBAAyB,EAI1B,GAAoB,IAAiB,IACrC,EAAe,EAAK,eAAiB,EAAK,iBAAmB,KAEjE,IAAI,EAAe,GAAoB,EAAK,YAAY,EAAe,GAEvE,EAAmB,GAAqB,EAEpC,GACA,EAAK,uBAAuB,EAAgB,EAEpD,IAEA,EAAK,aAAe,SAAS,GACzB,EAAK,qBAAuB,EAAK,eAAe,GAAc,MAAM,GACpE,EAAK,uBAAyB,GAAqB,EACnD,EAAe,EACf,GACJ,EACA,EAAK,mBAAqB,SAAS,GAC1B,IACD,EAAgB,EAChB,EAAK,uBAAuB,EAjCkD,gBAmCtF,EACA,EAAK,oCAAsC,WACnC,EAAK,YAAY,EAAe,EAAK,MAAK,MAC1C,GAAmB,EAE3B,CACJ,EAEA,yBAA0B,SAAS,GAC/B,OAAO,KAAK,eAAe,IAAU,KAAK,eAAe,GAAO,MACpE,EAEA,sBAAuB,SAAU,GAC7B,GAAI,EACA,OAAO,KAAK,eAAe,IAAU,KAAK,eAAe,GAAO,QAAU,EAE1E,IAAI,EAAQ,EAKZ,OAJA,EAAG,MAAM,cAAc,KAAK,gBAAgB,SAAS,EAAW,GAC1C,UAAd,IACA,GAAS,EAAc,OAC/B,IACO,CAEf,EAEA,YAAa,SAAS,EAAU,GAC5B,OAAQ,KAAuB,mBAAM,KAAuB,iBAAE,EAAU,EAC5E,EAEA,OA5KJ,SAAwB,GACpB,IAAI,EAAS,KASb,OARI,GACA,EAAG,MAAM,cAAc,GAAoB,SAAS,EAAK,GACrD,IAAI,EAAkB,EAAG,UAAU,GACL,mBAAnB,IACP,EAAS,EAAgB,EAAQ,IAAU,EAEnD,IAEG,CACX,GAoKA,EAAG,eAAe,EAAoB,YAAa,EAAmB,WACtE,EAAG,eAAe,EAAoB,SAAU,EAAmB,QACnE,EAAG,eAAe,EAAoB,wBAAyB,EAAmB,uBAK9E,EAAG,MAAM,iBACT,EAAG,MAAM,eAAe,EAAoB,SAAS,WAGzD,EAAG,aAAiB,GAAI,EAGxB,EAAG,eAAiB,SAAU,GAC1B,OAAmB,MAAZ,GAAiD,mBAAtB,EAAS,WAAmE,mBAAjC,EAA4B,iBAC7G,EAEA,EAAG,aAAa,eAAgB,EAAG,cACnC,EAAG,aAAa,iBAAkB,EAAG,gBAErC,EAAG,gBAAkB,EAAG,oBAAsB,WAC1C,IACI,EADA,EAAc,GAEd,EAAS,EAYb,SAAS,EAAM,GACX,EAAY,KAAK,GACjB,EAAe,CACnB,CAEA,SAAS,IACL,EAAe,EAAY,KAC/B,CAEA,MAAO,CACH,MAAO,EAEP,IAAK,EAEL,mBAAoB,SAAU,GAC1B,GAAI,EAAc,CACd,IAAK,EAAG,eAAe,GACnB,MAAM,IAAI,MAAM,oDACpB,EAAa,SAAS,KAAK,EAAa,eAAgB,EAAc,EAAa,MAAQ,EAAa,MArBvG,GAsBL,CACJ,EAEA,OAAQ,SAAU,EAAU,EAAgB,GACxC,IAEI,OADA,IACO,EAAS,MAAM,EAAgB,GAAgB,GAC1D,CAAE,QACE,GACJ,CACJ,EAEA,qBAAsB,WAClB,GAAI,EACA,OAAO,EAAa,SAAS,sBACrC,EAEA,UAAW,WACP,GAAI,EACA,OAAO,EAAa,SAC5B,EAEP,CAxD6C,GA0D9C,EAAG,aAAa,kBAAmB,EAAG,iBACtC,EAAG,aAAa,uCAAwC,EAAG,gBAAgB,sBAC3E,EAAG,aAAa,4BAA6B,EAAG,gBAAgB,WAEhE,EAAG,aAAa,qBAAsB,EAAG,mBAAqB,EAAG,oBAAoB,QACrF,IAAI,EAAwB,EAAG,MAAM,qBAAqB,gBAE1D,EAAG,WAAa,SAAU,GACtB,SAAS,IACL,OAAI,UAAU,OAAS,GAIf,EAAW,YAAY,EAAW,GAAwB,UAAU,MACpE,EAAW,kBACX,EAAW,GAAyB,UAAU,GAC9C,EAAW,mBAER,OAIP,EAAG,oBAAoB,mBAAmB,GACnC,EAAW,GAE1B,CAkBA,OAhBA,EAAW,GAAyB,EAG/B,EAAG,MAAM,iBAEV,EAAG,MAAM,OAAO,EAAY,EAAG,aAAiB,IAEpD,EAAG,aAAiB,GAAE,KAAK,GAG3B,EAAG,MAAM,uBAAuB,EAAY,GAExC,EAAG,QAAsB,cACzB,EAAG,UAAoB,SAAE,GAAY,GAGlC,CACX,EAGA,IAAI,EAAe,CACf,iBAAoB,EACpB,KAAM,WAAa,OAAO,KAAK,EAAwB,EACvD,gBAAiB,WAAc,KAAwB,kBAAE,KAAK,GAAyB,EACvF,gBAAiB,WAAc,KAAwB,kBAAE,KAAK,GAAwB,eAAiB,GAKvG,EAAG,MAAM,iBACT,EAAG,MAAM,eAAe,EAAc,EAAG,aAAiB,IAG9D,IAAI,EAAgB,EAAG,WAAW,cAAgB,eAClD,EAAa,GAAiB,EAAG,WAEjC,EAAG,aAAe,SAAS,EAAU,GACjC,OAAkB,OAAb,GAAuB,IAAa,GAAe,EAAS,KAAmB,IAChF,EAAS,KAAmB,GACzB,EAAG,aAAa,EAAS,GAAgB,GACpD,EAEA,EAAG,aAAe,SAAU,GACxB,OAAO,EAAG,aAAa,EAAU,EAAG,WACxC,EACA,EAAG,sBAAwB,SAAU,GAEjC,MAAwB,mBAAZ,GAA2B,EAAS,KAAmB,EAAG,cAG9C,mBAAZ,GAA4B,EAAS,KAAmB,EAAG,sBAAyB,EAAyB,iBAI7H,EAEA,EAAG,aAAa,aAAc,EAAG,YACjC,EAAG,aAAa,eAAgB,EAAG,cACnC,EAAG,aAAa,wBAAyB,EAAG,uBAC5C,EAAG,aAAa,uBAAwB,EAAG,uBAC3C,EAAG,aAAa,gBAAiB,GACjC,EAAG,eAAe,EAAc,OAAQ,EAAa,MACrD,EAAG,eAAe,EAAc,kBAAmB,EAAa,iBAChE,EAAG,eAAe,EAAc,kBAAmB,EAAa,iBAChE,EAAG,gBAAkB,SAAU,GAG3B,GAA4B,iBAF5B,EAAgB,GAAiB,OAES,WAAY,GAClD,MAAM,IAAI,MAAM,sGAEpB,IAAI,EAAS,EAAG,WAAW,GAE3B,OADA,EAAG,MAAM,uBAAuB,EAAQ,EAAG,gBAAoB,IACxD,EAAO,OAAO,CAAC,mBAAoB,GAC9C,EAEA,EAAG,gBAAoB,GAAI,CACvB,OAAU,SAAU,GAIhB,IAHA,IAAI,EAAkB,KAAK,OACvB,EAAgB,GAChB,EAAuC,mBAApB,GAAmC,EAAG,aAAa,GAAuC,SAAU,GAAS,OAAO,IAAU,CAAkB,EAAzE,EACrF,EAAI,EAAG,EAAI,EAAgB,OAAQ,IAAK,CAC7C,IAAI,EAAQ,EAAgB,GACxB,EAAU,KACmB,IAAzB,EAAc,QACd,KAAK,kBAET,EAAc,KAAK,GACnB,EAAgB,OAAO,EAAG,GAC1B,IAER,CAIA,OAHI,EAAc,QACd,KAAK,kBAEF,CACX,EAEA,UAAa,SAAU,GAEnB,GAAI,IAAkB,EAAW,CAC7B,IAAI,EAAkB,KAAK,OACvB,EAAY,EAAgB,MAAM,GAItC,OAHA,KAAK,kBACL,EAAgB,OAAO,EAAG,EAAgB,QAC1C,KAAK,kBACE,CACX,CAEA,OAAK,EAEE,KAAa,QAAE,SAAU,GAC5B,OAAO,EAAG,MAAM,aAAa,EAAe,IAAU,CAC1D,IAHW,EAIf,EAEA,QAAW,SAAU,GACjB,IAAI,EAAkB,KAAK,OACvB,EAAuC,mBAApB,GAAmC,EAAG,aAAa,GAAuC,SAAU,GAAS,OAAO,IAAU,CAAkB,EAAzE,EAC9F,KAAK,kBACL,IAAK,IAAI,EAAI,EAAgB,OAAS,EAAG,GAAK,EAAG,IAEzC,EADQ,EAAgB,MAExB,EAAgB,GAAa,UAAI,GAEzC,KAAK,iBACT,EAEA,WAAc,SAAU,GAEpB,OAAI,IAAkB,EACX,KAAc,SAAE,WAAa,OAAO,CAAK,IAG/C,EAEE,KAAc,SAAE,SAAU,GAC7B,OAAO,EAAG,MAAM,aAAa,EAAe,IAAU,CAC1D,IAHW,EAIf,EAEA,QAAW,SAAU,GACjB,IAAI,EAAkB,OACtB,OAAO,EAAG,MAAM,aAAa,EAAiB,EAClD,EAEA,QAAW,SAAS,EAAS,GACzB,IAAI,EAAQ,KAAc,QAAE,GACxB,GAAS,IACT,KAAK,kBACL,KAAK,OAAO,GAAS,EACrB,KAAK,kBAEb,GAKA,EAAG,MAAM,iBACT,EAAG,MAAM,eAAe,EAAG,gBAAoB,GAAG,EAAG,WAAe,IAMxE,EAAG,MAAM,aAAa,CAAC,MAAO,OAAQ,UAAW,QAAS,OAAQ,SAAU,YAAY,SAAU,GAC9F,EAAG,gBAAoB,GAAE,GAAc,WAGnC,IAAI,EAAkB,KAAK,OAC3B,KAAK,kBACL,KAAK,2BAA2B,EAAiB,EAAY,WAC7D,IAAI,EAAmB,EAAgB,GAAY,MAAM,EAAiB,WAG1E,OAFA,KAAK,kBAEE,IAAqB,EAAkB,KAAO,CACzD,CACJ,IAGA,EAAG,MAAM,aAAa,CAAC,UAAU,SAAU,GACvC,EAAG,gBAAoB,GAAE,GAAc,WACnC,IAAI,EAAkB,OACtB,OAAO,EAAgB,GAAY,MAAM,EAAiB,UAC9D,CACJ,IAEA,EAAG,aAAa,kBAAmB,EAAG,iBACtC,IAAI,EAAuB,cAC3B,EAAG,UAA6B,kBAAI,SAAS,EAAQ,GASjD,GAPA,EAAO,oBAAsB,CAAC,EAC1B,GAA6B,iBAAX,GAClB,EAAG,MAAM,OAAO,EAAO,oBAAqB,GAEhD,EAAO,oBAA4B,QAAI,GAGnC,EAAO,2BAAX,CAGA,IAEI,EAEA,EAJA,GAAkB,EAClB,EAAa,KAEb,EAAuB,EAEvB,EAA0C,EAAO,sBACjD,EAA4C,EAAO,wBAGvD,EAAO,sBAAwB,SAAU,GACjC,GACA,EAAwC,KAAK,EAAQ,GACrD,IAAU,GAkBlB,WAEI,IAAI,EAAJ,CAIA,GAAkB,EAGlB,EAAsC,EAA0B,kBAChE,EAA0B,kBAAI,SAAS,EAAe,GAIlD,OAHK,GAAS,IAAU,KAClB,EAEC,EAAoC,MAAM,KAAM,UAC3D,EAIA,IAAI,EAAmB,GAAG,OAAO,EAAO,QAAU,IAClD,EAAa,KACb,EAA0B,EAAO,WAAU,SAAS,GAKhD,GAHA,EAAkB,GAAG,OAAO,GAAmB,IAG3C,EAAO,yBAAyB,GAChC,IAAI,EAchB,SAAoB,EAAkB,GASlC,QAJK,GAAc,EAAuB,KACtC,EAAa,EAAG,MAAM,cAAc,EAAkB,EAAiB,EAAO,sBAG3E,CACX,CAxB0B,CAAW,EAAkB,GAI/C,EAAmB,EACnB,EAAa,KACb,EAAuB,EAEnB,GAAW,EAAQ,QACnB,EAA0B,kBAAE,EAAS,EAE7C,GAlCA,CAmCJ,CAxDQ,EAER,EAEA,EAAO,wBAA0B,SAAU,GACnC,GACA,EAA0C,KAAK,EAAQ,GACvD,IAAU,GAAyB,EAAO,yBAAyB,KAC/D,IACA,EAA0B,kBAAI,EAC9B,EAAsC,GAE1C,EAAwB,UACxB,GAAkB,EAE1B,EAuDA,EAAO,2BAA6B,SAAS,EAAU,EAAe,GAGlE,GAAK,IAAmB,EAAxB,CAGA,IAAI,EAAO,GACP,EAAc,EAAS,OACvB,EAAa,EAAK,OAClB,EAAS,EAKb,OAAQ,GACJ,IAAK,OACD,EAAS,EACb,IAAK,UACD,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAY,IACpC,EAAS,QAAS,EAAK,GAAQ,EAAS,GAE5C,MAEJ,IAAK,MACD,EAAS,EAAc,EAC3B,IAAK,QACG,GACA,EAAS,UAAW,EAAS,GAAS,GAE1C,MAEJ,IAAK,SAQD,IALA,IAAI,EAAa,KAAK,IAAI,KAAK,IAAI,EAAG,EAAK,GAAK,EAAI,EAAc,EAAK,GAAK,EAAK,IAAK,GAClF,EAAgC,IAAf,EAAmB,EAAc,KAAK,IAAI,GAAc,EAAK,IAAM,GAAI,GACxF,EAAc,EAAa,EAAa,EACxC,EAAW,KAAK,IAAI,EAAgB,GACpC,EAAY,GAAI,EAAY,GACH,GAApB,EAAQ,EAAwB,GAAG,EAAQ,IAAY,IAAS,EACjE,EAAQ,GACR,EAAU,KAAK,EAAS,UAAW,EAAS,GAAQ,IACpD,EAAQ,GACR,EAAU,KAAK,EAAS,QAAS,EAAK,GAAY,IAE1D,EAAG,MAAM,2BAA2B,EAAW,GAC/C,MAEJ,QACI,OAER,EAAa,CA9Cb,CAMA,SAAS,EAAS,EAAQ,EAAO,GAC7B,OAAO,EAAK,EAAK,QAAU,CAAE,OAAU,EAAQ,MAAS,EAAO,MAAS,EAC5E,CAuCJ,CAxIA,CAyIJ,EACA,IAAI,EAAgB,EAAG,MAAM,qBAAqB,UAqHlD,SAAS,EAAkC,EAAI,GACpB,OAAnB,GAA2B,EAAe,SAC1C,EAAe,SAEvB,CAIA,SAAS,EAAyC,EAAc,GAC5D,IAAI,EAAqB,KAAK,mBAC1B,EAAQ,EAAmB,GAC1B,EAAM,aACH,KAAK,eAAiB,KAAK,mBAAmB,IAE9C,EAAmB,sBAAsB,EAAI,EAAc,KAAK,mBAAmB,IACnF,KAAK,mBAAmB,GAAM,OAC5B,KAAK,eACC,EAAM,mBAAmB,IAEjC,EAAmB,sBAAsB,EAAI,EAAc,EAAM,WAAa,CAAE,QAAS,GAAiB,EAAmB,sBAAsB,IAGnJ,EAAa,wBACb,EAAa,sCAGzB,CA7IA,EAAG,SAAW,EAAG,oBAAsB,SAAU,EAA4B,EAAyB,GAWlG,GAV0C,iBAA/B,EAEP,EAAU,GAGV,EAAU,GAAW,CAAC,EAClB,IACA,EAAc,KAAI,IAGI,mBAAnB,EAAc,KACrB,MAAM,MAAM,6DAEhB,IAAI,EAAgB,EAAe,MAC/B,EAAQ,CACR,YAAa,EACb,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,8CAA8C,EAC9C,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,aAAc,EAAc,KAC5B,wBAAyB,GAA2B,EAAe,MACnE,yBAA0B,EAAkC,0BAAK,EAAQ,0BAA4B,KACrG,YAAa,EAAqB,aAAK,EAAQ,YAC/C,wBAAyB,KACzB,mBAAoB,CAAC,EACrB,kBAAmB,EACnB,0BAA2B,MAG/B,SAAS,IACL,GAAI,UAAU,OAAS,EAAG,CACtB,GAA6B,mBAAlB,EAIP,MAAM,IAAI,MAAM,gJAEpB,OAJI,EAAc,MAAM,EAAM,wBAAyB,WAIhD,IACX,CAMI,OAJA,EAAG,oBAAoB,mBAAmB,IACtC,EAAM,SAAY,EAAM,YAAc,EAAmB,4BACzD,EAAmB,oBAEhB,EAAM,WAErB,CA4DA,OA1DA,EAAmB,GAAiB,EACpC,EAAmB,iBAA4C,mBAAlB,EAGxC,EAAG,MAAM,iBAEV,EAAG,MAAM,OAAO,EAAoB,EAAG,aAAiB,IAE5D,EAAG,aAAiB,GAAE,KAAK,GAG3B,EAAG,MAAM,uBAAuB,EAAoB,GAEhD,EAAc,MACd,EAAM,MAAO,EACb,EAAM,YAAa,EACnB,EAAG,MAAM,OAAO,EAAoB,IAC7B,EAAyB,iBAChC,EAAG,MAAM,OAAO,EAAoB,GAGpC,EAAG,QAAsB,cACzB,EAAG,UAAoB,SAAE,GAAoB,GAK7C,EAA6B,SAAI,EAGjC,EAAM,2BAIN,EAAM,8CAA+C,EAMhD,EAAM,yBAAyB,WAChC,EAAM,yBAA2B,OAKpC,EAAM,YAAe,EAAyB,iBAC/C,EAAmB,oBAKnB,EAAM,0BAA4B,EAAmB,YACrD,EAAG,MAAM,gBAAgB,mBAAmB,EAAM,yBAA0B,EAAM,wBAA0B,WACxG,EAAmB,SACvB,GAGG,CACX,EA+BA,IAAI,EAAa,CACb,iBAAoB,EACpB,qBAAsB,WAClB,OAAO,KAAK,GAAe,iBAC/B,EACA,sBAAuB,SAAU,EAAI,EAAQ,GACzC,GAAI,KAAK,GAAe,MAAQ,IAAW,KACvC,MAAM,MAAM,oDAGhB,KAAK,GAAe,mBAAmB,GAAM,EAC7C,EAAY,OAAS,KAAK,GAAe,oBACzC,EAAY,SAAW,EAAO,YAClC,EACA,wBAAyB,WACrB,IAAI,EAAI,EAAY,EAAqB,KAAK,GAAe,mBAC7D,IAAK,KAAM,EACP,GAAI,EAAmB,eAAe,KAClC,EAAa,EAAmB,GAC3B,KAAK,cAAgB,EAAW,QAAQ,wBAA2B,EAAW,QAAQ,WAAW,EAAW,WAC7G,OAAO,CAIvB,EACA,UAAW,WAEH,KAAK,eAAiB,KAAK,GAAe,kBAC1C,KAAK,cAAa,EAE1B,EACA,SAAU,WACN,IAAI,EAAQ,KAAK,GACjB,OAAO,EAAM,SAAW,EAAM,kBAAoB,CACtD,EACA,gBAAiB,WAER,KAAK,uBAEC,KAAK,GAAe,UAC3B,KAAK,GAAe,SAAU,GAF9B,KAAK,uBAIb,EACA,sBAAuB,SAAU,GAC7B,GAAI,EAAO,gBAAkB,KAAK,GAAe,yBAA0B,CACvE,IAAI,EAAW,EAAO,UAAU,KAAK,UAAW,KAAM,SAClD,EAAY,EAAO,UAAU,KAAK,gBAAiB,MACvD,MAAO,CACH,QAAS,EACT,QAAS,WACL,EAAS,UACT,EAAU,SACd,EAER,CACI,OAAO,EAAO,UAAU,KAAK,sBAAuB,KAE5D,EACA,sBAAuB,WACnB,IAAI,EAAqB,KACrB,EAA4B,EAAuC,mBACnE,GAA6B,GAA6B,GAC1D,aAAa,KAAK,GAAe,2BACjC,KAAK,GAAe,0BAA4B,EAAG,MAAM,YAAW,WAChE,EAAmB,mBAAkB,EACzC,GAAG,IACI,EAAmB,aAC1B,EAAmB,cAAa,GAEhC,EAAmB,mBAAkB,EAE7C,EACA,kBAAmB,SAAU,GACzB,IAAI,EAAqB,KACrB,EAAQ,EAAmB,GAC3B,EAAc,EAAM,YACpB,GAAU,EAEd,IAAI,EAAM,mBASN,EAAM,WAAV,CAIA,GAAI,EAAM,2BAA6B,EAAG,MAAM,4BAA4B,EAAM,2BAA6B,GAAe,KAE1H,IAAK,EAAM,6CAEP,YADA,EAAmB,eAKvB,EAAM,8CAA+C,EAGzD,EAAM,kBAAmB,EACzB,IACI,EAAU,KAAK,kDAAkD,EACrE,CAAE,QACE,EAAM,kBAAmB,CAC7B,CAMA,OAJK,EAAM,mBACP,EAAmB,UAGhB,CAxBP,CAyBJ,EACA,kDAAmD,SAAU,GAKzD,IAAI,EAAqB,KACrB,EAAQ,EAAmB,GAC3B,GAAU,EAIV,EAAY,EAAM,KAAO,GAAa,EAAM,kBAC5C,EAA6B,CACzB,mBAAoB,EACpB,mBAAoB,EAAM,mBAC1B,cAAe,EAAM,mBAG7B,EAAG,oBAAoB,MAAM,CACzB,eAAgB,EAChB,SAAU,EACV,SAAU,EACV,UAAW,IAGf,EAAM,mBAAqB,CAAC,EAC5B,EAAM,kBAAoB,EAE1B,IAAI,EAAW,KAAK,qDAAqD,EAAO,GAuBhF,OArBI,EAAmB,YAAY,EAAM,YAAa,KAC7C,EAAM,YACP,EAAsC,kBAAE,EAAM,YAAa,gBAG/D,EAAM,YAAc,EACT,EAAmB,aAAe,EAEzC,EAAM,WACN,EAAmB,gBACZ,GACP,EAAsC,kBAAE,EAAM,aAGlD,GAAU,GAGV,GACA,EAAsC,kBAAE,EAAM,YAAa,SAGxD,CACX,EACA,qDAAsD,SAAU,EAAO,GAMnE,IACI,IAAI,EAAe,EAAM,aACzB,OAAO,EAAM,wBAA0B,EAAa,KAAK,EAAM,yBAA2B,GAC9F,CAAE,QACE,EAAG,oBAAoB,MAGnB,EAA2B,gBAAkB,EAAM,YACnD,EAAG,MAAM,cAAc,EAA2B,mBAAoB,GAG1E,EAAM,QAAU,EAAM,SAAU,CACpC,CACJ,EACA,KAAM,SAAU,GAGZ,IAAI,EAAQ,KAAK,GAIjB,OAHK,EAAM,UAAY,IAAa,EAAM,oBAAwB,EAAM,YAAc,KAAK,4BACvF,KAAK,oBAEF,EAAM,WACjB,EACA,MAAO,SAAU,GAEb,EAAG,aAAiB,GAAE,MAAM,KAAK,KAAM,GACvC,KAAK,eAAiB,WAMlB,OALI,KAAK,GAAe,QACpB,KAAK,oBAEL,KAAK,GAAe,SAAU,EAE3B,KAAK,GAAe,WAC/B,EACA,KAAK,aAAe,SAAU,GAC1B,KAAK,mBAAmB,KAAK,GAAe,aAG5C,KAAK,GAAe,SAAU,EAC1B,IACA,KAAK,GAAe,SAAU,GAKlC,KAAK,aAAa,KACtB,CACJ,EACA,QAAS,WACL,IAAI,EAAQ,KAAK,IACZ,EAAM,YAAc,EAAM,oBAC3B,EAAG,MAAM,cAAc,EAAM,oBAAoB,SAAU,EAAI,GACvD,EAAW,SACX,EAAW,SACnB,IAEA,EAAM,0BAA4B,EAAM,yBACxC,EAAG,MAAM,gBAAgB,sBAAsB,EAAM,yBAA0B,EAAM,yBAEzF,EAAM,mBAAqB,KAC3B,EAAM,kBAAoB,EAC1B,EAAM,YAAa,EACnB,EAAM,SAAU,EAChB,EAAM,SAAU,EAChB,EAAM,YAAa,EACnB,EAAM,yBAA2B,IACrC,GAGA,EAAwB,CACxB,sBAAuB,SAAU,GAE7B,IAAI,EAAqB,KACrB,EAAQ,EAAmB,GAC/B,IAAK,EAAM,YAAc,EAAM,YAAuB,UAAT,EAAmB,CAE5D,GADA,EAAM,YAAa,EACf,EAAM,SAAW,EAAmB,0BACpC,EAAM,mBAAqB,KAC3B,EAAM,kBAAoB,EACtB,EAAmB,qBACnB,EAAmB,oBAEpB,CAEH,IAAI,EAAmB,GACvB,EAAG,MAAM,cAAc,EAAM,oBAAoB,SAAU,EAAI,GAC3D,EAAiB,EAAW,QAAU,CAC1C,IAEA,EAAG,MAAM,aAAa,GAAkB,SAAU,EAAI,GAClD,IAAI,EAAa,EAAM,mBAAmB,GACtC,EAAe,EAAmB,sBAAsB,EAAW,SACvE,EAAa,OAAS,EACtB,EAAa,SAAW,EAAW,SACnC,EAAM,mBAAmB,GAAM,CACnC,GACJ,CACK,EAAM,YACP,EAAsC,kBAAE,EAAM,YAAa,QAEnE,CACJ,EACA,wBAAyB,SAAU,GAC/B,IAAI,EAAQ,KAAK,GACZ,EAAM,YAAuB,UAAT,GAAsB,KAAK,yBAAyB,YACzE,EAAG,MAAM,cAAc,EAAM,oBAAoB,SAAU,EAAI,GACvD,EAAW,UACX,EAAM,mBAAmB,GAAM,CAC3B,QAAS,EAAW,QACpB,OAAQ,EAAW,OACnB,SAAU,EAAW,UAEzB,EAAW,UAEnB,IACA,EAAM,YAAa,EACnB,KAAwB,kBAAE,EAAW,UAE7C,EACA,WAAY,WAIR,IAAI,EAAQ,KAAK,GAIjB,OAHI,EAAM,aAAe,EAAM,SAAW,KAAK,4BAC3C,KAAK,oBAEF,EAAG,aAAiB,GAAE,WAAW,KAAK,KACjD,GAGA,EAA2B,CAC3B,sBAAuB,SAAU,GAEhB,UAAT,GAA8B,gBAAT,GACrB,KAAK,MAEb,GAKA,EAAG,MAAM,iBACT,EAAG,MAAM,eAAe,EAAY,EAAG,aAAiB,IAI5D,IAkIQ,EAmdA,EAwgCA,EA7lDJ,EAAY,EAAG,WAAW,cAC9B,EAAG,SAAS,GAAa,EAAG,WAC5B,EAAW,GAAa,EAAG,SAE3B,EAAG,WAAa,SAAU,GACtB,OAAO,EAAG,aAAa,EAAU,EAAG,SACxC,EAEA,EAAG,eAAiB,SAAU,GAC1B,OAAO,EAAG,aAAa,EAAU,EAAG,WAC7B,EAAS,IAAkB,EAAS,GAAe,IAC9D,EAEA,EAAG,aAAa,WAAY,EAAG,UAC/B,EAAG,aAAa,sBAAuB,EAAG,UAC1C,EAAG,aAAa,aAAc,EAAG,YACjC,EAAG,aAAa,iBAAkB,EAAG,gBACrC,EAAG,aAAa,cAAe,GAC/B,EAAG,eAAe,EAAY,OAAQ,EAAW,MACjD,EAAG,eAAe,EAAY,UAAW,EAAW,SACpD,EAAG,eAAe,EAAY,WAAY,EAAW,UACrD,EAAG,eAAe,EAAY,uBAAwB,EAAW,sBAEjE,EAAG,aAAe,SAAU,EAA4B,GACpD,MAA0C,mBAA/B,EACA,EAAG,SAAS,EAA4B,EAAyB,CAAC,MAAO,MAEhF,EAA6B,EAAG,MAAM,OAAO,CAAC,EAAG,IAChB,MAAI,EAC9B,EAAG,SAAS,EAA4B,GAEvD,EACA,EAAG,aAAa,eAAgB,EAAG,cAEnC,WAqBI,SAAS,EAAiB,EAAY,EAAkB,GAKpD,GAJA,EAAiB,GAAkB,IAAI,EAGO,iBAD9C,EAAa,EAAiB,KAC6C,OAAf,GAAyB,IAAe,GAAiB,aAAsB,QAAe,aAAsB,MAAa,aAAsB,QAAe,aAAsB,QAAe,aAAsB,QAEzR,OAAO,EAEX,IAAI,EAAmB,aAAsB,MAAQ,GAAK,CAAC,EAuB3D,OAtBA,EAAe,KAAK,EAAY,GAyBpC,SAAuC,EAAY,GAC/C,GAAI,aAAsB,MAAO,CAC7B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,OAAQ,IACnC,EAAgB,GAGe,mBAAxB,EAAmB,QAC1B,EAAgB,SACxB,MACI,IAAK,IAAI,KAAgB,EACrB,EAAgB,EAG5B,CApCI,CAA8B,GAAY,SAAS,GAC/C,IAAI,EAAgB,EAAiB,EAAW,IAEhD,cAAe,GACX,IAAK,UACL,IAAK,SACL,IAAK,SACL,IAAK,WACD,EAAiB,GAAW,EAC5B,MACJ,IAAK,SACL,IAAK,YACD,IAAI,EAAwB,EAAe,IAAI,GAC/C,EAAiB,GAAY,IAA0B,EACjD,EACA,EAAiB,EAAe,EAAkB,GAGpE,IAEO,CACX,CAiBA,SAAS,IACL,KAAK,KAAO,GACZ,KAAK,OAAS,EAClB,CAtEA,EAAG,KAAO,SAAS,GACf,GAAwB,GAApB,UAAU,OACV,MAAM,IAAI,MAAM,8DAGpB,OAAO,EAAiB,GAAY,SAAS,GAEzC,IAAK,IAAI,EAAI,EAAG,EAAG,aAAa,IAAgB,EATzB,GASwD,IAC3E,EAAa,IACjB,OAAO,CACX,GACJ,EAEA,EAAG,OAAS,SAAS,EAAY,EAAU,GACvC,IAAI,EAAwB,EAAG,KAAK,GACpC,OAAO,EAAG,MAAM,cAAc,EAAuB,EAAU,EACnE,EAwDA,EAAa,UAAY,CACrB,YAAa,EACb,KAAM,SAAS,EAAK,GAChB,IAAI,EAAgB,EAAG,MAAM,aAAa,KAAK,KAAM,GACjD,GAAiB,EACjB,KAAK,OAAO,GAAiB,GAE7B,KAAK,KAAK,KAAK,GACf,KAAK,OAAO,KAAK,GAEzB,EACA,IAAK,SAAS,GACV,IAAI,EAAgB,EAAG,MAAM,aAAa,KAAK,KAAM,GACrD,OAAQ,GAAiB,EAAK,KAAK,OAAO,GAAiB,CAC/D,EAEP,CA3FD,GA6FA,EAAG,aAAa,OAAQ,EAAG,MAC3B,EAAG,aAAa,SAAU,EAAG,QAErB,EAA4B,gCAKhC,EAAG,iBAAmB,CAClB,UAAY,SAAS,GACjB,OAAQ,EAAG,MAAM,aAAa,IAC1B,IAAK,SACD,OAA2C,IAAvC,EAAQ,GACD,EAAG,MAAM,QAAQ,IAAI,EAAS,EAAG,gBAAgB,QAAQ,uBAC7D,EAAG,MAAM,WAAa,EACtB,EAAQ,iBAAiB,UAAY,EAAQ,iBAAiB,SAAS,UAAY,EAAQ,MAAQ,EAAQ,KAC5G,EAAQ,MAClB,IAAK,SACD,OAAO,EAAQ,eAAiB,EAAI,EAAG,iBAAiB,UAAU,EAAQ,QAAQ,EAAQ,gBAAkB,EAChH,QACI,OAAO,EAAQ,MAE3B,EAEA,WAAY,SAAS,EAAS,EAAO,GACjC,OAAQ,EAAG,MAAM,aAAa,IAC1B,IAAK,SAEQ,iBADK,GAEN,EAAG,MAAM,QAAQ,IAAI,EAAS,EAAG,gBAAgB,QAAQ,sBAAuB,GAC5E,KAA6B,UACtB,EAAQ,GAEnB,EAAQ,MAAQ,IAIhB,EAAG,MAAM,QAAQ,IAAI,EAAS,EAAG,gBAAgB,QAAQ,sBAAuB,GAChF,EAAQ,IAA6B,EAGrC,EAAQ,MAAyB,iBAAV,EAAqB,EAAQ,IAG5D,MACJ,IAAK,SACa,KAAV,GAA0B,OAAV,IAChB,EAAQ,GAEZ,IADA,IAC4C,EADxC,GAAa,EACR,EAAI,EAAG,EAAI,EAAQ,QAAQ,OAAqB,EAAI,IAAK,EAG9D,IAFA,EAAc,EAAG,iBAAiB,UAAU,EAAQ,QAAQ,MAEzC,GAAyB,IAAf,GAAqB,IAAU,EAAY,CACpE,EAAY,EACZ,KACJ,EAEA,GAAc,GAAa,GAAM,IAAU,GAAa,EAAQ,KAAO,KACvE,EAAQ,cAAgB,GAE5B,MACJ,QACmB,OAAV,GAAoB,IAAU,IAC/B,EAAQ,IACZ,EAAQ,MAAQ,EAG5B,GAIR,EAAG,aAAa,mBAAoB,EAAG,kBACvC,EAAG,aAAa,6BAA8B,EAAG,iBAAiB,WAClE,EAAG,aAAa,8BAA+B,EAAG,iBAAiB,YACnE,EAAG,oBAAsB,WACrB,IAAI,EAA0B,CAAC,OAAQ,QAAS,OAAQ,aAKpD,EAA6B,uDAmB7B,EAAW,iBAWX,EAAe,OAAO,qFAPW,EAAW,UAAY,EAOlC,WAAmG,KAGzH,EAAqB,uBACrB,EAAyB,CAAC,GAAK,EAAE,OAAS,EAAE,OAAS,GAEzD,SAAS,EAAmB,GAExB,IAAI,EAAM,EAAG,MAAM,WAAW,GAGJ,MAAtB,EAAI,WAAW,KAAY,EAAM,EAAI,MAAM,GAAI,IAGnD,IAAiD,EAA7C,EAAS,GAAI,EAAO,EAAI,MAAM,GAAoB,EAAS,GAAI,EAAQ,EAE3E,GAAI,EAAM,CAEN,EAAK,KAAK,KAEV,IAAK,IAAW,EAAP,EAAI,EAAQ,EAAM,EAAK,KAAM,EAAG,CACrC,IAAI,EAAI,EAAI,WAAW,GAEvB,GAAU,KAAN,GACA,GAAI,GAAS,EAAG,CACZ,EAAO,KAAM,GAAO,EAAO,OAAU,CAAC,IAAK,EAAK,MAAO,EAAO,KAAK,KAAO,CAAC,QAAW,GAAO,EAAO,KAAK,MACzG,EAAM,EAAQ,EACd,EAAS,GACT,QACJ,OAEG,GAAU,KAAN,GACP,IAAK,IAAU,GAAyB,IAAlB,EAAO,OAAc,CACvC,EAAM,EAAO,MACb,QACJ,OAEG,GAAU,KAAN,GAAY,GAAK,EAAI,OAAS,EAAG,CAExC,IAAI,EAAQ,EAAK,EAAE,GAAG,MAAM,GACxB,IAAU,EAAuB,EAAM,OAGvC,GADA,EAAM,EAAI,OAAO,EAAI,QAAQ,GAAO,IACzB,MAAM,IACZ,KAAK,KACV,GAAK,EAEL,EAAM,IAGd,MAAiB,KAAN,GAAkB,MAAN,GAAmB,KAAN,IAC9B,EACW,KAAN,GAAkB,MAAN,GAAmB,KAAN,IAC9B,EAEM,GAAQ,EAAO,QAAiB,KAAN,GAAkB,KAAN,IAC9C,EAAM,EAAI,MAAM,GAAI,IAExB,EAAO,KAAK,EAChB,CACJ,CACA,OAAO,CACX,CAGA,IAAI,EAAiB,CAAC,EA4CtB,MAAO,CACH,yBAA0B,GAE1B,eAAgB,EAEhB,mBAAoB,EAEpB,mBAjDJ,SAA4B,EAA+B,GAGvD,SAAS,EAAgB,EAAK,GAC1B,IAAI,EACwB,EAG5B,IAAK,EAAe,CAChB,IAJwB,EAIA,EAAsB,kBAAE,KAHjC,EAAgB,cAAM,EAAM,EAAgB,WAAE,EAAK,EAAK,IAInE,OAEA,EAAe,KAAS,EA3GxC,SAA2B,GACvB,GAAI,EAAG,MAAM,aAAa,EAAyB,IAAe,EAC9D,OAAO,EACX,IAAI,EAAQ,EAAW,MAAM,GAC7B,OAAiB,OAAV,IAAyB,EAAM,GAAM,UAAY,EAAM,GAAK,IAAM,EAAM,GAAM,EACzF,CAsGsD,CAAkB,KAGxD,EAA8B,KAAK,IAAM,EAAM,kBAAoB,EAAc,OAEzF,CAEI,IACA,EAAM,qBAAuB,EAAM,MAEvC,EAAc,KAAK,IAAM,EAAM,KAAO,EAC1C,CAEA,IAAI,EAAgB,GAChB,EAAgC,GAChC,GA1BJ,EAAiB,GAAkB,CAAC,GA0BoB,eACpD,EAAgB,EAA8B,cAC9C,EAAyD,iBAAlC,EACnB,EAAmB,GAAiC,EAS5D,OAPA,EAAG,MAAM,aAAa,GAAe,SAAS,GAC1C,EAAgB,EAAS,KAAO,EAAkB,QAAG,EAAS,MAClE,IAEI,EAA8B,QAC9B,EAAgB,uBAAwB,IAAM,EAA8B,KAAK,KAAO,MAErF,EAAc,KAAK,IAC9B,EAWI,yBAA0B,SAAS,EAAe,GAC9C,IAAK,IAAI,EAAI,EAAG,EAAI,EAAc,OAAQ,IACtC,GAAI,EAAc,GAAQ,KAAK,EAC3B,OAAO,EACf,OAAO,CACX,EAWA,qBAAsB,SAAS,EAAU,EAAa,EAAK,EAAO,GAC9D,GAAK,GAAa,EAAG,aAAa,IAIvB,EAAG,sBAAsB,IAAe,GAAoB,EAAS,SAAW,GACvF,EAAS,OALgC,CACzC,IAAI,EAAc,EAAY,IAAI,wBAC9B,GAAe,EAAY,IAC3B,EAAY,GAAK,EACzB,CAGJ,EAEP,CApLwB,GAsLzB,EAAG,aAAa,sBAAuB,EAAG,qBAC1C,EAAG,aAAa,+CAAgD,EAAG,oBAAoB,0BACvF,EAAG,aAAa,yCAA0C,EAAG,oBAAoB,oBACjF,EAAG,aAAa,yCAA0C,EAAG,oBAAoB,oBASjF,EAAG,aAAa,sCAAuC,EAAG,oBAAoB,gBAI9E,EAAG,aAAa,0BAA2B,EAAG,qBAC9C,EAAG,aAAa,0DAA2D,EAAG,oBAAoB,oBAClG,WAYI,IAAI,EAA+B,GAAoD,sBAAxC,EAAS,cAAc,QAAQ,KAE1E,EAAoB,EAA+B,qCAAuC,8BAC1F,EAAoB,EAA+B,sBAAwB,eAC3E,EAAwC,CAAE,IAAM,EAAM,IAAM,GAEhE,SAAS,EAAe,GACpB,OAAyB,GAAjB,EAAK,UAAkB,EAAkB,KAAK,EAA+B,EAAK,KAAO,EAAK,UAC1G,CAEA,SAAS,EAAa,GAClB,OAAyB,GAAjB,EAAK,UAAkB,EAAgB,KAAK,EAA+B,EAAK,KAAO,EAAK,UACxG,CAEA,SAAS,EAAmB,EAAc,GAItC,IAHA,IAAI,EAAc,EACd,EAAQ,EACR,EAAW,GACR,EAAc,EAAY,aAAa,CAC1C,GAAI,EAAa,IAEC,KADd,EAEI,OAAO,EAGf,EAAS,KAAK,GAEV,EAAe,IACf,GACR,CACA,IAAK,EACD,MAAM,IAAI,MAAM,6CAA+C,EAAa,WAChF,OAAO,IACX,CAEA,SAAS,EAAsB,EAAc,GACzC,IAAI,EAAqB,EAAmB,EAAc,GAC1D,OAAI,EACI,EAAmB,OAAS,EACrB,EAAmB,EAAmB,OAAS,GAAG,YACtD,EAAa,YAEb,IACf,CAEA,SAAS,EAAuB,GAG5B,IAAI,EAAY,EAAK,WAAY,EAAmB,KACpD,GAAI,EACA,GACI,GAAI,EACA,EAAiB,KAAK,QACrB,GAAI,EAAe,GAAY,CAChC,IAAI,EAAqB,EAAsB,GAAkC,GAC7E,EACA,EAAY,EAEZ,EAAmB,CAAC,EAC5B,MAAW,EAAa,KACpB,EAAmB,CAAC,UAEnB,EAAY,EAAU,aAEnC,OAAO,CACX,CAEA,EAAG,gBAAkB,CACjB,gBAAiB,CAAC,EAElB,WAAY,SAAS,GACjB,OAAO,EAAe,GAAQ,EAAmB,GAAQ,EAAK,UAClE,EAEA,UAAW,SAAS,GAChB,GAAK,EAAe,GAIhB,IADA,IAAI,EAAkB,EAAG,gBAAgB,WAAW,GAC3C,EAAI,EAAG,EAAI,EAAgB,OAAQ,EAAI,EAAG,IAC/C,EAAG,WAAW,EAAgB,SAJlC,EAAG,MAAM,aAAa,EAM9B,EAEA,mBAAoB,SAAS,EAAM,GAC/B,GAAK,EAAe,GAEf,CACD,EAAG,gBAAgB,UAAU,GAE7B,IADA,IAAI,EAAiB,EAAK,YACjB,EAAI,EAAG,EAAI,EAAW,OAAQ,EAAI,EAAG,IAC1C,EAAe,WAAW,aAAa,EAAW,GAAI,EAC9D,MANI,EAAG,MAAM,mBAAmB,EAAM,EAO1C,EAEA,QAAS,SAAS,EAAe,GACxB,EAAe,GAOhB,EAAc,WAAW,aAAa,EAAe,EAAc,aAN/D,EAAc,WACd,EAAc,aAAa,EAAe,EAAc,YAExD,EAAc,YAAY,EAKtC,EAEA,YAAa,SAAS,EAAe,EAAc,GAC1C,EAEO,EAAe,GAQvB,EAAc,WAAW,aAAa,EAAc,EAAgB,aANhE,EAAgB,YAChB,EAAc,aAAa,EAAc,EAAgB,aAEzD,EAAc,YAAY,GAN9B,EAAG,gBAAgB,QAAQ,EAAe,EAWlD,EAEA,WAAY,SAAS,GACjB,OAAK,EAAe,IAEf,EAAK,aAAe,EAAa,EAAK,aAChC,KACJ,EAAK,YAHD,EAAK,UAIpB,EAEA,YAAa,SAAS,GAGlB,OAFI,EAAe,KACf,EAAO,EAAsB,IAC7B,EAAK,aAAe,EAAa,EAAK,aAC/B,KACJ,EAAK,WAChB,EAEA,gBAAiB,EAEjB,wBAAyB,SAAS,GAC9B,IAAI,GAAc,EAA+B,EAAK,KAAO,EAAK,WAAW,MAAM,GACnF,OAAO,EAAa,EAAW,GAAK,IACxC,EAEA,oCAAqC,SAAS,GAI1C,GAAK,EAAsC,EAAG,MAAM,aAAa,IAAjE,CAKA,IAAI,EAAY,EAAgB,WAChC,GAAI,EACA,GACI,GAA2B,IAAvB,EAAU,SAAgB,CAC1B,IAAI,EAAiB,EAAuB,GAC5C,GAAI,EAGA,IADA,IAAI,EAAqB,EAAU,YAC1B,EAAI,EAAG,EAAI,EAAe,OAAQ,IACnC,EACA,EAAgB,aAAa,EAAe,GAAI,GAEhD,EAAgB,YAAY,EAAe,GAG3D,QACK,EAAY,EAAU,YApBzB,CAsBd,EAEP,CA1LD,GA2LA,EAAG,aAAa,kBAAmB,EAAG,iBACtC,EAAG,aAAa,kCAAmC,EAAG,gBAAgB,iBACtE,EAAG,aAAa,4BAA6B,EAAG,gBAAgB,WAEhE,EAAG,aAAa,8BAA+B,EAAG,gBAAgB,aAElE,EAAG,aAAa,0BAA2B,EAAG,gBAAgB,SAC9D,EAAG,aAAa,qCAAsC,EAAG,gBAAgB,oBAEjE,EAA8B,YAElC,EAAG,gBAAkB,WACjB,KAAK,aAAe,CAAC,CACzB,EAEA,EAAG,MAAM,OAAO,EAAG,gBAAgB,UAAW,CAC1C,gBAAmB,SAAS,GACxB,OAAQ,EAAK,UACT,KAAK,EACD,OAAyD,MAAlD,EAAK,aAAa,IAClB,EAAG,WAAoC,wBAAE,GACpD,KAAK,EACD,OAAO,EAAG,gBAAgB,gBAAgB,GAC9C,QAAS,OAAO,EAExB,EAEA,YAAe,SAAS,EAAM,GAC1B,IAAI,EAAiB,KAAwB,kBAAE,EAAM,GACjD,EAAiB,EAAiB,KAA0B,oBAAE,EAAgB,EAAgB,GAAQ,KAC1G,OAAO,EAAG,WAAW,4BAA4B,EAAgB,EAAM,GAAqC,EAChH,EAEA,oBAAuB,SAAS,EAAM,GAClC,IAAI,EAAiB,KAAwB,kBAAE,EAAM,GACjD,EAAiB,EAAiB,KAA0B,oBAAE,EAAgB,EAAgB,EAAM,CAAE,gBAAkB,IAAU,KACtI,OAAO,EAAG,WAAW,4BAA4B,EAAgB,EAAM,GAAqC,EAChH,EAIA,kBAAqB,SAAS,EAAM,GAChC,OAAQ,EAAK,UACT,KAAK,EAAG,OAAO,EAAK,aAAa,GACjC,KAAK,EAAG,OAAO,EAAG,gBAAgB,wBAAwB,GAC1D,QAAS,OAAO,KAExB,EAIA,oBAAuB,SAAS,EAAgB,EAAgB,EAAM,GAClE,IACI,IAAI,EAWhB,SAA+C,EAAgB,EAAO,GAClE,IAAI,EAAW,GAAkB,GAAW,EAAwB,gBAAK,IACzE,OAAO,EAAM,KACL,EAAM,GAGlB,SAAuC,EAAgB,GAInD,IAAI,EAAoB,EAAG,oBAAoB,mBAAmB,EAAgB,GAElF,OAAO,IAAI,SAAS,WAAY,WADb,yCAA2C,EAAoB,MAEtF,CAV8B,CAA8B,EAAgB,GAC5E,CAfkC,CAAsC,EAAgB,KAAK,aAAc,GAC/F,OAAO,EAAgB,EAAgB,EAC3C,CAAE,MAAO,GAEL,MADA,EAAG,QAAU,8CAAgD,EAAiB,cAAgB,EAAG,QAC3F,CACV,CACJ,IAGJ,EAAG,gBAA0B,SAAI,IAAI,EAAG,gBAkB5C,EAAG,aAAa,kBAAmB,EAAG,iBACtC,WACI,EAAG,gBAAkB,CAAC,EAGtB,IAAI,EAAwC,CAMxC,QAAU,EACV,UAAY,EACZ,UAAY,GA2IhB,SAAS,EAAkB,GACvB,OAAO,WACH,OAAO,CACX,CACJ,CAGA,SAAS,EAAsB,GAC3B,OAAO,GACX,CAMA,SAAS,EAA0B,GAC/B,OAAO,EAAG,MAAM,UAAU,EAAG,oBAAoB,OAAO,IAAW,SAAS,EAAO,GAC/E,OAAO,WACH,OAAO,IAAW,EACtB,CACJ,GACJ,CAcA,SAAS,EAA4B,EAAM,GACvC,OAAO,EAA0B,KAAkB,YAAE,KAAK,KAAM,EAAM,GAC1E,CAQA,SAAS,EAAoC,EAAgB,EAAyB,GAClF,IAAI,EACA,EAAc,EAAG,gBAAgB,WAAW,GAC5C,EAAW,EAAG,gBAA0B,SACxC,EAAiB,EAAyB,eAM9C,GAAI,EAAgB,CAChB,KAAO,EAAe,GAClB,EAAc,EAAG,gBAAgB,YAAY,GAC7C,EAAe,KAAK,EAAU,GAGlC,EAAc,EAAG,gBAAgB,WAAW,EAChD,CAEA,KAAO,EAAe,GAElB,EAAc,EAAG,gBAAgB,YAAY,GAC7C,EAA0C,EAAgB,EAAc,EAEhF,CAEA,SAAS,EAA2C,EAAgB,EAAc,GAC9E,IAAI,GAAwB,EAMxB,EAAuC,IAA1B,EAAa,SAC1B,GACA,EAAG,gBAAgB,oCAAoC,IAEhC,GAAa,GACd,EAAG,gBAA0B,SAAmB,gBAAE,MAExE,EAAwB,EAA4B,EAAc,KAAM,EAAgB,GAAoE,uBAE5J,IAA0B,EAAsC,EAAG,MAAM,aAAa,KAOtF,EAAmC,EAAgB,GAAmE,EAE9H,CAvOA,EAAsB,kBAAI,SAAS,GAC/B,OAAO,EAAG,gBAAgB,EAC9B,EAIA,EAAG,eAAiB,SAAS,EAAoB,EAAe,EAAe,EAAgB,GAK3F,SAAS,IAKL,IAAI,EAAuB,EAAS,IAAuB,EACvD,EAAW,EAAG,MAAM,iBAAiB,GAiCzC,OA/BI,GAGI,EAAc,eACd,EAAc,gBAGlB,EAAG,MAAM,OAAO,EAAM,GAGtB,EAAK,cAAgB,IAErB,EAAe,SAAI,GACnB,EAAY,MAAI,EAKhB,EAAS,GAAI,GAEjB,EAAe,SAAI,EACnB,EAAY,MAAI,EACZ,IACA,EAAK,GAAiB,GAKtB,GACA,EAAe,EAAM,EAAe,GAEjC,EAAY,KACvB,CAKA,IAEI,EACA,EAHA,EAAO,KACP,EAAuC,mBAAxB,IAAuC,EAAG,aAAa,GAItE,GAAW,EAA4B,mBAGvC,KAEA,EAAe,EAAG,oBAAoB,EAAe,KAAM,CAAE,YAdjE,WACI,OAAO,IAAU,EAAG,MAAM,+BAA+B,EAC7D,EAY2F,0BAA0B,KAMhG,aACb,EAAK,cAAgB,EAGrB,EAA+B,iBAAI,KAQnC,EAAQ,GACR,EAAa,SAAW,SAAS,GAC7B,EAAM,KAAK,GACX,EAAG,MAAM,gBAAgB,mBAAmB,GAAM,SAAS,GACvD,EAAG,MAAM,gBAAgB,EAAO,GAC3B,EAAM,SACP,EAAa,UACb,EAAK,cAAgB,EAAe,EAE5C,GACJ,EAGZ,EAOA,EAAG,eAAe,UAA8B,mBAAI,SAAU,EAAoB,EAAe,EAAgB,GAC7G,OAAO,IAAI,EAAG,eAAe,EAAoB,KAAM,GAAe,SAAS,EAAM,GAEjF,EAAqB,eAAI,EACzB,EAAc,QAAI,EAAqB,MACvC,EAAe,UAAK,EAAwB,UAAK,IAAI,MAAM,GAC3D,EAAe,SAAE,QAAQ,EAAc,SACnC,GACA,EAAe,EACvB,GAAG,EACP,EAKA,EAAG,eAAe,UAAkB,OAAI,SAAS,GAG7C,OAAO,IAAI,EAAG,eAAe,KAAK,eAAiB,KAAY,MAAG,KAAM,MAAM,SAAS,EAAM,GAGzF,EAAe,SAAI,EAAwB,SAC3C,EAAG,MAAM,OAAO,EAA4B,mBAAhB,EAA6B,IAAe,EAC5E,GACJ,EAEA,EAAG,eAAe,UAAU,yBAA2B,SAAU,EAAoB,GACjF,OAAO,KAAyB,mBAAE,EAAoB,EAAe,KAAM,CAAE,oBAAsB,GACvG,EAqGA,IAAI,EAAyB,EAAG,MAAM,QAAQ,UAoC9C,SAAS,EAA4B,EAAM,EAAgB,EAAgB,GAEvE,IAeI,EAwBA,EAvCA,EAAe,EAAG,MAAM,QAAQ,IAAI,EAAM,GAC9C,IAAK,EAAgB,CACjB,GAAI,EACA,MAAM,MAAM,iEAEhB,EAAG,MAAM,QAAQ,IAAI,EAAM,GAAwB,EACvD,CAUA,IALK,GAAgB,GACjB,EAAG,4BAA4B,EAAM,GAIrC,GAA4C,mBAAnB,EACzB,EAAW,MACR,CACH,IAAI,EAAW,EAAG,gBAA0B,SACxC,EAAc,EAA8B,qBAAK,EAIjD,EAAkB,EAAG,qBACrB,WAKI,OAJA,EAAW,EAAiB,EAAe,EAAgB,GAAQ,EAAY,KAAK,EAAU,EAAM,KAEpF,EAAe,eAC3B,EAAe,gBACZ,CACX,GACA,KAAM,CAAE,yBAA0B,IAGjC,GAAa,EAAgB,aAC9B,EAAkB,KAC1B,CAGA,GAAI,EAAU,CAIV,IAAI,EAAmB,EACjB,SAAS,GACP,OAAO,WACH,OAAO,EAAsB,IAAkB,GACnD,CACJ,EAAI,SAAS,GACT,OAAO,EAAS,EACpB,EAGJ,SAAS,IACL,OAAO,EAAG,MAAM,UAAU,EAAkB,IAAoB,EAAU,EAC9E,CAEA,EAAiB,IAAI,SAAS,GAC1B,OAAO,EAAS,IAAQ,EAAsB,EAAiB,GACnE,EACA,EAAiB,IAAI,SAAS,GAC1B,OAAO,KAAO,CAClB,EAGA,IAAI,EArGZ,SAAiC,GAE7B,IAAI,EAAS,GACT,EAAqB,CAAC,EACtB,EAAwB,GA0B5B,OAzBA,EAAG,MAAM,cAAc,GAAU,SAAS,EAAY,GAClD,IAAK,EAAmB,GAAa,CACjC,IAAI,EAAU,EAAsB,kBAAE,GAClC,IAEI,EAAe,QACf,EAAsB,KAAK,GAC3B,EAAG,MAAM,aAAa,EAAe,OAAG,SAAS,GAC7C,GAAI,EAAS,GAAuB,CAChC,IAA4E,IAAxE,EAAG,MAAM,aAAa,EAAuB,GAC7C,MAAM,MAAM,iFAAmF,EAAsB,KAAK,OAE1H,EAAY,EAEpB,CACJ,IACA,EAAsB,UAG1B,EAAO,KAAK,CAAE,IAAK,EAAY,QAAS,KAE5C,EAAmB,IAAc,CACrC,CACJ,IAEO,CACX,CAsE8B,CAAwB,GAG9C,EAAG,MAAM,aAAa,GAAiB,SAAS,GAG5C,IAAI,EAAgB,EAAqB,QAAc,KACnD,EAAkB,EAAqB,QAAgB,OACvD,EAAa,EAAqB,IAEhB,IAAlB,EAAK,UA7KrB,SAAwD,GAEpD,IADgB,EAAG,gBAAgB,gBAAgB,GAE/C,MAAM,IAAI,MAAM,gBAAkB,EAAc,yCACxD,CA0KgB,CAA+C,GAGnD,IAEgC,mBAAjB,GACP,EAAG,oBAAoB,QAAO,WAC1B,IAAI,EAAa,EAAc,EAAM,EAAiB,GAAa,EAAa,EAAsB,MAAG,GAGzG,GAAI,GAAc,EAAuC,2BAAG,CACxD,GAAI,IAAiD,EACjD,MAAM,IAAI,MAAM,sBAAwB,EAA+C,QAAU,EAAa,gIAClH,EAA+C,CACnD,CACJ,IAI0B,mBAAnB,GACP,EAAG,qBACC,WACI,EAAgB,EAAM,EAAiB,GAAa,EAAa,EAAsB,MAAG,EAC9F,GACA,KACA,CAAE,yBAA0B,GAGxC,CAAE,MAAO,GAEL,MADA,EAAG,QAAU,8BAAiC,EAAa,KAAO,EAAS,GAAc,eAAkB,EAAG,QACxG,CACV,CACJ,GACJ,CAEA,MAAO,CACH,sBAAyB,IAAiD,EAElF,CAEA,IAAI,EAAiC,EAAG,MAAM,QAAQ,UAWtD,SAAS,EAAkB,GACvB,OAAO,GAA8B,aAAqC,EAAG,eACvE,EACA,IAAI,EAAG,eAAe,EAChC,CAdA,EAAG,4BAA8B,SAAU,EAAM,GAC7C,GAAwB,GAApB,UAAU,OAKV,OAAO,EAAG,MAAM,QAAQ,IAAI,EAAM,GAJlC,EAAG,MAAM,QAAQ,IAAI,EAAM,EAAgC,GACvD,EAAe,eACf,EAAe,cAAc,SAAS,EAIlD,EAQA,EAAG,4BAA8B,SAAU,EAAM,EAAU,GAGvD,OAFsB,IAAlB,EAAK,UACL,EAAG,gBAAgB,oCAAoC,GACpD,EAA4B,EAAM,EAAU,EAAkB,IAA4B,EACrG,EAEA,EAAG,oBAAsB,SAAU,EAAM,EAAU,GAC/C,IAAI,EAAU,EAAkB,GAChC,OAAO,EAAG,4BAA4B,EA7P1C,SAA8B,EAAU,EAAS,GAC7C,MAAwB,mBAAb,EACA,EAA0B,EAAS,KAAK,KAAM,EAAS,IAEvD,EAAG,MAAM,UAAU,EAAU,EAE5C,CAuPgD,CAAqB,EAAU,EAAS,GAAO,EAC/F,EAEA,EAAG,2BAA6B,SAAS,EAA2B,GACtC,IAAtB,EAAS,UAAwC,IAAtB,EAAS,UACpC,EAAmC,EAAkB,GAA4B,GAAU,EACnG,EAEA,EAAG,cAAgB,SAAU,EAA2B,GAMpD,IAJK,GAAkB,EAAe,SAClC,EAAiB,EAAe,QAGhC,GAAmC,IAAtB,EAAS,UAA0C,IAAtB,EAAS,SACnD,MAAM,IAAI,MAAM,sGACpB,EAAW,GAAY,EAAO,SAAS,KAEvC,EAA0C,EAAkB,GAA4B,GAAU,EACtG,EAGA,EAAG,WAAa,SAAS,GAErB,OAAQ,EAAK,UACT,KAAK,EACL,KAAK,EACD,IAAI,EAAU,EAAG,4BAA4B,GAC7C,GAAI,EAAS,OAAO,EACpB,GAAI,EAAK,WAAY,OAAO,EAAG,WAAW,EAAK,YAGvD,OAAO,CACX,EACA,EAAG,QAAU,SAAS,GAClB,IAAI,EAAU,EAAG,WAAW,GAC5B,OAAO,EAAU,EAAe,MAAI,CACxC,EAEA,EAAG,aAAa,kBAAmB,EAAG,iBACtC,EAAG,aAAa,gBAAiB,EAAG,eACpC,EAAG,aAAa,6BAA8B,EAAG,4BACjD,EAAG,aAAa,8BAA+B,EAAG,6BAClD,EAAG,aAAa,sBAAuB,EAAG,qBAC1C,EAAG,aAAa,aAAc,EAAG,YACjC,EAAG,aAAa,UAAW,EAAG,QACjC,CA3dD,GA4dA,SAAU,GACN,IAAI,EAA4B,CAAC,EAC7B,EAAyB,CAAC,EA6B9B,SAAS,EAAqB,EAAK,GAC/B,OAAO,EAAI,eAAe,GAAY,EAAI,GAAY,CAC1D,CAsDA,SAAS,EAA0B,EAAY,EAAoB,EAAU,GAEpE,IACD,EAAmB,EAAG,WAAoB,QAAE,MAAM,IAItD,IAAI,EAAyB,EAAiB,QAC9C,GAAI,EAAwB,CACxB,IAAI,EAAiB,EAAuB,GAC5C,GAAI,EAAgB,CAChB,IAAI,GAAa,EAgBjB,GAf6B,EAAe,MAAM,EAAwB,EAAmB,QAAO,SAAS,GACjG,EACA,EAAS,MACS,OAAX,EAEP,EAAS,GAGT,EAA0B,EAAY,EAAoB,EAAU,EAE5E,OAK2B,IAC3B,GAAa,GAKR,EAAiD,0BAClD,MAAM,IAAI,MAAM,wGAG5B,MAEI,EAA0B,EAAY,EAAoB,EAAU,EAE5E,MAEI,EAAS,KAEjB,CAhIA,EAAG,WAAa,CACZ,IAAK,SAAS,EAAe,GACzB,IAAI,EAAmB,EAAqB,EAAwB,GAChE,EAII,EAAiB,uBACjB,EAAG,oBAAoB,QAAO,WAC1B,EAAS,EAAiB,WAC9B,IAEA,EAAG,MAAM,UAAS,WAAa,EAAS,EAAiB,WAAa,IAmBtF,SAAgC,EAAe,GAC3C,IACI,EADA,EAAe,EAAqB,EAA2B,GAE9D,EA4BD,EAAa,UAAU,KA1BvB,EAAe,EAA0B,GAAiB,IAAI,EAAG,cACpD,UAAU,GA6B/B,SAA+B,EAAe,GAC1C,EAA0B,YAAa,CAAC,IAAgB,SAAS,GACzD,EAEA,EAA0B,gBAAiB,CAAC,EAAe,IAAS,SAAS,GACzE,EAAS,EAAY,EACzB,IAMA,EAAS,KAAM,KAEvB,GACJ,CA1CQ,CAAsB,GAAe,SAAS,EAAY,GACtD,IAAI,KAA4B,IAAU,EAAoB,aAC9D,EAAuB,GAAiB,CAAE,WAAY,EAAY,uBAAwB,UACnF,EAA0B,GAQ7B,GAAkB,EAGlB,EAAgC,kBAAE,GAElC,EAAG,MAAM,UAAS,WACd,EAAgC,kBAAE,EACtC,GAER,IACA,GAAiB,EAIzB,CAhDY,CAAuB,EAAe,EAE9C,EAEA,sBAAuB,SAAS,UACrB,EAAuB,EAClC,EAEA,2BAA4B,GA4GhC,EAAG,WAAoB,QAAI,GAE3B,EAAG,aAAa,aAAc,EAAG,YACjC,EAAG,aAAa,iBAAkB,EAAG,WAAW,KAChD,EAAG,aAAa,mCAAoC,EAAG,WAAW,sBACrE,CA7ID,GA8IA,WAYI,IAAI,EAAwB,CAAC,EAE7B,EAAG,WAAW,SAAW,SAAS,EAAe,GAC7C,IAAK,EACD,MAAM,IAAI,MAAM,6BAA+B,GAGnD,GAAI,EAAG,WAAW,aAAa,GAC3B,MAAM,IAAI,MAAM,aAAe,EAAgB,0BAGnD,EAAsB,GAAiB,CAC3C,EAEA,EAAG,WAAW,aAAe,SAAS,GAClC,OAAO,EAAsB,eAAe,EAChD,EAEA,EAAG,WAAW,WAAa,SAAS,UACzB,EAAsB,GAC7B,EAAG,WAAW,sBAAsB,EACxC,EAEA,EAAG,WAAW,cAAgB,CAC1B,UAAa,SAAS,EAAe,GAIjC,EAHa,EAAsB,eAAe,GAC5C,EAAsB,GACtB,KAEV,EAEA,cAAiB,SAAS,EAAe,EAAQ,GAC7C,IAAI,EAAgB,EAAkB,GACtC,EAAyB,EAAe,GAAQ,SAAS,IAsBjE,SAAuB,EAAe,EAAe,EAAQ,GACzD,IAAI,EAAS,CAAC,EACV,EAAuB,EACvB,EAAmB,WACgB,KAAzB,GACF,EAAS,EAEjB,EACA,EAAiB,EAAiB,SAClC,EAAkB,EAAkB,UAEpC,EACA,EAAyB,EAAe,GAAgB,SAAS,GAC7D,EAAG,WAAW,2BAA2B,eAAgB,CAAC,EAAe,IAAe,SAAS,GAC7F,EAAiB,SAAI,EACrB,GACJ,GACJ,IAEA,IAGA,EACA,EAAyB,EAAe,GAAiB,SAAS,GAC9D,EAAG,WAAW,2BAA2B,gBAAiB,CAAC,EAAe,IAAe,SAAS,GAC9F,EAAO,GAAsB,EAC7B,GACJ,GACJ,IAEA,GAER,CArDY,CAAc,EAAe,EAAe,EAAc,EAC9D,GACJ,EAEA,aAAgB,SAAS,EAAe,EAAgB,IAmD5D,SAAyB,EAAe,EAAgB,GACpD,GAA8B,iBAAnB,EAEP,EAAS,EAAG,MAAM,kBAAkB,SACjC,GAAI,aAA0B,MAEjC,EAAS,QACN,GAAI,EAAmB,GAE1B,EAAS,EAAG,MAAM,UAAU,EAAe,kBACxC,GAAI,EAAwB,QAAG,CAClC,IAAI,EAAU,EAAwB,QACtC,GAgEc,EAhEG,EAiEjB,EAAoB,YACb,aAAe,YAEf,GAAO,EAAI,SAA4B,IAAjB,EAAI,SAlE7B,EAAS,EAAoC,SAC1C,GAAuB,iBAAZ,EAAsB,CAEpC,IAAI,EAAe,EAAS,eAAe,GACvC,EACA,EAAS,EAAoC,IAE7C,EAAc,+BAAiC,EAEvD,MACI,EAAc,yBAA2B,EAEjD,MACI,EAAc,2BAA6B,GAiDnD,IAAsB,CA/CtB,CA/EQ,CAAgB,EAAkB,GAAgB,EAAgB,EACtE,EAEA,cAAiB,SAAS,EAAe,EAAiB,GACtD,EAAiB,EAAkB,GAAgB,EAAiB,EACxE,GAGJ,IAAI,EAAqB,kBAyEzB,SAAS,EAAiB,EAAe,EAAiB,GACtD,GAA+B,mBAApB,EAKP,GAAS,SAAU,GACf,OAAO,IAAI,EAAgB,EAC/B,SACG,GAAmD,mBAAxC,EAAgB,GAE9B,EAAS,EAAgB,SACtB,GAAI,aAAc,EAAiB,CAEtC,IAAI,EAAgB,EAA0B,SAC9C,GAAS,SAAU,EAAQ,GACvB,OAAO,CACX,GACJ,KAAW,cAAe,EAEtB,EAAiB,EAAe,EAA2B,UAAG,GAE9D,EAAc,4BAA8B,EAEpD,CAEA,SAAS,EAAoC,GACzC,OAAQ,EAAG,MAAM,aAAa,IAC1B,IAAK,SACD,OAAO,EAAG,MAAM,kBAAkB,EAAa,MACnD,IAAK,WACD,OAAO,EAAG,MAAM,kBAAkB,EAAa,OACnD,IAAK,WAGD,GAAI,EAAmB,EAAa,SAChC,OAAO,EAAG,MAAM,WAAW,EAAa,QAAQ,YAM5D,OAAO,EAAG,MAAM,WAAW,EAAa,WAC5C,CAUA,SAAS,EAAmB,GACxB,OAAI,EAAyB,iBAClB,aAAe,iBAEf,GAAwB,KAAjB,EAAI,QAE1B,CAEA,SAAS,EAAyB,EAAe,EAAQ,GACpB,iBAAtB,EAAgB,QAEnB,GAAc,EAAgB,SAC7B,GAAc,EAAgB,SAAG,CAAC,EAAgB,SAAI,GAEvD,EAAc,8CAGlB,EAAS,EAEjB,CAEA,SAAS,EAAkB,GACvB,OAAO,SAAU,GACb,MAAM,IAAI,MAAM,cAAiB,EAAgB,MAAS,EAC9D,CACJ,CAEA,EAAG,aAAa,sBAAuB,EAAG,WAAW,UACrD,EAAG,aAAa,0BAA2B,EAAG,WAAW,cACzD,EAAG,aAAa,wBAAyB,EAAG,WAAW,YAIvD,EAAG,aAAa,2BAA4B,EAAG,WAAW,eAG1D,EAAG,WAAoB,QAAE,KAAK,EAAG,WAAW,eAG5C,EAAG,WAAW,yBAA2B,CAC5C,CAjOD,GAkOA,WAGI,EAAG,WAAoC,wBAAI,SAAS,GAChD,IAAI,EAAe,EAAG,MAAM,aAAa,GACzC,GAAI,EAAG,WAAW,aAAa,MAEO,GAA9B,EAAa,QAAQ,MAAe,GAAK,GAAS,+BAAkC,EAAG,MAAM,WAAa,GAAK,EAAK,UAAY,GAChI,OAAO,CAGnB,EAEA,EAAG,WAAW,4BAA8B,SAAS,EAAa,EAAM,EAAgB,GAEpF,GAAsB,IAAlB,EAAK,SAAgB,CACrB,IAAI,EAAgB,EAAG,WAAoC,wBAAE,GAC7D,GAAI,EAAe,CAIf,IAFA,EAAc,GAAe,CAAC,GAEH,UAEvB,MAAM,IAAI,MAAM,+EAGpB,IAAI,EAAwB,CAAE,KAAQ,EAAe,OAAU,EAAoC,EAAM,IAEzG,EAAuB,UAAI,EACrB,WAAa,OAAO,CAAuB,EAC3C,CACV,CACJ,CAEA,OAAO,CACX,EAEA,IAuD0C,EAvDtC,EAAgC,IAAI,EAAG,gBAE3C,SAAS,EAAoC,EAAM,GAC/C,IAAI,EAAkB,EAAK,aAAa,UAExC,GAAI,EAAiB,CACjB,IAAI,EAAS,EAAmD,oBAAE,EAAiB,EAAgB,EAAM,CAAE,gBAAkB,EAAM,eAAiB,IAChJ,EAAyB,EAAG,MAAM,UAAU,GAAQ,SAAS,EAAY,GACrE,OAAO,EAAG,SAAS,EAAY,KAAM,CAAE,yBAA0B,GACrE,IACA,EAAS,EAAG,MAAM,UAAU,GAAwB,SAAS,EAAoB,GAC7E,IAAI,EAAa,EAAmB,OAEpC,OAAK,EAAmB,WASb,EAAG,SAAS,CACf,KAAQ,WACJ,OAAO,EAAG,MAAM,iBAAiB,IACrC,EACA,MAAS,EAAG,sBAAsB,IAAe,SAAS,GACtD,IAAqB,EACzB,EACA,yBAA0B,IAbvB,CAgBf,IASJ,OAJK,EAAO,eAAe,UACvB,EAAa,KAAI,GAGd,CACX,CAII,MAAO,CAAE,KAAQ,CAAC,EAE1B,CAKI,EAAG,MAAM,UAAY,IAErB,EAAG,WAAqB,UAAc,EAKnC,EAAG,WAAqB,SAJhB,SAAS,GAEZ,OADA,EAAS,cAAc,GAChB,EAAiB,MAAM,KAAM,UACxC,GAKJ,EAAS,uBAAyB,SAAU,GACxC,OAAO,WACH,IAAI,EAAa,IACb,EAAgB,EAAG,WAAW,yBAClC,IAAK,IAAI,KAAiB,EAClB,EAAc,eAAe,IAC7B,EAAW,cAAc,GAGjC,OAAO,CACX,CACH,CAXiC,CAW/B,EAAS,wBAEnB,CAlHD,GAoHQ,EAAoC,EAExC,EAAG,gBAA2B,UAAI,CAC9B,KAAQ,SAAS,EAAS,EAAe,EAAU,EAAU,GACzD,IAAI,EACA,EACA,EAAsC,WAClC,IAAI,EAA0B,GAAoB,EAA0B,QACrC,mBAA5B,GACP,EAAwB,KAAK,GAEjC,EAAmB,KAEnB,EAA4B,IAChC,EACA,EAAqB,EAAG,MAAM,UAAU,EAAG,gBAAgB,WAAW,IA4C1E,OA1CA,EAAG,MAAM,gBAAgB,mBAAmB,EAAS,GAErD,EAAG,UAAS,WACR,IACI,EAAe,EADf,EAAQ,EAAG,MAAM,iBAAiB,KAUtC,GAPqB,iBAAV,EACP,EAAgB,GAEhB,EAAgB,EAAG,MAAM,iBAAiB,EAAY,MACtD,EAAkB,EAAG,MAAM,iBAAiB,EAAc,UAGzD,EACD,MAAM,IAAI,MAAM,+BAGpB,IAAI,EAAqB,IAA8B,EACvD,EAAG,WAAW,IAAI,GAAe,SAAS,GAEtC,GAAI,IAA8B,EAAlC,CAQA,GAHA,KAGK,EACD,MAAM,IAAI,MAAM,sBAAyB,EAAgB,MAmB7E,SAAkC,EAAe,EAAqB,GAClE,IAAI,EAAW,EAA8B,SAC7C,IAAK,EACD,MAAM,IAAI,MAAM,cAAiB,EAAgB,qBAGrD,IAAI,EAAmB,EAAG,MAAM,WAAW,GAC3C,EAAG,gBAAgB,mBAAmB,EAAS,EACnD,CAzBgB,CAAyB,EAAe,EAAqB,GAC7D,IAAI,EA0BpB,SAAyB,EAAqB,EAAS,EAAoB,GACvE,IAAI,EAA4B,EAAqC,gBACrE,OAAO,EACD,EAA0B,KAAK,EAAqB,EAAiB,CAAE,QAAW,EAAS,cAAiB,IAC5G,CACV,CA/ByC,CAAgB,EAAqB,EAAS,EAAoB,GACvF,EAAsB,EAAmC,mBAAE,OApD9E,GAoDiI,SAAS,GACnH,EAAgB,WAAI,EACpB,EAA6B,wBAAI,CACrC,IACJ,EAAmB,EACnB,EAAG,2BAA2B,EAAqB,EAhBnD,CAiBJ,GACJ,GAAG,KAAM,CAAE,yBAA0B,IAE9B,CAAE,4BAA8B,EAC3C,GAGJ,EAAG,gBAAgB,gBAA2B,WAAI,EAoBtD,IAAI,EAA0B,CAAE,MAAS,YAAa,IAAO,WAC7D,EAAG,gBAAsB,KAAI,CACzB,OAAU,SAAS,EAAS,EAAe,GACvC,IAAI,EAAQ,EAAG,MAAM,iBAAiB,MAAoB,CAAC,EAC3D,EAAG,MAAM,cAAc,GAAO,SAAS,EAAU,GAM7C,IAAI,GAA0B,KAL9B,EAAY,EAAG,MAAM,iBAAiB,KAKiB,OAAd,GAAwB,IAAc,EAC3E,GACA,EAAQ,gBAAgB,GAMxB,EAAG,MAAM,WAAa,GAAK,KAAY,GACvC,EAAW,EAAwB,GAC/B,EACA,EAAQ,gBAAgB,GAExB,EAAQ,GAAY,GAChB,GACR,EAAQ,aAAa,EAAU,EAAU,YAO5B,SAAb,GACA,EAAG,MAAM,eAAe,EAAS,EAAW,GAAK,EAAU,WAEnE,GACJ,GAIJ,EAAG,gBAAyB,QAAI,CAC5B,MAAS,CAAC,QAAS,QACnB,KAAQ,SAAU,EAAS,EAAe,GACtC,IAAI,EAAe,EAAG,cAAa,WAE/B,OAAI,EAAiB,IAAE,gBACZ,EAAG,MAAM,iBAAiB,EAAY,IAAI,iBAC1C,EAAiB,IAAE,SACnB,EAAG,MAAM,iBAAiB,EAAY,IAAI,UAG9C,EAAQ,KACnB,IAEA,SAAS,IAGL,IAAI,EAAY,EAAQ,QACpB,EAAY,EAAkB,IAAiB,EAGnD,IAAI,EAAG,gBAAgB,eAMnB,GAAY,GAAhB,CAIA,IAAI,EAAa,EAAG,oBAAoB,OAAO,GAC/C,GAAI,EAAc,CACd,IAAI,EAAgB,EAA+B,EAAW,OAAS,EACnE,IAAiB,GAIb,IACA,EAAG,MAAM,gBAAgB,EAAe,GAAW,GACnD,EAAG,MAAM,gBAAgB,EAAe,GAAc,IAG1D,EAAe,GAIf,EAAG,MAAM,gBAAgB,EAAe,EAAW,GAEnD,GAAgC,EAAG,sBAAsB,IACzD,EAAW,EAEnB,MACI,EAAG,oBAAoB,qBAAqB,EAAY,EAAa,UAAW,GAAW,EAxB/F,CA0BJ,CAmBA,IAAI,EAA6B,YAAhB,EAAQ,KACrB,EAA0B,SAAhB,EAAQ,KAGtB,GAAK,GAAe,EAApB,CAIA,IAAI,EAAW,IACX,EAAe,GAAe,EAAG,MAAM,iBAAiB,aAAqB,MAC7E,IAAiC,GAAgB,EAAS,MAAQ,EAAS,QAC3E,EAAe,EAAe,IAAiB,EAC/C,EAAkB,GAAW,EAG7B,IAAY,EAAQ,MACpB,EAAG,gBAA4B,WAAQ,KAAE,GAAS,WAAa,OAAO,CAAK,IAK/E,EAAG,SAAS,EAAa,KAAM,CAAE,yBAA0B,IAC3D,EAAG,MAAM,qBAAqB,EAAS,QAAS,GAGhD,EAAG,UA1CH,WAGI,IAAI,EAAa,EAAG,MAAM,iBAAiB,KAIvC,EAAQ,QAFR,EAEkB,EAAG,MAAM,aAAa,EAAY,MAAmB,EAChE,EAEW,EAGC,MAAmB,CAE9C,GA2BwB,KAAM,CAAE,yBAA0B,IAE1D,EAAW,CArBX,CAsBJ,GAEJ,EAAG,oBAAoB,eAAwB,SAAI,EAEnD,EAAG,gBAA8B,aAAI,CACjC,OAAU,SAAU,EAAS,GACzB,EAAQ,MAAQ,EAAG,MAAM,iBAAiB,IAC9C,GAGC,IAAI,EAA6B,iBACtC,EAAG,gBAAqB,IAAI,CACxB,OAAU,SAAU,EAAS,GACzB,IAAI,EAAQ,EAAG,MAAM,iBAAiB,KACxB,OAAV,GAAkC,iBAAT,EACzB,EAAG,MAAM,cAAc,GAAO,SAAS,EAAW,GAC9C,EAAkB,EAAG,MAAM,iBAAiB,GAC5C,EAAG,MAAM,sBAAsB,EAAS,EAAW,EACvD,KAEA,EAAQ,EAAG,MAAM,WAAW,OAAO,GAAS,KAC5C,EAAG,MAAM,sBAAsB,EAAS,EAAQ,IAA6B,GAC7E,EAAQ,GAA8B,EACtC,EAAG,MAAM,sBAAsB,EAAS,GAAO,GAEvD,GAEJ,EAAG,gBAAwB,OAAI,CAC3B,OAAU,SAAU,EAAS,GACzB,IAAI,EAAQ,EAAG,MAAM,iBAAiB,KAClC,GAAS,EAAQ,SACjB,EAAQ,gBAAgB,YACjB,GAAY,EAAQ,WAC3B,EAAQ,UAAW,EAC3B,GAGJ,EAAG,gBAAyB,QAAI,CAC5B,OAAU,SAAU,EAAS,GACzB,EAAG,gBAAwB,OAAU,OAAE,GAAS,WAAa,OAAQ,EAAG,MAAM,iBAAiB,IAAiB,GACpH,GAiBJ,EAAG,gBAAuB,MAAI,CAC1B,KAAS,SAAU,EAAS,EAAe,EAAa,EAAW,GAC/D,IAAI,EAAiB,KAAmB,CAAC,EACzC,EAAG,MAAM,cAAc,GAAgB,SAAS,GACpB,iBAAb,GACP,EAAG,MAAM,qBAAqB,EAAS,GAAW,SAAU,GACxD,IAAI,EACA,EAAkB,IAAgB,GACtC,GAAK,EAAL,CAGA,IAEI,IAAI,EAAiB,EAAG,MAAM,UAAU,WACxC,EAAY,EAAsB,MAClC,EAAe,QAAQ,GACvB,EAAqB,EAAgB,MAAM,EAAW,EAC1D,CAAE,SAC6B,IAAvB,IACI,EAAM,eACN,EAAM,iBAEN,EAAM,aAAc,EAEhC,EAEuD,IAA1C,EAAY,IAAI,EAAY,YAErC,EAAM,cAAe,EACjB,EAAM,iBACN,EAAM,kBArBJ,CAuBd,GAER,GACJ,GAIJ,EAAG,gBAAyB,QAAI,CAC5B,0BAA2B,SAAS,GAChC,OAAO,WACH,IAAI,EAAa,IACb,EAAiB,EAAG,MAAM,eAAe,GAK7C,OAAM,GAAmD,iBAAzB,EAAe,QAI/C,EAAG,MAAM,iBAAiB,GACnB,CACH,QAAW,EAAqB,KAChC,GAAM,EAAmB,GACzB,iBAAoB,EAAiC,iBACrD,SAAY,EAAyB,SACrC,aAAgB,EAA6B,aAC7C,YAAe,EAA4B,YAC3C,WAAc,EAA2B,WACzC,UAAa,EAA0B,UACvC,eAAkB,EAAG,qBAAqB,WAbnC,CAAE,QAAW,EAAY,eAAkB,EAAG,qBAAqB,SAelF,CACJ,EACA,KAAQ,SAAS,EAAS,EAAe,EAAa,EAAW,GAC7D,OAAO,EAAG,gBAA0B,SAAQ,KAAE,EAAS,EAAG,gBAAyB,QAAE,0BAA0B,GACnH,EACA,OAAU,SAAS,EAAS,EAAe,EAAa,EAAW,GAC/D,OAAO,EAAG,gBAA0B,SAAU,OAAE,EAAS,EAAG,gBAAyB,QAAE,0BAA0B,GAAgB,EAAa,EAAW,EAC7J,GAEJ,EAAG,oBAAoB,yBAAkC,SAAI,EAC7D,EAAG,gBAAgB,gBAAyB,SAAI,EAChD,IAAI,EAA2B,wBAC3B,EAAoB,yBAsExB,SAAS,EAAkB,EAAY,EAAQ,EAAO,GAClD,EAAG,gBAAgB,GAAc,CAC7B,KAAQ,SAAS,EAAS,EAAe,EAAa,EAAW,GAC7D,IAAI,EACA,EA0BJ,OAzBA,EAAG,UAAS,WACR,IAAI,EAAW,IACX,EAAY,EAAG,MAAM,iBAAiB,GACtC,GAAiB,IAAW,EAC5B,GAAiB,GACF,GAAiB,GAAW,IAAkB,KAIzD,GAAiB,EAAG,gBAAgB,yBACpC,EAAa,EAAG,MAAM,WAAW,EAAG,gBAAgB,WAAW,IAAU,IAGzE,GACK,GACD,EAAG,gBAAgB,mBAAmB,EAAS,EAAG,MAAM,WAAW,IAEvE,EAAG,2BAA2B,EAAsB,EAAoB,EAAgB,GAAY,EAAgB,IAEpH,EAAG,gBAAgB,UAAU,GAGjC,EAAyB,EAEjC,GAAG,KAAM,CAAE,yBAA0B,IAC9B,CAAE,4BAA8B,EAC3C,GAEJ,EAAG,oBAAoB,yBAAyB,IAAc,EAC9D,EAAG,gBAAgB,gBAAgB,IAAc,CACrD,CAxGA,EAAG,gBAA0B,SAAI,CAC7B,KAAQ,SAAS,EAAS,EAAe,GACrC,IAAI,EAA2B,SAAS,GAOpC,EAAQ,IAA4B,EACpC,IAAI,EAAW,EAAQ,cACvB,GAAI,kBAAmB,EAAU,CAC7B,IAAI,EACJ,IACI,EAAS,EAAS,aACtB,CAAE,MAAM,GAEJ,EAAS,EAAS,IACtB,CACA,EAAa,IAAW,CAC5B,CACA,IAAI,EAAa,IACjB,EAAG,oBAAoB,qBAAqB,EAAY,EAAa,WAAY,GAAW,GAG5F,EAAQ,GAAqB,EAC7B,EAAQ,IAA4B,CACxC,EACI,EAAuB,EAAyB,KAAK,MAAM,GAC3D,EAAwB,EAAyB,KAAK,MAAM,GAEhE,EAAG,MAAM,qBAAqB,EAAS,QAAS,GAChD,EAAG,MAAM,qBAAqB,EAAS,UAAW,GAClD,EAAG,MAAM,qBAAqB,EAAS,OAAS,GAChD,EAAG,MAAM,qBAAqB,EAAS,WAAa,EACxD,EACA,OAAU,SAAS,EAAS,GACxB,IAAI,IAAU,EAAG,MAAM,iBAAiB,KAEnC,EAAQ,IAA6B,EAAQ,KAAuB,IACrE,EAAQ,EAAQ,QAAU,EAAQ,QAK7B,GAAS,EAAQ,IAClB,EAAQ,cAAc,KAAK,QAI/B,EAAG,oBAAoB,OAAO,EAAG,MAAM,aAAc,KAAM,CAAC,EAAS,EAAQ,UAAY,aAEjG,GAEJ,EAAG,oBAAoB,eAAyB,UAAI,EAEpD,EAAG,gBAA0B,SAAI,EAAG,gBAA0B,SAC9D,EAAG,oBAAoB,eAAyB,UAAI,EACpD,EAAG,gBAAsB,KAAI,CACzB,KAAQ,WAEJ,MAAO,CAAE,4BAA8B,EAC3C,EACA,OAAU,SAAU,EAAS,GAEzB,EAAG,MAAM,QAAQ,EAAS,IAC9B,GAyCJ,EAAkB,MAClB,EAAkB,SAAS,GAAoB,GAC/C,EAAkB,QAAQ,GAAmB,GACzC,SAAS,EAAgB,GACrB,OAAO,EAAe,yBAAyB,EACnD,IAEJ,IA5MkC,EA4M9B,EAAqB,CAAC,EAC1B,EAAG,gBAAyB,QAAI,CAC5B,KAAQ,SAAS,GACb,GAAuC,WAAnC,EAAG,MAAM,aAAa,GACtB,MAAM,IAAI,MAAM,mDAGpB,KAAO,EAAQ,OAAS,GACpB,EAAQ,OAAO,GAInB,MAAO,CAAE,4BAA8B,EAC3C,EACA,OAAU,SAAU,EAAS,EAAe,GACxC,SAAS,IACL,OAAO,EAAG,MAAM,YAAY,EAAQ,SAAS,SAAU,GAAQ,OAAO,EAAK,QAAU,GACzF,CAEA,IAOI,EACA,EARA,EAA6C,GAAlB,EAAQ,OACnC,EAAW,EAAQ,SACnB,GAAsB,GAA4B,EAAY,EAAQ,UAAY,KAClF,EAAiB,EAAG,MAAM,iBAAiB,KAC3C,EAAkB,EAAY,IAAI,oBAAsB,EAAiB,IAAE,SAC3E,EAAmB,EAAY,IAAI,2BACnC,EAAgC,CAAC,EAGjC,EAAyB,GA+B7B,SAAS,EAAc,EAAQ,EAAW,GACtC,IAAI,SAAuB,EAC3B,MAAqB,YAAjB,EACO,EAAU,GACK,UAAjB,EACE,EAAO,GAEP,CACf,CArCK,IACG,EACA,EAAyB,EAAG,MAAM,SAAS,IAAmB,EAAG,iBAAiB,WAC3E,EAAQ,eAAiB,GAChC,EAAuB,KAAK,EAAG,iBAAiB,UAAU,EAAQ,QAAQ,EAAQ,kBAItF,SACoC,IAAzB,EAAe,SACtB,EAAiB,CAAC,IAGtB,EAAgB,EAAG,MAAM,YAAY,GAAgB,SAAS,GAC1D,OAAO,GAAoB,IAAS,GAAsB,OAAT,IAAkB,EAAG,MAAM,iBAAiB,EAAe,SAChH,IAGI,EAAiB,IAAE,mBAGE,QAFrB,EAAe,EAAG,MAAM,iBAAiB,EAAY,IAAI,qBAE5B,IAAiB,GAC1C,EAAc,QAAQ,IAqBlC,IAAI,GAAa,EA6BjB,SAAS,EAAqB,EAAY,GACtC,GAAI,GAAc,EAGd,EAAG,iBAAiB,WAAW,EAAS,EAAG,MAAM,iBAAiB,EAAY,IAAI,WAAW,QAC1F,GAAI,EAAuB,OAAQ,CAGtC,IAAI,EAAa,EAAG,MAAM,aAAa,EAAwB,EAAG,iBAAiB,UAAU,EAAW,MAAQ,EAChH,EAAG,MAAM,4BAA4B,EAAW,GAAI,GAGhD,IAAe,GACf,EAAG,oBAAoB,OAAO,EAAG,MAAM,aAAc,KAAM,CAAC,EAAS,UAE7E,CACJ,CArBA,EAA4C,aACxC,SAAU,GACN,EAAQ,YAAY,EACxB,EAoBJ,IAAI,EAAW,EACX,EAAiB,IAAE,uBAAyE,mBAAzC,EAAY,IAAI,wBACnE,EAAW,SAAS,EAAY,GAC5B,EAAqB,EAAY,GACjC,EAAG,oBAAoB,OAAO,EAAY,IAAI,sBAAuB,KAAM,CAAC,EAAW,GAAI,IAAe,EAAqB,EAAa,GAChJ,GAGJ,EAAG,MAAM,mCAAmC,EAAS,GAtDrD,SAA4B,EAAY,EAAO,GACvC,EAAW,SACX,GAA0B,GAAmB,EAAW,GAAG,SAAW,CAAE,EAAG,iBAAiB,UAAU,EAAW,KAAQ,GACzH,GAAa,GAEjB,IAAI,EAAS,EAAQ,cAAc,cAAc,UACjD,GAAI,IAAe,EACf,EAAG,MAAM,eAAe,EAAQ,EAAY,IAAI,mBAChD,EAAG,iBAAiB,WAAW,EAAQ,OACpC,CAEH,IAAI,EAAc,EAAc,EAAY,EAAY,IAAI,gBAAiB,GAC7E,EAAG,iBAAiB,WAAW,EAAQ,EAAG,MAAM,iBAAiB,IAGjE,IAAI,EAAa,EAAc,EAAY,EAAY,IAAI,eAAgB,GAC3E,EAAG,MAAM,eAAe,EAAQ,EACpC,CACA,MAAO,CAAC,EACZ,GAmCwF,EAA+B,GAEvH,EAAG,oBAAoB,QAAO,WACtB,EAEA,EAAG,iBAAiB,WAAW,EAAS,EAAG,MAAM,iBAAiB,EAAY,IAAI,WAAW,IAIzF,EAGmB,EAAuB,QAAU,IAAkB,OAAS,EAAuB,OAIlF,EAAuB,QAAU,EAAQ,eAAiB,EACvE,EAAG,iBAAiB,UAAU,EAAQ,QAAQ,EAAQ,kBAAoB,EAAuB,GACjG,EAAuB,QAAU,EAAQ,eAAiB,IAOjE,EAAG,MAAM,aAAa,EAAS,SAG3C,IAGA,EAAG,MAAM,uCAAuC,GAE5C,GAAqB,KAAK,IAAI,EAAoB,EAAQ,WAAa,KACvE,EAAQ,UAAY,EAC5B,GAEJ,EAAG,gBAAyB,QAAE,sBAAwB,EAAG,MAAM,QAAQ,UACvE,EAAG,gBAAiC,gBAAI,CACpC,MAAS,CAAC,UAAW,WACrB,KAAQ,SAAU,EAAS,EAAe,GACtC,EAAG,MAAM,qBAAqB,EAAS,UAAU,WAC7C,IAAI,EAAQ,IAAiB,EAAe,GAC5C,EAAG,MAAM,aAAa,EAAQ,qBAAqB,WAAW,SAAS,GAC/D,EAAK,UACL,EAAa,KAAK,EAAG,iBAAiB,UAAU,GACxD,IACA,EAAG,oBAAoB,qBAAqB,EAAO,EAAa,kBAAmB,EACvF,GACJ,EACA,OAAU,SAAU,EAAS,GACzB,GAAsC,UAAlC,EAAG,MAAM,aAAa,GACtB,MAAM,IAAI,MAAM,kDAEpB,IAAI,EAAW,EAAG,MAAM,iBAAiB,KACrC,EAAoB,EAAQ,UAE5B,GAAsC,iBAAnB,EAAS,QAC5B,EAAG,MAAM,aAAa,EAAQ,qBAAqB,WAAW,SAAS,GACnE,IAAI,EAAa,EAAG,MAAM,aAAa,EAAU,EAAG,iBAAiB,UAAU,KAAU,EACrF,EAAK,UAAY,GACjB,EAAG,MAAM,4BAA4B,EAAM,EAEnD,IAGJ,EAAQ,UAAY,CACxB,GAEJ,EAAG,oBAAoB,eAAgC,iBAAI,EAC3D,EAAG,gBAAuB,MAAI,CAC1B,OAAU,SAAU,EAAS,GACzB,IAAI,EAAQ,EAAG,MAAM,iBAAiB,KAAmB,CAAC,GAC1D,EAAG,MAAM,cAAc,GAAO,SAAS,EAAW,GAG3B,QAFnB,EAAa,EAAG,MAAM,iBAAiB,KAEZ,IAAe,IAA4B,IAAf,IAEnD,EAAa,IAGjB,EAAQ,MAAM,GAAa,CAC/B,GACJ,GAEJ,EAAG,gBAAwB,OAAI,CAC3B,KAAQ,SAAU,EAAS,EAAe,EAAa,EAAW,GAC9D,GAA8B,mBAAnB,IACP,MAAM,IAAI,MAAM,qDACpB,EAAG,MAAM,qBAAqB,EAAS,UAAU,SAAU,GACvD,IAAI,EACA,EAAQ,IACZ,IAAM,EAAqB,EAAM,KAAK,EAAsB,MAAG,EAAU,CACzE,SAC+B,IAAvB,IACI,EAAM,eACN,EAAM,iBAEN,EAAM,aAAc,EAEhC,CACJ,GACJ,GAEJ,EAAG,gBAAsB,KAAI,CACzB,KAAQ,WAGJ,MAAO,CAAE,4BAA8B,EAC3C,EACA,OAAU,SAAU,EAAS,GACzB,EAAG,MAAM,eAAe,EAAS,IACrC,GAEJ,EAAG,gBAAgB,gBAAsB,MAAI,EAC7C,WAEA,GAAI,GAAU,EAAO,UACjB,IAAI,EAAe,SAAU,GACzB,GAAI,EACA,OAAO,WAAW,EAAQ,GAElC,EAGI,EAAe,EAAO,OAAS,EAAO,MAAM,SAAW,SAAS,EAAO,MAAM,WAC7E,EAAY,EAAO,UAAU,UAC7B,EAAgB,EAAa,EAAU,MAAM,8CAC7C,EAAiB,EAAa,EAAU,MAAM,qBAStD,GAAI,EAAG,MAAM,UAAY,GACrB,IAAI,EAAgC,EAAG,MAAM,QAAQ,UACjD,EAA6B,EAAG,MAAM,QAAQ,UAC9C,EAAyB,SAAS,GAClC,IAAI,EAAS,KAAK,cACd,EAAU,GAAU,EAAG,MAAM,QAAQ,IAAI,EAAQ,GACjD,GACA,EAAQ,EAEhB,EACI,EAAkC,SAAU,EAAS,GACrD,IAAI,EAAW,EAAQ,cAClB,EAAG,MAAM,QAAQ,IAAI,EAAU,KAChC,EAAG,MAAM,QAAQ,IAAI,EAAU,GAA+B,GAC9D,EAAG,MAAM,qBAAqB,EAAU,kBAAmB,IAE/D,EAAG,MAAM,QAAQ,IAAI,EAAS,EAA4B,EAC9D,EAGJ,EAAG,gBAA2B,UAAI,CAC9B,KAAQ,SAAU,EAAS,EAAe,GAEtC,IACI,EACA,EAFA,EAAuB,EAAQ,MAI/B,EAAc,SAAU,GACxB,aAAa,GACb,EAA0B,EAAgB,EAE1C,IAAI,EAAe,EAAQ,MACvB,IAAyB,IAEZ,IAAO,EAAqC,4BAAI,EAAM,MACnE,EAAuB,EACvB,EAAG,oBAAoB,qBAAqB,IAAiB,EAAa,YAAa,GAE/F,EAEI,EAAmB,SAAU,GAC7B,IAAK,EAAe,CAKhB,EAA0B,EAAQ,MAClC,IAAI,EAAkB,EAAY,KAAK,EAAS,CAAC,KAAM,EAAM,OAC7D,EAAgB,EAAG,MAAM,WAAW,EAAS,EACjD,CACJ,EAII,EAAsC,GAAtB,EAAG,MAAM,UAAiB,EAAmB,EAE7D,EAAa,WACb,IAAI,EAAa,EAAG,MAAM,iBAAiB,KAExB,OAAf,GAAuB,IAAe,IACtC,EAAa,IAGb,IAA4B,GAAa,IAAe,EAOxD,EAAQ,QAAU,IAClB,EAAuB,EACvB,EAAQ,MAAQ,GARhB,EAAG,MAAM,WAAW,EAAY,EAUxC,EAEI,EAAU,SAAU,EAAO,GAC3B,EAAG,MAAM,qBAAqB,EAAS,EAAO,EAClD,EAEa,EAAG,gBAA2B,UAAkB,eAEzD,EAAG,MAAM,aAAa,EAAG,gBAA2B,UAAkB,gBAAG,SAAS,GAClD,SAAxB,EAAU,MAAM,EAAE,GAClB,EAAQ,EAAU,MAAM,GAAI,GAE5B,EAAQ,EAAW,EAE3B,IAEI,EAAG,MAAM,UAAY,IAKrB,EAAQ,kBAAkB,SAAS,GACJ,UAAvB,EAAM,cACN,EAAc,EAEtB,IAE0B,GAAtB,EAAG,MAAM,YAIT,EAAQ,QAAS,GACjB,EAAQ,UAAW,IAEnB,EAAG,MAAM,WAAa,IAMtB,EAAgC,EAAS,GACzC,EAAQ,UAAW,MAKvB,EAAQ,QAAS,GAEb,EAAgB,GAAwC,aAAnC,EAAG,MAAM,aAAa,IAG3C,EAAQ,UAAW,GACnB,EAAQ,QAAS,GACjB,EAAQ,MAAO,IACR,EAAe,GAGtB,EAAQ,UAAW,GACZ,EAAiB,IAExB,EAAQ,kBAAmB,GAG3B,EAAQ,WAAY,GACpB,EAAQ,OAAQ,KAM5B,EAAQ,SAAU,GAElB,EAAG,SAAS,EAAY,KAAM,CAAE,yBAA0B,GAC9D,GAEJ,EAAG,oBAAoB,eAA0B,WAAI,EAGrD,EAAG,gBAA2B,UAAI,CAE9B,WAAc,SAAU,EAAO,EAAM,GACjC,EAAW,YAAa,EAC5B,EAGH,CArLD,GAqLK,EAAG,gBAA4B,WAAI,CACpC,KAAQ,SAAU,EAAS,GACvB,GAAI,IAAiB,CACjB,IAAI,EAAO,gBAAkB,EAAG,gBAA4B,WAAE,aAC9D,EAAG,MAAM,eAAe,EAAS,EACrC,CACJ,GAEJ,EAAG,gBAA4B,WAAE,aAAe,EAChD,EAAG,gBAAuB,MAAI,CAC1B,MAAS,CAAC,UAAW,WACrB,KAAQ,SAAU,EAAS,EAAe,GAEtC,GAAqC,SAAjC,EAAQ,QAAQ,eAA6C,YAAhB,EAAQ,MAAsC,SAAhB,EAAQ,KAAvF,CAMA,IAAI,EAAgB,CAAC,UACjB,EAAyB,EAAY,IAAI,eACzC,GAAuB,EACvB,EAA0B,KAE1B,IACqC,iBAA1B,IACP,EAAyB,CAAC,IAC9B,EAAG,MAAM,aAAa,EAAe,GACrC,EAAgB,EAAG,MAAM,uBAAuB,IAGpD,IAAI,EAAqB,WACrB,EAA0B,KAC1B,GAAuB,EACvB,IAAI,EAAa,IACb,EAAe,EAAG,iBAAiB,UAAU,GACjD,EAAG,oBAAoB,qBAAqB,EAAY,EAAa,QAAS,EAClF,EAI+B,EAAG,MAAM,WAA8C,SAAjC,EAAQ,QAAQ,eAA4C,QAAhB,EAAQ,MAC/C,OAAxB,EAAQ,gBAA2B,EAAQ,MAAqC,OAA7B,EAAQ,KAAK,gBACP,GAA3D,EAAG,MAAM,aAAa,EAAe,oBACjE,EAAG,MAAM,qBAAqB,EAAS,kBAAkB,WAAc,GAAuB,CAAK,IACnG,EAAG,MAAM,qBAAqB,EAAS,SAAS,WAAc,GAAuB,CAAM,IAC3F,EAAG,MAAM,qBAAqB,EAAS,QAAQ,WACvC,GACA,GAER,KAGJ,EAAG,MAAM,aAAa,GAAe,SAAS,GAI1C,IAAI,EAAU,EACV,EAAG,MAAM,iBAAiB,EAAW,WACrC,EAAU,WAQN,EAA0B,EAAG,iBAAiB,UAAU,GACxD,EAAG,MAAM,WAAW,EAAoB,EAC5C,EACA,EAAY,EAAU,UAAU,IAEpC,EAAG,MAAM,qBAAqB,EAAS,EAAW,EACtD,IAEA,IAAI,EAAkB,WAClB,IAAI,EAAW,EAAG,MAAM,iBAAiB,KACrC,EAAe,EAAG,iBAAiB,UAAU,GAEjD,GAAgC,OAA5B,GAAoC,IAAa,GAOrD,GAFuB,IAAa,EAGhC,GAAuC,WAAnC,EAAG,MAAM,aAAa,GAAuB,CAC7C,IAAI,EAAa,EAAY,IAAI,mBAC7B,EAAmB,WACnB,EAAG,iBAAiB,WAAW,EAAS,EAAU,EACtD,EACA,IAEK,GAAc,IAAa,EAAG,iBAAiB,UAAU,GAQ1D,EAAG,MAAM,WAAW,EAAkB,GALtC,EAAG,oBAAoB,OAAO,EAAG,MAAM,aAAc,KAAM,CAAC,EAAS,UAO7E,MACI,EAAG,iBAAiB,WAAW,EAAS,QAzB5C,EAAG,MAAM,WAAW,EAAiB,EA4B7C,EAEA,EAAG,SAAS,EAAiB,KAAM,CAAE,yBAA0B,GA9F/D,MAFI,EAAG,4BAA4B,EAAS,CAAE,aAAgB,GAiGlE,EACA,OAAU,WAAY,GAE1B,EAAG,oBAAoB,eAAsB,OAAI,EACjD,EAAG,gBAAyB,QAAI,CAC5B,OAAU,SAAU,EAAS,GACzB,IAAI,EAAQ,EAAG,MAAM,iBAAiB,KAClC,IAAgD,QAAzB,EAAQ,MAAM,SACrC,IAAU,EACV,EAAQ,MAAM,QAAU,IACjB,GAAU,IACjB,EAAQ,MAAM,QAAU,OAChC,GA/uB8B,EAkvBT,QAjvBrB,EAAG,gBAAgB,GAAa,CAC5B,KAAQ,SAAS,EAAS,EAAe,EAAa,EAAW,GAM7D,OAAO,EAAG,gBAAuB,MAAQ,KAAE,KAAK,KAAM,GAL/B,WACnB,IAAI,EAAS,CAAC,EAEd,OADA,EAAO,GAAa,IACb,CACX,GACiF,EAAa,EAAW,EAC7G,GAqwBR,EAAG,eAAiB,WAAc,EAElC,EAAG,eAAe,UAAgC,qBAAI,SAAU,EAAgB,EAAgB,EAAS,GACrG,MAAM,IAAI,MAAM,gCACpB,EAEA,EAAG,eAAe,UAA0C,+BAAI,SAAU,GACtE,MAAM,IAAI,MAAM,0CACpB,EAEA,EAAG,eAAe,UAA8B,mBAAI,SAAS,EAAU,GAEnE,GAAuB,iBAAZ,EAAsB,CAE7B,IAAI,GADJ,EAAmB,GAAoB,GACX,eAAe,GAC3C,IAAK,EACD,MAAM,IAAI,MAAM,gCAAkC,GACtD,OAAO,IAAI,EAAG,gBAAgB,WAAW,EAC7C,CAAO,GAA0B,GAArB,EAAS,UAAwC,GAArB,EAAS,SAE7C,OAAO,IAAI,EAAG,gBAAgB,kBAAkB,GAEhD,MAAM,IAAI,MAAM,0BAA4B,EACpD,EAEA,EAAG,eAAe,UAA0B,eAAI,SAAU,EAAU,EAAgB,EAAS,GACzF,IAAI,EAAiB,KAAyB,mBAAE,EAAU,GAC1D,OAAO,KAA2B,qBAAE,EAAgB,EAAgB,EAAS,EACjF,EAEA,EAAG,eAAe,UAA+B,oBAAI,SAAU,EAAU,GAErE,OAAuC,IAAnC,KAA6B,wBAE1B,KAAyB,mBAAE,EAAU,GAAwB,KAAE,cAC1E,EAEA,EAAG,eAAe,UAA2B,gBAAI,SAAU,EAAU,EAAkB,GACnF,IAAI,EAAiB,KAAyB,mBAAE,EAAU,GACtD,EAAY,EAAiB,EAAqB,QACtD,EAAqB,KAAE,GACvB,EAAqB,KAAE,eAAe,EAC1C,EAEA,EAAG,aAAa,iBAAkB,EAAG,gBAErC,EAAG,kBAAoB,WACnB,IAAI,EAAyC,oIACzC,EAA4C,kCAoBhD,SAAS,EAAgC,EAAwB,EAAa,EAAU,GACpF,IAAI,EAAwB,EAAG,oBAAoB,mBAAmB,IAnB1E,SAA4C,GAExC,IADA,IAAI,EAAgB,EAAG,oBAAoB,yBAClC,EAAI,EAAG,EAAI,EAAc,OAAQ,IAAK,CAC3C,IAAI,EAAM,EAAc,GAAQ,IAChC,GAAI,EAAc,eAAe,GAAM,CACnC,IAAI,EAAY,EAAc,GAE9B,GAAyB,mBAAd,EAA0B,CACjC,IAAI,EAAuB,EAAU,EAAc,GAAU,OAC7D,GAAI,EACA,MAAM,IAAI,MAAM,EACxB,MAAO,IAAK,EACR,MAAM,IAAI,MAAM,8CAAgD,EAAM,iCAE9E,CACJ,CACJ,CAII,CAAmC,GACnC,IAKI,EACA,wEANkC,EAAG,oBAAoB,mBAAmB,EAAuB,CAAC,gBAAiB,IAMT,aAAe,EAAS,cAAgB,KACxJ,OAAO,EAA+C,+BAAE,GAAoC,CAChG,CAEA,MAAO,CACH,0BAA2B,SAAU,EAAU,EAAgB,GACtD,EAAoC,oBAAE,EAAU,IACjD,EAAgC,gBAAE,GAAU,SAAU,GAClD,OAAO,EAAG,kBAAkB,8BAA8B,EAAY,EAC1E,GAAG,EACX,EAEA,8BAA+B,SAAU,EAAY,GACjD,OAAO,EAAW,QAAQ,GAAwC,WAC9D,OAAO,EAA8D,UAAU,GAAuB,UAAU,GAAoB,UAAU,GAAI,EACtJ,IAAG,QAAQ,GAA2C,WAClD,OAAO,EAA8D,UAAU,GAAuB,oBAA+B,WAAY,EACrJ,GACJ,EAEA,mCAAoC,SAAU,EAAU,GACpD,OAAO,EAAG,YAAY,SAAQ,SAAU,EAAS,GAC7C,IAAI,EAAa,EAAQ,YACrB,GAAc,EAAW,SAAS,gBAAkB,GACpD,EAAG,4BAA4B,EAAY,EAAU,EAE7D,GACJ,EAEP,CA5DsB,GAgEvB,EAAG,aAAa,cAAe,EAAG,kBAAkB,oCACpD,WAyBI,EAAG,gBAAkB,CAAC,EAUtB,EAAG,gBAAgB,WAAa,SAAS,GAGrC,GAFA,KAAK,WAAa,EAEd,EAAS,CACT,IAAI,EAAe,EAAG,MAAM,aAAa,GACzC,KAAK,aACgB,WAAjB,EAXS,EAYQ,aAAjB,EAXW,EAaK,YAAhB,GAA8B,EAAQ,SAAwC,KAA7B,EAAQ,QAAQ,SAZtD,EACD,CAalB,CACJ,EAEA,EAAG,gBAAgB,WAAW,UAAgB,KAAI,WAC9C,IAAI,EApBa,IAoBU,KAAK,aAAkC,OAnB/C,IAoBQ,KAAK,aAAoC,QACzC,YAE3B,GAAwB,GAApB,UAAU,OACV,OAAO,KAAK,WAAW,GAEvB,IAAI,EAAe,UAAU,GACA,cAAzB,EACA,EAAG,MAAM,QAAQ,KAAK,WAAY,GAElC,KAAK,WAAW,GAAwB,CAEpD,EAEA,IAAI,EAAoB,EAAG,MAAM,QAAQ,UAAY,IACrD,EAAG,gBAAgB,WAAW,UAAgB,KAAI,SAAS,GACvD,GAAyB,IAArB,UAAU,OACV,OAAO,EAAG,MAAM,QAAQ,IAAI,KAAK,WAAY,EAAoB,GAEjE,EAAG,MAAM,QAAQ,IAAI,KAAK,WAAY,EAAoB,EAAK,UAAU,GAEjF,EAEA,IAAI,EAAsB,EAAG,MAAM,QAAQ,UAC3C,SAAS,EAAmB,GACxB,OAAO,EAAG,MAAM,QAAQ,IAAI,EAAS,IAAwB,CAAC,CAClE,CACA,SAAS,EAAmB,EAAS,GACjC,EAAG,MAAM,QAAQ,IAAI,EAAS,EAAqB,EACvD,CAEA,EAAG,gBAAgB,WAAW,UAAiB,MAAI,WAC/C,IAAI,EAAU,KAAK,WACnB,GAAwB,GAApB,UAAU,OAGV,OAFmB,EAAmB,GACL,gBAtDlB,IAwDX,KAAK,aAAoC,EAAQ,QAvDvC,IAwDV,KAAK,aAAmC,EACxC,GAGJ,EAAmB,EAAS,CAAC,cADV,UAAU,IAGrC,EAOA,EAAG,gBAAgB,kBAAoB,SAAS,GAC5C,KAAK,WAAa,CACtB,EACA,EAAG,gBAAgB,kBAAkB,UAAY,IAAI,EAAG,gBAAgB,WACxE,EAAG,gBAAgB,kBAAkB,UAAU,YAAc,EAAG,gBAAgB,kBAChF,EAAG,gBAAgB,kBAAkB,UAAgB,KAAI,WACrD,GAAwB,GAApB,UAAU,OAAa,CACvB,IAAI,EAAe,EAAmB,KAAK,YAG3C,OAFI,EAAa,WAAa,GAAa,EAAa,gBACpD,EAAa,SAAW,EAAa,cAAc,WAChD,EAAa,QACxB,CACI,IAAI,EAAe,UAAU,GAC7B,EAAmB,KAAK,WAAY,CAAC,SAAU,GAEvD,EAEA,EAAG,aAAa,kBAAmB,EAAG,iBACtC,EAAG,aAAa,6BAA8B,EAAG,gBAAgB,YACjE,EAAG,aAAa,oCAAqC,EAAG,gBAAgB,kBAC3E,CA1HD,GA2HA,WACI,IAAI,EAOJ,SAAS,EAAmC,EAAW,EAAU,GAE7D,IADA,IAAI,EAAM,EAAc,EAAW,EAAsB,EAAG,gBAAgB,YAAY,GACjF,IAAiB,EAAO,KAAiB,GAE5C,EAAO,EADP,EAAc,EAAG,gBAAgB,YAAY,GAGrD,CAEA,SAAS,EAAsC,EAAqB,GAOhE,GAAI,EAAoB,OAAQ,CAC5B,IAAI,EAAY,EAAoB,GAChC,EAAW,EAAoB,EAAoB,OAAS,GAC5D,EAAa,EAAU,WACvB,EAAW,EAAG,gBAA0B,SACxC,EAAiB,EAAyB,eAE9C,GAAI,EAAgB,CAgBhB,GAfA,EAAmC,EAAW,GAAU,SAAS,EAAM,GACnE,IAAI,EAAsB,EAAK,gBAC3B,EAAW,EAAe,KAAK,EAAU,GACzC,IACI,IAAS,IACT,EAAY,EAAS,IAAM,GAC3B,IAAS,IACT,EAAW,EAAS,EAAS,OAAS,IAAM,GAExD,IAKA,EAAoB,OAAS,GACxB,EACD,OAEA,IAAc,EACd,EAAoB,KAAK,IAEzB,EAAoB,KAAK,EAAW,GACpC,EAAG,MAAM,yBAAyB,EAAqB,GAE/D,CAIA,EAAmC,EAAW,GAAU,SAAS,GACvC,IAAlB,EAAK,UAAoC,IAAlB,EAAK,UAC5B,EAAG,cAAc,EAAgB,EACzC,IACA,EAAmC,EAAW,GAAU,SAAS,GACvC,IAAlB,EAAK,UAAoC,IAAlB,EAAK,UAC5B,EAAG,YAAY,+BAA+B,EAAM,CAAC,GAC7D,IAGA,EAAG,MAAM,yBAAyB,EAAqB,EAC3D,CACJ,CAEA,SAAS,EAA8B,GACnC,OAAO,EAAgB,SAAW,EACA,EAAgB,OAAS,EAAI,EAAgB,GAC7C,IACtC,CAEA,SAAS,EAAgB,EAAuB,EAAY,EAAU,EAAgB,GAClF,EAAU,GAAW,CAAC,EACtB,IACI,GADkB,GAAyB,EAA8B,IAClC,GAAY,CAAC,GAAG,cACvD,EAAuB,EAAwB,gBAAK,EACxD,EAAG,kBAAkB,0BAA0B,EAAU,EAAqB,GAC9E,IAAI,EAAqB,EAAoC,eAAE,EAAU,EAAgB,EAAS,GAGlG,GAAyC,iBAA7B,EAAmB,QAAwB,EAAmB,OAAS,GAA8C,iBAAlC,EAAmB,GAAG,SACjH,MAAM,IAAI,MAAM,qDAEpB,IAAI,GAAyB,EAC7B,OAAQ,GACJ,IAAK,kBACD,EAAG,gBAAgB,mBAAmB,EAAuB,GAC7D,GAAyB,EACzB,MACJ,IAAK,cACD,EAAG,MAAM,gBAAgB,EAAuB,GAChD,GAAyB,EACzB,MACJ,IAAK,mBAAoB,MACzB,QACI,MAAM,IAAI,MAAM,uBAAyB,GASjD,OANI,IACA,EAAsC,EAAoB,GACtD,EAAqB,aACrB,EAAG,oBAAoB,OAAO,EAAqB,YAAG,KAAM,CAAC,EAAoB,EAAsB,SAGxG,CACX,CAEA,SAAS,EAAoB,EAAU,EAAM,GAEzC,OAAI,EAAG,aAAa,GAET,IACoB,mBAAb,EAEP,EAAS,EAAM,GAGf,CAEf,CA7HA,EAAG,kBAAoB,SAAU,GAC7B,GAAK,GAAkB,KAAgB,aAA0B,EAAG,gBAChE,MAAM,IAAI,MAAM,sDACpB,EAAkB,CACtB,EA2HA,EAAG,eAAiB,SAAU,EAAU,EAAsB,EAAS,EAAuB,GAE1F,KADA,EAAU,GAAW,CAAC,GACO,gBAAK,IAAoB,EAClD,MAAM,IAAI,MAAM,uDAGpB,GAFA,EAAa,GAAc,kBAEvB,EAAuB,CACvB,IAAI,EAAkB,EAA8B,GAGhD,EAAoC,GAAiC,eAAd,EAA+B,EAAgB,WAAa,EAEvH,OAAO,EAAG,qBACN,WAEI,IAAI,EAAkB,GAAyB,aAAgC,EAAG,eAC5E,EACA,IAAI,EAAG,eAAe,EAAsB,KAAM,KAAM,KAAM,CAAE,oBAAsB,IAExF,EAAe,EAAoB,EAAU,EAAsB,MAAG,GACtE,EAAqB,EAAgB,EAAuB,EAAY,EAAc,EAAgB,GAExF,eAAd,IAEA,EAAkB,EADlB,EAAwB,GAGhC,GACA,KACA,CAAE,YAnBc,WAAc,OAAS,IAAqB,EAAG,MAAM,4BAA4B,EAAkB,EAmBrF,yBAA0B,GAEhE,CAEI,OAAO,EAAG,YAAY,SAAQ,SAAU,GACpC,EAAG,eAAe,EAAU,EAAsB,EAAS,EAAS,cACxE,GAER,EAEA,EAAG,sBAAwB,SAAU,EAAU,EAAwB,EAAS,EAAY,GAGxF,IAAI,EAGA,EAA8B,SAAU,EAAY,GAOpD,OALA,EAAmB,EAAyC,mBAAE,EAAY,EAAY,IAAG,SAAS,GAC9F,EAAgB,OAAI,CACxB,IAGO,EAAgB,KAAM,mBADV,EAAoB,EAAU,EAAY,GACE,EAAkB,EACrF,EAGI,EAA2B,SAAS,EAAY,EAAiB,GACjE,EAAsC,EAAiB,GACnD,EAAqB,aACrB,EAAqB,YAAE,EAAiB,GAI5C,EAAmB,IACvB,EAEA,OAAO,EAAG,qBAAoB,WAC1B,IAAI,EAAiB,EAAG,MAAM,iBAAiB,IAA2B,QACtC,IAAzB,EAAe,SACtB,EAAiB,CAAC,IAGtB,IAAI,EAAgB,EAAG,MAAM,YAAY,GAAgB,SAAS,GAC9D,OAAO,EAA0B,kBAAK,IAAS,GAAsB,OAAT,IAAkB,EAAG,MAAM,iBAAiB,EAAe,SAC3H,IAIA,EAAG,oBAAoB,OAAO,EAAG,MAAM,mCAAoC,KAAM,CAAC,EAAY,EAAe,EAA6B,EAAS,GAEvJ,GAAG,KAAM,CAAE,yBAA0B,GACzC,EAEA,IAAI,EAA6B,EAAG,MAAM,QAAQ,UAQlD,EAAG,gBAA0B,SAAI,CAC7B,KAAQ,SAAS,EAAS,GAEtB,IAAI,EAAe,EAAG,MAAM,iBAAiB,KAC7C,GAA2B,iBAAhB,GAA4B,EAAmB,KAEtD,EAAG,gBAAgB,UAAU,QAC1B,GAAI,UAAW,EAAc,CAKhC,IAAI,EAAQ,EAAoB,OAAK,GACrC,GAAI,EAAG,aAAa,GAChB,MAAM,IAAI,MAAM,6DAEpB,IAAI,EAAY,EAAG,MAAM,mCAAmC,GAC5D,IAAI,EAAG,gBAAgB,kBAAkB,GAAgB,MAAE,EAC/D,KAAO,CAEH,IAAI,EAAgB,EAAG,gBAAgB,WAAW,GAC9C,EAAY,EAAG,MAAM,mCAAmC,GAC5D,IAAI,EAAG,gBAAgB,kBAAkB,GAAgB,MAAE,EAC/D,CACA,MAAO,CAAE,4BAA8B,EAC3C,EACA,OAAU,SAAU,EAAS,EAAe,EAAa,EAAW,GAChE,IAII,EAJA,EAAQ,IACR,EAAU,EAAG,MAAM,iBAAiB,GACpC,GAAgB,EAChB,EAAmB,KAgBvB,GAbsB,iBAAX,GACP,EAAe,EACf,EAAU,CAAC,IAEX,EAAe,EAAc,KAGzB,OAAQ,IACR,EAAgB,EAAG,MAAM,iBAAiB,EAAY,KACtD,GAAiB,UAAW,IAC5B,GAAiB,EAAG,MAAM,iBAAiB,EAAe,SAG9D,YAAa,EAAS,CAEtB,IAAI,EAAa,GAAiB,EAAiB,SAAM,GACzD,EAAmB,EAAG,sBAAsB,GAAgB,EAAS,EAAW,EAAS,EAAS,EACtG,MAAO,GAAK,EAEL,CAEH,IAAI,EAAuB,SAAU,EACjC,EAAe,yBAAyB,EAAc,KAAG,EAAY,IACrE,EACJ,EAAmB,EAAG,eAAe,GAAgB,EAAS,EAAqB,EAAS,EAChG,MAPI,EAAG,gBAAgB,UAAU,IA1DzC,SAA0C,EAAS,GAC/C,IAAI,EAAc,EAAG,MAAM,QAAQ,IAAI,EAAS,GAC5C,GAA+C,mBAAxB,EAAmB,SAC1C,EAAY,UAChB,EAAG,MAAM,QAAQ,IAAI,EAAS,EAA6B,GAAe,EAAY,WAAc,EAAc,EACtH,CA+DQ,CAAiC,EAAS,EAC9C,GAIJ,EAAG,oBAAoB,yBAAmC,SAAI,SAAS,GACnE,IAAI,EAAqB,EAAG,oBAAoB,mBAAmB,GAEnE,OAAkC,GAA7B,EAAmB,QAAgB,EAAmB,GAAY,SAGnE,EAAG,oBAAoB,yBAAyB,EAAoB,QAF7D,KAIJ,uFACX,EAEA,EAAG,gBAAgB,gBAA0B,UAAI,CACpD,CAzSD,GA2SA,EAAG,aAAa,oBAAqB,EAAG,mBACxC,EAAG,aAAa,iBAAkB,EAAG,gBAErC,EAAG,MAAM,2BAA6B,SAAU,EAAM,EAAO,GAErD,IAAI,EAAgB,EAAG,EAAG,EAAU,EADxC,GAAI,EAAK,QAAU,EAAM,OAErB,IAAK,EAAiB,EAAI,IAAK,GAAuB,EAAiB,KAAyB,EAAW,EAAK,MAAO,EAAG,CACtH,IAAK,EAAI,EAAG,EAAY,EAAM,KAAM,EAChC,GAAI,EAAgB,QAAM,EAAiB,MAAG,CAC1C,EAAgB,MAAI,EAAiB,MACrC,EAAiB,MAAI,EAAgB,MACrC,EAAM,OAAO,EAAG,GAChB,EAAiB,EAAI,EACrB,KACJ,CAEJ,GAAkB,CACtB,CAER,EAEA,EAAG,MAAM,cAAgB,WACrB,IAAI,EAAiB,QAAS,EAAiB,UAgB/C,SAAS,EAA4B,EAAU,EAAU,EAAgB,EAAgB,GACrF,IAGI,EACA,EAGA,EAAS,EACT,EARA,EAAQ,KAAK,IACb,EAAQ,KAAK,IACb,EAAqB,GACX,EAAc,EAAS,OACvB,EAAc,EAAS,OACjC,EAAgB,EAAc,GAAgB,EAC9C,EAAc,EAAc,EAAc,EAI9C,IAAK,EAAW,EAAG,GAAY,EAAa,IAKxC,IAJA,EAAU,EACV,EAAmB,KAAK,EAAU,IAClC,EAAoB,EAAM,EAAa,EAAW,GAE7C,EADe,EAAM,EAAG,EAAW,GACL,GAAY,EAAmB,IAC9D,GAAK,EAEA,GAAK,EAEL,GAAI,EAAS,EAAW,KAAO,EAAS,EAAW,GACpD,EAAQ,GAAY,EAAQ,EAAW,OACtC,CACD,IAAI,EAAgB,EAAQ,IAAa,EACrC,EAAe,EAAQ,EAAW,IAAM,EAC5C,EAAQ,GAAY,EAAM,EAAe,GAAgB,CAC7D,MAPI,EAAQ,GAAY,EAAW,OAF/B,EAAQ,GAAY,EAAW,EAa3C,IAAqB,EAAjB,EAAa,GAAgB,EAAW,GAAI,EAAW,GAC3D,IAAK,EAAW,EAAa,EAAW,EAAa,GAAY,GAC7D,EAAa,EAAmB,GAAU,GAAY,EAClD,GAAY,IAAe,EAAmB,GAAU,EAAS,GACjE,EAAS,KAAK,EAAW,EAAW,QAAU,CAC1C,OAAU,EACV,MAAS,IAAW,GACpB,MAAS,IACN,GAAY,IAAe,EAAmB,EAAW,GAAG,GACnE,EAAS,KAAK,EAAW,EAAW,QAAU,CAC1C,OAAU,EACV,MAAS,IAAW,GACpB,MAAS,OAEX,IACA,EACG,EAAgB,QACjB,EAAW,KAAK,CACZ,OAAU,WACV,MAAS,EAAS,MASlC,OAFA,EAAG,MAAM,2BAA2B,EAAU,GAAW,EAAwB,gBAAmB,GAAd,GAE/E,EAAW,SACtB,CAEA,OA3EA,SAAuB,EAAU,EAAU,GAOvC,OAJA,EAA8B,kBAAZ,EAAyB,CAAE,eAAkB,GAAa,GAAW,CAAC,EAExF,EAAW,GAAY,IADvB,EAAW,GAAY,IAGV,OAAS,EAAS,OACpB,EAA4B,EAAU,EAAU,EAAgB,EAAgB,GAEhF,EAA4B,EAAU,EAAU,EAAgB,EAAgB,EAC/F,CAiEH,CAhFwB,GAkFzB,EAAG,aAAa,sBAAuB,EAAG,MAAM,eAChD,WAWI,SAAS,EAA6B,EAAe,EAAS,EAAY,EAA0B,GAEhG,IAAI,EAAc,GACd,EAAsB,EAAG,qBAAoB,WAC7C,IAAI,EAAiB,EAAQ,EAAY,EAAO,EAAG,MAAM,yBAAyB,EAAa,KAAmB,GAG9G,EAAY,OAAS,IACrB,EAAG,MAAM,gBAAgB,EAAa,GAClC,GACA,EAAG,oBAAoB,OAAO,EAA0B,KAAM,CAAC,EAAY,EAAgB,KAKnG,EAAY,OAAS,EACrB,EAAG,MAAM,aAAa,EAAa,EACvC,GAAG,KAAM,CAAE,yBAA0B,EAAe,YAAa,WAAa,OAAQ,EAAG,MAAM,+BAA+B,EAAc,IAC5I,MAAO,CAAE,YAAc,EAAa,oBAAuB,EAAoB,WAAa,EAAsB,EACtH,CAEA,IAAI,EAA8B,EAAG,MAAM,QAAQ,UAC/C,EAAwB,EAAG,MAAM,QAAQ,UAE7C,EAAG,MAAM,mCAAqC,SAAU,EAAS,EAAO,EAAS,EAAS,GAEtF,EAAQ,GAAS,GACjB,EAAU,GAAW,CAAC,EACtB,IAeI,EAfA,EAAmB,EAAG,MAAM,QAAQ,IAAI,EAAS,KAAiC,EAClF,EAAoB,EAAG,MAAM,QAAQ,IAAI,EAAS,IAAgC,GAClF,EAAY,EAAG,MAAM,SAAS,GAAmB,SAAU,GAAK,OAAO,EAAE,UAAY,IACrF,EAAa,EAAG,MAAM,cAAc,EAAW,EAAO,EAAwB,gBAG9E,EAAmB,GACnB,EAAyB,EACzB,EAAwB,EAExB,EAAgB,GAChB,EAAiB,GACjB,EAAgC,GAChC,EAAwB,GACxB,EAA4B,GAGhC,SAAS,EAAoB,EAAiB,GAC1C,EAAU,EAAkB,GACxB,IAA0B,IAC1B,EAAsB,GAAmB,GAE7C,EAAQ,gBAAgB,KACxB,EAAG,MAAM,yBAAyB,EAAQ,YAAa,GACvD,EAAiB,KAAK,GACtB,EAAe,KAAK,EACxB,CAEA,SAAS,EAAa,EAAU,GAC5B,GAAI,EACA,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,EAAI,EAAG,IACjC,EAAM,IACN,EAAG,MAAM,aAAa,EAAM,GAAG,aAAa,SAAS,GACjD,EAAS,EAAM,EAAG,EAAM,GAAG,WAC/B,GAIhB,CAEA,IAAK,IAAW,EAAgB,EAAvB,EAAI,EAA+B,EAAiB,EAAW,GAAI,IAExE,OADA,EAAa,EAAsB,MAC3B,EAAuB,QAC3B,IAAK,UACG,IAAe,KACf,EAAU,EAAkB,IAGhB,sBACR,EAAQ,oBAAoB,UAC5B,EAAQ,oBAAsB,GAI9B,EAAG,MAAM,yBAAyB,EAAQ,YAAa,GAAS,SAC5D,EAAsB,eACtB,EAAiB,KAAK,GACtB,EAAe,KAAK,GAChB,EAAQ,aAAe,EACvB,EAAU,KAEV,EAA8B,GAAK,GAGvC,GACA,EAAc,KAAK,MAAM,EAAe,EAAQ,eAI5D,IACA,MAEJ,IAAK,WACD,EAAoB,EAAG,KACvB,MAEJ,IAAK,QACG,IAAe,EACf,EAAoB,EAAG,IAEvB,EAAU,CAAE,WAAY,EAAsB,MAAG,gBAAiB,EAAG,WAAW,MAChF,EAAiB,KAAK,GACtB,EAAe,KAAK,GACf,IACD,EAA0B,GAAK,IAOnD,EAAG,MAAM,QAAQ,IAAI,EAAS,EAA6B,GAG3D,EAAa,EAAoB,WAAG,GAGpC,EAAG,MAAM,aAAa,EAAe,EAAsB,aAAI,EAAG,UAAY,EAAG,YAGxE,EAAI,EAAb,IAAK,IAA8D,EAAU,EAA7D,EAAW,EAAG,gBAAgB,WAAW,GAA0B,EAAU,EAAe,GAAI,IAAK,CAE5G,EAAQ,aACT,EAAG,MAAM,OAAO,EAAS,EAA6B,EAAS,EAAS,EAAQ,WAAY,EAA0B,EAAQ,kBAGlI,IAAK,IAAI,EAAI,EAAG,EAAO,EAAQ,YAAY,GAAI,EAAW,EAAK,YAAa,EAAW,EAAM,IACrF,IAAS,GACT,EAAG,gBAAgB,YAAY,EAAS,EAAM,IAIjD,EAAQ,aAAe,IACxB,EAAyB,EAAQ,WAAY,EAAQ,YAAa,EAAQ,iBAC1E,EAAQ,aAAc,EAE9B,CAYA,IALA,EAAa,EAAsB,aAAG,GAKjC,EAAI,EAAG,EAAI,EAA8B,SAAU,EAChD,EAA8B,KAC9B,EAA8B,GAAG,WAAa,GAKtD,EAAa,EAAmB,UAAG,GACnC,EAAa,EAAkB,SAAG,EACtC,CACH,CAjLD,GAmLA,EAAG,aAAa,2CAA4C,EAAG,MAAM,oCACrE,EAAG,qBAAuB,WACtB,KAA6B,wBAAI,CACrC,EAEA,EAAG,qBAAqB,UAAY,IAAI,EAAG,eAC3C,EAAG,qBAAqB,UAAU,YAAc,EAAG,qBACnD,EAAG,qBAAqB,UAAgC,qBAAI,SAAU,EAAgB,EAAgB,EAAS,GAC3G,IAEI,EAFwB,EAAG,MAAM,UAAY,IACH,EAAsB,MACA,KAA5B,EAAsB,QAE9D,GAAI,EACA,OAAO,EAAG,MAAM,UAAU,EAAc,WAAU,GAAM,YAExD,IAAI,EAAe,EAAqB,OACxC,OAAO,EAAG,MAAM,kBAAkB,EAAc,EAExD,EAEA,EAAG,qBAAqB,SAAW,IAAI,EAAG,qBAC1C,EAAG,kBAAkB,EAAG,qBAAqB,UAE7C,EAAG,aAAa,uBAAwB,EAAG,sBAC3C,WACI,EAAG,yBAA2B,WAK1B,IAAI,EAAoB,KAAK,kBAAoB,WAC7C,IAAK,IAAoB,EAAsB,KAC3C,OAAO,EAEX,IACI,GAAI,EAAqB,KAAO,IAAQ,KAAQ,KAAE,WAAW,QAAQ,OAAS,EAE1E,OAAO,CAEf,CAAE,MAAM,GAA2D,CAEnE,OAAO,CACV,CAZgD,GAuBjD,KAA2B,qBAAI,SAAS,EAAgB,EAAgB,EAAS,GAC7E,EAAmB,GAAoB,EACvC,EAAU,GAAW,CAAC,EAX1B,WACI,GAAI,EAAoB,EACpB,MAAM,IAAI,MAAM,2FACxB,CASI,GAGA,IAAI,EAAc,EAAqB,KAAE,eACzC,IAAK,EAAa,CACd,IAAI,EAAe,EAAqB,QAAO,GAE/C,EAAe,qCAAuC,EAAe,eAErE,EAAc,EAAyB,SAAE,KAAM,GAC/C,EAAqB,KAAE,cAAe,EAC1C,CAEA,IAGI,EAvBR,SAAyB,EAAkB,EAAM,GAC7C,OAAO,EAAqB,KAAE,EAAkB,EAAM,EAC1D,CAqBsB,CAAgB,EAHvB,CAAC,EAAsB,OACN,EAAuB,OAAE,CAAE,iBAAoB,GAAkB,EAAyB,kBAMtH,OAHA,EAAsB,SAAE,EAAiB,cAAc,QAEvD,EAA0B,UAAI,CAAC,EACxB,CACX,EAEA,KAAqC,+BAAI,SAAS,GAC9C,MAAO,mCAAqC,EAAS,WACzD,EAEA,KAAkB,YAAI,SAAS,EAAc,GACzC,EAAS,MAAM,gCAAkC,EAAe,KAAO,EAAxD,aACnB,EAEI,EAAoB,IACpB,EAAqB,KAAO,IAAW,QAAI,CACvC,KAAM,sBAEV,EAAqB,KAAO,IAAW,QAAI,CACvC,KAAM,aACN,MAAO,MAGnB,EAEA,EAAG,yBAAyB,UAAY,IAAI,EAAG,eAC/C,EAAG,yBAAyB,UAAU,YAAc,EAAG,yBAGvD,IAAI,EAAmC,IAAI,EAAG,yBAC1C,EAAiC,kBAAoB,GACrD,EAAG,kBAAkB,GAEzB,EAAG,aAAa,2BAA4B,EAAG,yBAClD,CAnFD,EAoFA,EAzxL0B,mBAAX,QAAyB,OAAY,IAE5C,OAAO,CAAC,UAAW,WAAY,GACL,iBAAZ,SAA0C,iBAAX,OAE7C,EAAQ,OAAgB,SAAK,SAG7B,EAAQ,EAAW,GAAI,CAAC,EAkxLhC,CApyLA","file":"/npm/knockout@3.4.2/build/output/knockout-latest.debug.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/knockout@3.4.2/build/output/knockout-latest.debug.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*!\n * Knockout JavaScript library v3.4.2\n * (c) The Knockout.js team - http://knockoutjs.com/\n * License: MIT (http://www.opensource.org/licenses/mit-license.php)\n */\n\n(function(){\nvar DEBUG=true;\n(function(undefined){\n    // (0, eval)('this') is a robust way of getting a reference to the global object\n    // For details, see http://stackoverflow.com/questions/14119988/return-this-0-evalthis/14120023#14120023\n    var window = this || (0, eval)('this'),\n        document = window['document'],\n        navigator = window['navigator'],\n        jQueryInstance = window[\"jQuery\"],\n        JSON = window[\"JSON\"];\n(function(factory) {\n    // Support three module loading scenarios\n    if (typeof define === 'function' && define['amd']) {\n        // [1] AMD anonymous module\n        define(['exports', 'require'], factory);\n    } else if (typeof exports === 'object' && typeof module === 'object') {\n        // [2] CommonJS/Node.js\n        factory(module['exports'] || exports);  // module.exports is for Node.js\n    } else {\n        // [3] No module loader (plain <script> tag) - put directly in global namespace\n        factory(window['ko'] = {});\n    }\n}(function(koExports, amdRequire){\n// Internally, all KO objects are attached to koExports (even the non-exported ones whose names will be minified by the closure compiler).\n// In the future, the following \"ko\" variable may be made distinct from \"koExports\" so that private objects are not externally reachable.\nvar ko = typeof koExports !== 'undefined' ? koExports : {};\n// Google Closure Compiler helpers (used only to make the minified file smaller)\nko.exportSymbol = function(koPath, object) {\n    var tokens = koPath.split(\".\");\n\n    // In the future, \"ko\" may become distinct from \"koExports\" (so that non-exported objects are not reachable)\n    // At that point, \"target\" would be set to: (typeof koExports !== \"undefined\" ? koExports : ko)\n    var target = ko;\n\n    for (var i = 0; i < tokens.length - 1; i++)\n        target = target[tokens[i]];\n    target[tokens[tokens.length - 1]] = object;\n};\nko.exportProperty = function(owner, publicName, object) {\n    owner[publicName] = object;\n};\nko.version = \"3.4.2\";\n\nko.exportSymbol('version', ko.version);\n// For any options that may affect various areas of Knockout and aren't directly associated with data binding.\nko.options = {\n    'deferUpdates': false,\n    'useOnlyNativeEvents': false\n};\n\n//ko.exportSymbol('options', ko.options);   // 'options' isn't minified\nko.utils = (function () {\n    function objectForEach(obj, action) {\n        for (var prop in obj) {\n            if (obj.hasOwnProperty(prop)) {\n                action(prop, obj[prop]);\n            }\n        }\n    }\n\n    function extend(target, source) {\n        if (source) {\n            for(var prop in source) {\n                if(source.hasOwnProperty(prop)) {\n                    target[prop] = source[prop];\n                }\n            }\n        }\n        return target;\n    }\n\n    function setPrototypeOf(obj, proto) {\n        obj.__proto__ = proto;\n        return obj;\n    }\n\n    var canSetPrototype = ({ __proto__: [] } instanceof Array);\n    var canUseSymbols = !DEBUG && typeof Symbol === 'function';\n\n    // Represent the known event types in a compact way, then at runtime transform it into a hash with event name as key (for fast lookup)\n    var knownEvents = {}, knownEventTypesByEventName = {};\n    var keyEventTypeName = (navigator && /Firefox\\/2/i.test(navigator.userAgent)) ? 'KeyboardEvent' : 'UIEvents';\n    knownEvents[keyEventTypeName] = ['keyup', 'keydown', 'keypress'];\n    knownEvents['MouseEvents'] = ['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave'];\n    objectForEach(knownEvents, function(eventType, knownEventsForType) {\n        if (knownEventsForType.length) {\n            for (var i = 0, j = knownEventsForType.length; i < j; i++)\n                knownEventTypesByEventName[knownEventsForType[i]] = eventType;\n        }\n    });\n    var eventsThatMustBeRegisteredUsingAttachEvent = { 'propertychange': true }; // Workaround for an IE9 issue - https://github.com/SteveSanderson/knockout/issues/406\n\n    // Detect IE versions for bug workarounds (uses IE conditionals, not UA string, for robustness)\n    // Note that, since IE 10 does not support conditional comments, the following logic only detects IE < 10.\n    // Currently this is by design, since IE 10+ behaves correctly when treated as a standard browser.\n    // If there is a future need to detect specific versions of IE10+, we will amend this.\n    var ieVersion = document && (function() {\n        var version = 3, div = document.createElement('div'), iElems = div.getElementsByTagName('i');\n\n        // Keep constructing conditional HTML blocks until we hit one that resolves to an empty fragment\n        while (\n            div.innerHTML = '<!--[if gt IE ' + (++version) + ']><i></i><![endif]-->',\n            iElems[0]\n        ) {}\n        return version > 4 ? version : undefined;\n    }());\n    var isIe6 = ieVersion === 6,\n        isIe7 = ieVersion === 7;\n\n    function isClickOnCheckableElement(element, eventType) {\n        if ((ko.utils.tagNameLower(element) !== \"input\") || !element.type) return false;\n        if (eventType.toLowerCase() != \"click\") return false;\n        var inputType = element.type;\n        return (inputType == \"checkbox\") || (inputType == \"radio\");\n    }\n\n    // For details on the pattern for changing node classes\n    // see: https://github.com/knockout/knockout/issues/1597\n    var cssClassNameRegex = /\\S+/g;\n\n    function toggleDomNodeCssClass(node, classNames, shouldHaveClass) {\n        var addOrRemoveFn;\n        if (classNames) {\n            if (typeof node.classList === 'object') {\n                addOrRemoveFn = node.classList[shouldHaveClass ? 'add' : 'remove'];\n                ko.utils.arrayForEach(classNames.match(cssClassNameRegex), function(className) {\n                    addOrRemoveFn.call(node.classList, className);\n                });\n            } else if (typeof node.className['baseVal'] === 'string') {\n                // SVG tag .classNames is an SVGAnimatedString instance\n                toggleObjectClassPropertyString(node.className, 'baseVal', classNames, shouldHaveClass);\n            } else {\n                // node.className ought to be a string.\n                toggleObjectClassPropertyString(node, 'className', classNames, shouldHaveClass);\n            }\n        }\n    }\n\n    function toggleObjectClassPropertyString(obj, prop, classNames, shouldHaveClass) {\n        // obj/prop is either a node/'className' or a SVGAnimatedString/'baseVal'.\n        var currentClassNames = obj[prop].match(cssClassNameRegex) || [];\n        ko.utils.arrayForEach(classNames.match(cssClassNameRegex), function(className) {\n            ko.utils.addOrRemoveItem(currentClassNames, className, shouldHaveClass);\n        });\n        obj[prop] = currentClassNames.join(\" \");\n    }\n\n    return {\n        fieldsIncludedWithJsonPost: ['authenticity_token', /^__RequestVerificationToken(_.*)?$/],\n\n        arrayForEach: function (array, action) {\n            for (var i = 0, j = array.length; i < j; i++)\n                action(array[i], i);\n        },\n\n        arrayIndexOf: function (array, item) {\n            if (typeof Array.prototype.indexOf == \"function\")\n                return Array.prototype.indexOf.call(array, item);\n            for (var i = 0, j = array.length; i < j; i++)\n                if (array[i] === item)\n                    return i;\n            return -1;\n        },\n\n        arrayFirst: function (array, predicate, predicateOwner) {\n            for (var i = 0, j = array.length; i < j; i++)\n                if (predicate.call(predicateOwner, array[i], i))\n                    return array[i];\n            return null;\n        },\n\n        arrayRemoveItem: function (array, itemToRemove) {\n            var index = ko.utils.arrayIndexOf(array, itemToRemove);\n            if (index > 0) {\n                array.splice(index, 1);\n            }\n            else if (index === 0) {\n                array.shift();\n            }\n        },\n\n        arrayGetDistinctValues: function (array) {\n            array = array || [];\n            var result = [];\n            for (var i = 0, j = array.length; i < j; i++) {\n                if (ko.utils.arrayIndexOf(result, array[i]) < 0)\n                    result.push(array[i]);\n            }\n            return result;\n        },\n\n        arrayMap: function (array, mapping) {\n            array = array || [];\n            var result = [];\n            for (var i = 0, j = array.length; i < j; i++)\n                result.push(mapping(array[i], i));\n            return result;\n        },\n\n        arrayFilter: function (array, predicate) {\n            array = array || [];\n            var result = [];\n            for (var i = 0, j = array.length; i < j; i++)\n                if (predicate(array[i], i))\n                    result.push(array[i]);\n            return result;\n        },\n\n        arrayPushAll: function (array, valuesToPush) {\n            if (valuesToPush instanceof Array)\n                array.push.apply(array, valuesToPush);\n            else\n                for (var i = 0, j = valuesToPush.length; i < j; i++)\n                    array.push(valuesToPush[i]);\n            return array;\n        },\n\n        addOrRemoveItem: function(array, value, included) {\n            var existingEntryIndex = ko.utils.arrayIndexOf(ko.utils.peekObservable(array), value);\n            if (existingEntryIndex < 0) {\n                if (included)\n                    array.push(value);\n            } else {\n                if (!included)\n                    array.splice(existingEntryIndex, 1);\n            }\n        },\n\n        canSetPrototype: canSetPrototype,\n\n        extend: extend,\n\n        setPrototypeOf: setPrototypeOf,\n\n        setPrototypeOfOrExtend: canSetPrototype ? setPrototypeOf : extend,\n\n        objectForEach: objectForEach,\n\n        objectMap: function(source, mapping) {\n            if (!source)\n                return source;\n            var target = {};\n            for (var prop in source) {\n                if (source.hasOwnProperty(prop)) {\n                    target[prop] = mapping(source[prop], prop, source);\n                }\n            }\n            return target;\n        },\n\n        emptyDomNode: function (domNode) {\n            while (domNode.firstChild) {\n                ko.removeNode(domNode.firstChild);\n            }\n        },\n\n        moveCleanedNodesToContainerElement: function(nodes) {\n            // Ensure it's a real array, as we're about to reparent the nodes and\n            // we don't want the underlying collection to change while we're doing that.\n            var nodesArray = ko.utils.makeArray(nodes);\n            var templateDocument = (nodesArray[0] && nodesArray[0].ownerDocument) || document;\n\n            var container = templateDocument.createElement('div');\n            for (var i = 0, j = nodesArray.length; i < j; i++) {\n                container.appendChild(ko.cleanNode(nodesArray[i]));\n            }\n            return container;\n        },\n\n        cloneNodes: function (nodesArray, shouldCleanNodes) {\n            for (var i = 0, j = nodesArray.length, newNodesArray = []; i < j; i++) {\n                var clonedNode = nodesArray[i].cloneNode(true);\n                newNodesArray.push(shouldCleanNodes ? ko.cleanNode(clonedNode) : clonedNode);\n            }\n            return newNodesArray;\n        },\n\n        setDomNodeChildren: function (domNode, childNodes) {\n            ko.utils.emptyDomNode(domNode);\n            if (childNodes) {\n                for (var i = 0, j = childNodes.length; i < j; i++)\n                    domNode.appendChild(childNodes[i]);\n            }\n        },\n\n        replaceDomNodes: function (nodeToReplaceOrNodeArray, newNodesArray) {\n            var nodesToReplaceArray = nodeToReplaceOrNodeArray.nodeType ? [nodeToReplaceOrNodeArray] : nodeToReplaceOrNodeArray;\n            if (nodesToReplaceArray.length > 0) {\n                var insertionPoint = nodesToReplaceArray[0];\n                var parent = insertionPoint.parentNode;\n                for (var i = 0, j = newNodesArray.length; i < j; i++)\n                    parent.insertBefore(newNodesArray[i], insertionPoint);\n                for (var i = 0, j = nodesToReplaceArray.length; i < j; i++) {\n                    ko.removeNode(nodesToReplaceArray[i]);\n                }\n            }\n        },\n\n        fixUpContinuousNodeArray: function(continuousNodeArray, parentNode) {\n            // Before acting on a set of nodes that were previously outputted by a template function, we have to reconcile\n            // them against what is in the DOM right now. It may be that some of the nodes have already been removed, or that\n            // new nodes might have been inserted in the middle, for example by a binding. Also, there may previously have been\n            // leading comment nodes (created by rewritten string-based templates) that have since been removed during binding.\n            // So, this function translates the old \"map\" output array into its best guess of the set of current DOM nodes.\n            //\n            // Rules:\n            //   [A] Any leading nodes that have been removed should be ignored\n            //       These most likely correspond to memoization nodes that were already removed during binding\n            //       See https://github.com/knockout/knockout/pull/440\n            //   [B] Any trailing nodes that have been remove should be ignored\n            //       This prevents the code here from adding unrelated nodes to the array while processing rule [C]\n            //       See https://github.com/knockout/knockout/pull/1903\n            //   [C] We want to output a continuous series of nodes. So, ignore any nodes that have already been removed,\n            //       and include any nodes that have been inserted among the previous collection\n\n            if (continuousNodeArray.length) {\n                // The parent node can be a virtual element; so get the real parent node\n                parentNode = (parentNode.nodeType === 8 && parentNode.parentNode) || parentNode;\n\n                // Rule [A]\n                while (continuousNodeArray.length && continuousNodeArray[0].parentNode !== parentNode)\n                    continuousNodeArray.splice(0, 1);\n\n                // Rule [B]\n                while (continuousNodeArray.length > 1 && continuousNodeArray[continuousNodeArray.length - 1].parentNode !== parentNode)\n                    continuousNodeArray.length--;\n\n                // Rule [C]\n                if (continuousNodeArray.length > 1) {\n                    var current = continuousNodeArray[0], last = continuousNodeArray[continuousNodeArray.length - 1];\n                    // Replace with the actual new continuous node set\n                    continuousNodeArray.length = 0;\n                    while (current !== last) {\n                        continuousNodeArray.push(current);\n                        current = current.nextSibling;\n                    }\n                    continuousNodeArray.push(last);\n                }\n            }\n            return continuousNodeArray;\n        },\n\n        setOptionNodeSelectionState: function (optionNode, isSelected) {\n            // IE6 sometimes throws \"unknown error\" if you try to write to .selected directly, whereas Firefox struggles with setAttribute. Pick one based on browser.\n            if (ieVersion < 7)\n                optionNode.setAttribute(\"selected\", isSelected);\n            else\n                optionNode.selected = isSelected;\n        },\n\n        stringTrim: function (string) {\n            return string === null || string === undefined ? '' :\n                string.trim ?\n                    string.trim() :\n                    string.toString().replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g, '');\n        },\n\n        stringStartsWith: function (string, startsWith) {\n            string = string || \"\";\n            if (startsWith.length > string.length)\n                return false;\n            return string.substring(0, startsWith.length) === startsWith;\n        },\n\n        domNodeIsContainedBy: function (node, containedByNode) {\n            if (node === containedByNode)\n                return true;\n            if (node.nodeType === 11)\n                return false; // Fixes issue #1162 - can't use node.contains for document fragments on IE8\n            if (containedByNode.contains)\n                return containedByNode.contains(node.nodeType === 3 ? node.parentNode : node);\n            if (containedByNode.compareDocumentPosition)\n                return (containedByNode.compareDocumentPosition(node) & 16) == 16;\n            while (node && node != containedByNode) {\n                node = node.parentNode;\n            }\n            return !!node;\n        },\n\n        domNodeIsAttachedToDocument: function (node) {\n            return ko.utils.domNodeIsContainedBy(node, node.ownerDocument.documentElement);\n        },\n\n        anyDomNodeIsAttachedToDocument: function(nodes) {\n            return !!ko.utils.arrayFirst(nodes, ko.utils.domNodeIsAttachedToDocument);\n        },\n\n        tagNameLower: function(element) {\n            // For HTML elements, tagName will always be upper case; for XHTML elements, it'll be lower case.\n            // Possible future optimization: If we know it's an element from an XHTML document (not HTML),\n            // we don't need to do the .toLowerCase() as it will always be lower case anyway.\n            return element && element.tagName && element.tagName.toLowerCase();\n        },\n\n        catchFunctionErrors: function (delegate) {\n            return ko['onError'] ? function () {\n                try {\n                    return delegate.apply(this, arguments);\n                } catch (e) {\n                    ko['onError'] && ko['onError'](e);\n                    throw e;\n                }\n            } : delegate;\n        },\n\n        setTimeout: function (handler, timeout) {\n            return setTimeout(ko.utils.catchFunctionErrors(handler), timeout);\n        },\n\n        deferError: function (error) {\n            setTimeout(function () {\n                ko['onError'] && ko['onError'](error);\n                throw error;\n            }, 0);\n        },\n\n        registerEventHandler: function (element, eventType, handler) {\n            var wrappedHandler = ko.utils.catchFunctionErrors(handler);\n\n            var mustUseAttachEvent = ieVersion && eventsThatMustBeRegisteredUsingAttachEvent[eventType];\n            if (!ko.options['useOnlyNativeEvents'] && !mustUseAttachEvent && jQueryInstance) {\n                jQueryInstance(element)['bind'](eventType, wrappedHandler);\n            } else if (!mustUseAttachEvent && typeof element.addEventListener == \"function\")\n                element.addEventListener(eventType, wrappedHandler, false);\n            else if (typeof element.attachEvent != \"undefined\") {\n                var attachEventHandler = function (event) { wrappedHandler.call(element, event); },\n                    attachEventName = \"on\" + eventType;\n                element.attachEvent(attachEventName, attachEventHandler);\n\n                // IE does not dispose attachEvent handlers automatically (unlike with addEventListener)\n                // so to avoid leaks, we have to remove them manually. See bug #856\n                ko.utils.domNodeDisposal.addDisposeCallback(element, function() {\n                    element.detachEvent(attachEventName, attachEventHandler);\n                });\n            } else\n                throw new Error(\"Browser doesn't support addEventListener or attachEvent\");\n        },\n\n        triggerEvent: function (element, eventType) {\n            if (!(element && element.nodeType))\n                throw new Error(\"element must be a DOM node when calling triggerEvent\");\n\n            // For click events on checkboxes and radio buttons, jQuery toggles the element checked state *after* the\n            // event handler runs instead of *before*. (This was fixed in 1.9 for checkboxes but not for radio buttons.)\n            // IE doesn't change the checked state when you trigger the click event using \"fireEvent\".\n            // In both cases, we'll use the click method instead.\n            var useClickWorkaround = isClickOnCheckableElement(element, eventType);\n\n            if (!ko.options['useOnlyNativeEvents'] && jQueryInstance && !useClickWorkaround) {\n                jQueryInstance(element)['trigger'](eventType);\n            } else if (typeof document.createEvent == \"function\") {\n                if (typeof element.dispatchEvent == \"function\") {\n                    var eventCategory = knownEventTypesByEventName[eventType] || \"HTMLEvents\";\n                    var event = document.createEvent(eventCategory);\n                    event.initEvent(eventType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, element);\n                    element.dispatchEvent(event);\n                }\n                else\n                    throw new Error(\"The supplied element doesn't support dispatchEvent\");\n            } else if (useClickWorkaround && element.click) {\n                element.click();\n            } else if (typeof element.fireEvent != \"undefined\") {\n                element.fireEvent(\"on\" + eventType);\n            } else {\n                throw new Error(\"Browser doesn't support triggering events\");\n            }\n        },\n\n        unwrapObservable: function (value) {\n            return ko.isObservable(value) ? value() : value;\n        },\n\n        peekObservable: function (value) {\n            return ko.isObservable(value) ? value.peek() : value;\n        },\n\n        toggleDomNodeCssClass: toggleDomNodeCssClass,\n\n        setTextContent: function(element, textContent) {\n            var value = ko.utils.unwrapObservable(textContent);\n            if ((value === null) || (value === undefined))\n                value = \"\";\n\n            // We need there to be exactly one child: a text node.\n            // If there are no children, more than one, or if it's not a text node,\n            // we'll clear everything and create a single text node.\n            var innerTextNode = ko.virtualElements.firstChild(element);\n            if (!innerTextNode || innerTextNode.nodeType != 3 || ko.virtualElements.nextSibling(innerTextNode)) {\n                ko.virtualElements.setDomNodeChildren(element, [element.ownerDocument.createTextNode(value)]);\n            } else {\n                innerTextNode.data = value;\n            }\n\n            ko.utils.forceRefresh(element);\n        },\n\n        setElementName: function(element, name) {\n            element.name = name;\n\n            // Workaround IE 6/7 issue\n            // - https://github.com/SteveSanderson/knockout/issues/197\n            // - http://www.matts411.com/post/setting_the_name_attribute_in_ie_dom/\n            if (ieVersion <= 7) {\n                try {\n                    element.mergeAttributes(document.createElement(\"<input name='\" + element.name + \"'/>\"), false);\n                }\n                catch(e) {} // For IE9 with doc mode \"IE9 Standards\" and browser mode \"IE9 Compatibility View\"\n            }\n        },\n\n        forceRefresh: function(node) {\n            // Workaround for an IE9 rendering bug - https://github.com/SteveSanderson/knockout/issues/209\n            if (ieVersion >= 9) {\n                // For text nodes and comment nodes (most likely virtual elements), we will have to refresh the container\n                var elem = node.nodeType == 1 ? node : node.parentNode;\n                if (elem.style)\n                    elem.style.zoom = elem.style.zoom;\n            }\n        },\n\n        ensureSelectElementIsRenderedCorrectly: function(selectElement) {\n            // Workaround for IE9 rendering bug - it doesn't reliably display all the text in dynamically-added select boxes unless you force it to re-render by updating the width.\n            // (See https://github.com/SteveSanderson/knockout/issues/312, http://stackoverflow.com/questions/5908494/select-only-shows-first-char-of-selected-option)\n            // Also fixes IE7 and IE8 bug that causes selects to be zero width if enclosed by 'if' or 'with'. (See issue #839)\n            if (ieVersion) {\n                var originalWidth = selectElement.style.width;\n                selectElement.style.width = 0;\n                selectElement.style.width = originalWidth;\n            }\n        },\n\n        range: function (min, max) {\n            min = ko.utils.unwrapObservable(min);\n            max = ko.utils.unwrapObservable(max);\n            var result = [];\n            for (var i = min; i <= max; i++)\n                result.push(i);\n            return result;\n        },\n\n        makeArray: function(arrayLikeObject) {\n            var result = [];\n            for (var i = 0, j = arrayLikeObject.length; i < j; i++) {\n                result.push(arrayLikeObject[i]);\n            };\n            return result;\n        },\n\n        createSymbolOrString: function(identifier) {\n            return canUseSymbols ? Symbol(identifier) : identifier;\n        },\n\n        isIe6 : isIe6,\n        isIe7 : isIe7,\n        ieVersion : ieVersion,\n\n        getFormFields: function(form, fieldName) {\n            var fields = ko.utils.makeArray(form.getElementsByTagName(\"input\")).concat(ko.utils.makeArray(form.getElementsByTagName(\"textarea\")));\n            var isMatchingField = (typeof fieldName == 'string')\n                ? function(field) { return field.name === fieldName }\n                : function(field) { return fieldName.test(field.name) }; // Treat fieldName as regex or object containing predicate\n            var matches = [];\n            for (var i = fields.length - 1; i >= 0; i--) {\n                if (isMatchingField(fields[i]))\n                    matches.push(fields[i]);\n            };\n            return matches;\n        },\n\n        parseJson: function (jsonString) {\n            if (typeof jsonString == \"string\") {\n                jsonString = ko.utils.stringTrim(jsonString);\n                if (jsonString) {\n                    if (JSON && JSON.parse) // Use native parsing where available\n                        return JSON.parse(jsonString);\n                    return (new Function(\"return \" + jsonString))(); // Fallback on less safe parsing for older browsers\n                }\n            }\n            return null;\n        },\n\n        stringifyJson: function (data, replacer, space) {   // replacer and space are optional\n            if (!JSON || !JSON.stringify)\n                throw new Error(\"Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js\");\n            return JSON.stringify(ko.utils.unwrapObservable(data), replacer, space);\n        },\n\n        postJson: function (urlOrForm, data, options) {\n            options = options || {};\n            var params = options['params'] || {};\n            var includeFields = options['includeFields'] || this.fieldsIncludedWithJsonPost;\n            var url = urlOrForm;\n\n            // If we were given a form, use its 'action' URL and pick out any requested field values\n            if((typeof urlOrForm == 'object') && (ko.utils.tagNameLower(urlOrForm) === \"form\")) {\n                var originalForm = urlOrForm;\n                url = originalForm.action;\n                for (var i = includeFields.length - 1; i >= 0; i--) {\n                    var fields = ko.utils.getFormFields(originalForm, includeFields[i]);\n                    for (var j = fields.length - 1; j >= 0; j--)\n                        params[fields[j].name] = fields[j].value;\n                }\n            }\n\n            data = ko.utils.unwrapObservable(data);\n            var form = document.createElement(\"form\");\n            form.style.display = \"none\";\n            form.action = url;\n            form.method = \"post\";\n            for (var key in data) {\n                // Since 'data' this is a model object, we include all properties including those inherited from its prototype\n                var input = document.createElement(\"input\");\n                input.type = \"hidden\";\n                input.name = key;\n                input.value = ko.utils.stringifyJson(ko.utils.unwrapObservable(data[key]));\n                form.appendChild(input);\n            }\n            objectForEach(params, function(key, value) {\n                var input = document.createElement(\"input\");\n                input.type = \"hidden\";\n                input.name = key;\n                input.value = value;\n                form.appendChild(input);\n            });\n            document.body.appendChild(form);\n            options['submitter'] ? options['submitter'](form) : form.submit();\n            setTimeout(function () { form.parentNode.removeChild(form); }, 0);\n        }\n    }\n}());\n\nko.exportSymbol('utils', ko.utils);\nko.exportSymbol('utils.arrayForEach', ko.utils.arrayForEach);\nko.exportSymbol('utils.arrayFirst', ko.utils.arrayFirst);\nko.exportSymbol('utils.arrayFilter', ko.utils.arrayFilter);\nko.exportSymbol('utils.arrayGetDistinctValues', ko.utils.arrayGetDistinctValues);\nko.exportSymbol('utils.arrayIndexOf', ko.utils.arrayIndexOf);\nko.exportSymbol('utils.arrayMap', ko.utils.arrayMap);\nko.exportSymbol('utils.arrayPushAll', ko.utils.arrayPushAll);\nko.exportSymbol('utils.arrayRemoveItem', ko.utils.arrayRemoveItem);\nko.exportSymbol('utils.extend', ko.utils.extend);\nko.exportSymbol('utils.fieldsIncludedWithJsonPost', ko.utils.fieldsIncludedWithJsonPost);\nko.exportSymbol('utils.getFormFields', ko.utils.getFormFields);\nko.exportSymbol('utils.peekObservable', ko.utils.peekObservable);\nko.exportSymbol('utils.postJson', ko.utils.postJson);\nko.exportSymbol('utils.parseJson', ko.utils.parseJson);\nko.exportSymbol('utils.registerEventHandler', ko.utils.registerEventHandler);\nko.exportSymbol('utils.stringifyJson', ko.utils.stringifyJson);\nko.exportSymbol('utils.range', ko.utils.range);\nko.exportSymbol('utils.toggleDomNodeCssClass', ko.utils.toggleDomNodeCssClass);\nko.exportSymbol('utils.triggerEvent', ko.utils.triggerEvent);\nko.exportSymbol('utils.unwrapObservable', ko.utils.unwrapObservable);\nko.exportSymbol('utils.objectForEach', ko.utils.objectForEach);\nko.exportSymbol('utils.addOrRemoveItem', ko.utils.addOrRemoveItem);\nko.exportSymbol('utils.setTextContent', ko.utils.setTextContent);\nko.exportSymbol('unwrap', ko.utils.unwrapObservable); // Convenient shorthand, because this is used so commonly\n\nif (!Function.prototype['bind']) {\n    // Function.prototype.bind is a standard part of ECMAScript 5th Edition (December 2009, http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf)\n    // In case the browser doesn't implement it natively, provide a JavaScript implementation. This implementation is based on the one in prototype.js\n    Function.prototype['bind'] = function (object) {\n        var originalFunction = this;\n        if (arguments.length === 1) {\n            return function () {\n                return originalFunction.apply(object, arguments);\n            };\n        } else {\n            var partialArgs = Array.prototype.slice.call(arguments, 1);\n            return function () {\n                var args = partialArgs.slice(0);\n                args.push.apply(args, arguments);\n                return originalFunction.apply(object, args);\n            };\n        }\n    };\n}\n\nko.utils.domData = new (function () {\n    var uniqueId = 0;\n    var dataStoreKeyExpandoPropertyName = \"__ko__\" + (new Date).getTime();\n    var dataStore = {};\n\n    function getAll(node, createIfNotFound) {\n        var dataStoreKey = node[dataStoreKeyExpandoPropertyName];\n        var hasExistingDataStore = dataStoreKey && (dataStoreKey !== \"null\") && dataStore[dataStoreKey];\n        if (!hasExistingDataStore) {\n            if (!createIfNotFound)\n                return undefined;\n            dataStoreKey = node[dataStoreKeyExpandoPropertyName] = \"ko\" + uniqueId++;\n            dataStore[dataStoreKey] = {};\n        }\n        return dataStore[dataStoreKey];\n    }\n\n    return {\n        get: function (node, key) {\n            var allDataForNode = getAll(node, false);\n            return allDataForNode === undefined ? undefined : allDataForNode[key];\n        },\n        set: function (node, key, value) {\n            if (value === undefined) {\n                // Make sure we don't actually create a new domData key if we are actually deleting a value\n                if (getAll(node, false) === undefined)\n                    return;\n            }\n            var allDataForNode = getAll(node, true);\n            allDataForNode[key] = value;\n        },\n        clear: function (node) {\n            var dataStoreKey = node[dataStoreKeyExpandoPropertyName];\n            if (dataStoreKey) {\n                delete dataStore[dataStoreKey];\n                node[dataStoreKeyExpandoPropertyName] = null;\n                return true; // Exposing \"did clean\" flag purely so specs can infer whether things have been cleaned up as intended\n            }\n            return false;\n        },\n\n        nextKey: function () {\n            return (uniqueId++) + dataStoreKeyExpandoPropertyName;\n        }\n    };\n})();\n\nko.exportSymbol('utils.domData', ko.utils.domData);\nko.exportSymbol('utils.domData.clear', ko.utils.domData.clear); // Exporting only so specs can clear up after themselves fully\n\nko.utils.domNodeDisposal = new (function () {\n    var domDataKey = ko.utils.domData.nextKey();\n    var cleanableNodeTypes = { 1: true, 8: true, 9: true };       // Element, Comment, Document\n    var cleanableNodeTypesWithDescendants = { 1: true, 9: true }; // Element, Document\n\n    function getDisposeCallbacksCollection(node, createIfNotFound) {\n        var allDisposeCallbacks = ko.utils.domData.get(node, domDataKey);\n        if ((allDisposeCallbacks === undefined) && createIfNotFound) {\n            allDisposeCallbacks = [];\n            ko.utils.domData.set(node, domDataKey, allDisposeCallbacks);\n        }\n        return allDisposeCallbacks;\n    }\n    function destroyCallbacksCollection(node) {\n        ko.utils.domData.set(node, domDataKey, undefined);\n    }\n\n    function cleanSingleNode(node) {\n        // Run all the dispose callbacks\n        var callbacks = getDisposeCallbacksCollection(node, false);\n        if (callbacks) {\n            callbacks = callbacks.slice(0); // Clone, as the array may be modified during iteration (typically, callbacks will remove themselves)\n            for (var i = 0; i < callbacks.length; i++)\n                callbacks[i](node);\n        }\n\n        // Erase the DOM data\n        ko.utils.domData.clear(node);\n\n        // Perform cleanup needed by external libraries (currently only jQuery, but can be extended)\n        ko.utils.domNodeDisposal[\"cleanExternalData\"](node);\n\n        // Clear any immediate-child comment nodes, as these wouldn't have been found by\n        // node.getElementsByTagName(\"*\") in cleanNode() (comment nodes aren't elements)\n        if (cleanableNodeTypesWithDescendants[node.nodeType])\n            cleanImmediateCommentTypeChildren(node);\n    }\n\n    function cleanImmediateCommentTypeChildren(nodeWithChildren) {\n        var child, nextChild = nodeWithChildren.firstChild;\n        while (child = nextChild) {\n            nextChild = child.nextSibling;\n            if (child.nodeType === 8)\n                cleanSingleNode(child);\n        }\n    }\n\n    return {\n        addDisposeCallback : function(node, callback) {\n            if (typeof callback != \"function\")\n                throw new Error(\"Callback must be a function\");\n            getDisposeCallbacksCollection(node, true).push(callback);\n        },\n\n        removeDisposeCallback : function(node, callback) {\n            var callbacksCollection = getDisposeCallbacksCollection(node, false);\n            if (callbacksCollection) {\n                ko.utils.arrayRemoveItem(callbacksCollection, callback);\n                if (callbacksCollection.length == 0)\n                    destroyCallbacksCollection(node);\n            }\n        },\n\n        cleanNode : function(node) {\n            // First clean this node, where applicable\n            if (cleanableNodeTypes[node.nodeType]) {\n                cleanSingleNode(node);\n\n                // ... then its descendants, where applicable\n                if (cleanableNodeTypesWithDescendants[node.nodeType]) {\n                    // Clone the descendants list in case it changes during iteration\n                    var descendants = [];\n                    ko.utils.arrayPushAll(descendants, node.getElementsByTagName(\"*\"));\n                    for (var i = 0, j = descendants.length; i < j; i++)\n                        cleanSingleNode(descendants[i]);\n                }\n            }\n            return node;\n        },\n\n        removeNode : function(node) {\n            ko.cleanNode(node);\n            if (node.parentNode)\n                node.parentNode.removeChild(node);\n        },\n\n        \"cleanExternalData\" : function (node) {\n            // Special support for jQuery here because it's so commonly used.\n            // Many jQuery plugins (including jquery.tmpl) store data using jQuery's equivalent of domData\n            // so notify it to tear down any resources associated with the node & descendants here.\n            if (jQueryInstance && (typeof jQueryInstance['cleanData'] == \"function\"))\n                jQueryInstance['cleanData']([node]);\n        }\n    };\n})();\nko.cleanNode = ko.utils.domNodeDisposal.cleanNode; // Shorthand name for convenience\nko.removeNode = ko.utils.domNodeDisposal.removeNode; // Shorthand name for convenience\nko.exportSymbol('cleanNode', ko.cleanNode);\nko.exportSymbol('removeNode', ko.removeNode);\nko.exportSymbol('utils.domNodeDisposal', ko.utils.domNodeDisposal);\nko.exportSymbol('utils.domNodeDisposal.addDisposeCallback', ko.utils.domNodeDisposal.addDisposeCallback);\nko.exportSymbol('utils.domNodeDisposal.removeDisposeCallback', ko.utils.domNodeDisposal.removeDisposeCallback);\n(function () {\n    var none = [0, \"\", \"\"],\n        table = [1, \"<table>\", \"</table>\"],\n        tbody = [2, \"<table><tbody>\", \"</tbody></table>\"],\n        tr = [3, \"<table><tbody><tr>\", \"</tr></tbody></table>\"],\n        select = [1, \"<select multiple='multiple'>\", \"</select>\"],\n        lookup = {\n            'thead': table,\n            'tbody': table,\n            'tfoot': table,\n            'tr': tbody,\n            'td': tr,\n            'th': tr,\n            'option': select,\n            'optgroup': select\n        },\n\n        // This is needed for old IE if you're *not* using either jQuery or innerShiv. Doesn't affect other cases.\n        mayRequireCreateElementHack = ko.utils.ieVersion <= 8;\n\n    function getWrap(tags) {\n        var m = tags.match(/^<([a-z]+)[ >]/);\n        return (m && lookup[m[1]]) || none;\n    }\n\n    function simpleHtmlParse(html, documentContext) {\n        documentContext || (documentContext = document);\n        var windowContext = documentContext['parentWindow'] || documentContext['defaultView'] || window;\n\n        // Based on jQuery's \"clean\" function, but only accounting for table-related elements.\n        // If you have referenced jQuery, this won't be used anyway - KO will use jQuery's \"clean\" function directly\n\n        // Note that there's still an issue in IE < 9 whereby it will discard comment nodes that are the first child of\n        // a descendant node. For example: \"<div><!-- mycomment -->abc</div>\" will get parsed as \"<div>abc</div>\"\n        // This won't affect anyone who has referenced jQuery, and there's always the workaround of inserting a dummy node\n        // (possibly a text node) in front of the comment. So, KO does not attempt to workaround this IE issue automatically at present.\n\n        // Trim whitespace, otherwise indexOf won't work as expected\n        var tags = ko.utils.stringTrim(html).toLowerCase(), div = documentContext.createElement(\"div\"),\n            wrap = getWrap(tags),\n            depth = wrap[0];\n\n        // Go to html and back, then peel off extra wrappers\n        // Note that we always prefix with some dummy text, because otherwise, IE<9 will strip out leading comment nodes in descendants. Total madness.\n        var markup = \"ignored<div>\" + wrap[1] + html + wrap[2] + \"</div>\";\n        if (typeof windowContext['innerShiv'] == \"function\") {\n            // Note that innerShiv is deprecated in favour of html5shiv. We should consider adding\n            // support for html5shiv (except if no explicit support is needed, e.g., if html5shiv\n            // somehow shims the native APIs so it just works anyway)\n            div.appendChild(windowContext['innerShiv'](markup));\n        } else {\n            if (mayRequireCreateElementHack) {\n                // The document.createElement('my-element') trick to enable custom elements in IE6-8\n                // only works if we assign innerHTML on an element associated with that document.\n                documentContext.appendChild(div);\n            }\n\n            div.innerHTML = markup;\n\n            if (mayRequireCreateElementHack) {\n                div.parentNode.removeChild(div);\n            }\n        }\n\n        // Move to the right depth\n        while (depth--)\n            div = div.lastChild;\n\n        return ko.utils.makeArray(div.lastChild.childNodes);\n    }\n\n    function jQueryHtmlParse(html, documentContext) {\n        // jQuery's \"parseHTML\" function was introduced in jQuery 1.8.0 and is a documented public API.\n        if (jQueryInstance['parseHTML']) {\n            return jQueryInstance['parseHTML'](html, documentContext) || []; // Ensure we always return an array and never null\n        } else {\n            // For jQuery < 1.8.0, we fall back on the undocumented internal \"clean\" function.\n            var elems = jQueryInstance['clean']([html], documentContext);\n\n            // As of jQuery 1.7.1, jQuery parses the HTML by appending it to some dummy parent nodes held in an in-memory document fragment.\n            // Unfortunately, it never clears the dummy parent nodes from the document fragment, so it leaks memory over time.\n            // Fix this by finding the top-most dummy parent element, and detaching it from its owner fragment.\n            if (elems && elems[0]) {\n                // Find the top-most parent element that's a direct child of a document fragment\n                var elem = elems[0];\n                while (elem.parentNode && elem.parentNode.nodeType !== 11 /* i.e., DocumentFragment */)\n                    elem = elem.parentNode;\n                // ... then detach it\n                if (elem.parentNode)\n                    elem.parentNode.removeChild(elem);\n            }\n\n            return elems;\n        }\n    }\n\n    ko.utils.parseHtmlFragment = function(html, documentContext) {\n        return jQueryInstance ?\n            jQueryHtmlParse(html, documentContext) :   // As below, benefit from jQuery's optimisations where possible\n            simpleHtmlParse(html, documentContext);  // ... otherwise, this simple logic will do in most common cases.\n    };\n\n    ko.utils.setHtml = function(node, html) {\n        ko.utils.emptyDomNode(node);\n\n        // There's no legitimate reason to display a stringified observable without unwrapping it, so we'll unwrap it\n        html = ko.utils.unwrapObservable(html);\n\n        if ((html !== null) && (html !== undefined)) {\n            if (typeof html != 'string')\n                html = html.toString();\n\n            // jQuery contains a lot of sophisticated code to parse arbitrary HTML fragments,\n            // for example <tr> elements which are not normally allowed to exist on their own.\n            // If you've referenced jQuery we'll use that rather than duplicating its code.\n            if (jQueryInstance) {\n                jQueryInstance(node)['html'](html);\n            } else {\n                // ... otherwise, use KO's own parsing logic.\n                var parsedNodes = ko.utils.parseHtmlFragment(html, node.ownerDocument);\n                for (var i = 0; i < parsedNodes.length; i++)\n                    node.appendChild(parsedNodes[i]);\n            }\n        }\n    };\n})();\n\nko.exportSymbol('utils.parseHtmlFragment', ko.utils.parseHtmlFragment);\nko.exportSymbol('utils.setHtml', ko.utils.setHtml);\n\nko.memoization = (function () {\n    var memos = {};\n\n    function randomMax8HexChars() {\n        return (((1 + Math.random()) * 0x100000000) | 0).toString(16).substring(1);\n    }\n    function generateRandomId() {\n        return randomMax8HexChars() + randomMax8HexChars();\n    }\n    function findMemoNodes(rootNode, appendToArray) {\n        if (!rootNode)\n            return;\n        if (rootNode.nodeType == 8) {\n            var memoId = ko.memoization.parseMemoText(rootNode.nodeValue);\n            if (memoId != null)\n                appendToArray.push({ domNode: rootNode, memoId: memoId });\n        } else if (rootNode.nodeType == 1) {\n            for (var i = 0, childNodes = rootNode.childNodes, j = childNodes.length; i < j; i++)\n                findMemoNodes(childNodes[i], appendToArray);\n        }\n    }\n\n    return {\n        memoize: function (callback) {\n            if (typeof callback != \"function\")\n                throw new Error(\"You can only pass a function to ko.memoization.memoize()\");\n            var memoId = generateRandomId();\n            memos[memoId] = callback;\n            return \"<!--[ko_memo:\" + memoId + \"]-->\";\n        },\n\n        unmemoize: function (memoId, callbackParams) {\n            var callback = memos[memoId];\n            if (callback === undefined)\n                throw new Error(\"Couldn't find any memo with ID \" + memoId + \". Perhaps it's already been unmemoized.\");\n            try {\n                callback.apply(null, callbackParams || []);\n                return true;\n            }\n            finally { delete memos[memoId]; }\n        },\n\n        unmemoizeDomNodeAndDescendants: function (domNode, extraCallbackParamsArray) {\n            var memos = [];\n            findMemoNodes(domNode, memos);\n            for (var i = 0, j = memos.length; i < j; i++) {\n                var node = memos[i].domNode;\n                var combinedParams = [node];\n                if (extraCallbackParamsArray)\n                    ko.utils.arrayPushAll(combinedParams, extraCallbackParamsArray);\n                ko.memoization.unmemoize(memos[i].memoId, combinedParams);\n                node.nodeValue = \"\"; // Neuter this node so we don't try to unmemoize it again\n                if (node.parentNode)\n                    node.parentNode.removeChild(node); // If possible, erase it totally (not always possible - someone else might just hold a reference to it then call unmemoizeDomNodeAndDescendants again)\n            }\n        },\n\n        parseMemoText: function (memoText) {\n            var match = memoText.match(/^\\[ko_memo\\:(.*?)\\]$/);\n            return match ? match[1] : null;\n        }\n    };\n})();\n\nko.exportSymbol('memoization', ko.memoization);\nko.exportSymbol('memoization.memoize', ko.memoization.memoize);\nko.exportSymbol('memoization.unmemoize', ko.memoization.unmemoize);\nko.exportSymbol('memoization.parseMemoText', ko.memoization.parseMemoText);\nko.exportSymbol('memoization.unmemoizeDomNodeAndDescendants', ko.memoization.unmemoizeDomNodeAndDescendants);\nko.tasks = (function () {\n    var scheduler,\n        taskQueue = [],\n        taskQueueLength = 0,\n        nextHandle = 1,\n        nextIndexToProcess = 0;\n\n    if (window['MutationObserver']) {\n        // Chrome 27+, Firefox 14+, IE 11+, Opera 15+, Safari 6.1+\n        // From https://github.com/petkaantonov/bluebird * Copyright (c) 2014 Petka Antonov * License: MIT\n        scheduler = (function (callback) {\n            var div = document.createElement(\"div\");\n            new MutationObserver(callback).observe(div, {attributes: true});\n            return function () { div.classList.toggle(\"foo\"); };\n        })(scheduledProcess);\n    } else if (document && \"onreadystatechange\" in document.createElement(\"script\")) {\n        // IE 6-10\n        // From https://github.com/YuzuJS/setImmediate * Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola * License: MIT\n        scheduler = function (callback) {\n            var script = document.createElement(\"script\");\n            script.onreadystatechange = function () {\n                script.onreadystatechange = null;\n                document.documentElement.removeChild(script);\n                script = null;\n                callback();\n            };\n            document.documentElement.appendChild(script);\n        };\n    } else {\n        scheduler = function (callback) {\n            setTimeout(callback, 0);\n        };\n    }\n\n    function processTasks() {\n        if (taskQueueLength) {\n            // Each mark represents the end of a logical group of tasks and the number of these groups is\n            // limited to prevent unchecked recursion.\n            var mark = taskQueueLength, countMarks = 0;\n\n            // nextIndexToProcess keeps track of where we are in the queue; processTasks can be called recursively without issue\n            for (var task; nextIndexToProcess < taskQueueLength; ) {\n                if (task = taskQueue[nextIndexToProcess++]) {\n                    if (nextIndexToProcess > mark) {\n                        if (++countMarks >= 5000) {\n                            nextIndexToProcess = taskQueueLength;   // skip all tasks remaining in the queue since any of them could be causing the recursion\n                            ko.utils.deferError(Error(\"'Too much recursion' after processing \" + countMarks + \" task groups.\"));\n                            break;\n                        }\n                        mark = taskQueueLength;\n                    }\n                    try {\n                        task();\n                    } catch (ex) {\n                        ko.utils.deferError(ex);\n                    }\n                }\n            }\n        }\n    }\n\n    function scheduledProcess() {\n        processTasks();\n\n        // Reset the queue\n        nextIndexToProcess = taskQueueLength = taskQueue.length = 0;\n    }\n\n    function scheduleTaskProcessing() {\n        ko.tasks['scheduler'](scheduledProcess);\n    }\n\n    var tasks = {\n        'scheduler': scheduler,     // Allow overriding the scheduler\n\n        schedule: function (func) {\n            if (!taskQueueLength) {\n                scheduleTaskProcessing();\n            }\n\n            taskQueue[taskQueueLength++] = func;\n            return nextHandle++;\n        },\n\n        cancel: function (handle) {\n            var index = handle - (nextHandle - taskQueueLength);\n            if (index >= nextIndexToProcess && index < taskQueueLength) {\n                taskQueue[index] = null;\n            }\n        },\n\n        // For testing only: reset the queue and return the previous queue length\n        'resetForTesting': function () {\n            var length = taskQueueLength - nextIndexToProcess;\n            nextIndexToProcess = taskQueueLength = taskQueue.length = 0;\n            return length;\n        },\n\n        runEarly: processTasks\n    };\n\n    return tasks;\n})();\n\nko.exportSymbol('tasks', ko.tasks);\nko.exportSymbol('tasks.schedule', ko.tasks.schedule);\n//ko.exportSymbol('tasks.cancel', ko.tasks.cancel);  \"cancel\" isn't minified\nko.exportSymbol('tasks.runEarly', ko.tasks.runEarly);\nko.extenders = {\n    'throttle': function(target, timeout) {\n        // Throttling means two things:\n\n        // (1) For dependent observables, we throttle *evaluations* so that, no matter how fast its dependencies\n        //     notify updates, the target doesn't re-evaluate (and hence doesn't notify) faster than a certain rate\n        target['throttleEvaluation'] = timeout;\n\n        // (2) For writable targets (observables, or writable dependent observables), we throttle *writes*\n        //     so the target cannot change value synchronously or faster than a certain rate\n        var writeTimeoutInstance = null;\n        return ko.dependentObservable({\n            'read': target,\n            'write': function(value) {\n                clearTimeout(writeTimeoutInstance);\n                writeTimeoutInstance = ko.utils.setTimeout(function() {\n                    target(value);\n                }, timeout);\n            }\n        });\n    },\n\n    'rateLimit': function(target, options) {\n        var timeout, method, limitFunction;\n\n        if (typeof options == 'number') {\n            timeout = options;\n        } else {\n            timeout = options['timeout'];\n            method = options['method'];\n        }\n\n        // rateLimit supersedes deferred updates\n        target._deferUpdates = false;\n\n        limitFunction = method == 'notifyWhenChangesStop' ?  debounce : throttle;\n        target.limit(function(callback) {\n            return limitFunction(callback, timeout);\n        });\n    },\n\n    'deferred': function(target, options) {\n        if (options !== true) {\n            throw new Error('The \\'deferred\\' extender only accepts the value \\'true\\', because it is not supported to turn deferral off once enabled.')\n        }\n\n        if (!target._deferUpdates) {\n            target._deferUpdates = true;\n            target.limit(function (callback) {\n                var handle,\n                    ignoreUpdates = false;\n                return function () {\n                    if (!ignoreUpdates) {\n                        ko.tasks.cancel(handle);\n                        handle = ko.tasks.schedule(callback);\n\n                        try {\n                            ignoreUpdates = true;\n                            target['notifySubscribers'](undefined, 'dirty');\n                        } finally {\n                            ignoreUpdates = false;\n                        }\n                    }\n                };\n            });\n        }\n    },\n\n    'notify': function(target, notifyWhen) {\n        target[\"equalityComparer\"] = notifyWhen == \"always\" ?\n            null :  // null equalityComparer means to always notify\n            valuesArePrimitiveAndEqual;\n    }\n};\n\nvar primitiveTypes = { 'undefined':1, 'boolean':1, 'number':1, 'string':1 };\nfunction valuesArePrimitiveAndEqual(a, b) {\n    var oldValueIsPrimitive = (a === null) || (typeof(a) in primitiveTypes);\n    return oldValueIsPrimitive ? (a === b) : false;\n}\n\nfunction throttle(callback, timeout) {\n    var timeoutInstance;\n    return function () {\n        if (!timeoutInstance) {\n            timeoutInstance = ko.utils.setTimeout(function () {\n                timeoutInstance = undefined;\n                callback();\n            }, timeout);\n        }\n    };\n}\n\nfunction debounce(callback, timeout) {\n    var timeoutInstance;\n    return function () {\n        clearTimeout(timeoutInstance);\n        timeoutInstance = ko.utils.setTimeout(callback, timeout);\n    };\n}\n\nfunction applyExtenders(requestedExtenders) {\n    var target = this;\n    if (requestedExtenders) {\n        ko.utils.objectForEach(requestedExtenders, function(key, value) {\n            var extenderHandler = ko.extenders[key];\n            if (typeof extenderHandler == 'function') {\n                target = extenderHandler(target, value) || target;\n            }\n        });\n    }\n    return target;\n}\n\nko.exportSymbol('extenders', ko.extenders);\n\nko.subscription = function (target, callback, disposeCallback) {\n    this._target = target;\n    this.callback = callback;\n    this.disposeCallback = disposeCallback;\n    this.isDisposed = false;\n    ko.exportProperty(this, 'dispose', this.dispose);\n};\nko.subscription.prototype.dispose = function () {\n    this.isDisposed = true;\n    this.disposeCallback();\n};\n\nko.subscribable = function () {\n    ko.utils.setPrototypeOfOrExtend(this, ko_subscribable_fn);\n    ko_subscribable_fn.init(this);\n}\n\nvar defaultEvent = \"change\";\n\n// Moved out of \"limit\" to avoid the extra closure\nfunction limitNotifySubscribers(value, event) {\n    if (!event || event === defaultEvent) {\n        this._limitChange(value);\n    } else if (event === 'beforeChange') {\n        this._limitBeforeChange(value);\n    } else {\n        this._origNotifySubscribers(value, event);\n    }\n}\n\nvar ko_subscribable_fn = {\n    init: function(instance) {\n        instance._subscriptions = { \"change\": [] };\n        instance._versionNumber = 1;\n    },\n\n    subscribe: function (callback, callbackTarget, event) {\n        var self = this;\n\n        event = event || defaultEvent;\n        var boundCallback = callbackTarget ? callback.bind(callbackTarget) : callback;\n\n        var subscription = new ko.subscription(self, boundCallback, function () {\n            ko.utils.arrayRemoveItem(self._subscriptions[event], subscription);\n            if (self.afterSubscriptionRemove)\n                self.afterSubscriptionRemove(event);\n        });\n\n        if (self.beforeSubscriptionAdd)\n            self.beforeSubscriptionAdd(event);\n\n        if (!self._subscriptions[event])\n            self._subscriptions[event] = [];\n        self._subscriptions[event].push(subscription);\n\n        return subscription;\n    },\n\n    \"notifySubscribers\": function (valueToNotify, event) {\n        event = event || defaultEvent;\n        if (event === defaultEvent) {\n            this.updateVersion();\n        }\n        if (this.hasSubscriptionsForEvent(event)) {\n            var subs = event === defaultEvent && this._changeSubscriptions || this._subscriptions[event].slice(0);\n            try {\n                ko.dependencyDetection.begin(); // Begin suppressing dependency detection (by setting the top frame to undefined)\n                for (var i = 0, subscription; subscription = subs[i]; ++i) {\n                    // In case a subscription was disposed during the arrayForEach cycle, check\n                    // for isDisposed on each subscription before invoking its callback\n                    if (!subscription.isDisposed)\n                        subscription.callback(valueToNotify);\n                }\n            } finally {\n                ko.dependencyDetection.end(); // End suppressing dependency detection\n            }\n        }\n    },\n\n    getVersion: function () {\n        return this._versionNumber;\n    },\n\n    hasChanged: function (versionToCheck) {\n        return this.getVersion() !== versionToCheck;\n    },\n\n    updateVersion: function () {\n        ++this._versionNumber;\n    },\n\n    limit: function(limitFunction) {\n        var self = this, selfIsObservable = ko.isObservable(self),\n            ignoreBeforeChange, notifyNextChange, previousValue, pendingValue, beforeChange = 'beforeChange';\n\n        if (!self._origNotifySubscribers) {\n            self._origNotifySubscribers = self[\"notifySubscribers\"];\n            self[\"notifySubscribers\"] = limitNotifySubscribers;\n        }\n\n        var finish = limitFunction(function() {\n            self._notificationIsPending = false;\n\n            // If an observable provided a reference to itself, access it to get the latest value.\n            // This allows computed observables to delay calculating their value until needed.\n            if (selfIsObservable && pendingValue === self) {\n                pendingValue = self._evalIfChanged ? self._evalIfChanged() : self();\n            }\n            var shouldNotify = notifyNextChange || self.isDifferent(previousValue, pendingValue);\n\n            notifyNextChange = ignoreBeforeChange = false;\n\n            if (shouldNotify) {\n                self._origNotifySubscribers(previousValue = pendingValue);\n            }\n        });\n\n        self._limitChange = function(value) {\n            self._changeSubscriptions = self._subscriptions[defaultEvent].slice(0);\n            self._notificationIsPending = ignoreBeforeChange = true;\n            pendingValue = value;\n            finish();\n        };\n        self._limitBeforeChange = function(value) {\n            if (!ignoreBeforeChange) {\n                previousValue = value;\n                self._origNotifySubscribers(value, beforeChange);\n            }\n        };\n        self._notifyNextChangeIfValueIsDifferent = function() {\n            if (self.isDifferent(previousValue, self.peek(true /*evaluate*/))) {\n                notifyNextChange = true;\n            }\n        };\n    },\n\n    hasSubscriptionsForEvent: function(event) {\n        return this._subscriptions[event] && this._subscriptions[event].length;\n    },\n\n    getSubscriptionsCount: function (event) {\n        if (event) {\n            return this._subscriptions[event] && this._subscriptions[event].length || 0;\n        } else {\n            var total = 0;\n            ko.utils.objectForEach(this._subscriptions, function(eventName, subscriptions) {\n                if (eventName !== 'dirty')\n                    total += subscriptions.length;\n            });\n            return total;\n        }\n    },\n\n    isDifferent: function(oldValue, newValue) {\n        return !this['equalityComparer'] || !this['equalityComparer'](oldValue, newValue);\n    },\n\n    extend: applyExtenders\n};\n\nko.exportProperty(ko_subscribable_fn, 'subscribe', ko_subscribable_fn.subscribe);\nko.exportProperty(ko_subscribable_fn, 'extend', ko_subscribable_fn.extend);\nko.exportProperty(ko_subscribable_fn, 'getSubscriptionsCount', ko_subscribable_fn.getSubscriptionsCount);\n\n// For browsers that support proto assignment, we overwrite the prototype of each\n// observable instance. Since observables are functions, we need Function.prototype\n// to still be in the prototype chain.\nif (ko.utils.canSetPrototype) {\n    ko.utils.setPrototypeOf(ko_subscribable_fn, Function.prototype);\n}\n\nko.subscribable['fn'] = ko_subscribable_fn;\n\n\nko.isSubscribable = function (instance) {\n    return instance != null && typeof instance.subscribe == \"function\" && typeof instance[\"notifySubscribers\"] == \"function\";\n};\n\nko.exportSymbol('subscribable', ko.subscribable);\nko.exportSymbol('isSubscribable', ko.isSubscribable);\n\nko.computedContext = ko.dependencyDetection = (function () {\n    var outerFrames = [],\n        currentFrame,\n        lastId = 0;\n\n    // Return a unique ID that can be assigned to an observable for dependency tracking.\n    // Theoretically, you could eventually overflow the number storage size, resulting\n    // in duplicate IDs. But in JavaScript, the largest exact integral value is 2^53\n    // or 9,007,199,254,740,992. If you created 1,000,000 IDs per second, it would\n    // take over 285 years to reach that number.\n    // Reference http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html\n    function getId() {\n        return ++lastId;\n    }\n\n    function begin(options) {\n        outerFrames.push(currentFrame);\n        currentFrame = options;\n    }\n\n    function end() {\n        currentFrame = outerFrames.pop();\n    }\n\n    return {\n        begin: begin,\n\n        end: end,\n\n        registerDependency: function (subscribable) {\n            if (currentFrame) {\n                if (!ko.isSubscribable(subscribable))\n                    throw new Error(\"Only subscribable things can act as dependencies\");\n                currentFrame.callback.call(currentFrame.callbackTarget, subscribable, subscribable._id || (subscribable._id = getId()));\n            }\n        },\n\n        ignore: function (callback, callbackTarget, callbackArgs) {\n            try {\n                begin();\n                return callback.apply(callbackTarget, callbackArgs || []);\n            } finally {\n                end();\n            }\n        },\n\n        getDependenciesCount: function () {\n            if (currentFrame)\n                return currentFrame.computed.getDependenciesCount();\n        },\n\n        isInitial: function() {\n            if (currentFrame)\n                return currentFrame.isInitial;\n        }\n    };\n})();\n\nko.exportSymbol('computedContext', ko.computedContext);\nko.exportSymbol('computedContext.getDependenciesCount', ko.computedContext.getDependenciesCount);\nko.exportSymbol('computedContext.isInitial', ko.computedContext.isInitial);\n\nko.exportSymbol('ignoreDependencies', ko.ignoreDependencies = ko.dependencyDetection.ignore);\nvar observableLatestValue = ko.utils.createSymbolOrString('_latestValue');\n\nko.observable = function (initialValue) {\n    function observable() {\n        if (arguments.length > 0) {\n            // Write\n\n            // Ignore writes if the value hasn't changed\n            if (observable.isDifferent(observable[observableLatestValue], arguments[0])) {\n                observable.valueWillMutate();\n                observable[observableLatestValue] = arguments[0];\n                observable.valueHasMutated();\n            }\n            return this; // Permits chained assignments\n        }\n        else {\n            // Read\n            ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a \"read\" operation\n            return observable[observableLatestValue];\n        }\n    }\n\n    observable[observableLatestValue] = initialValue;\n\n    // Inherit from 'subscribable'\n    if (!ko.utils.canSetPrototype) {\n        // 'subscribable' won't be on the prototype chain unless we put it there directly\n        ko.utils.extend(observable, ko.subscribable['fn']);\n    }\n    ko.subscribable['fn'].init(observable);\n\n    // Inherit from 'observable'\n    ko.utils.setPrototypeOfOrExtend(observable, observableFn);\n\n    if (ko.options['deferUpdates']) {\n        ko.extenders['deferred'](observable, true);\n    }\n\n    return observable;\n}\n\n// Define prototype for observables\nvar observableFn = {\n    'equalityComparer': valuesArePrimitiveAndEqual,\n    peek: function() { return this[observableLatestValue]; },\n    valueHasMutated: function () { this['notifySubscribers'](this[observableLatestValue]); },\n    valueWillMutate: function () { this['notifySubscribers'](this[observableLatestValue], 'beforeChange'); }\n};\n\n// Note that for browsers that don't support proto assignment, the\n// inheritance chain is created manually in the ko.observable constructor\nif (ko.utils.canSetPrototype) {\n    ko.utils.setPrototypeOf(observableFn, ko.subscribable['fn']);\n}\n\nvar protoProperty = ko.observable.protoProperty = '__ko_proto__';\nobservableFn[protoProperty] = ko.observable;\n\nko.hasPrototype = function(instance, prototype) {\n    if ((instance === null) || (instance === undefined) || (instance[protoProperty] === undefined)) return false;\n    if (instance[protoProperty] === prototype) return true;\n    return ko.hasPrototype(instance[protoProperty], prototype); // Walk the prototype chain\n};\n\nko.isObservable = function (instance) {\n    return ko.hasPrototype(instance, ko.observable);\n}\nko.isWriteableObservable = function (instance) {\n    // Observable\n    if ((typeof instance == 'function') && instance[protoProperty] === ko.observable)\n        return true;\n    // Writeable dependent observable\n    if ((typeof instance == 'function') && (instance[protoProperty] === ko.dependentObservable) && (instance.hasWriteFunction))\n        return true;\n    // Anything else\n    return false;\n}\n\nko.exportSymbol('observable', ko.observable);\nko.exportSymbol('isObservable', ko.isObservable);\nko.exportSymbol('isWriteableObservable', ko.isWriteableObservable);\nko.exportSymbol('isWritableObservable', ko.isWriteableObservable);\nko.exportSymbol('observable.fn', observableFn);\nko.exportProperty(observableFn, 'peek', observableFn.peek);\nko.exportProperty(observableFn, 'valueHasMutated', observableFn.valueHasMutated);\nko.exportProperty(observableFn, 'valueWillMutate', observableFn.valueWillMutate);\nko.observableArray = function (initialValues) {\n    initialValues = initialValues || [];\n\n    if (typeof initialValues != 'object' || !('length' in initialValues))\n        throw new Error(\"The argument passed when initializing an observable array must be an array, or null, or undefined.\");\n\n    var result = ko.observable(initialValues);\n    ko.utils.setPrototypeOfOrExtend(result, ko.observableArray['fn']);\n    return result.extend({'trackArrayChanges':true});\n};\n\nko.observableArray['fn'] = {\n    'remove': function (valueOrPredicate) {\n        var underlyingArray = this.peek();\n        var removedValues = [];\n        var predicate = typeof valueOrPredicate == \"function\" && !ko.isObservable(valueOrPredicate) ? valueOrPredicate : function (value) { return value === valueOrPredicate; };\n        for (var i = 0; i < underlyingArray.length; i++) {\n            var value = underlyingArray[i];\n            if (predicate(value)) {\n                if (removedValues.length === 0) {\n                    this.valueWillMutate();\n                }\n                removedValues.push(value);\n                underlyingArray.splice(i, 1);\n                i--;\n            }\n        }\n        if (removedValues.length) {\n            this.valueHasMutated();\n        }\n        return removedValues;\n    },\n\n    'removeAll': function (arrayOfValues) {\n        // If you passed zero args, we remove everything\n        if (arrayOfValues === undefined) {\n            var underlyingArray = this.peek();\n            var allValues = underlyingArray.slice(0);\n            this.valueWillMutate();\n            underlyingArray.splice(0, underlyingArray.length);\n            this.valueHasMutated();\n            return allValues;\n        }\n        // If you passed an arg, we interpret it as an array of entries to remove\n        if (!arrayOfValues)\n            return [];\n        return this['remove'](function (value) {\n            return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;\n        });\n    },\n\n    'destroy': function (valueOrPredicate) {\n        var underlyingArray = this.peek();\n        var predicate = typeof valueOrPredicate == \"function\" && !ko.isObservable(valueOrPredicate) ? valueOrPredicate : function (value) { return value === valueOrPredicate; };\n        this.valueWillMutate();\n        for (var i = underlyingArray.length - 1; i >= 0; i--) {\n            var value = underlyingArray[i];\n            if (predicate(value))\n                underlyingArray[i][\"_destroy\"] = true;\n        }\n        this.valueHasMutated();\n    },\n\n    'destroyAll': function (arrayOfValues) {\n        // If you passed zero args, we destroy everything\n        if (arrayOfValues === undefined)\n            return this['destroy'](function() { return true });\n\n        // If you passed an arg, we interpret it as an array of entries to destroy\n        if (!arrayOfValues)\n            return [];\n        return this['destroy'](function (value) {\n            return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;\n        });\n    },\n\n    'indexOf': function (item) {\n        var underlyingArray = this();\n        return ko.utils.arrayIndexOf(underlyingArray, item);\n    },\n\n    'replace': function(oldItem, newItem) {\n        var index = this['indexOf'](oldItem);\n        if (index >= 0) {\n            this.valueWillMutate();\n            this.peek()[index] = newItem;\n            this.valueHasMutated();\n        }\n    }\n};\n\n// Note that for browsers that don't support proto assignment, the\n// inheritance chain is created manually in the ko.observableArray constructor\nif (ko.utils.canSetPrototype) {\n    ko.utils.setPrototypeOf(ko.observableArray['fn'], ko.observable['fn']);\n}\n\n// Populate ko.observableArray.fn with read/write functions from native arrays\n// Important: Do not add any additional functions here that may reasonably be used to *read* data from the array\n// because we'll eval them without causing subscriptions, so ko.computed output could end up getting stale\nko.utils.arrayForEach([\"pop\", \"push\", \"reverse\", \"shift\", \"sort\", \"splice\", \"unshift\"], function (methodName) {\n    ko.observableArray['fn'][methodName] = function () {\n        // Use \"peek\" to avoid creating a subscription in any computed that we're executing in the context of\n        // (for consistency with mutating regular observables)\n        var underlyingArray = this.peek();\n        this.valueWillMutate();\n        this.cacheDiffForKnownOperation(underlyingArray, methodName, arguments);\n        var methodCallResult = underlyingArray[methodName].apply(underlyingArray, arguments);\n        this.valueHasMutated();\n        // The native sort and reverse methods return a reference to the array, but it makes more sense to return the observable array instead.\n        return methodCallResult === underlyingArray ? this : methodCallResult;\n    };\n});\n\n// Populate ko.observableArray.fn with read-only functions from native arrays\nko.utils.arrayForEach([\"slice\"], function (methodName) {\n    ko.observableArray['fn'][methodName] = function () {\n        var underlyingArray = this();\n        return underlyingArray[methodName].apply(underlyingArray, arguments);\n    };\n});\n\nko.exportSymbol('observableArray', ko.observableArray);\nvar arrayChangeEventName = 'arrayChange';\nko.extenders['trackArrayChanges'] = function(target, options) {\n    // Use the provided options--each call to trackArrayChanges overwrites the previously set options\n    target.compareArrayOptions = {};\n    if (options && typeof options == \"object\") {\n        ko.utils.extend(target.compareArrayOptions, options);\n    }\n    target.compareArrayOptions['sparse'] = true;\n\n    // Only modify the target observable once\n    if (target.cacheDiffForKnownOperation) {\n        return;\n    }\n    var trackingChanges = false,\n        cachedDiff = null,\n        arrayChangeSubscription,\n        pendingNotifications = 0,\n        underlyingNotifySubscribersFunction,\n        underlyingBeforeSubscriptionAddFunction = target.beforeSubscriptionAdd,\n        underlyingAfterSubscriptionRemoveFunction = target.afterSubscriptionRemove;\n\n    // Watch \"subscribe\" calls, and for array change events, ensure change tracking is enabled\n    target.beforeSubscriptionAdd = function (event) {\n        if (underlyingBeforeSubscriptionAddFunction)\n            underlyingBeforeSubscriptionAddFunction.call(target, event);\n        if (event === arrayChangeEventName) {\n            trackChanges();\n        }\n    };\n    // Watch \"dispose\" calls, and for array change events, ensure change tracking is disabled when all are disposed\n    target.afterSubscriptionRemove = function (event) {\n        if (underlyingAfterSubscriptionRemoveFunction)\n            underlyingAfterSubscriptionRemoveFunction.call(target, event);\n        if (event === arrayChangeEventName && !target.hasSubscriptionsForEvent(arrayChangeEventName)) {\n            if (underlyingNotifySubscribersFunction) {\n                target['notifySubscribers'] = underlyingNotifySubscribersFunction;\n                underlyingNotifySubscribersFunction = undefined;\n            }\n            arrayChangeSubscription.dispose();\n            trackingChanges = false;\n        }\n    };\n\n    function trackChanges() {\n        // Calling 'trackChanges' multiple times is the same as calling it once\n        if (trackingChanges) {\n            return;\n        }\n\n        trackingChanges = true;\n\n        // Intercept \"notifySubscribers\" to track how many times it was called.\n        underlyingNotifySubscribersFunction = target['notifySubscribers'];\n        target['notifySubscribers'] = function(valueToNotify, event) {\n            if (!event || event === defaultEvent) {\n                ++pendingNotifications;\n            }\n            return underlyingNotifySubscribersFunction.apply(this, arguments);\n        };\n\n        // Each time the array changes value, capture a clone so that on the next\n        // change it's possible to produce a diff\n        var previousContents = [].concat(target.peek() || []);\n        cachedDiff = null;\n        arrayChangeSubscription = target.subscribe(function(currentContents) {\n            // Make a copy of the current contents and ensure it's an array\n            currentContents = [].concat(currentContents || []);\n\n            // Compute the diff and issue notifications, but only if someone is listening\n            if (target.hasSubscriptionsForEvent(arrayChangeEventName)) {\n                var changes = getChanges(previousContents, currentContents);\n            }\n\n            // Eliminate references to the old, removed items, so they can be GCed\n            previousContents = currentContents;\n            cachedDiff = null;\n            pendingNotifications = 0;\n\n            if (changes && changes.length) {\n                target['notifySubscribers'](changes, arrayChangeEventName);\n            }\n        });\n    }\n\n    function getChanges(previousContents, currentContents) {\n        // We try to re-use cached diffs.\n        // The scenarios where pendingNotifications > 1 are when using rate-limiting or the Deferred Updates\n        // plugin, which without this check would not be compatible with arrayChange notifications. Normally,\n        // notifications are issued immediately so we wouldn't be queueing up more than one.\n        if (!cachedDiff || pendingNotifications > 1) {\n            cachedDiff = ko.utils.compareArrays(previousContents, currentContents, target.compareArrayOptions);\n        }\n\n        return cachedDiff;\n    }\n\n    target.cacheDiffForKnownOperation = function(rawArray, operationName, args) {\n        // Only run if we're currently tracking changes for this observable array\n        // and there aren't any pending deferred notifications.\n        if (!trackingChanges || pendingNotifications) {\n            return;\n        }\n        var diff = [],\n            arrayLength = rawArray.length,\n            argsLength = args.length,\n            offset = 0;\n\n        function pushDiff(status, value, index) {\n            return diff[diff.length] = { 'status': status, 'value': value, 'index': index };\n        }\n        switch (operationName) {\n            case 'push':\n                offset = arrayLength;\n            case 'unshift':\n                for (var index = 0; index < argsLength; index++) {\n                    pushDiff('added', args[index], offset + index);\n                }\n                break;\n\n            case 'pop':\n                offset = arrayLength - 1;\n            case 'shift':\n                if (arrayLength) {\n                    pushDiff('deleted', rawArray[offset], offset);\n                }\n                break;\n\n            case 'splice':\n                // Negative start index means 'from end of array'. After that we clamp to [0...arrayLength].\n                // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice\n                var startIndex = Math.min(Math.max(0, args[0] < 0 ? arrayLength + args[0] : args[0]), arrayLength),\n                    endDeleteIndex = argsLength === 1 ? arrayLength : Math.min(startIndex + (args[1] || 0), arrayLength),\n                    endAddIndex = startIndex + argsLength - 2,\n                    endIndex = Math.max(endDeleteIndex, endAddIndex),\n                    additions = [], deletions = [];\n                for (var index = startIndex, argsIndex = 2; index < endIndex; ++index, ++argsIndex) {\n                    if (index < endDeleteIndex)\n                        deletions.push(pushDiff('deleted', rawArray[index], index));\n                    if (index < endAddIndex)\n                        additions.push(pushDiff('added', args[argsIndex], index));\n                }\n                ko.utils.findMovesInArrayComparison(deletions, additions);\n                break;\n\n            default:\n                return;\n        }\n        cachedDiff = diff;\n    };\n};\nvar computedState = ko.utils.createSymbolOrString('_state');\n\nko.computed = ko.dependentObservable = function (evaluatorFunctionOrOptions, evaluatorFunctionTarget, options) {\n    if (typeof evaluatorFunctionOrOptions === \"object\") {\n        // Single-parameter syntax - everything is on this \"options\" param\n        options = evaluatorFunctionOrOptions;\n    } else {\n        // Multi-parameter syntax - construct the options according to the params passed\n        options = options || {};\n        if (evaluatorFunctionOrOptions) {\n            options[\"read\"] = evaluatorFunctionOrOptions;\n        }\n    }\n    if (typeof options[\"read\"] != \"function\")\n        throw Error(\"Pass a function that returns the value of the ko.computed\");\n\n    var writeFunction = options[\"write\"];\n    var state = {\n        latestValue: undefined,\n        isStale: true,\n        isDirty: true,\n        isBeingEvaluated: false,\n        suppressDisposalUntilDisposeWhenReturnsFalse: false,\n        isDisposed: false,\n        pure: false,\n        isSleeping: false,\n        readFunction: options[\"read\"],\n        evaluatorFunctionTarget: evaluatorFunctionTarget || options[\"owner\"],\n        disposeWhenNodeIsRemoved: options[\"disposeWhenNodeIsRemoved\"] || options.disposeWhenNodeIsRemoved || null,\n        disposeWhen: options[\"disposeWhen\"] || options.disposeWhen,\n        domNodeDisposalCallback: null,\n        dependencyTracking: {},\n        dependenciesCount: 0,\n        evaluationTimeoutInstance: null\n    };\n\n    function computedObservable() {\n        if (arguments.length > 0) {\n            if (typeof writeFunction === \"function\") {\n                // Writing a value\n                writeFunction.apply(state.evaluatorFunctionTarget, arguments);\n            } else {\n                throw new Error(\"Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.\");\n            }\n            return this; // Permits chained assignments\n        } else {\n            // Reading the value\n            ko.dependencyDetection.registerDependency(computedObservable);\n            if (state.isDirty || (state.isSleeping && computedObservable.haveDependenciesChanged())) {\n                computedObservable.evaluateImmediate();\n            }\n            return state.latestValue;\n        }\n    }\n\n    computedObservable[computedState] = state;\n    computedObservable.hasWriteFunction = typeof writeFunction === \"function\";\n\n    // Inherit from 'subscribable'\n    if (!ko.utils.canSetPrototype) {\n        // 'subscribable' won't be on the prototype chain unless we put it there directly\n        ko.utils.extend(computedObservable, ko.subscribable['fn']);\n    }\n    ko.subscribable['fn'].init(computedObservable);\n\n    // Inherit from 'computed'\n    ko.utils.setPrototypeOfOrExtend(computedObservable, computedFn);\n\n    if (options['pure']) {\n        state.pure = true;\n        state.isSleeping = true;     // Starts off sleeping; will awake on the first subscription\n        ko.utils.extend(computedObservable, pureComputedOverrides);\n    } else if (options['deferEvaluation']) {\n        ko.utils.extend(computedObservable, deferEvaluationOverrides);\n    }\n\n    if (ko.options['deferUpdates']) {\n        ko.extenders['deferred'](computedObservable, true);\n    }\n\n    if (DEBUG) {\n        // #1731 - Aid debugging by exposing the computed's options\n        computedObservable[\"_options\"] = options;\n    }\n\n    if (state.disposeWhenNodeIsRemoved) {\n        // Since this computed is associated with a DOM node, and we don't want to dispose the computed\n        // until the DOM node is *removed* from the document (as opposed to never having been in the document),\n        // we'll prevent disposal until \"disposeWhen\" first returns false.\n        state.suppressDisposalUntilDisposeWhenReturnsFalse = true;\n\n        // disposeWhenNodeIsRemoved: true can be used to opt into the \"only dispose after first false result\"\n        // behaviour even if there's no specific node to watch. In that case, clear the option so we don't try\n        // to watch for a non-node's disposal. This technique is intended for KO's internal use only and shouldn't\n        // be documented or used by application code, as it's likely to change in a future version of KO.\n        if (!state.disposeWhenNodeIsRemoved.nodeType) {\n            state.disposeWhenNodeIsRemoved = null;\n        }\n    }\n\n    // Evaluate, unless sleeping or deferEvaluation is true\n    if (!state.isSleeping && !options['deferEvaluation']) {\n        computedObservable.evaluateImmediate();\n    }\n\n    // Attach a DOM node disposal callback so that the computed will be proactively disposed as soon as the node is\n    // removed using ko.removeNode. But skip if isActive is false (there will never be any dependencies to dispose).\n    if (state.disposeWhenNodeIsRemoved && computedObservable.isActive()) {\n        ko.utils.domNodeDisposal.addDisposeCallback(state.disposeWhenNodeIsRemoved, state.domNodeDisposalCallback = function () {\n            computedObservable.dispose();\n        });\n    }\n\n    return computedObservable;\n};\n\n// Utility function that disposes a given dependencyTracking entry\nfunction computedDisposeDependencyCallback(id, entryToDispose) {\n    if (entryToDispose !== null && entryToDispose.dispose) {\n        entryToDispose.dispose();\n    }\n}\n\n// This function gets called each time a dependency is detected while evaluating a computed.\n// It's factored out as a shared function to avoid creating unnecessary function instances during evaluation.\nfunction computedBeginDependencyDetectionCallback(subscribable, id) {\n    var computedObservable = this.computedObservable,\n        state = computedObservable[computedState];\n    if (!state.isDisposed) {\n        if (this.disposalCount && this.disposalCandidates[id]) {\n            // Don't want to dispose this subscription, as it's still being used\n            computedObservable.addDependencyTracking(id, subscribable, this.disposalCandidates[id]);\n            this.disposalCandidates[id] = null; // No need to actually delete the property - disposalCandidates is a transient object anyway\n            --this.disposalCount;\n        } else if (!state.dependencyTracking[id]) {\n            // Brand new subscription - add it\n            computedObservable.addDependencyTracking(id, subscribable, state.isSleeping ? { _target: subscribable } : computedObservable.subscribeToDependency(subscribable));\n        }\n        // If the observable we've accessed has a pending notification, ensure we get notified of the actual final value (bypass equality checks)\n        if (subscribable._notificationIsPending) {\n            subscribable._notifyNextChangeIfValueIsDifferent();\n        }\n    }\n}\n\nvar computedFn = {\n    \"equalityComparer\": valuesArePrimitiveAndEqual,\n    getDependenciesCount: function () {\n        return this[computedState].dependenciesCount;\n    },\n    addDependencyTracking: function (id, target, trackingObj) {\n        if (this[computedState].pure && target === this) {\n            throw Error(\"A 'pure' computed must not be called recursively\");\n        }\n\n        this[computedState].dependencyTracking[id] = trackingObj;\n        trackingObj._order = this[computedState].dependenciesCount++;\n        trackingObj._version = target.getVersion();\n    },\n    haveDependenciesChanged: function () {\n        var id, dependency, dependencyTracking = this[computedState].dependencyTracking;\n        for (id in dependencyTracking) {\n            if (dependencyTracking.hasOwnProperty(id)) {\n                dependency = dependencyTracking[id];\n                if ((this._evalDelayed && dependency._target._notificationIsPending) || dependency._target.hasChanged(dependency._version)) {\n                    return true;\n                }\n            }\n        }\n    },\n    markDirty: function () {\n        // Process \"dirty\" events if we can handle delayed notifications\n        if (this._evalDelayed && !this[computedState].isBeingEvaluated) {\n            this._evalDelayed(false /*isChange*/);\n        }\n    },\n    isActive: function () {\n        var state = this[computedState];\n        return state.isDirty || state.dependenciesCount > 0;\n    },\n    respondToChange: function () {\n        // Ignore \"change\" events if we've already scheduled a delayed notification\n        if (!this._notificationIsPending) {\n            this.evaluatePossiblyAsync();\n        } else if (this[computedState].isDirty) {\n            this[computedState].isStale = true;\n        }\n    },\n    subscribeToDependency: function (target) {\n        if (target._deferUpdates && !this[computedState].disposeWhenNodeIsRemoved) {\n            var dirtySub = target.subscribe(this.markDirty, this, 'dirty'),\n                changeSub = target.subscribe(this.respondToChange, this);\n            return {\n                _target: target,\n                dispose: function () {\n                    dirtySub.dispose();\n                    changeSub.dispose();\n                }\n            };\n        } else {\n            return target.subscribe(this.evaluatePossiblyAsync, this);\n        }\n    },\n    evaluatePossiblyAsync: function () {\n        var computedObservable = this,\n            throttleEvaluationTimeout = computedObservable['throttleEvaluation'];\n        if (throttleEvaluationTimeout && throttleEvaluationTimeout >= 0) {\n            clearTimeout(this[computedState].evaluationTimeoutInstance);\n            this[computedState].evaluationTimeoutInstance = ko.utils.setTimeout(function () {\n                computedObservable.evaluateImmediate(true /*notifyChange*/);\n            }, throttleEvaluationTimeout);\n        } else if (computedObservable._evalDelayed) {\n            computedObservable._evalDelayed(true /*isChange*/);\n        } else {\n            computedObservable.evaluateImmediate(true /*notifyChange*/);\n        }\n    },\n    evaluateImmediate: function (notifyChange) {\n        var computedObservable = this,\n            state = computedObservable[computedState],\n            disposeWhen = state.disposeWhen,\n            changed = false;\n\n        if (state.isBeingEvaluated) {\n            // If the evaluation of a ko.computed causes side effects, it's possible that it will trigger its own re-evaluation.\n            // This is not desirable (it's hard for a developer to realise a chain of dependencies might cause this, and they almost\n            // certainly didn't intend infinite re-evaluations). So, for predictability, we simply prevent ko.computeds from causing\n            // their own re-evaluation. Further discussion at https://github.com/SteveSanderson/knockout/pull/387\n            return;\n        }\n\n        // Do not evaluate (and possibly capture new dependencies) if disposed\n        if (state.isDisposed) {\n            return;\n        }\n\n        if (state.disposeWhenNodeIsRemoved && !ko.utils.domNodeIsAttachedToDocument(state.disposeWhenNodeIsRemoved) || disposeWhen && disposeWhen()) {\n            // See comment above about suppressDisposalUntilDisposeWhenReturnsFalse\n            if (!state.suppressDisposalUntilDisposeWhenReturnsFalse) {\n                computedObservable.dispose();\n                return;\n            }\n        } else {\n            // It just did return false, so we can stop suppressing now\n            state.suppressDisposalUntilDisposeWhenReturnsFalse = false;\n        }\n\n        state.isBeingEvaluated = true;\n        try {\n            changed = this.evaluateImmediate_CallReadWithDependencyDetection(notifyChange);\n        } finally {\n            state.isBeingEvaluated = false;\n        }\n\n        if (!state.dependenciesCount) {\n            computedObservable.dispose();\n        }\n\n        return changed;\n    },\n    evaluateImmediate_CallReadWithDependencyDetection: function (notifyChange) {\n        // This function is really just part of the evaluateImmediate logic. You would never call it from anywhere else.\n        // Factoring it out into a separate function means it can be independent of the try/catch block in evaluateImmediate,\n        // which contributes to saving about 40% off the CPU overhead of computed evaluation (on V8 at least).\n\n        var computedObservable = this,\n            state = computedObservable[computedState],\n            changed = false;\n\n        // Initially, we assume that none of the subscriptions are still being used (i.e., all are candidates for disposal).\n        // Then, during evaluation, we cross off any that are in fact still being used.\n        var isInitial = state.pure ? undefined : !state.dependenciesCount,   // If we're evaluating when there are no previous dependencies, it must be the first time\n            dependencyDetectionContext = {\n                computedObservable: computedObservable,\n                disposalCandidates: state.dependencyTracking,\n                disposalCount: state.dependenciesCount\n            };\n\n        ko.dependencyDetection.begin({\n            callbackTarget: dependencyDetectionContext,\n            callback: computedBeginDependencyDetectionCallback,\n            computed: computedObservable,\n            isInitial: isInitial\n        });\n\n        state.dependencyTracking = {};\n        state.dependenciesCount = 0;\n\n        var newValue = this.evaluateImmediate_CallReadThenEndDependencyDetection(state, dependencyDetectionContext);\n\n        if (computedObservable.isDifferent(state.latestValue, newValue)) {\n            if (!state.isSleeping) {\n                computedObservable[\"notifySubscribers\"](state.latestValue, \"beforeChange\");\n            }\n\n            state.latestValue = newValue;\n            if (DEBUG) computedObservable._latestValue = newValue;\n\n            if (state.isSleeping) {\n                computedObservable.updateVersion();\n            } else if (notifyChange) {\n                computedObservable[\"notifySubscribers\"](state.latestValue);\n            }\n\n            changed = true;\n        }\n\n        if (isInitial) {\n            computedObservable[\"notifySubscribers\"](state.latestValue, \"awake\");\n        }\n\n        return changed;\n    },\n    evaluateImmediate_CallReadThenEndDependencyDetection: function (state, dependencyDetectionContext) {\n        // This function is really part of the evaluateImmediate_CallReadWithDependencyDetection logic.\n        // You'd never call it from anywhere else. Factoring it out means that evaluateImmediate_CallReadWithDependencyDetection\n        // can be independent of try/finally blocks, which contributes to saving about 40% off the CPU\n        // overhead of computed evaluation (on V8 at least).\n\n        try {\n            var readFunction = state.readFunction;\n            return state.evaluatorFunctionTarget ? readFunction.call(state.evaluatorFunctionTarget) : readFunction();\n        } finally {\n            ko.dependencyDetection.end();\n\n            // For each subscription no longer being used, remove it from the active subscriptions list and dispose it\n            if (dependencyDetectionContext.disposalCount && !state.isSleeping) {\n                ko.utils.objectForEach(dependencyDetectionContext.disposalCandidates, computedDisposeDependencyCallback);\n            }\n\n            state.isStale = state.isDirty = false;\n        }\n    },\n    peek: function (evaluate) {\n        // By default, peek won't re-evaluate, except while the computed is sleeping or to get the initial value when \"deferEvaluation\" is set.\n        // Pass in true to evaluate if needed.\n        var state = this[computedState];\n        if ((state.isDirty && (evaluate || !state.dependenciesCount)) || (state.isSleeping && this.haveDependenciesChanged())) {\n            this.evaluateImmediate();\n        }\n        return state.latestValue;\n    },\n    limit: function (limitFunction) {\n        // Override the limit function with one that delays evaluation as well\n        ko.subscribable['fn'].limit.call(this, limitFunction);\n        this._evalIfChanged = function () {\n            if (this[computedState].isStale) {\n                this.evaluateImmediate();\n            } else {\n                this[computedState].isDirty = false;\n            }\n            return this[computedState].latestValue;\n        };\n        this._evalDelayed = function (isChange) {\n            this._limitBeforeChange(this[computedState].latestValue);\n\n            // Mark as dirty\n            this[computedState].isDirty = true;\n            if (isChange) {\n                this[computedState].isStale = true;\n            }\n\n            // Pass the observable to the \"limit\" code, which will evaluate it when\n            // it's time to do the notification.\n            this._limitChange(this);\n        };\n    },\n    dispose: function () {\n        var state = this[computedState];\n        if (!state.isSleeping && state.dependencyTracking) {\n            ko.utils.objectForEach(state.dependencyTracking, function (id, dependency) {\n                if (dependency.dispose)\n                    dependency.dispose();\n            });\n        }\n        if (state.disposeWhenNodeIsRemoved && state.domNodeDisposalCallback) {\n            ko.utils.domNodeDisposal.removeDisposeCallback(state.disposeWhenNodeIsRemoved, state.domNodeDisposalCallback);\n        }\n        state.dependencyTracking = null;\n        state.dependenciesCount = 0;\n        state.isDisposed = true;\n        state.isStale = false;\n        state.isDirty = false;\n        state.isSleeping = false;\n        state.disposeWhenNodeIsRemoved = null;\n    }\n};\n\nvar pureComputedOverrides = {\n    beforeSubscriptionAdd: function (event) {\n        // If asleep, wake up the computed by subscribing to any dependencies.\n        var computedObservable = this,\n            state = computedObservable[computedState];\n        if (!state.isDisposed && state.isSleeping && event == 'change') {\n            state.isSleeping = false;\n            if (state.isStale || computedObservable.haveDependenciesChanged()) {\n                state.dependencyTracking = null;\n                state.dependenciesCount = 0;\n                if (computedObservable.evaluateImmediate()) {\n                    computedObservable.updateVersion();\n                }\n            } else {\n                // First put the dependencies in order\n                var dependeciesOrder = [];\n                ko.utils.objectForEach(state.dependencyTracking, function (id, dependency) {\n                    dependeciesOrder[dependency._order] = id;\n                });\n                // Next, subscribe to each one\n                ko.utils.arrayForEach(dependeciesOrder, function (id, order) {\n                    var dependency = state.dependencyTracking[id],\n                        subscription = computedObservable.subscribeToDependency(dependency._target);\n                    subscription._order = order;\n                    subscription._version = dependency._version;\n                    state.dependencyTracking[id] = subscription;\n                });\n            }\n            if (!state.isDisposed) {     // test since evaluating could trigger disposal\n                computedObservable[\"notifySubscribers\"](state.latestValue, \"awake\");\n            }\n        }\n    },\n    afterSubscriptionRemove: function (event) {\n        var state = this[computedState];\n        if (!state.isDisposed && event == 'change' && !this.hasSubscriptionsForEvent('change')) {\n            ko.utils.objectForEach(state.dependencyTracking, function (id, dependency) {\n                if (dependency.dispose) {\n                    state.dependencyTracking[id] = {\n                        _target: dependency._target,\n                        _order: dependency._order,\n                        _version: dependency._version\n                    };\n                    dependency.dispose();\n                }\n            });\n            state.isSleeping = true;\n            this[\"notifySubscribers\"](undefined, \"asleep\");\n        }\n    },\n    getVersion: function () {\n        // Because a pure computed is not automatically updated while it is sleeping, we can't\n        // simply return the version number. Instead, we check if any of the dependencies have\n        // changed and conditionally re-evaluate the computed observable.\n        var state = this[computedState];\n        if (state.isSleeping && (state.isStale || this.haveDependenciesChanged())) {\n            this.evaluateImmediate();\n        }\n        return ko.subscribable['fn'].getVersion.call(this);\n    }\n};\n\nvar deferEvaluationOverrides = {\n    beforeSubscriptionAdd: function (event) {\n        // This will force a computed with deferEvaluation to evaluate when the first subscription is registered.\n        if (event == 'change' || event == 'beforeChange') {\n            this.peek();\n        }\n    }\n};\n\n// Note that for browsers that don't support proto assignment, the\n// inheritance chain is created manually in the ko.computed constructor\nif (ko.utils.canSetPrototype) {\n    ko.utils.setPrototypeOf(computedFn, ko.subscribable['fn']);\n}\n\n// Set the proto chain values for ko.hasPrototype\nvar protoProp = ko.observable.protoProperty; // == \"__ko_proto__\"\nko.computed[protoProp] = ko.observable;\ncomputedFn[protoProp] = ko.computed;\n\nko.isComputed = function (instance) {\n    return ko.hasPrototype(instance, ko.computed);\n};\n\nko.isPureComputed = function (instance) {\n    return ko.hasPrototype(instance, ko.computed)\n        && instance[computedState] && instance[computedState].pure;\n};\n\nko.exportSymbol('computed', ko.computed);\nko.exportSymbol('dependentObservable', ko.computed);    // export ko.dependentObservable for backwards compatibility (1.x)\nko.exportSymbol('isComputed', ko.isComputed);\nko.exportSymbol('isPureComputed', ko.isPureComputed);\nko.exportSymbol('computed.fn', computedFn);\nko.exportProperty(computedFn, 'peek', computedFn.peek);\nko.exportProperty(computedFn, 'dispose', computedFn.dispose);\nko.exportProperty(computedFn, 'isActive', computedFn.isActive);\nko.exportProperty(computedFn, 'getDependenciesCount', computedFn.getDependenciesCount);\n\nko.pureComputed = function (evaluatorFunctionOrOptions, evaluatorFunctionTarget) {\n    if (typeof evaluatorFunctionOrOptions === 'function') {\n        return ko.computed(evaluatorFunctionOrOptions, evaluatorFunctionTarget, {'pure':true});\n    } else {\n        evaluatorFunctionOrOptions = ko.utils.extend({}, evaluatorFunctionOrOptions);   // make a copy of the parameter object\n        evaluatorFunctionOrOptions['pure'] = true;\n        return ko.computed(evaluatorFunctionOrOptions, evaluatorFunctionTarget);\n    }\n}\nko.exportSymbol('pureComputed', ko.pureComputed);\n\n(function() {\n    var maxNestedObservableDepth = 10; // Escape the (unlikely) pathalogical case where an observable's current value is itself (or similar reference cycle)\n\n    ko.toJS = function(rootObject) {\n        if (arguments.length == 0)\n            throw new Error(\"When calling ko.toJS, pass the object you want to convert.\");\n\n        // We just unwrap everything at every level in the object graph\n        return mapJsObjectGraph(rootObject, function(valueToMap) {\n            // Loop because an observable's value might in turn be another observable wrapper\n            for (var i = 0; ko.isObservable(valueToMap) && (i < maxNestedObservableDepth); i++)\n                valueToMap = valueToMap();\n            return valueToMap;\n        });\n    };\n\n    ko.toJSON = function(rootObject, replacer, space) {     // replacer and space are optional\n        var plainJavaScriptObject = ko.toJS(rootObject);\n        return ko.utils.stringifyJson(plainJavaScriptObject, replacer, space);\n    };\n\n    function mapJsObjectGraph(rootObject, mapInputCallback, visitedObjects) {\n        visitedObjects = visitedObjects || new objectLookup();\n\n        rootObject = mapInputCallback(rootObject);\n        var canHaveProperties = (typeof rootObject == \"object\") && (rootObject !== null) && (rootObject !== undefined) && (!(rootObject instanceof RegExp)) && (!(rootObject instanceof Date)) && (!(rootObject instanceof String)) && (!(rootObject instanceof Number)) && (!(rootObject instanceof Boolean));\n        if (!canHaveProperties)\n            return rootObject;\n\n        var outputProperties = rootObject instanceof Array ? [] : {};\n        visitedObjects.save(rootObject, outputProperties);\n\n        visitPropertiesOrArrayEntries(rootObject, function(indexer) {\n            var propertyValue = mapInputCallback(rootObject[indexer]);\n\n            switch (typeof propertyValue) {\n                case \"boolean\":\n                case \"number\":\n                case \"string\":\n                case \"function\":\n                    outputProperties[indexer] = propertyValue;\n                    break;\n                case \"object\":\n                case \"undefined\":\n                    var previouslyMappedValue = visitedObjects.get(propertyValue);\n                    outputProperties[indexer] = (previouslyMappedValue !== undefined)\n                        ? previouslyMappedValue\n                        : mapJsObjectGraph(propertyValue, mapInputCallback, visitedObjects);\n                    break;\n            }\n        });\n\n        return outputProperties;\n    }\n\n    function visitPropertiesOrArrayEntries(rootObject, visitorCallback) {\n        if (rootObject instanceof Array) {\n            for (var i = 0; i < rootObject.length; i++)\n                visitorCallback(i);\n\n            // For arrays, also respect toJSON property for custom mappings (fixes #278)\n            if (typeof rootObject['toJSON'] == 'function')\n                visitorCallback('toJSON');\n        } else {\n            for (var propertyName in rootObject) {\n                visitorCallback(propertyName);\n            }\n        }\n    };\n\n    function objectLookup() {\n        this.keys = [];\n        this.values = [];\n    };\n\n    objectLookup.prototype = {\n        constructor: objectLookup,\n        save: function(key, value) {\n            var existingIndex = ko.utils.arrayIndexOf(this.keys, key);\n            if (existingIndex >= 0)\n                this.values[existingIndex] = value;\n            else {\n                this.keys.push(key);\n                this.values.push(value);\n            }\n        },\n        get: function(key) {\n            var existingIndex = ko.utils.arrayIndexOf(this.keys, key);\n            return (existingIndex >= 0) ? this.values[existingIndex] : undefined;\n        }\n    };\n})();\n\nko.exportSymbol('toJS', ko.toJS);\nko.exportSymbol('toJSON', ko.toJSON);\n(function () {\n    var hasDomDataExpandoProperty = '__ko__hasDomDataOptionValue__';\n\n    // Normally, SELECT elements and their OPTIONs can only take value of type 'string' (because the values\n    // are stored on DOM attributes). ko.selectExtensions provides a way for SELECTs/OPTIONs to have values\n    // that are arbitrary objects. This is very convenient when implementing things like cascading dropdowns.\n    ko.selectExtensions = {\n        readValue : function(element) {\n            switch (ko.utils.tagNameLower(element)) {\n                case 'option':\n                    if (element[hasDomDataExpandoProperty] === true)\n                        return ko.utils.domData.get(element, ko.bindingHandlers.options.optionValueDomDataKey);\n                    return ko.utils.ieVersion <= 7\n                        ? (element.getAttributeNode('value') && element.getAttributeNode('value').specified ? element.value : element.text)\n                        : element.value;\n                case 'select':\n                    return element.selectedIndex >= 0 ? ko.selectExtensions.readValue(element.options[element.selectedIndex]) : undefined;\n                default:\n                    return element.value;\n            }\n        },\n\n        writeValue: function(element, value, allowUnset) {\n            switch (ko.utils.tagNameLower(element)) {\n                case 'option':\n                    switch(typeof value) {\n                        case \"string\":\n                            ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, undefined);\n                            if (hasDomDataExpandoProperty in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node\n                                delete element[hasDomDataExpandoProperty];\n                            }\n                            element.value = value;\n                            break;\n                        default:\n                            // Store arbitrary object using DomData\n                            ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, value);\n                            element[hasDomDataExpandoProperty] = true;\n\n                            // Special treatment of numbers is just for backward compatibility. KO 1.2.1 wrote numerical values to element.value.\n                            element.value = typeof value === \"number\" ? value : \"\";\n                            break;\n                    }\n                    break;\n                case 'select':\n                    if (value === \"\" || value === null)       // A blank string or null value will select the caption\n                        value = undefined;\n                    var selection = -1;\n                    for (var i = 0, n = element.options.length, optionValue; i < n; ++i) {\n                        optionValue = ko.selectExtensions.readValue(element.options[i]);\n                        // Include special check to handle selecting a caption with a blank string value\n                        if (optionValue == value || (optionValue == \"\" && value === undefined)) {\n                            selection = i;\n                            break;\n                        }\n                    }\n                    if (allowUnset || selection >= 0 || (value === undefined && element.size > 1)) {\n                        element.selectedIndex = selection;\n                    }\n                    break;\n                default:\n                    if ((value === null) || (value === undefined))\n                        value = \"\";\n                    element.value = value;\n                    break;\n            }\n        }\n    };\n})();\n\nko.exportSymbol('selectExtensions', ko.selectExtensions);\nko.exportSymbol('selectExtensions.readValue', ko.selectExtensions.readValue);\nko.exportSymbol('selectExtensions.writeValue', ko.selectExtensions.writeValue);\nko.expressionRewriting = (function () {\n    var javaScriptReservedWords = [\"true\", \"false\", \"null\", \"undefined\"];\n\n    // Matches something that can be assigned to--either an isolated identifier or something ending with a property accessor\n    // This is designed to be simple and avoid false negatives, but could produce false positives (e.g., a+b.c).\n    // This also will not properly handle nested brackets (e.g., obj1[obj2['prop']]; see #911).\n    var javaScriptAssignmentTarget = /^(?:[$_a-z][$\\w]*|(.+)(\\.\\s*[$_a-z][$\\w]*|\\[.+\\]))$/i;\n\n    function getWriteableValue(expression) {\n        if (ko.utils.arrayIndexOf(javaScriptReservedWords, expression) >= 0)\n            return false;\n        var match = expression.match(javaScriptAssignmentTarget);\n        return match === null ? false : match[1] ? ('Object(' + match[1] + ')' + match[2]) : expression;\n    }\n\n    // The following regular expressions will be used to split an object-literal string into tokens\n\n        // These two match strings, either with double quotes or single quotes\n    var stringDouble = '\"(?:[^\"\\\\\\\\]|\\\\\\\\.)*\"',\n        stringSingle = \"'(?:[^'\\\\\\\\]|\\\\\\\\.)*'\",\n        // Matches a regular expression (text enclosed by slashes), but will also match sets of divisions\n        // as a regular expression (this is handled by the parsing loop below).\n        stringRegexp = '/(?:[^/\\\\\\\\]|\\\\\\\\.)*/\\w*',\n        // These characters have special meaning to the parser and must not appear in the middle of a\n        // token, except as part of a string.\n        specials = ',\"\\'{}()/:[\\\\]',\n        // Match text (at least two characters) that does not contain any of the above special characters,\n        // although some of the special characters are allowed to start it (all but the colon and comma).\n        // The text can contain spaces, but leading or trailing spaces are skipped.\n        everyThingElse = '[^\\\\s:,/][^' + specials + ']*[^\\\\s' + specials + ']',\n        // Match any non-space character not matched already. This will match colons and commas, since they're\n        // not matched by \"everyThingElse\", but will also match any other single character that wasn't already\n        // matched (for example: in \"a: 1, b: 2\", each of the non-space characters will be matched by oneNotSpace).\n        oneNotSpace = '[^\\\\s]',\n\n        // Create the actual regular expression by or-ing the above strings. The order is important.\n        bindingToken = RegExp(stringDouble + '|' + stringSingle + '|' + stringRegexp + '|' + everyThingElse + '|' + oneNotSpace, 'g'),\n\n        // Match end of previous token to determine whether a slash is a division or regex.\n        divisionLookBehind = /[\\])\"'A-Za-z0-9_$]+$/,\n        keywordRegexLookBehind = {'in':1,'return':1,'typeof':1};\n\n    function parseObjectLiteral(objectLiteralString) {\n        // Trim leading and trailing spaces from the string\n        var str = ko.utils.stringTrim(objectLiteralString);\n\n        // Trim braces '{' surrounding the whole object literal\n        if (str.charCodeAt(0) === 123) str = str.slice(1, -1);\n\n        // Split into tokens\n        var result = [], toks = str.match(bindingToken), key, values = [], depth = 0;\n\n        if (toks) {\n            // Append a comma so that we don't need a separate code block to deal with the last item\n            toks.push(',');\n\n            for (var i = 0, tok; tok = toks[i]; ++i) {\n                var c = tok.charCodeAt(0);\n                // A comma signals the end of a key/value pair if depth is zero\n                if (c === 44) { // \",\"\n                    if (depth <= 0) {\n                        result.push((key && values.length) ? {key: key, value: values.join('')} : {'unknown': key || values.join('')});\n                        key = depth = 0;\n                        values = [];\n                        continue;\n                    }\n                // Simply skip the colon that separates the name and value\n                } else if (c === 58) { // \":\"\n                    if (!depth && !key && values.length === 1) {\n                        key = values.pop();\n                        continue;\n                    }\n                // A set of slashes is initially matched as a regular expression, but could be division\n                } else if (c === 47 && i && tok.length > 1) {  // \"/\"\n                    // Look at the end of the previous token to determine if the slash is actually division\n                    var match = toks[i-1].match(divisionLookBehind);\n                    if (match && !keywordRegexLookBehind[match[0]]) {\n                        // The slash is actually a division punctuator; re-parse the remainder of the string (not including the slash)\n                        str = str.substr(str.indexOf(tok) + 1);\n                        toks = str.match(bindingToken);\n                        toks.push(',');\n                        i = -1;\n                        // Continue with just the slash\n                        tok = '/';\n                    }\n                // Increment depth for parentheses, braces, and brackets so that interior commas are ignored\n                } else if (c === 40 || c === 123 || c === 91) { // '(', '{', '['\n                    ++depth;\n                } else if (c === 41 || c === 125 || c === 93) { // ')', '}', ']'\n                    --depth;\n                // The key will be the first token; if it's a string, trim the quotes\n                } else if (!key && !values.length && (c === 34 || c === 39)) { // '\"', \"'\"\n                    tok = tok.slice(1, -1);\n                }\n                values.push(tok);\n            }\n        }\n        return result;\n    }\n\n    // Two-way bindings include a write function that allow the handler to update the value even if it's not an observable.\n    var twoWayBindings = {};\n\n    function preProcessBindings(bindingsStringOrKeyValueArray, bindingOptions) {\n        bindingOptions = bindingOptions || {};\n\n        function processKeyValue(key, val) {\n            var writableVal;\n            function callPreprocessHook(obj) {\n                return (obj && obj['preprocess']) ? (val = obj['preprocess'](val, key, processKeyValue)) : true;\n            }\n            if (!bindingParams) {\n                if (!callPreprocessHook(ko['getBindingHandler'](key)))\n                    return;\n\n                if (twoWayBindings[key] && (writableVal = getWriteableValue(val))) {\n                    // For two-way bindings, provide a write method in case the value\n                    // isn't a writable observable.\n                    propertyAccessorResultStrings.push(\"'\" + key + \"':function(_z){\" + writableVal + \"=_z}\");\n                }\n            }\n            // Values are wrapped in a function so that each value can be accessed independently\n            if (makeValueAccessors) {\n                val = 'function(){return ' + val + ' }';\n            }\n            resultStrings.push(\"'\" + key + \"':\" + val);\n        }\n\n        var resultStrings = [],\n            propertyAccessorResultStrings = [],\n            makeValueAccessors = bindingOptions['valueAccessors'],\n            bindingParams = bindingOptions['bindingParams'],\n            keyValueArray = typeof bindingsStringOrKeyValueArray === \"string\" ?\n                parseObjectLiteral(bindingsStringOrKeyValueArray) : bindingsStringOrKeyValueArray;\n\n        ko.utils.arrayForEach(keyValueArray, function(keyValue) {\n            processKeyValue(keyValue.key || keyValue['unknown'], keyValue.value);\n        });\n\n        if (propertyAccessorResultStrings.length)\n            processKeyValue('_ko_property_writers', \"{\" + propertyAccessorResultStrings.join(\",\") + \" }\");\n\n        return resultStrings.join(\",\");\n    }\n\n    return {\n        bindingRewriteValidators: [],\n\n        twoWayBindings: twoWayBindings,\n\n        parseObjectLiteral: parseObjectLiteral,\n\n        preProcessBindings: preProcessBindings,\n\n        keyValueArrayContainsKey: function(keyValueArray, key) {\n            for (var i = 0; i < keyValueArray.length; i++)\n                if (keyValueArray[i]['key'] == key)\n                    return true;\n            return false;\n        },\n\n        // Internal, private KO utility for updating model properties from within bindings\n        // property:            If the property being updated is (or might be) an observable, pass it here\n        //                      If it turns out to be a writable observable, it will be written to directly\n        // allBindings:         An object with a get method to retrieve bindings in the current execution context.\n        //                      This will be searched for a '_ko_property_writers' property in case you're writing to a non-observable\n        // key:                 The key identifying the property to be written. Example: for { hasFocus: myValue }, write to 'myValue' by specifying the key 'hasFocus'\n        // value:               The value to be written\n        // checkIfDifferent:    If true, and if the property being written is a writable observable, the value will only be written if\n        //                      it is !== existing value on that writable observable\n        writeValueToProperty: function(property, allBindings, key, value, checkIfDifferent) {\n            if (!property || !ko.isObservable(property)) {\n                var propWriters = allBindings.get('_ko_property_writers');\n                if (propWriters && propWriters[key])\n                    propWriters[key](value);\n            } else if (ko.isWriteableObservable(property) && (!checkIfDifferent || property.peek() !== value)) {\n                property(value);\n            }\n        }\n    };\n})();\n\nko.exportSymbol('expressionRewriting', ko.expressionRewriting);\nko.exportSymbol('expressionRewriting.bindingRewriteValidators', ko.expressionRewriting.bindingRewriteValidators);\nko.exportSymbol('expressionRewriting.parseObjectLiteral', ko.expressionRewriting.parseObjectLiteral);\nko.exportSymbol('expressionRewriting.preProcessBindings', ko.expressionRewriting.preProcessBindings);\n\n// Making bindings explicitly declare themselves as \"two way\" isn't ideal in the long term (it would be better if\n// all bindings could use an official 'property writer' API without needing to declare that they might). However,\n// since this is not, and has never been, a public API (_ko_property_writers was never documented), it's acceptable\n// as an internal implementation detail in the short term.\n// For those developers who rely on _ko_property_writers in their custom bindings, we expose _twoWayBindings as an\n// undocumented feature that makes it relatively easy to upgrade to KO 3.0. However, this is still not an official\n// public API, and we reserve the right to remove it at any time if we create a real public property writers API.\nko.exportSymbol('expressionRewriting._twoWayBindings', ko.expressionRewriting.twoWayBindings);\n\n// For backward compatibility, define the following aliases. (Previously, these function names were misleading because\n// they referred to JSON specifically, even though they actually work with arbitrary JavaScript object literal expressions.)\nko.exportSymbol('jsonExpressionRewriting', ko.expressionRewriting);\nko.exportSymbol('jsonExpressionRewriting.insertPropertyAccessorsIntoJson', ko.expressionRewriting.preProcessBindings);\n(function() {\n    // \"Virtual elements\" is an abstraction on top of the usual DOM API which understands the notion that comment nodes\n    // may be used to represent hierarchy (in addition to the DOM's natural hierarchy).\n    // If you call the DOM-manipulating functions on ko.virtualElements, you will be able to read and write the state\n    // of that virtual hierarchy\n    //\n    // The point of all this is to support containerless templates (e.g., <!-- ko foreach:someCollection -->blah<!-- /ko -->)\n    // without having to scatter special cases all over the binding and templating code.\n\n    // IE 9 cannot reliably read the \"nodeValue\" property of a comment node (see https://github.com/SteveSanderson/knockout/issues/186)\n    // but it does give them a nonstandard alternative property called \"text\" that it can read reliably. Other browsers don't have that property.\n    // So, use node.text where available, and node.nodeValue elsewhere\n    var commentNodesHaveTextProperty = document && document.createComment(\"test\").text === \"<!--test-->\";\n\n    var startCommentRegex = commentNodesHaveTextProperty ? /^<!--\\s*ko(?:\\s+([\\s\\S]+))?\\s*-->$/ : /^\\s*ko(?:\\s+([\\s\\S]+))?\\s*$/;\n    var endCommentRegex =   commentNodesHaveTextProperty ? /^<!--\\s*\\/ko\\s*-->$/ : /^\\s*\\/ko\\s*$/;\n    var htmlTagsWithOptionallyClosingChildren = { 'ul': true, 'ol': true };\n\n    function isStartComment(node) {\n        return (node.nodeType == 8) && startCommentRegex.test(commentNodesHaveTextProperty ? node.text : node.nodeValue);\n    }\n\n    function isEndComment(node) {\n        return (node.nodeType == 8) && endCommentRegex.test(commentNodesHaveTextProperty ? node.text : node.nodeValue);\n    }\n\n    function getVirtualChildren(startComment, allowUnbalanced) {\n        var currentNode = startComment;\n        var depth = 1;\n        var children = [];\n        while (currentNode = currentNode.nextSibling) {\n            if (isEndComment(currentNode)) {\n                depth--;\n                if (depth === 0)\n                    return children;\n            }\n\n            children.push(currentNode);\n\n            if (isStartComment(currentNode))\n                depth++;\n        }\n        if (!allowUnbalanced)\n            throw new Error(\"Cannot find closing comment tag to match: \" + startComment.nodeValue);\n        return null;\n    }\n\n    function getMatchingEndComment(startComment, allowUnbalanced) {\n        var allVirtualChildren = getVirtualChildren(startComment, allowUnbalanced);\n        if (allVirtualChildren) {\n            if (allVirtualChildren.length > 0)\n                return allVirtualChildren[allVirtualChildren.length - 1].nextSibling;\n            return startComment.nextSibling;\n        } else\n            return null; // Must have no matching end comment, and allowUnbalanced is true\n    }\n\n    function getUnbalancedChildTags(node) {\n        // e.g., from <div>OK</div><!-- ko blah --><span>Another</span>, returns: <!-- ko blah --><span>Another</span>\n        //       from <div>OK</div><!-- /ko --><!-- /ko -->,             returns: <!-- /ko --><!-- /ko -->\n        var childNode = node.firstChild, captureRemaining = null;\n        if (childNode) {\n            do {\n                if (captureRemaining)                   // We already hit an unbalanced node and are now just scooping up all subsequent nodes\n                    captureRemaining.push(childNode);\n                else if (isStartComment(childNode)) {\n                    var matchingEndComment = getMatchingEndComment(childNode, /* allowUnbalanced: */ true);\n                    if (matchingEndComment)             // It's a balanced tag, so skip immediately to the end of this virtual set\n                        childNode = matchingEndComment;\n                    else\n                        captureRemaining = [childNode]; // It's unbalanced, so start capturing from this point\n                } else if (isEndComment(childNode)) {\n                    captureRemaining = [childNode];     // It's unbalanced (if it wasn't, we'd have skipped over it already), so start capturing\n                }\n            } while (childNode = childNode.nextSibling);\n        }\n        return captureRemaining;\n    }\n\n    ko.virtualElements = {\n        allowedBindings: {},\n\n        childNodes: function(node) {\n            return isStartComment(node) ? getVirtualChildren(node) : node.childNodes;\n        },\n\n        emptyNode: function(node) {\n            if (!isStartComment(node))\n                ko.utils.emptyDomNode(node);\n            else {\n                var virtualChildren = ko.virtualElements.childNodes(node);\n                for (var i = 0, j = virtualChildren.length; i < j; i++)\n                    ko.removeNode(virtualChildren[i]);\n            }\n        },\n\n        setDomNodeChildren: function(node, childNodes) {\n            if (!isStartComment(node))\n                ko.utils.setDomNodeChildren(node, childNodes);\n            else {\n                ko.virtualElements.emptyNode(node);\n                var endCommentNode = node.nextSibling; // Must be the next sibling, as we just emptied the children\n                for (var i = 0, j = childNodes.length; i < j; i++)\n                    endCommentNode.parentNode.insertBefore(childNodes[i], endCommentNode);\n            }\n        },\n\n        prepend: function(containerNode, nodeToPrepend) {\n            if (!isStartComment(containerNode)) {\n                if (containerNode.firstChild)\n                    containerNode.insertBefore(nodeToPrepend, containerNode.firstChild);\n                else\n                    containerNode.appendChild(nodeToPrepend);\n            } else {\n                // Start comments must always have a parent and at least one following sibling (the end comment)\n                containerNode.parentNode.insertBefore(nodeToPrepend, containerNode.nextSibling);\n            }\n        },\n\n        insertAfter: function(containerNode, nodeToInsert, insertAfterNode) {\n            if (!insertAfterNode) {\n                ko.virtualElements.prepend(containerNode, nodeToInsert);\n            } else if (!isStartComment(containerNode)) {\n                // Insert after insertion point\n                if (insertAfterNode.nextSibling)\n                    containerNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling);\n                else\n                    containerNode.appendChild(nodeToInsert);\n            } else {\n                // Children of start comments must always have a parent and at least one following sibling (the end comment)\n                containerNode.parentNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling);\n            }\n        },\n\n        firstChild: function(node) {\n            if (!isStartComment(node))\n                return node.firstChild;\n            if (!node.nextSibling || isEndComment(node.nextSibling))\n                return null;\n            return node.nextSibling;\n        },\n\n        nextSibling: function(node) {\n            if (isStartComment(node))\n                node = getMatchingEndComment(node);\n            if (node.nextSibling && isEndComment(node.nextSibling))\n                return null;\n            return node.nextSibling;\n        },\n\n        hasBindingValue: isStartComment,\n\n        virtualNodeBindingValue: function(node) {\n            var regexMatch = (commentNodesHaveTextProperty ? node.text : node.nodeValue).match(startCommentRegex);\n            return regexMatch ? regexMatch[1] : null;\n        },\n\n        normaliseVirtualElementDomStructure: function(elementVerified) {\n            // Workaround for https://github.com/SteveSanderson/knockout/issues/155\n            // (IE <= 8 or IE 9 quirks mode parses your HTML weirdly, treating closing </li> tags as if they don't exist, thereby moving comment nodes\n            // that are direct descendants of <ul> into the preceding <li>)\n            if (!htmlTagsWithOptionallyClosingChildren[ko.utils.tagNameLower(elementVerified)])\n                return;\n\n            // Scan immediate children to see if they contain unbalanced comment tags. If they do, those comment tags\n            // must be intended to appear *after* that child, so move them there.\n            var childNode = elementVerified.firstChild;\n            if (childNode) {\n                do {\n                    if (childNode.nodeType === 1) {\n                        var unbalancedTags = getUnbalancedChildTags(childNode);\n                        if (unbalancedTags) {\n                            // Fix up the DOM by moving the unbalanced tags to where they most likely were intended to be placed - *after* the child\n                            var nodeToInsertBefore = childNode.nextSibling;\n                            for (var i = 0; i < unbalancedTags.length; i++) {\n                                if (nodeToInsertBefore)\n                                    elementVerified.insertBefore(unbalancedTags[i], nodeToInsertBefore);\n                                else\n                                    elementVerified.appendChild(unbalancedTags[i]);\n                            }\n                        }\n                    }\n                } while (childNode = childNode.nextSibling);\n            }\n        }\n    };\n})();\nko.exportSymbol('virtualElements', ko.virtualElements);\nko.exportSymbol('virtualElements.allowedBindings', ko.virtualElements.allowedBindings);\nko.exportSymbol('virtualElements.emptyNode', ko.virtualElements.emptyNode);\n//ko.exportSymbol('virtualElements.firstChild', ko.virtualElements.firstChild);     // firstChild is not minified\nko.exportSymbol('virtualElements.insertAfter', ko.virtualElements.insertAfter);\n//ko.exportSymbol('virtualElements.nextSibling', ko.virtualElements.nextSibling);   // nextSibling is not minified\nko.exportSymbol('virtualElements.prepend', ko.virtualElements.prepend);\nko.exportSymbol('virtualElements.setDomNodeChildren', ko.virtualElements.setDomNodeChildren);\n(function() {\n    var defaultBindingAttributeName = \"data-bind\";\n\n    ko.bindingProvider = function() {\n        this.bindingCache = {};\n    };\n\n    ko.utils.extend(ko.bindingProvider.prototype, {\n        'nodeHasBindings': function(node) {\n            switch (node.nodeType) {\n                case 1: // Element\n                    return node.getAttribute(defaultBindingAttributeName) != null\n                        || ko.components['getComponentNameForNode'](node);\n                case 8: // Comment node\n                    return ko.virtualElements.hasBindingValue(node);\n                default: return false;\n            }\n        },\n\n        'getBindings': function(node, bindingContext) {\n            var bindingsString = this['getBindingsString'](node, bindingContext),\n                parsedBindings = bindingsString ? this['parseBindingsString'](bindingsString, bindingContext, node) : null;\n            return ko.components.addBindingsForCustomElement(parsedBindings, node, bindingContext, /* valueAccessors */ false);\n        },\n\n        'getBindingAccessors': function(node, bindingContext) {\n            var bindingsString = this['getBindingsString'](node, bindingContext),\n                parsedBindings = bindingsString ? this['parseBindingsString'](bindingsString, bindingContext, node, { 'valueAccessors': true }) : null;\n            return ko.components.addBindingsForCustomElement(parsedBindings, node, bindingContext, /* valueAccessors */ true);\n        },\n\n        // The following function is only used internally by this default provider.\n        // It's not part of the interface definition for a general binding provider.\n        'getBindingsString': function(node, bindingContext) {\n            switch (node.nodeType) {\n                case 1: return node.getAttribute(defaultBindingAttributeName);   // Element\n                case 8: return ko.virtualElements.virtualNodeBindingValue(node); // Comment node\n                default: return null;\n            }\n        },\n\n        // The following function is only used internally by this default provider.\n        // It's not part of the interface definition for a general binding provider.\n        'parseBindingsString': function(bindingsString, bindingContext, node, options) {\n            try {\n                var bindingFunction = createBindingsStringEvaluatorViaCache(bindingsString, this.bindingCache, options);\n                return bindingFunction(bindingContext, node);\n            } catch (ex) {\n                ex.message = \"Unable to parse bindings.\\nBindings value: \" + bindingsString + \"\\nMessage: \" + ex.message;\n                throw ex;\n            }\n        }\n    });\n\n    ko.bindingProvider['instance'] = new ko.bindingProvider();\n\n    function createBindingsStringEvaluatorViaCache(bindingsString, cache, options) {\n        var cacheKey = bindingsString + (options && options['valueAccessors'] || '');\n        return cache[cacheKey]\n            || (cache[cacheKey] = createBindingsStringEvaluator(bindingsString, options));\n    }\n\n    function createBindingsStringEvaluator(bindingsString, options) {\n        // Build the source for a function that evaluates \"expression\"\n        // For each scope variable, add an extra level of \"with\" nesting\n        // Example result: with(sc1) { with(sc0) { return (expression) } }\n        var rewrittenBindings = ko.expressionRewriting.preProcessBindings(bindingsString, options),\n            functionBody = \"with($context){with($data||{}){return{\" + rewrittenBindings + \"}}}\";\n        return new Function(\"$context\", \"$element\", functionBody);\n    }\n})();\n\nko.exportSymbol('bindingProvider', ko.bindingProvider);\n(function () {\n    ko.bindingHandlers = {};\n\n    // The following element types will not be recursed into during binding.\n    var bindingDoesNotRecurseIntoElementTypes = {\n        // Don't want bindings that operate on text nodes to mutate <script> and <textarea> contents,\n        // because it's unexpected and a potential XSS issue.\n        // Also bindings should not operate on <template> elements since this breaks in Internet Explorer\n        // and because such elements' contents are always intended to be bound in a different context\n        // from where they appear in the document.\n        'script': true,\n        'textarea': true,\n        'template': true\n    };\n\n    // Use an overridable method for retrieving binding handlers so that a plugins may support dynamically created handlers\n    ko['getBindingHandler'] = function(bindingKey) {\n        return ko.bindingHandlers[bindingKey];\n    };\n\n    // The ko.bindingContext constructor is only called directly to create the root context. For child\n    // contexts, use bindingContext.createChildContext or bindingContext.extend.\n    ko.bindingContext = function(dataItemOrAccessor, parentContext, dataItemAlias, extendCallback, options) {\n\n        // The binding context object includes static properties for the current, parent, and root view models.\n        // If a view model is actually stored in an observable, the corresponding binding context object, and\n        // any child contexts, must be updated when the view model is changed.\n        function updateContext() {\n            // Most of the time, the context will directly get a view model object, but if a function is given,\n            // we call the function to retrieve the view model. If the function accesses any observables or returns\n            // an observable, the dependency is tracked, and those observables can later cause the binding\n            // context to be updated.\n            var dataItemOrObservable = isFunc ? dataItemOrAccessor() : dataItemOrAccessor,\n                dataItem = ko.utils.unwrapObservable(dataItemOrObservable);\n\n            if (parentContext) {\n                // When a \"parent\" context is given, register a dependency on the parent context. Thus whenever the\n                // parent context is updated, this context will also be updated.\n                if (parentContext._subscribable)\n                    parentContext._subscribable();\n\n                // Copy $root and any custom properties from the parent context\n                ko.utils.extend(self, parentContext);\n\n                // Because the above copy overwrites our own properties, we need to reset them.\n                self._subscribable = subscribable;\n            } else {\n                self['$parents'] = [];\n                self['$root'] = dataItem;\n\n                // Export 'ko' in the binding context so it will be available in bindings and templates\n                // even if 'ko' isn't exported as a global, such as when using an AMD loader.\n                // See https://github.com/SteveSanderson/knockout/issues/490\n                self['ko'] = ko;\n            }\n            self['$rawData'] = dataItemOrObservable;\n            self['$data'] = dataItem;\n            if (dataItemAlias)\n                self[dataItemAlias] = dataItem;\n\n            // The extendCallback function is provided when creating a child context or extending a context.\n            // It handles the specific actions needed to finish setting up the binding context. Actions in this\n            // function could also add dependencies to this binding context.\n            if (extendCallback)\n                extendCallback(self, parentContext, dataItem);\n\n            return self['$data'];\n        }\n        function disposeWhen() {\n            return nodes && !ko.utils.anyDomNodeIsAttachedToDocument(nodes);\n        }\n\n        var self = this,\n            isFunc = typeof(dataItemOrAccessor) == \"function\" && !ko.isObservable(dataItemOrAccessor),\n            nodes,\n            subscribable;\n\n        if (options && options['exportDependencies']) {\n            // The \"exportDependencies\" option means that the calling code will track any dependencies and re-create\n            // the binding context when they change.\n            updateContext();\n        } else {\n            subscribable = ko.dependentObservable(updateContext, null, { disposeWhen: disposeWhen, disposeWhenNodeIsRemoved: true });\n\n            // At this point, the binding context has been initialized, and the \"subscribable\" computed observable is\n            // subscribed to any observables that were accessed in the process. If there is nothing to track, the\n            // computed will be inactive, and we can safely throw it away. If it's active, the computed is stored in\n            // the context object.\n            if (subscribable.isActive()) {\n                self._subscribable = subscribable;\n\n                // Always notify because even if the model ($data) hasn't changed, other context properties might have changed\n                subscribable['equalityComparer'] = null;\n\n                // We need to be able to dispose of this computed observable when it's no longer needed. This would be\n                // easy if we had a single node to watch, but binding contexts can be used by many different nodes, and\n                // we cannot assume that those nodes have any relation to each other. So instead we track any node that\n                // the context is attached to, and dispose the computed when all of those nodes have been cleaned.\n\n                // Add properties to *subscribable* instead of *self* because any properties added to *self* may be overwritten on updates\n                nodes = [];\n                subscribable._addNode = function(node) {\n                    nodes.push(node);\n                    ko.utils.domNodeDisposal.addDisposeCallback(node, function(node) {\n                        ko.utils.arrayRemoveItem(nodes, node);\n                        if (!nodes.length) {\n                            subscribable.dispose();\n                            self._subscribable = subscribable = undefined;\n                        }\n                    });\n                };\n            }\n        }\n    }\n\n    // Extend the binding context hierarchy with a new view model object. If the parent context is watching\n    // any observables, the new child context will automatically get a dependency on the parent context.\n    // But this does not mean that the $data value of the child context will also get updated. If the child\n    // view model also depends on the parent view model, you must provide a function that returns the correct\n    // view model on each update.\n    ko.bindingContext.prototype['createChildContext'] = function (dataItemOrAccessor, dataItemAlias, extendCallback, options) {\n        return new ko.bindingContext(dataItemOrAccessor, this, dataItemAlias, function(self, parentContext) {\n            // Extend the context hierarchy by setting the appropriate pointers\n            self['$parentContext'] = parentContext;\n            self['$parent'] = parentContext['$data'];\n            self['$parents'] = (parentContext['$parents'] || []).slice(0);\n            self['$parents'].unshift(self['$parent']);\n            if (extendCallback)\n                extendCallback(self);\n        }, options);\n    };\n\n    // Extend the binding context with new custom properties. This doesn't change the context hierarchy.\n    // Similarly to \"child\" contexts, provide a function here to make sure that the correct values are set\n    // when an observable view model is updated.\n    ko.bindingContext.prototype['extend'] = function(properties) {\n        // If the parent context references an observable view model, \"_subscribable\" will always be the\n        // latest view model object. If not, \"_subscribable\" isn't set, and we can use the static \"$data\" value.\n        return new ko.bindingContext(this._subscribable || this['$data'], this, null, function(self, parentContext) {\n            // This \"child\" context doesn't directly track a parent observable view model,\n            // so we need to manually set the $rawData value to match the parent.\n            self['$rawData'] = parentContext['$rawData'];\n            ko.utils.extend(self, typeof(properties) == \"function\" ? properties() : properties);\n        });\n    };\n\n    ko.bindingContext.prototype.createStaticChildContext = function (dataItemOrAccessor, dataItemAlias) {\n        return this['createChildContext'](dataItemOrAccessor, dataItemAlias, null, { \"exportDependencies\": true });\n    };\n\n    // Returns the valueAccesor function for a binding value\n    function makeValueAccessor(value) {\n        return function() {\n            return value;\n        };\n    }\n\n    // Returns the value of a valueAccessor function\n    function evaluateValueAccessor(valueAccessor) {\n        return valueAccessor();\n    }\n\n    // Given a function that returns bindings, create and return a new object that contains\n    // binding value-accessors functions. Each accessor function calls the original function\n    // so that it always gets the latest value and all dependencies are captured. This is used\n    // by ko.applyBindingsToNode and getBindingsAndMakeAccessors.\n    function makeAccessorsFromFunction(callback) {\n        return ko.utils.objectMap(ko.dependencyDetection.ignore(callback), function(value, key) {\n            return function() {\n                return callback()[key];\n            };\n        });\n    }\n\n    // Given a bindings function or object, create and return a new object that contains\n    // binding value-accessors functions. This is used by ko.applyBindingsToNode.\n    function makeBindingAccessors(bindings, context, node) {\n        if (typeof bindings === 'function') {\n            return makeAccessorsFromFunction(bindings.bind(null, context, node));\n        } else {\n            return ko.utils.objectMap(bindings, makeValueAccessor);\n        }\n    }\n\n    // This function is used if the binding provider doesn't include a getBindingAccessors function.\n    // It must be called with 'this' set to the provider instance.\n    function getBindingsAndMakeAccessors(node, context) {\n        return makeAccessorsFromFunction(this['getBindings'].bind(this, node, context));\n    }\n\n    function validateThatBindingIsAllowedForVirtualElements(bindingName) {\n        var validator = ko.virtualElements.allowedBindings[bindingName];\n        if (!validator)\n            throw new Error(\"The binding '\" + bindingName + \"' cannot be used with virtual elements\")\n    }\n\n    function applyBindingsToDescendantsInternal (bindingContext, elementOrVirtualElement, bindingContextsMayDifferFromDomParentElement) {\n        var currentChild,\n            nextInQueue = ko.virtualElements.firstChild(elementOrVirtualElement),\n            provider = ko.bindingProvider['instance'],\n            preprocessNode = provider['preprocessNode'];\n\n        // Preprocessing allows a binding provider to mutate a node before bindings are applied to it. For example it's\n        // possible to insert new siblings after it, and/or replace the node with a different one. This can be used to\n        // implement custom binding syntaxes, such as {{ value }} for string interpolation, or custom element types that\n        // trigger insertion of <template> contents at that point in the document.\n        if (preprocessNode) {\n            while (currentChild = nextInQueue) {\n                nextInQueue = ko.virtualElements.nextSibling(currentChild);\n                preprocessNode.call(provider, currentChild);\n            }\n            // Reset nextInQueue for the next loop\n            nextInQueue = ko.virtualElements.firstChild(elementOrVirtualElement);\n        }\n\n        while (currentChild = nextInQueue) {\n            // Keep a record of the next child *before* applying bindings, in case the binding removes the current child from its position\n            nextInQueue = ko.virtualElements.nextSibling(currentChild);\n            applyBindingsToNodeAndDescendantsInternal(bindingContext, currentChild, bindingContextsMayDifferFromDomParentElement);\n        }\n    }\n\n    function applyBindingsToNodeAndDescendantsInternal (bindingContext, nodeVerified, bindingContextMayDifferFromDomParentElement) {\n        var shouldBindDescendants = true;\n\n        // Perf optimisation: Apply bindings only if...\n        // (1) We need to store the binding context on this node (because it may differ from the DOM parent node's binding context)\n        //     Note that we can't store binding contexts on non-elements (e.g., text nodes), as IE doesn't allow expando properties for those\n        // (2) It might have bindings (e.g., it has a data-bind attribute, or it's a marker for a containerless template)\n        var isElement = (nodeVerified.nodeType === 1);\n        if (isElement) // Workaround IE <= 8 HTML parsing weirdness\n            ko.virtualElements.normaliseVirtualElementDomStructure(nodeVerified);\n\n        var shouldApplyBindings = (isElement && bindingContextMayDifferFromDomParentElement)             // Case (1)\n                               || ko.bindingProvider['instance']['nodeHasBindings'](nodeVerified);       // Case (2)\n        if (shouldApplyBindings)\n            shouldBindDescendants = applyBindingsToNodeInternal(nodeVerified, null, bindingContext, bindingContextMayDifferFromDomParentElement)['shouldBindDescendants'];\n\n        if (shouldBindDescendants && !bindingDoesNotRecurseIntoElementTypes[ko.utils.tagNameLower(nodeVerified)]) {\n            // We're recursing automatically into (real or virtual) child nodes without changing binding contexts. So,\n            //  * For children of a *real* element, the binding context is certainly the same as on their DOM .parentNode,\n            //    hence bindingContextsMayDifferFromDomParentElement is false\n            //  * For children of a *virtual* element, we can't be sure. Evaluating .parentNode on those children may\n            //    skip over any number of intermediate virtual elements, any of which might define a custom binding context,\n            //    hence bindingContextsMayDifferFromDomParentElement is true\n            applyBindingsToDescendantsInternal(bindingContext, nodeVerified, /* bindingContextsMayDifferFromDomParentElement: */ !isElement);\n        }\n    }\n\n    var boundElementDomDataKey = ko.utils.domData.nextKey();\n\n\n    function topologicalSortBindings(bindings) {\n        // Depth-first sort\n        var result = [],                // The list of key/handler pairs that we will return\n            bindingsConsidered = {},    // A temporary record of which bindings are already in 'result'\n            cyclicDependencyStack = []; // Keeps track of a depth-search so that, if there's a cycle, we know which bindings caused it\n        ko.utils.objectForEach(bindings, function pushBinding(bindingKey) {\n            if (!bindingsConsidered[bindingKey]) {\n                var binding = ko['getBindingHandler'](bindingKey);\n                if (binding) {\n                    // First add dependencies (if any) of the current binding\n                    if (binding['after']) {\n                        cyclicDependencyStack.push(bindingKey);\n                        ko.utils.arrayForEach(binding['after'], function(bindingDependencyKey) {\n                            if (bindings[bindingDependencyKey]) {\n                                if (ko.utils.arrayIndexOf(cyclicDependencyStack, bindingDependencyKey) !== -1) {\n                                    throw Error(\"Cannot combine the following bindings, because they have a cyclic dependency: \" + cyclicDependencyStack.join(\", \"));\n                                } else {\n                                    pushBinding(bindingDependencyKey);\n                                }\n                            }\n                        });\n                        cyclicDependencyStack.length--;\n                    }\n                    // Next add the current binding\n                    result.push({ key: bindingKey, handler: binding });\n                }\n                bindingsConsidered[bindingKey] = true;\n            }\n        });\n\n        return result;\n    }\n\n    function applyBindingsToNodeInternal(node, sourceBindings, bindingContext, bindingContextMayDifferFromDomParentElement) {\n        // Prevent multiple applyBindings calls for the same node, except when a binding value is specified\n        var alreadyBound = ko.utils.domData.get(node, boundElementDomDataKey);\n        if (!sourceBindings) {\n            if (alreadyBound) {\n                throw Error(\"You cannot apply bindings multiple times to the same element.\");\n            }\n            ko.utils.domData.set(node, boundElementDomDataKey, true);\n        }\n\n        // Optimization: Don't store the binding context on this node if it's definitely the same as on node.parentNode, because\n        // we can easily recover it just by scanning up the node's ancestors in the DOM\n        // (note: here, parent node means \"real DOM parent\" not \"virtual parent\", as there's no O(1) way to find the virtual parent)\n        if (!alreadyBound && bindingContextMayDifferFromDomParentElement)\n            ko.storedBindingContextForNode(node, bindingContext);\n\n        // Use bindings if given, otherwise fall back on asking the bindings provider to give us some bindings\n        var bindings;\n        if (sourceBindings && typeof sourceBindings !== 'function') {\n            bindings = sourceBindings;\n        } else {\n            var provider = ko.bindingProvider['instance'],\n                getBindings = provider['getBindingAccessors'] || getBindingsAndMakeAccessors;\n\n            // Get the binding from the provider within a computed observable so that we can update the bindings whenever\n            // the binding context is updated or if the binding provider accesses observables.\n            var bindingsUpdater = ko.dependentObservable(\n                function() {\n                    bindings = sourceBindings ? sourceBindings(bindingContext, node) : getBindings.call(provider, node, bindingContext);\n                    // Register a dependency on the binding context to support observable view models.\n                    if (bindings && bindingContext._subscribable)\n                        bindingContext._subscribable();\n                    return bindings;\n                },\n                null, { disposeWhenNodeIsRemoved: node }\n            );\n\n            if (!bindings || !bindingsUpdater.isActive())\n                bindingsUpdater = null;\n        }\n\n        var bindingHandlerThatControlsDescendantBindings;\n        if (bindings) {\n            // Return the value accessor for a given binding. When bindings are static (won't be updated because of a binding\n            // context update), just return the value accessor from the binding. Otherwise, return a function that always gets\n            // the latest binding value and registers a dependency on the binding updater.\n            var getValueAccessor = bindingsUpdater\n                ? function(bindingKey) {\n                    return function() {\n                        return evaluateValueAccessor(bindingsUpdater()[bindingKey]);\n                    };\n                } : function(bindingKey) {\n                    return bindings[bindingKey];\n                };\n\n            // Use of allBindings as a function is maintained for backwards compatibility, but its use is deprecated\n            function allBindings() {\n                return ko.utils.objectMap(bindingsUpdater ? bindingsUpdater() : bindings, evaluateValueAccessor);\n            }\n            // The following is the 3.x allBindings API\n            allBindings['get'] = function(key) {\n                return bindings[key] && evaluateValueAccessor(getValueAccessor(key));\n            };\n            allBindings['has'] = function(key) {\n                return key in bindings;\n            };\n\n            // First put the bindings into the right order\n            var orderedBindings = topologicalSortBindings(bindings);\n\n            // Go through the sorted bindings, calling init and update for each\n            ko.utils.arrayForEach(orderedBindings, function(bindingKeyAndHandler) {\n                // Note that topologicalSortBindings has already filtered out any nonexistent binding handlers,\n                // so bindingKeyAndHandler.handler will always be nonnull.\n                var handlerInitFn = bindingKeyAndHandler.handler[\"init\"],\n                    handlerUpdateFn = bindingKeyAndHandler.handler[\"update\"],\n                    bindingKey = bindingKeyAndHandler.key;\n\n                if (node.nodeType === 8) {\n                    validateThatBindingIsAllowedForVirtualElements(bindingKey);\n                }\n\n                try {\n                    // Run init, ignoring any dependencies\n                    if (typeof handlerInitFn == \"function\") {\n                        ko.dependencyDetection.ignore(function() {\n                            var initResult = handlerInitFn(node, getValueAccessor(bindingKey), allBindings, bindingContext['$data'], bindingContext);\n\n                            // If this binding handler claims to control descendant bindings, make a note of this\n                            if (initResult && initResult['controlsDescendantBindings']) {\n                                if (bindingHandlerThatControlsDescendantBindings !== undefined)\n                                    throw new Error(\"Multiple bindings (\" + bindingHandlerThatControlsDescendantBindings + \" and \" + bindingKey + \") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.\");\n                                bindingHandlerThatControlsDescendantBindings = bindingKey;\n                            }\n                        });\n                    }\n\n                    // Run update in its own computed wrapper\n                    if (typeof handlerUpdateFn == \"function\") {\n                        ko.dependentObservable(\n                            function() {\n                                handlerUpdateFn(node, getValueAccessor(bindingKey), allBindings, bindingContext['$data'], bindingContext);\n                            },\n                            null,\n                            { disposeWhenNodeIsRemoved: node }\n                        );\n                    }\n                } catch (ex) {\n                    ex.message = \"Unable to process binding \\\"\" + bindingKey + \": \" + bindings[bindingKey] + \"\\\"\\nMessage: \" + ex.message;\n                    throw ex;\n                }\n            });\n        }\n\n        return {\n            'shouldBindDescendants': bindingHandlerThatControlsDescendantBindings === undefined\n        };\n    };\n\n    var storedBindingContextDomDataKey = ko.utils.domData.nextKey();\n    ko.storedBindingContextForNode = function (node, bindingContext) {\n        if (arguments.length == 2) {\n            ko.utils.domData.set(node, storedBindingContextDomDataKey, bindingContext);\n            if (bindingContext._subscribable)\n                bindingContext._subscribable._addNode(node);\n        } else {\n            return ko.utils.domData.get(node, storedBindingContextDomDataKey);\n        }\n    }\n\n    function getBindingContext(viewModelOrBindingContext) {\n        return viewModelOrBindingContext && (viewModelOrBindingContext instanceof ko.bindingContext)\n            ? viewModelOrBindingContext\n            : new ko.bindingContext(viewModelOrBindingContext);\n    }\n\n    ko.applyBindingAccessorsToNode = function (node, bindings, viewModelOrBindingContext) {\n        if (node.nodeType === 1) // If it's an element, workaround IE <= 8 HTML parsing weirdness\n            ko.virtualElements.normaliseVirtualElementDomStructure(node);\n        return applyBindingsToNodeInternal(node, bindings, getBindingContext(viewModelOrBindingContext), true);\n    };\n\n    ko.applyBindingsToNode = function (node, bindings, viewModelOrBindingContext) {\n        var context = getBindingContext(viewModelOrBindingContext);\n        return ko.applyBindingAccessorsToNode(node, makeBindingAccessors(bindings, context, node), context);\n    };\n\n    ko.applyBindingsToDescendants = function(viewModelOrBindingContext, rootNode) {\n        if (rootNode.nodeType === 1 || rootNode.nodeType === 8)\n            applyBindingsToDescendantsInternal(getBindingContext(viewModelOrBindingContext), rootNode, true);\n    };\n\n    ko.applyBindings = function (viewModelOrBindingContext, rootNode) {\n        // If jQuery is loaded after Knockout, we won't initially have access to it. So save it here.\n        if (!jQueryInstance && window['jQuery']) {\n            jQueryInstance = window['jQuery'];\n        }\n\n        if (rootNode && (rootNode.nodeType !== 1) && (rootNode.nodeType !== 8))\n            throw new Error(\"ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node\");\n        rootNode = rootNode || window.document.body; // Make \"rootNode\" parameter optional\n\n        applyBindingsToNodeAndDescendantsInternal(getBindingContext(viewModelOrBindingContext), rootNode, true);\n    };\n\n    // Retrieving binding context from arbitrary nodes\n    ko.contextFor = function(node) {\n        // We can only do something meaningful for elements and comment nodes (in particular, not text nodes, as IE can't store domdata for them)\n        switch (node.nodeType) {\n            case 1:\n            case 8:\n                var context = ko.storedBindingContextForNode(node);\n                if (context) return context;\n                if (node.parentNode) return ko.contextFor(node.parentNode);\n                break;\n        }\n        return undefined;\n    };\n    ko.dataFor = function(node) {\n        var context = ko.contextFor(node);\n        return context ? context['$data'] : undefined;\n    };\n\n    ko.exportSymbol('bindingHandlers', ko.bindingHandlers);\n    ko.exportSymbol('applyBindings', ko.applyBindings);\n    ko.exportSymbol('applyBindingsToDescendants', ko.applyBindingsToDescendants);\n    ko.exportSymbol('applyBindingAccessorsToNode', ko.applyBindingAccessorsToNode);\n    ko.exportSymbol('applyBindingsToNode', ko.applyBindingsToNode);\n    ko.exportSymbol('contextFor', ko.contextFor);\n    ko.exportSymbol('dataFor', ko.dataFor);\n})();\n(function(undefined) {\n    var loadingSubscribablesCache = {}, // Tracks component loads that are currently in flight\n        loadedDefinitionsCache = {};    // Tracks component loads that have already completed\n\n    ko.components = {\n        get: function(componentName, callback) {\n            var cachedDefinition = getObjectOwnProperty(loadedDefinitionsCache, componentName);\n            if (cachedDefinition) {\n                // It's already loaded and cached. Reuse the same definition object.\n                // Note that for API consistency, even cache hits complete asynchronously by default.\n                // You can bypass this by putting synchronous:true on your component config.\n                if (cachedDefinition.isSynchronousComponent) {\n                    ko.dependencyDetection.ignore(function() { // See comment in loaderRegistryBehaviors.js for reasoning\n                        callback(cachedDefinition.definition);\n                    });\n                } else {\n                    ko.tasks.schedule(function() { callback(cachedDefinition.definition); });\n                }\n            } else {\n                // Join the loading process that is already underway, or start a new one.\n                loadComponentAndNotify(componentName, callback);\n            }\n        },\n\n        clearCachedDefinition: function(componentName) {\n            delete loadedDefinitionsCache[componentName];\n        },\n\n        _getFirstResultFromLoaders: getFirstResultFromLoaders\n    };\n\n    function getObjectOwnProperty(obj, propName) {\n        return obj.hasOwnProperty(propName) ? obj[propName] : undefined;\n    }\n\n    function loadComponentAndNotify(componentName, callback) {\n        var subscribable = getObjectOwnProperty(loadingSubscribablesCache, componentName),\n            completedAsync;\n        if (!subscribable) {\n            // It's not started loading yet. Start loading, and when it's done, move it to loadedDefinitionsCache.\n            subscribable = loadingSubscribablesCache[componentName] = new ko.subscribable();\n            subscribable.subscribe(callback);\n\n            beginLoadingComponent(componentName, function(definition, config) {\n                var isSynchronousComponent = !!(config && config['synchronous']);\n                loadedDefinitionsCache[componentName] = { definition: definition, isSynchronousComponent: isSynchronousComponent };\n                delete loadingSubscribablesCache[componentName];\n\n                // For API consistency, all loads complete asynchronously. However we want to avoid\n                // adding an extra task schedule if it's unnecessary (i.e., the completion is already\n                // async).\n                //\n                // You can bypass the 'always asynchronous' feature by putting the synchronous:true\n                // flag on your component configuration when you register it.\n                if (completedAsync || isSynchronousComponent) {\n                    // Note that notifySubscribers ignores any dependencies read within the callback.\n                    // See comment in loaderRegistryBehaviors.js for reasoning\n                    subscribable['notifySubscribers'](definition);\n                } else {\n                    ko.tasks.schedule(function() {\n                        subscribable['notifySubscribers'](definition);\n                    });\n                }\n            });\n            completedAsync = true;\n        } else {\n            subscribable.subscribe(callback);\n        }\n    }\n\n    function beginLoadingComponent(componentName, callback) {\n        getFirstResultFromLoaders('getConfig', [componentName], function(config) {\n            if (config) {\n                // We have a config, so now load its definition\n                getFirstResultFromLoaders('loadComponent', [componentName, config], function(definition) {\n                    callback(definition, config);\n                });\n            } else {\n                // The component has no config - it's unknown to all the loaders.\n                // Note that this is not an error (e.g., a module loading error) - that would abort the\n                // process and this callback would not run. For this callback to run, all loaders must\n                // have confirmed they don't know about this component.\n                callback(null, null);\n            }\n        });\n    }\n\n    function getFirstResultFromLoaders(methodName, argsExceptCallback, callback, candidateLoaders) {\n        // On the first call in the stack, start with the full set of loaders\n        if (!candidateLoaders) {\n            candidateLoaders = ko.components['loaders'].slice(0); // Use a copy, because we'll be mutating this array\n        }\n\n        // Try the next candidate\n        var currentCandidateLoader = candidateLoaders.shift();\n        if (currentCandidateLoader) {\n            var methodInstance = currentCandidateLoader[methodName];\n            if (methodInstance) {\n                var wasAborted = false,\n                    synchronousReturnValue = methodInstance.apply(currentCandidateLoader, argsExceptCallback.concat(function(result) {\n                        if (wasAborted) {\n                            callback(null);\n                        } else if (result !== null) {\n                            // This candidate returned a value. Use it.\n                            callback(result);\n                        } else {\n                            // Try the next candidate\n                            getFirstResultFromLoaders(methodName, argsExceptCallback, callback, candidateLoaders);\n                        }\n                    }));\n\n                // Currently, loaders may not return anything synchronously. This leaves open the possibility\n                // that we'll extend the API to support synchronous return values in the future. It won't be\n                // a breaking change, because currently no loader is allowed to return anything except undefined.\n                if (synchronousReturnValue !== undefined) {\n                    wasAborted = true;\n\n                    // Method to suppress exceptions will remain undocumented. This is only to keep\n                    // KO's specs running tidily, since we can observe the loading got aborted without\n                    // having exceptions cluttering up the console too.\n                    if (!currentCandidateLoader['suppressLoaderExceptions']) {\n                        throw new Error('Component loaders must supply values by invoking the callback, not by returning values synchronously.');\n                    }\n                }\n            } else {\n                // This candidate doesn't have the relevant handler. Synchronously move on to the next one.\n                getFirstResultFromLoaders(methodName, argsExceptCallback, callback, candidateLoaders);\n            }\n        } else {\n            // No candidates returned a value\n            callback(null);\n        }\n    }\n\n    // Reference the loaders via string name so it's possible for developers\n    // to replace the whole array by assigning to ko.components.loaders\n    ko.components['loaders'] = [];\n\n    ko.exportSymbol('components', ko.components);\n    ko.exportSymbol('components.get', ko.components.get);\n    ko.exportSymbol('components.clearCachedDefinition', ko.components.clearCachedDefinition);\n})();\n(function(undefined) {\n\n    // The default loader is responsible for two things:\n    // 1. Maintaining the default in-memory registry of component configuration objects\n    //    (i.e., the thing you're writing to when you call ko.components.register(someName, ...))\n    // 2. Answering requests for components by fetching configuration objects\n    //    from that default in-memory registry and resolving them into standard\n    //    component definition objects (of the form { createViewModel: ..., template: ... })\n    // Custom loaders may override either of these facilities, i.e.,\n    // 1. To supply configuration objects from some other source (e.g., conventions)\n    // 2. Or, to resolve configuration objects by loading viewmodels/templates via arbitrary logic.\n\n    var defaultConfigRegistry = {};\n\n    ko.components.register = function(componentName, config) {\n        if (!config) {\n            throw new Error('Invalid configuration for ' + componentName);\n        }\n\n        if (ko.components.isRegistered(componentName)) {\n            throw new Error('Component ' + componentName + ' is already registered');\n        }\n\n        defaultConfigRegistry[componentName] = config;\n    };\n\n    ko.components.isRegistered = function(componentName) {\n        return defaultConfigRegistry.hasOwnProperty(componentName);\n    };\n\n    ko.components.unregister = function(componentName) {\n        delete defaultConfigRegistry[componentName];\n        ko.components.clearCachedDefinition(componentName);\n    };\n\n    ko.components.defaultLoader = {\n        'getConfig': function(componentName, callback) {\n            var result = defaultConfigRegistry.hasOwnProperty(componentName)\n                ? defaultConfigRegistry[componentName]\n                : null;\n            callback(result);\n        },\n\n        'loadComponent': function(componentName, config, callback) {\n            var errorCallback = makeErrorCallback(componentName);\n            possiblyGetConfigFromAmd(errorCallback, config, function(loadedConfig) {\n                resolveConfig(componentName, errorCallback, loadedConfig, callback);\n            });\n        },\n\n        'loadTemplate': function(componentName, templateConfig, callback) {\n            resolveTemplate(makeErrorCallback(componentName), templateConfig, callback);\n        },\n\n        'loadViewModel': function(componentName, viewModelConfig, callback) {\n            resolveViewModel(makeErrorCallback(componentName), viewModelConfig, callback);\n        }\n    };\n\n    var createViewModelKey = 'createViewModel';\n\n    // Takes a config object of the form { template: ..., viewModel: ... }, and asynchronously convert it\n    // into the standard component definition format:\n    //    { template: <ArrayOfDomNodes>, createViewModel: function(params, componentInfo) { ... } }.\n    // Since both template and viewModel may need to be resolved asynchronously, both tasks are performed\n    // in parallel, and the results joined when both are ready. We don't depend on any promises infrastructure,\n    // so this is implemented manually below.\n    function resolveConfig(componentName, errorCallback, config, callback) {\n        var result = {},\n            makeCallBackWhenZero = 2,\n            tryIssueCallback = function() {\n                if (--makeCallBackWhenZero === 0) {\n                    callback(result);\n                }\n            },\n            templateConfig = config['template'],\n            viewModelConfig = config['viewModel'];\n\n        if (templateConfig) {\n            possiblyGetConfigFromAmd(errorCallback, templateConfig, function(loadedConfig) {\n                ko.components._getFirstResultFromLoaders('loadTemplate', [componentName, loadedConfig], function(resolvedTemplate) {\n                    result['template'] = resolvedTemplate;\n                    tryIssueCallback();\n                });\n            });\n        } else {\n            tryIssueCallback();\n        }\n\n        if (viewModelConfig) {\n            possiblyGetConfigFromAmd(errorCallback, viewModelConfig, function(loadedConfig) {\n                ko.components._getFirstResultFromLoaders('loadViewModel', [componentName, loadedConfig], function(resolvedViewModel) {\n                    result[createViewModelKey] = resolvedViewModel;\n                    tryIssueCallback();\n                });\n            });\n        } else {\n            tryIssueCallback();\n        }\n    }\n\n    function resolveTemplate(errorCallback, templateConfig, callback) {\n        if (typeof templateConfig === 'string') {\n            // Markup - parse it\n            callback(ko.utils.parseHtmlFragment(templateConfig));\n        } else if (templateConfig instanceof Array) {\n            // Assume already an array of DOM nodes - pass through unchanged\n            callback(templateConfig);\n        } else if (isDocumentFragment(templateConfig)) {\n            // Document fragment - use its child nodes\n            callback(ko.utils.makeArray(templateConfig.childNodes));\n        } else if (templateConfig['element']) {\n            var element = templateConfig['element'];\n            if (isDomElement(element)) {\n                // Element instance - copy its child nodes\n                callback(cloneNodesFromTemplateSourceElement(element));\n            } else if (typeof element === 'string') {\n                // Element ID - find it, then copy its child nodes\n                var elemInstance = document.getElementById(element);\n                if (elemInstance) {\n                    callback(cloneNodesFromTemplateSourceElement(elemInstance));\n                } else {\n                    errorCallback('Cannot find element with ID ' + element);\n                }\n            } else {\n                errorCallback('Unknown element type: ' + element);\n            }\n        } else {\n            errorCallback('Unknown template value: ' + templateConfig);\n        }\n    }\n\n    function resolveViewModel(errorCallback, viewModelConfig, callback) {\n        if (typeof viewModelConfig === 'function') {\n            // Constructor - convert to standard factory function format\n            // By design, this does *not* supply componentInfo to the constructor, as the intent is that\n            // componentInfo contains non-viewmodel data (e.g., the component's element) that should only\n            // be used in factory functions, not viewmodel constructors.\n            callback(function (params /*, componentInfo */) {\n                return new viewModelConfig(params);\n            });\n        } else if (typeof viewModelConfig[createViewModelKey] === 'function') {\n            // Already a factory function - use it as-is\n            callback(viewModelConfig[createViewModelKey]);\n        } else if ('instance' in viewModelConfig) {\n            // Fixed object instance - promote to createViewModel format for API consistency\n            var fixedInstance = viewModelConfig['instance'];\n            callback(function (params, componentInfo) {\n                return fixedInstance;\n            });\n        } else if ('viewModel' in viewModelConfig) {\n            // Resolved AMD module whose value is of the form { viewModel: ... }\n            resolveViewModel(errorCallback, viewModelConfig['viewModel'], callback);\n        } else {\n            errorCallback('Unknown viewModel value: ' + viewModelConfig);\n        }\n    }\n\n    function cloneNodesFromTemplateSourceElement(elemInstance) {\n        switch (ko.utils.tagNameLower(elemInstance)) {\n            case 'script':\n                return ko.utils.parseHtmlFragment(elemInstance.text);\n            case 'textarea':\n                return ko.utils.parseHtmlFragment(elemInstance.value);\n            case 'template':\n                // For browsers with proper <template> element support (i.e., where the .content property\n                // gives a document fragment), use that document fragment.\n                if (isDocumentFragment(elemInstance.content)) {\n                    return ko.utils.cloneNodes(elemInstance.content.childNodes);\n                }\n        }\n\n        // Regular elements such as <div>, and <template> elements on old browsers that don't really\n        // understand <template> and just treat it as a regular container\n        return ko.utils.cloneNodes(elemInstance.childNodes);\n    }\n\n    function isDomElement(obj) {\n        if (window['HTMLElement']) {\n            return obj instanceof HTMLElement;\n        } else {\n            return obj && obj.tagName && obj.nodeType === 1;\n        }\n    }\n\n    function isDocumentFragment(obj) {\n        if (window['DocumentFragment']) {\n            return obj instanceof DocumentFragment;\n        } else {\n            return obj && obj.nodeType === 11;\n        }\n    }\n\n    function possiblyGetConfigFromAmd(errorCallback, config, callback) {\n        if (typeof config['require'] === 'string') {\n            // The config is the value of an AMD module\n            if (amdRequire || window['require']) {\n                (amdRequire || window['require'])([config['require']], callback);\n            } else {\n                errorCallback('Uses require, but no AMD loader is present');\n            }\n        } else {\n            callback(config);\n        }\n    }\n\n    function makeErrorCallback(componentName) {\n        return function (message) {\n            throw new Error('Component \\'' + componentName + '\\': ' + message);\n        };\n    }\n\n    ko.exportSymbol('components.register', ko.components.register);\n    ko.exportSymbol('components.isRegistered', ko.components.isRegistered);\n    ko.exportSymbol('components.unregister', ko.components.unregister);\n\n    // Expose the default loader so that developers can directly ask it for configuration\n    // or to resolve configuration\n    ko.exportSymbol('components.defaultLoader', ko.components.defaultLoader);\n\n    // By default, the default loader is the only registered component loader\n    ko.components['loaders'].push(ko.components.defaultLoader);\n\n    // Privately expose the underlying config registry for use in old-IE shim\n    ko.components._allRegisteredComponents = defaultConfigRegistry;\n})();\n(function (undefined) {\n    // Overridable API for determining which component name applies to a given node. By overriding this,\n    // you can for example map specific tagNames to components that are not preregistered.\n    ko.components['getComponentNameForNode'] = function(node) {\n        var tagNameLower = ko.utils.tagNameLower(node);\n        if (ko.components.isRegistered(tagNameLower)) {\n            // Try to determine that this node can be considered a *custom* element; see https://github.com/knockout/knockout/issues/1603\n            if (tagNameLower.indexOf('-') != -1 || ('' + node) == \"[object HTMLUnknownElement]\" || (ko.utils.ieVersion <= 8 && node.tagName === tagNameLower)) {\n                return tagNameLower;\n            }\n        }\n    };\n\n    ko.components.addBindingsForCustomElement = function(allBindings, node, bindingContext, valueAccessors) {\n        // Determine if it's really a custom element matching a component\n        if (node.nodeType === 1) {\n            var componentName = ko.components['getComponentNameForNode'](node);\n            if (componentName) {\n                // It does represent a component, so add a component binding for it\n                allBindings = allBindings || {};\n\n                if (allBindings['component']) {\n                    // Avoid silently overwriting some other 'component' binding that may already be on the element\n                    throw new Error('Cannot use the \"component\" binding on a custom element matching a component');\n                }\n\n                var componentBindingValue = { 'name': componentName, 'params': getComponentParamsFromCustomElement(node, bindingContext) };\n\n                allBindings['component'] = valueAccessors\n                    ? function() { return componentBindingValue; }\n                    : componentBindingValue;\n            }\n        }\n\n        return allBindings;\n    }\n\n    var nativeBindingProviderInstance = new ko.bindingProvider();\n\n    function getComponentParamsFromCustomElement(elem, bindingContext) {\n        var paramsAttribute = elem.getAttribute('params');\n\n        if (paramsAttribute) {\n            var params = nativeBindingProviderInstance['parseBindingsString'](paramsAttribute, bindingContext, elem, { 'valueAccessors': true, 'bindingParams': true }),\n                rawParamComputedValues = ko.utils.objectMap(params, function(paramValue, paramName) {\n                    return ko.computed(paramValue, null, { disposeWhenNodeIsRemoved: elem });\n                }),\n                result = ko.utils.objectMap(rawParamComputedValues, function(paramValueComputed, paramName) {\n                    var paramValue = paramValueComputed.peek();\n                    // Does the evaluation of the parameter value unwrap any observables?\n                    if (!paramValueComputed.isActive()) {\n                        // No it doesn't, so there's no need for any computed wrapper. Just pass through the supplied value directly.\n                        // Example: \"someVal: firstName, age: 123\" (whether or not firstName is an observable/computed)\n                        return paramValue;\n                    } else {\n                        // Yes it does. Supply a computed property that unwraps both the outer (binding expression)\n                        // level of observability, and any inner (resulting model value) level of observability.\n                        // This means the component doesn't have to worry about multiple unwrapping. If the value is a\n                        // writable observable, the computed will also be writable and pass the value on to the observable.\n                        return ko.computed({\n                            'read': function() {\n                                return ko.utils.unwrapObservable(paramValueComputed());\n                            },\n                            'write': ko.isWriteableObservable(paramValue) && function(value) {\n                                paramValueComputed()(value);\n                            },\n                            disposeWhenNodeIsRemoved: elem\n                        });\n                    }\n                });\n\n            // Give access to the raw computeds, as long as that wouldn't overwrite any custom param also called '$raw'\n            // This is in case the developer wants to react to outer (binding) observability separately from inner\n            // (model value) observability, or in case the model value observable has subobservables.\n            if (!result.hasOwnProperty('$raw')) {\n                result['$raw'] = rawParamComputedValues;\n            }\n\n            return result;\n        } else {\n            // For consistency, absence of a \"params\" attribute is treated the same as the presence of\n            // any empty one. Otherwise component viewmodels need special code to check whether or not\n            // 'params' or 'params.$raw' is null/undefined before reading subproperties, which is annoying.\n            return { '$raw': {} };\n        }\n    }\n\n    // --------------------------------------------------------------------------------\n    // Compatibility code for older (pre-HTML5) IE browsers\n\n    if (ko.utils.ieVersion < 9) {\n        // Whenever you preregister a component, enable it as a custom element in the current document\n        ko.components['register'] = (function(originalFunction) {\n            return function(componentName) {\n                document.createElement(componentName); // Allows IE<9 to parse markup containing the custom element\n                return originalFunction.apply(this, arguments);\n            }\n        })(ko.components['register']);\n\n        // Whenever you create a document fragment, enable all preregistered component names as custom elements\n        // This is needed to make innerShiv/jQuery HTML parsing correctly handle the custom elements\n        document.createDocumentFragment = (function(originalFunction) {\n            return function() {\n                var newDocFrag = originalFunction(),\n                    allComponents = ko.components._allRegisteredComponents;\n                for (var componentName in allComponents) {\n                    if (allComponents.hasOwnProperty(componentName)) {\n                        newDocFrag.createElement(componentName);\n                    }\n                }\n                return newDocFrag;\n            };\n        })(document.createDocumentFragment);\n    }\n})();(function(undefined) {\n\n    var componentLoadingOperationUniqueId = 0;\n\n    ko.bindingHandlers['component'] = {\n        'init': function(element, valueAccessor, ignored1, ignored2, bindingContext) {\n            var currentViewModel,\n                currentLoadingOperationId,\n                disposeAssociatedComponentViewModel = function () {\n                    var currentViewModelDispose = currentViewModel && currentViewModel['dispose'];\n                    if (typeof currentViewModelDispose === 'function') {\n                        currentViewModelDispose.call(currentViewModel);\n                    }\n                    currentViewModel = null;\n                    // Any in-flight loading operation is no longer relevant, so make sure we ignore its completion\n                    currentLoadingOperationId = null;\n                },\n                originalChildNodes = ko.utils.makeArray(ko.virtualElements.childNodes(element));\n\n            ko.utils.domNodeDisposal.addDisposeCallback(element, disposeAssociatedComponentViewModel);\n\n            ko.computed(function () {\n                var value = ko.utils.unwrapObservable(valueAccessor()),\n                    componentName, componentParams;\n\n                if (typeof value === 'string') {\n                    componentName = value;\n                } else {\n                    componentName = ko.utils.unwrapObservable(value['name']);\n                    componentParams = ko.utils.unwrapObservable(value['params']);\n                }\n\n                if (!componentName) {\n                    throw new Error('No component name specified');\n                }\n\n                var loadingOperationId = currentLoadingOperationId = ++componentLoadingOperationUniqueId;\n                ko.components.get(componentName, function(componentDefinition) {\n                    // If this is not the current load operation for this element, ignore it.\n                    if (currentLoadingOperationId !== loadingOperationId) {\n                        return;\n                    }\n\n                    // Clean up previous state\n                    disposeAssociatedComponentViewModel();\n\n                    // Instantiate and bind new component. Implicitly this cleans any old DOM nodes.\n                    if (!componentDefinition) {\n                        throw new Error('Unknown component \\'' + componentName + '\\'');\n                    }\n                    cloneTemplateIntoElement(componentName, componentDefinition, element);\n                    var componentViewModel = createViewModel(componentDefinition, element, originalChildNodes, componentParams),\n                        childBindingContext = bindingContext['createChildContext'](componentViewModel, /* dataItemAlias */ undefined, function(ctx) {\n                            ctx['$component'] = componentViewModel;\n                            ctx['$componentTemplateNodes'] = originalChildNodes;\n                        });\n                    currentViewModel = componentViewModel;\n                    ko.applyBindingsToDescendants(childBindingContext, element);\n                });\n            }, null, { disposeWhenNodeIsRemoved: element });\n\n            return { 'controlsDescendantBindings': true };\n        }\n    };\n\n    ko.virtualElements.allowedBindings['component'] = true;\n\n    function cloneTemplateIntoElement(componentName, componentDefinition, element) {\n        var template = componentDefinition['template'];\n        if (!template) {\n            throw new Error('Component \\'' + componentName + '\\' has no template');\n        }\n\n        var clonedNodesArray = ko.utils.cloneNodes(template);\n        ko.virtualElements.setDomNodeChildren(element, clonedNodesArray);\n    }\n\n    function createViewModel(componentDefinition, element, originalChildNodes, componentParams) {\n        var componentViewModelFactory = componentDefinition['createViewModel'];\n        return componentViewModelFactory\n            ? componentViewModelFactory.call(componentDefinition, componentParams, { 'element': element, 'templateNodes': originalChildNodes })\n            : componentParams; // Template-only component\n    }\n\n})();\nvar attrHtmlToJavascriptMap = { 'class': 'className', 'for': 'htmlFor' };\nko.bindingHandlers['attr'] = {\n    'update': function(element, valueAccessor, allBindings) {\n        var value = ko.utils.unwrapObservable(valueAccessor()) || {};\n        ko.utils.objectForEach(value, function(attrName, attrValue) {\n            attrValue = ko.utils.unwrapObservable(attrValue);\n\n            // To cover cases like \"attr: { checked:someProp }\", we want to remove the attribute entirely\n            // when someProp is a \"no value\"-like value (strictly null, false, or undefined)\n            // (because the absence of the \"checked\" attr is how to mark an element as not checked, etc.)\n            var toRemove = (attrValue === false) || (attrValue === null) || (attrValue === undefined);\n            if (toRemove)\n                element.removeAttribute(attrName);\n\n            // In IE <= 7 and IE8 Quirks Mode, you have to use the Javascript property name instead of the\n            // HTML attribute name for certain attributes. IE8 Standards Mode supports the correct behavior,\n            // but instead of figuring out the mode, we'll just set the attribute through the Javascript\n            // property for IE <= 8.\n            if (ko.utils.ieVersion <= 8 && attrName in attrHtmlToJavascriptMap) {\n                attrName = attrHtmlToJavascriptMap[attrName];\n                if (toRemove)\n                    element.removeAttribute(attrName);\n                else\n                    element[attrName] = attrValue;\n            } else if (!toRemove) {\n                element.setAttribute(attrName, attrValue.toString());\n            }\n\n            // Treat \"name\" specially - although you can think of it as an attribute, it also needs\n            // special handling on older versions of IE (https://github.com/SteveSanderson/knockout/pull/333)\n            // Deliberately being case-sensitive here because XHTML would regard \"Name\" as a different thing\n            // entirely, and there's no strong reason to allow for such casing in HTML.\n            if (attrName === \"name\") {\n                ko.utils.setElementName(element, toRemove ? \"\" : attrValue.toString());\n            }\n        });\n    }\n};\n(function() {\n\nko.bindingHandlers['checked'] = {\n    'after': ['value', 'attr'],\n    'init': function (element, valueAccessor, allBindings) {\n        var checkedValue = ko.pureComputed(function() {\n            // Treat \"value\" like \"checkedValue\" when it is included with \"checked\" binding\n            if (allBindings['has']('checkedValue')) {\n                return ko.utils.unwrapObservable(allBindings.get('checkedValue'));\n            } else if (allBindings['has']('value')) {\n                return ko.utils.unwrapObservable(allBindings.get('value'));\n            }\n\n            return element.value;\n        });\n\n        function updateModel() {\n            // This updates the model value from the view value.\n            // It runs in response to DOM events (click) and changes in checkedValue.\n            var isChecked = element.checked,\n                elemValue = useCheckedValue ? checkedValue() : isChecked;\n\n            // When we're first setting up this computed, don't change any model state.\n            if (ko.computedContext.isInitial()) {\n                return;\n            }\n\n            // We can ignore unchecked radio buttons, because some other radio\n            // button will be getting checked, and that one can take care of updating state.\n            if (isRadio && !isChecked) {\n                return;\n            }\n\n            var modelValue = ko.dependencyDetection.ignore(valueAccessor);\n            if (valueIsArray) {\n                var writableValue = rawValueIsNonArrayObservable ? modelValue.peek() : modelValue;\n                if (oldElemValue !== elemValue) {\n                    // When we're responding to the checkedValue changing, and the element is\n                    // currently checked, replace the old elem value with the new elem value\n                    // in the model array.\n                    if (isChecked) {\n                        ko.utils.addOrRemoveItem(writableValue, elemValue, true);\n                        ko.utils.addOrRemoveItem(writableValue, oldElemValue, false);\n                    }\n\n                    oldElemValue = elemValue;\n                } else {\n                    // When we're responding to the user having checked/unchecked a checkbox,\n                    // add/remove the element value to the model array.\n                    ko.utils.addOrRemoveItem(writableValue, elemValue, isChecked);\n                }\n                if (rawValueIsNonArrayObservable && ko.isWriteableObservable(modelValue)) {\n                    modelValue(writableValue);\n                }\n            } else {\n                ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'checked', elemValue, true);\n            }\n        };\n\n        function updateView() {\n            // This updates the view value from the model value.\n            // It runs in response to changes in the bound (checked) value.\n            var modelValue = ko.utils.unwrapObservable(valueAccessor());\n\n            if (valueIsArray) {\n                // When a checkbox is bound to an array, being checked represents its value being present in that array\n                element.checked = ko.utils.arrayIndexOf(modelValue, checkedValue()) >= 0;\n            } else if (isCheckbox) {\n                // When a checkbox is bound to any other value (not an array), being checked represents the value being trueish\n                element.checked = modelValue;\n            } else {\n                // For radio buttons, being checked means that the radio button's value corresponds to the model value\n                element.checked = (checkedValue() === modelValue);\n            }\n        };\n\n        var isCheckbox = element.type == \"checkbox\",\n            isRadio = element.type == \"radio\";\n\n        // Only bind to check boxes and radio buttons\n        if (!isCheckbox && !isRadio) {\n            return;\n        }\n\n        var rawValue = valueAccessor(),\n            valueIsArray = isCheckbox && (ko.utils.unwrapObservable(rawValue) instanceof Array),\n            rawValueIsNonArrayObservable = !(valueIsArray && rawValue.push && rawValue.splice),\n            oldElemValue = valueIsArray ? checkedValue() : undefined,\n            useCheckedValue = isRadio || valueIsArray;\n\n        // IE 6 won't allow radio buttons to be selected unless they have a name\n        if (isRadio && !element.name)\n            ko.bindingHandlers['uniqueName']['init'](element, function() { return true });\n\n        // Set up two computeds to update the binding:\n\n        // The first responds to changes in the checkedValue value and to element clicks\n        ko.computed(updateModel, null, { disposeWhenNodeIsRemoved: element });\n        ko.utils.registerEventHandler(element, \"click\", updateModel);\n\n        // The second responds to changes in the model value (the one associated with the checked binding)\n        ko.computed(updateView, null, { disposeWhenNodeIsRemoved: element });\n\n        rawValue = undefined;\n    }\n};\nko.expressionRewriting.twoWayBindings['checked'] = true;\n\nko.bindingHandlers['checkedValue'] = {\n    'update': function (element, valueAccessor) {\n        element.value = ko.utils.unwrapObservable(valueAccessor());\n    }\n};\n\n})();var classesWrittenByBindingKey = '__ko__cssValue';\nko.bindingHandlers['css'] = {\n    'update': function (element, valueAccessor) {\n        var value = ko.utils.unwrapObservable(valueAccessor());\n        if (value !== null && typeof value == \"object\") {\n            ko.utils.objectForEach(value, function(className, shouldHaveClass) {\n                shouldHaveClass = ko.utils.unwrapObservable(shouldHaveClass);\n                ko.utils.toggleDomNodeCssClass(element, className, shouldHaveClass);\n            });\n        } else {\n            value = ko.utils.stringTrim(String(value || '')); // Make sure we don't try to store or set a non-string value\n            ko.utils.toggleDomNodeCssClass(element, element[classesWrittenByBindingKey], false);\n            element[classesWrittenByBindingKey] = value;\n            ko.utils.toggleDomNodeCssClass(element, value, true);\n        }\n    }\n};\nko.bindingHandlers['enable'] = {\n    'update': function (element, valueAccessor) {\n        var value = ko.utils.unwrapObservable(valueAccessor());\n        if (value && element.disabled)\n            element.removeAttribute(\"disabled\");\n        else if ((!value) && (!element.disabled))\n            element.disabled = true;\n    }\n};\n\nko.bindingHandlers['disable'] = {\n    'update': function (element, valueAccessor) {\n        ko.bindingHandlers['enable']['update'](element, function() { return !ko.utils.unwrapObservable(valueAccessor()) });\n    }\n};\n// For certain common events (currently just 'click'), allow a simplified data-binding syntax\n// e.g. click:handler instead of the usual full-length event:{click:handler}\nfunction makeEventHandlerShortcut(eventName) {\n    ko.bindingHandlers[eventName] = {\n        'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {\n            var newValueAccessor = function () {\n                var result = {};\n                result[eventName] = valueAccessor();\n                return result;\n            };\n            return ko.bindingHandlers['event']['init'].call(this, element, newValueAccessor, allBindings, viewModel, bindingContext);\n        }\n    }\n}\n\nko.bindingHandlers['event'] = {\n    'init' : function (element, valueAccessor, allBindings, viewModel, bindingContext) {\n        var eventsToHandle = valueAccessor() || {};\n        ko.utils.objectForEach(eventsToHandle, function(eventName) {\n            if (typeof eventName == \"string\") {\n                ko.utils.registerEventHandler(element, eventName, function (event) {\n                    var handlerReturnValue;\n                    var handlerFunction = valueAccessor()[eventName];\n                    if (!handlerFunction)\n                        return;\n\n                    try {\n                        // Take all the event args, and prefix with the viewmodel\n                        var argsForHandler = ko.utils.makeArray(arguments);\n                        viewModel = bindingContext['$data'];\n                        argsForHandler.unshift(viewModel);\n                        handlerReturnValue = handlerFunction.apply(viewModel, argsForHandler);\n                    } finally {\n                        if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.\n                            if (event.preventDefault)\n                                event.preventDefault();\n                            else\n                                event.returnValue = false;\n                        }\n                    }\n\n                    var bubble = allBindings.get(eventName + 'Bubble') !== false;\n                    if (!bubble) {\n                        event.cancelBubble = true;\n                        if (event.stopPropagation)\n                            event.stopPropagation();\n                    }\n                });\n            }\n        });\n    }\n};\n// \"foreach: someExpression\" is equivalent to \"template: { foreach: someExpression }\"\n// \"foreach: { data: someExpression, afterAdd: myfn }\" is equivalent to \"template: { foreach: someExpression, afterAdd: myfn }\"\nko.bindingHandlers['foreach'] = {\n    makeTemplateValueAccessor: function(valueAccessor) {\n        return function() {\n            var modelValue = valueAccessor(),\n                unwrappedValue = ko.utils.peekObservable(modelValue);    // Unwrap without setting a dependency here\n\n            // If unwrappedValue is the array, pass in the wrapped value on its own\n            // The value will be unwrapped and tracked within the template binding\n            // (See https://github.com/SteveSanderson/knockout/issues/523)\n            if ((!unwrappedValue) || typeof unwrappedValue.length == \"number\")\n                return { 'foreach': modelValue, 'templateEngine': ko.nativeTemplateEngine.instance };\n\n            // If unwrappedValue.data is the array, preserve all relevant options and unwrap again value so we get updates\n            ko.utils.unwrapObservable(modelValue);\n            return {\n                'foreach': unwrappedValue['data'],\n                'as': unwrappedValue['as'],\n                'includeDestroyed': unwrappedValue['includeDestroyed'],\n                'afterAdd': unwrappedValue['afterAdd'],\n                'beforeRemove': unwrappedValue['beforeRemove'],\n                'afterRender': unwrappedValue['afterRender'],\n                'beforeMove': unwrappedValue['beforeMove'],\n                'afterMove': unwrappedValue['afterMove'],\n                'templateEngine': ko.nativeTemplateEngine.instance\n            };\n        };\n    },\n    'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {\n        return ko.bindingHandlers['template']['init'](element, ko.bindingHandlers['foreach'].makeTemplateValueAccessor(valueAccessor));\n    },\n    'update': function(element, valueAccessor, allBindings, viewModel, bindingContext) {\n        return ko.bindingHandlers['template']['update'](element, ko.bindingHandlers['foreach'].makeTemplateValueAccessor(valueAccessor), allBindings, viewModel, bindingContext);\n    }\n};\nko.expressionRewriting.bindingRewriteValidators['foreach'] = false; // Can't rewrite control flow bindings\nko.virtualElements.allowedBindings['foreach'] = true;\nvar hasfocusUpdatingProperty = '__ko_hasfocusUpdating';\nvar hasfocusLastValue = '__ko_hasfocusLastValue';\nko.bindingHandlers['hasfocus'] = {\n    'init': function(element, valueAccessor, allBindings) {\n        var handleElementFocusChange = function(isFocused) {\n            // Where possible, ignore which event was raised and determine focus state using activeElement,\n            // as this avoids phantom focus/blur events raised when changing tabs in modern browsers.\n            // However, not all KO-targeted browsers (Firefox 2) support activeElement. For those browsers,\n            // prevent a loss of focus when changing tabs/windows by setting a flag that prevents hasfocus\n            // from calling 'blur()' on the element when it loses focus.\n            // Discussion at https://github.com/SteveSanderson/knockout/pull/352\n            element[hasfocusUpdatingProperty] = true;\n            var ownerDoc = element.ownerDocument;\n            if (\"activeElement\" in ownerDoc) {\n                var active;\n                try {\n                    active = ownerDoc.activeElement;\n                } catch(e) {\n                    // IE9 throws if you access activeElement during page load (see issue #703)\n                    active = ownerDoc.body;\n                }\n                isFocused = (active === element);\n            }\n            var modelValue = valueAccessor();\n            ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'hasfocus', isFocused, true);\n\n            //cache the latest value, so we can avoid unnecessarily calling focus/blur in the update function\n            element[hasfocusLastValue] = isFocused;\n            element[hasfocusUpdatingProperty] = false;\n        };\n        var handleElementFocusIn = handleElementFocusChange.bind(null, true);\n        var handleElementFocusOut = handleElementFocusChange.bind(null, false);\n\n        ko.utils.registerEventHandler(element, \"focus\", handleElementFocusIn);\n        ko.utils.registerEventHandler(element, \"focusin\", handleElementFocusIn); // For IE\n        ko.utils.registerEventHandler(element, \"blur\",  handleElementFocusOut);\n        ko.utils.registerEventHandler(element, \"focusout\",  handleElementFocusOut); // For IE\n    },\n    'update': function(element, valueAccessor) {\n        var value = !!ko.utils.unwrapObservable(valueAccessor());\n\n        if (!element[hasfocusUpdatingProperty] && element[hasfocusLastValue] !== value) {\n            value ? element.focus() : element.blur();\n\n            // In IE, the blur method doesn't always cause the element to lose focus (for example, if the window is not in focus).\n            // Setting focus to the body element does seem to be reliable in IE, but should only be used if we know that the current\n            // element was focused already.\n            if (!value && element[hasfocusLastValue]) {\n                element.ownerDocument.body.focus();\n            }\n\n            // For IE, which doesn't reliably fire \"focus\" or \"blur\" events synchronously\n            ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, value ? \"focusin\" : \"focusout\"]);\n        }\n    }\n};\nko.expressionRewriting.twoWayBindings['hasfocus'] = true;\n\nko.bindingHandlers['hasFocus'] = ko.bindingHandlers['hasfocus']; // Make \"hasFocus\" an alias\nko.expressionRewriting.twoWayBindings['hasFocus'] = true;\nko.bindingHandlers['html'] = {\n    'init': function() {\n        // Prevent binding on the dynamically-injected HTML (as developers are unlikely to expect that, and it has security implications)\n        return { 'controlsDescendantBindings': true };\n    },\n    'update': function (element, valueAccessor) {\n        // setHtml will unwrap the value if needed\n        ko.utils.setHtml(element, valueAccessor());\n    }\n};\n// Makes a binding like with or if\nfunction makeWithIfBinding(bindingKey, isWith, isNot, makeContextCallback) {\n    ko.bindingHandlers[bindingKey] = {\n        'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {\n            var didDisplayOnLastUpdate,\n                savedNodes;\n            ko.computed(function() {\n                var rawValue = valueAccessor(),\n                    dataValue = ko.utils.unwrapObservable(rawValue),\n                    shouldDisplay = !isNot !== !dataValue, // equivalent to isNot ? !dataValue : !!dataValue\n                    isFirstRender = !savedNodes,\n                    needsRefresh = isFirstRender || isWith || (shouldDisplay !== didDisplayOnLastUpdate);\n\n                if (needsRefresh) {\n                    // Save a copy of the inner nodes on the initial update, but only if we have dependencies.\n                    if (isFirstRender && ko.computedContext.getDependenciesCount()) {\n                        savedNodes = ko.utils.cloneNodes(ko.virtualElements.childNodes(element), true /* shouldCleanNodes */);\n                    }\n\n                    if (shouldDisplay) {\n                        if (!isFirstRender) {\n                            ko.virtualElements.setDomNodeChildren(element, ko.utils.cloneNodes(savedNodes));\n                        }\n                        ko.applyBindingsToDescendants(makeContextCallback ? makeContextCallback(bindingContext, rawValue) : bindingContext, element);\n                    } else {\n                        ko.virtualElements.emptyNode(element);\n                    }\n\n                    didDisplayOnLastUpdate = shouldDisplay;\n                }\n            }, null, { disposeWhenNodeIsRemoved: element });\n            return { 'controlsDescendantBindings': true };\n        }\n    };\n    ko.expressionRewriting.bindingRewriteValidators[bindingKey] = false; // Can't rewrite control flow bindings\n    ko.virtualElements.allowedBindings[bindingKey] = true;\n}\n\n// Construct the actual binding handlers\nmakeWithIfBinding('if');\nmakeWithIfBinding('ifnot', false /* isWith */, true /* isNot */);\nmakeWithIfBinding('with', true /* isWith */, false /* isNot */,\n    function(bindingContext, dataValue) {\n        return bindingContext.createStaticChildContext(dataValue);\n    }\n);\nvar captionPlaceholder = {};\nko.bindingHandlers['options'] = {\n    'init': function(element) {\n        if (ko.utils.tagNameLower(element) !== \"select\")\n            throw new Error(\"options binding applies only to SELECT elements\");\n\n        // Remove all existing <option>s.\n        while (element.length > 0) {\n            element.remove(0);\n        }\n\n        // Ensures that the binding processor doesn't try to bind the options\n        return { 'controlsDescendantBindings': true };\n    },\n    'update': function (element, valueAccessor, allBindings) {\n        function selectedOptions() {\n            return ko.utils.arrayFilter(element.options, function (node) { return node.selected; });\n        }\n\n        var selectWasPreviouslyEmpty = element.length == 0,\n            multiple = element.multiple,\n            previousScrollTop = (!selectWasPreviouslyEmpty && multiple) ? element.scrollTop : null,\n            unwrappedArray = ko.utils.unwrapObservable(valueAccessor()),\n            valueAllowUnset = allBindings.get('valueAllowUnset') && allBindings['has']('value'),\n            includeDestroyed = allBindings.get('optionsIncludeDestroyed'),\n            arrayToDomNodeChildrenOptions = {},\n            captionValue,\n            filteredArray,\n            previousSelectedValues = [];\n\n        if (!valueAllowUnset) {\n            if (multiple) {\n                previousSelectedValues = ko.utils.arrayMap(selectedOptions(), ko.selectExtensions.readValue);\n            } else if (element.selectedIndex >= 0) {\n                previousSelectedValues.push(ko.selectExtensions.readValue(element.options[element.selectedIndex]));\n            }\n        }\n\n        if (unwrappedArray) {\n            if (typeof unwrappedArray.length == \"undefined\") // Coerce single value into array\n                unwrappedArray = [unwrappedArray];\n\n            // Filter out any entries marked as destroyed\n            filteredArray = ko.utils.arrayFilter(unwrappedArray, function(item) {\n                return includeDestroyed || item === undefined || item === null || !ko.utils.unwrapObservable(item['_destroy']);\n            });\n\n            // If caption is included, add it to the array\n            if (allBindings['has']('optionsCaption')) {\n                captionValue = ko.utils.unwrapObservable(allBindings.get('optionsCaption'));\n                // If caption value is null or undefined, don't show a caption\n                if (captionValue !== null && captionValue !== undefined) {\n                    filteredArray.unshift(captionPlaceholder);\n                }\n            }\n        } else {\n            // If a falsy value is provided (e.g. null), we'll simply empty the select element\n        }\n\n        function applyToObject(object, predicate, defaultValue) {\n            var predicateType = typeof predicate;\n            if (predicateType == \"function\")    // Given a function; run it against the data value\n                return predicate(object);\n            else if (predicateType == \"string\") // Given a string; treat it as a property name on the data value\n                return object[predicate];\n            else                                // Given no optionsText arg; use the data value itself\n                return defaultValue;\n        }\n\n        // The following functions can run at two different times:\n        // The first is when the whole array is being updated directly from this binding handler.\n        // The second is when an observable value for a specific array entry is updated.\n        // oldOptions will be empty in the first case, but will be filled with the previously generated option in the second.\n        var itemUpdate = false;\n        function optionForArrayItem(arrayEntry, index, oldOptions) {\n            if (oldOptions.length) {\n                previousSelectedValues = !valueAllowUnset && oldOptions[0].selected ? [ ko.selectExtensions.readValue(oldOptions[0]) ] : [];\n                itemUpdate = true;\n            }\n            var option = element.ownerDocument.createElement(\"option\");\n            if (arrayEntry === captionPlaceholder) {\n                ko.utils.setTextContent(option, allBindings.get('optionsCaption'));\n                ko.selectExtensions.writeValue(option, undefined);\n            } else {\n                // Apply a value to the option element\n                var optionValue = applyToObject(arrayEntry, allBindings.get('optionsValue'), arrayEntry);\n                ko.selectExtensions.writeValue(option, ko.utils.unwrapObservable(optionValue));\n\n                // Apply some text to the option element\n                var optionText = applyToObject(arrayEntry, allBindings.get('optionsText'), optionValue);\n                ko.utils.setTextContent(option, optionText);\n            }\n            return [option];\n        }\n\n        // By using a beforeRemove callback, we delay the removal until after new items are added. This fixes a selection\n        // problem in IE<=8 and Firefox. See https://github.com/knockout/knockout/issues/1208\n        arrayToDomNodeChildrenOptions['beforeRemove'] =\n            function (option) {\n                element.removeChild(option);\n            };\n\n        function setSelectionCallback(arrayEntry, newOptions) {\n            if (itemUpdate && valueAllowUnset) {\n                // The model value is authoritative, so make sure its value is the one selected\n                // There is no need to use dependencyDetection.ignore since setDomNodeChildrenFromArrayMapping does so already.\n                ko.selectExtensions.writeValue(element, ko.utils.unwrapObservable(allBindings.get('value')), true /* allowUnset */);\n            } else if (previousSelectedValues.length) {\n                // IE6 doesn't like us to assign selection to OPTION nodes before they're added to the document.\n                // That's why we first added them without selection. Now it's time to set the selection.\n                var isSelected = ko.utils.arrayIndexOf(previousSelectedValues, ko.selectExtensions.readValue(newOptions[0])) >= 0;\n                ko.utils.setOptionNodeSelectionState(newOptions[0], isSelected);\n\n                // If this option was changed from being selected during a single-item update, notify the change\n                if (itemUpdate && !isSelected) {\n                    ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, \"change\"]);\n                }\n            }\n        }\n\n        var callback = setSelectionCallback;\n        if (allBindings['has']('optionsAfterRender') && typeof allBindings.get('optionsAfterRender') == \"function\") {\n            callback = function(arrayEntry, newOptions) {\n                setSelectionCallback(arrayEntry, newOptions);\n                ko.dependencyDetection.ignore(allBindings.get('optionsAfterRender'), null, [newOptions[0], arrayEntry !== captionPlaceholder ? arrayEntry : undefined]);\n            }\n        }\n\n        ko.utils.setDomNodeChildrenFromArrayMapping(element, filteredArray, optionForArrayItem, arrayToDomNodeChildrenOptions, callback);\n\n        ko.dependencyDetection.ignore(function () {\n            if (valueAllowUnset) {\n                // The model value is authoritative, so make sure its value is the one selected\n                ko.selectExtensions.writeValue(element, ko.utils.unwrapObservable(allBindings.get('value')), true /* allowUnset */);\n            } else {\n                // Determine if the selection has changed as a result of updating the options list\n                var selectionChanged;\n                if (multiple) {\n                    // For a multiple-select box, compare the new selection count to the previous one\n                    // But if nothing was selected before, the selection can't have changed\n                    selectionChanged = previousSelectedValues.length && selectedOptions().length < previousSelectedValues.length;\n                } else {\n                    // For a single-select box, compare the current value to the previous value\n                    // But if nothing was selected before or nothing is selected now, just look for a change in selection\n                    selectionChanged = (previousSelectedValues.length && element.selectedIndex >= 0)\n                        ? (ko.selectExtensions.readValue(element.options[element.selectedIndex]) !== previousSelectedValues[0])\n                        : (previousSelectedValues.length || element.selectedIndex >= 0);\n                }\n\n                // Ensure consistency between model value and selected option.\n                // If the dropdown was changed so that selection is no longer the same,\n                // notify the value or selectedOptions binding.\n                if (selectionChanged) {\n                    ko.utils.triggerEvent(element, \"change\");\n                }\n            }\n        });\n\n        // Workaround for IE bug\n        ko.utils.ensureSelectElementIsRenderedCorrectly(element);\n\n        if (previousScrollTop && Math.abs(previousScrollTop - element.scrollTop) > 20)\n            element.scrollTop = previousScrollTop;\n    }\n};\nko.bindingHandlers['options'].optionValueDomDataKey = ko.utils.domData.nextKey();\nko.bindingHandlers['selectedOptions'] = {\n    'after': ['options', 'foreach'],\n    'init': function (element, valueAccessor, allBindings) {\n        ko.utils.registerEventHandler(element, \"change\", function () {\n            var value = valueAccessor(), valueToWrite = [];\n            ko.utils.arrayForEach(element.getElementsByTagName(\"option\"), function(node) {\n                if (node.selected)\n                    valueToWrite.push(ko.selectExtensions.readValue(node));\n            });\n            ko.expressionRewriting.writeValueToProperty(value, allBindings, 'selectedOptions', valueToWrite);\n        });\n    },\n    'update': function (element, valueAccessor) {\n        if (ko.utils.tagNameLower(element) != \"select\")\n            throw new Error(\"values binding applies only to SELECT elements\");\n\n        var newValue = ko.utils.unwrapObservable(valueAccessor()),\n            previousScrollTop = element.scrollTop;\n\n        if (newValue && typeof newValue.length == \"number\") {\n            ko.utils.arrayForEach(element.getElementsByTagName(\"option\"), function(node) {\n                var isSelected = ko.utils.arrayIndexOf(newValue, ko.selectExtensions.readValue(node)) >= 0;\n                if (node.selected != isSelected) {      // This check prevents flashing of the select element in IE\n                    ko.utils.setOptionNodeSelectionState(node, isSelected);\n                }\n            });\n        }\n\n        element.scrollTop = previousScrollTop;\n    }\n};\nko.expressionRewriting.twoWayBindings['selectedOptions'] = true;\nko.bindingHandlers['style'] = {\n    'update': function (element, valueAccessor) {\n        var value = ko.utils.unwrapObservable(valueAccessor() || {});\n        ko.utils.objectForEach(value, function(styleName, styleValue) {\n            styleValue = ko.utils.unwrapObservable(styleValue);\n\n            if (styleValue === null || styleValue === undefined || styleValue === false) {\n                // Empty string removes the value, whereas null/undefined have no effect\n                styleValue = \"\";\n            }\n\n            element.style[styleName] = styleValue;\n        });\n    }\n};\nko.bindingHandlers['submit'] = {\n    'init': function (element, valueAccessor, allBindings, viewModel, bindingContext) {\n        if (typeof valueAccessor() != \"function\")\n            throw new Error(\"The value for a submit binding must be a function\");\n        ko.utils.registerEventHandler(element, \"submit\", function (event) {\n            var handlerReturnValue;\n            var value = valueAccessor();\n            try { handlerReturnValue = value.call(bindingContext['$data'], element); }\n            finally {\n                if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.\n                    if (event.preventDefault)\n                        event.preventDefault();\n                    else\n                        event.returnValue = false;\n                }\n            }\n        });\n    }\n};\nko.bindingHandlers['text'] = {\n    'init': function() {\n        // Prevent binding on the dynamically-injected text node (as developers are unlikely to expect that, and it has security implications).\n        // It should also make things faster, as we no longer have to consider whether the text node might be bindable.\n        return { 'controlsDescendantBindings': true };\n    },\n    'update': function (element, valueAccessor) {\n        ko.utils.setTextContent(element, valueAccessor());\n    }\n};\nko.virtualElements.allowedBindings['text'] = true;\n(function () {\n\nif (window && window.navigator) {\n    var parseVersion = function (matches) {\n        if (matches) {\n            return parseFloat(matches[1]);\n        }\n    };\n\n    // Detect various browser versions because some old versions don't fully support the 'input' event\n    var operaVersion = window.opera && window.opera.version && parseInt(window.opera.version()),\n        userAgent = window.navigator.userAgent,\n        safariVersion = parseVersion(userAgent.match(/^(?:(?!chrome).)*version\\/([^ ]*) safari/i)),\n        firefoxVersion = parseVersion(userAgent.match(/Firefox\\/([^ ]*)/));\n}\n\n// IE 8 and 9 have bugs that prevent the normal events from firing when the value changes.\n// But it does fire the 'selectionchange' event on many of those, presumably because the\n// cursor is moving and that counts as the selection changing. The 'selectionchange' event is\n// fired at the document level only and doesn't directly indicate which element changed. We\n// set up just one event handler for the document and use 'activeElement' to determine which\n// element was changed.\nif (ko.utils.ieVersion < 10) {\n    var selectionChangeRegisteredName = ko.utils.domData.nextKey(),\n        selectionChangeHandlerName = ko.utils.domData.nextKey();\n    var selectionChangeHandler = function(event) {\n        var target = this.activeElement,\n            handler = target && ko.utils.domData.get(target, selectionChangeHandlerName);\n        if (handler) {\n            handler(event);\n        }\n    };\n    var registerForSelectionChangeEvent = function (element, handler) {\n        var ownerDoc = element.ownerDocument;\n        if (!ko.utils.domData.get(ownerDoc, selectionChangeRegisteredName)) {\n            ko.utils.domData.set(ownerDoc, selectionChangeRegisteredName, true);\n            ko.utils.registerEventHandler(ownerDoc, 'selectionchange', selectionChangeHandler);\n        }\n        ko.utils.domData.set(element, selectionChangeHandlerName, handler);\n    };\n}\n\nko.bindingHandlers['textInput'] = {\n    'init': function (element, valueAccessor, allBindings) {\n\n        var previousElementValue = element.value,\n            timeoutHandle,\n            elementValueBeforeEvent;\n\n        var updateModel = function (event) {\n            clearTimeout(timeoutHandle);\n            elementValueBeforeEvent = timeoutHandle = undefined;\n\n            var elementValue = element.value;\n            if (previousElementValue !== elementValue) {\n                // Provide a way for tests to know exactly which event was processed\n                if (DEBUG && event) element['_ko_textInputProcessedEvent'] = event.type;\n                previousElementValue = elementValue;\n                ko.expressionRewriting.writeValueToProperty(valueAccessor(), allBindings, 'textInput', elementValue);\n            }\n        };\n\n        var deferUpdateModel = function (event) {\n            if (!timeoutHandle) {\n                // The elementValueBeforeEvent variable is set *only* during the brief gap between an\n                // event firing and the updateModel function running. This allows us to ignore model\n                // updates that are from the previous state of the element, usually due to techniques\n                // such as rateLimit. Such updates, if not ignored, can cause keystrokes to be lost.\n                elementValueBeforeEvent = element.value;\n                var handler = DEBUG ? updateModel.bind(element, {type: event.type}) : updateModel;\n                timeoutHandle = ko.utils.setTimeout(handler, 4);\n            }\n        };\n\n        // IE9 will mess up the DOM if you handle events synchronously which results in DOM changes (such as other bindings);\n        // so we'll make sure all updates are asynchronous\n        var ieUpdateModel = ko.utils.ieVersion == 9 ? deferUpdateModel : updateModel;\n\n        var updateView = function () {\n            var modelValue = ko.utils.unwrapObservable(valueAccessor());\n\n            if (modelValue === null || modelValue === undefined) {\n                modelValue = '';\n            }\n\n            if (elementValueBeforeEvent !== undefined && modelValue === elementValueBeforeEvent) {\n                ko.utils.setTimeout(updateView, 4);\n                return;\n            }\n\n            // Update the element only if the element and model are different. On some browsers, updating the value\n            // will move the cursor to the end of the input, which would be bad while the user is typing.\n            if (element.value !== modelValue) {\n                previousElementValue = modelValue;  // Make sure we ignore events (propertychange) that result from updating the value\n                element.value = modelValue;\n            }\n        };\n\n        var onEvent = function (event, handler) {\n            ko.utils.registerEventHandler(element, event, handler);\n        };\n\n        if (DEBUG && ko.bindingHandlers['textInput']['_forceUpdateOn']) {\n            // Provide a way for tests to specify exactly which events are bound\n            ko.utils.arrayForEach(ko.bindingHandlers['textInput']['_forceUpdateOn'], function(eventName) {\n                if (eventName.slice(0,5) == 'after') {\n                    onEvent(eventName.slice(5), deferUpdateModel);\n                } else {\n                    onEvent(eventName, updateModel);\n                }\n            });\n        } else {\n            if (ko.utils.ieVersion < 10) {\n                // Internet Explorer <= 8 doesn't support the 'input' event, but does include 'propertychange' that fires whenever\n                // any property of an element changes. Unlike 'input', it also fires if a property is changed from JavaScript code,\n                // but that's an acceptable compromise for this binding. IE 9 does support 'input', but since it doesn't fire it\n                // when using autocomplete, we'll use 'propertychange' for it also.\n                onEvent('propertychange', function(event) {\n                    if (event.propertyName === 'value') {\n                        ieUpdateModel(event);\n                    }\n                });\n\n                if (ko.utils.ieVersion == 8) {\n                    // IE 8 has a bug where it fails to fire 'propertychange' on the first update following a value change from\n                    // JavaScript code. It also doesn't fire if you clear the entire value. To fix this, we bind to the following\n                    // events too.\n                    onEvent('keyup', updateModel);      // A single keystoke\n                    onEvent('keydown', updateModel);    // The first character when a key is held down\n                }\n                if (ko.utils.ieVersion >= 8) {\n                    // Internet Explorer 9 doesn't fire the 'input' event when deleting text, including using\n                    // the backspace, delete, or ctrl-x keys, clicking the 'x' to clear the input, dragging text\n                    // out of the field, and cutting or deleting text using the context menu. 'selectionchange'\n                    // can detect all of those except dragging text out of the field, for which we use 'dragend'.\n                    // These are also needed in IE8 because of the bug described above.\n                    registerForSelectionChangeEvent(element, ieUpdateModel);  // 'selectionchange' covers cut, paste, drop, delete, etc.\n                    onEvent('dragend', deferUpdateModel);\n                }\n            } else {\n                // All other supported browsers support the 'input' event, which fires whenever the content of the element is changed\n                // through the user interface.\n                onEvent('input', updateModel);\n\n                if (safariVersion < 5 && ko.utils.tagNameLower(element) === \"textarea\") {\n                    // Safari <5 doesn't fire the 'input' event for <textarea> elements (it does fire 'textInput'\n                    // but only when typing). So we'll just catch as much as we can with keydown, cut, and paste.\n                    onEvent('keydown', deferUpdateModel);\n                    onEvent('paste', deferUpdateModel);\n                    onEvent('cut', deferUpdateModel);\n                } else if (operaVersion < 11) {\n                    // Opera 10 doesn't always fire the 'input' event for cut, paste, undo & drop operations.\n                    // We can try to catch some of those using 'keydown'.\n                    onEvent('keydown', deferUpdateModel);\n                } else if (firefoxVersion < 4.0) {\n                    // Firefox <= 3.6 doesn't fire the 'input' event when text is filled in through autocomplete\n                    onEvent('DOMAutoComplete', updateModel);\n\n                    // Firefox <=3.5 doesn't fire the 'input' event when text is dropped into the input.\n                    onEvent('dragdrop', updateModel);       // <3.5\n                    onEvent('drop', updateModel);           // 3.5\n                }\n            }\n        }\n\n        // Bind to the change event so that we can catch programmatic updates of the value that fire this event.\n        onEvent('change', updateModel);\n\n        ko.computed(updateView, null, { disposeWhenNodeIsRemoved: element });\n    }\n};\nko.expressionRewriting.twoWayBindings['textInput'] = true;\n\n// textinput is an alias for textInput\nko.bindingHandlers['textinput'] = {\n    // preprocess is the only way to set up a full alias\n    'preprocess': function (value, name, addBinding) {\n        addBinding('textInput', value);\n    }\n};\n\n})();ko.bindingHandlers['uniqueName'] = {\n    'init': function (element, valueAccessor) {\n        if (valueAccessor()) {\n            var name = \"ko_unique_\" + (++ko.bindingHandlers['uniqueName'].currentIndex);\n            ko.utils.setElementName(element, name);\n        }\n    }\n};\nko.bindingHandlers['uniqueName'].currentIndex = 0;\nko.bindingHandlers['value'] = {\n    'after': ['options', 'foreach'],\n    'init': function (element, valueAccessor, allBindings) {\n        // If the value binding is placed on a radio/checkbox, then just pass through to checkedValue and quit\n        if (element.tagName.toLowerCase() == \"input\" && (element.type == \"checkbox\" || element.type == \"radio\")) {\n            ko.applyBindingAccessorsToNode(element, { 'checkedValue': valueAccessor });\n            return;\n        }\n\n        // Always catch \"change\" event; possibly other events too if asked\n        var eventsToCatch = [\"change\"];\n        var requestedEventsToCatch = allBindings.get(\"valueUpdate\");\n        var propertyChangedFired = false;\n        var elementValueBeforeEvent = null;\n\n        if (requestedEventsToCatch) {\n            if (typeof requestedEventsToCatch == \"string\") // Allow both individual event names, and arrays of event names\n                requestedEventsToCatch = [requestedEventsToCatch];\n            ko.utils.arrayPushAll(eventsToCatch, requestedEventsToCatch);\n            eventsToCatch = ko.utils.arrayGetDistinctValues(eventsToCatch);\n        }\n\n        var valueUpdateHandler = function() {\n            elementValueBeforeEvent = null;\n            propertyChangedFired = false;\n            var modelValue = valueAccessor();\n            var elementValue = ko.selectExtensions.readValue(element);\n            ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'value', elementValue);\n        }\n\n        // Workaround for https://github.com/SteveSanderson/knockout/issues/122\n        // IE doesn't fire \"change\" events on textboxes if the user selects a value from its autocomplete list\n        var ieAutoCompleteHackNeeded = ko.utils.ieVersion && element.tagName.toLowerCase() == \"input\" && element.type == \"text\"\n                                       && element.autocomplete != \"off\" && (!element.form || element.form.autocomplete != \"off\");\n        if (ieAutoCompleteHackNeeded && ko.utils.arrayIndexOf(eventsToCatch, \"propertychange\") == -1) {\n            ko.utils.registerEventHandler(element, \"propertychange\", function () { propertyChangedFired = true });\n            ko.utils.registerEventHandler(element, \"focus\", function () { propertyChangedFired = false });\n            ko.utils.registerEventHandler(element, \"blur\", function() {\n                if (propertyChangedFired) {\n                    valueUpdateHandler();\n                }\n            });\n        }\n\n        ko.utils.arrayForEach(eventsToCatch, function(eventName) {\n            // The syntax \"after<eventname>\" means \"run the handler asynchronously after the event\"\n            // This is useful, for example, to catch \"keydown\" events after the browser has updated the control\n            // (otherwise, ko.selectExtensions.readValue(this) will receive the control's value *before* the key event)\n            var handler = valueUpdateHandler;\n            if (ko.utils.stringStartsWith(eventName, \"after\")) {\n                handler = function() {\n                    // The elementValueBeforeEvent variable is non-null *only* during the brief gap between\n                    // a keyX event firing and the valueUpdateHandler running, which is scheduled to happen\n                    // at the earliest asynchronous opportunity. We store this temporary information so that\n                    // if, between keyX and valueUpdateHandler, the underlying model value changes separately,\n                    // we can overwrite that model value change with the value the user just typed. Otherwise,\n                    // techniques like rateLimit can trigger model changes at critical moments that will\n                    // override the user's inputs, causing keystrokes to be lost.\n                    elementValueBeforeEvent = ko.selectExtensions.readValue(element);\n                    ko.utils.setTimeout(valueUpdateHandler, 0);\n                };\n                eventName = eventName.substring(\"after\".length);\n            }\n            ko.utils.registerEventHandler(element, eventName, handler);\n        });\n\n        var updateFromModel = function () {\n            var newValue = ko.utils.unwrapObservable(valueAccessor());\n            var elementValue = ko.selectExtensions.readValue(element);\n\n            if (elementValueBeforeEvent !== null && newValue === elementValueBeforeEvent) {\n                ko.utils.setTimeout(updateFromModel, 0);\n                return;\n            }\n\n            var valueHasChanged = (newValue !== elementValue);\n\n            if (valueHasChanged) {\n                if (ko.utils.tagNameLower(element) === \"select\") {\n                    var allowUnset = allBindings.get('valueAllowUnset');\n                    var applyValueAction = function () {\n                        ko.selectExtensions.writeValue(element, newValue, allowUnset);\n                    };\n                    applyValueAction();\n\n                    if (!allowUnset && newValue !== ko.selectExtensions.readValue(element)) {\n                        // If you try to set a model value that can't be represented in an already-populated dropdown, reject that change,\n                        // because you're not allowed to have a model value that disagrees with a visible UI selection.\n                        ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, \"change\"]);\n                    } else {\n                        // Workaround for IE6 bug: It won't reliably apply values to SELECT nodes during the same execution thread\n                        // right after you've changed the set of OPTION nodes on it. So for that node type, we'll schedule a second thread\n                        // to apply the value as well.\n                        ko.utils.setTimeout(applyValueAction, 0);\n                    }\n                } else {\n                    ko.selectExtensions.writeValue(element, newValue);\n                }\n            }\n        };\n\n        ko.computed(updateFromModel, null, { disposeWhenNodeIsRemoved: element });\n    },\n    'update': function() {} // Keep for backwards compatibility with code that may have wrapped value binding\n};\nko.expressionRewriting.twoWayBindings['value'] = true;\nko.bindingHandlers['visible'] = {\n    'update': function (element, valueAccessor) {\n        var value = ko.utils.unwrapObservable(valueAccessor());\n        var isCurrentlyVisible = !(element.style.display == \"none\");\n        if (value && !isCurrentlyVisible)\n            element.style.display = \"\";\n        else if ((!value) && isCurrentlyVisible)\n            element.style.display = \"none\";\n    }\n};\n// 'click' is just a shorthand for the usual full-length event:{click:handler}\nmakeEventHandlerShortcut('click');\n// If you want to make a custom template engine,\n//\n// [1] Inherit from this class (like ko.nativeTemplateEngine does)\n// [2] Override 'renderTemplateSource', supplying a function with this signature:\n//\n//        function (templateSource, bindingContext, options) {\n//            // - templateSource.text() is the text of the template you should render\n//            // - bindingContext.$data is the data you should pass into the template\n//            //   - you might also want to make bindingContext.$parent, bindingContext.$parents,\n//            //     and bindingContext.$root available in the template too\n//            // - options gives you access to any other properties set on \"data-bind: { template: options }\"\n//            // - templateDocument is the document object of the template\n//            //\n//            // Return value: an array of DOM nodes\n//        }\n//\n// [3] Override 'createJavaScriptEvaluatorBlock', supplying a function with this signature:\n//\n//        function (script) {\n//            // Return value: Whatever syntax means \"Evaluate the JavaScript statement 'script' and output the result\"\n//            //               For example, the jquery.tmpl template engine converts 'someScript' to '${ someScript }'\n//        }\n//\n//     This is only necessary if you want to allow data-bind attributes to reference arbitrary template variables.\n//     If you don't want to allow that, you can set the property 'allowTemplateRewriting' to false (like ko.nativeTemplateEngine does)\n//     and then you don't need to override 'createJavaScriptEvaluatorBlock'.\n\nko.templateEngine = function () { };\n\nko.templateEngine.prototype['renderTemplateSource'] = function (templateSource, bindingContext, options, templateDocument) {\n    throw new Error(\"Override renderTemplateSource\");\n};\n\nko.templateEngine.prototype['createJavaScriptEvaluatorBlock'] = function (script) {\n    throw new Error(\"Override createJavaScriptEvaluatorBlock\");\n};\n\nko.templateEngine.prototype['makeTemplateSource'] = function(template, templateDocument) {\n    // Named template\n    if (typeof template == \"string\") {\n        templateDocument = templateDocument || document;\n        var elem = templateDocument.getElementById(template);\n        if (!elem)\n            throw new Error(\"Cannot find template with ID \" + template);\n        return new ko.templateSources.domElement(elem);\n    } else if ((template.nodeType == 1) || (template.nodeType == 8)) {\n        // Anonymous template\n        return new ko.templateSources.anonymousTemplate(template);\n    } else\n        throw new Error(\"Unknown template type: \" + template);\n};\n\nko.templateEngine.prototype['renderTemplate'] = function (template, bindingContext, options, templateDocument) {\n    var templateSource = this['makeTemplateSource'](template, templateDocument);\n    return this['renderTemplateSource'](templateSource, bindingContext, options, templateDocument);\n};\n\nko.templateEngine.prototype['isTemplateRewritten'] = function (template, templateDocument) {\n    // Skip rewriting if requested\n    if (this['allowTemplateRewriting'] === false)\n        return true;\n    return this['makeTemplateSource'](template, templateDocument)['data'](\"isRewritten\");\n};\n\nko.templateEngine.prototype['rewriteTemplate'] = function (template, rewriterCallback, templateDocument) {\n    var templateSource = this['makeTemplateSource'](template, templateDocument);\n    var rewritten = rewriterCallback(templateSource['text']());\n    templateSource['text'](rewritten);\n    templateSource['data'](\"isRewritten\", true);\n};\n\nko.exportSymbol('templateEngine', ko.templateEngine);\n\nko.templateRewriting = (function () {\n    var memoizeDataBindingAttributeSyntaxRegex = /(<([a-z]+\\d*)(?:\\s+(?!data-bind\\s*=\\s*)[a-z0-9\\-]+(?:=(?:\\\"[^\\\"]*\\\"|\\'[^\\']*\\'|[^>]*))?)*\\s+)data-bind\\s*=\\s*([\"'])([\\s\\S]*?)\\3/gi;\n    var memoizeVirtualContainerBindingSyntaxRegex = /<!--\\s*ko\\b\\s*([\\s\\S]*?)\\s*-->/g;\n\n    function validateDataBindValuesForRewriting(keyValueArray) {\n        var allValidators = ko.expressionRewriting.bindingRewriteValidators;\n        for (var i = 0; i < keyValueArray.length; i++) {\n            var key = keyValueArray[i]['key'];\n            if (allValidators.hasOwnProperty(key)) {\n                var validator = allValidators[key];\n\n                if (typeof validator === \"function\") {\n                    var possibleErrorMessage = validator(keyValueArray[i]['value']);\n                    if (possibleErrorMessage)\n                        throw new Error(possibleErrorMessage);\n                } else if (!validator) {\n                    throw new Error(\"This template engine does not support the '\" + key + \"' binding within its templates\");\n                }\n            }\n        }\n    }\n\n    function constructMemoizedTagReplacement(dataBindAttributeValue, tagToRetain, nodeName, templateEngine) {\n        var dataBindKeyValueArray = ko.expressionRewriting.parseObjectLiteral(dataBindAttributeValue);\n        validateDataBindValuesForRewriting(dataBindKeyValueArray);\n        var rewrittenDataBindAttributeValue = ko.expressionRewriting.preProcessBindings(dataBindKeyValueArray, {'valueAccessors':true});\n\n        // For no obvious reason, Opera fails to evaluate rewrittenDataBindAttributeValue unless it's wrapped in an additional\n        // anonymous function, even though Opera's built-in debugger can evaluate it anyway. No other browser requires this\n        // extra indirection.\n        var applyBindingsToNextSiblingScript =\n            \"ko.__tr_ambtns(function($context,$element){return(function(){return{ \" + rewrittenDataBindAttributeValue + \" } })()},'\" + nodeName.toLowerCase() + \"')\";\n        return templateEngine['createJavaScriptEvaluatorBlock'](applyBindingsToNextSiblingScript) + tagToRetain;\n    }\n\n    return {\n        ensureTemplateIsRewritten: function (template, templateEngine, templateDocument) {\n            if (!templateEngine['isTemplateRewritten'](template, templateDocument))\n                templateEngine['rewriteTemplate'](template, function (htmlString) {\n                    return ko.templateRewriting.memoizeBindingAttributeSyntax(htmlString, templateEngine);\n                }, templateDocument);\n        },\n\n        memoizeBindingAttributeSyntax: function (htmlString, templateEngine) {\n            return htmlString.replace(memoizeDataBindingAttributeSyntaxRegex, function () {\n                return constructMemoizedTagReplacement(/* dataBindAttributeValue: */ arguments[4], /* tagToRetain: */ arguments[1], /* nodeName: */ arguments[2], templateEngine);\n            }).replace(memoizeVirtualContainerBindingSyntaxRegex, function() {\n                return constructMemoizedTagReplacement(/* dataBindAttributeValue: */ arguments[1], /* tagToRetain: */ \"<!-- ko -->\", /* nodeName: */ \"#comment\", templateEngine);\n            });\n        },\n\n        applyMemoizedBindingsToNextSibling: function (bindings, nodeName) {\n            return ko.memoization.memoize(function (domNode, bindingContext) {\n                var nodeToBind = domNode.nextSibling;\n                if (nodeToBind && nodeToBind.nodeName.toLowerCase() === nodeName) {\n                    ko.applyBindingAccessorsToNode(nodeToBind, bindings, bindingContext);\n                }\n            });\n        }\n    }\n})();\n\n\n// Exported only because it has to be referenced by string lookup from within rewritten template\nko.exportSymbol('__tr_ambtns', ko.templateRewriting.applyMemoizedBindingsToNextSibling);\n(function() {\n    // A template source represents a read/write way of accessing a template. This is to eliminate the need for template loading/saving\n    // logic to be duplicated in every template engine (and means they can all work with anonymous templates, etc.)\n    //\n    // Two are provided by default:\n    //  1. ko.templateSources.domElement       - reads/writes the text content of an arbitrary DOM element\n    //  2. ko.templateSources.anonymousElement - uses ko.utils.domData to read/write text *associated* with the DOM element, but\n    //                                           without reading/writing the actual element text content, since it will be overwritten\n    //                                           with the rendered template output.\n    // You can implement your own template source if you want to fetch/store templates somewhere other than in DOM elements.\n    // Template sources need to have the following functions:\n    //   text() \t\t\t- returns the template text from your storage location\n    //   text(value)\t\t- writes the supplied template text to your storage location\n    //   data(key)\t\t\t- reads values stored using data(key, value) - see below\n    //   data(key, value)\t- associates \"value\" with this template and the key \"key\". Is used to store information like \"isRewritten\".\n    //\n    // Optionally, template sources can also have the following functions:\n    //   nodes()            - returns a DOM element containing the nodes of this template, where available\n    //   nodes(value)       - writes the given DOM element to your storage location\n    // If a DOM element is available for a given template source, template engines are encouraged to use it in preference over text()\n    // for improved speed. However, all templateSources must supply text() even if they don't supply nodes().\n    //\n    // Once you've implemented a templateSource, make your template engine use it by subclassing whatever template engine you were\n    // using and overriding \"makeTemplateSource\" to return an instance of your custom template source.\n\n    ko.templateSources = {};\n\n    // ---- ko.templateSources.domElement -----\n\n    // template types\n    var templateScript = 1,\n        templateTextArea = 2,\n        templateTemplate = 3,\n        templateElement = 4;\n\n    ko.templateSources.domElement = function(element) {\n        this.domElement = element;\n\n        if (element) {\n            var tagNameLower = ko.utils.tagNameLower(element);\n            this.templateType =\n                tagNameLower === \"script\" ? templateScript :\n                tagNameLower === \"textarea\" ? templateTextArea :\n                    // For browsers with proper <template> element support, where the .content property gives a document fragment\n                tagNameLower == \"template\" && element.content && element.content.nodeType === 11 ? templateTemplate :\n                templateElement;\n        }\n    }\n\n    ko.templateSources.domElement.prototype['text'] = function(/* valueToWrite */) {\n        var elemContentsProperty = this.templateType === templateScript ? \"text\"\n                                 : this.templateType === templateTextArea ? \"value\"\n                                 : \"innerHTML\";\n\n        if (arguments.length == 0) {\n            return this.domElement[elemContentsProperty];\n        } else {\n            var valueToWrite = arguments[0];\n            if (elemContentsProperty === \"innerHTML\")\n                ko.utils.setHtml(this.domElement, valueToWrite);\n            else\n                this.domElement[elemContentsProperty] = valueToWrite;\n        }\n    };\n\n    var dataDomDataPrefix = ko.utils.domData.nextKey() + \"_\";\n    ko.templateSources.domElement.prototype['data'] = function(key /*, valueToWrite */) {\n        if (arguments.length === 1) {\n            return ko.utils.domData.get(this.domElement, dataDomDataPrefix + key);\n        } else {\n            ko.utils.domData.set(this.domElement, dataDomDataPrefix + key, arguments[1]);\n        }\n    };\n\n    var templatesDomDataKey = ko.utils.domData.nextKey();\n    function getTemplateDomData(element) {\n        return ko.utils.domData.get(element, templatesDomDataKey) || {};\n    }\n    function setTemplateDomData(element, data) {\n        ko.utils.domData.set(element, templatesDomDataKey, data);\n    }\n\n    ko.templateSources.domElement.prototype['nodes'] = function(/* valueToWrite */) {\n        var element = this.domElement;\n        if (arguments.length == 0) {\n            var templateData = getTemplateDomData(element),\n                containerData = templateData.containerData;\n            return containerData || (\n                this.templateType === templateTemplate ? element.content :\n                this.templateType === templateElement ? element :\n                undefined);\n        } else {\n            var valueToWrite = arguments[0];\n            setTemplateDomData(element, {containerData: valueToWrite});\n        }\n    };\n\n    // ---- ko.templateSources.anonymousTemplate -----\n    // Anonymous templates are normally saved/retrieved as DOM nodes through \"nodes\".\n    // For compatibility, you can also read \"text\"; it will be serialized from the nodes on demand.\n    // Writing to \"text\" is still supported, but then the template data will not be available as DOM nodes.\n\n    ko.templateSources.anonymousTemplate = function(element) {\n        this.domElement = element;\n    }\n    ko.templateSources.anonymousTemplate.prototype = new ko.templateSources.domElement();\n    ko.templateSources.anonymousTemplate.prototype.constructor = ko.templateSources.anonymousTemplate;\n    ko.templateSources.anonymousTemplate.prototype['text'] = function(/* valueToWrite */) {\n        if (arguments.length == 0) {\n            var templateData = getTemplateDomData(this.domElement);\n            if (templateData.textData === undefined && templateData.containerData)\n                templateData.textData = templateData.containerData.innerHTML;\n            return templateData.textData;\n        } else {\n            var valueToWrite = arguments[0];\n            setTemplateDomData(this.domElement, {textData: valueToWrite});\n        }\n    };\n\n    ko.exportSymbol('templateSources', ko.templateSources);\n    ko.exportSymbol('templateSources.domElement', ko.templateSources.domElement);\n    ko.exportSymbol('templateSources.anonymousTemplate', ko.templateSources.anonymousTemplate);\n})();\n(function () {\n    var _templateEngine;\n    ko.setTemplateEngine = function (templateEngine) {\n        if ((templateEngine != undefined) && !(templateEngine instanceof ko.templateEngine))\n            throw new Error(\"templateEngine must inherit from ko.templateEngine\");\n        _templateEngine = templateEngine;\n    }\n\n    function invokeForEachNodeInContinuousRange(firstNode, lastNode, action) {\n        var node, nextInQueue = firstNode, firstOutOfRangeNode = ko.virtualElements.nextSibling(lastNode);\n        while (nextInQueue && ((node = nextInQueue) !== firstOutOfRangeNode)) {\n            nextInQueue = ko.virtualElements.nextSibling(node);\n            action(node, nextInQueue);\n        }\n    }\n\n    function activateBindingsOnContinuousNodeArray(continuousNodeArray, bindingContext) {\n        // To be used on any nodes that have been rendered by a template and have been inserted into some parent element\n        // Walks through continuousNodeArray (which *must* be continuous, i.e., an uninterrupted sequence of sibling nodes, because\n        // the algorithm for walking them relies on this), and for each top-level item in the virtual-element sense,\n        // (1) Does a regular \"applyBindings\" to associate bindingContext with this node and to activate any non-memoized bindings\n        // (2) Unmemoizes any memos in the DOM subtree (e.g., to activate bindings that had been memoized during template rewriting)\n\n        if (continuousNodeArray.length) {\n            var firstNode = continuousNodeArray[0],\n                lastNode = continuousNodeArray[continuousNodeArray.length - 1],\n                parentNode = firstNode.parentNode,\n                provider = ko.bindingProvider['instance'],\n                preprocessNode = provider['preprocessNode'];\n\n            if (preprocessNode) {\n                invokeForEachNodeInContinuousRange(firstNode, lastNode, function(node, nextNodeInRange) {\n                    var nodePreviousSibling = node.previousSibling;\n                    var newNodes = preprocessNode.call(provider, node);\n                    if (newNodes) {\n                        if (node === firstNode)\n                            firstNode = newNodes[0] || nextNodeInRange;\n                        if (node === lastNode)\n                            lastNode = newNodes[newNodes.length - 1] || nodePreviousSibling;\n                    }\n                });\n\n                // Because preprocessNode can change the nodes, including the first and last nodes, update continuousNodeArray to match.\n                // We need the full set, including inner nodes, because the unmemoize step might remove the first node (and so the real\n                // first node needs to be in the array).\n                continuousNodeArray.length = 0;\n                if (!firstNode) { // preprocessNode might have removed all the nodes, in which case there's nothing left to do\n                    return;\n                }\n                if (firstNode === lastNode) {\n                    continuousNodeArray.push(firstNode);\n                } else {\n                    continuousNodeArray.push(firstNode, lastNode);\n                    ko.utils.fixUpContinuousNodeArray(continuousNodeArray, parentNode);\n                }\n            }\n\n            // Need to applyBindings *before* unmemoziation, because unmemoization might introduce extra nodes (that we don't want to re-bind)\n            // whereas a regular applyBindings won't introduce new memoized nodes\n            invokeForEachNodeInContinuousRange(firstNode, lastNode, function(node) {\n                if (node.nodeType === 1 || node.nodeType === 8)\n                    ko.applyBindings(bindingContext, node);\n            });\n            invokeForEachNodeInContinuousRange(firstNode, lastNode, function(node) {\n                if (node.nodeType === 1 || node.nodeType === 8)\n                    ko.memoization.unmemoizeDomNodeAndDescendants(node, [bindingContext]);\n            });\n\n            // Make sure any changes done by applyBindings or unmemoize are reflected in the array\n            ko.utils.fixUpContinuousNodeArray(continuousNodeArray, parentNode);\n        }\n    }\n\n    function getFirstNodeFromPossibleArray(nodeOrNodeArray) {\n        return nodeOrNodeArray.nodeType ? nodeOrNodeArray\n                                        : nodeOrNodeArray.length > 0 ? nodeOrNodeArray[0]\n                                        : null;\n    }\n\n    function executeTemplate(targetNodeOrNodeArray, renderMode, template, bindingContext, options) {\n        options = options || {};\n        var firstTargetNode = targetNodeOrNodeArray && getFirstNodeFromPossibleArray(targetNodeOrNodeArray);\n        var templateDocument = (firstTargetNode || template || {}).ownerDocument;\n        var templateEngineToUse = (options['templateEngine'] || _templateEngine);\n        ko.templateRewriting.ensureTemplateIsRewritten(template, templateEngineToUse, templateDocument);\n        var renderedNodesArray = templateEngineToUse['renderTemplate'](template, bindingContext, options, templateDocument);\n\n        // Loosely check result is an array of DOM nodes\n        if ((typeof renderedNodesArray.length != \"number\") || (renderedNodesArray.length > 0 && typeof renderedNodesArray[0].nodeType != \"number\"))\n            throw new Error(\"Template engine must return an array of DOM nodes\");\n\n        var haveAddedNodesToParent = false;\n        switch (renderMode) {\n            case \"replaceChildren\":\n                ko.virtualElements.setDomNodeChildren(targetNodeOrNodeArray, renderedNodesArray);\n                haveAddedNodesToParent = true;\n                break;\n            case \"replaceNode\":\n                ko.utils.replaceDomNodes(targetNodeOrNodeArray, renderedNodesArray);\n                haveAddedNodesToParent = true;\n                break;\n            case \"ignoreTargetNode\": break;\n            default:\n                throw new Error(\"Unknown renderMode: \" + renderMode);\n        }\n\n        if (haveAddedNodesToParent) {\n            activateBindingsOnContinuousNodeArray(renderedNodesArray, bindingContext);\n            if (options['afterRender'])\n                ko.dependencyDetection.ignore(options['afterRender'], null, [renderedNodesArray, bindingContext['$data']]);\n        }\n\n        return renderedNodesArray;\n    }\n\n    function resolveTemplateName(template, data, context) {\n        // The template can be specified as:\n        if (ko.isObservable(template)) {\n            // 1. An observable, with string value\n            return template();\n        } else if (typeof template === 'function') {\n            // 2. A function of (data, context) returning a string\n            return template(data, context);\n        } else {\n            // 3. A string\n            return template;\n        }\n    }\n\n    ko.renderTemplate = function (template, dataOrBindingContext, options, targetNodeOrNodeArray, renderMode) {\n        options = options || {};\n        if ((options['templateEngine'] || _templateEngine) == undefined)\n            throw new Error(\"Set a template engine before calling renderTemplate\");\n        renderMode = renderMode || \"replaceChildren\";\n\n        if (targetNodeOrNodeArray) {\n            var firstTargetNode = getFirstNodeFromPossibleArray(targetNodeOrNodeArray);\n\n            var whenToDispose = function () { return (!firstTargetNode) || !ko.utils.domNodeIsAttachedToDocument(firstTargetNode); }; // Passive disposal (on next evaluation)\n            var activelyDisposeWhenNodeIsRemoved = (firstTargetNode && renderMode == \"replaceNode\") ? firstTargetNode.parentNode : firstTargetNode;\n\n            return ko.dependentObservable( // So the DOM is automatically updated when any dependency changes\n                function () {\n                    // Ensure we've got a proper binding context to work with\n                    var bindingContext = (dataOrBindingContext && (dataOrBindingContext instanceof ko.bindingContext))\n                        ? dataOrBindingContext\n                        : new ko.bindingContext(dataOrBindingContext, null, null, null, { \"exportDependencies\": true });\n\n                    var templateName = resolveTemplateName(template, bindingContext['$data'], bindingContext),\n                        renderedNodesArray = executeTemplate(targetNodeOrNodeArray, renderMode, templateName, bindingContext, options);\n\n                    if (renderMode == \"replaceNode\") {\n                        targetNodeOrNodeArray = renderedNodesArray;\n                        firstTargetNode = getFirstNodeFromPossibleArray(targetNodeOrNodeArray);\n                    }\n                },\n                null,\n                { disposeWhen: whenToDispose, disposeWhenNodeIsRemoved: activelyDisposeWhenNodeIsRemoved }\n            );\n        } else {\n            // We don't yet have a DOM node to evaluate, so use a memo and render the template later when there is a DOM node\n            return ko.memoization.memoize(function (domNode) {\n                ko.renderTemplate(template, dataOrBindingContext, options, domNode, \"replaceNode\");\n            });\n        }\n    };\n\n    ko.renderTemplateForEach = function (template, arrayOrObservableArray, options, targetNode, parentBindingContext) {\n        // Since setDomNodeChildrenFromArrayMapping always calls executeTemplateForArrayItem and then\n        // activateBindingsCallback for added items, we can store the binding context in the former to use in the latter.\n        var arrayItemContext;\n\n        // This will be called by setDomNodeChildrenFromArrayMapping to get the nodes to add to targetNode\n        var executeTemplateForArrayItem = function (arrayValue, index) {\n            // Support selecting template as a function of the data being rendered\n            arrayItemContext = parentBindingContext['createChildContext'](arrayValue, options['as'], function(context) {\n                context['$index'] = index;\n            });\n\n            var templateName = resolveTemplateName(template, arrayValue, arrayItemContext);\n            return executeTemplate(null, \"ignoreTargetNode\", templateName, arrayItemContext, options);\n        }\n\n        // This will be called whenever setDomNodeChildrenFromArrayMapping has added nodes to targetNode\n        var activateBindingsCallback = function(arrayValue, addedNodesArray, index) {\n            activateBindingsOnContinuousNodeArray(addedNodesArray, arrayItemContext);\n            if (options['afterRender'])\n                options['afterRender'](addedNodesArray, arrayValue);\n\n            // release the \"cache\" variable, so that it can be collected by\n            // the GC when its value isn't used from within the bindings anymore.\n            arrayItemContext = null;\n        };\n\n        return ko.dependentObservable(function () {\n            var unwrappedArray = ko.utils.unwrapObservable(arrayOrObservableArray) || [];\n            if (typeof unwrappedArray.length == \"undefined\") // Coerce single value into array\n                unwrappedArray = [unwrappedArray];\n\n            // Filter out any entries marked as destroyed\n            var filteredArray = ko.utils.arrayFilter(unwrappedArray, function(item) {\n                return options['includeDestroyed'] || item === undefined || item === null || !ko.utils.unwrapObservable(item['_destroy']);\n            });\n\n            // Call setDomNodeChildrenFromArrayMapping, ignoring any observables unwrapped within (most likely from a callback function).\n            // If the array items are observables, though, they will be unwrapped in executeTemplateForArrayItem and managed within setDomNodeChildrenFromArrayMapping.\n            ko.dependencyDetection.ignore(ko.utils.setDomNodeChildrenFromArrayMapping, null, [targetNode, filteredArray, executeTemplateForArrayItem, options, activateBindingsCallback]);\n\n        }, null, { disposeWhenNodeIsRemoved: targetNode });\n    };\n\n    var templateComputedDomDataKey = ko.utils.domData.nextKey();\n    function disposeOldComputedAndStoreNewOne(element, newComputed) {\n        var oldComputed = ko.utils.domData.get(element, templateComputedDomDataKey);\n        if (oldComputed && (typeof(oldComputed.dispose) == 'function'))\n            oldComputed.dispose();\n        ko.utils.domData.set(element, templateComputedDomDataKey, (newComputed && newComputed.isActive()) ? newComputed : undefined);\n    }\n\n    ko.bindingHandlers['template'] = {\n        'init': function(element, valueAccessor) {\n            // Support anonymous templates\n            var bindingValue = ko.utils.unwrapObservable(valueAccessor());\n            if (typeof bindingValue == \"string\" || bindingValue['name']) {\n                // It's a named template - clear the element\n                ko.virtualElements.emptyNode(element);\n            } else if ('nodes' in bindingValue) {\n                // We've been given an array of DOM nodes. Save them as the template source.\n                // There is no known use case for the node array being an observable array (if the output\n                // varies, put that behavior *into* your template - that's what templates are for), and\n                // the implementation would be a mess, so assert that it's not observable.\n                var nodes = bindingValue['nodes'] || [];\n                if (ko.isObservable(nodes)) {\n                    throw new Error('The \"nodes\" option must be a plain, non-observable array.');\n                }\n                var container = ko.utils.moveCleanedNodesToContainerElement(nodes); // This also removes the nodes from their current parent\n                new ko.templateSources.anonymousTemplate(element)['nodes'](container);\n            } else {\n                // It's an anonymous template - store the element contents, then clear the element\n                var templateNodes = ko.virtualElements.childNodes(element),\n                    container = ko.utils.moveCleanedNodesToContainerElement(templateNodes); // This also removes the nodes from their current parent\n                new ko.templateSources.anonymousTemplate(element)['nodes'](container);\n            }\n            return { 'controlsDescendantBindings': true };\n        },\n        'update': function (element, valueAccessor, allBindings, viewModel, bindingContext) {\n            var value = valueAccessor(),\n                options = ko.utils.unwrapObservable(value),\n                shouldDisplay = true,\n                templateComputed = null,\n                templateName;\n\n            if (typeof options == \"string\") {\n                templateName = value;\n                options = {};\n            } else {\n                templateName = options['name'];\n\n                // Support \"if\"/\"ifnot\" conditions\n                if ('if' in options)\n                    shouldDisplay = ko.utils.unwrapObservable(options['if']);\n                if (shouldDisplay && 'ifnot' in options)\n                    shouldDisplay = !ko.utils.unwrapObservable(options['ifnot']);\n            }\n\n            if ('foreach' in options) {\n                // Render once for each data point (treating data set as empty if shouldDisplay==false)\n                var dataArray = (shouldDisplay && options['foreach']) || [];\n                templateComputed = ko.renderTemplateForEach(templateName || element, dataArray, options, element, bindingContext);\n            } else if (!shouldDisplay) {\n                ko.virtualElements.emptyNode(element);\n            } else {\n                // Render once for this single data point (or use the viewModel if no data was provided)\n                var innerBindingContext = ('data' in options) ?\n                    bindingContext.createStaticChildContext(options['data'], options['as']) :  // Given an explitit 'data' value, we create a child binding context for it\n                    bindingContext;                                                        // Given no explicit 'data' value, we retain the same binding context\n                templateComputed = ko.renderTemplate(templateName || element, innerBindingContext, options, element);\n            }\n\n            // It only makes sense to have a single template computed per element (otherwise which one should have its output displayed?)\n            disposeOldComputedAndStoreNewOne(element, templateComputed);\n        }\n    };\n\n    // Anonymous templates can't be rewritten. Give a nice error message if you try to do it.\n    ko.expressionRewriting.bindingRewriteValidators['template'] = function(bindingValue) {\n        var parsedBindingValue = ko.expressionRewriting.parseObjectLiteral(bindingValue);\n\n        if ((parsedBindingValue.length == 1) && parsedBindingValue[0]['unknown'])\n            return null; // It looks like a string literal, not an object literal, so treat it as a named template (which is allowed for rewriting)\n\n        if (ko.expressionRewriting.keyValueArrayContainsKey(parsedBindingValue, \"name\"))\n            return null; // Named templates can be rewritten, so return \"no error\"\n        return \"This template engine does not support anonymous templates nested within its templates\";\n    };\n\n    ko.virtualElements.allowedBindings['template'] = true;\n})();\n\nko.exportSymbol('setTemplateEngine', ko.setTemplateEngine);\nko.exportSymbol('renderTemplate', ko.renderTemplate);\n// Go through the items that have been added and deleted and try to find matches between them.\nko.utils.findMovesInArrayComparison = function (left, right, limitFailedCompares) {\n    if (left.length && right.length) {\n        var failedCompares, l, r, leftItem, rightItem;\n        for (failedCompares = l = 0; (!limitFailedCompares || failedCompares < limitFailedCompares) && (leftItem = left[l]); ++l) {\n            for (r = 0; rightItem = right[r]; ++r) {\n                if (leftItem['value'] === rightItem['value']) {\n                    leftItem['moved'] = rightItem['index'];\n                    rightItem['moved'] = leftItem['index'];\n                    right.splice(r, 1);         // This item is marked as moved; so remove it from right list\n                    failedCompares = r = 0;     // Reset failed compares count because we're checking for consecutive failures\n                    break;\n                }\n            }\n            failedCompares += r;\n        }\n    }\n};\n\nko.utils.compareArrays = (function () {\n    var statusNotInOld = 'added', statusNotInNew = 'deleted';\n\n    // Simple calculation based on Levenshtein distance.\n    function compareArrays(oldArray, newArray, options) {\n        // For backward compatibility, if the third arg is actually a bool, interpret\n        // it as the old parameter 'dontLimitMoves'. Newer code should use { dontLimitMoves: true }.\n        options = (typeof options === 'boolean') ? { 'dontLimitMoves': options } : (options || {});\n        oldArray = oldArray || [];\n        newArray = newArray || [];\n\n        if (oldArray.length < newArray.length)\n            return compareSmallArrayToBigArray(oldArray, newArray, statusNotInOld, statusNotInNew, options);\n        else\n            return compareSmallArrayToBigArray(newArray, oldArray, statusNotInNew, statusNotInOld, options);\n    }\n\n    function compareSmallArrayToBigArray(smlArray, bigArray, statusNotInSml, statusNotInBig, options) {\n        var myMin = Math.min,\n            myMax = Math.max,\n            editDistanceMatrix = [],\n            smlIndex, smlIndexMax = smlArray.length,\n            bigIndex, bigIndexMax = bigArray.length,\n            compareRange = (bigIndexMax - smlIndexMax) || 1,\n            maxDistance = smlIndexMax + bigIndexMax + 1,\n            thisRow, lastRow,\n            bigIndexMaxForRow, bigIndexMinForRow;\n\n        for (smlIndex = 0; smlIndex <= smlIndexMax; smlIndex++) {\n            lastRow = thisRow;\n            editDistanceMatrix.push(thisRow = []);\n            bigIndexMaxForRow = myMin(bigIndexMax, smlIndex + compareRange);\n            bigIndexMinForRow = myMax(0, smlIndex - 1);\n            for (bigIndex = bigIndexMinForRow; bigIndex <= bigIndexMaxForRow; bigIndex++) {\n                if (!bigIndex)\n                    thisRow[bigIndex] = smlIndex + 1;\n                else if (!smlIndex)  // Top row - transform empty array into new array via additions\n                    thisRow[bigIndex] = bigIndex + 1;\n                else if (smlArray[smlIndex - 1] === bigArray[bigIndex - 1])\n                    thisRow[bigIndex] = lastRow[bigIndex - 1];                  // copy value (no edit)\n                else {\n                    var northDistance = lastRow[bigIndex] || maxDistance;       // not in big (deletion)\n                    var westDistance = thisRow[bigIndex - 1] || maxDistance;    // not in small (addition)\n                    thisRow[bigIndex] = myMin(northDistance, westDistance) + 1;\n                }\n            }\n        }\n\n        var editScript = [], meMinusOne, notInSml = [], notInBig = [];\n        for (smlIndex = smlIndexMax, bigIndex = bigIndexMax; smlIndex || bigIndex;) {\n            meMinusOne = editDistanceMatrix[smlIndex][bigIndex] - 1;\n            if (bigIndex && meMinusOne === editDistanceMatrix[smlIndex][bigIndex-1]) {\n                notInSml.push(editScript[editScript.length] = {     // added\n                    'status': statusNotInSml,\n                    'value': bigArray[--bigIndex],\n                    'index': bigIndex });\n            } else if (smlIndex && meMinusOne === editDistanceMatrix[smlIndex - 1][bigIndex]) {\n                notInBig.push(editScript[editScript.length] = {     // deleted\n                    'status': statusNotInBig,\n                    'value': smlArray[--smlIndex],\n                    'index': smlIndex });\n            } else {\n                --bigIndex;\n                --smlIndex;\n                if (!options['sparse']) {\n                    editScript.push({\n                        'status': \"retained\",\n                        'value': bigArray[bigIndex] });\n                }\n            }\n        }\n\n        // Set a limit on the number of consecutive non-matching comparisons; having it a multiple of\n        // smlIndexMax keeps the time complexity of this algorithm linear.\n        ko.utils.findMovesInArrayComparison(notInBig, notInSml, !options['dontLimitMoves'] && smlIndexMax * 10);\n\n        return editScript.reverse();\n    }\n\n    return compareArrays;\n})();\n\nko.exportSymbol('utils.compareArrays', ko.utils.compareArrays);\n(function () {\n    // Objective:\n    // * Given an input array, a container DOM node, and a function from array elements to arrays of DOM nodes,\n    //   map the array elements to arrays of DOM nodes, concatenate together all these arrays, and use them to populate the container DOM node\n    // * Next time we're given the same combination of things (with the array possibly having mutated), update the container DOM node\n    //   so that its children is again the concatenation of the mappings of the array elements, but don't re-map any array elements that we\n    //   previously mapped - retain those nodes, and just insert/delete other ones\n\n    // \"callbackAfterAddingNodes\" will be invoked after any \"mapping\"-generated nodes are inserted into the container node\n    // You can use this, for example, to activate bindings on those nodes.\n\n    function mapNodeAndRefreshWhenChanged(containerNode, mapping, valueToMap, callbackAfterAddingNodes, index) {\n        // Map this array value inside a dependentObservable so we re-map when any dependency changes\n        var mappedNodes = [];\n        var dependentObservable = ko.dependentObservable(function() {\n            var newMappedNodes = mapping(valueToMap, index, ko.utils.fixUpContinuousNodeArray(mappedNodes, containerNode)) || [];\n\n            // On subsequent evaluations, just replace the previously-inserted DOM nodes\n            if (mappedNodes.length > 0) {\n                ko.utils.replaceDomNodes(mappedNodes, newMappedNodes);\n                if (callbackAfterAddingNodes)\n                    ko.dependencyDetection.ignore(callbackAfterAddingNodes, null, [valueToMap, newMappedNodes, index]);\n            }\n\n            // Replace the contents of the mappedNodes array, thereby updating the record\n            // of which nodes would be deleted if valueToMap was itself later removed\n            mappedNodes.length = 0;\n            ko.utils.arrayPushAll(mappedNodes, newMappedNodes);\n        }, null, { disposeWhenNodeIsRemoved: containerNode, disposeWhen: function() { return !ko.utils.anyDomNodeIsAttachedToDocument(mappedNodes); } });\n        return { mappedNodes : mappedNodes, dependentObservable : (dependentObservable.isActive() ? dependentObservable : undefined) };\n    }\n\n    var lastMappingResultDomDataKey = ko.utils.domData.nextKey(),\n        deletedItemDummyValue = ko.utils.domData.nextKey();\n\n    ko.utils.setDomNodeChildrenFromArrayMapping = function (domNode, array, mapping, options, callbackAfterAddingNodes) {\n        // Compare the provided array against the previous one\n        array = array || [];\n        options = options || {};\n        var isFirstExecution = ko.utils.domData.get(domNode, lastMappingResultDomDataKey) === undefined;\n        var lastMappingResult = ko.utils.domData.get(domNode, lastMappingResultDomDataKey) || [];\n        var lastArray = ko.utils.arrayMap(lastMappingResult, function (x) { return x.arrayEntry; });\n        var editScript = ko.utils.compareArrays(lastArray, array, options['dontLimitMoves']);\n\n        // Build the new mapping result\n        var newMappingResult = [];\n        var lastMappingResultIndex = 0;\n        var newMappingResultIndex = 0;\n\n        var nodesToDelete = [];\n        var itemsToProcess = [];\n        var itemsForBeforeRemoveCallbacks = [];\n        var itemsForMoveCallbacks = [];\n        var itemsForAfterAddCallbacks = [];\n        var mapData;\n\n        function itemMovedOrRetained(editScriptIndex, oldPosition) {\n            mapData = lastMappingResult[oldPosition];\n            if (newMappingResultIndex !== oldPosition)\n                itemsForMoveCallbacks[editScriptIndex] = mapData;\n            // Since updating the index might change the nodes, do so before calling fixUpContinuousNodeArray\n            mapData.indexObservable(newMappingResultIndex++);\n            ko.utils.fixUpContinuousNodeArray(mapData.mappedNodes, domNode);\n            newMappingResult.push(mapData);\n            itemsToProcess.push(mapData);\n        }\n\n        function callCallback(callback, items) {\n            if (callback) {\n                for (var i = 0, n = items.length; i < n; i++) {\n                    if (items[i]) {\n                        ko.utils.arrayForEach(items[i].mappedNodes, function(node) {\n                            callback(node, i, items[i].arrayEntry);\n                        });\n                    }\n                }\n            }\n        }\n\n        for (var i = 0, editScriptItem, movedIndex; editScriptItem = editScript[i]; i++) {\n            movedIndex = editScriptItem['moved'];\n            switch (editScriptItem['status']) {\n                case \"deleted\":\n                    if (movedIndex === undefined) {\n                        mapData = lastMappingResult[lastMappingResultIndex];\n\n                        // Stop tracking changes to the mapping for these nodes\n                        if (mapData.dependentObservable) {\n                            mapData.dependentObservable.dispose();\n                            mapData.dependentObservable = undefined;\n                        }\n\n                        // Queue these nodes for later removal\n                        if (ko.utils.fixUpContinuousNodeArray(mapData.mappedNodes, domNode).length) {\n                            if (options['beforeRemove']) {\n                                newMappingResult.push(mapData);\n                                itemsToProcess.push(mapData);\n                                if (mapData.arrayEntry === deletedItemDummyValue) {\n                                    mapData = null;\n                                } else {\n                                    itemsForBeforeRemoveCallbacks[i] = mapData;\n                                }\n                            }\n                            if (mapData) {\n                                nodesToDelete.push.apply(nodesToDelete, mapData.mappedNodes);\n                            }\n                        }\n                    }\n                    lastMappingResultIndex++;\n                    break;\n\n                case \"retained\":\n                    itemMovedOrRetained(i, lastMappingResultIndex++);\n                    break;\n\n                case \"added\":\n                    if (movedIndex !== undefined) {\n                        itemMovedOrRetained(i, movedIndex);\n                    } else {\n                        mapData = { arrayEntry: editScriptItem['value'], indexObservable: ko.observable(newMappingResultIndex++) };\n                        newMappingResult.push(mapData);\n                        itemsToProcess.push(mapData);\n                        if (!isFirstExecution)\n                            itemsForAfterAddCallbacks[i] = mapData;\n                    }\n                    break;\n            }\n        }\n\n        // Store a copy of the array items we just considered so we can difference it next time\n        ko.utils.domData.set(domNode, lastMappingResultDomDataKey, newMappingResult);\n\n        // Call beforeMove first before any changes have been made to the DOM\n        callCallback(options['beforeMove'], itemsForMoveCallbacks);\n\n        // Next remove nodes for deleted items (or just clean if there's a beforeRemove callback)\n        ko.utils.arrayForEach(nodesToDelete, options['beforeRemove'] ? ko.cleanNode : ko.removeNode);\n\n        // Next add/reorder the remaining items (will include deleted items if there's a beforeRemove callback)\n        for (var i = 0, nextNode = ko.virtualElements.firstChild(domNode), lastNode, node; mapData = itemsToProcess[i]; i++) {\n            // Get nodes for newly added items\n            if (!mapData.mappedNodes)\n                ko.utils.extend(mapData, mapNodeAndRefreshWhenChanged(domNode, mapping, mapData.arrayEntry, callbackAfterAddingNodes, mapData.indexObservable));\n\n            // Put nodes in the right place if they aren't there already\n            for (var j = 0; node = mapData.mappedNodes[j]; nextNode = node.nextSibling, lastNode = node, j++) {\n                if (node !== nextNode)\n                    ko.virtualElements.insertAfter(domNode, node, lastNode);\n            }\n\n            // Run the callbacks for newly added nodes (for example, to apply bindings, etc.)\n            if (!mapData.initialized && callbackAfterAddingNodes) {\n                callbackAfterAddingNodes(mapData.arrayEntry, mapData.mappedNodes, mapData.indexObservable);\n                mapData.initialized = true;\n            }\n        }\n\n        // If there's a beforeRemove callback, call it after reordering.\n        // Note that we assume that the beforeRemove callback will usually be used to remove the nodes using\n        // some sort of animation, which is why we first reorder the nodes that will be removed. If the\n        // callback instead removes the nodes right away, it would be more efficient to skip reordering them.\n        // Perhaps we'll make that change in the future if this scenario becomes more common.\n        callCallback(options['beforeRemove'], itemsForBeforeRemoveCallbacks);\n\n        // Replace the stored values of deleted items with a dummy value. This provides two benefits: it marks this item\n        // as already \"removed\" so we won't call beforeRemove for it again, and it ensures that the item won't match up\n        // with an actual item in the array and appear as \"retained\" or \"moved\".\n        for (i = 0; i < itemsForBeforeRemoveCallbacks.length; ++i) {\n            if (itemsForBeforeRemoveCallbacks[i]) {\n                itemsForBeforeRemoveCallbacks[i].arrayEntry = deletedItemDummyValue;\n            }\n        }\n\n        // Finally call afterMove and afterAdd callbacks\n        callCallback(options['afterMove'], itemsForMoveCallbacks);\n        callCallback(options['afterAdd'], itemsForAfterAddCallbacks);\n    }\n})();\n\nko.exportSymbol('utils.setDomNodeChildrenFromArrayMapping', ko.utils.setDomNodeChildrenFromArrayMapping);\nko.nativeTemplateEngine = function () {\n    this['allowTemplateRewriting'] = false;\n}\n\nko.nativeTemplateEngine.prototype = new ko.templateEngine();\nko.nativeTemplateEngine.prototype.constructor = ko.nativeTemplateEngine;\nko.nativeTemplateEngine.prototype['renderTemplateSource'] = function (templateSource, bindingContext, options, templateDocument) {\n    var useNodesIfAvailable = !(ko.utils.ieVersion < 9), // IE<9 cloneNode doesn't work properly\n        templateNodesFunc = useNodesIfAvailable ? templateSource['nodes'] : null,\n        templateNodes = templateNodesFunc ? templateSource['nodes']() : null;\n\n    if (templateNodes) {\n        return ko.utils.makeArray(templateNodes.cloneNode(true).childNodes);\n    } else {\n        var templateText = templateSource['text']();\n        return ko.utils.parseHtmlFragment(templateText, templateDocument);\n    }\n};\n\nko.nativeTemplateEngine.instance = new ko.nativeTemplateEngine();\nko.setTemplateEngine(ko.nativeTemplateEngine.instance);\n\nko.exportSymbol('nativeTemplateEngine', ko.nativeTemplateEngine);\n(function() {\n    ko.jqueryTmplTemplateEngine = function () {\n        // Detect which version of jquery-tmpl you're using. Unfortunately jquery-tmpl\n        // doesn't expose a version number, so we have to infer it.\n        // Note that as of Knockout 1.3, we only support jQuery.tmpl 1.0.0pre and later,\n        // which KO internally refers to as version \"2\", so older versions are no longer detected.\n        var jQueryTmplVersion = this.jQueryTmplVersion = (function() {\n            if (!jQueryInstance || !(jQueryInstance['tmpl']))\n                return 0;\n            // Since it exposes no official version number, we use our own numbering system. To be updated as jquery-tmpl evolves.\n            try {\n                if (jQueryInstance['tmpl']['tag']['tmpl']['open'].toString().indexOf('__') >= 0) {\n                    // Since 1.0.0pre, custom tags should append markup to an array called \"__\"\n                    return 2; // Final version of jquery.tmpl\n                }\n            } catch(ex) { /* Apparently not the version we were looking for */ }\n\n            return 1; // Any older version that we don't support\n        })();\n\n        function ensureHasReferencedJQueryTemplates() {\n            if (jQueryTmplVersion < 2)\n                throw new Error(\"Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.\");\n        }\n\n        function executeTemplate(compiledTemplate, data, jQueryTemplateOptions) {\n            return jQueryInstance['tmpl'](compiledTemplate, data, jQueryTemplateOptions);\n        }\n\n        this['renderTemplateSource'] = function(templateSource, bindingContext, options, templateDocument) {\n            templateDocument = templateDocument || document;\n            options = options || {};\n            ensureHasReferencedJQueryTemplates();\n\n            // Ensure we have stored a precompiled version of this template (don't want to reparse on every render)\n            var precompiled = templateSource['data']('precompiled');\n            if (!precompiled) {\n                var templateText = templateSource['text']() || \"\";\n                // Wrap in \"with($whatever.koBindingContext) { ... }\"\n                templateText = \"{{ko_with $item.koBindingContext}}\" + templateText + \"{{/ko_with}}\";\n\n                precompiled = jQueryInstance['template'](null, templateText);\n                templateSource['data']('precompiled', precompiled);\n            }\n\n            var data = [bindingContext['$data']]; // Prewrap the data in an array to stop jquery.tmpl from trying to unwrap any arrays\n            var jQueryTemplateOptions = jQueryInstance['extend']({ 'koBindingContext': bindingContext }, options['templateOptions']);\n\n            var resultNodes = executeTemplate(precompiled, data, jQueryTemplateOptions);\n            resultNodes['appendTo'](templateDocument.createElement(\"div\")); // Using \"appendTo\" forces jQuery/jQuery.tmpl to perform necessary cleanup work\n\n            jQueryInstance['fragments'] = {}; // Clear jQuery's fragment cache to avoid a memory leak after a large number of template renders\n            return resultNodes;\n        };\n\n        this['createJavaScriptEvaluatorBlock'] = function(script) {\n            return \"{{ko_code ((function() { return \" + script + \" })()) }}\";\n        };\n\n        this['addTemplate'] = function(templateName, templateMarkup) {\n            document.write(\"<script type='text/html' id='\" + templateName + \"'>\" + templateMarkup + \"<\" + \"/script>\");\n        };\n\n        if (jQueryTmplVersion > 0) {\n            jQueryInstance['tmpl']['tag']['ko_code'] = {\n                open: \"__.push($1 || '');\"\n            };\n            jQueryInstance['tmpl']['tag']['ko_with'] = {\n                open: \"with($1) {\",\n                close: \"} \"\n            };\n        }\n    };\n\n    ko.jqueryTmplTemplateEngine.prototype = new ko.templateEngine();\n    ko.jqueryTmplTemplateEngine.prototype.constructor = ko.jqueryTmplTemplateEngine;\n\n    // Use this one by default *only if jquery.tmpl is referenced*\n    var jqueryTmplTemplateEngineInstance = new ko.jqueryTmplTemplateEngine();\n    if (jqueryTmplTemplateEngineInstance.jQueryTmplVersion > 0)\n        ko.setTemplateEngine(jqueryTmplTemplateEngineInstance);\n\n    ko.exportSymbol('jqueryTmplTemplateEngine', ko.jqueryTmplTemplateEngine);\n})();\n}));\n}());\n})();\n"]}