{"version":3,"file":"pwc-smartplayer.e1549562.chunk.js","mappings":";gzBAIA,IAAIA,eAAuC,oBAAfC,WAA6BA,WAA+B,oBAAXC,OAAyBA,YAA2B,IAAX,oBAAAC,EAAyB,oBAAAA,EAAyB,oBAATC,KAAuBA,KAAO,CAAC,EAE9L,SAASC,wBAAyBC,GACjC,OAAOA,GAAKA,EAAEC,YAAcC,OAAOC,UAAUC,eAAeC,KAAKL,EAAG,WAAaA,EAAW,QAAIA,CACjG,EAQA,SAAWM,QAEPA,OAAOC,QACU,WAgBjB,IAAIC,YAAc,CAAC,UAAW,aAAc,OAAQ,SAAU,UAAW,UAAW,UAAW,UAAW,UAAW,SAAU,WAAY,UAAW,SAAU,gBAAiB,QAAS,SACtLC,eAAiB,EAAC,GAAO,EAAO,KAAM,KAAM,EAAG,EAAG,EAAG,GAAG,GAAO,GAAO,GAAO,EAAO,EAAG,KAAM,EAAG,GACpG,SAASC,aAAaC,OAAQC,QAC5BA,OAASA,QAAUV,OAAOW,OAAO,MACjC,IAAIC,EAAIC,SAASC,YAAY,SAC7BF,EAAEG,UAAUN,OAAQC,OAAOM,UAAW,EAAON,OAAOO,aAAc,GAIlE,IAAK,IAAWC,EAAPC,EAAI,EAAMA,EAAIb,YAAYc,OAAQD,IAEzCP,EADAM,EAAIZ,YAAYa,IACTT,OAAOQ,IAAMX,eAAeY,GAErCP,EAAES,QAAUX,OAAOW,SAAW,EAI9B,IAAIC,SAAW,EAuBf,OArBEA,SADEZ,OAAOY,UAAYV,EAAES,QACZX,OAAOY,SAEPV,EAAES,QAAU,GAAM,EAI/BT,EAAEd,EAAIc,EAAEW,QACRX,EAAEY,EAAIZ,EAAEa,QAGRb,EAAEc,UAAYhB,OAAOgB,WAAa,EAClCd,EAAEe,MAAQjB,OAAOiB,OAAS,EAC1Bf,EAAEgB,OAASlB,OAAOkB,QAAU,EAC5BhB,EAAEU,SAAWA,SACbV,EAAEiB,MAAQnB,OAAOmB,OAAS,EAC1BjB,EAAEkB,MAAQpB,OAAOoB,OAAS,EAC1BlB,EAAEmB,MAAQrB,OAAOqB,OAAS,EAC1BnB,EAAEoB,mBAAqBtB,OAAOsB,oBAAsB,EACpDpB,EAAEqB,YAAcvB,OAAOuB,aAAe,GACtCrB,EAAEsB,YAAcxB,OAAOwB,aAAe,EACtCtB,EAAEuB,UAAYzB,OAAOyB,YAAa,EAC3BvB,CACT,CAKA,IACIwB,WADU1C,OAAO2C,KAAO3C,OAAO2C,IAAIpC,UAAUqC,QACtBD,IAAME,eACjC,SAASA,iBACPC,KAAKC,MAAQ,GACbD,KAAKE,KAAO,CACd,CACAH,eAAetC,UAAY,CACzB0C,IAAK,SAAaC,EAAGC,GACnB,QAAUC,IAAND,EACF,OAAOL,KAAa,OAAEI,GAEnBJ,KAAKO,IAAIH,IACZJ,KAAKE,OAEPF,KAAKC,MAAMG,GAAKC,CAClB,EACAE,IAAK,SAAaH,GAChB,YAAyBE,IAAlBN,KAAKC,MAAMG,EACpB,EACA,OAAU,SAAiBA,GACrBJ,KAAKO,IAAIH,YACJJ,KAAKC,MAAMG,GAClBJ,KAAKE,OAET,EACAM,IAAK,SAAaJ,GAChB,OAAOJ,KAAKC,MAAMG,EACpB,EACAK,MAAO,WACLT,KAAKC,MAAMrB,OAAS,EACpBoB,KAAKE,KAAO,CACd,EAEAJ,QAAS,SAAiBY,SAAUC,SAClC,OAAOX,KAAKC,MAAMH,SAAQ,SAAUO,EAAGD,GACrCM,SAAS/C,KAAKgD,QAASN,EAAGD,EAAGJ,KAC/B,GAAGA,KACL,GAEF,IAAIY,YAAc,CAElB,UAAW,aAAc,OAAQ,SAAU,UAAW,UAAW,UAAW,UAAW,UAAW,SAAU,WAAY,UAAW,SAAU,gBAE7I,UAEA,YAAa,QAAS,SAAU,WAAY,QAAS,QAAS,cAAe,cAAe,YAE5F,OAAQ,SAAU,gBAAiB,QAAS,QAAS,QAAS,aAC1DC,eAAiB,EAErB,GAAO,EAAO,KAAM,KAAM,EAAG,EAAG,EAAG,GAAG,GAAO,GAAO,GAAO,EAAO,EAAG,KAErE,EAEA,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAG,EAEzB,GAAI,KAAM,KAAM,EAAG,EAAG,EAAG,GACrBC,gBAAkB,CACpB,YAAe,EACf,WAAc,EACd,aAAgB,EAChB,aAAgB,GAEdC,iBAAiD,oBAAvBC,mBAc1BC,WAAa,CACfC,WAAY,IAAItB,WAChBuB,SAAU3D,OAAOW,OAAO,MACxBiD,YAAa5D,OAAOW,OAAO,MAG3BkD,aAAc7D,OAAOW,OAAO,MAC5BmD,gBAAiB,GASjBC,eAAgB,SAAwBC,KAAMC,QAC5C,IAAIC,EAAID,OACJE,UAAYD,EAAEE,OACdD,YACFA,UAAU7B,SAAQ,SAAU1B,GACtBsD,EAAEtD,KACJ4B,KAAKmB,SAAS/C,GAAKsD,EAAEtD,GAAGyD,KAAKH,GAEjC,GAAG1B,MACHA,KAAKqB,aAAaG,MAAQE,EAC1B1B,KAAKsB,gBAAgBQ,KAAKJ,GAE9B,EACAK,SAAU,SAAkBC,SAE1B,IADA,IACgBC,GADZC,EAAIlC,KAAKsB,gBAAgB1C,OACpBD,EAAI,EAAOA,EAAIuD,IAAMD,GAAKjC,KAAKsB,gBAAgB3C,IAAKA,IAE3DsD,GAAGF,SAASpE,KAAKsE,GAAID,QAEzB,EACAG,WAAY,SAAoBH,SAE9B,IADA,IACgBC,GADZC,EAAIlC,KAAKsB,gBAAgB1C,OACpBD,EAAI,EAAOA,EAAIuD,IAAMD,GAAKjC,KAAKsB,gBAAgB3C,IAAKA,IAE3DsD,GAAGE,WAAWxE,KAAKsE,GAAID,QAE3B,EACAI,SAAyC,SAAkBC,UAAWC,WACpE,IACE,OAAOD,UAAUD,SAASE,UAC5B,CAAE,MAAOC,IAEP,OAAO,CACT,CACF,EAEAC,KAAM,SAAcC,SAClBA,QAAQjE,SAAU,EAClBwB,KAAK0C,UAAU,cAAeD,QAChC,EACAE,KAAM,SAAcF,SAClBA,QAAQjE,SAAU,EAClBwB,KAAK0C,UAAU,cAAeD,QAChC,EACAG,GAAI,SAAYH,SACdA,QAAQjE,SAAU,EAClBwB,KAAK0C,UAAU,YAAaD,QAC9B,EACAI,MAAO,SAAeJ,SACpBA,QAAQjE,SAAU,EAClBwB,KAAK0C,UAAU,eAAgBD,QACjC,EACAK,MAAO,SAAeL,SACpBA,QAAQjE,SAAU,EAClBwB,KAAK0C,UAAU,eAAgBD,QACjC,EACAM,KAAM,SAAcN,SAClBA,QAAQjE,SAAU,EAClBwB,KAAK0C,UAAU,cAAeD,QAChC,EACAO,IAAK,SAAaP,SAChBA,QAAQjE,SAAU,EAClBwB,KAAK0C,UAAU,aAAcD,QAC/B,EACAQ,OAAQ,SAAgBR,SACtBA,QAAQjE,SAAU,EAClBwB,KAAK0C,UAAU,gBAAiBD,QAClC,EACAS,SAAU,SAAkBC,OAC1BnD,KAAKgD,IAAIG,OACTnD,KAAKoD,UAAUD,MAAOnD,KAAK8C,OAAO,EACpC,EACAO,UAAW,SAAmBF,OAC5BnD,KAAK+C,KAAKI,OACVnD,KAAKoD,UAAUD,MAAOnD,KAAK6C,OAAO,EACpC,EAEAS,aAAc,SAAsBb,SAIlC,IAAIA,QAAQc,aAAZ,CAGA,IAAIC,KAAOf,QAAQe,KACfC,GAAKzD,KAAKmB,UAAYnB,KAAKmB,SAASqC,MACpCC,IACFA,GAAGhB,SAELA,QAAQc,cAAe,CANvB,CAOF,EAEAG,OAAQ,SAAgBC,OAAQ/B,QAC9BA,OAAO9B,SAAQ,SAAU1B,GACvB4B,KAAK4D,SAASD,OAAQvF,EACxB,GAAG4B,KACL,EAEA6D,SAAU,SAAkBF,OAAQ/B,QAClCA,OAAO9B,SAAQ,SAAU1B,GACvB4B,KAAK8D,YAAYH,OAAQvF,EAC3B,GAAG4B,KACL,EACA4D,SAAyC,SAAkBD,OAAQI,WACjEJ,OAAOK,iBAAiBD,UAAW/D,KAAKiE,aAC1C,EACAH,YAA+C,SAAqBH,OAAQI,WAC1EJ,OAAOO,oBAAoBH,UAAW/D,KAAKiE,aAC7C,EAUAE,UAAW,SAAmBlG,OAAQwE,SAEhCzC,KAAKoB,YAAYqB,QAAQvD,aAC3BuD,QAAQ2B,cAAgB,MAE1B,IAAIhG,EAAI,IAAIJ,aAAaC,OAAQwE,SAKjC,OAJIA,QAAQ4B,iBACVjG,EAAEiG,eAAiB5B,QAAQ4B,gBAE7BjG,EAAEkG,QAAUlG,EAAEkG,SAAW7B,QAAQkB,OAC1BvF,CACT,EAEAsE,UAAW,SAAmBzE,OAAQwE,SACpC,IAAIrE,EAAI4B,KAAKmE,UAAUlG,OAAQwE,SAC/B,OAAOzC,KAAKuE,cAAcnG,EAC5B,EAQAoG,WAAY,SAAoB/B,SAG9B,IAFA,IACI/D,EADA+F,UAAYjH,OAAOW,OAAO,MAErBQ,EAAI,EAAGA,EAAIiC,YAAYhC,OAAQD,IAEtC8F,UADA/F,EAAIkC,YAAYjC,IACD8D,QAAQ/D,IAAMmC,eAAelC,IAKxCoC,kBAA2B,WAANrC,GAAwB,kBAANA,GACrC+F,UAAU/F,aAAcsC,qBAC1ByD,UAAU/F,GAAK+F,UAAU/F,GAAGgG,yBAWlC,OALIjC,QAAQ4B,iBACVI,UAAUJ,eAAiB,WACzB5B,QAAQ4B,gBACV,GAEKI,SACT,EACAE,UAAW,SAAmBlC,SAC5B,IAAImC,QAAU5E,KAAKoB,YAAYqB,QAAQvD,WACvC,OAAK0F,QAGDnC,QAAQ6B,UAAYM,SAAanC,QAAQe,QAAQ1C,qBAArD,EACS8D,QAHAnC,QAAQ6B,OAKnB,EACAlB,UAAW,SAAmBD,MAAOM,GAAIoB,eAKvC,IAJA,IAAIlB,OAASR,MAAMQ,OACfmB,QAAU,GAGPnB,SAAWtF,WAAasF,OAAOvB,SAASe,MAAMiB,gBAKnD,GAJAU,QAAQhD,KAAK6B,UACbA,OAASA,OAAOoB,YAId,OAGAF,eACFC,QAAQE,UAEVF,QAAQhF,SAAQ,SAAU6D,QACxBR,MAAMQ,OAASA,OACfF,GAAG9F,KAAKqC,KAAMmD,MAChB,GAAGnD,KACL,EACAiF,WAAY,SAAoBC,YAAaC,SAAUC,cACjDpF,KAAKoB,YAAY8D,cACnBlF,KAAKqF,eAAeH,YAAaE,cAEnCpF,KAAKoB,YAAY8D,aAAeC,SAChCnF,KAAKsF,gBAAkBtF,KAAKqF,eAAexD,KAAK7B,KAAMkF,YAAaE,cACnE/G,SAAS2F,iBAAiB,YAAahE,KAAKsF,iBAC5CjH,SAAS2F,iBAAiB,gBAAiBhE,KAAKsF,iBAChD,IAAIlH,EAAI,IAAIJ,aAAa,qBACzBI,EAAEc,UAAYgG,YACd9G,EAAEkG,QAAUa,SACPC,cACHpF,KAAKuF,mBAAmBnH,EAE5B,EACAiH,eAAgB,SAAwBH,YAAaE,cACnD,IAAII,EAAIxF,KAAKoB,YAAY8D,aACzB,GAAKM,EAAL,CAGAxF,KAAKoB,YAAY8D,kBAAe5E,EAChCjC,SAAS6F,oBAAoB,YAAalE,KAAKsF,iBAC/CjH,SAAS6F,oBAAoB,gBAAiBlE,KAAKsF,iBACnD,IAAIlH,EAAI,IAAIJ,aAAa,sBACzBI,EAAEc,UAAYgG,YACd9G,EAAEkG,QAAUkB,EACPJ,cACHpF,KAAKuF,mBAAmBnH,EAR1B,CAUF,EAOAmG,cAAmD,SAAuB9B,SACxE,IAAI+C,EAAIxF,KAAK2E,UAAUlC,SACvB,GAAI+C,EACF,OAAOA,EAAEjB,cAAc9B,QAE3B,EACA8C,mBAAoB,SAA4B9C,SAC9CgD,sBAAsBzF,KAAKuE,cAAc1C,KAAK7B,KAAMyC,SACtD,GAEFxB,WAAWgD,aAAehD,WAAWqC,aAAazB,KAAKZ,YACvD,IAAIyE,UAAY,CACdC,OAAQ,SAAgBC,MACtB,GAAIA,KACF,OAAOA,KAAKC,YAAcD,KAAKE,gBAEnC,EACAC,UAAW,SAAmBJ,QAC5B,OAAOA,QAAUK,QAAQL,OAAOM,iBAClC,EACAC,gBAAiB,SAAyBN,MACxC,IAAIlE,EAAI1B,KAAK2F,OAAOC,MACpB,GAAI5F,KAAK+F,UAAUrE,GACjB,OAAOA,CAEX,EACAyE,YAAa,SAAqBR,QAChC,IAAIS,GAAKT,OAAOU,gBAChB,IAAKD,GAAI,CACP,IAAIE,GAAKX,OAAOY,cAAc,UAC1BD,KACFF,GAAKE,GAAGD,gBAEZ,CACA,OAAOD,EACT,EACAI,WAAY,SAAoBxE,SAG9B,IAFA,IAAIyE,QAAU,GACV/E,EAAI1B,KAAK2F,OAAO3D,SACbN,GACL+E,QAAQ3E,KAAKJ,GACbA,EAAI1B,KAAKmG,YAAYzE,GAEvB,OAAO+E,OACT,EACAC,WAAY,SAAoBC,OAAQrJ,EAAG0B,GACzC,GAAI2H,OAAQ,CACV,IACIC,GAAIC,GADJrB,EAAImB,OAAOV,iBAAiB3I,EAAG0B,GAKnC,IADA6H,GAAK7G,KAAKkG,gBAAgBV,GACnBqB,IAAI,CAGT,GADAD,GAAKC,GAAGZ,iBAAiB3I,EAAG0B,GAIrB,CAEL,IAAI8H,IAAM9G,KAAKkG,gBAAgBU,IAC/B,OAAO5G,KAAK0G,WAAWI,IAAKxJ,EAAG0B,IAAM4H,EACvC,CALEC,GAAK7G,KAAKmG,YAAYU,GAM1B,CAGA,OAAOrB,CACT,CACF,EACAuB,MAAO,SAAe/E,SAIpB,IAHA,IAAIN,EAAIM,QAGDN,EAAEqD,YACPrD,EAAIA,EAAEqD,WAOR,OAHIrD,EAAEsF,WAAaC,KAAKC,eAAiBxF,EAAEsF,WAAaC,KAAKE,yBAC3DzF,EAAIrD,UAECqD,CACT,EACA0F,WAAY,SAAoB3E,SAC9B,IAAInF,EAAImF,QAAQ1D,QACZC,EAAIyD,QAAQxD,QAGZyC,EAAI1B,KAAK+G,MAAMtE,QAAQkB,QAM3B,OAHKjC,EAAEuE,iBAAiB3I,EAAG0B,KACzB0C,EAAIrD,UAEC2B,KAAK0G,WAAWhF,EAAGpE,EAAG0B,EAC/B,GAEEc,QAAUuH,MAAM5J,UAAUqC,QAAQnC,KAAKkE,KAAKwF,MAAM5J,UAAUqC,SAC5DwH,IAAMD,MAAM5J,UAAU6J,IAAI3J,KAAKkE,KAAKwF,MAAM5J,UAAU6J,KACpDC,QAAUF,MAAM5J,UAAU+J,MAAM7J,KAAKkE,KAAKwF,MAAM5J,UAAU+J,OAC1DC,OAASJ,MAAM5J,UAAUgK,OAAO9J,KAAKkE,KAAKwF,MAAM5J,UAAUgK,QAC1DC,GAAKxK,OAAOyK,kBAAoBzK,OAAO0K,uBACvCC,SAAW,iBACXC,cAAgB,CAClBC,SAAS,EACTC,WAAW,EACXC,YAAY,EACZC,mBAAmB,EACnBC,gBAAiB,CAAC,iBAEpB,SAASC,UAAUC,IAAKC,OAAQC,QAASC,QACvCxI,KAAKyI,YAAcJ,IAAIxG,KAAK2G,QAC5BxI,KAAK0I,eAAiBJ,OAAOzG,KAAK2G,QAClCxI,KAAK2I,gBAAkBJ,QAAQ1G,KAAK2G,QAChCd,KACF1H,KAAK4I,SAAW,IAAIlB,GAAG1H,KAAK6I,gBAAgBhH,KAAK7B,OAErD,CA8EA,SAAS8I,eAAezI,GACtB,MAAO,sBAAwB0I,SAAS1I,EAC1C,CACA,SAAS0I,SAAS1I,GAChB,MAAO,kBAAoBA,EAAI,IACjC,CACA,SAAS2I,KAAK3I,GACZ,MAAO,uBAAyBA,EAAI,mBAAqBA,EAAI,KAC/D,CArFA+H,UAAU3K,UAAY,CACpBwL,aAAc,SAAsBtF,QAQ9B3D,KAAK4I,UAAYlD,UAAUK,UAAUpC,SACvC3D,KAAK4I,SAASM,QAAQvF,OAAQmE,cAElC,EACAqB,gBAAiB,SAAyBxF,QACxC3D,KAAKiJ,aAAatF,QACdA,SAAWtF,UAAoC,aAAxBA,SAAS+K,WAClCpJ,KAAKqJ,gBAELrJ,KAAKsJ,kBAAkB3F,OAE3B,EACA2F,kBAAmB,SAA2B3F,QAC5C7D,QAAQE,KAAKuJ,aAAa5F,QAAS3D,KAAKwJ,WAAYxJ,KACtD,EACAuJ,aAAc,SAAsB5F,QAClC,OAAIA,OAAO8F,iBACF9F,OAAO8F,iBAAiB5B,UAE1B,EACT,EACA6B,cAAe,SAAuBC,IACpC3J,KAAK0I,eAAeiB,GACtB,EACAH,WAAY,SAAoBG,IAC9B3J,KAAKyI,YAAYkB,GACnB,EACAC,eAAgB,SAAwBD,GAAIE,UAC1C7J,KAAK2I,gBAAgBgB,GAAIE,SAC3B,EACAC,YAAa,SAAqBC,MAAOC,MACvC,OAAOD,MAAME,OAAO1C,QAAQyC,MAC9B,EAEAX,cAAe,WACbhL,SAAS2F,iBAAiB,mBAAoB,WAChB,aAAxB3F,SAAS+K,YACXpJ,KAAKsJ,kBAAkBjL,SAE3B,EAAEwD,KAAK7B,MACT,EACAkK,UAAW,SAAmBC,GAC5B,OAAOA,EAAEnD,WAAaC,KAAKmD,YAC7B,EACAC,oBAAqB,SAA6BC,SAEhD,IAAIC,KAAOjD,IAAIgD,QAAStK,KAAKuJ,aAAcvJ,MAM3C,OAHAuK,KAAKzI,KAAK2F,OAAO6C,QAAStK,KAAKkK,YAGxBK,KAAKC,OAAOxK,KAAK8J,YAAa,GACvC,EACAjB,gBAAiB,SAAyB4B,WACxCA,UAAU3K,QAAQE,KAAK0K,gBAAiB1K,KAC1C,EACA0K,gBAAiB,SAAyBC,GACzB,cAAXA,EAAEnH,MACQxD,KAAKqK,oBAAoBM,EAAEC,YACjC9K,QAAQE,KAAKwJ,WAAYxJ,MACjBA,KAAKqK,oBAAoBM,EAAEE,cACjC/K,QAAQE,KAAK0J,cAAe1J,OAChB,eAAX2K,EAAEnH,MACXxD,KAAK4J,eAAee,EAAEhH,OAAQgH,EAAEd,SAEpC,GAWF,IAAIiB,WAAa,CAAC,OAAQ,OAAQ,QAAS,QAAS,CAClD9B,KAAM,cACN+B,UAAW,CAAC,cAAe,iBAEzBC,OAAS,GAGTC,YAAc/N,OAAOc,cAAgBd,OAAOgO,eAG5CC,eAAiBjO,OAAOkO,mBAAqB/M,SAASgN,KAAKC,iBAC/D,SAASC,uBACP,GAAIN,YAAa,CACfH,WAAWhL,SAAQ,SAAU0L,GACvBC,OAAOD,KAAOA,GAChBR,QAAUjC,SAASyC,GAAKxC,KAAKwC,GAAK,KAC9BL,gBACFH,QAAUlC,eAAe0C,GAAKxC,KAAKwC,GAAK,QAG1CR,QAAUQ,EAAET,UAAUzD,IAAIyB,UAAYC,KAAKwC,EAAExC,MAAQ,KACjDmC,gBACFH,QAAUQ,EAAET,UAAUzD,IAAIwB,gBAAkBE,KAAKwC,EAAExC,MAAQ,MAGjE,IACA,IAAIW,GAAKtL,SAASqN,cAAc,SAChC/B,GAAGgC,YAAcX,OACjB3M,SAASgN,KAAKO,YAAYjC,GAC5B,CACF,CACA,IAAIzI,WAAaD,WAAWC,WAGxB2K,WAAa,GAGbC,kBAAoB,CAAC,EAAG,EAAG,EAAG,EAAG,IACjCC,aAAc,EAClB,IACEA,YAEe,IAFD,IAAIC,WAAW,OAAQ,CACnCnN,QAAS,IACRA,OACL,CAAE,MAAOT,GAAI,CAGb,IAkJI6N,UAlJAC,YAAc,CAChBC,WAAY,EACZC,aAAc,QACdxK,OAAQ,CAAC,YAAa,YAAa,UAAW,YAAa,YAC3DG,SAAU,SAAkB4B,QAC1B1C,WAAWyC,OAAOC,OAAQ3D,KAAK4B,OACjC,EACAO,WAAY,SAAoBwB,QAC9B1C,WAAW4C,SAASF,OAAQ3D,KAAK4B,OACnC,EACAyK,YAAa,GAEbC,0BAA2B,SAAmC7J,SAI5D,IAHA,IAGgC+C,EAH5B+G,IAAMvM,KAAKqM,YACX/O,EAAImF,QAAQ1D,QACZC,EAAIyD,QAAQxD,QACPN,EAAI,EAAGuD,EAAIqK,IAAI3N,OAAWD,EAAIuD,IAAMsD,EAAI+G,IAAI5N,IAAKA,IAAK,CAE7D,IAAI6N,GAAKC,KAAKC,IAAIpP,EAAIkI,EAAElI,GACpBqP,GAAKF,KAAKC,IAAI1N,EAAIwG,EAAExG,GACxB,GAAIwN,IAAMX,YAAcc,IAAMd,WAC5B,OAAO,CAEX,CACF,EACAe,aAAc,SAAsBnK,SAClC,IAAIrE,EAAI6C,WAAWuD,WAAW/B,SAG1BoK,GAAKzO,EAAEiG,eAQX,OAPAjG,EAAEiG,eAAiB,WACjB5B,QAAQ4B,iBACRwI,IACF,EACAzO,EAAEc,UAAYc,KAAKmM,WACnB/N,EAAEuB,WAAY,EACdvB,EAAEqB,YAAcO,KAAKoM,aACdhO,CACT,EACA0O,sBAAuB,SAA+B1O,EAAGqE,SACvD,IAAI/D,EAAIwC,WAAWV,IAAIR,KAAKmM,YAGN,IAAlB1J,QAAQsK,OAAgBrO,EAG1BN,EAAES,QAAUH,EAAEG,QAFdT,EAAES,QAAU,EAId4D,QAAQ5D,QAAUT,EAAES,OACtB,EACAmO,UAAW,SAAmBvK,SAC5B,IAAKzC,KAAKsM,0BAA0B7J,SAAU,CAC5C,IAAI/D,EAAIwC,WAAWV,IAAIR,KAAKmM,YACxB/N,EAAI4B,KAAK4M,aAAanK,SACrBsJ,cACH3N,EAAES,QAAUiN,kBAAkB1N,EAAE6O,QAC5BvO,IACFN,EAAES,SAAWH,EAAEG,SAEjB4D,QAAQ5D,QAAUT,EAAES,SAEtBqC,WAAWf,IAAIH,KAAKmM,WAAY1J,SAC3B/D,GAAmB,IAAdA,EAAEG,QAGVoC,WAAW0B,KAAKvE,GAFhB6C,WAAWuB,KAAKpE,EAIpB,CACF,EACA8O,UAAW,SAAmBzK,SAC5B,IAAKzC,KAAKsM,0BAA0B7J,SAAU,CAC5C,IAAIrE,EAAI4B,KAAK4M,aAAanK,SACrBsJ,aACH/L,KAAK8M,sBAAsB1O,EAAGqE,SAEhCrE,EAAE6O,QAAU,EACZ/L,WAAWf,IAAIH,KAAKmM,WAAY1J,SAChCxB,WAAW0B,KAAKvE,EAClB,CACF,EACA+O,QAAS,SAAiB1K,SACxB,IAAKzC,KAAKsM,0BAA0B7J,SAAU,CAC5C,IAAI/D,EAAIwC,WAAWV,IAAIR,KAAKmM,YACxB/N,EAAI4B,KAAK4M,aAAanK,SAC1B,IAAKsJ,YAAa,CAChB,IAAInJ,GAAKkJ,kBAAkB1N,EAAE6O,QAK7B7O,EAAES,QAAUH,EAAIA,EAAEG,SAAW+D,GAAK,EAClCH,QAAQ5D,QAAUT,EAAES,OACtB,CACAqC,WAAWf,IAAIH,KAAKmM,WAAY1J,SAMhCrE,EAAES,UAAYiN,kBAAkB1N,EAAE6O,QAChB,IAAd7O,EAAES,QACJoC,WAAW2B,GAAGxE,GAEd6C,WAAW0B,KAAKvE,EAEpB,CACF,EACAgP,UAAW,SAAmB3K,SAC5B,IAAKzC,KAAKsM,0BAA0B7J,SAAU,CAC5C,IAAIrE,EAAI4B,KAAK4M,aAAanK,SACrBsJ,aACH/L,KAAK8M,sBAAsB1O,EAAGqE,SAEhCrE,EAAE6O,QAAU,EACZ/L,WAAWf,IAAIH,KAAKmM,WAAY1J,SAChCxB,WAAWoC,UAAUjF,EACvB,CACF,EACAiP,SAAU,SAAkB5K,SAC1B,IAAKzC,KAAKsM,0BAA0B7J,SAAU,CAC5C,IAAIrE,EAAI4B,KAAK4M,aAAanK,SACrBsJ,aACH/L,KAAK8M,sBAAsB1O,EAAGqE,SAEhCrE,EAAE6O,QAAU,EACZhM,WAAWiC,SAAS9E,EACtB,CACF,EACA6E,OAAQ,SAAgBR,SACtB,IAAIrE,EAAI4B,KAAK4M,aAAanK,SAC1BxB,WAAWgC,OAAO7E,GAClB4B,KAAKsN,iBACP,EACAA,gBAAiB,WACfpM,WAAmB,OAAElB,KAAKmM,WAC5B,GAEE/K,YAAcH,WAAWG,YACzBgG,WAAa1B,UAAU0B,WAAWvF,KAAK6D,WACvCc,WAAad,UAAUc,WAAW3E,KAAK6D,WACvC6H,aAAetM,WAAWC,WAG1BsM,cAAgB,KAChBC,oBAAsB,IACtBC,OAAS,eAITC,YAAc,CAChB/L,OAAQ,CAAC,aAAc,YAAa,WAAY,eAChDG,SAAU,SAAkB4B,QAC1BsI,UAAU9C,gBAAgBxF,OAC5B,EACAxB,WAAY,WAGZ,EACAyL,aAAc,SAAsBjE,IAClC,IAAIkE,EAAIlE,GAAGmE,aAAaJ,QACpB9G,GAAK5G,KAAK+N,wBAAwBF,GAClCjH,KACF+C,GAAGqE,YAAcpH,GACjB3F,WAAWyC,OAAOiG,GAAI3J,KAAK4B,QAG3B4E,WAAWmD,IAAI7J,SAAQ,SAAU4B,GAC/BA,EAAEsM,YAAcpH,GAChB3F,WAAWyC,OAAOhC,EAAG1B,KAAK4B,OAC5B,GAAG5B,MAEP,EACAiO,eAAgB,SAAwBtE,IACtCA,GAAGqE,iBAAc1N,EACjBW,WAAW4C,SAAS8F,GAAI3J,KAAK4B,QAG7B4E,WAAWmD,IAAI7J,SAAQ,SAAU4B,GAC/BA,EAAEsM,iBAAc1N,EAChBW,WAAW4C,SAASnC,EAAG1B,KAAK4B,OAC9B,GAAG5B,KACL,EACA4J,eAAgB,SAAwBD,GAAIE,UAC1C,IAAIgE,EAAIlE,GAAGmE,aAAaJ,QACpB9G,GAAK5G,KAAK+N,wBAAwBF,GAClCK,MAAQlO,KAAK+N,wBAAwBlE,UAGrCjD,IAAMsH,OACRvE,GAAGqE,YAAcpH,GACjBJ,WAAWmD,IAAI7J,SAAQ,SAAU4B,GAC/BA,EAAEsM,YAAcpH,EAClB,GAAG5G,OACMkO,MACTlO,KAAKiO,eAAetE,IACX/C,IACT5G,KAAK4N,aAAajE,GAEtB,EACAwE,YAAa,CACXC,QAAS,OACTC,UAAW,QACXC,UAAW,QACXC,SAAU,0CAEZR,wBAAyB,SAAiCS,aACxD,IAAIhJ,EAAIgJ,YACJ5H,GAAK5G,KAAKmO,YACd,MAAU,SAAN3I,EACK,OACEA,IAAMoB,GAAGyH,UACX,IACE7I,IAAMoB,GAAG0H,UACX,IACE1H,GAAG2H,SAASE,KAAKjJ,GACnB,UADF,CAGT,EACA4G,aAAc,QACdsC,WAAY,KACZC,eAAgB,SAAwBC,SACtC,OAAO5O,KAAK0O,aAAeE,QAAQC,UACrC,EACAC,gBAAiB,SAAyBF,UAEd,IAAtBrB,aAAarN,MAAoC,IAAtBqN,aAAarN,MAAcqN,aAAahN,IAAI,MACzEP,KAAK0O,WAAaE,QAAQC,WAC1B7O,KAAK+O,QAAU,CACbC,EAAGJ,QAAQ7P,QACXkQ,EAAGL,QAAQ3P,SAEbe,KAAKkP,WAAY,EACjBlP,KAAKmP,wBAET,EACAC,qBAAsB,SAA8BC,WAC9CA,UAAU1P,YACZK,KAAK0O,WAAa,KAClB1O,KAAK+O,QAAU,KACf/O,KAAKsP,kBAET,EACAC,WAAY,EACZC,QAAS,KACTF,gBAAiB,WACf,IAAI7L,GAAK,WACPzD,KAAKuP,WAAa,EAClBvP,KAAKwP,QAAU,IACjB,EAAE3N,KAAK7B,MACPA,KAAKwP,QAAUC,WAAWhM,GAAIgK,oBAChC,EACA0B,sBAAuB,WACjBnP,KAAKwP,SACPE,aAAa1P,KAAKwP,QAEtB,EACAG,cAAe,SAAuBnM,MACpC,IAAIoM,IAAM,EAIV,MAHa,eAATpM,MAAkC,cAATA,OAC3BoM,IAAM,GAEDA,GACT,EACAC,eAAgB,SAAwBjB,SACtC,IAAIkB,IAAM9P,KAAK+P,kBACX3R,EAAI6C,WAAWuD,WAAWoK,SAK1BoB,GAAK5R,EAAEc,UAAY0P,QAAQC,WAAa,EAC5CzQ,EAAEuF,OAASvC,YAAY4O,KAAO5I,WAAWhJ,GACzCA,EAAEI,SAAU,EACZJ,EAAEK,YAAa,EACfL,EAAE6R,OAASjQ,KAAKuP,WAChBnR,EAAE6O,OAAS,EACX7O,EAAES,QAAUmB,KAAK2P,cAAcG,IAAItM,MACnCpF,EAAEe,MAA0D,GAAjDyP,QAAQsB,SAAWtB,QAAQuB,eAAiB,GACvD/R,EAAEgB,OAA2D,GAAjDwP,QAAQwB,SAAWxB,QAAQyB,eAAiB,GACxDjS,EAAEU,SAAW8P,QAAQ0B,OAAS1B,QAAQ2B,aAAe,GACrDnS,EAAEuB,UAAYK,KAAK2O,eAAeC,SAClCxQ,EAAEqB,YAAcO,KAAKoM,aAGrBhO,EAAEoS,OAASV,IAAIU,OACfpS,EAAEqS,QAAUX,IAAIW,QAChBrS,EAAEsS,QAAUZ,IAAIY,QAChBtS,EAAEuS,SAAWb,IAAIa,SAGjB,IAAIvT,KAAO4C,KAMX,OALA5B,EAAEiG,eAAiB,WACjBjH,KAAK8R,WAAY,EACjB9R,KAAK2R,QAAU,KACfe,IAAIzL,gBACN,EACOjG,CACT,EACAwS,eAAgB,SAAwBnO,QAASoO,YAC/C,IAAIC,GAAKrO,QAAQsO,eACjB/Q,KAAK+P,kBAAoBtN,QACzB,IAAK,IAAW+C,EAAP7G,EAAI,EAAMA,EAAImS,GAAGlS,OAAQD,IAChC6G,EAAIsL,GAAGnS,GACPkS,WAAWlT,KAAKqC,KAAMA,KAAK6P,eAAerK,GAE9C,EAGAwL,aAAc,SAAsBvO,SAClC,GAAIzC,KAAK+O,QAAS,CAChB,IAAIa,IACAqB,WAAaxO,QAAQyO,cAAclD,YACvC,GAAmB,SAAfiD,WAEFrB,KAAM,OACD,GAAmB,OAAfqB,WAETrB,KAAM,MACD,CACL,IAAIpK,EAAI/C,QAAQsO,eAAe,GAG3BlD,EAAIoD,WACJE,GAAoB,MAAfF,WAAqB,IAAM,IAMpCrB,IALSnD,KAAKC,IAAIlH,EAAE,SAAWqI,GAAK7N,KAAK+O,QAAQlB,KACvCpB,KAAKC,IAAIlH,EAAE,SAAW2L,IAAMnR,KAAK+O,QAAQoC,IAKrD,CAEA,OADAnR,KAAK+O,QAAU,KACRa,GACT,CACF,EACAwB,UAAW,SAAmBC,KAAMC,MAClC,IAAK,IAA4B9L,EAAxB7G,EAAI,EAAGuD,EAAImP,KAAKzS,OAAWD,EAAIuD,IAAMsD,EAAI6L,KAAK1S,IAAKA,IAC1D,GAAI6G,EAAEqJ,aAAeyC,KACnB,OAAO,CAGb,EAOAC,cAAe,SAAuB9O,SACpC,IAAIqO,GAAKrO,QAAQ+O,QAIjB,GAAIjE,aAAarN,MAAQ4Q,GAAGlS,OAAQ,CAClC,IAAI6S,EAAI,GACRlE,aAAazN,SAAQ,SAAU4R,MAAOC,KAIpC,GAAY,IAARA,MAAc3R,KAAKoR,UAAUN,GAAIa,IAAM,GAAI,CAC7C,IAAIjT,EAAIgT,MAAM1O,IACdyO,EAAE3P,KAAKpD,EACT,CACF,GAAGsB,MACHyR,EAAE3R,QAAQE,KAAK4R,UAAW5R,KAC5B,CACF,EACA6R,WAAY,SAAoBpP,SAC9BzC,KAAKuR,cAAc9O,SACnBzC,KAAK8O,gBAAgBrM,QAAQsO,eAAe,IAC5C/Q,KAAK8R,gBAAgBrP,SAChBzC,KAAKkP,YACRlP,KAAKuP,aACLvP,KAAK4Q,eAAenO,QAASzC,KAAK+R,UAEtC,EACAA,SAAU,SAAkB1C,WAC1B9B,aAAapN,IAAIkP,UAAUnQ,UAAW,CACpCyE,OAAQ0L,UAAU1L,OAClBX,IAAKqM,UACL2C,UAAW3C,UAAU1L,SAEvB1C,WAAWoC,UAAUgM,WACrBpO,WAAWuB,KAAK6M,UAClB,EACA4C,UAAW,SAAmBxP,SACvBzC,KAAKkP,YACJlP,KAAKgR,aAAavO,UACpBzC,KAAKkP,WAAY,EACjBlP,KAAKkS,YAAYzP,WAEjBA,QAAQ4B,iBACRrE,KAAK4Q,eAAenO,QAASzC,KAAKmS,cAGxC,EACAA,YAAa,SAAqB9C,WAChC,IAAIlM,MAAQkM,UACR+C,QAAU7E,aAAa/M,IAAI2C,MAAMjE,WAGrC,GAAKkT,QAAL,CAGA,IAAIC,SAAWD,QAAQpP,IACnBgP,UAAYI,QAAQJ,UACxB/Q,WAAW0B,KAAKQ,OACZkP,UAAYL,YAAc7O,MAAMQ,SAClC0O,SAASjO,cAAgBjB,MAAMQ,OAC/BR,MAAMiB,cAAgB4N,UAGtBK,SAAS1O,OAASqO,UACd7O,MAAMQ,QACR1C,WAAWiC,SAASmP,UACpBpR,WAAWoC,UAAUF,SAGrBA,MAAMQ,OAASqO,UACf7O,MAAMiB,cAAgB,KACtBpE,KAAK4R,UAAUzO,SAGnBiP,QAAQpP,IAAMG,MACdiP,QAAQJ,UAAY7O,MAAMQ,MArB1B,CAsBF,EACA2O,SAAU,SAAkB7P,SAC1BzC,KAAK8R,gBAAgBrP,SACrBzC,KAAK4Q,eAAenO,QAASzC,KAAKuS,MACpC,EACAA,MAAO,SAAelD,WACfrP,KAAKkP,YACRjO,WAAW2B,GAAGyM,WACdpO,WAAWiC,SAASmM,YAEtBrP,KAAKwS,eAAenD,UACtB,EACA6C,YAAa,SAAqBzP,SAChCzC,KAAK4Q,eAAenO,QAASzC,KAAK4R,UACpC,EACAA,UAAW,SAAmBvC,WAC5BpO,WAAWgC,OAAOoM,WAClBpO,WAAWiC,SAASmM,WACpBrP,KAAKwS,eAAenD,UACtB,EACAmD,eAAgB,SAAwBnD,WACtC9B,aAAqB,OAAE8B,UAAUnQ,WACjCc,KAAKoP,qBAAqBC,UAC5B,EAEAyC,gBAAiB,SAAyBrP,SACxC,IAAI8J,IAAML,YAAYG,YAClB7G,EAAI/C,QAAQsO,eAAe,GAG/B,GAAI/Q,KAAK2O,eAAenJ,GAAI,CAE1B,IAAIiN,GAAK,CACPnV,EAAGkI,EAAEzG,QACLC,EAAGwG,EAAEvG,SAEPsN,IAAIzK,KAAK2Q,IACT,IAAIhP,GAAK,SAAU8I,IAAKkG,IACtB,IAAI9T,EAAI4N,IAAImG,QAAQD,IAChB9T,GAAK,GACP4N,IAAIoG,OAAOhU,EAAG,EAElB,EAAEkD,KAAK,KAAM0K,IAAKkG,IAClBhD,WAAWhM,GAAI+J,cACjB,CACF,GAEFvB,UAAY,IAAI7D,UAAUuF,YAAYC,aAAcD,YAAYM,eAAgBN,YAAY/D,eAAgB+D,aAC5G,IAmFIjM,EACA8J,EACAoH,EArFAC,aAAe5R,WAAWC,WAC1B4R,gBAAkB5V,OAAOgO,gBAAwE,iBAA/ChO,OAAOgO,eAAe6H,qBACxEC,SAAW,CACbpR,OAAQ,CAAC,gBAAiB,gBAAiB,cAAe,eAAgB,gBAAiB,kBAAmB,sBAAuB,wBACrIG,SAAU,SAAkB4B,QAC1B1C,WAAWyC,OAAOC,OAAQ3D,KAAK4B,OACjC,EACAO,WAAY,SAAoBwB,QAC9B1C,WAAW4C,SAASF,OAAQ3D,KAAK4B,OACnC,EACAqR,cAAe,CAAC,GAAI,cAAe,QAAS,MAAO,SACnDrG,aAAc,SAAsBnK,SAClC,IAAIrE,EAAIqE,QAKR,OAJIqQ,mBACF1U,EAAI6C,WAAWuD,WAAW/B,UACxBhD,YAAcO,KAAKiT,cAAcxQ,QAAQhD,cAEtCrB,CACT,EACA8U,QAAS,SAAiBlD,IACxB6C,aAAqB,OAAE7C,GACzB,EACAmD,cAAe,SAAuB1Q,SACpCoQ,aAAa1S,IAAIsC,QAAQvD,UAAWuD,SACpC,IAAIrE,EAAI4B,KAAK4M,aAAanK,SAC1BxB,WAAWuB,KAAKpE,EAClB,EACAgV,cAAe,SAAuB3Q,SACpC,IAAIrE,EAAI4B,KAAK4M,aAAanK,SAC1BxB,WAAW0B,KAAKvE,EAClB,EACAiV,YAAa,SAAqB5Q,SAChC,IAAIrE,EAAI4B,KAAK4M,aAAanK,SAC1BxB,WAAW2B,GAAGxE,GACd4B,KAAKkT,QAAQzQ,QAAQvD,UACvB,EACAoU,aAAc,SAAsB7Q,SAClC,IAAIrE,EAAI4B,KAAK4M,aAAanK,SAC1BxB,WAAWiC,SAAS9E,EACtB,EACAmV,cAAe,SAAuB9Q,SACpC,IAAIrE,EAAI4B,KAAK4M,aAAanK,SAC1BxB,WAAWoC,UAAUjF,EACvB,EACAoV,gBAAiB,SAAyB/Q,SACxC,IAAIrE,EAAI4B,KAAK4M,aAAanK,SAC1BxB,WAAWgC,OAAO7E,GAClB4B,KAAKkT,QAAQzQ,QAAQvD,UACvB,EACAuU,qBAAsB,SAA8BhR,SAClD,IAAIrE,EAAI6C,WAAWkD,UAAU,qBAAsB1B,SACnDxB,WAAWsD,cAAcnG,EAC3B,EACAsV,oBAAqB,SAA6BjR,SAChD,IAAIrE,EAAI6C,WAAWkD,UAAU,oBAAqB1B,SAClDxB,WAAWsD,cAAcnG,EAC3B,GAEF,SAASuV,gBAEP,IAAKzW,OAAOc,aAAc,CAExB,GADAd,OAAOc,aAAeA,aAClBd,OAAO0W,UAAUC,iBAAkB,CACrC,IAAIC,GAAK5W,OAAO0W,UAAUG,iBAC1BvW,OAAOwW,eAAe9W,OAAO0W,UAAW,iBAAkB,CACxDlC,MAAOoC,GACPG,YAAY,IAEdhT,WAAWM,eAAe,KAAMyR,SAClC,MACExV,OAAOwW,eAAe9W,OAAO0W,UAAW,iBAAkB,CACxDlC,MAAO,EACPuC,YAAY,IAEdhT,WAAWM,eAAe,QAAS2K,kBACP5L,IAAxBpD,OAAOgX,cACTjT,WAAWM,eAAe,QAASoM,aAGvC1M,WAAWc,SAAS1D,SACtB,CACF,CAKA,SAAS8V,aAAanE,IACpB,IAAK/O,WAAWC,WAAWX,IAAIyP,IAAK,CAClC,IAAIoE,MAAQ,IAAIC,MAAM,oBAEtB,MADAD,MAAM5S,KAAO,mBACP4S,KACR,CACF,CACA,SAASE,gBAAgBC,MAEvB,IADA,IAAIC,OAASD,KAAKxP,WACXyP,QAAUA,SAAWD,KAAKE,eAC/BD,OAASA,OAAOzP,WAElB,IAAKyP,OAAQ,CACX,IAAIJ,MAAQ,IAAIC,MAAM,qBAEtB,MADAD,MAAM5S,KAAO,oBACP4S,KACR,CACF,CACA,SAASM,oBAAoB1E,IAE3B,OAAqB,IADb/O,WAAWC,WAAWV,IAAIwP,IACzBnR,OACX,CA+BA,SAAS8V,kBACHzX,OAAO0X,UAAYA,QAAQnX,UAAUoX,mBACvCrX,OAAOsX,iBAAiBF,QAAQnX,UAAW,CACzC,kBAAqB,CACnBiU,MAAOhQ,GAET,sBAAyB,CACvBgQ,MAAOlG,GAET,kBAAqB,CACnBkG,MAAOkB,IAIf,CAWA,OAjFQ1V,OAAO0W,UA0BTC,kBACJnS,EAAI,SAAWxC,WACbiV,aAAajV,WACboV,gBAAgBtU,MACZ0U,oBAAoBxV,aACtB+B,WAAWgE,WAAW/F,UAAWc,MAAM,GACvCA,KAAK+U,oBAAoB7V,WAE7B,EACAsM,EAAI,SAAWtM,WACbiV,aAAajV,WACb+B,WAAWoE,eAAenG,WAAW,GACrCc,KAAKgV,wBAAwB9V,UAC/B,IAEAwC,EAAI,SAA2BxC,WAC7BiV,aAAajV,WACboV,gBAAgBtU,MACZ0U,oBAAoBxV,YACtB+B,WAAWgE,WAAW/F,UAAWc,KAErC,EACAwL,EAAI,SAA+BtM,WACjCiV,aAAajV,WACb+B,WAAWoE,eAAenG,UAC5B,GAEF0T,EAAI,SAA2B1T,WAC7B,QAAS+B,WAAWG,YAAYlC,UAClC,EAgBAqM,uBACAoI,gBACAgB,kBACoB,CAClB1T,WACAmH,UACApK,aACA4B,WACAqV,cAAevP,UAGnB,CA7vCmBwP,EA8vCpB,CAhwCD,CANU,CAACrX,QAAS,CAAC,IAywCrB,IAmQI+D,OAASpE,OAAO2X,OAAO,CACzBC,SAAU,CACRC,oBArQuB,wBAsQvBC,WArQc,cAsQdC,SA/PY,gBAgQZC,YA/Pe,mBAgQfC,WA/PsB,kBAgQtBC,WAxQc,cAyQdC,cAxQiB,iBAyQjBC,MAxQS,QAyQTC,UAxQkB,aAyQlBC,4BAxQ+B,kCAyQ/BC,cAxQiB,kBAyQjBC,2BAtP8B,iBAuP9BC,eAtPkB,iBAuPlBC,sBAtPyB,WAuPzBC,YArHe,mBAsHfC,WArHc,kBAsHdC,oBAjIuB,2BAkIvBC,oBAhIuB,2BAiIvBC,mBApMsB,0BAqMtBC,eApMkB,sBAqMlBC,mBA9Q2B,0BA+Q3BC,oBA9Q4B,2BA+Q5BC,qBA9Q6B,iCA+Q7BC,sBA9Q8B,kCA+Q9BC,aA9QwB,oBA+QxBC,kBA9QqB,yBA+QrBC,iBA9QoB,wBA+QpBC,kBA9QqB,yBA+QrBC,mBA9QsB,0BA+QtBC,eA9QkB,sBA+QlBC,gBA9QmB,uBA+QnBC,cA9QiB,sBAgRnBC,cAAe,CACbC,eAvQkB,YAwQlBC,oBAvQuB,iBAwQvBC,gBAvQmB,aAwQnBC,aAvQwB,UAwQxBC,oBAvQuB,iBAwQvBC,aAvQgB,UAwQhBC,aAvQgB,UAwQhBC,aAvQgB,UAwQhBC,YAvQe,SAwQfC,WAvQc,QAwQdlC,UAvQa,OAwQbmC,WAvQc,QAwQdC,YAvQe,SAwQfC,WAvQc,QAwQdC,kBAvQqB,eAwQrBC,oBAvQuB,iBAwQvBC,gBAvQmB,aAwQnBC,gBAvQmB,aAwQnBC,cAvQiB,YAyQnBC,OAAQ,CACNC,mBA/PsB,0BAgQtBC,qBA/PwB,6BAiQ1BC,SAAU,CACRC,UA/PoB,wBAgQpBC,UA/PoB,wBAgQpBC,iBA9PoB,wBA+PpBC,iBAhQoB,wBAiQpBC,YA/Pe,mBAgQfC,QA/PW,eAgQXC,QA/PW,eAgQXC,UA/Pa,iBAgQbC,QA/PqB,uBAgQrBC,OA/PkB,sBAgQlBC,QA/PmB,uBAgQnBC,eAnJkB,sBAoJlBC,WAhQc,iBAiQdC,mBAhQsB,yBAiQtB5C,aAhQgB,oBAiQhB6C,YAhQe,mBAiQfC,kBAhQ6B,yBAiQ7BC,uBAhQ0B,8BAiQ1BC,uBAhQ0B,8BAiQ1BC,oBA9PuB,2BA+PvBC,kBA9PqB,yBA+PrBC,qBA9PwB,6BA+PxBC,kBA9PqB,yBA+PrBC,sBA9PyB,6BA+PzBC,kBA9PqB,yBA+PrBC,kBA9PqB,yBA+PrBC,eA9PkB,sBA+PlBC,uBA9P0B,8BA+P1BC,uBA9P0B,8BA+P1BC,sBA9PyB,6BA+PzBC,qBA9PwB,4BA+PxBC,oBA9PuB,2BA+PvBC,gBA9PmB,uBA+PnBC,cA9PiB,qBA+PjBC,kBA9PqB,yBA+PrBC,mBA9PsB,0BA+PtBrE,mBA9PsB,0BA+PtBC,oBA9PuB,4BAgQzBqE,SAAU,CACRC,OAlLiB,qBAmLjBC,OAlLiB,qBAmLjBC,WAjLqB,yBAkLrBC,aAjLuB,4BAmLzBC,MAAO,CACLC,KApUa,OAqUbC,QA1UgB,UA2UhBC,MArUc,QAsUdC,WAvQmB,uBAwQnBC,OAvQe,mBAwQfC,IAvQY,gBAwQZC,MA5Tc,QA6TdC,QA9TgB,UA+ThBC,QA7TgB,UA8ThBC,QA7TgB,UA8ThBC,SAtUiB,WAuUjBC,kBAtUqB,oBAuUrBC,cAtUiB,gBAuUjBC,cAtUiB,qBAuUjBC,UA/Qa,iBAgRbC,cA/QiB,qBAgRjBC,gBA/QmB,uBAgRnBC,UAzUa,mBA0UbjI,MAhRc,mBAkRhBkI,OAAQ,CACNC,eAhRkB,kBAiRlBC,cAhRiB,kBAkRnBC,OAAQ,CACNC,YAhRqB,yBAiRrBC,aAhRsB,0BAiRtBC,aAhRsB,0BAiRtBC,qBAhRyB,+BAkR3BC,UAAW,CACTC,QAhRoB,wBAiRpBC,MAhRkB,uBAkRpBC,SAAU,CACRC,kBAhRqB,yBAiRrBnC,OAhRc,mBAiRdoC,SAhRgB,oBAiRhBC,OAhRc,kBAiRdC,MAhRa,iBAiRbC,aAhRoB,wBAiRpBC,KAhRY,gBAiRZC,YAhRmB,uBAiRnBpJ,MAhRa,iBAiRbqJ,OAhRc,kBAiRdC,mBAhR0B,0BAiR1BC,gBAhRuB,uBAiRvBC,UAhRiB,qBAiRjBC,2BAhRkC,sCAiRlCC,2BAhRkC,sCAiRlCjD,mBAhR0B,8BAiR1BkD,6BAhRgC,oCAiRhCC,SAhRY,gBAiRZC,YAhRe,mBAiRf7H,oBAhRuB,2BAiRvB8H,cAhRiB,qBAiRjBC,oBA/QuB,2BAgRvBC,qBA/QwB,4BAgRxBC,kBA/QqB,yBAgRrBC,wBA/Q2B,+BAgR3BC,0BA/Q6B,iCAgR7BC,gBA/QmB,uBAgRnBC,kBA/QqB,yBAgRrBC,WA7QkB,sBA8QlBC,WA7QkB,sBA8QlBC,UA7QiB,qBA8QjBC,SA7QgB,qBA+QlBC,SAAU,CACRC,QA7QmB,sBA8QnBC,YA7Qe,0BA8QfC,QA7QmB,sBA8QnBC,gBA7Q2B,uBA8Q3BC,UA7QqB,yBA8QrBC,QA7QmB,uBA8QnBC,QA7QmB,wBA+QrBC,eAAgB,CACdC,gBA7QmB,wBA+QrBC,iBAAkB,CAChBP,QA7Q2B,+BA8Q3BQ,OA7Q0B,+BA+Q5BC,OAAQ,CACNhG,kBAlQ0B,2BAmQ1BiG,aAlQqB,sBAmQrBC,oBAlQuB,wBAmQvBrI,gBAlQyB,oBAmQzBC,aAlQgB,iBAmQhBqI,mBAlQsB,yBAoQxBC,IAAK,CACHpG,kBAlPwB,qBAmPxBqG,aApPmB,gBAqPnBC,0BAnPgC,0BAoPhCC,iBAnPuB,qBAoPvBC,mBAnPyB,uBAoPzBC,oBAnP0B,wBAoP1BC,cAnPoB,iBAoPpB7K,YAnPkB,iBAoPlB8K,qBAnP2B,0BAoP3BC,sBAnP4B,2BAoP5BC,cAnPoB,0BAoPpBC,6BAnPwC,2BAoPxCC,2BAnPsC,2BAqPxCC,UAAW,CACTX,aAjRyB,gBAkRzBY,cAjR0B,iBAkR1BT,mBAjR+B,uBAkR/BC,oBAjRgC,wBAkRhCC,cAjR0B,iBAkR1B7K,YAjRwB,eAkRxByK,0BAjRsC,gCAkRtCC,iBAjR6B,qBAkR7BI,qBAjRiC,0BAkRjCC,sBAjRkC,2BAkRlCC,cAjR0B,iBAkR1BC,6BAjR8C,qCAkR9CC,2BAjR4C,2BAmR9CG,OAAQ,CACNC,MAlQe,cAmQfC,yBAlQ4B,2BAmQ5BC,uBAlQ0B,yBAmQ1BC,uBAlQ0B,yBAmQ1BC,qBAlQwB,wBAoQ1BC,QAAS,CACPC,SAlQmB,mBAoQrBC,OAAQ,CACNC,YAlQqB,eAmQrBjN,MAlQe,SAoQjBkN,OAAQ,CACNC,KA1Ta,iBA2TbC,OA1Te,oBA4TjBC,iBAAkB,CAChBF,KAtQqB,2BAuQrBC,OAtQqB,6BAuQrBE,QAtQsB,6BAwQxBC,MAAO,CACLC,YAtQoB,wBAuQpBC,qBAtQ6B,iCAuQ7BC,oCAtQ4C,gDAuQ5CC,cAtQsB,oBAuQtBC,gBAtQmB,6BAwQrBC,OAAQ,CACNC,YAtQqB,yBAuQrBC,aAtQsB,6BA0QtBC,4BAA8B7kB,OAAO2X,OAAO,CAC9CmN,aAAc,cACdC,MAAO,QACPC,2BAA4B,0BAC5BC,OAAQ,WAUNC,oBAAsB,CAPX,QACD,QACE,QACF,QACC,QACA,QACG,SAEdC,cAAgBnlB,OAAO2X,OAAO,CAChCyN,QATa,QAUbC,OATY,QAUZC,SATc,QAUdC,OATY,QAUZC,QATa,QAUbC,QATa,QAUbC,WATgB,QAUhBC,IAhBa,QAiBbC,IAhBY,QAiBZC,IAhBc,QAiBdC,IAhBY,QAiBZC,GAhBa,QAiBbC,GAhBa,QAiBbC,GAhBgB,QAiBhBC,QAAS,SAAiBC,UACxB,OAAOjB,oBAAoBkB,MAAK,SAAUC,mBACxC,OAAOA,oBAAsBF,QAC/B,GACF,IAGEG,wBAA0BtmB,OAAO2X,OAAO,CAC1C4O,SAAU,CACR,KAAQ,OACR,MAAS,QACTC,SAAU,WACVC,QAAS,aAIb,SAASC,UAAUC,GAGjB,OAAOD,UAAY,mBAAqBE,QAAU,iBAAmBA,OAAOC,SAAW,SAAUF,GAC/F,cAAcA,CAChB,EAAI,SAAUA,GACZ,OAAOA,GAAK,mBAAqBC,QAAUD,EAAEG,cAAgBF,QAAUD,IAAMC,OAAO3mB,UAAY,gBAAkB0mB,CACpH,EAAGD,UAAUC,EACf,CAWA,SAASI,SAAStkB,MAAOukB,UAIvB,IAHA,IAAIC,OAAS,EACX7lB,OAAkB,MAATqB,MAAgB,EAAIA,MAAMrB,OACnC8lB,OAASrd,MAAMzI,UACR6lB,MAAQ7lB,QACf8lB,OAAOD,OAASD,SAASvkB,MAAMwkB,OAAQA,MAAOxkB,OAEhD,OAAOykB,MACT,CA8CA,SAASC,GAAGjT,MAAOkT,OACjB,OAAOlT,QAAUkT,OAASlT,OAAUA,OAASkT,OAAUA,KACzD,CAUA,SAASC,aAAa5kB,MAAO0R,KAE3B,IADA,IAAI/S,OAASqB,MAAMrB,OACZA,UACL,GAAI+lB,GAAG1kB,MAAMrB,QAAQ,GAAI+S,KACvB,OAAO/S,OAGX,OAAQ,CACV,CAGA,IAGI+T,OAHatL,MAAM5J,UAGCkV,OAoFxB,SAASmS,UAAUC,SACjB,IAAIN,OAAS,EACX7lB,OAAoB,MAAXmmB,QAAkB,EAAIA,QAAQnmB,OAEzC,IADAoB,KAAKS,UACIgkB,MAAQ7lB,QAAQ,CACvB,IAAIomB,MAAQD,QAAQN,OACpBzkB,KAAKG,IAAI6kB,MAAM,GAAIA,MAAM,GAC3B,CACF,CAGAF,UAAUrnB,UAAUgD,MA9JpB,WACET,KAAKilB,SAAW,GAChBjlB,KAAKE,KAAO,CACd,EA4JA4kB,UAAUrnB,UAAkB,OArF5B,SAAyBkU,KACvB,IAAIuT,KAAOllB,KAAKilB,SACdR,MAAQI,aAAaK,KAAMvT,KAC7B,QAAI8S,MAAQ,KAIRA,OADYS,KAAKtmB,OAAS,EAE5BsmB,KAAKC,MAELxS,OAAOhV,KAAKunB,KAAMT,MAAO,KAEzBzkB,KAAKE,MACA,EACT,EAwEA4kB,UAAUrnB,UAAU+C,IA7DpB,SAAsBmR,KACpB,IAAIuT,KAAOllB,KAAKilB,SACdR,MAAQI,aAAaK,KAAMvT,KAC7B,OAAO8S,MAAQ,OAAInkB,EAAY4kB,KAAKT,OAAO,EAC7C,EA0DAK,UAAUrnB,UAAU8C,IA/CpB,SAAsBoR,KACpB,OAAOkT,aAAa7kB,KAAKilB,SAAUtT,MAAQ,CAC7C,EA8CAmT,UAAUrnB,UAAU0C,IAlCpB,SAAsBwR,IAAKD,OACzB,IAAIwT,KAAOllB,KAAKilB,SACdR,MAAQI,aAAaK,KAAMvT,KAO7B,OANI8S,MAAQ,KACRzkB,KAAKE,KACPglB,KAAKpjB,KAAK,CAAC6P,IAAKD,SAEhBwT,KAAKT,OAAO,GAAK/S,MAEZ1R,IACT,EAiFA,IAAIolB,WAAkF,gBAAlD,IAAX,oBAAAjoB,EAAyB,YAAc+mB,UAAU,oBAAA/mB,KAAwB,oBAAAA,GAAU,oBAAAA,EAAOK,SAAWA,QAAU,oBAAAL,EAGpIkoB,SAA4E,WAAhD,oBAATjoB,KAAuB,YAAc8mB,UAAU9mB,QAAsBA,MAAQA,KAAKI,SAAWA,QAAUJ,KAG1HkoB,KAAOF,YAAcC,UAAYE,SAAS,cAATA,GAGjCC,QAAUF,KAAKlB,OAGfqB,YAAcjoB,OAAOC,UAGrBC,eAAiB+nB,YAAY/nB,eAO7BgoB,qBAAuBD,YAAYE,SAGnCC,eAAiBJ,QAAUA,QAAQK,iBAAcvlB,EA4BrD,IAOIwlB,uBAPgBtoB,OAAOC,UAOgBkoB,SAc3C,IAIII,iBAAmBP,QAAUA,QAAQK,iBAAcvlB,EASvD,SAAS0lB,WAAWtU,OAClB,OAAa,MAATA,WACepR,IAAVoR,MAdM,qBADH,gBAiBLqU,kBAAoBA,oBAAoBvoB,OAAOkU,OAzDxD,SAAmBA,OACjB,IAAIuU,MAAQvoB,eAAeC,KAAK+T,MAAOkU,gBACrCM,IAAMxU,MAAMkU,gBACd,IACElU,MAAMkU,qBAAkBtlB,EACxB,IAAI6lB,UAAW,CACjB,CAAE,MAAO/nB,GAAI,CACb,IAAIsmB,OAASgB,qBAAqB/nB,KAAK+T,OAQvC,OAPIyU,WACEF,MACFvU,MAAMkU,gBAAkBM,WAEjBxU,MAAMkU,iBAGVlB,MACT,CAyCiE0B,CAAU1U,OAtB3E,SAAwBA,OACtB,OAAOoU,uBAAuBnoB,KAAK+T,MACrC,CAoBoF2U,CAAe3U,MACnG,CA2BA,SAAS4U,SAAS5U,OAChB,IAAIlO,KAAO0gB,UAAUxS,OACrB,OAAgB,MAATA,QAA0B,UAARlO,MAA4B,YAARA,KAC/C,CAyBA,SAAS+iB,WAAW7U,OAClB,IAAK4U,SAAS5U,OACZ,OAAO,EAIT,IAAIwU,IAAMF,WAAWtU,OACrB,MA5BU,qBA4BHwU,KA3BE,8BA2BgBA,KA7BZ,0BA6B6BA,KA1B/B,kBA0BkDA,GAC/D,CAGA,IAIMM,IAJFC,WAAanB,KAAK,sBAGlBoB,YACEF,IAAM,SAAS/X,KAAKgY,YAAcA,WAAWE,MAAQF,WAAWE,KAAKC,UAAY,KACxE,iBAAmBJ,IAAM,GAexC,IAGIK,aAHYtB,SAAS9nB,UAGIkoB,SAS7B,SAASmB,SAASC,MAChB,GAAY,MAARA,KAAc,CAChB,IACE,OAAOF,aAAalpB,KAAKopB,KAC3B,CAAE,MAAO3oB,GAAI,CACb,IACE,OAAO2oB,KAAO,EAChB,CAAE,MAAO3oB,GAAI,CACf,CACA,MAAO,EACT,CAMA,IAGI4oB,aAAe,8BAGfC,YAAc1B,SAAS9nB,UACzBypB,cAAgB1pB,OAAOC,UAGrB0pB,eAAiBF,YAAYtB,SAG7ByB,iBAAmBF,cAAcxpB,eAGjC2pB,WAAaC,OAAO,IAAMH,eAAexpB,KAAKypB,kBAAkBG,QAhBjD,sBAgBuE,QAAQA,QAAQ,yDAA0D,SAAW,KAU/K,SAASC,aAAa9V,OACpB,SAAK4U,SAAS5U,SA5DEqV,KA4DiBrV,MA3DxBgV,YAAcA,cAAcK,SA8DvBR,WAAW7U,OAAS2V,WAAaL,cAChCS,KAAKX,SAASpV,QAhE/B,IAAkBqV,IAiElB,CAsBA,SAASW,UAAUC,OAAQhW,KACzB,IAAID,MAbN,SAAkBiW,OAAQhW,KACxB,OAAiB,MAAVgW,YAAiBrnB,EAAYqnB,OAAOhW,IAC7C,CAWciW,CAASD,OAAQhW,KAC7B,OAAO6V,aAAa9V,OAASA,WAAQpR,CACvC,CAGA,IAAIunB,MAAQH,UAAUpC,KAAM,OAGxBwC,aAAeJ,UAAUlqB,OAAQ,UA+BrC,IAMIuqB,iBAHgBvqB,OAAOC,UAGUC,eAqBrC,IAGIsqB,iBAHgBxqB,OAAOC,UAGUC,eA2CrC,SAASuqB,KAAKlD,SACZ,IAAIN,OAAS,EACX7lB,OAAoB,MAAXmmB,QAAkB,EAAIA,QAAQnmB,OAEzC,IADAoB,KAAKS,UACIgkB,MAAQ7lB,QAAQ,CACvB,IAAIomB,MAAQD,QAAQN,OACpBzkB,KAAKG,IAAI6kB,MAAM,GAAIA,MAAM,GAC3B,CACF,CA6CA,SAASkD,WAAW5gB,IAAKqK,KACvB,IAdiBD,MACblO,KAaA0hB,KAAO5d,IAAI2d,SACf,OAbe,WADXzhB,KAAO0gB,UADMxS,MAeAC,OAbkB,UAARnO,MAA4B,UAARA,MAA4B,WAARA,KAA8B,cAAVkO,MAAkC,OAAVA,OAavFwT,KAAmB,iBAAPvT,IAAkB,SAAW,QAAUuT,KAAK5d,GAClF,CAoEA,SAAS6gB,SAASpD,SAChB,IAAIN,OAAS,EACX7lB,OAAoB,MAAXmmB,QAAkB,EAAIA,QAAQnmB,OAEzC,IADAoB,KAAKS,UACIgkB,MAAQ7lB,QAAQ,CACvB,IAAIomB,MAAQD,QAAQN,OACpBzkB,KAAKG,IAAI6kB,MAAM,GAAIA,MAAM,GAC3B,CACF,CAzHAiD,KAAKxqB,UAAUgD,MA1Gf,WACET,KAAKilB,SAAW6C,aAAeA,aAAa,MAAQ,CAAC,EACrD9nB,KAAKE,KAAO,CACd,EAwGA+nB,KAAKxqB,UAAkB,OA5FvB,SAAoBkU,KAClB,IAAI+S,OAAS1kB,KAAKO,IAAIoR,aAAe3R,KAAKilB,SAAStT,KAEnD,OADA3R,KAAKE,MAAQwkB,OAAS,EAAI,EACnBA,MACT,EAyFAuD,KAAKxqB,UAAU+C,IArEf,SAAiBmR,KACf,IAAIuT,KAAOllB,KAAKilB,SAChB,GAAI6C,aAAc,CAChB,IAAIpD,OAASQ,KAAKvT,KAClB,MArBiB,8BAqBV+S,YAA4BpkB,EAAYokB,MACjD,CACA,OAAOqD,iBAAiBpqB,KAAKunB,KAAMvT,KAAOuT,KAAKvT,UAAOrR,CACxD,EA+DA2nB,KAAKxqB,UAAU8C,IA9Cf,SAAiBoR,KACf,IAAIuT,KAAOllB,KAAKilB,SAChB,OAAO6C,kBAA6BxnB,IAAd4kB,KAAKvT,KAAqBqW,iBAAiBrqB,KAAKunB,KAAMvT,IAC9E,EA4CAsW,KAAKxqB,UAAU0C,IA7Bf,SAAiBwR,IAAKD,OACpB,IAAIwT,KAAOllB,KAAKilB,SAGhB,OAFAjlB,KAAKE,MAAQF,KAAKO,IAAIoR,KAAO,EAAI,EACjCuT,KAAKvT,KAAOmW,mBAA0BxnB,IAAVoR,MAfP,4BAegDA,MAC9D1R,IACT,EAgJAmoB,SAAS1qB,UAAUgD,MA/GnB,WACET,KAAKE,KAAO,EACZF,KAAKilB,SAAW,CACd,KAAQ,IAAIgD,KACZ,IAAO,IAAKJ,OAAS/C,WACrB,OAAU,IAAImD,KAElB,EAyGAE,SAAS1qB,UAAkB,OArE3B,SAAwBkU,KACtB,IAAI+S,OAASwD,WAAWloB,KAAM2R,KAAa,OAAEA,KAE7C,OADA3R,KAAKE,MAAQwkB,OAAS,EAAI,EACnBA,MACT,EAkEAyD,SAAS1qB,UAAU+C,IAvDnB,SAAqBmR,KACnB,OAAOuW,WAAWloB,KAAM2R,KAAKnR,IAAImR,IACnC,EAsDAwW,SAAS1qB,UAAU8C,IA3CnB,SAAqBoR,KACnB,OAAOuW,WAAWloB,KAAM2R,KAAKpR,IAAIoR,IACnC,EA0CAwW,SAAS1qB,UAAU0C,IA9BnB,SAAqBwR,IAAKD,OACxB,IAAIwT,KAAOgD,WAAWloB,KAAM2R,KAC1BzR,KAAOglB,KAAKhlB,KAGd,OAFAglB,KAAK/kB,IAAIwR,IAAKD,OACd1R,KAAKE,MAAQglB,KAAKhlB,MAAQA,KAAO,EAAI,EAC9BF,IACT,EA8DA,SAASooB,MAAMrD,SACb,IAAIG,KAAOllB,KAAKilB,SAAW,IAAIH,UAAUC,SACzC/kB,KAAKE,KAAOglB,KAAKhlB,IACnB,CAGAkoB,MAAM3qB,UAAUgD,MA5lBhB,WACET,KAAKilB,SAAW,IAAIH,UACpB9kB,KAAKE,KAAO,CACd,EA0lBAkoB,MAAM3qB,UAAkB,OA/kBxB,SAAqBkU,KACnB,IAAIuT,KAAOllB,KAAKilB,SACdP,OAASQ,KAAa,OAAEvT,KAE1B,OADA3R,KAAKE,KAAOglB,KAAKhlB,KACVwkB,MACT,EA2kBA0D,MAAM3qB,UAAU+C,IAhkBhB,SAAkBmR,KAChB,OAAO3R,KAAKilB,SAASzkB,IAAImR,IAC3B,EA+jBAyW,MAAM3qB,UAAU8C,IApjBhB,SAAkBoR,KAChB,OAAO3R,KAAKilB,SAAS1kB,IAAIoR,IAC3B,EAmjBAyW,MAAM3qB,UAAU0C,IAjChB,SAAkBwR,IAAKD,OACrB,IAAIwT,KAAOllB,KAAKilB,SAChB,GAAIC,gBAAgBJ,UAAW,CAC7B,IAAIuD,MAAQnD,KAAKD,SACjB,IAAK4C,OAASQ,MAAMzpB,OAAS0pB,IAG3B,OAFAD,MAAMvmB,KAAK,CAAC6P,IAAKD,QACjB1R,KAAKE,OAASglB,KAAKhlB,KACZF,KAETklB,KAAOllB,KAAKilB,SAAW,IAAIkD,SAASE,MACtC,CAGA,OAFAnD,KAAK/kB,IAAIwR,IAAKD,OACd1R,KAAKE,KAAOglB,KAAKhlB,KACVF,IACT,EA4DA,SAASuoB,SAASC,QAChB,IAAI/D,OAAS,EACX7lB,OAAmB,MAAV4pB,OAAiB,EAAIA,OAAO5pB,OAEvC,IADAoB,KAAKilB,SAAW,IAAIkD,WACX1D,MAAQ7lB,QACfoB,KAAKqI,IAAImgB,OAAO/D,OAEpB,CAgBA,SAASgE,UAAUxoB,MAAOyoB,WAGxB,IAFA,IAAIjE,OAAS,EACX7lB,OAAkB,MAATqB,MAAgB,EAAIA,MAAMrB,SAC5B6lB,MAAQ7lB,QACf,GAAI8pB,UAAUzoB,MAAMwkB,OAAQA,MAAOxkB,OACjC,OAAO,EAGX,OAAO,CACT,CAtBAsoB,SAAS9qB,UAAU4K,IAAMkgB,SAAS9qB,UAAUqE,KApC5C,SAAqB4P,OAEnB,OADA1R,KAAKilB,SAAS9kB,IAAIuR,MAbG,6BAcd1R,IACT,EAkCAuoB,SAAS9qB,UAAU8C,IAvBnB,SAAqBmR,OACnB,OAAO1R,KAAKilB,SAAS1kB,IAAImR,MAC3B,EAyEA,SAASiX,YAAY1oB,MAAO2kB,MAAOgE,QAASC,WAAYC,UAAWC,OACjE,IAAIC,UAjBqB,EAiBTJ,QACdK,UAAYhpB,MAAMrB,OAClBsqB,UAAYtE,MAAMhmB,OACpB,GAAIqqB,WAAaC,aAAeF,WAAaE,UAAYD,WACvD,OAAO,EAGT,IAAIE,QAAUJ,MAAMvoB,IAAIP,OACxB,GAAIkpB,SAAWJ,MAAMvoB,IAAIokB,OACvB,OAAOuE,SAAWvE,MAEpB,IAAIH,OAAS,EACXC,QAAS,EACT0E,KA7BuB,EA6BhBR,QAAmC,IAAIL,cAAajoB,EAK7D,IAJAyoB,MAAM5oB,IAAIF,MAAO2kB,OACjBmE,MAAM5oB,IAAIykB,MAAO3kB,SAGRwkB,MAAQwE,WAAW,CAC1B,IAAII,SAAWppB,MAAMwkB,OACnB6E,SAAW1E,MAAMH,OACnB,GAAIoE,WACF,IAAIU,SAAWP,UAAYH,WAAWS,SAAUD,SAAU5E,MAAOG,MAAO3kB,MAAO8oB,OAASF,WAAWQ,SAAUC,SAAU7E,MAAOxkB,MAAO2kB,MAAOmE,OAE9I,QAAiBzoB,IAAbipB,SAAwB,CAC1B,GAAIA,SACF,SAEF7E,QAAS,EACT,KACF,CAEA,GAAI0E,MACF,IAAKX,UAAU7D,OAAO,SAAU0E,SAAUE,UACxC,GAxDiB7X,IAwDG6X,UAANJ,KAvDP7oB,IAAIoR,OAuDuB0X,WAAaC,UAAYR,UAAUO,SAAUC,SAAUV,QAASC,WAAYE,QAC5G,OAAOK,KAAKtnB,KAAK0nB,UAzD3B,IAAyB7X,GA2DnB,IAAI,CACF+S,QAAS,EACT,KACF,OACK,GAAM2E,WAAaC,WAAYR,UAAUO,SAAUC,SAAUV,QAASC,WAAYE,OAAS,CAChGrE,QAAS,EACT,KACF,CACF,CAGA,OAFAqE,MAAc,OAAE9oB,OAChB8oB,MAAc,OAAEnE,OACTF,MACT,CAGA,IAAI+E,WAAanE,KAAKmE,WAStB,SAASC,WAAWpiB,KAClB,IAAImd,OAAS,EACXC,OAASrd,MAAMC,IAAIpH,MAIrB,OAHAoH,IAAIxH,SAAQ,SAAU4R,MAAOC,KAC3B+S,SAASD,OAAS,CAAC9S,IAAKD,MAC1B,IACOgT,MACT,CASA,SAASiF,WAAWxpB,KAClB,IAAIskB,OAAS,EACXC,OAASrd,MAAMlH,IAAID,MAIrB,OAHAC,IAAIL,SAAQ,SAAU4R,OACpBgT,SAASD,OAAS/S,KACpB,IACOgT,MACT,CAGA,IAiBIkF,YAAcpE,QAAUA,QAAQ/nB,eAAY6C,EAC9CupB,cAAgBD,YAAcA,YAAYE,aAAUxpB,EAkFtD,SAASypB,UAAU9pB,MAAOuoB,QAIxB,IAHA,IAAI/D,OAAS,EACX7lB,OAAS4pB,OAAO5pB,OAChBorB,OAAS/pB,MAAMrB,SACR6lB,MAAQ7lB,QACfqB,MAAM+pB,OAASvF,OAAS+D,OAAO/D,OAEjC,OAAOxkB,KACT,CAyBA,IAAIgqB,UAAY5iB,MAAM6iB,QAatB,SAASC,eAAexC,OAAQyC,SAAUC,aACxC,IAAI3F,OAAS0F,SAASzC,QACtB,OAAOsC,UAAUtC,QAAUjD,OAASqF,UAAUrF,OAAQ2F,YAAY1C,QACpE,CAWA,SAAS2C,YAAYrqB,MAAOyoB,WAK1B,IAJA,IAAIjE,OAAS,EACX7lB,OAAkB,MAATqB,MAAgB,EAAIA,MAAMrB,OACnC2rB,SAAW,EACX7F,OAAS,KACFD,MAAQ7lB,QAAQ,CACvB,IAAI8S,MAAQzR,MAAMwkB,OACdiE,UAAUhX,MAAO+S,MAAOxkB,SAC1BykB,OAAO6F,YAAc7Y,MAEzB,CACA,OAAOgT,MACT,CAoBA,SAAS8F,YACP,MAAO,EACT,CAGA,IAGIC,qBAHgBjtB,OAAOC,UAGcgtB,qBAGrCC,iBAAmBltB,OAAOmtB,sBAS1BC,WAAcF,iBAA+B,SAAU/C,QACzD,OAAc,MAAVA,OACK,IAETA,OAASnqB,OAAOmqB,QACT2C,YAAYI,iBAAiB/C,SAAS,SAAUkD,QACrD,OAAOJ,qBAAqB9sB,KAAKgqB,OAAQkD,OAC3C,IACF,EARqCL,UAoDrC,SAASM,aAAapZ,OACpB,OAAgB,MAATA,OAAqC,UAApBwS,UAAUxS,MACpC,CAYA,SAASqZ,gBAAgBrZ,OACvB,OAAOoZ,aAAapZ,QAVR,sBAUkBsU,WAAWtU,MAC3C,CAGA,IAAIsZ,cAAgBxtB,OAAOC,UAGvBwtB,iBAAmBD,cAActtB,eAGjCwtB,uBAAyBF,cAAcP,qBAoBvCU,YAAcJ,gBAAgB,WAChC,OAAOK,SACT,CAFkC,IAE3BL,gBAAkB,SAAUrZ,OACjC,OAAOoZ,aAAapZ,QAAUuZ,iBAAiBttB,KAAK+T,MAAO,YAAcwZ,uBAAuBvtB,KAAK+T,MAAO,SAC9G,EAoBA,IAAI2Z,YAAqF,WAAnD,oBAAZxtB,QAA0B,YAAcqmB,UAAUrmB,WAAyBA,UAAYA,QAAQmJ,UAAYnJ,QAGjIytB,WAAaD,aAAoF,UAAtBnH,UAAUtmB,SAAwBA,SAAWA,OAAOoJ,UAAYpJ,OAM3I2tB,OAHgBD,YAAcA,WAAWztB,UAAYwtB,YAG5B/F,KAAKiG,YAASjrB,EAsBvCkrB,UAnBiBD,OAASA,OAAOC,cAAWlrB,IAjBhD,WACE,OAAO,CACT,EAwCImrB,SAAW,mBAUf,SAASC,QAAQha,MAAO9S,QACtB,IAAI4E,KAAO0gB,UAAUxS,OAErB,SADA9S,OAAmB,MAAVA,OAfY,iBAewBA,UACjB,UAAR4E,MAA4B,UAARA,MAAoBioB,SAAShE,KAAK/V,SAAWA,OAAS,GAAKA,MAAQ,GAAK,GAAKA,MAAQ9S,MAC/H,CA+BA,SAAS+sB,SAASja,OAChB,MAAuB,iBAATA,OAAqBA,OAAS,GAAKA,MAAQ,GAAK,GAAKA,OA7B5C,gBA8BzB,CAGA,IA0BIka,eAAiB,CAAC,EAsBtB,SAASC,UAAU9E,MACjB,OAAO,SAAUrV,OACf,OAAOqV,KAAKrV,MACd,CACF,CAzBAka,eAZe,yBAYcA,eAXd,yBAW2CA,eAV9C,sBAUwEA,eATvE,uBASkGA,eARlG,uBAQ6HA,eAP7H,uBAOwJA,eANjJ,8BAMmLA,eALzL,wBAKqNA,eAJrN,yBAIiP,EAC/PA,eA5BgB,sBA4BYA,eA3Bf,kBA2B0CA,eAfhC,wBAemEA,eA1B5E,oBA0BwGA,eAdpG,qBAcoIA,eAzBxI,iBAyBoKA,eAxBnK,kBAwBgMA,eAvBjM,qBAuB6NA,eAtB9N,gBAsByPA,eArBtP,mBAqBoRA,eApBtR,mBAoBkTA,eAnBhT,mBAmB8UA,eAlBjV,gBAkB4WA,eAjBzW,mBAiBuYA,eAhBxY,qBAgBqa,EA2Bpb,IAAIE,cAAuF,WAAnD,oBAAZjuB,QAA0B,YAAcqmB,UAAUrmB,WAAyBA,UAAYA,QAAQmJ,UAAYnJ,QAGnIkuB,aAAeD,eAAsF,UAAtB5H,UAAUtmB,SAAwBA,SAAWA,OAAOoJ,UAAYpJ,OAM/IouB,YAHkBD,cAAgBA,aAAaluB,UAAYiuB,eAG1B1G,WAAW6G,QAG5CC,SAAW,WACb,IAEE,IAAIC,MAAQJ,cAAgBA,aAAaK,SAAWL,aAAaK,QAAQ,QAAQD,MACjF,OAAIA,OAKGH,aAAeA,YAAYK,SAAWL,YAAYK,QAAQ,OACnE,CAAE,MAAOjuB,GAAI,CACf,CAXe,GAcXkuB,iBAAmBJ,UAAYA,SAASK,aAmBxCA,aAAeD,iBAAmBT,UAAUS,kBA/DhD,SAA0B5a,OACxB,OAAOoZ,aAAapZ,QAAUia,SAASja,MAAM9S,WAAagtB,eAAe5F,WAAWtU,OACtF,EAmEI8a,iBAHgBhvB,OAAOC,UAGUC,eAUrC,SAAS+uB,cAAc/a,MAAOgb,WAC5B,IAAIC,MAAQ1C,UAAUvY,OACpBkb,OAASD,OAASxB,YAAYzZ,OAC9Bmb,QAAUF,QAAUC,OAASpB,SAAS9Z,OACtCob,QAAUH,QAAUC,QAAUC,QAAUN,aAAa7a,OACrDqb,YAAcJ,OAASC,OAASC,QAAUC,OAC1CpI,OAASqI,YAvTb,SAAmB5iB,EAAGqa,UAGpB,IAFA,IAAIC,OAAS,EACXC,OAASrd,MAAM8C,KACRsa,MAAQta,GACfua,OAAOD,OAASD,SAASC,OAE3B,OAAOC,MACT,CAgT2BsI,CAAUtb,MAAM9S,OAAQ6M,QAAU,GACzD7M,OAAS8lB,OAAO9lB,OAClB,IAAK,IAAI+S,OAAOD,OACTgb,YAAaF,iBAAiB7uB,KAAK+T,MAAOC,MAAWob,cAEnD,UAAPpb,KAEAkb,SAAkB,UAAPlb,KAA0B,UAAPA,MAE9Bmb,SAAkB,UAAPnb,KAA0B,cAAPA,KAA8B,cAAPA,MAErD+Z,QAAQ/Z,IAAK/S,UACX8lB,OAAO5iB,KAAK6P,KAGhB,OAAO+S,MACT,CAGA,IAAIuI,cAAgBzvB,OAAOC,UAS3B,SAASyvB,YAAYxb,OACnB,IAAIyb,KAAOzb,OAASA,MAAM4S,YAE1B,OAAO5S,SADkB,mBAARyb,MAAsBA,KAAK1vB,WAAawvB,cAE3D,CAUA,SAASG,QAAQrG,KAAMsG,WACrB,OAAO,SAAUC,KACf,OAAOvG,KAAKsG,UAAUC,KACxB,CACF,CAGA,IAAIC,WAAaH,QAAQ5vB,OAAOmpB,KAAMnpB,QAMlCgwB,iBAHgBhwB,OAAOC,UAGUC,eA+CrC,SAAS+vB,YAAY/b,OACnB,OAAgB,MAATA,OAAiBia,SAASja,MAAM9S,UAAY2nB,WAAW7U,MAChE,CA8BA,SAASgc,OAAO/F,QACd,OAAO8F,YAAY9F,QAAU8E,cAAc9E,QAvE7C,SAAkBA,QAChB,IAAKuF,YAAYvF,QACf,OAAO4F,WAAW5F,QAEpB,IAAIjD,OAAS,GACb,IAAK,IAAI/S,OAAOnU,OAAOmqB,QACjB6F,iBAAiB7vB,KAAKgqB,OAAQhW,MAAe,eAAPA,KACxC+S,OAAO5iB,KAAK6P,KAGhB,OAAO+S,MACT,CA4DuDiJ,CAAShG,OAChE,CASA,SAASiG,WAAWjG,QAClB,OAAOwC,eAAexC,OAAQ+F,OAAQ9C,WACxC,CAGA,IAMIiD,iBAHgBrwB,OAAOC,UAGUC,eAqErC,IAAIowB,SAAWpG,UAAUpC,KAAM,YAG3ByI,UAAYrG,UAAUpC,KAAM,WAG5B0I,IAAMtG,UAAUpC,KAAM,OAGtB2I,QAAUvG,UAAUpC,KAAM,WAW1B4I,mBAAqBpH,SAASgH,UAChCK,cAAgBrH,SAASe,OACzBuG,kBAAoBtH,SAASiH,WAC7BM,cAAgBvH,SAASkH,KACzBM,kBAAoBxH,SAASmH,SAS3BM,OAASvI,YAGT8H,UAnBgB,qBAmBJS,OAAO,IAAIT,SAAS,IAAIU,YAAY,MAAyB3G,OAxB9D,gBAwBuE0G,OAAO,IAAI1G,QAAwBkG,WAtB1G,oBAsBuHQ,OAAOR,UAAUU,YAA4BT,KArBtK,gBAqB6KO,OAAO,IAAIP,MAAsBC,SApB1M,oBAoBqNM,OAAO,IAAIN,YAC/OM,OAAS,SAAgB7c,OACvB,IAAIgT,OAASsB,WAAWtU,OACtByb,KA1BU,mBA0BHzI,OAAwBhT,MAAM4S,iBAAchkB,EACnDouB,WAAavB,KAAOrG,SAASqG,MAAQ,GACvC,GAAIuB,WACF,OAAQA,YACN,KAAKR,mBACH,MA3BU,oBA4BZ,KAAKC,cACH,MAlCK,eAmCP,KAAKC,kBACH,MAlCK,mBAmCP,KAAKC,cACH,MAnCG,eAoCL,KAAKC,kBACH,MApCO,mBAuCb,OAAO5J,MACT,GAEF,IAAIiK,SAAWJ,OAcXK,iBAHgBpxB,OAAOC,UAGUC,eAgBrC,SAASmxB,gBAAgBlH,OAAQ/C,MAAOgE,QAASC,WAAYC,UAAWC,OACtE,IAAI+F,SAAW7E,UAAUtC,QACvBoH,SAAW9E,UAAUrF,OACrBoK,OAASF,SA1BE,iBA0BsBH,SAAShH,QAC1CsH,OAASF,SA3BE,iBA2BsBJ,SAAS/J,OAGxCsK,SA7BU,oBA2BdF,OA7Bc,sBA6BLA,OA3BK,kBA2B+BA,QAG3CG,SA9BY,oBA4BdF,OA9Bc,sBA8BLA,OA5BK,kBA4B+BA,QAG3CG,UAAYJ,QAAUC,OACxB,GAAIG,WAAa5D,SAAS7D,QAAS,CACjC,IAAK6D,SAAS5G,OACZ,OAAO,EAETkK,UAAW,EACXI,UAAW,CACb,CACA,GAAIE,YAAcF,SAEhB,OADAnG,QAAUA,MAAQ,IAAIX,OACf0G,UAAYvC,aAAa5E,QAAUgB,YAAYhB,OAAQ/C,MAAOgE,QAASC,WAAYC,UAAWC,OAr0BzG,SAAoBpB,OAAQ/C,MAAOsB,IAAK0C,QAASC,WAAYC,UAAWC,OACtE,OAAQ7C,KACN,IAzBY,oBA0BV,GAAIyB,OAAO0H,YAAczK,MAAMyK,YAAc1H,OAAO2H,YAAc1K,MAAM0K,WACtE,OAAO,EAET3H,OAASA,OAAO4H,OAChB3K,MAAQA,MAAM2K,OAChB,IAhCiB,uBAiCf,QAAI5H,OAAO0H,YAAczK,MAAMyK,aAAevG,UAAU,IAAIW,WAAW9B,QAAS,IAAI8B,WAAW7E,SAIjG,IA9CU,mBA+CV,IA9CQ,gBA+CR,IA5CU,kBA+CR,OAAOD,IAAIgD,QAAS/C,OACtB,IAlDS,iBAmDP,OAAO+C,OAAOnmB,MAAQojB,MAAMpjB,MAAQmmB,OAAO6H,SAAW5K,MAAM4K,QAC9D,IAjDU,kBAkDV,IAhDU,kBAoDR,OAAO7H,QAAU/C,MAAQ,GAC3B,IAzDO,eA0DL,IAAI6K,QAAU/F,WAChB,IAxDO,eAyDL,IAAIV,UAnEmB,EAmEPJ,QAEhB,GADA6G,UAAYA,QAAU9F,YAClBhC,OAAOznB,MAAQ0kB,MAAM1kB,OAAS8oB,UAChC,OAAO,EAGT,IAAIG,QAAUJ,MAAMvoB,IAAImnB,QACxB,GAAIwB,QACF,OAAOA,SAAWvE,MAEpBgE,SA5EuB,EA+EvBG,MAAM5oB,IAAIwnB,OAAQ/C,OAClB,IAAIF,OAASiE,YAAY8G,QAAQ9H,QAAS8H,QAAQ7K,OAAQgE,QAASC,WAAYC,UAAWC,OAE1F,OADAA,MAAc,OAAEpB,QACTjD,OACT,IAxEU,kBAyER,GAAImF,cACF,OAAOA,cAAclsB,KAAKgqB,SAAWkC,cAAclsB,KAAKinB,OAG9D,OAAO,CACT,CAgxBkH8K,CAAW/H,OAAQ/C,MAAOoK,OAAQpG,QAASC,WAAYC,UAAWC,OAElL,KAhD2B,EAgDrBH,SAAmC,CACvC,IAAI+G,aAAeT,UAAYN,iBAAiBjxB,KAAKgqB,OAAQ,eAC3DiI,aAAeT,UAAYP,iBAAiBjxB,KAAKinB,MAAO,eAC1D,GAAI+K,cAAgBC,aAAc,CAChC,IAAIC,aAAeF,aAAehI,OAAOjW,QAAUiW,OACjDmI,aAAeF,aAAehL,MAAMlT,QAAUkT,MAEhD,OADAmE,QAAUA,MAAQ,IAAIX,OACfU,UAAU+G,aAAcC,aAAclH,QAASC,WAAYE,MACpE,CACF,CACA,QAAKqG,YAGLrG,QAAUA,MAAQ,IAAIX,OAhLxB,SAAsBT,OAAQ/C,MAAOgE,QAASC,WAAYC,UAAWC,OACnE,IAAIC,UAtBuB,EAsBXJ,QACdmH,SAAWnC,WAAWjG,QACtBqI,UAAYD,SAASnxB,OAGvB,GAAIoxB,WAFSpC,WAAWhJ,OACDhmB,SACQoqB,UAC7B,OAAO,EAGT,IADA,IAAIvE,MAAQuL,UACLvL,SAAS,CACd,IAAI9S,IAAMoe,SAAStL,OACnB,KAAMuE,UAAYrX,OAAOiT,MAAQiJ,iBAAiBlwB,KAAKinB,MAAOjT,MAC5D,OAAO,CAEX,CAEA,IAAIwX,QAAUJ,MAAMvoB,IAAImnB,QACxB,GAAIwB,SAAWJ,MAAMvoB,IAAIokB,OACvB,OAAOuE,SAAWvE,MAEpB,IAAIF,QAAS,EACbqE,MAAM5oB,IAAIwnB,OAAQ/C,OAClBmE,MAAM5oB,IAAIykB,MAAO+C,QAEjB,IADA,IAAIsI,SAAWjH,YACNvE,MAAQuL,WAAW,CAE1B,IAAIE,SAAWvI,OADfhW,IAAMoe,SAAStL,QAEb6E,SAAW1E,MAAMjT,KACnB,GAAIkX,WACF,IAAIU,SAAWP,UAAYH,WAAWS,SAAU4G,SAAUve,IAAKiT,MAAO+C,OAAQoB,OAASF,WAAWqH,SAAU5G,SAAU3X,IAAKgW,OAAQ/C,MAAOmE,OAG5I,UAAmBzoB,IAAbipB,SAAyB2G,WAAa5G,UAAYR,UAAUoH,SAAU5G,SAAUV,QAASC,WAAYE,OAASQ,UAAW,CAC7H7E,QAAS,EACT,KACF,CACAuL,WAAaA,SAAkB,eAAPte,IAC1B,CACA,GAAI+S,SAAWuL,SAAU,CACvB,IAAIE,QAAUxI,OAAOrD,YACnB8L,QAAUxL,MAAMN,YAGd6L,SAAWC,WAAW,gBAAiBzI,WAAU,gBAAiB/C,QAA6B,mBAAXuL,SAAyBA,mBAAmBA,SAA6B,mBAAXC,SAAyBA,mBAAmBA,UAChM1L,QAAS,EAEb,CAGA,OAFAqE,MAAc,OAAEpB,QAChBoB,MAAc,OAAEnE,OACTF,MACT,CA8HS2L,CAAa1I,OAAQ/C,MAAOgE,QAASC,WAAYC,UAAWC,OACrE,CAgBA,SAASuH,YAAY5e,MAAOkT,MAAOgE,QAASC,WAAYE,OACtD,OAAIrX,QAAUkT,QAGD,MAATlT,OAA0B,MAATkT,QAAkBkG,aAAapZ,SAAWoZ,aAAalG,OACnElT,OAAUA,OAASkT,OAAUA,MAE/BiK,gBAAgBnd,MAAOkT,MAAOgE,QAASC,WAAYyH,YAAavH,OACzE,CA4DA,SAASwH,mBAAmB7e,OAC1B,OAAOA,OAAUA,QAAU4U,SAAS5U,MACtC,CA6BA,SAAS8e,wBAAwB7e,IAAK8e,UACpC,OAAO,SAAU9I,QACf,OAAc,MAAVA,SAGGA,OAAOhW,OAAS8e,gBAA0BnwB,IAAbmwB,UAA0B9e,OAAOnU,OAAOmqB,SAC9E,CACF,CASA,SAAS+I,YAAYjvB,QACnB,IAAIkvB,UArCN,SAAsBhJ,QAGpB,IAFA,IAAIjD,OAASgJ,OAAO/F,QAClB/oB,OAAS8lB,OAAO9lB,OACXA,UAAU,CACf,IAAI+S,IAAM+S,OAAO9lB,QACf8S,MAAQiW,OAAOhW,KACjB+S,OAAO9lB,QAAU,CAAC+S,IAAKD,MAAO6e,mBAAmB7e,OACnD,CACA,OAAOgT,MACT,CA4BkBkM,CAAanvB,QAC7B,OAAwB,GAApBkvB,UAAU/xB,QAAe+xB,UAAU,GAAG,GACjCH,wBAAwBG,UAAU,GAAG,GAAIA,UAAU,GAAG,IAExD,SAAUhJ,QACf,OAAOA,SAAWlmB,QAjGtB,SAAqBkmB,OAAQlmB,OAAQkvB,UAAW9H,YAC9C,IAAIpE,MAAQkM,UAAU/xB,OACpBA,OAAS6lB,MACToM,cAAgBhI,WAClB,GAAc,MAAVlB,OACF,OAAQ/oB,OAGV,IADA+oB,OAASnqB,OAAOmqB,QACTlD,SAAS,CACd,IAAIS,KAAOyL,UAAUlM,OACrB,GAAIoM,cAAgB3L,KAAK,GAAKA,KAAK,KAAOyC,OAAOzC,KAAK,MAAQA,KAAK,KAAMyC,QACvE,OAAO,CAEX,CACA,OAASlD,MAAQ7lB,QAAQ,CAEvB,IAAI+S,KADJuT,KAAOyL,UAAUlM,QACF,GACbyL,SAAWvI,OAAOhW,KAClB8e,SAAWvL,KAAK,GAClB,GAAI2L,cAAgB3L,KAAK,IACvB,QAAiB5kB,IAAb4vB,YAA4Bve,OAAOgW,QACrC,OAAO,MAEJ,CACL,IAAIoB,MAAQ,IAAIX,MAChB,GAAIS,WACF,IAAInE,OAASmE,WAAWqH,SAAUO,SAAU9e,IAAKgW,OAAQlmB,OAAQsnB,OAEnE,UAAiBzoB,IAAXokB,OAAuB4L,YAAYG,SAAUP,SAAUY,EAAmDjI,WAAYE,OAASrE,QACnI,OAAO,CAEX,CACF,CACA,OAAO,CACT,CA+DgCqM,CAAYpJ,OAAQlmB,OAAQkvB,UAC1D,CACF,CAsBA,SAASK,SAAStf,OAChB,MAA2B,UAApBwS,UAAUxS,QAAsBoZ,aAAapZ,QApBpC,mBAoB8CsU,WAAWtU,MAC3E,CAGA,IAAIuf,aAAe,mDACjBC,cAAgB,QAUlB,SAASC,MAAMzf,MAAOiW,QACpB,GAAIsC,UAAUvY,OACZ,OAAO,EAET,IAAIlO,KAAO0gB,UAAUxS,OACrB,QAAY,UAARlO,MAA4B,UAARA,MAA4B,WAARA,MAA8B,MAATkO,QAAiBsf,SAAStf,UAGpFwf,cAAczJ,KAAK/V,SAAWuf,aAAaxJ,KAAK/V,QAAoB,MAAViW,QAAkBjW,SAASlU,OAAOmqB,QACrG,CAiDA,SAASyJ,QAAQrK,KAAMsK,UACrB,GAAmB,mBAARtK,MAAkC,MAAZsK,UAAuC,mBAAZA,SAC1D,MAAM,IAAIC,UAhDQ,uBAkDpB,IAAIC,SAAW,SAASA,WACtB,IAAIC,KAAOpG,UACTzZ,IAAM0f,SAAWA,SAASI,MAAMzxB,KAAMwxB,MAAQA,KAAK,GACnDE,MAAQH,SAASG,MACnB,GAAIA,MAAMnxB,IAAIoR,KACZ,OAAO+f,MAAMlxB,IAAImR,KAEnB,IAAI+S,OAASqC,KAAK0K,MAAMzxB,KAAMwxB,MAE9B,OADAD,SAASG,MAAQA,MAAMvxB,IAAIwR,IAAK+S,SAAWgN,MACpChN,MACT,EAEA,OADA6M,SAASG,MAAQ,IAAKN,QAAQO,OAASxJ,UAChCoJ,QACT,CAGAH,QAAQO,MAAQxJ,SAyBhB,IAZuBpB,KACjBrC,OAMAgN,MAKFE,WAAa,mGAGbC,aAAe,WASfC,cAxBmB/K,KAwBU,SAAUgL,QACzC,IAAIrN,OAAS,GAOb,OAN6B,KAAzBqN,OAAOC,WAAW,IACpBtN,OAAO5iB,KAAK,IAEdiwB,OAAOxK,QAAQqK,YAAY,SAAUK,MAAOC,OAAQC,MAAOC,WACzD1N,OAAO5iB,KAAKqwB,MAAQC,UAAU7K,QAAQsK,aAAc,MAAQK,QAAUD,MACxE,IACOvN,MACT,EAhCMA,OAAS0M,QAAQrK,MAAM,SAAUpV,KAInC,OAfmB,MAYf+f,MAAMxxB,MACRwxB,MAAMjxB,QAEDkR,GACT,IACI+f,MAAQhN,OAAOgN,MACZhN,QA+BL2N,cAAgB7M,QAAUA,QAAQ/nB,eAAY6C,EAChDgyB,eAAiBD,cAAgBA,cAAc1M,cAAWrlB,EAU5D,SAASiyB,aAAa7gB,OAEpB,GAAoB,iBAATA,MACT,OAAOA,MAET,GAAIuY,UAAUvY,OAEZ,OAAO6S,SAAS7S,MAAO6gB,cAAgB,GAEzC,GAAIvB,SAAStf,OACX,OAAO4gB,eAAiBA,eAAe30B,KAAK+T,OAAS,GAEvD,IAAIgT,OAAShT,MAAQ,GACrB,MAAiB,KAAVgT,QAAiB,EAAIhT,QA3Bf,SA2BoC,KAAOgT,MAC1D,CAuBA,SAASiB,SAASjU,OAChB,OAAgB,MAATA,MAAgB,GAAK6gB,aAAa7gB,MAC3C,CAUA,SAAS8gB,SAAS9gB,MAAOiW,QACvB,OAAIsC,UAAUvY,OACLA,MAEFyf,MAAMzf,MAAOiW,QAAU,CAACjW,OAASogB,aAAanM,SAASjU,OAChE,CAYA,SAAS+gB,MAAM/gB,OACb,GAAoB,iBAATA,OAAqBsf,SAAStf,OACvC,OAAOA,MAET,IAAIgT,OAAShT,MAAQ,GACrB,MAAiB,KAAVgT,QAAiB,EAAIhT,QAdb,SAcoC,KAAOgT,MAC5D,CAUA,SAASgO,QAAQ/K,OAAQgL,MAIvB,IAFA,IAAIlO,MAAQ,EACV7lB,QAFF+zB,KAAOH,SAASG,KAAMhL,SAEN/oB,OACC,MAAV+oB,QAAkBlD,MAAQ7lB,QAC/B+oB,OAASA,OAAO8K,MAAME,KAAKlO,WAE7B,OAAOA,OAASA,OAAS7lB,OAAS+oB,YAASrnB,CAC7C,CAwCA,SAASsyB,UAAUjL,OAAQhW,KACzB,OAAiB,MAAVgW,QAAkBhW,OAAOnU,OAAOmqB,OACzC,CAWA,SAASkL,QAAQlL,OAAQgL,KAAMG,SAK7B,IAHA,IAAIrO,OAAS,EACX7lB,QAFF+zB,KAAOH,SAASG,KAAMhL,SAEN/oB,OACd8lB,QAAS,IACFD,MAAQ7lB,QAAQ,CACvB,IAAI+S,IAAM8gB,MAAME,KAAKlO,QACrB,KAAMC,OAAmB,MAAViD,QAAkBmL,QAAQnL,OAAQhW,MAC/C,MAEFgW,OAASA,OAAOhW,IAClB,CACA,OAAI+S,UAAYD,OAAS7lB,OAChB8lB,UAET9lB,OAAmB,MAAV+oB,OAAiB,EAAIA,OAAO/oB,SAClB+sB,SAAS/sB,SAAW8sB,QAAQ/Z,IAAK/S,UAAYqrB,UAAUtC,SAAWwD,YAAYxD,QACnG,CA4CA,SAASoL,oBAAoBJ,KAAMlC,UACjC,OAAIU,MAAMwB,OAASpC,mBAAmBE,UAC7BD,wBAAwBiC,MAAME,MAAOlC,UAEvC,SAAU9I,QACf,IAAIuI,SA5FR,SAAavI,OAAQgL,KAAMK,cACzB,IAAItO,OAAmB,MAAViD,YAAiBrnB,EAAYoyB,QAAQ/K,OAAQgL,MAC1D,YAAkBryB,IAAXokB,OAAuBsO,aAAetO,MAC/C,CAyFmBlkB,CAAImnB,OAAQgL,MAC3B,YAAoBryB,IAAb4vB,UAA0BA,WAAaO,SAtBlD,SAAe9I,OAAQgL,MACrB,OAAiB,MAAVhL,QAAkBkL,QAAQlL,OAAQgL,KAAMC,UACjD,CAoB6DK,CAAMtL,OAAQgL,MAAQrC,YAAYG,SAAUP,SAAUgD,EACjH,CACF,CAkBA,SAASC,SAASzhB,OAChB,OAAOA,KACT,CAkDA,SAAS0hB,SAAST,MAChB,OAAOxB,MAAMwB,OA1COhhB,IA0Cc8gB,MAAME,MAzCjC,SAAUhL,QACf,OAAiB,MAAVA,YAAiBrnB,EAAYqnB,OAAOhW,IAC7C,GAUF,SAA0BghB,MACxB,OAAO,SAAUhL,QACf,OAAO+K,QAAQ/K,OAAQgL,KACzB,CACF,CAyBmDU,CAAiBV,MA1CpE,IAAsBhhB,GA2CtB,CASA,SAAS2hB,aAAa5hB,OAGpB,MAAoB,mBAATA,MACFA,MAEI,MAATA,MACKyhB,SAEe,UAApBjP,UAAUxS,OACLuY,UAAUvY,OAASqhB,oBAAoBrhB,MAAM,GAAIA,MAAM,IAAMgf,YAAYhf,OAE3E0hB,SAAS1hB,MAClB,CAoCA,IA3BuB6hB,UA2BnBC,QA1BK,SAAU7L,OAAQnD,SAAU4F,UAKjC,IAJA,IAAI3F,OAAS,EACXgP,SAAWj2B,OAAOmqB,QAClB+L,MAAQtJ,SAASzC,QACjB/oB,OAAS80B,MAAM90B,OACVA,UAAU,CACf,IAAI+S,IAAM+hB,MAAMH,UAAY30B,SAAW6lB,OACvC,IAA+C,IAA3CD,SAASiP,SAAS9hB,KAAMA,IAAK8hB,UAC/B,KAEJ,CACA,OAAO9L,MACT,EAgEF,IAAIgM,SA5BJ,SAAwBC,SAAUL,WAChC,OAAO,SAAUM,WAAYrP,UAC3B,GAAkB,MAAdqP,WACF,OAAOA,WAET,IAAKpG,YAAYoG,YACf,OAAOD,SAASC,WAAYrP,UAK9B,IAHA,IAAI5lB,OAASi1B,WAAWj1B,OACtB6lB,MAAQ8O,UAAY30B,QAAU,EAC9B60B,SAAWj2B,OAAOq2B,aACbN,UAAY9O,UAAYA,MAAQ7lB,UACc,IAA/C4lB,SAASiP,SAAShP,OAAQA,MAAOgP,YAIvC,OAAOI,UACT,CACF,CAUeC,EAxCf,SAAoBnM,OAAQnD,UAC1B,OAAOmD,QAAU6L,QAAQ7L,OAAQnD,SAAUkJ,OAC7C,IAgDA,SAASqG,QAAQF,WAAYrP,UAC3B,IAAIC,OAAS,EACXC,OAAS+I,YAAYoG,YAAcxsB,MAAMwsB,WAAWj1B,QAAU,GAIhE,OAHA+0B,SAASE,YAAY,SAAUniB,MAAOC,IAAKkiB,YACzCnP,SAASD,OAASD,SAAS9S,MAAOC,IAAKkiB,WACzC,IACOnP,MACT,CA4CA,SAASpd,IAAIusB,WAAYrP,UAEvB,OADWyF,UAAU4J,YAActP,SAAWwP,SAClCF,WAAYP,aAAa9O,UACvC,CAWA,SAASwP,UAAU/zB,MAAOukB,UAGxB,IAFA,IAAIC,OAAS,EACX7lB,OAAkB,MAATqB,MAAgB,EAAIA,MAAMrB,SAC5B6lB,MAAQ7lB,SAC8B,IAAzC4lB,SAASvkB,MAAMwkB,OAAQA,MAAOxkB,SAIpC,OAAOA,KACT,CA2CA,SAASH,QAAQ+zB,WAAYrP,UAC3B,IAnCoB9S,MAoCpB,OADWuY,UAAU4J,YAAcG,UAAYL,UACnCE,WAnCW,mBADHniB,MAoCiB8S,UAnCD9S,MAAQyhB,SAoC9C,CAmCA,SAASc,cAAch0B,MAAOyoB,UAAWwL,UAAWX,WAGlD,IAFA,IAAI30B,OAASqB,MAAMrB,OACjB6lB,MAAQyP,WAAaX,UAAY,GAAK,GACjCA,UAAY9O,UAAYA,MAAQ7lB,QACrC,GAAI8pB,UAAUzoB,MAAMwkB,OAAQA,MAAOxkB,OACjC,OAAOwkB,MAGX,OAAQ,CACV,CAGA,IAGI0P,OAAS,aAGTC,WAAa,qBAGbC,WAAa,aAGbC,UAAY,cAGZC,aAAeC,SAuEnB,SAASC,SAAS/iB,OAChB,OAAKA,MA3BU,YA8BfA,MAlDF,SAAkBA,OAChB,GAAoB,iBAATA,MACT,OAAOA,MAET,GAAIsf,SAAStf,OACX,OA7CM,IA+CR,GAAI4U,SAAS5U,OAAQ,CACnB,IAAIkT,MAAgC,mBAAjBlT,MAAMoY,QAAwBpY,MAAMoY,UAAYpY,MACnEA,MAAQ4U,SAAS1B,OAASA,MAAQ,GAAKA,KACzC,CACA,GAAoB,iBAATlT,MACT,OAAiB,IAAVA,MAAcA,OAASA,MAEhCA,MAAQA,MAAM6V,QAAQ4M,OAAQ,IAC9B,IAAIO,SAAWL,WAAW5M,KAAK/V,OAC/B,OAAOgjB,UAAYJ,UAAU7M,KAAK/V,OAAS6iB,aAAa7iB,MAAMlK,MAAM,GAAIktB,SAAW,EAAI,GAAKN,WAAW3M,KAAK/V,OAxDpG,KAwDoHA,KAC9H,CAiCUijB,CAASjjB,UA9BF,WA+BaA,MA9Bd,uBA+BDA,MAAQ,GAAK,EAAI,GAGvBA,OAAUA,MAAQA,MAAQ,EAPd,IAAVA,MAAcA,MAAQ,CAQjC,CA4BA,SAASkjB,UAAUljB,OACjB,IAAIgT,OAAS+P,SAAS/iB,OACpBmjB,UAAYnQ,OAAS,EACvB,OAAOA,QAAWA,OAASmQ,UAAYnQ,OAASmQ,UAAYnQ,OAAS,CACvE,CAGA,IAAIoQ,UAAYroB,KAAKsoB,IAqCrB,SAASC,UAAU/0B,MAAOyoB,UAAWwL,WACnC,IAAIt1B,OAAkB,MAATqB,MAAgB,EAAIA,MAAMrB,OACvC,IAAKA,OACH,OAAQ,EAEV,IAAI6lB,MAAqB,MAAbyP,UAAoB,EAAIU,UAAUV,WAI9C,OAHIzP,MAAQ,IACVA,MAAQqQ,UAAUl2B,OAAS6lB,MAAO,IAE7BwP,cAAch0B,MAAOqzB,aAAa5K,WAAYjE,MACvD,CAsCA,IA9PoBwQ,cA8PhBC,MA9PgBD,cA8PED,UA7Pb,SAAUnB,WAAYnL,UAAWwL,WACtC,IAAIT,SAAWj2B,OAAOq2B,YACtB,IAAKpG,YAAYoG,YAAa,CAC5B,IAAIrP,SAAW8O,aAAa5K,WAC5BmL,WAAanG,OAAOmG,YACpBnL,UAAY,SAAmB/W,KAC7B,OAAO6S,SAASiP,SAAS9hB,KAAMA,IAAK8hB,SACtC,CACF,CACA,IAAIhP,MAAQwQ,cAAcpB,WAAYnL,UAAWwL,WACjD,OAAOzP,OAAS,EAAIgP,SAASjP,SAAWqP,WAAWpP,OAASA,YAASnkB,CACvE,GA4PF,SAAS60B,WAAWtB,WAAYnL,WAC9B,IAAIhE,OAAS,GAMb,OALAiP,SAASE,YAAY,SAAUniB,MAAO+S,MAAOoP,YACvCnL,UAAUhX,MAAO+S,MAAOoP,aAC1BnP,OAAO5iB,KAAK4P,MAEhB,IACOgT,MACT,CA+EA,SAAS0Q,SAASvB,WAAYnL,WAE5B,OADWuB,UAAU4J,YAAcvJ,YAAc6K,YACrCtB,WAxDd,SAAgBnL,WACd,GAAwB,mBAAbA,UACT,MAAM,IAAI4I,UAxBU,uBA0BtB,OAAO,WACL,IAAIE,KAAOpG,UACX,OAAQoG,KAAK5yB,QACX,KAAK,EACH,OAAQ8pB,UAAU/qB,KAAKqC,MACzB,KAAK,EACH,OAAQ0oB,UAAU/qB,KAAKqC,KAAMwxB,KAAK,IACpC,KAAK,EACH,OAAQ9I,UAAU/qB,KAAKqC,KAAMwxB,KAAK,GAAIA,KAAK,IAC7C,KAAK,EACH,OAAQ9I,UAAU/qB,KAAKqC,KAAMwxB,KAAK,GAAIA,KAAK,GAAIA,KAAK,IAExD,OAAQ9I,UAAU+I,MAAMzxB,KAAMwxB,KAChC,CACF,CAsC0B6D,CAAO/B,aAAa5K,YAC9C,CAYA,SAAS+I,MAAM1K,KAAMpmB,QAAS6wB,MAC5B,OAAQA,KAAK5yB,QACX,KAAK,EACH,OAAOmoB,KAAKppB,KAAKgD,SACnB,KAAK,EACH,OAAOomB,KAAKppB,KAAKgD,QAAS6wB,KAAK,IACjC,KAAK,EACH,OAAOzK,KAAKppB,KAAKgD,QAAS6wB,KAAK,GAAIA,KAAK,IAC1C,KAAK,EACH,OAAOzK,KAAKppB,KAAKgD,QAAS6wB,KAAK,GAAIA,KAAK,GAAIA,KAAK,IAErD,OAAOzK,KAAK0K,MAAM9wB,QAAS6wB,KAC7B,CAgBA,SAAS8D,KAAKr1B,OACZ,IAAIrB,OAAkB,MAATqB,MAAgB,EAAIA,MAAMrB,OACvC,OAAOA,OAASqB,MAAMrB,OAAS,QAAK0B,CACtC,CAWA,SAASi1B,UAAUt1B,MAAOu1B,MAAOC,KAC/B,IAAIhR,OAAS,EACX7lB,OAASqB,MAAMrB,OACb42B,MAAQ,IACVA,OAASA,MAAQ52B,OAAS,EAAIA,OAAS42B,QAEzCC,IAAMA,IAAM72B,OAASA,OAAS62B,KACpB,IACRA,KAAO72B,QAETA,OAAS42B,MAAQC,IAAM,EAAIA,IAAMD,QAAU,EAC3CA,SAAW,EAEX,IADA,IAAI9Q,OAASrd,MAAMzI,UACV6lB,MAAQ7lB,QACf8lB,OAAOD,OAASxkB,MAAMwkB,MAAQ+Q,OAEhC,OAAO9Q,MACT,CAUA,SAASlQ,OAAOmT,OAAQgL,MACtB,OAAOA,KAAK/zB,OAAS,EAAI+oB,OAAS+K,QAAQ/K,OAAQ4N,UAAU5C,KAAM,GAAI,GACxE,CAoBA,IAAI+C,YAAcjpB,KAAKsoB,IAuDvB,IAAI/gB,eAAiB,WACnB,IACE,IAAI+S,KAAOW,UAAUlqB,OAAQ,kBAE7B,OADAupB,KAAK,CAAC,EAAG,GAAI,CAAC,GACPA,IACT,CAAE,MAAO3oB,GAAI,CACf,CANqB,GAgBjBu3B,gBAAmB3hB,eAA4B,SAAU+S,KAAMgL,QACjE,OAAO/d,eAAe+S,KAAM,WAAY,CACtC,cAAgB,EAChB,YAAc,EACd,OAzBcrV,MAyBIqgB,OAxBb,WACL,OAAOrgB,KACT,GAuBE,UAAY,IA1BhB,IAAkBA,KA4BlB,EAPwCyhB,SAcpCyC,UAAYC,KAAKC,IAWrB,SAASC,SAAShP,MAChB,IAAIiP,MAAQ,EACVC,WAAa,EACf,OAAO,WACL,IAAIC,MAAQN,YACVO,UAnBO,IAmBiBD,MAAQD,YAElC,GADAA,WAAaC,MACTC,UAAY,GACd,KAAMH,OAvBI,IAwBR,OAAO5K,UAAU,QAGnB4K,MAAQ,EAEV,OAAOjP,KAAK0K,WAAMnxB,EAAW8qB,UAC/B,CACF,CAUA,IAAIgL,YAAcL,SAASJ,iBAU3B,SAASU,SAAStP,KAAMyO,OACtB,OAAOY,YA1HT,SAAkBrP,KAAMyO,MAAOnI,WAE7B,OADAmI,MAAQE,iBAAsBp1B,IAAVk1B,MAAsBzO,KAAKnoB,OAAS,EAAI42B,MAAO,GAC5D,WAKL,IAJA,IAAIhE,KAAOpG,UACT3G,OAAS,EACT7lB,OAAS82B,YAAYlE,KAAK5yB,OAAS42B,MAAO,GAC1Cv1B,MAAQoH,MAAMzI,UACP6lB,MAAQ7lB,QACfqB,MAAMwkB,OAAS+M,KAAKgE,MAAQ/Q,OAE9BA,OAAS,EAET,IADA,IAAI6R,UAAYjvB,MAAMmuB,MAAQ,KACrB/Q,MAAQ+Q,OACfc,UAAU7R,OAAS+M,KAAK/M,OAG1B,OADA6R,UAAUd,OAASnI,UAAUptB,OACtBwxB,MAAM1K,KAAM/mB,KAAMs2B,UAC3B,CACF,CAwGqBC,CAASxP,KAAMyO,MAAOrC,UAAWpM,KAAO,GAC7D,CAyBA,IAAIyP,UAAYH,UAAS,SAAUxC,WAAYlB,KAAMnB,MACnD,IAAI/M,OAAS,EACXgS,OAAwB,mBAAR9D,KAChBjO,OAAS+I,YAAYoG,YAAcxsB,MAAMwsB,WAAWj1B,QAAU,GAIhE,OAHA+0B,SAASE,YAAY,SAAUniB,OAC7BgT,SAASD,OAASgS,OAAShF,MAAMkB,KAAMjhB,MAAO8f,MA5KlD,SAAoB7J,OAAQgL,KAAMnB,MAGhC,IAAIzK,KAAiB,OADrBY,OAASnT,OAAOmT,OADhBgL,KAAOH,SAASG,KAAMhL,UAEMA,OAASA,OAAO8K,MAAM6C,KAAK3C,QACvD,OAAe,MAAR5L,UAAezmB,EAAYmxB,MAAM1K,KAAMY,OAAQ6J,KACxD,CAuK0DkF,CAAWhlB,MAAOihB,KAAMnB,KAChF,IACO9M,MACT,IAiBA,IAGIiS,SAHetvB,MAAM5J,UAGGkV,OAwD5B,SAASrK,OAAOrI,MAAOyoB,WACrB,IAAIhE,OAAS,GACb,IAAMzkB,QAASA,MAAMrB,OACnB,OAAO8lB,OAET,IAAID,OAAS,EACXmS,QAAU,GACVh4B,OAASqB,MAAMrB,OAEjB,IADA8pB,UAAY4K,aAAa5K,aAChBjE,MAAQ7lB,QAAQ,CACvB,IAAI8S,MAAQzR,MAAMwkB,OACdiE,UAAUhX,MAAO+S,MAAOxkB,SAC1BykB,OAAO5iB,KAAK4P,OACZklB,QAAQ90B,KAAK2iB,OAEjB,CAEA,OA9DF,SAAoBxkB,MAAO22B,SAGzB,IAFA,IAtBiBjP,OAAQgL,KAsBrB/zB,OAASqB,MAAQ22B,QAAQh4B,OAAS,EACpCi4B,UAAYj4B,OAAS,EAChBA,UAAU,CACf,IAAI6lB,MAAQmS,QAAQh4B,QACpB,GAAIA,QAAUi4B,WAAapS,QAAUqS,SAAU,CAC7C,IAAIA,SAAWrS,MACXiH,QAAQjH,OACVkS,SAASh5B,KAAKsC,MAAOwkB,MAAO,GA1BjB,OADjBkD,OAASnT,OAFQmT,OA+BD1nB,MA9BhB0yB,KAAOH,SADkBG,KA+BFlO,MA9BDkD,kBAEUA,OAAO8K,MAAM6C,KAAK3C,OA8BhD,CACF,CAEF,CA8CEoE,CAAW92B,MAAO22B,SACXlS,MACT,CACA,IA4EIsS,SA5EAC,oBAAsB,CACxB35B,EAAG,iBACH45B,IAAK,+BACLC,IAAK,8CACLC,GAAI,mCACJC,KAAM,+BACNC,MAAO,gDACPC,MAAO,0CACPC,IAAK,oCACLC,MAAO,sCACPC,MAAO,sCACPC,MAAO,sCACPC,IAAK,+BACLC,MAAO,4CACPC,KAAM,iCACNC,MAAO,mCAULC,kBAAoB,SAA2BC,QACjD,OAAOhB,oBAAoBgB,SAAW,IACxC,EAsBA,SAASC,SAASxmB,OAChB,MAAuB,iBAATA,QAAsBuY,UAAUvY,QAAUoZ,aAAapZ,QApBrD,mBAoB+DsU,WAAWtU,MAC5F,CAsBA,SAASymB,MAAMzmB,OACb,OAAgB,MAATA,KACT,CAIA,QAAgC,IAArBxU,OAAOk7B,UAA2B,CAC3C,IAIIC,qBAJAC,eAAiBF,UAAU36B,UAC3B86B,oBAAsBD,eAAeE,gBAIzC,KAEM,IAAIJ,WAAYI,gBAAgB,GAAI,eAEtCH,sBAAuB,EAE3B,CAAE,MAAO91B,IAET,CACK81B,uBACHC,eAAeE,gBAAkB,SAAUC,OAAQj1B,MACjD,GAAI,4BAA4BikB,KAAKjkB,MAAO,CAC1C,IAEIk1B,aAFAC,IAAMt6B,SAASu6B,eAAeC,mBAAmB,IACjDC,WAAaH,IAAII,gBAOrB,OALAD,WAAWE,UAAYP,OACvBC,aAAeI,WAAWG,kBACW,IAAjCH,WAAWI,mBAAoE,SAAzCR,aAAaS,UAAUC,eAC/DT,IAAIU,aAAaX,aAAcI,YAE1BH,GACT,CACA,OAAOJ,oBAAoB9G,MAAMzxB,KAAMorB,UACzC,GAEF4L,SAAW,SAAkBsC,OAAQC,aAEnC,OADAA,YAAcA,aAAe,YACtB,IAAIr8B,OAAOk7B,WAAYI,gBAAgBc,OAAQC,YACxD,CACF,KAAO,SAAoC,IAAzBr8B,OAAOs8B,gBAAiC,IAAIt8B,OAAOs8B,cAAc,oBAQjF,MAAM,IAAInlB,MAAM,uBAPhB2iB,SAAW,SAAkBsC,QAC3B,IAAIG,OAAS,IAAIv8B,OAAOs8B,cAAc,oBAGtC,OAFAC,OAAOC,MAAQ,QACfD,OAAOE,QAAQL,QACRG,MACT,CAGF,CACA,IAOIG,eAAiB,SAAwB53B,SAC3C,OAAOA,QAAQ2J,WACjB,EAaID,cAAgB,SAAuBitB,IAAKn3B,MAE9C,OADcm3B,IAAIjtB,cAAclK,KAElC,EAMIq4B,qBAAuB,SAA8B73B,QAASR,MAGhE,OADoBQ,QAAQ83B,uBADnB,IAC8Ct4B,KAEzD,EACIu4B,yBAA2B,SAAkC/3B,QAASR,MACxE,IAAIw4B,cAAgBH,qBAAqB73B,QAASR,MAClD,OAAOw4B,eAAiBA,cAAc,GAAKA,cAAc,GAAK,IAChE,EAKIC,WAAa,WAAuB,EACxCA,WAAWx8B,UAAUu5B,SAAWA,SAChCiD,WAAWx8B,UAAUy8B,uBA9CQ,SAAgCT,QAE3D,OADoB,IAAIU,eACHC,kBAAkBX,OACzC,EA4CAQ,WAAWx8B,UAAU48B,eA3CA,SAAwBZ,QAC3C,MAAO,2CAA6Cz5B,KAAKk6B,uBAAuBT,OAClF,EA0CAQ,WAAWx8B,UAAUm8B,eAAiBA,eACtCK,WAAWx8B,UAAU68B,aAvCF,SAAsBt4B,QAASu4B,eAEhD,OAAQpC,MADQn2B,QAAQ8L,aAAaysB,eAEvC,EAqCAN,WAAWx8B,UAAU+8B,sBApCO,SAA+Bx4B,QAASu4B,cAAe7oB,OAEjF,OADgB1P,QAAQ8L,aAAaysB,iBAChB7oB,KACvB,EAkCAuoB,WAAWx8B,UAAUg9B,eAjCA,WAEnB,OADkBp8B,SAASu6B,eAAe6B,eAAe,GAAI,GAAI,KAEnE,EA+BAR,WAAWx8B,UAAUiO,cAAgBA,cACrCuuB,WAAWx8B,UAAUi9B,uBA3BQ,SAAgC/B,IAAKn3B,KAAMkQ,OACtE,IAAI1P,QAAU22B,IAAIjtB,cAAclK,MAEhC,OADAQ,QAAQ4J,YAAY+sB,IAAIgC,eAAejpB,QAChC1P,OACT,EAwBAi4B,WAAWx8B,UAAUo8B,qBAAuBA,qBAC5CI,WAAWx8B,UAAUs8B,yBAA2BA,yBAChDE,WAAWx8B,UAAUm9B,kCAhBmB,SAA2C54B,QAASR,MAC1F,IAAIq5B,aAAed,yBAAyB/3B,QAASR,MACrD,OAAOq5B,aAAejB,eAAeiB,cAAgB,IACvD,EAcA,IA+BIC,gBAAkB,SAAyBnC,IAAKoC,GAAI9C,OAAQz2B,MAE9D,OADcm3B,IAAImC,gBAAgBC,GAAI9C,OAAS,IAAMz2B,KAEvD,EAMIw5B,UAAY,SAAmBC,QAASjD,mBAC1C,IAAIkD,UAAYD,QAAQE,MAAM,IAAK,GACnC,GAAyB,IAArBD,UAAUt8B,OACZ,MAAM,IAAIyV,MAAM,qBAAuB4mB,QAAU,4CAC5C,IAAKjD,kBAAkBkD,UAAU,IACtC,MAAM,IAAI7mB,MAAM,6BAA+B6mB,UAAU,GAAK,kDAEhE,MAAO,CACLE,MAAOpD,kBAAkBkD,UAAU,IACnCG,SAAUH,UAAU,GACpBI,aAAcJ,UAAU,GAE5B,EAqCIK,oBAAsB,SAA6BvD,mBACrD,IAAKA,kBACH,MAAM,IAAI3jB,MAAM,iCAElBrU,KAAKg4B,kBAAoBA,iBAC3B,GACAuD,oBAAoB99B,UAAYD,OAAOW,OAAO87B,WAAWx8B,YAC3B+9B,iCA7FS,SAA0CC,aAAcj6B,MAC7F,GAJe,SAAoBi6B,cACnC,OAAOlV,WAAWkV,aAAaC,SACjC,CAEMC,CAAWF,cACb,OAAOA,aAAaC,SAAS,KAAOl6B,KAAMi6B,aAAcz7B,KAAKg4B,kBAAmB4D,YAAYC,wBAAyB,MAAMC,gBAE7H,IAAI9B,cAAgBh6B,KAAK+7B,6BAA6BN,aAAcj6B,MACpE,OAAOw4B,eAAiBA,cAAc,GAAKA,cAAc,QAAK15B,CAChE,EAwFAi7B,oBAAoB99B,UAAUs+B,6BAvFK,SAAsC/5B,QAASR,MAChF,IAAKQ,QACH,OAAO,KAET,IAA2B,IAAvBR,KAAKkR,QAAQ,KACf,MAAM,IAAI2B,MAAM,wJAElB,IAAI2nB,OAASx6B,KAAK25B,MAAM,KACpBJ,GAAK/6B,KAAKg4B,kBAAkBgE,OAAO,IACnCf,QAAUz5B,KAAK25B,MAAM,KAAK,GAE9B,OADoBn5B,QAAQ83B,uBAAuBiB,GAAIE,QAEzD,EA4EAM,oBAAoB99B,UAAUw+B,0CA3EkB,SAAmDj6B,QAASR,MAC1G,IAAIq5B,aAAe76B,KAAKw7B,iCAAiCx5B,QAASR,MAClE,OAAOq5B,aAAe76B,KAAK45B,eAAeiB,mBAAgBv6B,CAC5D,EAyEAi7B,oBAAoB99B,UAAUy+B,iBAxEP,SAA0BnB,GAAI9C,OAAQz2B,MAE3D,OADkBnD,SAASu6B,eAAe6B,eAAeM,GAAI9C,OAAS,IAAMz2B,KAAM,KAEpF,EAsEA+5B,oBAAoB99B,UAAU0+B,wBA/CA,SAAiCC,QAASzD,KACtEA,IAAMA,KAAO34B,KAAKy6B,iBAClB,IAAI4B,KAAOr8B,KACX,GAAIk4B,SAASkE,SACX,OAAO1wB,cAAcitB,IAAKyD,SACrB,GAA2B,WAAvBlY,UAAUkY,UAAkD,mBAAlBA,QAAQE,MAC3D,OAAOF,QAAQE,QACV,GAA2B,WAAvBpY,UAAUkY,UAAyBA,QAAQ56B,KAAM,CAC1D,IAAI+6B,OAASvB,UAAUoB,QAAQ56B,KAAMxB,KAAKg4B,mBACtCwE,WAAa1B,gBAAgBnC,IAAK4D,OAAOnB,MAAOmB,OAAOlB,SAAUkB,OAAOjB,cAuB5E,OAtBIc,QAAQK,MAAoC,WAA5BvY,UAAUkY,QAAQK,OACpC38B,QAAQs8B,QAAQK,MAAM,SAAUC,QAASC,UACvC,IAAKxE,MAAMuE,SAAU,CACnB,IAAIE,UAAY5B,UAAU2B,SAAUN,KAAKrE,mBACd,QAAvB4E,UAAUvB,SACZmB,WAAWK,eAAeD,UAAUxB,MAAOuB,SAAUD,SAErDF,WAAWM,aAAaH,SAAUD,QAEtC,CACF,IAEEN,QAAQW,UAAY11B,MAAM6iB,QAAQkS,QAAQW,WAC5Cj9B,QAAQs8B,QAAQW,UAAU,SAAUC,OAC9BA,OACFR,WAAW5wB,YAAYywB,KAAKF,wBAAwBa,MAAOrE,KAE/D,SAEmBr4B,IAAjB87B,QAAQa,MAAuC,OAAjBb,QAAQa,OACxCT,WAAW7wB,YAAcywB,QAAQa,MAE5BT,UACT,CACA,MAAM,IAAInoB,MAAM,mBAClB,EAaAknB,oBAAoB99B,UAAUq9B,gBAAkBA,gBAChDS,oBAAoB99B,UAAUy/B,yBAnEC,SAAkCvE,IAAKoC,GAAI9C,OAAQz2B,KAAMkQ,OACtF,IAAI1P,QAAU84B,gBAAgBnC,IAAKoC,GAAI9C,OAAQz2B,MAE/C,OADAQ,QAAQ4J,YAAY+sB,IAAIgC,eAAejpB,QAChC1P,OACT,EAgEA,IA4CIm7B,4BA5CqB,SAA4BC,oBACnD,GAAkC,iBAAvBA,mBACT,MAAM,IAAI/oB,MAAM,uDAAyD+oB,mBAAqB,KAEhG,IAIMC,wBAJFC,YAAcF,mBAAmBhE,cACjCmE,UAAY,GACZC,QAAU,GAgBd,OAdMH,wBAA0BC,YAAYnC,MAAM,MACpBv8B,OAAS,IACnC4+B,QAAUH,wBAAwBlY,OAEpCoY,UAAYF,wBAAwBI,KAAK,KAUpCjgC,OAAOsX,iBAAiB,CAC7B4oB,OATW,WACX,MAAO,CACL7uB,WAAYyuB,YACZ3Z,SAAU4Z,UACVI,OAAQH,QAEZ,GAIG,CACD3uB,WAAY,CACVrO,IAAK,WACH,OAAO88B,WACT,GAEF3Z,SAAU,CACRnjB,IAAK,WACH,OAAO+8B,SACT,GAEFI,OAAQ,CACNn9B,IAAK,WACH,OAAOg9B,OACT,IAGN,EAaII,aAAepgC,OAAO2X,OAAO,CAC/B,QAAW,UACX0oB,GAAI,CACFr8B,KAAM,YACNs8B,YAAa,YACbC,QAAS,CACPC,GAAI,iBAGRC,GAAI,CACFz8B,KAAM,WACNs8B,YAAa,QACbC,QAAS,CACPG,GAAI,YAGRC,GAAI,CACF38B,KAAM,SACNs8B,YAAa,UACbC,QAAS,CACPK,GAAI,UACJC,GAAI,UACJC,GAAI,QACJC,GAAI,OACJC,GAAI,SACJC,GAAI,SACJC,GAAI,UACJC,GAAI,QACJC,GAAI,UACJC,GAAI,OACJC,GAAI,QACJC,GAAI,eACJC,GAAI,QACJC,GAAI,UACJC,GAAI,uBACJC,GAAI,UAGRC,GAAI,CACF59B,KAAM,WACNs8B,YAAa,gBACbC,QAAS,CACPsB,GAAI,YAGR,QAAS,CACP79B,KAAM,mBACNs8B,YAAa,kBACbC,QAAS,CACPuB,GAAI,eAGR,QAAS,CACP99B,KAAM,gBACNs8B,YAAa,eACbC,QAAS,CACPuB,GAAI,eAGRC,GAAI,CACF/9B,KAAM,SACNs8B,YAAa,UACbC,QAAS,CACP97B,GAAI,WAGRu9B,GAAI,CACFh+B,KAAM,aACNs8B,YAAa,aACbC,QAAS,CACP0B,GAAI,YAGRC,GAAI,CACFl+B,KAAM,YACNs8B,YAAa,YACbC,QAAS,CACP2B,GAAI,aAGRC,GAAI,CACFn+B,KAAM,UACNs8B,YAAa,SACbC,QAAS,CACP97B,GAAI,YAGR29B,GAAI,CACFp+B,KAAM,UACNs8B,YAAa,OACbC,QAAS,CACP8B,GAAI,QACJC,GAAI,gBACJC,GAAI,YACJC,GAAI,YACJC,GAAI,SACJC,IAAK,eACLC,IAAK,kBAGTC,GAAI,CACF5+B,KAAM,WACNs8B,YAAa,WACbC,QAAS,CACPqC,GAAI,YAGRC,GAAI,CACF7+B,KAAM,QACNs8B,YAAa,UACbC,QAAS,CACPuC,GAAI,mBAGRC,GAAI,CACF/+B,KAAM,SACNs8B,YAAa,QACbC,QAAS,CACPyC,GAAI,YAGRC,IAAK,CACHj/B,KAAM,UACNs8B,YAAa,SACbC,QAAS,CACP2C,GAAI,aAGRC,GAAI,CACFn/B,KAAM,QACNs8B,YAAa,aACbC,QAAS,CACPyB,GAAI,UACJmB,GAAI,oBAGRC,GAAI,CACFp/B,KAAM,UACNs8B,YAAa,UACbC,QAAS,CACP8C,GAAI,YACJC,GAAI,SACJnB,GAAI,SACJoB,GAAI,YACJC,GAAI,UACJC,GAAI,UACJC,GAAI,cACJC,GAAI,cACJnD,GAAI,eACJoD,GAAI,sBACJC,GAAI,iBACJC,GAAI,gBACJC,GAAI,aAGRC,GAAI,CACFhgC,KAAM,WACNs8B,YAAa,QACbC,QAAS,CACP0D,GAAI,YAGRC,GAAI,CACFlgC,KAAM,UACNs8B,YAAa,WACbC,QAAS,CACP2D,GAAI,kBAGRC,GAAI,CACFngC,KAAM,QACNs8B,YAAa,QACbC,QAAS,CACP6D,GAAI,SAGRC,GAAI,CACFrgC,KAAM,UACNs8B,YAAa,QACbC,QAAS,CACP8D,GAAI,YAGRC,GAAI,CACFtgC,KAAM,SACNs8B,YAAa,WACbC,QAAS,CACPyB,GAAI,UACJG,GAAI,SACJmC,GAAI,SACJC,GAAI,aACJC,GAAI,SACJC,GAAI,gBAGRC,GAAI,CACF1gC,KAAM,WACNs8B,YAAa,SACbC,QAAS,CACP97B,GAAI,aAGRkgC,GAAI,CACF3gC,KAAM,WACNs8B,YAAa,UACbC,QAAS,CACPqE,GAAI,YAGRC,GAAI,CACF7gC,KAAM,SACNs8B,YAAa,UACbC,QAAS,CACPuE,GAAI,UACJD,GAAI,UACJE,GAAI,gBACJR,GAAI,aACJE,GAAI,gBAGRt4B,GAAI,CACFnI,KAAM,QACNs8B,YAAa,WACbC,QAAS,CACPyE,GAAI,WAGRC,GAAI,CACFjhC,KAAM,WACNs8B,YAAa,UACbC,QAAS,CACP,GAAM,UAGV2E,GAAI,CACFlhC,KAAM,SACNs8B,YAAa,QACbC,QAAS,CACP4E,GAAI,WAGRC,GAAI,CACFphC,KAAM,QACNs8B,YAAa,SACbC,QAAS,CACP,GAAM,UAGV8E,GAAI,CACFrhC,KAAM,YACNs8B,YAAa,SACbC,QAAS,CACP8E,GAAI,YAGRC,GAAI,CACFthC,KAAM,YACNs8B,YAAa,WACbC,QAAS,CACP+E,GAAI,YAGR9yB,GAAI,CACFxO,KAAM,aACNs8B,YAAa,mBACbC,QAAS,CACP/tB,GAAI,cAGR+yB,GAAI,CACFvhC,KAAM,UACNs8B,YAAa,WACbC,QAAS,CACPgF,GAAI,QACJd,GAAI,gBAGRe,GAAI,CACFxhC,KAAM,WACNs8B,YAAa,MACbC,QAAS,CACPkF,GAAI,UAGRC,GAAI,CACF1hC,KAAM,UACNs8B,YAAa,QACbC,QAAS,CACP,GAAM,UAGVoF,GAAI,CACF3hC,KAAM,SACNs8B,YAAa,aACbC,QAAS,CACPqF,GAAI,eAGRC,IAAK,CACH7hC,KAAM,UACNs8B,YAAa,SACbC,QAAS,CACP,GAAM,UAGVuF,GAAI,CACF9hC,KAAM,SACNs8B,YAAa,MACbC,QAAS,CACPwF,GAAI,UAGRC,GAAI,CACFhiC,KAAM,SACNs8B,YAAa,WACbC,QAAS,CACPqF,GAAI,eAGRK,GAAI,CACFjiC,KAAM,UACNs8B,YAAa,WACbC,QAAS,CACP0F,GAAI,WAGRhxB,GAAI,CACFjR,KAAM,aACNs8B,YAAa,WACbC,QAAS,CACPtrB,GAAI,cAGRixB,GAAI,CACFliC,KAAM,aACNs8B,YAAa,aACbC,QAAS,CACP2F,GAAI,YAGRC,GAAI,CACFniC,KAAM,QACNs8B,YAAa,gBACbC,QAAS,CACP6F,GAAI,SACJC,GAAI,aAGRC,GAAI,CACFtiC,KAAM,UACNs8B,YAAa,QACbC,QAAS,CACP,GAAM,UAGVgG,GAAI,CACFviC,KAAM,YACNs8B,YAAa,aACbC,QAAS,CACPgG,GAAI,aAGRC,GAAI,CACFxiC,KAAM,qBACNs8B,YAAa,iBACbC,QAAS,CACPkG,GAAI,WAGRC,GAAI,CACF1iC,KAAM,sBACNs8B,YAAa,kBACbC,QAAS,CACPkG,GAAI,WAGRE,GAAI,CACF3iC,KAAM,SACNs8B,YAAa,QACbC,QAAS,CACPoG,GAAI,WAGRC,GAAI,CACF5iC,KAAM,aACNs8B,YAAa,YACbC,QAAS,CACPsG,GAAI,SACJD,GAAI,aAGRE,GAAI,CACF9iC,KAAM,UACNs8B,YAAa,SACbC,QAAS,CACP,GAAM,UAGVwG,GAAI,CACF/iC,KAAM,WACNs8B,YAAa,SACbC,QAAS,CACPwG,GAAI,YAGRC,GAAI,CACFhjC,KAAM,UACNs8B,YAAa,UACbC,QAAS,CACPyG,GAAI,WAGRzF,GAAI,CACFv9B,KAAM,WACNs8B,YAAa,YACbC,QAAS,CACP,GAAM,UAGV,QAAS,CACPv8B,KAAM,qBACNs8B,YAAa,SACbC,QAAS,CACP0G,GAAI,WAGR,QAAS,CACPjjC,KAAM,kBACNs8B,YAAa,SACbC,QAAS,CACP0G,GAAI,WAGRC,GAAI,CACFljC,KAAM,SACNs8B,YAAa,aACbC,QAAS,CACP2G,GAAI,aAGRC,GAAI,CACFnjC,KAAM,YACNs8B,YAAa,cACbC,QAAS,CACP6G,GAAI,aAGR3iC,GAAI,CACFT,KAAM,UACNs8B,YAAa,UACbC,QAAS,CACPI,GAAI,YACJ0G,GAAI,UACJC,GAAI,QACJC,GAAI,WACJC,GAAI,aACJ,GAAM,qBACNC,GAAI,UACJC,GAAI,cACJC,GAAI,YACJC,GAAI,WACJC,GAAI,SACJC,GAAI,YACJhB,GAAI,SACJiB,GAAI,WACJC,GAAI,OACJC,GAAI,cACJxjC,GAAI,QACJyjC,GAAI,UACJC,GAAI,cAGRC,GAAI,CACFpkC,KAAM,UACNs8B,YAAa,YACbC,QAAS,CACP8H,GAAI,UAGRX,GAAI,CACF1jC,KAAM,UACNs8B,YAAa,UACbC,QAAS,CACP8D,GAAI,UACJv7B,GAAI,WAGRw/B,IAAK,CACHtkC,KAAM,SACNs8B,YAAa,eACbC,QAAS,CACPiB,GAAI,UAGR+G,GAAI,CACFvkC,KAAM,QACNs8B,YAAa,SACbC,QAAS,CACP,GAAM,UAGVqD,GAAI,CACF5/B,KAAM,QACNs8B,YAAa,aACbC,QAAS,CACPyG,GAAI,WAGRwB,GAAI,CACFxkC,KAAM,SACNs8B,YAAa,SACbC,QAAS,CACP,GAAM,UAGVkI,GAAI,CACFzkC,KAAM,OACNs8B,YAAa,MACbC,QAAS,CACPkI,GAAI,aAGRC,GAAI,CACF1kC,KAAM,UACNs8B,YAAa,SACbC,QAAS,CACPmI,GAAI,WAGRC,GAAI,CACF3kC,KAAM,YACNs8B,YAAa,aACbC,QAAS,CACPqI,GAAI,YAGRC,GAAI,CACF7kC,KAAM,OACNs8B,YAAa,SACbC,QAAS,CACPuI,GAAI,aAGR,QAAS,CACP9kC,KAAM,mBACNs8B,YAAa,QACbC,QAAS,CACPwI,GAAI,eAGR,QAAS,CACP/kC,KAAM,gBACNs8B,YAAa,cACbC,QAAS,CACPwI,GAAI,eAGRC,GAAI,CACFhlC,KAAM,aACNs8B,YAAa,aACbC,QAAS,CACP0I,GAAI,cAkBNC,oBAAsBlpC,OAAOsX,iBAAiB,CAChD6xB,oBALwB,SAA6BC,0BACrD,IAAI/3B,WAAasuB,4BAA4ByJ,0BAC7C,YAA6CtmC,IAAtCs9B,aAAa/uB,WAAW8U,SACjC,GAGG,CACDkjB,YAAa,CACXrmC,IAAK,WACH,OAAOo9B,YACT,KAsBJ,IAAIkJ,iBAAmBr3B,WACvB,SAASs3B,SAAU,CAanB,SAASC,YAAYvjC,IACnB,KAAMzD,gBAAgBgnC,aAAc,MAAM,IAAI1V,UAAU,wCACxD,GAAkB,mBAAP7tB,GAAmB,MAAM,IAAI6tB,UAAU,kBAElDtxB,KAAKinC,OAAS,EAEdjnC,KAAKknC,UAAW,EAEhBlnC,KAAKmnC,YAAS7mC,EAEdN,KAAKonC,WAAa,GAClBC,YAAY5jC,GAAIzD,KAClB,CACA,SAASsnC,SAASlqC,KAAMmqC,UACtB,KAAuB,IAAhBnqC,KAAK6pC,QACV7pC,KAAOA,KAAK+pC,OAEM,IAAhB/pC,KAAK6pC,QAIT7pC,KAAK8pC,UAAW,EAChBF,YAAYQ,cAAa,WACvB,IAAIzG,GAAqB,IAAhB3jC,KAAK6pC,OAAeM,SAASE,YAAcF,SAASG,WAC7D,GAAW,OAAP3G,GAAJ,CAIA,IAAInxB,IACJ,IACEA,IAAMmxB,GAAG3jC,KAAK+pC,OAChB,CAAE,MAAO/oC,GAEP,YADAupC,WAAWJ,SAASK,QAASxpC,EAE/B,CACAypC,UAAUN,SAASK,QAASh4B,IAR5B,MAFmB,IAAhBxS,KAAK6pC,OAAeY,UAAYF,YAAYJ,SAASK,QAASxqC,KAAK+pC,OAWxE,KAlBE/pC,KAAKgqC,WAAWtlC,KAAKylC,SAmBzB,CACA,SAASM,UAAUzqC,KAAM0qC,UACvB,IAEE,GAAIA,WAAa1qC,KAAM,MAAM,IAAIk0B,UAAU,6CAC3C,GAAIwW,WAAqC,WAAxB5jB,UAAU4jB,WAA8C,mBAAbA,UAA0B,CACpF,IAAIC,KAAOD,SAASC,KACpB,GAAID,oBAAoBd,YAItB,OAHA5pC,KAAK6pC,OAAS,EACd7pC,KAAK+pC,OAASW,cACdE,SAAS5qC,MAEJ,GAAoB,mBAAT2qC,KAEhB,YADAV,aA5DQ5jC,GA4DWskC,KA5DPpnC,QA4DamnC,SA3DxB,WACLrkC,GAAGguB,MAAM9wB,QAASyqB,UACpB,GAyD0ChuB,KAGxC,CACAA,KAAK6pC,OAAS,EACd7pC,KAAK+pC,OAASW,SACdE,SAAS5qC,KACX,CAAE,MAAOgB,GACPupC,WAAWvqC,KAAMgB,EACnB,CArEF,IAAgBqF,GAAI9C,OAsEpB,CACA,SAASgnC,WAAWvqC,KAAM0qC,UACxB1qC,KAAK6pC,OAAS,EACd7pC,KAAK+pC,OAASW,SACdE,SAAS5qC,KACX,CACA,SAAS4qC,SAAS5qC,MACI,IAAhBA,KAAK6pC,QAA2C,IAA3B7pC,KAAKgqC,WAAWxoC,QACvCooC,YAAYQ,cAAa,WAClBpqC,KAAK8pC,UACRF,YAAYiB,sBAAsB7qC,KAAK+pC,OAE3C,IAEF,IAAK,IAAIxoC,EAAI,EAAGupC,IAAM9qC,KAAKgqC,WAAWxoC,OAAQD,EAAIupC,IAAKvpC,IACrD2oC,SAASlqC,KAAMA,KAAKgqC,WAAWzoC,IAEjCvB,KAAKgqC,WAAa,IACpB,CAKA,SAASe,UAAUV,YAAaC,WAAYE,SAC1C5nC,KAAKynC,YAAqC,mBAAhBA,YAA6BA,YAAc,KACrEznC,KAAK0nC,WAAmC,mBAAfA,WAA4BA,WAAa,KAClE1nC,KAAK4nC,QAAUA,OACjB,CAQA,SAASP,YAAY5jC,GAAIrG,MACvB,IAAIgrC,MAAO,EACX,IACE3kC,IAAG,SAAUiO,OACP02B,OACJA,MAAO,EACPP,UAAUzqC,KAAMsU,OAClB,IAAG,SAAU22B,QACPD,OACJA,MAAO,EACPT,WAAWvqC,KAAMirC,QACnB,GACF,CAAE,MAAO9lC,IACP,GAAI6lC,KAAM,OACVA,MAAO,EACPT,WAAWvqC,KAAMmF,GACnB,CACF,CACAykC,YAAYvpC,UAAiB,MAAI,SAAUiqC,YACzC,OAAO1nC,KAAK+nC,KAAK,KAAML,WACzB,EACAV,YAAYvpC,UAAUsqC,KAAO,SAAUN,YAAaC,YAElD,IAAIY,KAAO,IAAItoC,KAAKskB,YAAYyiB,QAEhC,OADAO,SAAStnC,KAAM,IAAImoC,UAAUV,YAAaC,WAAYY,OAC/CA,IACT,EACAtB,YAAYvpC,UAAmB,QAvJ/B,SAA8BiD,UAC5B,IAAI4jB,YAActkB,KAAKskB,YACvB,OAAOtkB,KAAK+nC,MAAK,SAAUr2B,OACzB,OAAO4S,YAAYmK,QAAQ/tB,YAAYqnC,MAAK,WAC1C,OAAOr2B,KACT,GACF,IAAG,SAAU22B,QACX,OAAO/jB,YAAYmK,QAAQ/tB,YAAYqnC,MAAK,WAC1C,OAAOzjB,YAAYikB,OAAOF,OAC5B,GACF,GACF,EA6IArB,YAAYwB,IAAM,SAAUC,KAC1B,OAAO,IAAIzB,aAAY,SAAUvY,QAAS8Z,QACxC,IAAKE,UAA6B,IAAfA,IAAI7pC,OAAwB,MAAM,IAAI0yB,UAAU,gCACnE,IAAIE,KAAOnqB,MAAM5J,UAAU+J,MAAM7J,KAAK8qC,KACtC,GAAoB,IAAhBjX,KAAK5yB,OAAc,OAAO6vB,QAAQ,IACtC,IAAI0H,UAAY3E,KAAK5yB,OACrB,SAAS8pC,IAAI/pC,EAAGgqC,KACd,IACE,GAAIA,MAA2B,WAAnBzkB,UAAUykB,MAAoC,mBAARA,KAAqB,CACrE,IAAIZ,KAAOY,IAAIZ,KACf,GAAoB,mBAATA,KAIT,YAHAA,KAAKpqC,KAAKgrC,KAAK,SAAUA,KACvBD,IAAI/pC,EAAGgqC,IACT,GAAGJ,OAGP,CACA/W,KAAK7yB,GAAKgqC,IACU,KAAdxS,WACJ1H,QAAQ+C,KAEZ,CAAE,MAAOjvB,IACPgmC,OAAOhmC,GACT,CACF,CACA,IAAK,IAAI5D,EAAI,EAAGA,EAAI6yB,KAAK5yB,OAAQD,IAC/B+pC,IAAI/pC,EAAG6yB,KAAK7yB,GAEhB,GACF,EACAqoC,YAAYvY,QAAU,SAAU/c,OAC9B,OAAIA,OAA8B,WAArBwS,UAAUxS,QAAuBA,MAAM4S,cAAgB0iB,YAC3Dt1B,MAEF,IAAIs1B,aAAY,SAAUvY,SAC/BA,QAAQ/c,MACV,GACF,EACAs1B,YAAYuB,OAAS,SAAU72B,OAC7B,OAAO,IAAIs1B,aAAY,SAAUvY,QAAS8Z,QACxCA,OAAO72B,MACT,GACF,EACAs1B,YAAY4B,KAAO,SAAUpgB,QAC3B,OAAO,IAAIwe,aAAY,SAAUvY,QAAS8Z,QACxC,IAAK,IAAI5pC,EAAI,EAAGupC,IAAM1f,OAAO5pB,OAAQD,EAAIupC,IAAKvpC,IAC5C6pB,OAAO7pB,GAAGopC,KAAKtZ,QAAS8Z,OAE5B,GACF,EAGAvB,YAAYQ,aAAuC,mBAAjBqB,cAA+B,SAAUplC,IACzEolC,aAAaplC,GACf,GAAK,SAAUA,IACbqjC,iBAAiBrjC,GAAI,EACvB,EACAujC,YAAYiB,sBAAwB,SAA+Ba,KAC1C,oBAAZC,SAA2BA,SACpCA,QAAQC,KAAK,wCAAyCF,IAE1D,EACA,IAAIG,WAAa,SAASA,WAAWC,SAAUC,WAAYC,SAAUC,YAYnE,MAAO,CACLC,QAZY,WACZ,OAAO,IAAItC,aAAY,SAAUvY,QAAS8Z,QACxC,IACEW,SAASC,WACX,CAAE,MAAO/0B,OACPm0B,OAAOn0B,MACT,CAEAqa,QADWwa,WAAWG,SAAUC,WAAYH,SAAUC,YAExD,GACF,EAIF,EAUII,oBAWM,SAAgBL,SAAUC,WAAYC,SAAUC,YACtD,OAAOJ,WAAWC,SAAUC,WAAYC,SAAUC,WACpD,EAbEE,kBAcI,WACJ,MAvBK,CACLD,QAAS,WACP,OAAOtC,YAAYvY,SACrB,EAqBF,EA0DE+a,wBAWM,SAAgBC,cACtB,OApEiB,SAAwBA,cAC3C,IAAIC,GACAC,GACAC,OACAC,QACJ,GAAI3R,SAASuR,cAAe,CAC1B,IAAIzN,OAASyN,aAAatO,MAAM,KAChCuO,GAAKI,OAAO9N,OAAO,IACnB2N,GAAKG,OAAO9N,OAAO,IACnB4N,OAASE,OAAO9N,OAAO,IACvB6N,QAAUC,OAAO9N,OAAO,GAC1B,KAAO,KAAI1V,SAASmjB,cAMlB,MAAM,IAAIp1B,MAAM,yFALhBq1B,GAAKD,aAAansC,EAClBqsC,GAAKF,aAAazqC,EAClB4qC,OAASH,aAAatqC,MACtB0qC,QAAUJ,aAAarqC,MAGzB,CACA,IAAI2qC,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCxX,EAAG,CACDkD,IAAK,WACH,OAAOkpC,EACT,GAEF1qC,EAAG,CACDwB,IAAK,WACH,OAAOmpC,EACT,GAEFxqC,MAAO,CACLqB,IAAK,WACH,OAAOopC,MACT,GAEFxqC,OAAQ,CACNoB,IAAK,WACH,OAAOqpC,OACT,KAcJ,OAXAE,QAAQrM,OAAS,WACf,MAAO,CACLpgC,EAAGosC,GACH1qC,EAAG2qC,GACHxqC,MAAOyqC,OACPxqC,OAAQyqC,QAEZ,EACAE,QAAQC,SAAW,WACjB,MAAO,CAACN,GAAIC,GAAIC,OAAQC,SAASpM,KAAK,KACxC,EACOsM,OACT,CAeWE,CAAeR,aACxB,EAQES,iBAAmB,SAA0BC,QAE/C,MADiB,SACVA,OAAO/Q,aAChB,EACIgR,YAAc,SAAqBC,gBAAiBC,kBAClChqC,IAAhBgqC,cACFA,YAAc,GAEhB,IAAIC,WAAa,EAEjB,GAAIF,gBAIF,IAFAE,UAAYF,gBAAgB33B,QAlBP,KAkBmC43B,cAElC,IAAfC,WAAkB,CAEvB,GAAIA,UAAY,EAAIF,gBAAgBzrC,OAAQ,CAC1C,IAAI4rC,MAAQH,gBAAgBjR,cAAcpH,WAAWuY,UAAY,GAEjE,GArBqB,IAqBSC,OAASA,OApBlB,IAqBnB,KAEJ,CAEAD,UAAYF,gBAAgB33B,QA9BT,KA8BqC63B,UAAY,EACtE,CAIF,OAAOA,SACT,EACIE,SAAW,SAAkBC,QAASC,cACxC,IAAIR,OACJ,IAAsB,IAAlBQ,aAAqB,CACvB,IAAIC,KAAOF,QAAQh4B,QAtCA,IAsC0Bi4B,aAAe,GAE1DR,QADY,IAAVS,KACOF,QAAQG,UAAUF,aAAe,EAAGC,KAAO,GAE3CF,QAAQG,UAAUF,aAAe,EAE9C,CACA,OAAOR,MACT,EACIW,0BAA4B,SAAmCT,gBAAiBC,kBAC9DhqC,IAAhBgqC,cACFA,YAAc,GAGhB,IADA,IAAIC,UAAYH,YAAYC,gBAAiBC,cACvB,IAAfC,WAAkB,CACvB,IAAIJ,OAASM,SAASJ,gBAAiBE,WACvC,GAAIJ,SAAWD,iBAAiBC,QAC9B,MAEFI,UAAYH,YAAYC,gBAAiBE,UAAY,EACvD,CACA,OAAOA,SACT,EACIQ,kBAAoB,SAA2BZ,OAAQa,UAIzD,IAHA,IAAIC,aAAe,GACfC,YAAc,GACdC,kBAAoBH,SAAS7lB,MAC1BgmB,mBAAqBA,oBAAsBhB,QAAUa,SAASpsC,QACnEqsC,cApEqB,KAoEgBE,kBACrCD,YAAYppC,KAAKspC,YAAYD,oBACzBH,SAASpsC,SACXusC,kBAAoBH,SAAS7lB,OAIjC,IADA8lB,cA1EuB,KA0Ecd,OAC9Be,YAAYtsC,QAAQ,CACzB,IAAIysC,iBAAmBH,YAAY/lB,MAC/BkmB,mBACFJ,cA9EmB,KA8EkBI,iBACrCL,SAASlpC,KAAKspC,YAAYC,mBAE9B,CACA,OAAOJ,YACT,EACIK,aAAe,SAAsBnB,QACvC,OAA+C,IAAxCA,OAAOz3B,QApFS,IAqFzB,EACI04B,YAAc,SAAqBG,YACrC,IAAIC,SAAW,GAef,MAdmB,KAAfD,aAEED,aAAaC,YACfC,SAAWD,WAAWV,UAAU,EAAGU,WAAW74B,QA3F3B,QA+FoB,IAAnC64B,WAAW74B,QA7FL,OA8FR84B,SAAWD,WAAWV,UAAU,EAAGU,WAAW74B,QA9FtC,OAgGV84B,UAlGmB,KAoGrBA,UAlGY,KAoGPA,QACT,EACIC,UAAY,SAAmBC,SAAUf,cAC3C,IAAsB,IAAlBA,cAAuBe,UAAYf,aAAee,SAAS9sC,OAAQ,CAErE,IAAI+sC,QAAUD,SAASh5B,QA1GJ,IA0G8Bi4B,cAI/Ce,UAFe,IAAbC,QAESD,SAASb,UAAU,EAAGF,cAAgBe,SAASb,UAAUc,QAAU,GAEnED,SAASb,UAAU,EAAGF,aAErC,CACA,OAAOe,QACT,EACIE,WAAa,SAAoBF,UACnC,KAAOA,SAAS9sC,OAAS,GArHX,MAqHgB8sC,SAASG,OAAO,IAC5CH,SAAWA,SAASb,UAAU,GAEhC,KAAOa,SAAS9sC,OAAS,GAxHX,MAwHgB8sC,SAASG,OAAOH,SAAS9sC,OAAS,IAC9D8sC,SAAWA,SAASb,UAAU,EAAGa,SAAS9sC,OAAS,GAKrD,MA9Hc,MA2HV8sC,WACFA,SAAW,IAENA,QACT,EA0III,WApDS,SAAgBC,KAiB3B,OAhBIA,IAAI9Z,MAAM,aAEuB,OADnC8Z,IAAMA,IAAIxkB,QAAQ,WAAY,KACtBskB,OAAOE,IAAIntC,OAAS,KAC1BmtC,IAAMA,IAAIlB,UAAU,EAAGkB,IAAIntC,OAAS,IAYxCmtC,KADAA,KADAA,KADAA,KADAA,KADAA,KADAA,KADAA,KADAA,KADAA,IAAMA,IAAIxkB,QAAQ,QAAS,KACjBA,QAAQ,SAAU,KAClBA,QAAQ,QAAS,KACjBA,QAAQ,SAAU,KAClBA,QAAQ,SAAU,KAClBA,QAAQ,UAAW,KACnBA,QAAQ,SAAU,KAClBA,QAAQ,OAAQ,MAChBA,QAAQ,OAAQ,MAChBA,QAAQ,QAAS,KAE7B,EAkCIukB,WAjCS,SAAgBC,KAK3B,IAAIC,mBAAoB,EAwBxB,OArBgC,KAJhCD,KADAA,KADAA,IA1EoB,SAAyBL,UAC7C,IAAIO,SAAWP,SACf,GAAIO,SAIF,IADA,IAAIC,wBAA0B,EACvBA,wBAA0B,GAAG,CAClCA,wBAA0B,EAG1B,IADA,IAAI3B,UAAYO,0BAA0BmB,WACpB,IAAf1B,WAAkB,CAEvB,IAAI4B,cAAgBrB,0BAA0BmB,SAAU1B,UAAY,GAGhEJ,OAASM,SAASwB,SAAU1B,WAEhC,GAAIJ,SAEqB,IAAnBgC,cAAsB,CAExB,IAAIC,gBAAkBhB,YAAYjB,QAG9BkC,WAAa5B,SAASwB,SAAUE,eAEpC,GAAIE,YAAcA,aAAeD,gBAAiB,CAEhD,IAAIE,oBAAsB/B,UAAY,EAAIJ,OAAOvrC,OAC7C2tC,WAAaN,SAASpB,UAAUyB,oBAAqBH,eAEpDP,WAAWW,YAAY3tC,SAE1BqtC,SAAWR,UAAUQ,SAAUE,eAE/BF,SAAWR,UAAUQ,SAAU1B,WAG/B4B,eAAiBhC,OAAOvrC,OAAS,EAEjCstC,0BAEJ,CACF,CAIF3B,UAAY4B,aACd,CACF,CAEF,OAAOF,QACT,CAsBQO,CADNT,IAzGa,SAAkBL,UAC/B,GAAIA,SAGF,IAFA,IAAIe,YAAc,GACdlC,UAAYO,0BAA0BY,WACpB,IAAfnB,WAAkB,CAEvB,IAAIJ,OAASM,SAASiB,SAAUnB,WAChC,GAAIJ,QAAUmB,aAAanB,QAAS,CAElC,IAAIc,aAAeF,kBAAkBZ,OAAQsC,aAGzCd,QAAUD,SAASh5B,QA7IR,IA6IkC63B,WAE/CmB,UADe,IAAbC,QACSD,SAASb,UAAU,EAAGN,WAAaU,aAAeS,SAASb,UAAUc,QAAU,GAE/ED,SAASb,UAAU,EAAGN,WAAaU,aAIhDV,WAAaU,aAAarsC,MAC5B,MACMurC,SAAWD,iBAAiBC,SAC9BsC,YAAY3qC,KAAKspC,YAAYjB,SAE/BI,UAAYT,OAAOS,WAAa,EAElCA,UAAYH,YAAYsB,SAAUnB,UACpC,CAEF,OAAOmB,QACT,CA0EQgB,CAASX,OAEL5Q,MAAM,KAAKsC,KAAK,SAChBtC,MAAM,KAAKsC,KAAK,SAIlB/qB,QAAQ,aACdq5B,IAAMA,IAAI5Q,MAAM,YAAYsC,KAAK,IACjCuO,mBAAoB,GAWtBD,KADAA,KADAA,KADAA,KADAA,KADAA,KADAA,KADAA,KADAA,KADAA,IAAMA,IAAI5Q,MAAM,SAASsC,KAAK,SACpBtC,MAAM,SAASsC,KAAK,SACpBtC,MAAM,UAAUsC,KAAK,SACrBtC,MAAM,QAAQsC,KAAK,QACnBtC,MAAM,QAAQsC,KAAK,QACnBtC,MAAM,SAASsC,KAAK,QACpBtC,MAAM,UAAUsC,KAAK,UACrBtC,MAAM,OAAOsC,KAAK,MAClBtC,MAAM,OAAOsC,KAAK,MAClBtC,MAAM,QAAQsC,KAAK,MACzBuO,mBAAoD,MAA/BD,IAAIF,OAAOE,IAAIntC,OAAS,KAC/CmtC,IAAMA,IAAIlB,UAAU,EAAGkB,IAAIntC,OAAS,IAKtCmtC,KADAA,IAAMA,IAAI5Q,MAAM,cAAcsC,KAAK,UACzBtC,MAAM,cAAcsC,KAAK,QAErC,EAwBIkP,YAAc,SAAqBC,QACrC,IACIC,MACAC,WACAC,YAHAC,oBAAsB7P,4BAA4BuJ,oBAAoBG,YAAqB,SAI3FoG,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBACtCmV,sBAAwB,SAASA,sBAAsBvG,0BACpDF,oBAAoBC,oBAAoBC,4BAC3CA,yBAA2BF,oBAAoBG,YAAqB,SAEtE,IAAIuG,iCAAmCJ,oBAAoBn+B,WAE3D,OADAm+B,oBAAsB7P,4BAA4ByJ,0BAC3C2C,oBAAoB4D,sBAAuBC,iCAAkCD,sBAAuBvG,yBAC7G,EACIyG,QAAU,SAASA,QAAQpQ,MAC7B,GAAoB,iBAATA,KACT,MAAM,IAAI5oB,MAAM,gDAAkD4oB,KAAO,KAE3E,IAAInG,SAAW+V,MAIf,OAFAC,WAAahB,WADbe,MAAQ5P,MAER8P,YAAcjB,WAAWe,OAClBtD,oBAAoB8D,QAASvW,SAAUuW,QAASR,MACzD,EAWI9C,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCsoB,mBAAoB,CAClB58B,IAAK,WACH,OAAOwsC,mBACT,GAEFrpB,SAAU,CACRnjB,IAAK,WACH,OAAOwsC,oBAAoBrpB,QAC7B,GAEFsZ,KAAM,CACJz8B,IAAK,WACH,OAAOqsC,KACT,GAEFS,UAAW,CACT9sC,IAAK,WACH,OAAOssC,UACT,GAEFS,WAAY,CACV/sC,IAAK,WACH,OAAOusC,WACT,KA0BJ,GAvBAhD,QAAQoD,sBAAwBA,sBAChCpD,QAAQsD,QAAUA,QAClBtD,QAAQzN,MAvCI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNi7B,KAAM,CACJ,WAAYuQ,oBAAoBn+B,YAElCouB,KAAM4P,OAER,OAAOK,YAAY/Q,wBAAwBqR,SAC7C,EA+BAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTrQ,mBAAoB4P,oBAAoBtP,SACxC/Z,SAAUqpB,oBAAoBrpB,SAC9BsZ,KAAM4P,MACNS,UAAWR,WACXS,WAAYR,aAEV1Q,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,GAvFmB,SAAwBb,QAC3C,OAAOA,QAAiC,iBAAhBA,OAAO3P,QAAuB2P,OAAOhG,0BAAuE,iBAApCgG,OAAOhG,yBACzG,CAsFM8G,CAAed,QAWjB,MAAM,IAAIv4B,MAAM,oDAElB,OAZEvU,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,6BAARA,IACFw7B,sBAAsBP,OAAOhG,0BACZ,SAARj1B,IACT07B,QAAQT,OAAO3P,MACL1W,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAIKo4B,OACT,EAYI4D,qBAUM,SAAgBf,QACtB,OAAOD,YAAYC,OACrB,EAZEe,mCAXuB,SAA8BC,aACvD,IACIC,QADc,IAAItS,oBAAoBvD,mBAChB4B,eAAegU,aACrChB,OAAS,CACXhG,yBAA0BgH,YAAY9/B,aAAa,YACnDmvB,KAAM4Q,SAER,OAAOlB,YAAYC,OACrB,EAyBIkB,mBAAqB,GACrBC,gBAAkB,CACpB9Q,UAAM38B,EACNgtC,eAAWhtC,EACXitC,gBAAYjtC,GAEV0tC,QAAU,SAAiBpB,QAC7B,IAAIqB,WACAC,UAEAC,qBACAC,mBACAC,MACAC,OACAC,YACAC,aACAC,gBAPAC,iBAAmB,GAQnBC,0BAA4BxR,4BAA4BuJ,oBAAoBG,YAAqB,SACjGoG,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBAMtC4W,aAAe,SAASA,aAAaC,WACvC,GAAyB,iBAAdA,UACT,MAAM,IAAIx6B,MAAM,qDAAuDw6B,UAAY,KAErF,IAAI/X,SAAWmX,WAEf,OADAA,WAAaxhC,KAAKqiC,MAAMD,WACjBtF,oBAAoBqF,aAAc9X,SAAU8X,aAAcX,WACnE,EACIc,YAAc,SAASA,YAAYC,UACrC,GAAwB,iBAAbA,SACT,MAAM,IAAI36B,MAAM,oDAAsD26B,SAAW,KAEnF,IAAIlY,SAAWoX,UAEf,OADAA,UAAYzhC,KAAKqiC,MAAME,UAChBzF,oBAAoBwF,YAAajY,SAAUiY,YAAab,UACjE,EACIe,wBAA0B,SAASA,wBAAwBC,gBAC7D,IAAIC,yBAA2Bna,UAAU0Z,kBAAkB,SAAUU,aACnE,OAAOA,YAAYhS,mBAAmBvuB,aAAeqgC,eAAe9R,mBAAmBvuB,UACzF,IACA,IAAkC,IAA9BsgC,yBAAiC,CACnC,IAAIE,eAAiBX,iBAAiBS,0BAEtC,OADAT,iBAAiB/7B,OAAOw8B,yBAA0B,EAAGD,gBAC9C3F,oBAAoB0F,wBAAyBI,eAAgBJ,wBAAyBC,eAC/F,CAMA,OALIA,eAAexR,OACjBgR,iBAAiB5sC,KAAKotC,gBAEtBR,iBAAiB5sC,KAAK6rC,qBAAqBuB,iBAEtC3F,oBAAoB+F,kBAAmBJ,eAAgBD,wBAAyBC,eACzF,EACII,kBAAoB,SAASA,kBAAkBC,aACjD,IAAIC,oBAAsBlnC,OAAOomC,kBAAkB,SAAUe,iBAC3D,OAAOA,gBAAgBrS,mBAAmBvuB,aAAe0gC,YAAYnS,mBAAmBvuB,YAAc4gC,gBAAgBxS,OAASsS,YAAYtS,IAC7I,IACIyS,mBAAqBF,oBAAoB5wC,OAAS,EAAI4wC,oBAAoB,QAAKlvC,EACnF,OAAOipC,oBAAoB0F,wBAAyBS,mBAAoBJ,kBAAmBC,YAC7F,EACII,uBAAyB,SAASA,uBAAuBC,qBAC3D,GAAmC,iBAAxBA,oBACT,MAAM,IAAIv7B,MAAM,+DAAiEu7B,oBAAsB,KAIzG,OAAOrG,oBAAoBoG,uBAFZxB,qBAE8CwB,uBAD7DxB,qBAAuByB,oBAEzB,EACIC,qBAAuB,SAASA,qBAAqBC,mBACvD,GAAiC,iBAAtBA,kBACT,MAAM,IAAIz7B,MAAM,6DAA+Dy7B,kBAAoB,KAIrG,OAAOvG,oBAAoBsG,qBAFZzB,mBAE4CyB,qBAD3DzB,mBAAqB0B,kBAEvB,EACIC,QAAU,SAASA,QAAQC,MAC7B,GAAoB,iBAATA,KACT,MAAM,IAAI37B,MAAM,gDAAkD27B,KAAO,KAI3E,OAAOzG,oBAAoBwG,QAFZ1B,MAE+B0B,QAD9C1B,MAAQ2B,KAEV,EACIC,SAAW,SAASA,SAASC,OAC/B,GAAqB,iBAAVA,MACT,MAAM,IAAI77B,MAAM,iDAAmD67B,MAAQ,KAI7E,OAAO3G,oBAAoB0G,SAFZ3B,OAEgC2B,SAD/C3B,OAAS4B,MAEX,EACIC,cAAgB,SAASA,cAAcC,YACzC,GAA0B,iBAAfA,WACT,MAAM,IAAI/7B,MAAM,sDAAwD+7B,WAAa,KAIvF,OAAO7G,oBAAoB4G,cAFZ5B,YAEqC4B,cADpD5B,YAAc6B,WAEhB,EACIC,eAAiB,SAASA,eAAeC,aAC3C,GAA2B,iBAAhBA,YACT,MAAM,IAAIj8B,MAAM,uDAAyDi8B,YAAc,KAIzF,OAAO/G,oBAAoB8G,eAFZ7B,aAEsC6B,eADrD7B,aAAe8B,YAEjB,EACIC,kBAAoB,SAASA,kBAAkBC,gBACjD,GAAkC,WAA9BtsB,UAAUssB,gBACZ,MAAM,IAAIn8B,MAAM,2DAA6Dm8B,eAAiB,KAIhG,OAAOjH,oBAAoBgH,kBAFZ9B,gBAEyC8B,kBADxD9B,gBAAkB+B,eAEpB,EA4BIC,eAAiB,WACnB,GAAgC,IAA5B/B,iBAAiB9vC,OACnB,OAAOmvC,gBAET,GAAIY,0BAA0B9/B,aAAe63B,oBAAoBG,YAAqB,QACpF,OAAO6H,iBAAiB,GAE1B,IAAIgC,qBAAuBxb,KAAKwZ,kBAAkB,SAAUa,aAC1D,OAAOA,YAAYnS,mBAAmBvuB,aAAe8/B,0BAA0B9/B,UACjF,IAMA,OALK6hC,uBACHA,qBAAuBxb,KAAKwZ,kBAAkB,SAAUa,aACtD,OAAOA,YAAY5rB,WAAagrB,0BAA0BhrB,QAC5D,KAEK+sB,sBAAwB3C,eACjC,EACIhE,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxC+5B,UAAW,CACTruC,IAAK,WACH,OAAOytC,UACT,GAEFe,SAAU,CACRxuC,IAAK,WACH,OAAO0tC,SACT,GAEFyC,QAAS,CACPnwC,IAAK,WACH,OAAOytC,WAAaC,SACtB,GAEF0C,gBAAiB,CACfpwC,IAAK,WACH,OAAOkuC,gBACT,GAEFzR,KAAM,CACJz8B,IAAK,WACH,OAAOiwC,iBAAiBxT,IAC1B,GAEFqQ,UAAW,CACT9sC,IAAK,WACH,OAAOiwC,iBAAiBnD,SAC1B,GAEFC,WAAY,CACV/sC,IAAK,WACH,OAAOiwC,iBAAiBlD,UAC1B,GAEFqC,oBAAqB,CACnBpvC,IAAK,WACH,OAAO2tC,oBACT,GAEF2B,kBAAmB,CACjBtvC,IAAK,WACH,OAAO4tC,kBACT,GAEF4B,KAAM,CACJxvC,IAAK,WACH,OAAO6tC,KACT,GAEF6B,MAAO,CACL1vC,IAAK,WACH,OAAO8tC,MACT,GAEF8B,WAAY,CACV5vC,IAAK,WACH,OAAO+tC,WACT,GAEF+B,YAAa,CACX9vC,IAAK,WACH,OAAOguC,YACT,GAEFgC,eAAgB,CACdhwC,IAAK,WACH,OAAOiuC,eACT,GAEFoC,yBAA0B,CACxBrwC,IAAK,WACH,OAAOmuC,yBACT,EACAxuC,IAAK,SAAai9B,oBAChBuR,0BAA4BvR,kBAC9B,KA0EJ,OAvEA2M,QAAQ+G,sBAhOoB,WAC1B,OAAOxpC,IAAIonC,kBAAkB,SAAUa,aACrC,OAAOA,YAAYnS,mBAAmBvuB,UACxC,GACF,EA6NAk7B,QAAQ6E,aAAeA,aACvB7E,QAAQgF,YAAcA,YACtBhF,QAAQkF,wBAA0BA,wBAClClF,QAAQuF,kBAAoBA,kBAC5BvF,QAAQ4F,uBAAyBA,uBACjC5F,QAAQ8F,qBAAuBA,qBAC/B9F,QAAQgG,QAAUA,QAClBhG,QAAQkG,SAAWA,SACnBlG,QAAQoG,cAAgBA,cACxBpG,QAAQsG,eAAiBA,eACzBtG,QAAQwG,kBAAoBA,kBAC5BxG,QAAQzN,MAxII,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,kBAAmBwR,WACnB,iBAAkBC,UAClB,eAAgBC,qBAChB,eAAgBC,mBAChB,aAAcC,MACd,cAAeC,OACf,mBAAoBC,YACpB,oBAAqBC,aACrB,kBAAmBC,gBAAkB,CAACA,gBAAgBnxC,EAAGmxC,gBAAgBzvC,EAAGyvC,gBAAgBtvC,MAAOsvC,gBAAgBrvC,QAAQq+B,KAAK,WAAQn9B,GAE1Iy8B,SAAU,CAAC,CACTv7B,KAAM,aACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAU2R,wBAKlB,OAAOxB,YAAY/Q,wBAAwBqR,SAC7C,EA+GAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACToB,UAAWZ,WACXe,SAAUd,UACV0C,gBAAiBpa,UAAUkY,iBAAkB,UAC7CkB,oBAAqBzB,qBACrB2B,kBAAmB1B,mBACnB4B,KAAM3B,MACN6B,MAAO5B,OACP8B,WAAY7B,YACZ+B,YAAa9B,aACbgC,eAAgB/B,gBAAkBA,gBAAgB/Q,SAAW+Q,iBAE3DpS,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACIb,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,cAARA,KAAmD,iBAArBi7B,OAAOiC,UACvCD,aAAahC,OAAOiC,WACH,aAARl9B,KAAiD,iBAApBi7B,OAAOoC,SAC7CD,YAAYnC,OAAOoC,UACF,oBAARr9B,KAA6Bi7B,OAAOgE,gBAC7CtpC,IAAIslC,OAAOgE,gBAAiB3B,yBACX,wBAARt9B,KAAiCi7B,OAAOgD,oBACjDD,uBAAuB/C,OAAOgD,qBACb,sBAARj+B,KAA+Bi7B,OAAOkD,kBAC/CD,qBAAqBjD,OAAOkD,mBACX,SAARn+B,KAAkBi7B,OAAOoD,KAClCD,QAAQnD,OAAOoD,MACE,UAARr+B,KAAmBi7B,OAAOsD,MACnCD,SAASrD,OAAOsD,OACC,eAARv+B,KAAqD,iBAAtBi7B,OAAOwD,WAC/CD,cAAcvD,OAAOwD,YACJ,gBAARz+B,KAAuD,iBAAvBi7B,OAAO0D,YAChDD,eAAezD,OAAO0D,aACL,mBAAR3+B,KAA4Bi7B,OAAO4D,gBACvC5D,OAAO4D,eAAe9S,SACzBkP,OAAO4D,eAAiBhH,wBAAwBoD,OAAO4D,iBAEzDD,kBAAkB3D,OAAO4D,iBACfjqB,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF7R,QAAQguC,oBAAoB,SAAU/mB,MACpCA,KAAKgjB,QACP,IACOA,OACT,EAyCIgH,iBAkBM,SAAgBnE,QACtB,OAAOoB,QAAQpB,OACjB,EApBEmE,+BAxCyB,SAAgCC,gBAC3D,IAEIJ,gBAAkBtpC,IAFJ,IAAIi0B,oBAAoBvD,mBACJ+D,6BAA6BiV,eAAgB,UACpCrD,oCAC3Cf,OAAS,CACXiC,UAAW/E,OAAOkH,eAAeljC,aAAa,oBAC9CkhC,SAAUlF,OAAOkH,eAAeljC,aAAa,mBAC7C8iC,gBACAhB,oBAAqBoB,eAAeljC,aAAa,gBACjDgiC,kBAAmBkB,eAAeljC,aAAa,iBAiBjD,OAfIkjC,eAAeljC,aAAa,gBAC9B8+B,OAAOoD,KAAOgB,eAAeljC,aAAa,eAExCkjC,eAAeljC,aAAa,iBAC9B8+B,OAAOsD,MAAQc,eAAeljC,aAAa,gBAEzCkjC,eAAeljC,aAAa,sBAC9B8+B,OAAOwD,WAAatG,OAAOkH,eAAeljC,aAAa,sBAErDkjC,eAAeljC,aAAa,uBAC9B8+B,OAAO0D,YAAcxG,OAAOkH,eAAeljC,aAAa,uBAEtDkjC,eAAeljC,aAAa,qBAC9B8+B,OAAO4D,eAAiBhH,wBAAwBwH,eAAeljC,aAAa,qBAEvEkgC,QAAQpB,OACjB,EA+DA,IAAIqE,YALJ,SAA8BxtC,GAAI7F,QAChC,OAEG6F,GAFI7F,OAAS,CACdC,QAAS,CAAC,GACED,OAAOC,SAAUD,OAAOC,OACxC,CACkBqzC,EAAqB,SAAUtzC,SAK/C,SAAW6O,MACT,IAAI0kC,SAAW,OACbC,UAAY,OACZC,YAAc,EACdC,UAAY7kC,KAAK8kC,MACjBC,QAAU/kC,KAAKglC,IACfC,QAAUjlC,KAAKsoB,IACf4c,WAAallC,KAAKmlC,OACpB,SAASC,UAAUC,MAAOC,MAKxB,GAHAA,KAAOA,MAAQ,CAAC,GADhBD,MAAQA,OAAgB,cAIHD,UACnB,OAAOC,MAGT,KAAM9xC,gBAAgB6xC,WACpB,OAAO,IAAIA,UAAUC,MAAOC,MAE9B,IAAIC,IAkSN,SAAoBF,OAClB,IAAIE,IAAM,CACRxmC,EAAG,EACHrO,EAAG,EACH80C,EAAG,GAEDpkC,EAAI,EACJnM,EAAI,KACJrB,EAAI,KACJ6B,EAAI,KACJgwC,IAAK,EACLC,QAAS,EACO,iBAATL,QACTA,MAqvBJ,SAA6BA,OAC3BA,MAAQA,MAAMvqB,QAAQ4pB,SAAU,IAAI5pB,QAAQ6pB,UAAW,IAAIhY,cAC3D,IAkBInH,MAlBAmgB,OAAQ,EACZ,GAAIC,MAAMP,OACRA,MAAQO,MAAMP,OACdM,OAAQ,OACH,GAAa,eAATN,MACT,MAAO,CACLtmC,EAAG,EACHrO,EAAG,EACH80C,EAAG,EACHpkC,EAAG,EACHskC,OAAQ,QASZ,GAAIlgB,MAAQqgB,SAASN,IAAIvjC,KAAKqjC,OAC5B,MAAO,CACLtmC,EAAGymB,MAAM,GACT90B,EAAG80B,MAAM,GACTggB,EAAGhgB,MAAM,IAGb,GAAIA,MAAQqgB,SAASC,KAAK9jC,KAAKqjC,OAC7B,MAAO,CACLtmC,EAAGymB,MAAM,GACT90B,EAAG80B,MAAM,GACTggB,EAAGhgB,MAAM,GACTpkB,EAAGokB,MAAM,IAGb,GAAIA,MAAQqgB,SAASE,IAAI/jC,KAAKqjC,OAC5B,MAAO,CACLl/B,EAAGqf,MAAM,GACTvwB,EAAGuwB,MAAM,GACT/vB,EAAG+vB,MAAM,IAGb,GAAIA,MAAQqgB,SAASG,KAAKhkC,KAAKqjC,OAC7B,MAAO,CACLl/B,EAAGqf,MAAM,GACTvwB,EAAGuwB,MAAM,GACT/vB,EAAG+vB,MAAM,GACTpkB,EAAGokB,MAAM,IAGb,GAAIA,MAAQqgB,SAASI,IAAIjkC,KAAKqjC,OAC5B,MAAO,CACLl/B,EAAGqf,MAAM,GACTvwB,EAAGuwB,MAAM,GACT5xB,EAAG4xB,MAAM,IAGb,GAAIA,MAAQqgB,SAASK,KAAKlkC,KAAKqjC,OAC7B,MAAO,CACLl/B,EAAGqf,MAAM,GACTvwB,EAAGuwB,MAAM,GACT5xB,EAAG4xB,MAAM,GACTpkB,EAAGokB,MAAM,IAGb,GAAIA,MAAQqgB,SAASM,KAAKnkC,KAAKqjC,OAC7B,MAAO,CACLtmC,EAAGqnC,gBAAgB5gB,MAAM,IACzB90B,EAAG01C,gBAAgB5gB,MAAM,IACzBggB,EAAGY,gBAAgB5gB,MAAM,IACzBpkB,EAAGilC,oBAAoB7gB,MAAM,IAC7BkgB,OAAQC,MAAQ,OAAS,QAG7B,GAAIngB,MAAQqgB,SAASS,KAAKtkC,KAAKqjC,OAC7B,MAAO,CACLtmC,EAAGqnC,gBAAgB5gB,MAAM,IACzB90B,EAAG01C,gBAAgB5gB,MAAM,IACzBggB,EAAGY,gBAAgB5gB,MAAM,IACzBkgB,OAAQC,MAAQ,OAAS,OAG7B,GAAIngB,MAAQqgB,SAASU,KAAKvkC,KAAKqjC,OAC7B,MAAO,CACLtmC,EAAGqnC,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzC90B,EAAG01C,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzCggB,EAAGY,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzCpkB,EAAGilC,oBAAoB7gB,MAAM,GAAK,GAAKA,MAAM,IAC7CkgB,OAAQC,MAAQ,OAAS,QAG7B,GAAIngB,MAAQqgB,SAASW,KAAKxkC,KAAKqjC,OAC7B,MAAO,CACLtmC,EAAGqnC,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzC90B,EAAG01C,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzCggB,EAAGY,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzCkgB,OAAQC,MAAQ,OAAS,OAG7B,OAAO,CACT,CA11BYc,CAAoBpB,QAEN,UAApB5tB,UAAU4tB,SACRqB,eAAerB,MAAMtmC,IAAM2nC,eAAerB,MAAM30C,IAAMg2C,eAAerB,MAAMG,IA2CjEzmC,EA1CGsmC,MAAMtmC,EA0CNrO,EA1CS20C,MAAM30C,EA0CZ80C,EA1CeH,MAAMG,EAAvCD,IA2CG,CACLxmC,EAAqB,IAAlB4nC,QAAQ5nC,EAAG,KACdrO,EAAqB,IAAlBi2C,QAAQj2C,EAAG,KACd80C,EAAqB,IAAlBmB,QAAQnB,EAAG,MA7CZC,IAAK,EACLC,OAAwC,MAA/B1mC,OAAOqmC,MAAMtmC,GAAG6nC,QAAQ,GAAa,OAAS,OAC9CF,eAAerB,MAAMl/B,IAAMugC,eAAerB,MAAMpwC,IAAMyxC,eAAerB,MAAMzxC,IACpFqB,EAAI4xC,oBAAoBxB,MAAMpwC,GAC9BrB,EAAIizC,oBAAoBxB,MAAMzxC,GAC9B2xC,IA6JN,SAAkBp/B,EAAGlR,EAAGrB,GACtBuS,EAAsB,EAAlBwgC,QAAQxgC,EAAG,KACflR,EAAI0xC,QAAQ1xC,EAAG,KACfrB,EAAI+yC,QAAQ/yC,EAAG,KACf,IAAI1B,EAAI8N,KAAKqiC,MAAMl8B,GACjB2gC,EAAI3gC,EAAIjU,EACRD,EAAI2B,GAAK,EAAIqB,GACb8xC,EAAInzC,GAAK,EAAIkzC,EAAI7xC,GACjB8D,EAAInF,GAAK,GAAK,EAAIkzC,GAAK7xC,GACvB+xC,IAAM90C,EAAI,EACV6M,EAAI,CAACnL,EAAGmzC,EAAG90C,EAAGA,EAAG8G,EAAGnF,GAAGozC,KACvBt2C,EAAI,CAACqI,EAAGnF,EAAGA,EAAGmzC,EAAG90C,EAAGA,GAAG+0C,KACvBxB,EAAI,CAACvzC,EAAGA,EAAG8G,EAAGnF,EAAGA,EAAGmzC,GAAGC,KACzB,MAAO,CACLjoC,EAAO,IAAJA,EACHrO,EAAO,IAAJA,EACH80C,EAAO,IAAJA,EAEP,CA/KYyB,CAAS5B,MAAMl/B,EAAGlR,EAAGrB,GAC3B6xC,IAAK,EACLC,OAAS,OACAgB,eAAerB,MAAMl/B,IAAMugC,eAAerB,MAAMpwC,IAAMyxC,eAAerB,MAAM5vC,KACpFR,EAAI4xC,oBAAoBxB,MAAMpwC,GAC9BQ,EAAIoxC,oBAAoBxB,MAAM5vC,GAC9B8vC,IAgFN,SAAkBp/B,EAAGlR,EAAGQ,GACtB,IAAIsJ,EAAGrO,EAAG80C,EAIV,SAAS0B,QAAQj1C,EAAG80C,EAAGhuC,GAGrB,OAFIA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,EAAI,EAAU9G,EAAc,GAAT80C,EAAI90C,GAAS8G,EACpCA,EAAI,GAAcguC,EAClBhuC,EAAI,EAAI,EAAU9G,GAAK80C,EAAI90C,IAAM,EAAI,EAAI8G,GAAK,EAC3C9G,CACT,CACA,GAXAkU,EAAIwgC,QAAQxgC,EAAG,KACflR,EAAI0xC,QAAQ1xC,EAAG,KACfQ,EAAIkxC,QAAQlxC,EAAG,KASL,IAANR,EACF8J,EAAIrO,EAAI80C,EAAI/vC,MACP,CACL,IAAIsxC,EAAItxC,EAAI,GAAMA,GAAK,EAAIR,GAAKQ,EAAIR,EAAIQ,EAAIR,EACxChD,EAAI,EAAIwD,EAAIsxC,EAChBhoC,EAAImoC,QAAQj1C,EAAG80C,EAAG5gC,EAAI,EAAI,GAC1BzV,EAAIw2C,QAAQj1C,EAAG80C,EAAG5gC,GAClBq/B,EAAI0B,QAAQj1C,EAAG80C,EAAG5gC,EAAI,EAAI,EAC5B,CACA,MAAO,CACLpH,EAAO,IAAJA,EACHrO,EAAO,IAAJA,EACH80C,EAAO,IAAJA,EAEP,CA3GY2B,CAAS9B,MAAMl/B,EAAGlR,EAAGQ,GAC3BgwC,IAAK,EACLC,OAAS,OAEPL,MAAMp0C,eAAe,OACvBmQ,EAAIikC,MAAMjkC,IAyBhB,IAAkBrC,EAAGrO,EAAG80C,EArBtB,OADApkC,EAAIgmC,WAAWhmC,GACR,CACLqkC,GACAC,OAAQL,MAAMK,QAAUA,OACxB3mC,EAAGgmC,QAAQ,IAAKE,QAAQM,IAAIxmC,EAAG,IAC/BrO,EAAGq0C,QAAQ,IAAKE,QAAQM,IAAI70C,EAAG,IAC/B80C,EAAGT,QAAQ,IAAKE,QAAQM,IAAIC,EAAG,IAC/BpkC,EAEJ,CAhVYimC,CAAWhC,OACrB9xC,KAAK+zC,eAAiBjC,MAAO9xC,KAAKg0C,GAAKhC,IAAIxmC,EAAGxL,KAAKi0C,GAAKjC,IAAI70C,EAAG6C,KAAKk0C,GAAKlC,IAAIC,EAAGjyC,KAAKm0C,GAAKnC,IAAInkC,EAAG7N,KAAKo0C,QAAU9C,UAAU,IAAMtxC,KAAKm0C,IAAM,IAAKn0C,KAAKq0C,QAAUtC,KAAKI,QAAUH,IAAIG,OAClLnyC,KAAKs0C,cAAgBvC,KAAKwC,aAMtBv0C,KAAKg0C,GAAK,IACZh0C,KAAKg0C,GAAK1C,UAAUtxC,KAAKg0C,KAEvBh0C,KAAKi0C,GAAK,IACZj0C,KAAKi0C,GAAK3C,UAAUtxC,KAAKi0C,KAEvBj0C,KAAKk0C,GAAK,IACZl0C,KAAKk0C,GAAK5C,UAAUtxC,KAAKk0C,KAE3Bl0C,KAAKw0C,IAAMxC,IAAIE,GACflyC,KAAKy0C,OAASpD,aAChB,CAsVA,SAASqD,SAASlpC,EAAGrO,EAAG80C,GACtBzmC,EAAI4nC,QAAQ5nC,EAAG,KACfrO,EAAIi2C,QAAQj2C,EAAG,KACf80C,EAAImB,QAAQnB,EAAG,KACf,IAEIr/B,EACFlR,EAHEqzB,IAAM2c,QAAQlmC,EAAGrO,EAAG80C,GACtBR,IAAMD,QAAQhmC,EAAGrO,EAAG80C,GAGpB/vC,GAAK6yB,IAAM0c,KAAO,EACpB,GAAI1c,KAAO0c,IACT7+B,EAAIlR,EAAI,MACH,CACL,IAAI+P,EAAIsjB,IAAM0c,IAEd,OADA/vC,EAAIQ,EAAI,GAAMuP,GAAK,EAAIsjB,IAAM0c,KAAOhgC,GAAKsjB,IAAM0c,KACvC1c,KACN,KAAKvpB,EACHoH,GAAKzV,EAAI80C,GAAKxgC,GAAKtU,EAAI80C,EAAI,EAAI,GAC/B,MACF,KAAK90C,EACHyV,GAAKq/B,EAAIzmC,GAAKiG,EAAI,EAClB,MACF,KAAKwgC,EACHr/B,GAAKpH,EAAIrO,GAAKsU,EAAI,EAGtBmB,GAAK,CACP,CACA,MAAO,CACLA,EACAlR,EACAQ,EAEJ,CAuCA,SAASyyC,SAASnpC,EAAGrO,EAAG80C,GACtBzmC,EAAI4nC,QAAQ5nC,EAAG,KACfrO,EAAIi2C,QAAQj2C,EAAG,KACf80C,EAAImB,QAAQnB,EAAG,KACf,IAEIr/B,EACFlR,EAHEqzB,IAAM2c,QAAQlmC,EAAGrO,EAAG80C,GACtBR,IAAMD,QAAQhmC,EAAGrO,EAAG80C,GAGpB5xC,EAAI00B,IACFtjB,EAAIsjB,IAAM0c,IAEd,GADA/vC,EAAY,IAARqzB,IAAY,EAAItjB,EAAIsjB,IACpBA,KAAO0c,IACT7+B,EAAI,MACC,CACL,OAAQmiB,KACN,KAAKvpB,EACHoH,GAAKzV,EAAI80C,GAAKxgC,GAAKtU,EAAI80C,EAAI,EAAI,GAC/B,MACF,KAAK90C,EACHyV,GAAKq/B,EAAIzmC,GAAKiG,EAAI,EAClB,MACF,KAAKwgC,EACHr/B,GAAKpH,EAAIrO,GAAKsU,EAAI,EAGtBmB,GAAK,CACP,CACA,MAAO,CACLA,EACAlR,EACArB,EAEJ,CA8BA,SAASu0C,SAASppC,EAAGrO,EAAG80C,EAAG4C,YACzB,IAAIC,IAAM,CAACC,KAAKzD,UAAU9lC,GAAGma,SAAS,KAAMovB,KAAKzD,UAAUn0C,GAAGwoB,SAAS,KAAMovB,KAAKzD,UAAUW,GAAGtsB,SAAS,MAGxG,OAAIkvB,YAAcC,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,GAC3HiJ,IAAI,GAAGjJ,OAAO,GAAKiJ,IAAI,GAAGjJ,OAAO,GAAKiJ,IAAI,GAAGjJ,OAAO,GAEtDiJ,IAAIrX,KAAK,GAClB,CAmBA,SAASuX,cAAcxpC,EAAGrO,EAAG80C,EAAGpkC,GAE9B,MADU,CAACknC,KAAKE,oBAAoBpnC,IAAKknC,KAAKzD,UAAU9lC,GAAGma,SAAS,KAAMovB,KAAKzD,UAAUn0C,GAAGwoB,SAAS,KAAMovB,KAAKzD,UAAUW,GAAGtsB,SAAS,MAC3H8X,KAAK,GAClB,CAuBA,SAASyX,YAAYpD,MAAOqD,QAC1BA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAI3C,IAAMX,UAAUC,OAAOsD,QAG3B,OAFA5C,IAAI9wC,GAAKyzC,OAAS,IAClB3C,IAAI9wC,EAAI2zC,QAAQ7C,IAAI9wC,GACbmwC,UAAUW,IACnB,CACA,SAAS8C,UAAUxD,MAAOqD,QACxBA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAI3C,IAAMX,UAAUC,OAAOsD,QAG3B,OAFA5C,IAAI9wC,GAAKyzC,OAAS,IAClB3C,IAAI9wC,EAAI2zC,QAAQ7C,IAAI9wC,GACbmwC,UAAUW,IACnB,CACA,SAAS+C,WAAWzD,OAClB,OAAOD,UAAUC,OAAO0D,WAAW,IACrC,CACA,SAASC,SAAS3D,MAAOqD,QACvBA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAI3C,IAAMX,UAAUC,OAAOsD,QAG3B,OAFA5C,IAAItwC,GAAKizC,OAAS,IAClB3C,IAAItwC,EAAImzC,QAAQ7C,IAAItwC,GACb2vC,UAAUW,IACnB,CACA,SAASkD,UAAU5D,MAAOqD,QACxBA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAInD,IAAMH,UAAUC,OAAO6D,QAI3B,OAHA3D,IAAIxmC,EAAIkmC,QAAQ,EAAGF,QAAQ,IAAKQ,IAAIxmC,EAAI8lC,WAAkB6D,OAAS,IAAjB,OAClDnD,IAAI70C,EAAIu0C,QAAQ,EAAGF,QAAQ,IAAKQ,IAAI70C,EAAIm0C,WAAkB6D,OAAS,IAAjB,OAClDnD,IAAIC,EAAIP,QAAQ,EAAGF,QAAQ,IAAKQ,IAAIC,EAAIX,WAAkB6D,OAAS,IAAjB,OAC3CtD,UAAUG,IACnB,CACA,SAAS4D,QAAQ9D,MAAOqD,QACtBA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAI3C,IAAMX,UAAUC,OAAOsD,QAG3B,OAFA5C,IAAItwC,GAAKizC,OAAS,IAClB3C,IAAItwC,EAAImzC,QAAQ7C,IAAItwC,GACb2vC,UAAUW,IACnB,CAIA,SAASqD,MAAM/D,MAAOqD,QACpB,IAAI3C,IAAMX,UAAUC,OAAOsD,QACvBU,KAAOtD,IAAI5/B,EAAIuiC,QAAU,IAE7B,OADA3C,IAAI5/B,EAAIkjC,IAAM,EAAI,IAAMA,IAAMA,IACvBjE,UAAUW,IACnB,CAOA,SAASuD,YAAYjE,OACnB,IAAIU,IAAMX,UAAUC,OAAOsD,QAE3B,OADA5C,IAAI5/B,GAAK4/B,IAAI5/B,EAAI,KAAO,IACjBi/B,UAAUW,IACnB,CACA,SAASwD,OAAOlE,OACd,IAAIU,IAAMX,UAAUC,OAAOsD,QACvBxiC,EAAI4/B,IAAI5/B,EACZ,MAAO,CAACi/B,UAAUC,OAAQD,UAAU,CAClCj/B,GAAIA,EAAI,KAAO,IACflR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,IACL2vC,UAAU,CACZj/B,GAAIA,EAAI,KAAO,IACflR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,IAEX,CACA,SAAS+zC,QAAQnE,OACf,IAAIU,IAAMX,UAAUC,OAAOsD,QACvBxiC,EAAI4/B,IAAI5/B,EACZ,MAAO,CAACi/B,UAAUC,OAAQD,UAAU,CAClCj/B,GAAIA,EAAI,IAAM,IACdlR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,IACL2vC,UAAU,CACZj/B,GAAIA,EAAI,KAAO,IACflR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,IACL2vC,UAAU,CACZj/B,GAAIA,EAAI,KAAO,IACflR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,IAEX,CACA,SAASg0C,iBAAiBpE,OACxB,IAAIU,IAAMX,UAAUC,OAAOsD,QACvBxiC,EAAI4/B,IAAI5/B,EACZ,MAAO,CAACi/B,UAAUC,OAAQD,UAAU,CAClCj/B,GAAIA,EAAI,IAAM,IACdlR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,IACL2vC,UAAU,CACZj/B,GAAIA,EAAI,KAAO,IACflR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,IAEX,CACA,SAASi0C,WAAWrE,MAAOsE,QAASC,QAClCD,QAAUA,SAAW,EACrBC,OAASA,QAAU,GACnB,IAAI7D,IAAMX,UAAUC,OAAOsD,QACvBkB,KAAO,IAAMD,OACbzmC,IAAM,CAACiiC,UAAUC,QACrB,IAAKU,IAAI5/B,GAAK4/B,IAAI5/B,GAAK0jC,KAAOF,SAAW,GAAK,KAAO,MAAOA,SAC1D5D,IAAI5/B,GAAK4/B,IAAI5/B,EAAI0jC,MAAQ,IACzB1mC,IAAI9N,KAAK+vC,UAAUW,MAErB,OAAO5iC,GACT,CACA,SAAS2mC,eAAezE,MAAOsE,SAC7BA,QAAUA,SAAW,EAOrB,IANA,IAAI1D,IAAMb,UAAUC,OAAO0E,QACvB5jC,EAAI8/B,IAAI9/B,EACVlR,EAAIgxC,IAAIhxC,EACRrB,EAAIqyC,IAAIryC,EACNuP,IAAM,GACN6mC,aAAe,EAAIL,QAChBA,WACLxmC,IAAI9N,KAAK+vC,UAAU,CACjBj/B,EACAlR,EACArB,KAEFA,GAAKA,EAAIo2C,cAAgB,EAE3B,OAAO7mC,GACT,CAlpBAiiC,UAAUp0C,UAAY,CACpBi5C,OAAQ,WACN,OAAO12C,KAAK22C,gBAAkB,GAChC,EACAC,QAAS,WACP,OAAQ52C,KAAK02C,QACf,EACAhzB,QAAS,WACP,OAAO1jB,KAAKw0C,GACd,EACAqC,iBAAkB,WAChB,OAAO72C,KAAK+zC,cACd,EACA+C,UAAW,WACT,OAAO92C,KAAKq0C,OACd,EACA0C,SAAU,WACR,OAAO/2C,KAAKm0C,EACd,EACAwC,cAAe,WAEb,IAAI3E,IAAMhyC,KAAK21C,QACf,OAAgB,IAAR3D,IAAIxmC,EAAkB,IAARwmC,IAAI70C,EAAkB,IAAR60C,IAAIC,GAAW,GACrD,EACA+E,aAAc,WAEZ,IACIC,MAAOC,MAAOC,MADdnF,IAAMhyC,KAAK21C,QAoBf,OAlBAsB,MAAQjF,IAAIxmC,EAAI,IAChB0rC,MAAQlF,IAAI70C,EAAI,IAChBg6C,MAAQnF,IAAIC,EAAI,IAgBT,OAfHgF,OAAS,OACPA,MAAQ,MAERxqC,KAAK2qC,KAAKH,MAAQ,MAAS,MAAO,MAYpB,OAVhBC,OAAS,OACPA,MAAQ,MAERzqC,KAAK2qC,KAAKF,MAAQ,MAAS,MAAO,MAOP,OAL7BC,OAAS,OACPA,MAAQ,MAER1qC,KAAK2qC,KAAKD,MAAQ,MAAS,MAAO,KAG1C,EACAE,SAAU,SAAkB3lC,OAG1B,OAFA1R,KAAKm0C,GAAKN,WAAWniC,OACrB1R,KAAKo0C,QAAU9C,UAAU,IAAMtxC,KAAKm0C,IAAM,IACnCn0C,IACT,EACAw2C,MAAO,WACL,IAAI9D,IAAMiC,SAAS30C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,IAC1C,MAAO,CACLthC,EAAW,IAAR8/B,IAAI9/B,EACPlR,EAAGgxC,IAAIhxC,EACPrB,EAAGqyC,IAAIryC,EACPwN,EAAG7N,KAAKm0C,GAEZ,EACAmD,YAAa,WACX,IAAI5E,IAAMiC,SAAS30C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,IACtCthC,EAAI0+B,UAAkB,IAARoB,IAAI9/B,GACpBlR,EAAI4vC,UAAkB,IAARoB,IAAIhxC,GAClBrB,EAAIixC,UAAkB,IAARoB,IAAIryC,GACpB,OAAkB,GAAXL,KAAKm0C,GAAU,OAASvhC,EAAI,KAAOlR,EAAI,MAAQrB,EAAI,KAAO,QAAUuS,EAAI,KAAOlR,EAAI,MAAQrB,EAAI,MAAQL,KAAKo0C,QAAU,GAC/H,EACAgB,MAAO,WACL,IAAI5C,IAAMkC,SAAS10C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,IAC1C,MAAO,CACLthC,EAAW,IAAR4/B,IAAI5/B,EACPlR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,EACP2L,EAAG7N,KAAKm0C,GAEZ,EACAoD,YAAa,WACX,IAAI/E,IAAMkC,SAAS10C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,IACtCthC,EAAI0+B,UAAkB,IAARkB,IAAI5/B,GACpBlR,EAAI4vC,UAAkB,IAARkB,IAAI9wC,GAClBQ,EAAIovC,UAAkB,IAARkB,IAAItwC,GACpB,OAAkB,GAAXlC,KAAKm0C,GAAU,OAASvhC,EAAI,KAAOlR,EAAI,MAAQQ,EAAI,KAAO,QAAU0Q,EAAI,KAAOlR,EAAI,MAAQQ,EAAI,MAAQlC,KAAKo0C,QAAU,GAC/H,EACAoD,MAAO,SAAe3C,YACpB,OAAOD,SAAS50C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,GAAIW,WAC7C,EACA4C,YAAa,SAAqB5C,YAChC,MAAO,IAAM70C,KAAKw3C,MAAM3C,WAC1B,EACA6C,OAAQ,SAAgBC,YACtB,OA4YJ,SAAmBnsC,EAAGrO,EAAG80C,EAAGpkC,EAAG8pC,YAC7B,IAAI7C,IAAM,CAACC,KAAKzD,UAAU9lC,GAAGma,SAAS,KAAMovB,KAAKzD,UAAUn0C,GAAGwoB,SAAS,KAAMovB,KAAKzD,UAAUW,GAAGtsB,SAAS,KAAMovB,KAAKE,oBAAoBpnC,KAGvI,GAAI8pC,YAAc7C,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,GAC1K,OAAOiJ,IAAI,GAAGjJ,OAAO,GAAKiJ,IAAI,GAAGjJ,OAAO,GAAKiJ,IAAI,GAAGjJ,OAAO,GAAKiJ,IAAI,GAAGjJ,OAAO,GAEhF,OAAOiJ,IAAIrX,KAAK,GAClB,CApZWma,CAAU53C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,GAAIl0C,KAAKm0C,GAAIwD,WACvD,EACAE,aAAc,SAAsBF,YAClC,MAAO,IAAM33C,KAAK03C,OAAOC,WAC3B,EACAhC,MAAO,WACL,MAAO,CACLnqC,EAAG8lC,UAAUtxC,KAAKg0C,IAClB72C,EAAGm0C,UAAUtxC,KAAKi0C,IAClBhC,EAAGX,UAAUtxC,KAAKk0C,IAClBrmC,EAAG7N,KAAKm0C,GAEZ,EACA2D,YAAa,WACX,OAAkB,GAAX93C,KAAKm0C,GAAU,OAAS7C,UAAUtxC,KAAKg0C,IAAM,KAAO1C,UAAUtxC,KAAKi0C,IAAM,KAAO3C,UAAUtxC,KAAKk0C,IAAM,IAAM,QAAU5C,UAAUtxC,KAAKg0C,IAAM,KAAO1C,UAAUtxC,KAAKi0C,IAAM,KAAO3C,UAAUtxC,KAAKk0C,IAAM,KAAOl0C,KAAKo0C,QAAU,GACjO,EACA2D,gBAAiB,WACf,MAAO,CACLvsC,EAAG8lC,UAAkC,IAAxB8B,QAAQpzC,KAAKg0C,GAAI,MAAc,IAC5C72C,EAAGm0C,UAAkC,IAAxB8B,QAAQpzC,KAAKi0C,GAAI,MAAc,IAC5ChC,EAAGX,UAAkC,IAAxB8B,QAAQpzC,KAAKk0C,GAAI,MAAc,IAC5CrmC,EAAG7N,KAAKm0C,GAEZ,EACA6D,sBAAuB,WACrB,OAAkB,GAAXh4C,KAAKm0C,GAAU,OAAS7C,UAAkC,IAAxB8B,QAAQpzC,KAAKg0C,GAAI,MAAc,MAAQ1C,UAAkC,IAAxB8B,QAAQpzC,KAAKi0C,GAAI,MAAc,MAAQ3C,UAAkC,IAAxB8B,QAAQpzC,KAAKk0C,GAAI,MAAc,KAAO,QAAU5C,UAAkC,IAAxB8B,QAAQpzC,KAAKg0C,GAAI,MAAc,MAAQ1C,UAAkC,IAAxB8B,QAAQpzC,KAAKi0C,GAAI,MAAc,MAAQ3C,UAAkC,IAAxB8B,QAAQpzC,KAAKk0C,GAAI,MAAc,MAAQl0C,KAAKo0C,QAAU,GAC/V,EACA6D,OAAQ,WACN,OAAgB,IAAZj4C,KAAKm0C,GACA,gBAELn0C,KAAKm0C,GAAK,KAGP+D,SAAStD,SAAS50C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,IAAI,MAAU,EAChE,EACAiE,SAAU,SAAkBC,aAC1B,IAAIC,WAAa,IAAMrD,cAAch1C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,GAAIl0C,KAAKm0C,IACjEmE,iBAAmBD,WACnB9D,aAAev0C,KAAKs0C,cAAgB,qBAAuB,GAC/D,GAAI8D,YAAa,CACf,IAAI12C,EAAImwC,UAAUuG,aAClBE,iBAAmB,IAAMtD,cAActzC,EAAEsyC,GAAItyC,EAAEuyC,GAAIvyC,EAAEwyC,GAAIxyC,EAAEyyC,GAC7D,CACA,MAAO,8CAAgDI,aAAe,iBAAmB8D,WAAa,gBAAkBC,iBAAmB,GAC7I,EACA3yB,SAAU,SAAkBwsB,QAC1B,IAAIoG,YAAcpG,OAClBA,OAASA,QAAUnyC,KAAKq0C,QACxB,IAAImE,iBAAkB,EAClBC,SAAWz4C,KAAKm0C,GAAK,GAAKn0C,KAAKm0C,IAAM,EAEzC,OADwBoE,YAAaE,UAAwB,QAAXtG,QAA+B,SAAXA,QAAgC,SAAXA,QAAgC,SAAXA,QAAgC,SAAXA,QAAgC,SAAXA,QAS3I,QAAXA,SACFqG,gBAAkBx4C,KAAK83C,eAEV,SAAX3F,SACFqG,gBAAkBx4C,KAAKg4C,yBAEV,QAAX7F,QAA+B,SAAXA,SACtBqG,gBAAkBx4C,KAAKy3C,eAEV,SAAXtF,SACFqG,gBAAkBx4C,KAAKy3C,aAAY,IAEtB,SAAXtF,SACFqG,gBAAkBx4C,KAAK63C,cAAa,IAEvB,SAAX1F,SACFqG,gBAAkBx4C,KAAK63C,gBAEV,SAAX1F,SACFqG,gBAAkBx4C,KAAKi4C,UAEV,QAAX9F,SACFqG,gBAAkBx4C,KAAKu3C,eAEV,QAAXpF,SACFqG,gBAAkBx4C,KAAKs3C,eAElBkB,iBAAmBx4C,KAAKy3C,eAhCd,SAAXtF,QAAiC,IAAZnyC,KAAKm0C,GACrBn0C,KAAKi4C,SAEPj4C,KAAK83C,aA8BhB,EACAY,MAAO,WACL,OAAO7G,UAAU7xC,KAAK2lB,WACxB,EACAgzB,mBAAoB,SAA4Bl1C,GAAI+tB,MAClD,IAAIsgB,MAAQruC,GAAGguB,MAAM,KAAM,CAACzxB,MAAMiK,OAAO,GAAGzC,MAAM7J,KAAK6zB,QAKvD,OAJAxxB,KAAKg0C,GAAKlC,MAAMkC,GAChBh0C,KAAKi0C,GAAKnC,MAAMmC,GAChBj0C,KAAKk0C,GAAKpC,MAAMoC,GAChBl0C,KAAKq3C,SAASvF,MAAMqC,IACbn0C,IACT,EACA44C,QAAS,WACP,OAAO54C,KAAK24C,mBAAmBlD,SAAUrqB,UAC3C,EACAytB,SAAU,WACR,OAAO74C,KAAK24C,mBAAmBjD,UAAWtqB,UAC5C,EACA0tB,OAAQ,WACN,OAAO94C,KAAK24C,mBAAmB/C,QAASxqB,UAC1C,EACAoqB,WAAY,WACV,OAAOx1C,KAAK24C,mBAAmBzD,YAAa9pB,UAC9C,EACA2tB,SAAU,WACR,OAAO/4C,KAAK24C,mBAAmBrD,UAAWlqB,UAC5C,EACA4tB,UAAW,WACT,OAAOh5C,KAAK24C,mBAAmBpD,WAAYnqB,UAC7C,EACA6tB,KAAM,WACJ,OAAOj5C,KAAK24C,mBAAmB9C,MAAOzqB,UACxC,EACA8tB,kBAAmB,SAA2Bz1C,GAAI+tB,MAChD,OAAO/tB,GAAGguB,MAAM,KAAM,CAACzxB,MAAMiK,OAAO,GAAGzC,MAAM7J,KAAK6zB,OACpD,EACA2nB,UAAW,WACT,OAAOn5C,KAAKk5C,kBAAkB/C,WAAY/qB,UAC5C,EACAguB,WAAY,WACV,OAAOp5C,KAAKk5C,kBAAkBnD,YAAa3qB,UAC7C,EACAiuB,cAAe,WACb,OAAOr5C,KAAKk5C,kBAAkB3C,eAAgBnrB,UAChD,EACAkuB,gBAAiB,WACf,OAAOt5C,KAAKk5C,kBAAkBhD,iBAAkB9qB,UAClD,EACAmuB,MAAO,WACL,OAAOv5C,KAAKk5C,kBAAkBlD,OAAQ5qB,UACxC,EACAouB,OAAQ,WACN,OAAOx5C,KAAKk5C,kBAAkBjD,QAAS7qB,UACzC,GAKFymB,UAAU4H,UAAY,SAAU3H,MAAOC,MACrC,GAAwB,UAApB7tB,UAAU4tB,OAAoB,CAChC,IAAI4H,SAAW,CAAC,EAChB,IAAK,IAAI/6C,KAAKmzC,MACRA,MAAMp0C,eAAeiB,KAErB+6C,SAAS/6C,GADD,MAANA,EACYmzC,MAAMnzC,GAEN20C,oBAAoBxB,MAAMnzC,KAI9CmzC,MAAQ4H,QACV,CACA,OAAO7H,UAAUC,MAAOC,KAC1B,EA+PAF,UAAU8H,OAAS,SAAUC,OAAQC,QACnC,SAAKD,SAAWC,SAGThI,UAAU+H,QAAQ9B,eAAiBjG,UAAUgI,QAAQ/B,aAC9D,EACAjG,UAAUD,OAAS,WACjB,OAAOC,UAAU4H,UAAU,CACzBjuC,EAAGmmC,aACHx0C,EAAGw0C,aACHM,EAAGN,cAEP,EA+IAE,UAAUiI,IAAM,SAAUF,OAAQC,OAAQ1E,QACxCA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAI4E,KAAOlI,UAAU+H,QAAQjE,QACzBqE,KAAOnI,UAAUgI,QAAQlE,QACzBj3C,EAAIy2C,OAAS,IAOjB,OAAOtD,UANI,CACTrmC,GAAIwuC,KAAKxuC,EAAIuuC,KAAKvuC,GAAK9M,EAAIq7C,KAAKvuC,EAChCrO,GAAI68C,KAAK78C,EAAI48C,KAAK58C,GAAKuB,EAAIq7C,KAAK58C,EAChC80C,GAAI+H,KAAK/H,EAAI8H,KAAK9H,GAAKvzC,EAAIq7C,KAAK9H,EAChCpkC,GAAImsC,KAAKnsC,EAAIksC,KAAKlsC,GAAKnP,EAAIq7C,KAAKlsC,GAGpC,EAQAgkC,UAAUoI,YAAc,SAAUL,OAAQC,QACxC,IAAIK,GAAKrI,UAAU+H,QACfO,GAAKtI,UAAUgI,QACnB,OAAQptC,KAAKsoB,IAAImlB,GAAGlD,eAAgBmD,GAAGnD,gBAAkB,MAASvqC,KAAKglC,IAAIyI,GAAGlD,eAAgBmD,GAAGnD,gBAAkB,IACrH,EAYAnF,UAAUuI,WAAa,SAAUR,OAAQC,OAAQQ,OAC/C,IACIC,WAAYt3C,IADZi3C,YAAcpI,UAAUoI,YAAYL,OAAQC,QAIhD,OAFA72C,KAAM,GACNs3C,WAubF,SAA4BC,OAG1B,IAAIC,MAAOt6C,KAKXs6C,QAJAD,MAAQA,OAAS,CACf,MAAS,KACT,KAAQ,UAEKC,OAAS,MAAMC,cAC9Bv6C,MAAQq6C,MAAMr6C,MAAQ,SAASk5B,cACjB,OAAVohB,OAA4B,QAAVA,QACpBA,MAAQ,MAEG,UAATt6C,MAA6B,UAATA,OACtBA,KAAO,SAET,MAAO,CACL,MACA,KAEJ,CA3cew6C,CAAmBL,QACbG,MAAQF,WAAWp6C,MACpC,IAAK,UACL,IAAK,WACH8C,IAAMi3C,aAAe,IACrB,MACF,IAAK,UACHj3C,IAAMi3C,aAAe,EACrB,MACF,IAAK,WACHj3C,IAAMi3C,aAAe,EAGzB,OAAOj3C,GACT,EAWA6uC,UAAU8I,aAAe,SAAUC,UAAWC,UAAWrpB,MACvD,IAEIyoB,YACAa,sBAAuBN,MAAOt6C,KAH9B66C,UAAY,KACZC,UAAY,EAIhBF,uBADAtpB,KAAOA,MAAQ,CAAC,GACaspB,sBAC7BN,MAAQhpB,KAAKgpB,MACbt6C,KAAOsxB,KAAKtxB,KACZ,IAAK,IAAIvB,EAAI,EAAGA,EAAIk8C,UAAUj8C,OAAQD,KACpCs7C,YAAcpI,UAAUoI,YAAYW,UAAWC,UAAUl8C,KACvCq8C,YAChBA,UAAYf,YACZc,UAAYlJ,UAAUgJ,UAAUl8C,KAGpC,OAAIkzC,UAAUuI,WAAWQ,UAAWG,UAAW,CAC7C,MACA,SACKD,sBACEC,WAEPvpB,KAAKspB,uBAAwB,EACtBjJ,UAAU8I,aAAaC,UAAW,CAAC,OAAQ,QAASppB,MAE/D,EAKA,IAAI6gB,MAAQR,UAAUQ,MAAQ,CAC5B4I,UAAW,SACXC,aAAc,SACdC,KAAM,MACNC,WAAY,SACZC,MAAO,SACPC,MAAO,SACPC,OAAQ,SACRC,MAAO,MACPC,eAAgB,SAChBC,KAAM,MACNC,WAAY,SACZC,MAAO,SACPC,UAAW,SACXC,YAAa,SACbC,UAAW,SACXC,WAAY,SACZC,UAAW,SACXC,MAAO,SACPC,eAAgB,SAChBC,SAAU,SACVC,QAAS,SACTC,KAAM,MACNC,SAAU,SACVC,SAAU,SACVC,cAAe,SACfC,SAAU,SACVC,UAAW,SACXC,SAAU,SACVC,UAAW,SACXC,YAAa,SACbC,eAAgB,SAChBC,WAAY,SACZC,WAAY,SACZC,QAAS,SACTC,WAAY,SACZC,aAAc,SACdC,cAAe,SACfC,cAAe,SACfC,cAAe,SACfC,cAAe,SACfC,WAAY,SACZC,SAAU,SACVC,YAAa,SACbC,QAAS,SACTC,QAAS,SACTC,WAAY,SACZC,UAAW,SACXC,YAAa,SACbC,YAAa,SACbC,QAAS,MACTC,UAAW,SACXC,WAAY,SACZC,KAAM,SACNC,UAAW,SACXC,KAAM,SACNC,MAAO,SACPC,YAAa,SACbC,KAAM,SACNC,SAAU,SACVC,QAAS,SACTC,UAAW,SACXC,OAAQ,SACRC,MAAO,SACPC,MAAO,SACPC,SAAU,SACVC,cAAe,SACfC,UAAW,SACXC,aAAc,SACdC,UAAW,SACXC,WAAY,SACZC,UAAW,SACXC,qBAAsB,SACtBC,UAAW,SACXC,WAAY,SACZC,UAAW,SACXC,UAAW,SACXC,YAAa,SACbC,cAAe,SACfC,aAAc,SACdC,eAAgB,MAChBC,eAAgB,MAChBC,eAAgB,SAChBC,YAAa,SACbC,KAAM,MACNC,UAAW,SACXC,MAAO,SACPC,QAAS,MACTC,OAAQ,SACRC,iBAAkB,SAClBC,WAAY,SACZC,aAAc,SACdC,aAAc,SACdC,eAAgB,SAChBC,gBAAiB,SACjBC,kBAAmB,SACnBC,gBAAiB,SACjBC,gBAAiB,SACjBC,aAAc,SACdC,UAAW,SACXC,UAAW,SACXC,SAAU,SACVC,YAAa,SACbC,KAAM,SACNC,QAAS,SACTC,MAAO,SACPC,UAAW,SACXC,OAAQ,SACRC,UAAW,SACXC,OAAQ,SACRC,cAAe,SACfC,UAAW,SACXC,cAAe,SACfC,cAAe,SACfC,WAAY,SACZC,UAAW,SACXC,KAAM,SACNC,KAAM,SACNC,KAAM,SACNC,WAAY,SACZC,OAAQ,SACRC,cAAe,SACfC,IAAK,MACLC,UAAW,SACXC,UAAW,SACXC,YAAa,SACbC,OAAQ,SACRC,WAAY,SACZC,SAAU,SACVC,SAAU,SACVC,OAAQ,SACRC,OAAQ,SACRC,QAAS,SACTC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,KAAM,SACNC,YAAa,SACbC,UAAW,SACXC,IAAK,SACLC,KAAM,SACNC,QAAS,SACTC,OAAQ,SACRC,UAAW,SACXC,OAAQ,SACRC,MAAO,SACPC,MAAO,MACPC,WAAY,SACZC,OAAQ,MACRC,YAAa,UAIXnM,SAAWrG,UAAUqG,SAMzB,SAAc/zB,GACZ,IAAImgC,QAAU,CAAC,EACf,IAAK,IAAI3lD,KAAKwlB,EACRA,EAAEzmB,eAAeiB,KACnB2lD,QAAQngC,EAAExlB,IAAMA,GAGpB,OAAO2lD,OACT,CAdoCC,CAAKlS,OAiBzC,SAASwB,WAAWhmC,GAKlB,OAJAA,EAAI22C,WAAW32C,IACX42C,MAAM52C,IAAMA,EAAI,GAAKA,EAAI,KAC3BA,EAAI,GAECA,CACT,CAGA,SAASulC,QAAQjpC,EAAG4qB,MAiCpB,SAAwB5qB,GACtB,MAAmB,iBAALA,IAAoC,GAAnBA,EAAEuI,QAAQ,MAAgC,IAAlB8xC,WAAWr6C,EACpE,EAlCMu6C,CAAev6C,KACjBA,EAAI,QAEN,IAAIw6C,eAkCN,SAAsBx6C,GACpB,MAAoB,iBAANA,IAAqC,GAAnBA,EAAEuI,QAAQ,IAC5C,CApCuBkyC,CAAaz6C,GASlC,OARAA,EAAIqnC,QAAQzc,IAAK2c,QAAQ,EAAG8S,WAAWr6C,KAGnCw6C,iBACFx6C,EAAIqqB,SAASrqB,EAAI4qB,IAAK,IAAM,KAI1BtoB,KAAKC,IAAIvC,EAAI4qB,KAAO,KACf,EAIF5qB,EAAI4qB,IAAMyvB,WAAWzvB,IAC9B,CAGA,SAASsgB,QAAQ1M,KACf,OAAO6I,QAAQ,EAAGE,QAAQ,EAAG/I,KAC/B,CAGA,SAASkK,gBAAgBlK,KACvB,OAAOnU,SAASmU,IAAK,GACvB,CAcA,SAASoM,KAAK8P,GACZ,OAAmB,GAAZA,EAAEjmD,OAAc,IAAMimD,EAAI,GAAKA,CACxC,CAGA,SAASvR,oBAAoBnpC,GAI3B,OAHIA,GAAK,IACPA,EAAQ,IAAJA,EAAU,KAETA,CACT,CAGA,SAAS8qC,oBAAoBxjC,GAC3B,OAAOhF,KAAK8kC,MAAsB,IAAhBiT,WAAW/yC,IAAUkU,SAAS,GAClD,CAEA,SAASmtB,oBAAoBlgC,GAC3B,OAAOigC,gBAAgBjgC,GAAK,GAC9B,CACA,IAQMkyC,SAKAC,kBACAC,kBAdF1S,UAaEyS,kBAAoB,eALpBD,SAAW,8CAKoC,aAAeA,SAAW,aAAeA,SAAW,YACnGE,kBAAoB,cAAgBF,SAAW,aAAeA,SAAW,aAAeA,SAAW,aAAeA,SAAW,YAC1H,CACLA,SAAU,IAAIx9B,OAAOw9B,UACrB9S,IAAK,IAAI1qB,OAAO,MAAQy9B,mBACxBxS,KAAM,IAAIjrB,OAAO,OAAS09B,mBAC1BxS,IAAK,IAAIlrB,OAAO,MAAQy9B,mBACxBtS,KAAM,IAAInrB,OAAO,OAAS09B,mBAC1BtS,IAAK,IAAIprB,OAAO,MAAQy9B,mBACxBpS,KAAM,IAAIrrB,OAAO,OAAS09B,mBAC1B/R,KAAM,uDACNF,KAAM,uDACNC,KAAM,uEACNJ,KAAM,yEAOV,SAASO,eAAerB,OACtB,QAASQ,SAASwS,SAASr2C,KAAKqjC,MAClC,CAkIIl0C,OAAOC,QACTD,OAAOC,QAAUg0C,UAIjB30C,OAAO20C,UAAYA,SAEtB,CA5rCD,CA4rCGplC,KACL,IAOIw4C,YAAcx4C,KAAKqiC,MACrBoW,UAAYz4C,KAAKglC,IA6EnB,SAAS0T,cAAcllD,MAAOyR,MAAO8S,UACnC,OA/DF,SAA2BvkB,MAAOyR,MAAO8S,SAAU4gC,YACjD1zC,MAAQ8S,SAAS9S,OAOjB,IANA,IAAI2zC,IAAM,EACRC,KAAgB,MAATrlD,MAAgB,EAAIA,MAAMrB,OACjC2mD,SAAW7zC,OAAUA,MACrB8zC,UAAsB,OAAV9zC,MACZ+zC,YAAcz0B,SAAStf,OACvBg0C,oBAA2BplD,IAAVoR,MACZ2zC,IAAMC,MAAM,CACjB,IAAIK,IAAMV,aAAaI,IAAMC,MAAQ,GACnCM,SAAWphC,SAASvkB,MAAM0lD,MAC1BE,kBAA4BvlD,IAAbslD,SACfE,UAAyB,OAAbF,SACZG,eAAiBH,UAAaA,SAC9BI,YAAch1B,SAAS40B,UACzB,GAAIL,SACF,IAAIU,OAASb,YAAcW,oBAE3BE,OADSP,eACAK,iBAAmBX,YAAcS,cACjCL,UACAO,gBAAkBF,eAAiBT,aAAeU,WAClDL,YACAM,gBAAkBF,eAAiBC,YAAcV,aAAeY,cAChEF,YAAaE,cAGbZ,WAAaQ,UAAYl0C,MAAQk0C,SAAWl0C,OAEnDu0C,OACFZ,IAAMM,IAAM,EAEZL,KAAOK,GAEX,CACA,OAAOT,UAAUI,KArDCY,WAsDpB,CA4BSC,CAAkBlmD,MAAOyR,MAAO4hB,aAAa9O,UACtD,CAWA,SAAS4hC,gBAAgBz+B,OAAQhW,IAAKD,OACzB,aAAPC,KAAsBqC,eACxBA,eAAe2T,OAAQhW,IAAK,CAC1B,cAAgB,EAChB,YAAc,EACd,MACA,UAAY,IAGdgW,OAAOhW,KAAOD,KAElB,CAGA,IAGI20C,iBAHgB7oD,OAAOC,UAGUC,eAYrC,SAAS4oD,YAAY3+B,OAAQhW,IAAKD,OAChC,IAAIwe,SAAWvI,OAAOhW,KAChB00C,iBAAiB1oD,KAAKgqB,OAAQhW,MAAQgT,GAAGuL,SAAUxe,cAAqBpR,IAAVoR,OAAyBC,OAAOgW,SAClGy+B,gBAAgBz+B,OAAQhW,IAAKD,MAEjC,CAYA,SAAS60C,WAAW9kD,OAAQiyB,MAAO/L,OAAQkB,YACzC,IAAI29B,OAAS7+B,OACbA,SAAWA,OAAS,CAAC,GAGrB,IAFA,IAAIlD,OAAS,EACX7lB,OAAS80B,MAAM90B,SACR6lB,MAAQ7lB,QAAQ,CACvB,IAAI+S,IAAM+hB,MAAMjP,OACZqjB,SAAWjf,WAAaA,WAAWlB,OAAOhW,KAAMlQ,OAAOkQ,KAAMA,IAAKgW,OAAQlmB,aAAUnB,OACvEA,IAAbwnC,WACFA,SAAWrmC,OAAOkQ,MAEhB60C,MACFJ,gBAAgBz+B,OAAQhW,IAAKm2B,UAE7Bwe,YAAY3+B,OAAQhW,IAAKm2B,SAE7B,CACA,OAAOngB,MACT,CAmCA,IAGI8+B,iBAHgBjpD,OAAOC,UAGUC,eASrC,SAASgpD,WAAW/+B,QAClB,IAAKrB,SAASqB,QACZ,OAzBJ,SAAsBA,QACpB,IAAIjD,OAAS,GACb,GAAc,MAAViD,OACF,IAAK,IAAIhW,OAAOnU,OAAOmqB,QACrBjD,OAAO5iB,KAAK6P,KAGhB,OAAO+S,MACT,CAiBWiiC,CAAah/B,QAEtB,IAAIi/B,QAAU15B,YAAYvF,QACxBjD,OAAS,GACX,IAAK,IAAI/S,OAAOgW,QACD,eAAPhW,MAAyBi1C,SAAYH,iBAAiB9oD,KAAKgqB,OAAQhW,OACvE+S,OAAO5iB,KAAK6P,KAGhB,OAAO+S,MACT,CAyBA,SAASmiC,SAASl/B,QAChB,OAAO8F,YAAY9F,QAAU8E,cAAc9E,QAAQ,GAAQ++B,WAAW/+B,OACxE,CAgBA,IAAIm/B,cAAuF,WAAnD,oBAAZjpD,QAA0B,YAAcqmB,UAAUrmB,WAAyBA,UAAYA,QAAQmJ,UAAYnJ,QAGnIkpD,aAAeD,eAAsF,UAAtB5iC,UAAUtmB,SAAwBA,SAAWA,OAAOoJ,UAAYpJ,OAM/IopD,SAHkBD,cAAgBA,aAAalpD,UAAYipD,cAG9BxhC,KAAKiG,YAASjrB,EAC7C2mD,YAAcD,SAAWA,SAASC,iBAAc3mD,EA4BlD,SAAS4mD,UAAUzlD,OAAQxB,OACzB,IAAIwkB,OAAS,EACX7lB,OAAS6C,OAAO7C,OAElB,IADAqB,QAAUA,MAAQoH,MAAMzI,WACf6lB,MAAQ7lB,QACfqB,MAAMwkB,OAAShjB,OAAOgjB,OAExB,OAAOxkB,KACT,CAeA,IAAIknD,aAAe/5B,QAAQ5vB,OAAO4pD,eAAgB5pD,QAY9C6pD,aATqB7pD,OAAOmtB,sBASqB,SAAUhD,QAE7D,IADA,IAAIjD,OAAS,GACNiD,QACLoC,UAAUrF,OAAQkG,WAAWjD,SAC7BA,OAASw/B,aAAax/B,QAExB,OAAOjD,MACT,EAPyC8F,UA6BzC,SAAS88B,aAAa3/B,QACpB,OAAOwC,eAAexC,OAAQk/B,SAAUQ,aAC1C,CAGA,IAGIE,iBAHgB/pD,OAAOC,UAGUC,eA4BrC,SAAS8pD,iBAAiBC,aACxB,IAAI/iC,OAAS,IAAI+iC,YAAYnjC,YAAYmjC,YAAYp4B,YAErD,OADA,IAAI5F,WAAW/E,QAAQvkB,IAAI,IAAIspB,WAAWg+B,cACnC/iC,MACT,CAgBA,IAAIgjC,QAAU,OAgBd,IAAIC,cAAgBniC,QAAUA,QAAQ/nB,eAAY6C,EAChDsnD,gBAAkBD,cAAgBA,cAAc79B,aAAUxpB,EA2D5D,SAASunD,eAAelgC,OAAQzB,IAAK4hC,QACnC,IAnDmBj9B,OAmDfsC,KAAOxF,OAAOrD,YAClB,OAAQ4B,KACN,IA3BmB,uBA4BjB,OAAOshC,iBAAiB7/B,QAC1B,IArCY,mBAsCZ,IArCU,gBAsCR,OAAO,IAAIwF,MAAMxF,QACnB,IA/Bc,oBAgCZ,OA3FN,SAAuBogC,SAAUD,QAC/B,IAAIv4B,OAASu4B,OAASN,iBAAiBO,SAASx4B,QAAUw4B,SAASx4B,OACnE,OAAO,IAAIw4B,SAASzjC,YAAYiL,OAAQw4B,SAASz4B,WAAYy4B,SAAS14B,WACxE,CAwFa24B,CAAcrgC,OAAQmgC,QAC/B,IAhCa,wBAiCb,IAhCa,wBAiCb,IAhCU,qBAiCV,IAhCW,sBAiCX,IAhCW,sBAiCX,IAhCW,sBAiCX,IAhCkB,6BAiClB,IAhCY,uBAiCZ,IAhCY,uBAiCV,OAzDN,SAAyBG,WAAYH,QACnC,IAAIv4B,OAASu4B,OAASN,iBAAiBS,WAAW14B,QAAU04B,WAAW14B,OACvE,OAAO,IAAI04B,WAAW3jC,YAAYiL,OAAQ04B,WAAW34B,WAAY24B,WAAWrpD,OAC9E,CAsDaspD,CAAgBvgC,OAAQmgC,QACjC,IAlDS,eAyDT,IAtDS,eAuDP,OAAO,IAAI36B,KANb,IAnDY,kBAoDZ,IAjDY,kBAkDV,OAAO,IAAIA,KAAKxF,QAClB,IArDY,kBAsDV,OA7FN,SAAqBwgC,QACnB,IAAIzjC,OAAS,IAAIyjC,OAAO7jC,YAAY6jC,OAAO1mD,OAAQimD,QAAQj5C,KAAK05C,SAEhE,OADAzjC,OAAOmS,UAAYsxB,OAAOtxB,UACnBnS,MACT,CAyFa0jC,CAAYzgC,QAGrB,IAtDY,kBAuDV,OAhFekD,OAgFIlD,OA/EhBigC,gBAAkBpqD,OAAOoqD,gBAAgBjqD,KAAKktB,SAAW,CAAC,EAiFnE,CAGA,IAAIw9B,aAAe7qD,OAAOW,OAUtBmqD,WAAa,WACf,SAAS3gC,SAAU,CACnB,OAAO,SAAU4gC,OACf,IAAKjiC,SAASiiC,OACZ,MAAO,CAAC,EAEV,GAAIF,aACF,OAAOA,aAAaE,OAEtB5gC,OAAOlqB,UAAY8qD,MACnB,IAAI7jC,OAAS,IAAIiD,OAEjB,OADAA,OAAOlqB,eAAY6C,EACZokB,MACT,CACF,CAdiB,GA0CjB,IAAI8jC,UAAYt8B,UAAYA,SAASu8B,MAmBjCA,MAAQD,UAAY38B,UAAU28B,WAxBlC,SAAmB92C,OACjB,OAAOoZ,aAAapZ,QAVP,gBAUiBid,SAASjd,MACzC,EAuCA,IAAIg3C,UAAYx8B,UAAYA,SAASy8B,MAmBjCA,MAAQD,UAAY78B,UAAU68B,WAxBlC,SAAmBh3C,OACjB,OAAOoZ,aAAapZ,QAVP,gBAUiBid,SAASjd,MACzC,EA0DIk3C,cAAgB,CAAC,EAoBrB,SAASC,UAAUn3C,MAAOkX,QAASC,WAAYlX,IAAKgW,OAAQoB,OAC1D,IAAIrE,OACFojC,OAvDkB,EAuDTl/B,QACTkgC,OAvDgB,EAuDPlgC,QACTmgC,OAvDmB,EAuDVngC,QAIX,GAHIC,aACFnE,OAASiD,OAASkB,WAAWnX,MAAOC,IAAKgW,OAAQoB,OAASF,WAAWnX,aAExDpR,IAAXokB,OACF,OAAOA,OAET,IAAK4B,SAAS5U,OACZ,OAAOA,MAET,IAAIib,MAAQ1C,UAAUvY,OACtB,GAAIib,OAEF,GADAjI,OAzUJ,SAAwBzkB,OACtB,IAAIrB,OAASqB,MAAMrB,OACjB8lB,OAAS,IAAIzkB,MAAMqkB,YAAY1lB,QAOjC,OAJIA,QAA6B,iBAAZqB,MAAM,IAAkBsnD,iBAAiB5pD,KAAKsC,MAAO,WACxEykB,OAAOD,MAAQxkB,MAAMwkB,MACrBC,OAAOskC,MAAQ/oD,MAAM+oD,OAEhBtkC,MACT,CA+TaukC,CAAev3C,QACnBo2C,OACH,OAAOZ,UAAUx1C,MAAOgT,YAErB,CACL,IAAIwB,IAAMyI,SAASjd,OACjB+kB,OAjEQ,qBAiECvQ,KAhEF,8BAgEsBA,IAC/B,GAAIsF,SAAS9Z,OACX,OApbN,SAAqB6d,OAAQu4B,QAC3B,GAAIA,OACF,OAAOv4B,OAAO/nB,QAEhB,IAAI5I,OAAS2wB,OAAO3wB,OAClB8lB,OAASuiC,YAAcA,YAAYroD,QAAU,IAAI2wB,OAAOjL,YAAY1lB,QAEtE,OADA2wB,OAAO25B,KAAKxkC,QACLA,MACT,CA4aaykC,CAAYz3C,MAAOo2C,QAE5B,GAjEY,mBAiER5hC,KA1EQ,sBA0EcA,KAAoBuQ,SAAW9O,QAEvD,GADAjD,OAASokC,QAAUryB,OAAS,CAAC,EA7JnC,SAAyB9O,QACvB,MAAoC,mBAAtBA,OAAOrD,aAA8B4I,YAAYvF,QAA6C,CAAC,EAApC2gC,WAAWnB,aAAax/B,QACnG,CA2JuCyhC,CAAgB13C,QAC5Co2C,OACH,OAAOgB,OAnXf,SAAuBrnD,OAAQkmB,QAC7B,OAAO4+B,WAAW9kD,OAAQ4lD,aAAa5lD,QAASkmB,OAClD,CAiXwB0hC,CAAc33C,MAldtC,SAAsBiW,OAAQlmB,QAC5B,OAAOkmB,QAAU4+B,WAAW9kD,OAAQolD,SAASplD,QAASkmB,OACxD,CAgd6C2hC,CAAa5kC,OAAQhT,QArZlE,SAAqBjQ,OAAQkmB,QAC3B,OAAO4+B,WAAW9kD,OAAQmpB,WAAWnpB,QAASkmB,OAChD,CAmZ4E4hC,CAAY73C,MAxiBxF,SAAoBiW,OAAQlmB,QAC1B,OAAOkmB,QAAU4+B,WAAW9kD,OAAQisB,OAAOjsB,QAASkmB,OACtD,CAsiB+F6hC,CAAW9kC,OAAQhT,YAEvG,CACL,IAAKk3C,cAAc1iC,KACjB,OAAOyB,OAASjW,MAAQ,CAAC,EAE3BgT,OAASmjC,eAAen2C,MAAOwU,IAAK4hC,OACtC,CACF,CAEA/+B,QAAUA,MAAQ,IAAIX,OACtB,IAAIe,QAAUJ,MAAMvoB,IAAIkR,OACxB,GAAIyX,QACF,OAAOA,QAETJ,MAAM5oB,IAAIuR,MAAOgT,QACbikC,MAAMj3C,OACRA,MAAM5R,SAAQ,SAAU2pD,UACtB/kC,OAAOrc,IAAIwgD,UAAUY,SAAU7gC,QAASC,WAAY4gC,SAAU/3C,MAAOqX,OACvE,IACS0/B,MAAM/2C,QACfA,MAAM5R,SAAQ,SAAU2pD,SAAU93C,KAChC+S,OAAOvkB,IAAIwR,IAAKk3C,UAAUY,SAAU7gC,QAASC,WAAYlX,IAAKD,MAAOqX,OACvE,IAEF,IAAIqB,SAAW2+B,OAASD,OAASxB,aAAe15B,WAAak7B,OAASY,OAASh8B,OAC3EgG,MAAQ/G,WAAQrsB,EAAY8pB,SAAS1Y,OASzC,OARAsiB,UAAUN,OAAShiB,OAAO,SAAU+3C,SAAU93C,KACxC+hB,QAEF+1B,SAAW/3C,MADXC,IAAM83C,WAIRnD,YAAY5hC,OAAQ/S,IAAKk3C,UAAUY,SAAU7gC,QAASC,WAAYlX,IAAKD,MAAOqX,OAChF,IACOrE,MACT,CApFAkkC,cA7BgB,sBA6BWA,cA5BZ,kBA4BwCA,cAdhC,wBAckEA,cAbvE,qBAasGA,cA3B1G,oBA2BqIA,cA1BrI,iBA0BgKA,cAZ7J,yBAY2LA,cAX3L,yBAWyNA,cAV5N,sBAUuPA,cATtP,uBASkRA,cARlR,uBAQ8SA,cAtBhT,gBAsB0UA,cArBvU,mBAqBoWA,cApBpW,mBAoBiYA,cAnBjY,mBAmB8ZA,cAlBja,gBAkB2bA,cAjBxb,mBAiBqdA,cAhBrd,mBAgBkfA,cAPnf,uBAO+gBA,cANxgB,8BAM2iBA,cALjjB,wBAK8kBA,cAJ9kB,yBAI2mB,EAC3nBA,cA1Be,kBA0BaA,cAzBd,qBAyByCA,cAhBtC,qBAgBoE,EAuHrF,IAAIe,iBAAmBnkC,QAAUA,QAAQokC,wBAAqBtpD,EAS9D,SAASupD,cAAcn4C,OACrB,OAAOuY,UAAUvY,QAAUyZ,YAAYzZ,WAAai4C,kBAAoBj4C,OAASA,MAAMi4C,kBACzF,CAaA,SAASG,YAAY7pD,MAAO8pD,MAAOrhC,UAAWshC,SAAUtlC,QACtD,IAAID,OAAS,EACX7lB,OAASqB,MAAMrB,OAGjB,IAFA8pB,YAAcA,UAAYmhC,eAC1BnlC,SAAWA,OAAS,MACXD,MAAQ7lB,QAAQ,CACvB,IAAI8S,MAAQzR,MAAMwkB,OACdslC,MAAQ,GAAKrhC,UAAUhX,OACrBq4C,MAAQ,EAEVD,YAAYp4C,MAAOq4C,MAAQ,EAAGrhC,UAAWshC,SAAUtlC,QAEnDqF,UAAUrF,OAAQhT,OAEVs4C,WACVtlC,OAAOA,OAAO9lB,QAAU8S,MAE5B,CACA,OAAOgT,MACT,CA6BA,SAASulC,iBAAiBv4C,MAAOkT,OAC/B,GAAIlT,QAAUkT,MAAO,CACnB,IAAIslC,kBAAyB5pD,IAAVoR,MACjB8zC,UAAsB,OAAV9zC,MACZy4C,eAAiBz4C,OAAUA,MAC3B+zC,YAAcz0B,SAAStf,OACrBm0C,kBAAyBvlD,IAAVskB,MACjBkhC,UAAsB,OAAVlhC,MACZmhC,eAAiBnhC,OAAUA,MAC3BohC,YAAch1B,SAASpM,OACzB,IAAKkhC,YAAcE,cAAgBP,aAAe/zC,MAAQkT,OAAS6gC,aAAeI,cAAgBE,iBAAmBD,YAAcE,aAAeR,WAAaK,cAAgBE,iBAAmBmE,cAAgBnE,iBAAmBoE,eACnO,OAAO,EAET,IAAK3E,YAAcC,cAAgBO,aAAet0C,MAAQkT,OAASohC,aAAekE,cAAgBC,iBAAmB3E,YAAcC,aAAeK,WAAaoE,cAAgBC,iBAAmBtE,cAAgBsE,iBAAmBpE,eACnO,OAAQ,CAEZ,CACA,OAAO,CACT,CAmDA,SAASqE,YAAYv2B,WAAYw2B,UAAWC,QAC1C,IAAI7lC,OAAS,EAYb,OAXA4lC,UAAY9lC,SAAS8lC,UAAUzrD,OAASyrD,UAAY,CAACl3B,UAAWtH,UAAUyH,eAxF5E,SAAoBrzB,MAAOsqD,UACzB,IAAI3rD,OAASqB,MAAMrB,OAEnB,IADAqB,MAAMuqD,KAAKD,UACJ3rD,UACLqB,MAAMrB,QAAUqB,MAAMrB,QAAQ8S,MAEhC,OAAOzR,KACT,CA4FSwqD,CAVM12B,QAAQF,YAAY,SAAUniB,MAAOC,IAAKkiB,YAIrD,MAAO,CACL,SAJatP,SAAS8lC,WAAW,SAAU7lC,UAC3C,OAAOA,SAAS9S,MAClB,IAGE,QAAW+S,MACX,MAEJ,KAC0B,SAAUkD,OAAQ/C,OAC1C,OAjDJ,SAAyB+C,OAAQ/C,MAAO0lC,QAMtC,IALA,IAAI7lC,OAAS,EACXimC,YAAc/iC,OAAOgjC,SACrBC,YAAchmC,MAAM+lC,SACpB/rD,OAAS8rD,YAAY9rD,OACrBisD,aAAeP,OAAO1rD,SACf6lB,MAAQ7lB,QAAQ,CACvB,IAAI8lB,OAASulC,iBAAiBS,YAAYjmC,OAAQmmC,YAAYnmC,QAC9D,GAAIC,OACF,OAAID,OAASomC,aACJnmC,OAGFA,QAAmB,QADd4lC,OAAO7lC,QACiB,EAAI,EAE5C,CAQA,OAAOkD,OAAOlD,MAAQG,MAAMH,KAC9B,CAyBWqmC,CAAgBnjC,OAAQ/C,MAAO0lC,OACxC,GACF,CAYA,SAASS,eAAer5C,MAAO+S,MAAOkD,QACpC,IAAKrB,SAASqB,QACZ,OAAO,EAET,IAAInkB,KAAO0gB,UAAUO,OACrB,SAAY,UAARjhB,KAAmBiqB,YAAY9F,SAAW+D,QAAQjH,MAAOkD,OAAO/oB,QAAkB,UAAR4E,MAAoBihB,SAASkD,SAClGhD,GAAGgD,OAAOlD,OAAQ/S,MAG7B,CA+BA,IAAIs5C,OAAS30B,UAAS,SAAUxC,WAAYw2B,WAC1C,GAAkB,MAAdx2B,WACF,MAAO,GAET,IAAIj1B,OAASyrD,UAAUzrD,OAMvB,OALIA,OAAS,GAAKmsD,eAAel3B,WAAYw2B,UAAU,GAAIA,UAAU,IACnEA,UAAY,GACHzrD,OAAS,GAAKmsD,eAAeV,UAAU,GAAIA,UAAU,GAAIA,UAAU,MAC5EA,UAAY,CAACA,UAAU,KAElBD,YAAYv2B,WAAYi2B,YAAYO,UAAW,GAAI,GAC5D,IACIY,kBAAoB,SAA2Bre,QACjD,IAAIse,UAAY,GACZvc,0BAA4BxR,4BAA4BuJ,oBAAoBG,YAAqB,SACjGskB,kBAAoB,CAAC,EACrBC,gCAAkC,SAAyCC,SAC7EA,QAAQva,wBAAwBhxC,SAAQ,SAAU6jB,UAC3CwnC,kBAAkBxnC,UAGrBwnC,kBAAkBxnC,YAFlBwnC,kBAAkBxnC,UAAY,CAIlC,GACF,EAWI2nC,WAAa,SAASA,WAAWD,SACnCD,gCAAgCC,SAChCA,QAAQxa,yBAA2BlC,0BACnC,IAAIlqB,MAAQ0gC,cAAc+F,UAAWG,QAAS,aAE9C,OADAH,UAAUv4C,OAAO8R,MAAO,EAAG4mC,SACpB9hB,oBAAoBgiB,cAAeF,QAASC,WAAYD,QACjE,EACIE,cAAgB,SAASA,cAAcF,UAjBF,SAA4CA,SACnFA,QAAQva,wBAAwBhxC,SAAQ,SAAU6jB,UAC5CwnC,kBAAkBxnC,WACpBwnC,kBAAkBxnC,YAEgB,IAAhCwnC,kBAAkBxnC,kBACbwnC,kBAAkBxnC,SAE7B,GACF,CASE6nC,CAAmCH,SACnC,IAAI5mC,MAAQuQ,UAAUk2B,UAAWG,SACjC,OAAe,IAAX5mC,OACFymC,UAAUv4C,OAAO8R,MAAO,GACjB8kB,oBAAoB+hB,WAAYD,QAASE,cAAeF,UAE1D9hB,mBACT,EACIkiB,YAAc,SAAqBC,UAErCP,kBAAoB,IADpBD,UAAYQ,UAEF5rD,SAAQ,SAAUurD,SAC1BD,gCAAgCC,QAClC,GACF,EAsCA,GAAIze,OAAQ,CACV,IAAIA,OAAOlvC,eAAe,cAAeusB,UAAU2iB,OAAO8e,UAMxD,MAAM,IAAIr3C,MAAM,4FALhB62C,UAAYF,OAAOpe,OAAO8e,SAAU,CAAC,eAC3B5rD,SAAQ,SAAUurD,SAC1BD,gCAAgCC,QAClC,GAIJ,CACA,IAAIthB,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxC42C,SAAU,CACRlrD,IAAK,WACH,OAAO0qD,SACT,KAeJ,OAZAnhB,QAAQ4hB,4BAhC0B,SAASA,4BAA4B/kB,0BAChEF,oBAAoBC,oBAAoBC,4BAC3CA,yBAA2BF,oBAAoBG,YAAqB,SAEtE,IAAIzJ,mBAAqBD,4BAA4ByJ,0BACjDglB,uCAAyCjd,0BAA0B9/B,WAKvE,OAJA8/B,0BAA4BvR,mBAC5Bt9B,QAAQorD,WAAW,SAAUG,SAC3BA,QAAQxa,yBAA2BzT,kBACrC,IACOmM,oBAAoBoiB,4BAA6BC,uCAAwCD,4BAA6B/kB,yBAC/H,EAsBAmD,QAAQ8hB,4BArB0B,WAChC,OAAOld,yBACT,EAoBA5E,QAAQ+G,sBArCoB,WAC1B,OAAOtzC,OAAOmpB,KAAKwkC,kBACrB,EAoCAphB,QAAQuhB,WAAaA,WACrBvhB,QAAQwhB,cAAgBA,cACxBxhB,QAAQ+hB,cA3DY,SAAuBC,iBACzCA,gBAAgBjsD,SAAQ,SAAUksD,gBAChC,IAAIC,gBAAkB/2B,KAAKg2B,WAAW,SAAUgB,iBAC9C,OAAOA,gBAAgBrd,YAAcmd,eAAend,SACtD,IACIod,kBACFb,gCAAgCY,gBAChCA,eAAepb,gBAAgB9wC,SAAQ,SAAUyvC,aAC/C0c,gBAAgBhd,wBAAwBM,YAC1C,IAEJ,GACF,EAgDAxF,QAAQtpC,MA/CI,WACV,IAAI0rD,cA7RCtD,UA6RqBqC,UA1TH,GA6TvB,OAFAA,UAAY,GACZC,kBAAoB,GACb5hB,oBAAoBkiB,YAAaU,cAAeV,YAAa,GACtE,EA2CA1hB,QAAQrM,OAAS,WACf,MAAO,CACLguB,SAAUR,UAEd,EACOnhB,OACT,EAGIqiB,2BASM,SAAgBxf,QACtB,OAAOqe,kBAAkBre,OAC3B,EAEEyf,YAAc7uD,OAAO2X,OAAO,CAC9Bm3C,WAAY,gCACZC,SAAU,GACVC,QAASvb,YAAY,CACnBzlC,EAAG,IACHrO,EAAG,IACH80C,EAAG,MAELwa,QAASxb,YAAY,CACnBzlC,EAAG,EACHrO,EAAG,EACH80C,EAAG,EACHpkC,EAAG,OAGH6+C,aAAe,SAAsB9f,QAEvC,IAAII,qBADJJ,OAASA,QAAU,CAAC,GACahG,yBAA2BzJ,4BAA4ByP,OAAOhG,0BAA4BzJ,4BAA4BuJ,oBAAoBG,YAAqB,SAC5L8lB,SAAW/f,OAAO4f,QAAUvb,YAAYrE,OAAO4f,SAAWH,YAAYG,QAAQ9T,QAC9EkU,SAAWhgB,OAAO6f,QAAUxb,YAAYrE,OAAO6f,SAAWJ,YAAYI,QAAQ/T,QAC9EmU,YAAcjgB,OAAO0f,WAAa1f,OAAO0f,WAAaD,YAAYC,WAClEQ,UAAYC,cAAcngB,OAAQyf,YAAYE,UAC9CS,UAAYpgB,OAAOqgB,SAAWrgB,OAAOqgB,cAAW3sD,EAChD4sD,WAAatgB,OAAOugB,UAAYvgB,OAAOugB,eAAY7sD,EACnD8sD,mBAAqBxgB,OAAO8e,SAAWU,2BAA2B,CACpEV,SAAU9e,OAAO8e,WACdU,6BACDlf,YAAc,IAAI3R,oBAAoBvD,mBAiCtCq1B,cAAgB,SAAuBvb,OACzC,MAAO,CACL,WAAYA,MAAMtmC,EAClB,aAAcsmC,MAAM30C,EACpB,YAAa20C,MAAMG,EACnB,YAAa,MAEjB,EACIqb,qBAAuB,SAA8BC,cACvD,IAAIC,aAAeD,aAAa5X,QAChC,MAAO,CACLnqC,EAAGgiD,aAAahiD,EAChBrO,EAAGqwD,aAAarwD,EAChB80C,EAAGub,aAAavb,EAEpB,EACIlI,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCsoB,mBAAoB,CAClB58B,IAAK,WACH,OAAOwsC,mBACT,GAEFwf,QAAS,CACPhsD,IAAK,WACH,OAAO8sD,qBAAqBX,SAC9B,GAEFc,WAAY,CACVjtD,IAAK,WACH,OAAOmsD,SAASlV,aAClB,GAEFgV,QAAS,CACPjsD,IAAK,WACH,OAAO8sD,qBAAqBV,SAC9B,GAEFc,UAAW,CACTltD,IAAK,WACH,OAAOosD,SAAS7V,UAClB,GAEF4W,WAAY,CACVntD,IAAK,WACH,OAAOosD,SAASnV,aAClB,GAEFmW,eAAgB,CACdptD,IAAK,WACH,OAAOosD,SAAS9U,aAClB,GAEFwU,WAAY,CACV9rD,IAAK,WACH,OAAOqsD,WACT,GAEFN,SAAU,CACR/rD,IAAK,WACH,OAAOssD,SACT,GAEFG,SAAU,CACRzsD,IAAK,WACH,OAAOwsD,SACT,GAEFG,UAAW,CACT3sD,IAAK,WACH,OAAO0sD,UACT,GAEFW,kBAAmB,CACjBrtD,IAAK,WACH,OAAO4sD,kBACT,KA2BJ,OAxBArjB,QAAQ4hB,4BAA8ByB,mBAAmBzB,4BACzD5hB,QAAQ8hB,4BAA8BuB,mBAAmBvB,4BACzD9hB,QAAQ+G,sBAAwBsc,mBAAmBtc,sBACnD/G,QAAQzN,MAjHI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,kBAAmB,UACnB,kBAAmB,QACnB,kBAAmB,aACnB,mBAAoBowB,YACpB,iBAAkBC,UAClB,kBAAmBF,SAAS7V,WAC5B,iBAAkBiW,UAClB,yBAA0BE,YAE5BnwB,SAAU,CAAC,CACTv7B,KAAM,gBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUqwB,mBAAmB1B,YAE9B,CACDlqD,KAAM,cACNi7B,KAAM4wB,cAAcV,SAAShX,UAC5B,CACDn0C,KAAM,cACNi7B,KAAM4wB,cAAcT,SAASjX,cAInC,OAAOzI,YAAY/Q,wBAAwBqR,SAC7C,EAmFAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACT+e,QAASG,SAAShX,QAClB8W,QAASG,SAASjX,QAClB+X,UAAWd,SAAS7V,WACpBuV,WAAYO,YACZN,SAAUO,UACVG,SAAUD,UACVG,UAAWD,WACXxB,SAAUl1B,UAAU42B,mBAAmB1B,SAAU,WAE/CrvB,KAAOr8B,KAOX,OAHAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACO87B,IACT,EACO1D,OACT,EACI+jB,YAAc,SAAqB9rD,SACrC,MAAO,CACLwJ,EAAGs+B,OAAO9nC,QAAQ8L,aAAa,aAC/B3Q,EAAG2sC,OAAO9nC,QAAQ8L,aAAa,eAC/BmkC,EAAGnI,OAAO9nC,QAAQ8L,aAAa,cAEnC,EACIi/C,cAAgB,SAAuBngB,OAAQmhB,iBACjD,IAAKnhB,OAAO2f,SACV,OAAOwB,gBAET,IAAIC,gBAAkBphB,OAAO2f,SAI7B,OAHIr0B,SAAS0U,OAAO2f,YAClByB,gBAAkBphB,OAAO2f,SAAShlC,QAAQ,KAAM,IAAIA,QAAQ,KAAM,KAE7DymC,gBAAkCD,eAC3C,EAyBIE,sBAeM,SAAgBrhB,QACtB,OAAO8f,aAAa9f,OACtB,EAjBEqhB,oCAxByB,SAAgCC,qBAC3D,IAAIhhB,YAAc,IAAI3R,oBAAoBvD,mBACtCm2B,aAAe,IAAIzB,aACvB,GAAIwB,oBAAqB,CACvB,IAAIE,eAAiBlhB,YAAY1R,iCAAiC0yB,oBAAqB,eACnFG,eAAiBnhB,YAAY1R,iCAAiC0yB,oBAAqB,eAEnFxC,SAAWpkD,IADO4lC,YAAYnR,6BAA6BmyB,oBAAqB,mBAChDnd,gCAChCnE,OAAS,CACX4f,QAASsB,YAAYM,gBACrB3B,QAASqB,YAAYO,gBACrB/B,WAAY4B,oBAAoBpgD,aAAa,oBAC7Cy+C,SAAUziB,OAAOokB,oBAAoBpgD,aAAa,mBAClDm/C,SAAUiB,oBAAoBpgD,aAAa,kBAC3Cq/C,UAAWrjB,OAAOokB,oBAAoBpgD,aAAa,2BACnD49C,UAEF9e,OAAO6f,QAAQ5+C,EAAKsqB,MAAM+1B,oBAAoBpgD,aAAa,oBAAoFu+C,YAAYI,QAAQ1V,WAAlFjN,OAAOokB,oBAAoBpgD,aAAa,oBACzHqgD,aAAe,IAAIzB,aAAa9f,OAClC,CACA,OAAOuhB,YACT,EAoEA,SAAS1mD,OAAOosB,WAAYnL,WAE1B,OADWuB,UAAU4J,YAAcvJ,YAAc6K,YACrCtB,WAAYP,aAAa5K,WACvC,CACA,IAAI4lC,oBAAsB,WACxB,IAAI3f,0BAA4BxR,4BAA4BuJ,oBAAoBG,YAAqB,SACjG0nB,oBAAsB,KACtBC,eAAiB,GACjBrD,kBAAoB,CAAC,EAYrBsD,wBAA0B,WAC5B,GAA8B,IAA1BD,eAAe5vD,OAAnB,CAII+vC,0BAA0B9/B,aAAe63B,oBAAoBG,YAAqB,UACpF0nB,oBAAsBC,eAAe,IAEvC,IAAIE,sBAAwBx5B,KAAKs5B,gBAAgB,SAAUL,cACzD,OAAOA,aAAa/wB,mBAAmBvuB,aAAe8/B,0BAA0B9/B,UAClF,IAEE0/C,oBADEG,uBAGoBF,eAAe,EAVvC,MAFED,oBAAsB,IAc1B,EAkBII,gBAAkB,SAASA,gBAAgBR,cAC7C,GANmG/wB,mBAMpD+wB,aAAa/wB,mBALrDoxB,eAAe5qC,MAAK,SAAUuqC,cACnC,OAAOA,aAAa/wB,mBAAmBvuB,aAAeuuB,mBAAmBvuB,UAC3E,IAIE,MAAM,IAAIwF,MAAM,4EAA6E85C,aAAa/wB,mBAAmBvuB,WAAY,yBAP5F,IAAoDuuB,mBAYnG,OApDyB,SAA8BA,oBACvD+tB,kBAAkB/tB,mBAAmBvuB,YAAcuuB,mBAAmBvuB,UACxE,CA+CE+/C,CAAqBT,aAAa/wB,oBAClCoxB,eAAe1sD,KAAKqsD,cACpBM,0BACOllB,oBAAoBslB,mBAAoBV,aAAcQ,gBAAiBR,aAChF,EACIU,mBAAqB,SAASA,mBAAmBC,sBACnD,IApDyD1xB,mBAoDrD2xB,qBAAuBzmD,OAAOkmD,gBAAgB,SAAUL,cAC1D,OAAOA,aAAa/wB,mBAAmBvuB,aAAeigD,qBAAqB1xB,mBAAmBvuB,UAChG,IACImgD,oBAAsBD,qBAAqBnwD,OAAS,EAAImwD,qBAAqB,QAAKzuD,EAKtF,OAJI0uD,sBAxDqD5xB,mBAyDjC4xB,oBAAoB5xB,mBAxDxC+tB,kBAAkB/tB,mBAAmBvuB,oBAChCs8C,kBAAkB/tB,mBAAmBvuB,YAwD5C4/C,2BAEKllB,oBAAoBolB,gBAAiBK,oBAAqBH,mBAAoBC,qBACvF,EAwDIG,sBAAwB,WAC1B,IAAIC,mBAAqB,CACvBtoB,yBAA0B2nB,oBAAsBA,oBAAoB3nB,8BAA2BtmC,EAC/FksD,QAAS+B,oBAAsBA,oBAAoB/B,aAAUlsD,EAC7DotD,UAAWa,oBAAsBA,oBAAoBb,eAAYptD,EACjEgsD,WAAYiC,oBAAsBA,oBAAoBjC,gBAAahsD,EACnEisD,SAAUgC,oBAAsBA,oBAAoBhC,cAAWjsD,EAC/D2sD,SAAUsB,oBAAsBA,oBAAoBtB,cAAW3sD,EAC/D6sD,UAAWoB,oBAAsBA,oBAAoBpB,eAAY7sD,GAE/D6uD,mBAAqBlB,sBAAsBiB,oBAI/C,OAHAV,eAAe1uD,SAAQ,SAAUquD,cAC/BgB,mBAAmBtB,kBAAkB/B,cAAcqC,aAAaN,kBAAkBnC,SACpF,IACOyD,kBACT,EAgBIC,wCAA0C,WAC5C,OAA+B,OAAxBb,qBAAgCA,oBAAoBV,kBAAkBnC,SAAS9sD,OAAS,CACjG,EAIImrC,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCu6C,mBAAoB,CAClB7uD,IAjBwB,WAC1B,OAAO+tD,mBACT,GAiBEe,oBAAqB,CACnB9uD,IAAK,WACH,OAAOguD,eAAe5vD,MACxB,GAEF2wD,iBAAkB,CAChB/uD,IAAK4uD,yCAEPI,8BAA+B,CAC7BhvD,IAAK,WACH,OAAO4uD,gDAAyG9uD,IAA5DiuD,oBAAoBV,kBAAkBnC,SAAS,GAAGxb,KACxG,KAaJ,OAVAnG,QAAQ4hB,4BAnJ0B,SAASA,4BAA4B/kB,0BAChEF,oBAAoBC,oBAAoBC,4BAC3CA,yBAA2BF,oBAAoBG,YAAqB,SAEtE,IAAIuG,iCAAmCuB,0BAA0B9/B,WAGjE,OAFA8/B,0BAA4BxR,4BAA4ByJ,0BACxD6nB,0BACOllB,oBAAoBoiB,4BAA6Bve,iCAAkCue,4BAA6B/kB,yBACzH,EA4IAmD,QAAQ8hB,4BA3I0B,WAChC,OAAOld,yBACT,EA0IA5E,QAAQ0lB,cAhCY,WAClBjB,eAAiB,GACjBrD,kBAAoB,CAAC,EACrBxc,0BAA4BxR,4BAA4BuJ,oBAAoBG,YAAqB,SACjG0nB,oBAAsB,IACxB,EA4BAxkB,QAAQ2lB,8BAjH4B,SAAuCxB,qBACzE,IAAIyB,mBAAqB1B,oCAAoCC,qBACzD0B,mBAAqBD,mBAAmB7e,wBACxC8e,mBAAmBhxD,OAAS,EAC9BgxD,mBAAmB9vD,SAAQ,SAAU6jB,UACnC,IAAIurC,mBAAqB,CACvBtoB,yBAA0BjjB,SAC1B6oC,QAASmD,mBAAmBnD,QAC5BC,QAASkD,mBAAmBlD,QAC5BiB,UAAWiC,mBAAmBjC,UAC9BpB,WAAYqD,mBAAmBrD,WAC/BC,SAAUoD,mBAAmBpD,SAC7BU,SAAU0C,mBAAmB1C,SAC7BE,UAAWwC,mBAAmBxC,WAE5BgB,aAAeF,sBAAsBiB,oBACzCS,mBAAmB9B,kBAAkBnC,SAAS5rD,SAAQ,SAAUurD,SAC9D,IAAIwE,wBAA0BpoD,OAAO4jD,QAAQza,iBAAiB,SAAUrB,aACtE,OAAOA,YAAYnS,mBAAmBvuB,aAAe8U,QACvD,IACImsC,cAAgB,CAClBjhB,UAAWwc,QAAQxc,UACnBG,SAAUqc,QAAQrc,SAClB4B,gBAAiBif,yBAEfxE,QAAQzb,sBACVkgB,cAAclgB,oBAAsByb,QAAQzb,qBAE1Cyb,QAAQvb,oBACVggB,cAAchgB,kBAAoBub,QAAQvb,mBAExCub,QAAQrb,OACV8f,cAAc9f,KAAOqb,QAAQrb,MAE3Bqb,QAAQnb,QACV4f,cAAc5f,MAAQmb,QAAQnb,OAE5Bmb,QAAQjb,aACV0f,cAAc1f,WAAaib,QAAQjb,YAEjCib,QAAQ/a,cACVwf,cAAcxf,YAAc+a,QAAQ/a,aAElC+a,QAAQ7a,iBACVsf,cAActf,eAAiB6a,QAAQ7a,gBAEzC,IAAIuf,WAAahf,iBAAiB+e,eAClC3B,aAAaN,kBAAkBvC,WAAWyE,WAC5C,IACApB,gBAAgBR,aAClB,IAEAQ,gBAAgBgB,mBAEpB,EA4DA5lB,QAAQ4kB,gBAAkBA,gBAC1B5kB,QAAQ8kB,mBAAqBA,mBAC7B9kB,QAAQ+G,sBA7KoB,WAC1B,OAAOtzC,OAAOmpB,KAAKwkC,kBACrB,EA4KAphB,QAAQimB,mCA5BiC,WACvC,OAAOZ,0CAA4Cb,oBAAoBV,kBAAkBnC,SAAS,GAAGxb,MAAQ,IAC/G,EA2BAnG,QAAQzN,MA/CI,WACV,OAAO2yB,wBAAwB3yB,OACjC,EA8CAyN,QAAQrM,OA7CK,WACX,OAAOuxB,wBAAwBvxB,QACjC,EA4COqM,OACT,EAGIkmB,6BAOM,WACN,OAAO3B,qBACT,EAEE4B,oBAAsB,SAA6BtjB,QACrD,IAAIujB,MACAliB,WACAK,OACAC,YACAC,aACAC,gBACAJ,MACApB,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBACtC4U,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,SAARA,IACFw+C,MAAQvjB,OAAOprC,KACE,cAARmQ,IACTs8B,WAAarB,OAAOiC,UACH,UAARl9B,IACT28B,OAAS1B,OAAOsD,MACC,eAARv+B,IACT48B,YAAc3B,OAAOwD,WACJ,gBAARz+B,IACT68B,aAAe5B,OAAO0D,YACL,mBAAR3+B,IACT88B,gBAAkB7B,OAAO4D,eACR,SAAR7+B,IACT08B,MAAQzB,OAAOoD,KACLzpB,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF,IAkBIo4B,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCtT,KAAM,CACJhB,IAAK,WACH,OAAO2vD,KACT,GAEFthB,UAAW,CACTruC,IAAK,WACH,OAAOytC,UACT,GAEFiC,MAAO,CACL1vC,IAAK,WACH,OAAO8tC,MACT,GAEF8B,WAAY,CACV5vC,IAAK,WACH,OAAO+tC,WACT,GAEF+B,YAAa,CACX9vC,IAAK,WACH,OAAOguC,YACT,GAEFgC,eAAgB,CACdhwC,IAAK,WACH,OAAOiuC,eACT,GAEFuB,KAAM,CACJxvC,IAAK,WACH,OAAO6tC,KACT,KA0BJ,OAvBAtE,QAAQzN,MAvDI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,aAAc0zB,MACd,kBAAmBliB,WACnB,cAAeK,OACf,mBAAoBC,YACpB,oBAAqBC,aACrB,kBAAmBC,gBAAkBA,gBAAgBzE,WAAa,KAClE,aAAcqE,UAIpB,OAAOnB,YAAY/Q,wBAAwBqR,SAC7C,EAuCAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTjsC,KAAM2uD,MACNthB,UAAWZ,WACXiC,MAAO5B,OACP8B,WAAY7B,YACZ+B,YAAa9B,aACbgC,eAAgB/B,gBAAkBA,gBAAgB/Q,cAAWp9B,EAC7D0vC,KAAM3B,OAEJhS,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACO1D,OACT,EAwBIqmB,6BAeM,SAAgBxjB,QACtB,OAAOsjB,oBAAoBtjB,OAC7B,EAjBEwjB,2CAvByB,SAAgCC,4BAC3D,IAAIzjB,OAAS,CACXprC,KAAM6uD,2BAA2BviD,aAAa,cAC9C+gC,UAAW/E,OAAOumB,2BAA2BviD,aAAa,qBAgB5D,OAXA8+B,OAAOsD,MAAQmgB,2BAA2BviD,aAAa,qBAAkBxN,EACrE+vD,2BAA2BviD,aAAa,sBAC1C8+B,OAAOwD,WAAatG,OAAOumB,2BAA2BviD,aAAa,sBAEjEuiD,2BAA2BviD,aAAa,uBAC1C8+B,OAAO0D,YAAcxG,OAAOumB,2BAA2BviD,aAAa,uBAEtE8+B,OAAOoD,KAAOqgB,2BAA2BviD,aAAa,oBAAiBxN,EACnE+vD,2BAA2BviD,aAAa,qBAC1C8+B,OAAO4D,eAAiBhH,wBAAwB6mB,2BAA2BviD,aAAa,qBAEnF,IAAIoiD,oBAAoBtjB,OACjC,EA8BI0jB,qBAAuB,SAA8B1jB,QACvD,IAAI2jB,OAAS,GACTrjB,YAAc,IAAI3R,oBAAoBvD,mBAC1C,GAAI4U,OAAQ,CACV,IAAIA,OAAOlvC,eAAe,WAAYusB,UAAU2iB,OAAO4jB,OAGrD,MAAM,IAAIn8C,MAAM,wFAFhBk8C,OAAS3jB,OAAO4jB,KAIpB,CACA,IAuBIzmB,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCo7B,MAAO,CACL1vC,IAAK,WACH,OAAOosC,OAAOsD,KAChB,GAEFugB,WAAY,CACVjwD,IAAK,WACH,OAAOosC,OAAO6jB,UAChB,GAEFD,MAAO,CACLhwD,IAAK,WACH,OAAO+vD,MACT,KAmBJ,OAhBAxmB,QAAQzN,MAxCI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,kBAAmB,kBACnB,kBAAmB,oBACnB,kBAAmB,QACnB,cAAemQ,OAASA,OAAOsD,WAAQ5vC,EACvC,sBAAuBssC,OAASA,OAAO6jB,gBAAanwD,GAEtDy8B,SAAU,CAAC,CACTv7B,KAAM,gBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUwzB,cAKlB,OAAOrjB,YAAY/Q,wBAAwBqR,SAC7C,EAmBAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTyC,MAAOtD,OAAOsD,MACdugB,WAAY7jB,OAAO6jB,WACnBD,MAAOh6B,UAAU+5B,OAAQ,WAEvBl0B,KAAOr8B,KAOX,OAHAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACO87B,IACT,EACO1D,OACT,EAoBI2mB,8BASM,SAAgB9jB,QACtB,OAAO0jB,qBAAqB1jB,OAC9B,EAXE8jB,4CAnByB,SAAgCC,6BAC3D,IAAIzjB,YAAc,IAAI3R,oBAAoBvD,mBACtC44B,qBAAuB,IAAIN,qBAC/B,GAAIK,4BAA6B,CAC/B,IAAIE,4BAA8B3jB,YAAYnR,6BAA6B40B,4BAA6B,mBACpGzgB,MAAQygB,4BAA4B7iD,aAAa,eACjD2iD,WAAaE,4BAA4B7iD,aAAa,uBACtD0iD,MAAQlpD,IAAIupD,4BAA6BT,4CAM7CQ,qBAAuB,IAAIN,qBALd,CACXpgB,MACAugB,WACAD,OAGJ,CACA,OAAOI,oBACT,EAqDA,IAgpDI1jB,YA5mDA4jB,sBAQM,SAAgBC,mBACtB,OA7Ce,SAAsBA,mBACvC,IAAIC,aAAe,GAQnB,IAAID,oBAAqB74B,SAAS64B,mBAIhC,MAAM,IAAI18C,MAAM,kFAHhB,IAAI48C,iBAvBR,SAAiBhxD,OAKf,IAJA,IAAIwkB,OAAS,EACX7lB,OAAkB,MAATqB,MAAgB,EAAIA,MAAMrB,OACnC2rB,SAAW,EACX7F,OAAS,KACFD,MAAQ7lB,QAAQ,CACvB,IAAI8S,MAAQzR,MAAMwkB,OACd/S,QACFgT,OAAO6F,YAAc7Y,MAEzB,CACA,OAAOgT,MACT,CAW2BwsC,CAAQH,kBAAkB51B,MAAM,MACvD61B,aAAe1pD,IAAI2pD,kBATE,SAA0BE,kBAC/C,IAAIn1B,OAASm1B,iBAAiBh2B,MAAM,KACpC,MAAO,CACL79B,EAAGwsC,OAAO9N,OAAO,IACjBh9B,EAAG8qC,OAAO9N,OAAO,IAErB,IAOA,IAAI+N,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCs8C,YAAa,CACX5wD,IAAK,WACH,OAAOwwD,YACT,KAaJ,OAVAjnB,QAAQrM,OAAS,WACf,MAAO,CACL0zB,YAAaJ,aAEjB,EACAjnB,QAAQC,SAAW,WACjB,OAAO1iC,IAAI0pD,cAAc,SAAUK,OACjC,OAAOA,MAAM/zD,EAAI,IAAM+zD,MAAMryD,CAC/B,IAAGy+B,KAAK,KAAO,GACjB,EACOsM,OACT,CAYWunB,CAAaP,kBACtB,EAEEQ,QAAU,SAAiB3kB,QAC7B,IAAI4kB,OACAvjB,WACAC,UACAujB,cACAC,QACAC,OACAC,UACAC,UACAC,WACAC,UACA1jB,MACApB,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBACtC4U,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,UAARA,IACF6/C,OAAS5kB,OAAOolB,MACC,cAARrgD,IACTs8B,WAAarB,OAAOiC,UACH,aAARl9B,IACTu8B,UAAYtB,OAAOoC,SACF,iBAARr9B,IACT8/C,cAAgB7kB,OAAOqlB,aACN,WAARtgD,IACT+/C,QAAU9kB,OAAOslB,OACA,UAARvgD,IACTggD,OAAS/kB,OAAOulB,MACC,aAARxgD,IACTigD,UAAYhlB,OAAOwlB,SACF,aAARzgD,IACTkgD,UAAYjlB,OAAOylB,SACF,cAAR1gD,IACTmgD,WAAallB,OAAO0lB,UACH,aAAR3gD,IACTogD,UAAYnlB,OAAO2lB,SACF,SAAR5gD,IACT08B,MAAQzB,OAAOoD,KACLzpB,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF,IAsBIo4B,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCk9C,MAAO,CACLxxD,IAAK,WACH,OAAOgxD,MACT,GAEF3iB,UAAW,CACTruC,IAAK,WACH,OAAOytC,UACT,GAEF0C,QAAS,CACPnwC,IAAK,WACH,OAAOytC,WAAaC,SACtB,GAEFc,SAAU,CACRxuC,IAAK,WACH,OAAO0tC,SACT,GAEF+jB,aAAc,CACZzxD,IAAK,WACH,OAAOixD,aACT,GAEFS,OAAQ,CACN1xD,IAAK,WACH,OAAOkxD,OACT,GAEFS,MAAO,CACL3xD,IAAK,WACH,OAAOmxD,MACT,GAEFS,SAAU,CACR5xD,IAAK,WACH,OAAOoxD,SACT,GAEFS,SAAU,CACR7xD,IAAK,WACH,OAAOqxD,SACT,GAEFS,UAAW,CACT9xD,IAAK,WACH,OAAOsxD,UACT,GAEFS,SAAU,CACR/xD,IAAK,WACH,OAAOuxD,SACT,GAEF/hB,KAAM,CACJxvC,IAAK,WACH,OAAO6tC,KACT,KA8BJ,OA3BAtE,QAAQzN,MApFI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,cAAe+0B,OACf,iBAAkBtjB,UAClB,kBAAmBD,WACnB,qBAAsBwjB,cAAgBA,cAAcznB,gBAAa1pC,EACjE,eAAgBoxD,QAChB,cAAeC,OAAS,IAAM,IAC9B,iBAAkBC,UAClB,iBAAkBG,UAClB,iBAAkBF,UAClB,aAAcxjB,MACd,kBAAmByjB,WAAa,IAAM,QAI5C,OAAO5kB,YAAY/Q,wBAAwBqR,SAC7C,EAgEAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTukB,MAAOR,OACP3iB,UAAWZ,WACXe,SAAUd,UACV+jB,aAAcR,cACdS,OAAQR,QACRS,MAAOR,OACPS,SAAUR,UACVS,SAAUR,UACVS,UAAWR,WACXS,SAAUR,UACV/hB,KAAM3B,OAEJhS,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACO1D,OACT,EAqBIyoB,+BApByB,SAAgCC,gBAC3D,IAAI7lB,OAAS,CACXolB,MAAOS,eAAe3kD,aAAa,aACnC+gC,UAAW/E,OAAO2oB,eAAe3kD,aAAa,oBAC9CkhC,SAAUlF,OAAO2oB,eAAe3kD,aAAa,mBAC7CmkD,aAAcnB,sBAAsB2B,eAAe3kD,aAAa,uBAChEokD,OAAQpoB,OAAO2oB,eAAe3kD,aAAa,iBAC3CqkD,MAAsD,MAA/CM,eAAe3kD,aAAa,eACnCwkD,UAA8D,MAAnDG,eAAe3kD,aAAa,oBAQzC,OANI2kD,eAAe3kD,aAAa,oBAC9B8+B,OAAOwlB,SAAWtoB,OAAO2oB,eAAe3kD,aAAa,oBAEvD8+B,OAAO2lB,SAAWE,eAAe3kD,aAAa,wBAAqBxN,EACnEssC,OAAOylB,SAAWI,eAAe3kD,aAAa,wBAAqBxN,EACnEssC,OAAOoD,KAAOyiB,eAAe3kD,aAAa,oBAAiBxN,EACpD,IAAIixD,QAAQ3kB,OACrB,EAmCI8lB,aAAe,SAAsB9lB,QACvC,IAAI+lB,UAAY,GACZzlB,YAAc,IAAI3R,oBAAoBvD,mBAC1C,GAAI4U,OAAQ,CACV,IAAIA,OAAOlvC,eAAe,cAAeusB,UAAU2iB,OAAOgmB,UAGxD,MAAM,IAAIv+C,MAAM,sFAFhBs+C,UAAY/lB,OAAOgmB,QAIvB,CACA,IAqBI7oB,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxC89C,SAAU,CACRpyD,IAAK,WACH,OAAOmyD,SACT,KAiBJ,OAdA5oB,QAAQzN,MA5BI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,kBAAmB,UACnB,kBAAmB,WACnB,kBAAmB,SAErBM,SAAU,CAAC,CACTv7B,KAAM,gBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAU41B,iBAKlB,OAAOzlB,YAAY/Q,wBAAwBqR,SAC7C,EASAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTmlB,SAAUp8B,UAAUm8B,UAAW,WAE7Bt2B,KAAOr8B,KAOX,OAHAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACO87B,IACT,EACO1D,OACT,EAgBI8oB,oCAfyB,SAAgCC,qBAC3D,IAAI5lB,YAAc,IAAI3R,oBAAoBvD,mBACtC+6B,aAAe,IAAIL,aACvB,GAAII,oBAAqB,CACvB,IACIF,SAAWtrD,IADO4lC,YAAYnR,6BAA6B+2B,oBAAqB,mBAChDN,gCAIpCO,aAAe,IAAIL,aAHN,CACXE,UAGJ,CACA,OAAOG,YACT,EAwBIC,OAAS,SAAgBpmB,QAC3B,IAAIqmB,SACApmB,MACAI,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBACtC4U,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,YAARA,IACFshD,SAAWrmB,OAAOsmB,QACD,SAARvhD,IACTk7B,MAAQD,OAAO3P,KACL1W,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF,IAgBIo4B,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCo+C,QAAS,CACP1yD,IAAK,WACH,OAAOyyD,QACT,GAEFh2B,KAAM,CACJz8B,IAAK,WACH,OAAOqsC,KACT,KAqBJ,OAlBA9C,QAAQzN,MA5BI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,gBAAiBw2B,UAEnBl2B,SAAU,CAAC,CACTv7B,KAAM,eACNy7B,KAAM4P,WAIZ,OAAOK,YAAY/Q,wBAAwBqR,SAC7C,EAcAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTylB,QAASD,SACTh2B,KAAM4P,OAEJxQ,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACO1D,OACT,EAYIopB,8BAXyB,SAAgCC,eAC3D,IACIC,WADc,IAAI93B,oBAAoBvD,mBACbiE,0CAA0Cm3B,cAAe,gBAClFxmB,OAAS,CACXsmB,QAASppB,OAAOspB,cAActlD,aAAa,kBAC3CmvB,KAAMo2B,YAER,OAAO,IAAIL,OAAOpmB,OACpB,EAyBI0mB,SAAW,SAAkB1mB,QAC/B,IAAI2mB,QACAC,YACA3B,UACAhlB,MACAC,WACAC,YACAE,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBACtC4U,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,WAARA,IACF4hD,QAAU3mB,OAAOvE,OACA,SAAR12B,KACTk7B,MAAQD,OAAO3P,KACf6P,WAAahB,WAAWe,OACxBE,YAAcjB,WAAWe,QACR,eAARl7B,IACT6hD,YAAc5mB,OAAO6mB,WACJ,aAAR9hD,IACTkgD,UAAYjlB,OAAOylB,SACT9rC,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF,IA6BIo4B,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCuzB,OAAQ,CACN7nC,IAAK,WACH,OAAO+yD,OACT,GAEFE,WAAY,CACVjzD,IAAK,WACH,OAAOgzD,WACT,GAEFnB,SAAU,CACR7xD,IAAK,WACH,OAAOqxD,SACT,GAEF50B,KAAM,CACJz8B,IAAK,WACH,OAAOqsC,KACT,GAEFS,UAAW,CACT9sC,IAAK,WACH,OAAOssC,UACT,GAEFS,WAAY,CACV/sC,IAAK,WACH,OAAOusC,WACT,KAyBJ,OAtBAhD,QAAQzN,MA7DI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,eAAgB82B,QAChB,mBAAoBC,YACpB,iBAAkB3B,WAEpB90B,SAAU,CAAC,CACTv7B,KAAM,aACNu7B,SAAU,CAAC,CACTv7B,KAAM,UAGNu7B,SAAU,CAAC,CACTv7B,KAAM,SACNi7B,KAAM,CACJ,WAAY,SAEdQ,KAAM4P,eAMhB,OAAOK,YAAY/Q,wBAAwBqR,SAC7C,EAkCAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTpF,OAAQkrB,QACRE,WAAYD,YACZnB,SAAUR,UACV50B,KAAM4P,MACNS,UAAWR,WACXS,WAAYR,aAEV1Q,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACO1D,OACT,EAgBI2pB,gCAfyB,SAAgCC,iBAC3D,IACIC,aADc,IAAIr4B,oBAAoBvD,mBACXiE,0CAA0C03B,gBAAiB,UACtF/mB,OAAS,CACXvE,OAAQsrB,gBAAgB7lD,aAAa,gBACrCmvB,KAAM22B,cAMR,OAJID,gBAAgB7lD,aAAa,sBAC/B8+B,OAAO6mB,WAAa3pB,OAAO6pB,gBAAgB7lD,aAAa,sBAE1D8+B,OAAOylB,SAAWsB,gBAAgB7lD,aAAa,wBAAqBxN,EAC7DgzD,SAAS1mB,OAClB,EA2BIinB,WAAa,SAAkBjnB,QACjC,IAAIknB,IACAC,MACAlnB,MACAmnB,eACAC,SAAW,GACXC,UAAY,GACZjnB,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBACtC4U,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,OAARA,IACFmiD,IAAMlnB,OAAO58B,GACI,SAAR2B,IACToiD,MAAQnnB,OAAOppC,KACE,SAARmO,IACTk7B,MAAQD,OAAO3P,KACE,kBAARtrB,IACTqiD,eAAiBpnB,OAAOunB,cACP,YAARxiD,IACTsiD,SAAWrnB,OAAOwnB,QACD,aAARziD,IACTuiD,UAAYtnB,OAAOynB,SACT9tC,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF,IAgCIo4B,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxC9E,GAAI,CACFxP,IAAK,WACH,OAAOszD,GACT,GAEFtwD,KAAM,CACJhD,IAAK,WACH,OAAOuzD,KACT,GAEF92B,KAAM,CACJz8B,IAAK,WACH,OAAOqsC,KACT,GAEFsnB,cAAe,CACb3zD,IAAK,WACH,OAAOwzD,cACT,GAEFI,QAAS,CACP5zD,IAAK,WACH,OAAOyzD,QACT,GAEFI,SAAU,CACR7zD,IAAK,WACH,OAAO0zD,SACT,KAyBJ,OAtBAnqB,QAAQzN,MAhEI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,WAAYq3B,IACZ,aAAcC,OAEhBh3B,SAAU,CAAC,CACTv7B,KAAM,iBACNy7B,KAAM4P,OACL,CACDrrC,KAAM,sBACNy7B,KAAgB,OAAV82B,MAAiBC,eAAiB,MACvC,CACDxyD,KAAM,oBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUk3B,YAEX,CACDzyD,KAAM,iBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUm3B,iBAKlB,OAAOhnB,YAAY/Q,wBAAwBqR,SAC7C,EAkCAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTz9B,GAAI8jD,IACJtwD,KAAMuwD,MACN92B,KAAM4P,MACNsnB,cAAeH,eACfI,QAAS59B,UAAUy9B,SAAU,UAC7BI,cAAwB/zD,IAAd4zD,UAA0B19B,UAAU09B,UAAW,eAAY5zD,GAEnE+7B,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACO1D,OACT,EA0BIuqB,kCAzByB,SAAgCC,iBAC3D,IAAIrnB,YAAc,IAAI3R,oBAAoBvD,mBACtCiF,KAAOiQ,YAAYjR,0CAA0Cs4B,gBAAiB,kBAC9EC,kBAAoBtnB,YAAYjR,0CAA0Cs4B,gBAAiB,uBAC3FE,oBAAsBvnB,YAAYnR,6BAA6Bw4B,gBAAiB,mBAIhFH,QAAU9sD,IAHOG,OAAOgtD,qBAAqB,SAAUzyD,SACzD,OAAOkrC,YAAY5S,aAAat4B,QAAS,gBAC3C,IACkCmxD,+BAI9BkB,SAAW/sD,IAHQG,OAAOgtD,qBAAqB,SAAUzyD,SAC3D,OAAOkrC,YAAY5S,aAAat4B,QAAS,eAC3C,IACqC0xD,iCACjC9mB,OAAS,CACX58B,GAAI85B,OAAOyqB,gBAAgBzmD,aAAa,aACxCtK,KAAM+wD,gBAAgBzmD,aAAa,cACnCmvB,KACAk3B,cAAeK,kBAAoB1qB,OAAO0qB,wBAAqBl0D,EAC/D8zD,QACAC,UAEF,OAAOR,WAAWjnB,OACpB,EA4BI8nB,cAAgB,SAAqB9nB,QACvC,IAAIujB,MACA+D,UACAjmB,WACA0mB,WACAtmB,MACApB,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBACtC4U,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,SAARA,IACFw+C,MAAQvjB,OAAOprC,KACE,aAARmQ,IACTuiD,UAAYtnB,OAAOynB,SACF,cAAR1iD,IACTs8B,WAAarB,OAAOiC,UACH,SAARl9B,IACT08B,MAAQzB,OAAOoD,KACE,cAARr+B,IACTgjD,WAAa/nB,OAAOgoB,UACVruC,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF,IAsBIo4B,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCtT,KAAM,CACJhB,IAAK,WACH,OAAO2vD,KACT,GAEFkE,SAAU,CACR7zD,IAAK,WACH,OAAO0zD,SACT,GAEFrlB,UAAW,CACTruC,IAAK,WACH,OAAOytC,UACT,GAEF+B,KAAM,CACJxvC,IAAK,WACH,OAAO6tC,KACT,GAEFumB,UAAW,CACTp0D,IAAK,WACH,OAAOm0D,UACT,KAwBJ,OArBA5qB,QAAQzN,MAjDI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,wBAAyB0zB,MACzB,iBAAkB+D,UAAY,IAAM,IACpC,aAAc7lB,MACd,kBAAmBJ,YAErBlR,SAAU,CAAC,CACTv7B,KAAM,kBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAU43B,kBAKlB,OAAOznB,YAAY/Q,wBAAwBqR,SAC7C,EA6BAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTjsC,KAAM2uD,MACNkE,SAAUH,UACVrlB,UAAWZ,WACX+B,KAAM3B,MACNumB,UAAWp+B,UAAUm+B,WAAY,WAE/Bt4B,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACO1D,OACT,EAmBI8qB,qCAlByB,SAAgCC,oBAC3D,IAAI5nB,YAAc,IAAI3R,oBAAoBvD,mBAKtC48B,UAAYttD,IAHOG,OADGylC,YAAYnR,6BAA6B+4B,mBAAoB,oBACpC,SAAU9yD,SAC3D,OAAOkrC,YAAY5S,aAAat4B,QAAS,aAC3C,IACsCsyD,mCAClC1nB,OAAS,CACXprC,KAAMszD,mBAAmBhnD,aAAa,yBACtCumD,SAAgE,MAAtDS,mBAAmBhnD,aAAa,kBAC1C+gC,UAAW/E,OAAOgrB,mBAAmBhnD,aAAa,oBAClD8mD,WAGF,OADAhoB,OAAOoD,KAAO8kB,mBAAmBhnD,aAAa,oBAAiBxN,EACxD,IAAIo0D,cAAc9nB,OAC3B,EA4BImoB,UAAY,SAAmBnoB,QACjC,IAAIooB,UACAC,eACAC,eACAC,QACAC,cACAC,UACAC,UACAC,YACAC,eAEAC,YADAC,cAAgB,GAEhBxoB,YAAc,IAAI3R,oBAAoBvD,mBACtC4U,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,aAARA,IACFqjD,UAAYpoB,OAAO+oB,SACF,kBAARhkD,IACTsjD,eAAiBroB,OAAOgpB,cACP,kBAARjkD,IACTujD,eAAiBtoB,OAAOipB,cACP,WAARlkD,IACTwjD,QAAUvoB,OAAOkpB,OACA,iBAARnkD,IACTyjD,cAAgBxoB,OAAOmpB,aACN,aAARpkD,IACT0jD,UAAYzoB,OAAOopB,SACF,aAARrkD,IACT2jD,UAAY1oB,OAAOqpB,SACF,eAARtkD,IACT4jD,YAAc3oB,OAAOspB,WACJ,kBAARvkD,IACT6jD,eAAiB5oB,OAAOupB,cACP,eAARxkD,KAAwBsY,UAAU2iB,OAAOwpB,YAClDX,YAAc7oB,OAAOwpB,WACJ,iBAARzkD,KAA0BsY,UAAU2iB,OAAOypB,gBACpDX,cAAgB9oB,OAAOypB,aAE3B,IAEF,IA4CItsB,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxC6gD,SAAU,CACRn1D,IAAK,WACH,OAAOw0D,SACT,GAEFY,cAAe,CACbp1D,IAAK,WACH,OAAOy0D,cACT,GAEFY,cAAe,CACbr1D,IAAK,WACH,OAAO00D,cACT,GAEFY,OAAQ,CACNt1D,IAAK,WACH,OAAO20D,OACT,GAEFY,aAAc,CACZv1D,IAAK,WACH,OAAO40D,aACT,GAEFY,SAAU,CACRx1D,IAAK,WACH,OAAO60D,SACT,GAEFY,SAAU,CACRz1D,IAAK,WACH,OAAO80D,SACT,GAEFY,WAAY,CACV11D,IAAK,WACH,OAAO+0D,WACT,GAEFY,cAAe,CACb31D,IAAK,WACH,OAAOg1D,cACT,GAEFY,WAAY,CACV51D,IAAK,WACH,OAAOi1D,WACT,GAEFY,aAAc,CACZ71D,IAAK,WACH,OAAOk1D,aACT,KA2BJ,OAxBA3rB,QAAQzN,MArGI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,kBAAmB,OACnB,kBAAmB,OACnB,kBAAmB,QACnB,iBAAkB44B,UAClB,iBAAkBC,UAClB,iBAAkBN,UAClB,sBAAuBC,eACvB,sBAAuBC,eAAiB,IAAM,IAC9C,eAAgBC,QAChB,qBAAsBC,cACtB,mBAAoBG,YAAc,IAAM,IACxC,sBAAuBC,eAAiB,IAAM,KAEhDz4B,SAAU,CAAC,CACTv7B,KAAM,gBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAU24B,iBAEX,CACDl0D,KAAM,mBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUz1B,IAAImuD,aAAa,SAAUa,OACnC,MAAO,CACL90D,KAAM,SACNi7B,KAAM,CACJ,aAAc65B,MAAM90D,KACpB,cAAe80D,MAAM5kD,OAG3B,WAKR,OAAOw7B,YAAY/Q,wBAAwBqR,SAC7C,EA2DAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTkoB,SAAUX,UACVY,cAAeX,eACfY,cAAeX,eACfY,OAAQX,QACRY,aAAcX,cACdY,SAAUX,UACVY,SAAUX,UACVY,WAAYX,YACZY,cAAeX,eACfa,aAAc7/B,UAAUk/B,cAAe,UACvCU,WAAYX,kBAAen1D,GAEzB+7B,KAAOr8B,KAOX,OAHAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACO87B,IACT,EACO1D,OACT,EACIwsB,eAAiB,SAAwBC,kBAC3C,MAAO,CACLh1D,KAAMg1D,iBAAiB1oD,aAAa,cACpC4D,MAAO8kD,iBAAiB1oD,aAAa,eAEzC,EACI2oD,gBAAkB,SAAyBC,sBAAuBC,YACpE,GAAID,sBAGF,OADiBpvD,IADOqvD,WAAW56B,6BAA6B26B,sBAAuB,UAC/CH,eAI5C,EA8BIK,iCA7ByB,SAAgCC,kBAC3D,IAAI3pB,YAAc,IAAI3R,oBAAoBvD,mBACtC8+B,UAAY,IAAI/B,UACpB,GAAI8B,iBAAkB,CACpB,IAIIR,aAAe/uD,IAHOG,OADAylC,YAAYnR,6BAA6B86B,iBAAkB,oBAC/B,SAAU70D,SAC9D,OAAOkrC,YAAY5S,aAAat4B,QAAS,wBAC3C,IAC4C6yD,sCACxC6B,sBAAwBxpB,YAAY1R,iCAAiCq7B,iBAAkB,oBACvFjqB,OAAS,CACX+oB,SAAUkB,iBAAiB/oD,aAAa,kBACxC8nD,cAAeiB,iBAAiB/oD,aAAa,uBAC7C+nD,cAAwE,MAAzDgB,iBAAiB/oD,aAAa,uBAC7CgoD,OAAQe,iBAAiB/oD,aAAa,gBACtCioD,aAAcc,iBAAiB/oD,aAAa,sBAC5CkoD,SAAUa,iBAAiB/oD,aAAa,kBACxCmoD,SAAUY,iBAAiB/oD,aAAa,kBACxCooD,WAAkE,MAAtDW,iBAAiB/oD,aAAa,oBAC1CqoD,cAAwE,MAAzDU,iBAAiB/oD,aAAa,uBAC7CsoD,WAAYK,gBAAgBC,sBAAuBxpB,aACnDmpB,cAEFS,UAAY,IAAI/B,UAAUnoB,OAC5B,CACA,OAAOkqB,SACT,EAwBIC,aAAe,SAAsBnqB,QACvC,IAAIqB,WACAC,UACAiiB,MACA6G,aACA1oB,OACAC,YACAC,aACAH,MACAI,gBACAxB,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBACtC4U,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,cAARA,IACFs8B,WAAarB,OAAOiC,UACH,aAARl9B,IACTu8B,UAAYtB,OAAOoC,SACF,SAARr9B,IACTw+C,MAAQvjB,OAAOprC,KACE,gBAARmQ,IACTqlD,aAAepqB,OAAOqqB,YACL,UAARtlD,IACT28B,OAAS1B,OAAOsD,MACC,eAARv+B,IACT48B,YAAc3B,OAAOwD,WACJ,gBAARz+B,IACT68B,aAAe5B,OAAO0D,YACL,SAAR3+B,IACT08B,MAAQzB,OAAOoD,KACE,mBAARr+B,IACT88B,gBAAkB7B,OAAO4D,eACfjqB,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF,IAoBIo4B,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxC+5B,UAAW,CACTruC,IAAK,WACH,OAAOytC,UACT,GAEFe,SAAU,CACRxuC,IAAK,WACH,OAAO0tC,SACT,GAEF1sC,KAAM,CACJhB,IAAK,WACH,OAAO2vD,KACT,GAEF8G,YAAa,CACXz2D,IAAK,WACH,OAAOw2D,YACT,GAEF9mB,MAAO,CACL1vC,IAAK,WACH,OAAO8tC,MACT,GAEF8B,WAAY,CACV5vC,IAAK,WACH,OAAO+tC,WACT,GAEF+B,YAAa,CACX9vC,IAAK,WACH,OAAOguC,YACT,GAEFwB,KAAM,CACJxvC,IAAK,WACH,OAAO6tC,KACT,GAEFmC,eAAgB,CACdhwC,IAAK,WACH,OAAOiuC,eACT,KA4BJ,OAzBA1E,QAAQzN,MAnEI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,aAAc0zB,MACd,kBAAmBliB,WACnB,iBAAkBC,UAClB,oBAAqB8oB,aACrB,cAAe1oB,OACf,mBAAoBC,YACpB,oBAAqBC,aACrB,kBAAmBC,gBAAkBA,gBAAgBzE,WAAa,KAClE,aAAcqE,UAIpB,OAAOnB,YAAY/Q,wBAAwBqR,SAC7C,EAiDAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACToB,UAAWZ,WACXe,SAAUd,UACV1sC,KAAM2uD,MACN8G,YAAaD,aACb9mB,MAAO5B,OACP8B,WAAY7B,YACZ+B,YAAa9B,aACbwB,KAAM3B,MACNmC,eAAgB/B,gBAAkBA,gBAAgB/Q,cAAWp9B,GAE3D+7B,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACO1D,OACT,EA0BImtB,oCAzByB,SAAgCC,qBAC3D,IAAIvqB,OAAS,CACXiC,UAAW/E,OAAOqtB,oBAAoBrpD,aAAa,oBACnDkhC,SAAUlF,OAAOqtB,oBAAoBrpD,aAAa,mBAClDtM,KAAM21D,oBAAoBrpD,aAAa,cACvCmpD,YAAantB,OAAOqtB,oBAAoBrpD,aAAa,uBAgBvD,OAXA8+B,OAAOsD,MAAQinB,oBAAoBrpD,aAAa,qBAAkBxN,EAC9D62D,oBAAoBrpD,aAAa,sBACnC8+B,OAAOwD,WAAatG,OAAOqtB,oBAAoBrpD,aAAa,sBAE1DqpD,oBAAoBrpD,aAAa,uBACnC8+B,OAAO0D,YAAcxG,OAAOqtB,oBAAoBrpD,aAAa,uBAE/D8+B,OAAOoD,KAAOmnB,oBAAoBrpD,aAAa,oBAAiBxN,EAC5D62D,oBAAoBrpD,aAAa,qBACnC8+B,OAAO4D,eAAiBhH,wBAAwB2tB,oBAAoBrpD,aAAa,qBAE5E,IAAIipD,aAAanqB,OAC1B,EA8BIwqB,YAAc,SAAqBxqB,QACrC,IAAIyqB,SAAW,GACXnqB,YAAc,IAAI3R,oBAAoBvD,mBAC1C,GAAI4U,OAAQ,CACV,IAAIA,OAAOlvC,eAAe,aAAcusB,UAAU2iB,OAAO0qB,SAGvD,MAAM,IAAIjjD,MAAM,mFAFhBgjD,SAAWzqB,OAAO0qB,OAItB,CACA,IAqBIvtB,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCwiD,QAAS,CACP92D,IAAK,WACH,OAAO62D,QACT,KAiBJ,OAdAttB,QAAQzN,MA5BI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,kBAAmB,SACnB,kBAAmB,iBACnB,kBAAmB,SAErBM,SAAU,CAAC,CACTv7B,KAAM,gBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUs6B,gBAKlB,OAAOnqB,YAAY/Q,wBAAwBqR,SAC7C,EASAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACT6pB,QAAS9gC,UAAU6gC,SAAU,WAE3Bh7B,KAAOr8B,KAOX,OAHAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACO87B,IACT,EACO1D,OACT,EAgBIwtB,mCAfyB,SAAgCC,oBAC3D,IAAItqB,YAAc,IAAI3R,oBAAoBvD,mBACtCy/B,YAAc,IAAIL,YACtB,GAAII,mBAAoB,CACtB,IACIF,QAAUhwD,IADO4lC,YAAYnR,6BAA6By7B,mBAAoB,UAChDN,qCAIlCO,YAAc,IAAIL,YAHL,CACXE,SAGJ,CACA,OAAOG,WACT,EAwBIC,iBAAmB,SAA0B9qB,QAC/C,IAAIujB,MACAliB,WACAC,UACAypB,sBACArpB,OACAC,YACAC,aACAC,gBACAJ,MACApB,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBACtC4U,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,SAARA,IACFw+C,MAAQvjB,OAAOprC,KACE,cAARmQ,IACTs8B,WAAarB,OAAOiC,UACH,aAARl9B,IACTu8B,UAAYtB,OAAOoC,SACF,yBAARr9B,IACTgmD,sBAAwB/qB,OAAOgrB,qBACd,UAARjmD,IACT28B,OAAS1B,OAAOsD,MACC,eAARv+B,IACT48B,YAAc3B,OAAOwD,WACJ,gBAARz+B,IACT68B,aAAe5B,OAAO0D,YACL,mBAAR3+B,IACT88B,gBAAkB7B,OAAO4D,eACR,SAAR7+B,IACT08B,MAAQzB,OAAOoD,KACLzpB,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF,IAoBIo4B,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCtT,KAAM,CACJhB,IAAK,WACH,OAAO2vD,KACT,GAEFthB,UAAW,CACTruC,IAAK,WACH,OAAOytC,UACT,GAEFe,SAAU,CACRxuC,IAAK,WACH,OAAO0tC,SACT,GAEF0pB,qBAAsB,CACpBp3D,IAAK,WACH,OAAOm3D,qBACT,GAEFznB,MAAO,CACL1vC,IAAK,WACH,OAAO8tC,MACT,GAEF8B,WAAY,CACV5vC,IAAK,WACH,OAAO+tC,WACT,GAEF+B,YAAa,CACX9vC,IAAK,WACH,OAAOguC,YACT,GAEFgC,eAAgB,CACdhwC,IAAK,WACH,OAAOiuC,eACT,GAEFuB,KAAM,CACJxvC,IAAK,WACH,OAAO6tC,KACT,KA4BJ,OAzBAtE,QAAQzN,MAnEI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,aAAc0zB,MACd,kBAAmBliB,WACnB,iBAAkBC,UAClB,iBAAkBypB,sBAClB,cAAerpB,OACf,mBAAoBC,YACpB,oBAAqBC,aACrB,kBAAmBC,gBAAkBA,gBAAgBzE,WAAa,KAClE,aAAcqE,UAIpB,OAAOnB,YAAY/Q,wBAAwBqR,SAC7C,EAiDAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTjsC,KAAM2uD,MACNthB,UAAWZ,WACXe,SAAUd,UACV0pB,qBAAsBD,sBACtBznB,MAAO5B,OACP8B,WAAY7B,YACZ+B,YAAa9B,aACbgC,eAAgB/B,gBAAkBA,gBAAgB/Q,SAAW+Q,gBAC7DuB,KAAM3B,OAEJhS,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACO1D,OACT,EA4BI8tB,wCA3ByB,SAAgCC,yBAC3D,IAAIlrB,OAAS,CACXprC,KAAMs2D,wBAAwBhqD,aAAa,cAC3C+gC,UAAW/E,OAAOguB,wBAAwBhqD,aAAa,oBACvDkhC,SAAUlF,OAAOguB,wBAAwBhqD,aAAa,oBAmBxD,OAdIgqD,wBAAwBhqD,aAAa,oBACvC8+B,OAAOgrB,qBAAuB9tB,OAAOguB,wBAAwBhqD,aAAa,oBAE5E8+B,OAAOsD,MAAQ4nB,wBAAwBhqD,aAAa,qBAAkBxN,EAClEw3D,wBAAwBhqD,aAAa,sBACvC8+B,OAAOwD,WAAatG,OAAOguB,wBAAwBhqD,aAAa,sBAE9DgqD,wBAAwBhqD,aAAa,uBACvC8+B,OAAO0D,YAAcxG,OAAOguB,wBAAwBhqD,aAAa,uBAE/DgqD,wBAAwBhqD,aAAa,qBACvC8+B,OAAO4D,eAAiBhH,wBAAwBsuB,wBAAwBhqD,aAAa,qBAEvF8+B,OAAOoD,KAAO8nB,wBAAwBhqD,aAAa,oBAAiBxN,EAC7D,IAAIo3D,iBAAiB9qB,OAC9B,EAgCImrB,gBAAkB,SAAyBnrB,QAC7C,IAAIyqB,SAAW,GACXnqB,YAAc,IAAI3R,oBAAoBvD,mBAC1C,GAAI4U,OAAQ,CACV,IAAIA,OAAOlvC,eAAe,aAAcusB,UAAU2iB,OAAO0qB,SAGvD,MAAM,IAAIjjD,MAAM,uFAFhBgjD,SAAWzqB,OAAO0qB,OAItB,CACA,IAqBIvtB,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCwiD,QAAS,CACP92D,IAAK,WACH,OAAO62D,QACT,KAiBJ,OAdAttB,QAAQzN,MA5BI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,kBAAmB,aACnB,kBAAmB,cACnB,kBAAmB,SAErBM,SAAU,CAAC,CACTv7B,KAAM,gBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUs6B,gBAKlB,OAAOnqB,YAAY/Q,wBAAwBqR,SAC7C,EASAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACT6pB,QAAS9gC,UAAU6gC,SAAU,WAE3Bh7B,KAAOr8B,KAOX,OAHAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACO87B,IACT,EACO1D,OACT,EAgBIiuB,uCAfyB,SAAgCC,wBAC3D,IAAI/qB,YAAc,IAAI3R,oBAAoBvD,mBACtCkgC,gBAAkB,IAAIH,gBAC1B,GAAIE,uBAAwB,CAC1B,IACIX,QAAUhwD,IADO4lC,YAAYnR,6BAA6Bk8B,uBAAwB,mBACpDJ,yCAIlCK,gBAAkB,IAAIH,gBAHT,CACXT,SAGJ,CACA,OAAOY,eACT,EAyBIC,cAAgB,WAClB,OAAOjrB,cAAgBA,YAAc,IAAI3R,oBAAoBvD,mBAC/D,EACIogC,WAAa,SAAoBxrB,QACnC,IAAIujB,MACAsF,YACA4C,qBACAprB,2BAA6B,CAAC,EAC9BL,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,SAARA,IACFw+C,MAAQvjB,OAAOprC,KACE,eAARmQ,IACT8jD,YAAc7oB,OAAOwpB,WACJ,wBAARzkD,IACT0mD,qBAAuBzrB,OAAO0rB,oBACpB/xC,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF,IA2DIo4B,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCtT,KAAM,CACJhB,IAAK,WACH,OAAO2vD,KACT,GAEFiG,WAAY,CACV51D,IAAK,WACH,OAAOi1D,WACT,GAEF6C,oBAAqB,CACnB93D,IAAK,WACH,OAAO63D,oBACT,KAsBJ,OAnBAtuB,QAAQzN,MA5EI,WACV,IAAIi8B,kBAAoBjxD,IAAI+wD,sBAAsB,SAAUG,MAC1D,MAAO,CACLh3D,KAAM,SACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,YAAa+7B,KAAKxG,OAEpBj1B,SAAU,CAAC,CACTv7B,KAAM,sBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUz1B,IAAIkxD,KAAKC,gBAAgB,SAAUC,eAC3C,MAAO,CACLl3D,KAAM,SACNi7B,KAAM,CACJ,WAAYi8B,cAAcC,MAE5B17B,KAAMy7B,cAAcz7B,KAExB,UAKV,IACIuQ,SAAW,CACbhsC,KAAM,mBACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNi7B,KAAM,CACJ,aAAc0zB,OAEhBpzB,SAAU,CAAC,CACTv7B,KAAM,mBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUz1B,IAAImuD,aAAa,SAAUa,OACnC,MAAO,CACL90D,KAAM,SACNi7B,KAAM,CACJ,aAAc65B,MAAM90D,KACpB,cAAe80D,MAAM5kD,OAG3B,OAED,CACDlQ,KAAM,uBACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUw7B,yBAKlB,OAAOJ,gBAAgBh8B,wBAAwBqR,SACjD,EAmBAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTjsC,KAAM2uD,MACNiG,WAAYX,YACZ6C,oBAAqBD,sBAEnBh8B,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACO1D,OACT,EACI6uB,iBAAmB,SAA0BpC,kBAC/C,MAAO,CACLh1D,KAAMg1D,iBAAiB1oD,aAAa,cACpC4D,MAAO8kD,iBAAiB1oD,aAAa,eAEzC,EACI+qD,kBAAoB,SAA2BC,mBACjD,GAAIA,kBAGF,OADiBxxD,IADO6wD,gBAAgBp8B,6BAA6B+8B,kBAAmB,UAChDF,iBAI5C,EACIG,uBAAyB,SAAgCnrB,aAC3D,GAAIA,YACF,MAAO,CACL+qB,KAAM/qB,YAAY9/B,aAAa,YAC/BmvB,KAAMk7B,gBAAgBv+B,eAAegU,aAI3C,EACIorB,oBAAsB,SAA6BC,2BACrD,IAAIC,aAAef,gBAAgBp8B,6BAA6Bk9B,0BAA2B,UAC3F,MAAO,CACLjH,MAAOiH,0BAA0BnrD,aAAa,aAC9C2qD,eAAgBnxD,IAAI4xD,aAAcH,wBAEtC,EACII,yBAA2B,SAAkCC,uBAC/D,GAAIA,sBAGF,OAD0B9xD,IADG6wD,gBAAgBp8B,6BAA6Bq9B,sBAAuB,mBAC3CJ,oBAI1D,EAiBIK,kCAhByB,SAAgCC,mBAC3D,GAAIA,kBAAmB,CACrB,IAAIC,mBAAqBpB,gBAAgB38B,iCAAiC89B,kBAAmB,mBACzFR,kBAAoBX,gBAAgB38B,iCAAiC+9B,mBAAoB,oBACzFH,sBAAwBjB,gBAAgB38B,iCAAiC+9B,mBAAoB,wBAC7F3sB,OAAS,CACXprC,KAAM+3D,mBAAmBzrD,aAAa,cACtCsoD,WAAYyC,kBAAkBC,mBAC9BR,oBAAqBa,yBAAyBC,wBAEhD,OAAO,IAAIhB,WAAWxrB,OACxB,CAEF,EA0BI4sB,YAAc,SAAqB5sB,QACrC,IAAI2jB,OACAtjB,2BAA6B,CAAC,EAC9BC,YAAc,IAAI3R,oBAAoBvD,mBACtC4U,QACF9sC,QAAQ4tB,OAAOkf,SAAS,SAAUj7B,KACpB,UAARA,IACF4+C,OAAS3jB,OAAO4jB,MACNjqC,WAAW0mB,2BAA2Bt7B,QAChDs7B,2BAA2Bt7B,KAAOi7B,OAAOj7B,KAE7C,IAEF,IAwBIo4B,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxC07C,MAAO,CACLhwD,IAAK,WACH,OAAO+vD,MACT,KAoBJ,OAjBAxmB,QAAQzN,MA/BI,WACV,IAAIkR,SAAW,CACbhsC,KAAM,oBACNu7B,SAAU,CAAC,CACTv7B,KAAM,kBACNu7B,SAAU,CAAC,CACTv7B,KAAM,cACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUz1B,IAAIipD,QAAQ,SAAUiI,MAC9B,MAAO,CACLh3D,KAAM,SACNi7B,KAAM,CACJ,aAAc+7B,KAAKh3D,KACnB,cAAeg3D,KAAK9mD,OAG1B,WAKR,OAAOw7B,YAAY/Q,wBAAwBqR,SAC7C,EASAzD,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACT+iB,MAAOD,QAELl0B,KAAOr8B,KAUX,OANAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACA7R,QAAQ4tB,OAAOuf,6BAA6B,SAAUt7B,KACpD87B,KAAK97B,KAAOs7B,2BAA2Bt7B,IACzC,IACO87B,IACT,EACO1D,OACT,EACI0vB,sBAAwB,SAA+BC,yBACzD,GAAIA,wBAOF,OANYpyD,IAAIoyD,yBAAyB,SAAUC,aACjD,MAAO,CACLn4D,KAAMm4D,YAAY7rD,aAAa,cAC/B4D,MAAOioD,YAAY7rD,aAAa,eAEpC,GAIJ,EAcI8rD,mCAbyB,SAAgCC,oBAC3D,IAAI3sB,YAAc,IAAI3R,oBAAoBvD,mBAC1C,GAAI6hC,mBAAoB,CACtB,IAAIH,wBAA0BxsB,YAAYnR,6BAA6B89B,mBAAoB,UACvFjtB,OAAS,CACX4jB,MAAOiJ,sBAAsBC,0BAE/B,OAAO,IAAIF,YAAY5sB,OACzB,CAEF,EAkCA,SAASktB,UAAU75D,MAAOu1B,MAAOC,KAC/B,IAAI72B,OAASqB,MAAMrB,OAEnB,OADA62B,SAAcn1B,IAARm1B,IAAoB72B,OAAS62B,KAC3BD,OAASC,KAAO72B,OAASqB,MAAQs1B,UAAUt1B,MAAOu1B,MAAOC,IACnE,CASA,SAASskC,UAAUroD,OACjB,OAAOA,OAAUA,KACnB,CAgCA,SAASsoD,YAAY/5D,MAAOyR,MAAOwiB,WACjC,OAAOxiB,OAAUA,MArBnB,SAAuBzR,MAAOyR,MAAOwiB,WAGnC,IAFA,IAAIzP,MAAQyP,UAAY,EACtBt1B,OAASqB,MAAMrB,SACR6lB,MAAQ7lB,QACf,GAAIqB,MAAMwkB,SAAW/S,MACnB,OAAO+S,MAGX,OAAQ,CACV,CAY2Bw1C,CAAch6D,MAAOyR,MAAOwiB,WAAaD,cAAch0B,MAAO85D,UAAW7lC,UACpG,CAWA,SAASgmC,gBAAgBC,WAAYC,YAGnC,IAFA,IAAI31C,OAAS,EACX7lB,OAASu7D,WAAWv7D,SACb6lB,MAAQ7lB,QAAUo7D,YAAYI,WAAYD,WAAW11C,OAAQ,IAAM,IAC5E,OAAOA,KACT,CAcA,IAWI41C,aAAe/yC,OAAO,uFAS1B,SAASgzC,WAAWvoC,QAClB,OAAOsoC,aAAa5yC,KAAKsK,OAC3B,CAGA,IAQIwoC,SAAW,oBACbC,QAAU,kDACVC,OAAS,2BAETC,YAAc,qBACdC,WAAa,kCACbC,WAAa,qCAIXC,SAPW,MAAQL,QAAU,IAAMC,OAAS,IAOpB,IAG1BK,MAFW,oBAEQD,UADP,gBAA0B,CAACH,YAAaC,WAAYC,YAAYn9B,KAAK,KAArE,qBAA6Fo9B,SAAW,MAEpHE,SAAW,MAAQ,CAACL,YAAcF,QAAU,IAAKA,QAASG,WAAYC,WAAYL,UAAU98B,KAAK,KAAO,IAGtGu9B,UAAY1zC,OAAOmzC,OAAS,MAAQA,OAAS,KAAOM,SAAWD,MAAO,KAoB1E,SAASG,cAAclpC,QACrB,OAAOuoC,WAAWvoC,QAZpB,SAAwBA,QACtB,OAAOA,OAAOE,MAAM+oC,YAAc,EACpC,CAU8BE,CAAenpC,QA5E7C,SAAsBA,QACpB,OAAOA,OAAOoJ,MAAM,GACtB,CA0EuDggC,CAAappC,OACpE,CAGA,IAAIqpC,YAAc,OA4ElB,SAAS5yC,OAAOb,QACd,OAAiB,MAAVA,OAAiB,GAjC1B,SAAoBA,OAAQ+L,OAC1B,OAAOnP,SAASmP,OAAO,SAAU/hB,KAC/B,OAAOgW,OAAOhW,IAChB,GACF,CA6B+B0pD,CAAW1zC,OAAQ+F,OAAO/F,QACzD,CAGA,IAAI2zC,YAAc7uD,KAAKsoB,IAyCvB,IAAIwmC,SAAW,GACf,SAASC,eAAeC,WACtB,OAvGF,SAAmB1pC,OAAQ2pC,MAAOC,OAEhC,IADA5pC,OAASpM,SAASoM,WACH4pC,YAAmBr7D,IAAVo7D,OACtB,OAAO3pC,OAAOxK,QAAQ6zC,YAAa,IAErC,IAAKrpC,UAAY2pC,MAAQnpC,aAAampC,QACpC,OAAO3pC,OAET,IAAIooC,WAAac,cAAclpC,QAE/B,OAAO+nC,UAAUK,WADPD,gBAAgBC,WAAYc,cAAcS,SAChBj+B,KAAK,GAC3C,CA4FSm+B,CAAUH,UAAW,IAC9B,CACA,IAaII,wBAbiB,SAAwBr6D,KAAMs6D,oBAAqBC,eACtER,SAASz5D,KAAK,CACZN,KACAw6D,WAAY10D,IAAIw0D,oBAAqBN,gBACrCr9D,OAAQ49D,eAEZ,EAOIF,kCANgB,SAAuBJ,WACzC,IAAIQ,OAAS/mC,KAAKqmC,UAAU,SAAUW,WACpC,OAtBJ,SAAkBroC,WAAYniB,MAAOwiB,UAAWynC,OAC9C9nC,WAAapG,YAAYoG,YAAcA,WAAarL,OAAOqL,YAC3DK,UAAYA,YAAcynC,MAAQ/mC,UAAUV,WAAa,EACzD,IAAIt1B,OAASi1B,WAAWj1B,OAIxB,OAHIs1B,UAAY,IACdA,UAAYonC,YAAY18D,OAASs1B,UAAW,IAEvCgE,SAASrE,YAAcK,WAAat1B,QAAUi1B,WAAWnhB,QAAQhB,MAAOwiB,YAAc,IAAMt1B,QAAUo7D,YAAYnmC,WAAYniB,MAAOwiB,YAAc,CAC5J,CAcWioC,CAASD,UAAUF,WAAYR,eAAeC,WACvD,IACA,OAAOQ,OAASA,OAAO99D,SAAW,IACpC,EA+BIi+D,+BAfiB,SAAwBC,kBAAmBC,SAAUC,aAAc31B,0BACtF,IACE,IAAI60B,UAAYa,SAASljC,cAAc+B,MAAM,KAAKhW,MAC9C82C,OAASJ,kCAAkCJ,WAC/C,GAAIQ,OAAQ,CACV,IAAItM,mBAAqBsM,OAAOO,YAAYD,aAAc31B,0BAE1D,OADAy1B,kBAAkB1N,gBAAgBgB,qBAC3B,CACT,CACA,OAAO,CACT,CAAE,MAAOvxD,GAEP,OADA2qC,QAAQ30B,MAAMhW,IACP,CACT,CACF,EAIIq+D,MAAQ,SAAaC,QACvB,IAAIC,SACAC,OACAC,MACAC,SACAC,gBACAC,aACAC,QACAC,OACAC,UACAC,WACAC,YACAC,SACAC,UACAC,cACAC,YACAvvB,UACAwvB,gBAOAC,YACAC,aAuaEjlC,IA9aFklC,mBAAqB5N,+BACrB6N,cAAgB,KAChBC,sBAAwB,KACxBC,WAAa,KACbC,aAAe,KACfC,iBAAmB,KAGnBC,WAAa,GACbC,wBAAyB,EACzBC,cAAe,EACfC,mBAAoB,EACpBC,mBAAoB,EACpBC,eAAgB,EAChBC,wBAAyB,EACzBC,qBAAsB,EACtBC,qBAAsB,EACtBzxB,YAAc,IAAI3R,oBAAoBvD,mBACtCsE,MAAQ,WACV,IACIsiC,gBAAkBn3D,OAAO,CADHo2D,mBAAmBtO,iBAAmBsO,mBAAqB,KAClCC,cAAeE,WAAYE,iBAAkBD,aAAcF,wBAAwB,SAAUc,OAC9I,OAAiB,OAAVA,KACT,IACIrxB,SAAW,CACbhsC,KAAM,kBACNi7B,KAAM,CACJ,cAAekgC,SACf,WAAYC,OACZ,uBAAwBG,gBACxB,YAAaE,QACb,UAAWJ,MACX,YAAaK,OACb,aAAcJ,SACd,iBAAkBE,aAClB,iBAAkBG,UAClB,kBAAmBC,WACnB,mBAAoBC,YACpB,gBAAiBC,SACjB,iBAAkBC,UAClB,qBAAsBC,cACtB,mBAAoBC,aAEtB1gC,SAAU,CAAC,CACTv7B,KAAM,eACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAU6hC,mBAEX,CACDp9D,KAAM,mBACNu7B,SAAU,CAAC4gC,cACV,CACDn8D,KAAM,oBACNu7B,SAAU,CAAC6gC,eACV,CACDp8D,KAAM,eACNu7B,SAAU,CAAC,CACTv7B,KAAM,UACNu7B,SAAUz1B,IAAI62D,YAAY,SAAUx6C,UAClC,MAAO,CACLniB,KAAM,SACNi7B,KAAM,CACJ,WAAY9Y,SAASm7C,UAEvB7hC,KAAMtZ,SAASo7C,UAEnB,OAED,CACDv9D,KAAM,uBACNi7B,KAAM,CACJ,aAAcihC,gBAAgBsB,KAC9B,UAAWtB,gBAAgBv+D,MAC3B,UAAWu+D,gBAAgBt+D,WAajC,OATI8uC,WACFV,SAASzQ,SAASj7B,KAAK,CACrBN,KAAM,iBACNi7B,KAAM,CACJ,cAAeyR,UAAU+wB,MACzB,cAAe/wB,UAAUx8B,SAIxBw7B,YAAY/Q,wBAAwBqR,SAC7C,EAeIzD,QAAUvsC,OAAOsX,iBAAiB,CAAC,EAAG,CACxCoqD,QAAS,CACP1+D,IAAK,WACH,OAAOm8D,QACT,GAEFwC,MAAO,CACL3+D,IAAK,WACH,OAAOo8D,MACT,GAEFwC,KAAM,CACJ5+D,IAAK,WACH,OAAOq8D,KACT,GAEFwC,QAAS,CACP7+D,IAAK,WACH,OAAOs8D,QACT,GAEFwC,eAAgB,CACd9+D,IAAK,WACH,OAAOu8D,eACT,GAEFwC,YAAa,CACX/+D,IAAK,WACH,OAAOw8D,YACT,GAEFv7D,OAAQ,CACNjB,IAAK,WACH,OAAOy8D,OACT,GAEFuC,MAAO,CACLh/D,IAAK,WACH,OAAO08D,MACT,GAEFuC,SAAU,CACRj/D,IAAK,WACH,OAAO28D,SACT,GAEFuC,UAAW,CACTl/D,IAAK,WACH,OAAO48D,UACT,GAEFuC,WAAY,CACVn/D,IAAK,WACH,OAAO68D,WACT,GAEFuC,QAAS,CACPp/D,IAAK,WACH,OAAO88D,QACT,GAEFuC,SAAU,CACRr/D,IAAK,WACH,OAAO+8D,SACT,GAEFuC,aAAc,CACZt/D,IAAK,WACH,OAAOg9D,aACT,GAEFuC,WAAY,CACVv/D,IAAK,WACH,OAAOi9D,WACT,GAEFzuB,SAAU,CACRxuC,IAAK,WACH,OAAO0tC,SACT,GAEF8xB,eAAgB,CACdx/D,IAAK,WACH,OAAOk9D,eACT,GAEFuC,qBAAsB,CACpBz/D,IAAK,WACH,OAAI69D,mBAAyD/9D,IAAzCy9D,sBAAsBvN,MAAM,GAAGtgB,MAC1C6tB,sBAAsBvN,MAAM,GAAGtgB,MAC7ByuB,0BAAyDr+D,IAAlC29D,aAAa3G,QAAQ,GAAGpnB,MACjD+tB,aAAa3G,QAAQ,GAAGpnB,MACtBwuB,0BAA6Dp+D,IAAtC49D,iBAAiB5G,QAAQ,GAAGpnB,MACrDguB,iBAAiB5G,QAAQ,GAAGpnB,MAC1B2tB,mBAAmBrO,8BACrBqO,mBAAmB7N,qCAErB,EACT,GAEFkQ,sBAAuB,CACrB1/D,IAAK,WACH,OAAO49D,sBACT,GAEF+B,YAAa,CACX3/D,IAAK,WACH,OAAO69D,YACT,GAEF9O,iBAAkB,CAChB/uD,IAAK,WACH,OAAO89D,iBACT,GAEF8B,iBAAkB,CAChB5/D,IAAK,WACH,OAAO+9D,iBACT,GAEF8B,aAAc,CACZ7/D,IAAK,WACH,OAAOg+D,aACT,GAEF8B,sBAAuB,CACrB9/D,IAAK,WACH,OAAOi+D,sBACT,GAEF8B,mBAAoB,CAClB//D,IAAK,WACH,OAAOk+D,mBACT,GAEF8B,mBAAoB,CAClBhgE,IAAK,WACH,OAAOm+D,mBACT,GAEFtC,kBAAmB,CACjB77D,IAAK,WACH,OAAOq9D,kBACT,GAEF1P,aAAc,CACZ3tD,IAAK,WACH,OAAOq9D,mBAAmBxO,kBAC5B,GAEF0D,aAAc,CACZvyD,IAAK,WACH,OAAOs9D,aACT,EACA39D,IAAK,SAAauR,OAChBosD,cAAgBpsD,KAClB,GAEFk/C,qBAAsB,CACpBpwD,IAAK,WACH,OAAOu9D,qBACT,EACA59D,IAAK,SAAauR,OAChBqsD,sBAAwBrsD,KAC1B,GAEFolD,UAAW,CACTt2D,IAAK,WACH,OAAOw9D,UACT,EACA79D,IAAK,SAAauR,OAChBssD,WAAatsD,KACf,GAEF+lD,YAAa,CACXj3D,IAAK,WACH,OAAOy9D,YACT,GAEF/F,gBAAiB,CACf13D,IAAK,WACH,OAAO09D,gBACT,GAEFuC,WAAY,CACVjgE,IAAK,WACH,OAAOm9D,WACT,GAEF+C,YAAa,CACXlgE,IAAK,WACH,OAAOo9D,YACT,KAGA+C,kBAAoB,SAA2BC,qBACjD,MAAO,CACL9B,SAAU8B,oBAAoB9yD,aAAa,YAC3CixD,UAAW7xB,YAAYtT,eAAegnC,qBAE1C,EASIC,uBAAyB,SAAgCloC,KAC3D,IAAImoC,uBAAyB5zB,YAAY1R,iCAAiC7C,IAAK,mBAC/EgkC,SAAWmE,uBAAuBhzD,aAAa,eAC/C8uD,OAASkE,uBAAuBhzD,aAAa,YAC7C2vD,YAAcqD,uBAAuBhzD,aAAa,oBAClD,IAAIizD,sBAAwB7zB,YAAY1R,iCAAiC7C,IAAK,wBAC9E+kC,gBAAkB,CAChBsB,KAAM+B,sBAAwBA,sBAAsBjzD,aAAa,cAAgB,QACjF3O,MAAO4hE,sBAAwBj3B,OAAOi3B,sBAAsBjzD,aAAa,YAAc,EACvF1O,OAAQ2hE,sBAAwBj3B,OAAOi3B,sBAAsBjzD,aAAa,YAAc,GAE1F,IAAIkzD,gBAAkB9zB,YAAY1R,iCAAiC7C,IAAK,gBACxEwlC,WApBmB,SAAwB6C,iBAC3C,OAAIA,gBAEkB15D,IADO4lC,YAAYnR,6BAA6BilC,gBAAiB,UACvCL,mBAGzC,IACT,CAaeM,CAAeD,iBAI5BjE,gBAAkB+D,uBAAuBhzD,aAAa,8BAA2BxN,EACjF28D,QAAU6D,uBAAuBhzD,aAAa,mBAAgBxN,EAC9Du8D,MAAQiE,uBAAuBhzD,aAAa,iBAAcxN,EAC1D48D,OAAS4D,uBAAuBhzD,aAAa,mBAAgBxN,EAC7Dw8D,SAAWgE,uBAAuBhzD,aAAa,oBAAiBxN,EAChE08D,aAAe8D,uBAAuBhzD,aAAa,wBAAqBxN,EACxE68D,UAAY2D,uBAAuBhzD,aAAa,wBAAqBxN,EACrE88D,WAAa0D,uBAAuBhzD,aAAa,yBAAsBxN,EACvE+8D,YAAcyD,uBAAuBhzD,aAAa,0BAAuBxN,EACzEg9D,SAAWwD,uBAAuBhzD,aAAa,uBAAoBxN,EACnEi9D,UAAYuD,uBAAuBhzD,aAAa,wBAAqBxN,EACrEk9D,cAAgBsD,uBAAuBhzD,aAAa,4BAAyBxN,EAC7E,IAAI4gE,gBAAkBh0B,YAAY1R,iCAAiC7C,IAAK,wBAAqBr4B,EACzF4gE,kBACFhzB,UAAY,CACV+wB,MAAOiC,gBAAgBpzD,aAAa,eACpC4D,MAAOo4B,OAAOo3B,gBAAgBpzD,aAAa,iBAGjD,EACIqzD,uBAAyB,SAAgCC,SAAUC,WACrE,OAAOnsC,KAAKksC,UAAU,SAAUp/D,SAC9B,OAAOkrC,YAAY1S,sBAAsBx4B,QAAS,kBAAmBq/D,UACvE,GACF,EA0CIC,YAAc,SAAqB3oC,KACrC,IAAI4oC,cAAgBr0B,YAAY1R,iCAAiC7C,IAAK,gBAClE6oC,0BAA4Bt0B,YAAYnR,6BAA6BwlC,cAAe,oBA3ClE,SAA2BC,2BACjD,IAAItT,oBAAsBiT,uBAAuBK,0BAA2B,WACxEtT,qBACF2P,mBAAmBnO,8BAA8BxB,oBAErD,CAuCEuT,CAAkBD,2BAClB1D,cAvCsB,SAA2B0D,2BACjD,IAAI1O,oBAAsBqO,uBAAuBK,0BAA2B,WAC5E,OAAI1O,oBACKD,oCAAoCC,qBAEtC,IACT,CAiCkB4O,CAAkBF,2BAClCzD,sBAjC8B,SAAmCyD,2BACjE,IAAI7Q,4BAA8BwQ,uBAAuBK,0BAA2B,mBACpF,OAAI7Q,4BACKD,4CAA4CC,6BAE9C,IACT,CA2B0BgR,CAA0BH,2BAClDxD,WA3BmB,SAAwBwD,2BAC3C,IAAI3K,iBAAmBsK,uBAAuBK,0BAA2B,QACzE,OAAI3K,iBACKD,iCAAiCC,kBAEnC,IACT,CAqBe+K,CAAeJ,2BAC5BvD,aArBqB,SAA0BuD,2BAC/C,IAAIhK,mBAAqB2J,uBAAuBK,0BAA2B,UAC3E,OAAIhK,mBACKD,mCAAmCC,oBAErC,IACT,CAeiBqK,CAAiBL,2BAChCtD,iBAfyB,SAA8BsD,2BACvD,IAAIvJ,uBAAyBkJ,uBAAuBK,0BAA2B,cAC/E,OAAIvJ,uBACKD,uCAAuCC,wBAEzC,IACT,CASqB6J,CAAqBN,2BACxC,IAAIlI,kBAAoBpsB,YAAY1R,iCAAiC7C,IAAK,oBAC1EglC,YAActE,kCAAkCC,mBAChD,IAAIO,mBAAqB3sB,YAAY1R,iCAAiC7C,IAAK,qBAC3EilC,aAAehE,mCAAmCC,oBAClDkI,uBACF,EACIA,sBAAwB,WAC1B1D,aAAyC,OAA1BN,uBAAkCA,sBAAsBvN,MAAM5xD,OAAS,EACtF0/D,kBAAoBT,mBAAmBtO,iBACvCgP,kBAAsC,OAAlBT,eAA0BA,cAAclL,SAASh0D,OAAS,EAC9E4/D,cAA+B,OAAfR,WAChBS,uBAAwC,OAAfT,YAAuBA,WAAW3H,aAAaz3D,OAAS,EACjF8/D,oBAA2C,OAArBR,kBAA6BA,iBAAiB5G,QAAQ14D,OAAS,EACrF+/D,oBAAuC,OAAjBV,cAAyBA,aAAa3G,QAAQ14D,OAAS,EAC7Ew/D,uBAAyBC,mBAAyD/9D,IAAzCy9D,sBAAsBvN,MAAM,GAAGtgB,OAAuByuB,0BAAyDr+D,IAAlC29D,aAAa3G,QAAQ,GAAGpnB,OAAuBwuB,0BAA6Dp+D,IAAtC49D,iBAAiB5G,QAAQ,GAAGpnB,OAAuB2tB,mBAAmBrO,6BACpQ,EA4DA,OA3CIkN,SAJE/jC,IAAMuU,YAAYlW,SAAS0lC,QAC/BmE,uBAAuBloC,KACvB2oC,YAAY3oC,MAKdoR,QAAQzN,MAAQA,MAChByN,QAAQpkB,SA9VO,WACb,IAAIgT,IAAMuU,YAAYzS,iBAClBunC,UAAY90B,YAAYpS,gBAAgBnC,IAAKX,kBAAkB,KAAM,IAAK,WAC9El4B,QAAQm3B,qBAAqB,SAAUmE,MAAOC,UAC3B,QAAbA,UACF2mC,UAAUnlC,eAAe,gCAAiC,CAAC,QAASxB,UAAUoC,KAAK,KAAMrC,MAE7F,IACA,IAAI6mC,WAAa/0B,YAAYpS,gBAAgBnC,IAAKX,kBAAkB,OAAQ,MAAO,OAInF,OAHAiqC,WAAWr2D,YAAY0wB,SACvB0lC,UAAUp2D,YAAYq2D,YACtBtpC,IAAI/sB,YAAYo2D,WACT90B,YAAY7S,eAAe1B,IACpC,EAkVAoR,QAAQm4B,uBArBqB,SAAgC5F,SAAUC,aAAc31B,0BACxDw1B,+BAA+ByB,mBAAoBvB,SAAUC,aAAc31B,2BAEpGm7B,uBAEJ,EAiBAh4B,QAAQrM,OAAS,WACf,IAAI+P,KAAO,CACTyxB,QAASvC,SACTwC,MAAOvC,OACPmD,WAAYtC,YACZ0E,UAAWhE,WACX6B,eAAgBtC,gBAChBj8D,OAAQw7D,QACRqC,eAAgBvC,gBAChBqC,KAAMvC,MACN2C,MAAOtC,OACPmC,QAASvC,SACTyC,YAAavC,aACbyC,SAAUtC,UACVuC,UAAWtC,WACXuC,WAAYtC,YACZuC,QAAStC,SACTuC,SAAUtC,UACVuC,aAActC,cACdxuB,SAAUd,UACVigB,aAAc0P,mBAAmBngC,SACjCq1B,aAAc+K,cAAgBA,cAAcpgC,cAAWp9B,EACvDw2D,UAAWkH,WAAaA,WAAWtgC,cAAWp9B,EAC9Cm3D,YAAawG,aAAeA,aAAavgC,cAAWp9B,EACpD43D,gBAAiBgG,iBAAmBA,iBAAiBxgC,cAAWp9B,EAChEmgE,WAAY9C,YAAcA,YAAYjgC,cAAWp9B,EACjDogE,YAAa9C,aAAeA,aAAalgC,cAAWp9B,GAElD+7B,KAAOr8B,KAOX,OAHAF,QAH2Bs1B,SAAS1H,OAAO2O,OAAO,SAAU1qB,KAC1D,OAAO4U,WAAW8V,KAAK1qB,KACzB,KAC8B,SAAUA,KACtC87B,KAAK97B,KAAO0qB,KAAK1qB,IACnB,IACO87B,IACT,EACO1D,OACT,EAGInS,WAQM,SAAgB8kC,QACtB,OAAOD,MAAMC,OACf,EAOE0F,iBAHgB5kE,OAAOC,UAGUC,eAUrC,SAAS2kE,QAAQ16C,OAAQhW,KACvB,OAAiB,MAAVgW,QAAkBy6C,iBAAiBzkE,KAAKgqB,OAAQhW,IACzD,CAkCA,IAGI2wD,WAHej7D,MAAM5J,UAGKggC,KAqC9B,IAAI8kC,SAAW,aAwBf,SAASC,KAAKzwC,OAAQ2pC,MAAOC,OAE3B,IADA5pC,OAASpM,SAASoM,WACH4pC,YAAmBr7D,IAAVo7D,OACtB,OAAO3pC,OAAOxK,QAAQg7C,SAAU,IAElC,IAAKxwC,UAAY2pC,MAAQnpC,aAAampC,QACpC,OAAO3pC,OAET,IAAIooC,WAAac,cAAclpC,QAC7BqoC,WAAaa,cAAcS,OAC3BlmC,MAAQ0kC,gBAAgBC,WAAYC,YACpC3kC,IA1CJ,SAAuB0kC,WAAYC,YAEjC,IADA,IAAI31C,MAAQ01C,WAAWv7D,OAChB6lB,SAAWu1C,YAAYI,WAAYD,WAAW11C,OAAQ,IAAM,IACnE,OAAOA,KACT,CAsCUg+C,CAActI,WAAYC,YAAc,EAChD,OAAON,UAAUK,WAAY3kC,MAAOC,KAAKgI,KAAK,GAChD,CA0DA,IA3ByBilC,WA2BrBC,YA3BqBD,WA2BQ,cA1BxB,SAAU3wC,QAEf,IAAIooC,WAAaG,WADjBvoC,OAASpM,SAASoM,SACoBkpC,cAAclpC,aAAUzxB,EAC1DsiE,IAAMzI,WAAaA,WAAW,GAAKpoC,OAAO8Z,OAAO,GACjDg3B,SAAW1I,WAAaL,UAAUK,WAAY,GAAG18B,KAAK,IAAM1L,OAAOvqB,MAAM,GAC7E,OAAOo7D,IAAIF,cAAgBG,QAC7B,GAqDF,SAASC,YAAY7iE,MAAOukB,SAAUu+C,YAAaC,WACjD,IAAIv+C,OAAS,EACX7lB,OAAkB,MAATqB,MAAgB,EAAIA,MAAMrB,OAIrC,IAHIokE,WAAapkE,SACfmkE,YAAc9iE,QAAQwkB,UAEfA,MAAQ7lB,QACfmkE,YAAcv+C,SAASu+C,YAAa9iE,MAAMwkB,OAAQA,MAAOxkB,OAE3D,OAAO8iE,WACT,CAeA,SAASE,WAAWpvC,WAAYrP,SAAUu+C,YAAaC,UAAWpvC,UAIhE,OAHAA,SAASC,YAAY,SAAUniB,MAAO+S,MAAOoP,YAC3CkvC,YAAcC,WAAaA,WAAY,EAAOtxD,OAAS8S,SAASu+C,YAAarxD,MAAO+S,MAAOoP,WAC7F,IACOkvC,WACT,CAuCA,SAASv4D,OAAOqpB,WAAYrP,SAAUu+C,aACpC,IAAIh8C,KAAOkD,UAAU4J,YAAcivC,YAAcG,WAC/CD,UAAY53C,UAAUxsB,OAAS,EACjC,OAAOmoB,KAAK8M,WAAYP,aAAa9O,UAAWu+C,YAAaC,UAAWrvC,SAC1E,CAGA,IAAIuvC,QAAUj1C,SAAW,IAAIA,QAUzBk1C,YAAeD,QAAqB,SAAUn8C,KAAM7B,MAEtD,OADAg+C,QAAQ/iE,IAAI4mB,KAAM7B,MACX6B,IACT,EAH6BoM,SAa7B,SAASiwC,WAAWj2C,MAClB,OAAO,WAIL,IAAIqE,KAAOpG,UACX,OAAQoG,KAAK5yB,QACX,KAAK,EACH,OAAO,IAAIuuB,KACb,KAAK,EACH,OAAO,IAAIA,KAAKqE,KAAK,IACvB,KAAK,EACH,OAAO,IAAIrE,KAAKqE,KAAK,GAAIA,KAAK,IAChC,KAAK,EACH,OAAO,IAAIrE,KAAKqE,KAAK,GAAIA,KAAK,GAAIA,KAAK,IACzC,KAAK,EACH,OAAO,IAAIrE,KAAKqE,KAAK,GAAIA,KAAK,GAAIA,KAAK,GAAIA,KAAK,IAClD,KAAK,EACH,OAAO,IAAIrE,KAAKqE,KAAK,GAAIA,KAAK,GAAIA,KAAK,GAAIA,KAAK,GAAIA,KAAK,IAC3D,KAAK,EACH,OAAO,IAAIrE,KAAKqE,KAAK,GAAIA,KAAK,GAAIA,KAAK,GAAIA,KAAK,GAAIA,KAAK,GAAIA,KAAK,IACpE,KAAK,EACH,OAAO,IAAIrE,KAAKqE,KAAK,GAAIA,KAAK,GAAIA,KAAK,GAAIA,KAAK,GAAIA,KAAK,GAAIA,KAAK,GAAIA,KAAK,IAE/E,IAAI6xC,YAAc/a,WAAWn7B,KAAK1vB,WAChCinB,OAASyI,KAAKsE,MAAM4xC,YAAa7xC,MAInC,OAAOlL,SAAS5B,QAAUA,OAAS2+C,WACrC,CACF,CA0BA,IAAIC,YAAc72D,KAAKsoB,IAavB,SAASwuC,YAAY/xC,KAAMgyC,SAAUC,QAASC,WAS5C,IARA,IAAIC,WAAa,EACfC,WAAapyC,KAAK5yB,OAClBilE,cAAgBJ,QAAQ7kE,OACxBklE,WAAa,EACbC,WAAaP,SAAS5kE,OACtBolE,YAAcV,YAAYM,WAAaC,cAAe,GACtDn/C,OAASrd,MAAM08D,WAAaC,aAC5BC,aAAeP,YACRI,UAAYC,YACnBr/C,OAAOo/C,WAAaN,SAASM,WAE/B,OAASH,UAAYE,gBACfI,aAAeN,UAAYC,cAC7Bl/C,OAAO++C,QAAQE,YAAcnyC,KAAKmyC,YAGtC,KAAOK,eACLt/C,OAAOo/C,aAAetyC,KAAKmyC,aAE7B,OAAOj/C,MACT,CAGA,IAAIw/C,YAAcz3D,KAAKsoB,IAavB,SAASovC,iBAAiB3yC,KAAMgyC,SAAUC,QAASC,WAUjD,IATA,IAAIC,WAAa,EACfC,WAAapyC,KAAK5yB,OAClBwlE,cAAgB,EAChBP,cAAgBJ,QAAQ7kE,OACxBylE,YAAc,EACdC,YAAcd,SAAS5kE,OACvBolE,YAAcE,YAAYN,WAAaC,cAAe,GACtDn/C,OAASrd,MAAM28D,YAAcM,aAC7BL,aAAeP,YACRC,UAAYK,aACnBt/C,OAAOi/C,WAAanyC,KAAKmyC,WAG3B,IADA,IAAI35C,OAAS25C,YACJU,WAAaC,aACpB5/C,OAAOsF,OAASq6C,YAAcb,SAASa,YAEzC,OAASD,aAAeP,gBAClBI,aAAeN,UAAYC,cAC7Bl/C,OAAOsF,OAASy5C,QAAQW,eAAiB5yC,KAAKmyC,cAGlD,OAAOj/C,MACT,CA0BA,SAAS6/C,aAET,CAYA,SAASC,YAAY9yD,OACnB1R,KAAKykE,YAAc/yD,MACnB1R,KAAK0kE,YAAc,GACnB1kE,KAAK2kE,QAAU,EACf3kE,KAAK4kE,cAAe,EACpB5kE,KAAK6kE,cAAgB,GACrB7kE,KAAK8kE,cAfkB,WAgBvB9kE,KAAK+kE,UAAY,EACnB,CAGAP,YAAY/mE,UAAY6qD,WAAWic,WAAW9mE,WAC9C+mE,YAAY/mE,UAAU6mB,YAAckgD,YAyBpC,IAAIQ,QAAW9B,QAAqB,SAAUn8C,MAC5C,OAAOm8C,QAAQ1iE,IAAIumB,KACrB,EAbA,WAEA,EAcIk+C,UAAY,CAAC,EAMbC,iBAHgB1nE,OAAOC,UAGUC,eA8BrC,SAASynE,cAAczzD,MAAO0zD,UAC5BplE,KAAKykE,YAAc/yD,MACnB1R,KAAK0kE,YAAc,GACnB1kE,KAAKqlE,YAAcD,SACnBplE,KAAKslE,UAAY,EACjBtlE,KAAKulE,gBAAajlE,CACpB,CACA6kE,cAAc1nE,UAAY6qD,WAAWic,WAAW9mE,WAChD0nE,cAAc1nE,UAAU6mB,YAAc6gD,cAqBtC,IAGIK,iBAHgBhoE,OAAOC,UAGUC,eAuHrC,SAAS+nE,OAAO/zD,OACd,GAAIoZ,aAAapZ,SAAWuY,UAAUvY,UAAYA,iBAAiB8yD,aAAc,CAC/E,GAAI9yD,iBAAiByzD,cACnB,OAAOzzD,MAET,GAAI8zD,iBAAiB7nE,KAAK+T,MAAO,eAC/B,OA5IN,SAAsBg0D,SACpB,GAAIA,mBAAmBlB,YACrB,OAAOkB,QAAQhtB,QAEjB,IAAIh0B,OAAS,IAAIygD,cAAcO,QAAQjB,YAAaiB,QAAQL,WAI5D,OAHA3gD,OAAOggD,YAAcxd,UAAUwe,QAAQhB,aACvChgD,OAAO4gD,UAAYI,QAAQJ,UAC3B5gD,OAAO6gD,WAAaG,QAAQH,WACrB7gD,MACT,CAmIaihD,CAAaj0D,MAExB,CACA,OAAO,IAAIyzD,cAAczzD,MAC3B,CAcA,SAASk0D,WAAW7+C,MAClB,IAAI8+C,SArMN,SAAqB9+C,MAInB,IAHA,IAAIrC,OAASqC,KAAKvlB,KAAO,GACvBvB,MAAQglE,UAAUvgD,QAClB9lB,OAASsmE,iBAAiBvnE,KAAKsnE,UAAWvgD,QAAUzkB,MAAMrB,OAAS,EAC9DA,UAAU,CACf,IAAIsmB,KAAOjlB,MAAMrB,QACfknE,UAAY5gD,KAAK6B,KACnB,GAAiB,MAAb++C,WAAqBA,WAAa/+C,KACpC,OAAO7B,KAAK1jB,IAEhB,CACA,OAAOkjB,MACT,CAyLiBqhD,CAAYh/C,MACzBnC,MAAQ6gD,OAAOI,UACjB,GAAoB,mBAATjhD,SAAyBihD,YAAYrB,YAAY/mE,WAC1D,OAAO,EAET,GAAIspB,OAASnC,MACX,OAAO,EAET,IAAIM,KAAO8/C,QAAQpgD,OACnB,QAASM,MAAQ6B,OAAS7B,KAAK,EACjC,CAtBAugD,OAAOhoE,UAAY8mE,WAAW9mE,UAC9BgoE,OAAOhoE,UAAU6mB,YAAcmhD,OAqC/B,IAAIO,QAAUjwC,SAASotC,aAGnB8C,cAAgB,oCAClBC,eAAiB,QAenB,IAAIC,cAAgB,4CAoCpB,IAWIC,UAAY,CAAC,CAAC,MALA,KAKuB,CAAC,OAXnB,GAW8C,CAAC,UAV/C,GAU+E,CAAC,QATnF,GAS8G,CAAC,aARzG,IAQ+I,CAAC,OAHvJ,KAGgL,CAAC,UAP9K,IAO6M,CAAC,eANxM,IAMkP,CAAC,QAJ3P,MAcpB,SAASC,kBAAkBC,QAAS19C,SAOlC,OANAoL,UAAUoyC,WAAW,SAAUG,MAC7B,IAAI70D,MAAQ,KAAO60D,KAAK,GACpB39C,QAAU29C,KAAK,KA9BvB,SAAuBtmE,MAAOyR,OAE5B,QADsB,MAATzR,QAAoBA,MAAMrB,SACpBo7D,YAAY/5D,MAAOyR,MAAO,IAAM,CACrD,CA2B8B80D,CAAcF,QAAS50D,QAC/C40D,QAAQxkE,KAAK4P,MAEjB,IACO40D,QAAQ9b,MACjB,CAYA,SAASic,gBAAgBf,QAASgB,UAAW99C,SAC3C,IAAInnB,OAASilE,UAAY,GACzB,OAAOtwC,YAAYsvC,QArErB,SAA2BjkE,OAAQ6kE,SACjC,IAAI1nE,OAAS0nE,QAAQ1nE,OACrB,IAAKA,OACH,OAAO6C,OAET,IAAIo1B,UAAYj4B,OAAS,EAGzB,OAFA0nE,QAAQzvC,YAAcj4B,OAAS,EAAI,KAAO,IAAM0nE,QAAQzvC,WACxDyvC,QAAUA,QAAQ7oC,KAAK7+B,OAAS,EAAI,KAAO,KACpC6C,OAAO8lB,QAAQ4+C,cAAe,uBAAyBG,QAAU,SAC1E,CA4D8BK,CAAkBllE,OAAQ4kE,kBArFxD,SAAwB5kE,QACtB,IAAIwwB,MAAQxwB,OAAOwwB,MAAMg0C,eACzB,OAAOh0C,MAAQA,MAAM,GAAGkJ,MAAM+qC,gBAAkB,EAClD,CAkF0EU,CAAenlE,QAASmnB,UAClG,CA2BA,SAASi+C,cAAc9/C,KAAM6B,QAASk+C,SAAUC,YAAapmE,QAAS6iE,SAAUC,QAASuD,OAAQC,IAAKC,OACpG,IAAIC,QAtBgB,EAsBNv+C,QAKdA,SAAWu+C,QA1BW,GACM,GAHJ,GA6BxBv+C,WAAau+C,QA1Be,GADN,OA6BpBv+C,UAAW,GAEb,IAAIw+C,QAAU,CAACrgD,KAAM6B,QAASjoB,QAPdwmE,QAAU3D,cAAWljE,EAFtB6mE,QAAU1D,aAAUnjE,EAGd6mE,aAAU7mE,EAAYkjE,SAFvB2D,aAAU7mE,EAAYmjE,QAQyDuD,OAAQC,IAAKC,OAC5GxiD,OAASoiD,SAASr1C,WAAMnxB,EAAW8mE,SAKvC,OAJIxB,WAAW7+C,OACbi/C,QAAQthD,OAAQ0iD,SAElB1iD,OAAOqiD,YAAcA,YACdN,gBAAgB/hD,OAAQqC,KAAM6B,QACvC,CASA,SAASy+C,UAAUtgD,MAEjB,OADaA,KACCggD,WAChB,CAGA,IAAIO,YAAc76D,KAAKglC,IAmCvB,SAAS81B,eAAetnE,MAAO8mE,aAK7B,IAJA,IAAItiD,OAAS,EACX7lB,OAASqB,MAAMrB,OACf2rB,SAAW,EACX7F,OAAS,KACFD,MAAQ7lB,QAAQ,CACvB,IAAI8S,MAAQzR,MAAMwkB,OACd/S,QAAUq1D,aAlBA,2BAkBer1D,QAC3BzR,MAAMwkB,OAnBM,yBAoBZC,OAAO6F,YAAc9F,MAEzB,CACA,OAAOC,MACT,CA6BA,SAAS8iD,aAAazgD,KAAM6B,QAASjoB,QAAS6iE,SAAUC,QAASgE,cAAeC,aAAcV,OAAQC,IAAKC,OACzG,IAAIS,MAvBc,IAuBN/+C,QACVg/C,OA5BmB,EA4BVh/C,QACTi/C,UA5BqB,EA4BTj/C,QACZ86C,UAAsB,GAAV96C,QACZk/C,OA1BiB,IA0BRl/C,QACTuE,KAAO06C,eAAYvnE,EAAY8iE,WAAWr8C,MAuC5C,OAtCA,SAAS2+C,UAIP,IAHA,IAAI9mE,OAASwsB,UAAUxsB,OACrB4yB,KAAOnqB,MAAMzI,QACb6lB,MAAQ7lB,OACH6lB,SACL+M,KAAK/M,OAAS2G,UAAU3G,OAE1B,GAAIi/C,UACF,IAAIqD,YAAcM,UAAU3B,SAC1BqC,aAljBR,SAAsB9nE,MAAO8mE,aAG3B,IAFA,IAAInoE,OAASqB,MAAMrB,OACjB8lB,OAAS,EACJ9lB,UACDqB,MAAMrB,UAAYmoE,eAClBriD,OAGN,OAAOA,MACT,CAyiBuBsjD,CAAax2C,KAAMu1C,aAStC,GAPIvD,WACFhyC,KAAO+xC,YAAY/xC,KAAMgyC,SAAUC,QAASC,YAE1C+D,gBACFj2C,KAAO2yC,iBAAiB3yC,KAAMi2C,cAAeC,aAAchE,YAE7D9kE,QAAUmpE,aACNrE,WAAa9kE,OAASsoE,MAAO,CAC/B,IAAIe,WAAaV,eAAe/1C,KAAMu1C,aACtC,OAAOF,cAAc9/C,KAAM6B,QAAS4+C,aAAc9B,QAAQqB,YAAapmE,QAAS6wB,KAAMy2C,WAAYjB,OAAQC,IAAKC,MAAQtoE,OACzH,CACA,IAAIykE,YAAcuE,OAASjnE,QAAUX,KACnCyD,GAAKokE,UAAYxE,YAAYt8C,MAAQA,KAavC,OAZAnoB,OAAS4yB,KAAK5yB,OACVooE,OACFx1C,KAlGN,SAAiBvxB,MAAO22B,SAItB,IAHA,IAAI3N,UAAYhpB,MAAMrB,OACpBA,OAAS0oE,YAAY1wC,QAAQh4B,OAAQqqB,WACrCi/C,SAAWhhB,UAAUjnD,OAChBrB,UAAU,CACf,IAAI6lB,MAAQmS,QAAQh4B,QACpBqB,MAAMrB,QAAU8sB,QAAQjH,MAAOwE,WAAai/C,SAASzjD,YAASnkB,CAChE,CACA,OAAOL,KACT,CAyFakoE,CAAQ32C,KAAMw1C,QACZc,QAAUlpE,OAAS,GAC5B4yB,KAAKxsB,UAEH2iE,OAASV,IAAMroE,SACjB4yB,KAAK5yB,OAASqoE,KAEZjnE,MAAQA,OAASslB,MAAQtlB,gBAAgB0lE,UAC3CjiE,GAAK0pB,MAAQi2C,WAAW3/D,KAEnBA,GAAGguB,MAAM4xC,YAAa7xC,KAC/B,CAEF,CAqEA,IAWI42C,YAAc37D,KAAKglC,IAqEvB,IAWI42B,YAAc57D,KAAKsoB,IA2BvB,SAASuzC,WAAWvhD,KAAM6B,QAASjoB,QAAS6iE,SAAUC,QAASuD,OAAQC,IAAKC,OAC1E,IAAIW,UAnCmB,EAmCPj/C,QAChB,IAAKi/C,WAA4B,mBAAR9gD,KACvB,MAAM,IAAIuK,UAzCU,uBA2CtB,IAAI1yB,OAAS4kE,SAAWA,SAAS5kE,OAAS,EAQ1C,GAPKA,SACHgqB,UAAW,GACX46C,SAAWC,aAAUnjE,GAEvB2mE,SAAc3mE,IAAR2mE,IAAoBA,IAAMoB,YAAYzzC,UAAUqyC,KAAM,GAC5DC,WAAkB5mE,IAAV4mE,MAAsBA,MAAQtyC,UAAUsyC,OAChDtoE,QAAU6kE,QAAUA,QAAQ7kE,OAAS,EA1CT,GA2CxBgqB,QAAqC,CACvC,IAAI6+C,cAAgBjE,SAClBkE,aAAejE,QACjBD,SAAWC,aAAUnjE,CACvB,CACA,IAAI4kB,KAAO2iD,eAAYvnE,EAAY0kE,QAAQj+C,MACvCqgD,QAAU,CAACrgD,KAAM6B,QAASjoB,QAAS6iE,SAAUC,QAASgE,cAAeC,aAAcV,OAAQC,IAAKC,OAapG,GAZIhiD,MA7GN,SAAmBA,KAAMzjB,QACvB,IAAImnB,QAAU1D,KAAK,GACjBqjD,WAAa9mE,OAAO,GACpB+mE,WAAa5/C,QAAU2/C,WACvBE,SAAWD,WAAa,IACtBE,QA3Bc,KA2BJH,YA5BM,GA4B2B3/C,SA3B7B,KA2B6D2/C,YA1B3D,KA0B4F3/C,SAAgC1D,KAAK,GAAGtmB,QAAU6C,OAAO,IAAoB,KAAd8mE,YAAuD9mE,OAAO,GAAG7C,QAAU6C,OAAO,IA5B7O,GA4BmPmnB,QAGvQ,IAAM6/C,WAAYC,QAChB,OAAOxjD,KAnCY,EAsCjBqjD,aACFrjD,KAAK,GAAKzjB,OAAO,GAEjB+mE,YAzCmB,EAyCL5/C,QAA6B,EAvCnB,GA0C1B,IAAIlX,MAAQjQ,OAAO,GACnB,GAAIiQ,MAAO,CACT,IAAI8xD,SAAWt+C,KAAK,GACpBA,KAAK,GAAKs+C,SAAWD,YAAYC,SAAU9xD,MAAOjQ,OAAO,IAAMiQ,MAC/DwT,KAAK,GAAKs+C,SAAW+D,eAAeriD,KAAK,GAnDzB,0BAmD8CzjB,OAAO,EACvE,EAEAiQ,MAAQjQ,OAAO,MAEb+hE,SAAWt+C,KAAK,GAChBA,KAAK,GAAKs+C,SAAWW,iBAAiBX,SAAU9xD,MAAOjQ,OAAO,IAAMiQ,MACpEwT,KAAK,GAAKs+C,SAAW+D,eAAeriD,KAAK,GA1DzB,0BA0D8CzjB,OAAO,KAGvEiQ,MAAQjQ,OAAO,MAEbyjB,KAAK,GAAKxT,OAxDM,IA2Dd62D,aACFrjD,KAAK,GAAgB,MAAXA,KAAK,GAAazjB,OAAO,GAAK2mE,YAAYljD,KAAK,GAAIzjB,OAAO,KAGvD,MAAXyjB,KAAK,KACPA,KAAK,GAAKzjB,OAAO,IAGnByjB,KAAK,GAAKzjB,OAAO,GACjByjB,KAAK,GAAKsjD,UAEZ,CA8DIG,CAAUvB,QAASliD,MAErB6B,KAAOqgD,QAAQ,GACfx+C,QAAUw+C,QAAQ,GAClBzmE,QAAUymE,QAAQ,GAClB5D,SAAW4D,QAAQ,GACnB3D,QAAU2D,QAAQ,KAClBF,MAAQE,QAAQ,QAAoB9mE,IAAf8mE,QAAQ,GAAmBS,UAAY,EAAI9gD,KAAKnoB,OAASypE,YAAYjB,QAAQ,GAAKxoE,OAAQ,KACvF,GAAVgqB,UACZA,UAAW,IAERA,SAnEgB,GAmELA,QAGdlE,OApEkB,GAmETkE,SAlEe,IAkEiBA,QAlN7C,SAAqB7B,KAAM6B,QAASs+C,OAClC,IAAI/5C,KAAOi2C,WAAWr8C,MAiBtB,OAhBA,SAAS2+C,UAKP,IAJA,IAAI9mE,OAASwsB,UAAUxsB,OACrB4yB,KAAOnqB,MAAMzI,QACb6lB,MAAQ7lB,OACRmoE,YAAcM,UAAU3B,SACnBjhD,SACL+M,KAAK/M,OAAS2G,UAAU3G,OAE1B,IAAIg/C,QAAU7kE,OAAS,GAAK4yB,KAAK,KAAOu1C,aAAev1C,KAAK5yB,OAAS,KAAOmoE,YAAc,GAAKQ,eAAe/1C,KAAMu1C,aAEpH,OADAnoE,QAAU6kE,QAAQ7kE,QACLsoE,MACJL,cAAc9/C,KAAM6B,QAAS4+C,aAAc9B,QAAQqB,iBAAazmE,EAAWkxB,KAAMiyC,aAASnjE,OAAWA,EAAW4mE,MAAQtoE,QAG1H6yB,MADEzxB,MAAQA,OAASslB,MAAQtlB,gBAAgB0lE,QAAUv4C,KAAOpG,KAClD/mB,KAAMwxB,KACzB,CAEF,CAgMao3C,CAAY7hD,KAAM6B,QAASs+C,OAlEhB,IAmEVt+C,SAA6C,IAAXA,SAAyD66C,QAAQ7kE,OAGpG4oE,aAAa/1C,WAAMnxB,EAAW8mE,SAnL3C,SAAuBrgD,KAAM6B,QAASjoB,QAAS6iE,UAC7C,IAAIoE,OAfiB,EAeRh/C,QACXuE,KAAOi2C,WAAWr8C,MAgBpB,OAfA,SAAS2+C,UAOP,IANA,IAAI/B,WAAa,EACfC,WAAax4C,UAAUxsB,OACvBklE,WAAa,EACbC,WAAaP,SAAS5kE,OACtB4yB,KAAOnqB,MAAM08D,WAAaH,YAC1BngE,GAAKzD,MAAQA,OAASslB,MAAQtlB,gBAAgB0lE,QAAUv4C,KAAOpG,OACxD+8C,UAAYC,YACnBvyC,KAAKsyC,WAAaN,SAASM,WAE7B,KAAOF,cACLpyC,KAAKsyC,aAAe14C,YAAYu4C,WAElC,OAAOlyC,MAAMhuB,GAAImkE,OAASjnE,QAAUX,KAAMwxB,KAC5C,CAEF,CA8Jaq3C,CAAc9hD,KAAM6B,QAASjoB,QAAS6iE,eAJ/C,IAAI9+C,OA14BR,SAAoBqC,KAAM6B,QAASjoB,SACjC,IAAIinE,OAbe,EAaNh/C,QACXuE,KAAOi2C,WAAWr8C,MAKpB,OAJA,SAAS2+C,UAEP,OADS1lE,MAAQA,OAASslB,MAAQtlB,gBAAgB0lE,QAAUv4C,KAAOpG,MACzD0K,MAAMm2C,OAASjnE,QAAUX,KAAMorB,UAC3C,CAEF,CAk4BiB09C,CAAW/hD,KAAM6B,QAASjoB,SASzC,OAAO8lE,iBADMvhD,KAAOi+C,YAAc6C,SACJthD,OAAQ0iD,SAAUrgD,KAAM6B,QACxD,CA8CA,SAASmgD,MAAMhiD,KAAMmgD,MAAOvL,OAE1B,IAAIj3C,OAAS4jD,WAAWvhD,KA7CF,OA6C2BzmB,OAAWA,OAAWA,OAAWA,OAAWA,EAD7F4mE,MAAQvL,WAAQr7D,EAAY4mE,OAG5B,OADAxiD,OAAOqiD,YAAcgC,MAAMhC,YACpBriD,MACT,CAGAqkD,MAAMhC,YAAc,CAAC,EAoCrB,SAASiC,UAAUC,QACjB,IAAIzjE,EAAIyjE,OAAO9tC,MAAM,KACrB,IACE,IAAIz5B,EAAI8D,EAAE,GAAG21B,MAAM,KAMnB,OAHiB,IAAbz5B,EAAE9C,SACJ8C,EAAI8D,EAAE,GAAG21B,MAAM,MAEa,KAAvBqpB,WAAWh/C,EAAE,GAAI,IAAoC,GAAvBg/C,WAAWh/C,EAAE,GAAI,IAAWg/C,WAAW9iD,EAAE,GAAI,IAAM8iD,WAAW9iD,EAAE,GAAI,IAAM,GACjH,CAAE,MAAOtD,GACP,OAAO,CACT,CACF,CAGA,SAAS8qE,iBAAiBC,WAAYlc,UAEpC,IADA,IAAImc,IAAMnc,UACFkc,WAAWC,MAAQA,IAAMD,WAAWvqE,QAC1CwqE,MAEF,OAAOA,GACT,CAQA,SAASC,wBAAwBrgB,MAAOsgB,cAAeC,SAAU3iC,0BAC/DA,yBAA2BA,0BApCoB,QAqC/C,IAGI4iC,MACAC,KACAxsC,KACAysC,SACAre,QAPAwC,kBAAoBzB,6BACpBztD,EAAI,EACJ8lB,MAAQ,EAMRklD,eAAiB,IAAIriD,OAAO,UAAYgiD,cAAgB,WACxDM,YAAc,qCACdC,cAAgB,KAChBC,iBAAmB,KACnBC,wBAA0B,QAM9B,IADAL,SA1BF,SAA0BP,YAExB,IADA,IAAIC,IAAMD,WAAWvqE,OAAS,EACvBwqE,KAAO,IAAMD,WAAWC,MAC7BA,MAEF,OAAOA,GACT,CAoBaY,CADXR,MAAQxgB,MAAM7tB,MAAM,qBACiB,EAChCx8B,EAAI,EAAGA,EAAI+qE,SAAU/qE,IAAK,CAsB7B,IArBA0sD,QAAU,CAAC,EACXpuB,KAAO,GACPt+B,EAAIuqE,iBAAiBM,MAAO7qE,GAE1B0sD,QAAQr7C,GADNu5D,SACW/0C,SAASg1C,MAAM7qE,KAAM,IAErBA,EAIf8qE,KAAOD,MAAM7qE,KAAKw8B,MAAMwuC,gBACxBte,QAAQ71B,MAAQwzC,UAAUS,KAAK,KAIhB,KADfhlD,MAAQglD,KAAK,GAAG/2D,QAAQ,QAEtB+2D,KAAK,GAAKA,KAAK,GAAG5+B,UAAU,EAAGpmB,QAEjC4mC,QAAQ51B,IAAMuzC,UAAUS,KAAK,IAGtB9qE,EAAI+qE,UAAYF,MAAM7qE,IAC3Bs+B,KAAKn7B,KAAK0nE,MAAM7qE,MAKlB0sD,QAAQpuB,KAAOA,KAAKQ,KAAK,OAAOlW,QAAQqiD,YAAa,IAGrDve,QAAQpuB,KAAOouB,QAAQpuB,KAAK1V,QAAQsiD,cAAe,QAAQtiD,QAAQuiD,iBAAkB,QAMrFze,QAAQpuB,KAAOouB,QAAQpuB,KAAK1V,QAAQwiD,wBAAyB,MAC7Dlc,kBAAkBvC,WAAWva,iBAAiB,CAC5ClC,UAA2B,IAAhBwc,QAAQ71B,MACnBwZ,SAAwB,IAAdqc,QAAQ51B,IAA6B,IAAhB41B,QAAQ71B,MACvCob,gBAAiB,CAACjD,qBAAqB,CACrC1Q,KAAMouB,QAAQpuB,KACd2J,4BAEFgJ,oBAAqB,SACrBE,kBAAmB,WAEvB,CAKA,OAJmBme,sBAAsB,CACvCvC,SAAUmC,kBAAkBnC,SAC5B9kB,0BAGJ,CACA,SAASqjC,YAAYC,YAAa/qE,OAEhC,OADA+qE,aAA4B,IACTtrE,QAAUO,MAAQ+qE,YAAc,IAAI7iE,MAAMlI,MAAQ+qE,YAAYtrE,OAAS,GAAG6+B,KAAK,KAAOysC,WAC3G,CACA,SAASC,6BAA6BC,kBAAmBC,SACvD,IAAIjL,KAAO,IAAIvpC,KAAKu0C,mBAEhBE,aADoBD,QAAQC,cAAyC,IAAzBD,QAAQC,aACjBD,QAAQC,aAAe,EAC1DC,MAAQN,YAAY7K,KAAKoL,cAAeF,cACxCG,QAAUR,YAAY7K,KAAKsL,gBAAiB,GAC5CC,QAAUV,YAAY7K,KAAKwL,gBAAiB,GAE5CC,aAAeZ,YADG7K,KAAK0L,qBAAqBC,QAAQ,GAAG5vC,MAAM,KAAK,GACtB,GAGhD,OAAOovC,MAAQ,IAAME,QAAU,IAAME,SADVN,QAAQW,qBAAuBX,QAAQW,qBAAuB,KACnBH,YACxE,CAmBA,IAAII,kBAAoB,CACtBC,gCAAiC,SAAyCliB,MAAOsgB,cAAe1iC,0BAC9F,OAAOyiC,wBAAwBrgB,MAAOsgB,eAAe,EAAM1iC,yBAC7D,EACAukC,uBAAwB,SAAgCniB,MAAOsgB,cAAe1iC,0BAC5E,OAAOyiC,wBAAwBrgB,MAAOsgB,eAAe,EAAO1iC,yBAC9D,EACAwkC,iBAzBF,SAA0Bjd,aAAckc,SAgBtC,OAAO7/D,OAAO2jD,aAAaN,kBAAkBnC,UAf7C,SAAyB2f,OAAQhgB,QAAS5mC,OAaxC,OAZoC,IAAVA,QAExB4mD,QAAU,QAERhB,QAAQd,WAEV8B,QADoB5mD,MAAQ,EAE5B4mD,QAAU,MAEZA,QAAUlB,6BAA6B9e,QAAQxc,UAAWw7B,SAAWA,QAAQf,cAAgBa,6BAA6B9e,QAAQ1a,QAAS05B,SAC3IgB,QAAU,KACVA,QAAUhgB,QAAQpuB,IAEpB,GACwEotC,QAAQtH,YAClF,EASEuI,2CAzJ+C,SAqT7CC,0BA1JmB,WACrB1P,wBAAwB,OAAQ,CAAC,QAAS,SAAS,WACjD,IAAI3uB,YAAc,IAAIjT,WACtB,SAASL,eAAegU,aACtB,IAAI49B,iBAAmB//D,OAAOggE,aAAa,KAE3C,OADWv+B,YAAYtT,eAAegU,aAAarmB,QAAQikD,iBAAkB,IAE/E,CACA,SAASE,eAAexlD,KACtB,IAAIgzC,aAAehsB,YAAYrT,qBAAqB3T,IAAK,KACzD,GAAIgzC,aAAat6D,OAAS,EACxB,OAAOg7B,eAAe1T,KAExB,IAt7CQjmB,MAAO0rE,UAs7CXC,aAAetkE,IAAI4xD,aAAct/B,gBACrC,OAv7Ce+xC,UAu7CW,KAt7Cd,OADJ1rE,MAu7CI2rE,cAt7CO,GAAKtJ,WAAW3kE,KAAKsC,MAAO0rE,UAu7CjD,CACA,SAASE,sBAAsBj8B,oBAAqBhJ,yBAA0BinB,kBAAmB3nC,KAC/F,IAtzCc6L,OA2zCV+5C,aAAe,CACjBj9B,WANe3oB,IAAIpY,aAAa,SAOhCkhC,SAAU,EACV4B,gBAAiB,CAPDjD,qBAAqB,CACrC/G,yBACA3J,KAAMyuC,eAAexlD,QAMrB0pB,qBA/zCY7d,OA+zCoB6d,oBAAoBxW,cA9zCnDupC,WAAWh9C,SAASoM,QAAQqH,gBA+zC7B0W,kBAAmB,UAGrB,OADA+d,kBAAkBvC,WAAWva,iBAAiB+6B,eACvCje,iBACT,CAiBA,SAASke,cAAcC,eACrB,IAAKA,cACH,OAAO,KAET,IAAItnD,OAASusB,YAAY+6B,eACzB,OAAKtnD,OAAOhB,UAGLgB,OAAOixB,QAFL,IAGX,CAUA,SAASs2B,4BAA4BxyC,QACnC,IAAIyyC,cAAgBzyC,OAAOI,qBAAqB,SAChD,GAAIqyC,cAActtE,OAAS,EACzB,MAAO,CAAC,EAEV,IAp6CQqB,MAo6CJ+K,OAdN,SAAoBiyB,MAElBA,KAAOA,KAAK1V,QADoB,sBACe,oBAC/C,IAAIoR,IAAMt6B,SAASu6B,eAAeC,mBAAmB,IACjDszC,aAAexzC,IAAIjtB,cAAc,SAGrC,OAFAygE,aAAaxgE,YAAcsxB,KAC3BtE,IAAIyzC,KAAKxgE,YAAYugE,cACdA,aAAaE,MAAMC,QAC5B,CAMeC,CAA8BL,cAAc,GAAGvgE,YA1B/C4b,QAAQ,YAAa,KA2B9BilD,aAAet3C,KAAKlqB,QAAQ,SAAUtJ,GACxC,MAAwC,MAAjCA,EAAE+qE,aAAarzC,aACxB,IAEA,MAAO,CACLozB,QAASuf,eAFXS,aAAeA,gBAx6CPvsE,MAw6C4B+K,SAv6CxB/K,MAAMrB,OAASqB,MAAM,QAAKK,IAy6CAosE,MAAM56B,OAC1C2a,QAASsf,cAAcS,aAAaE,MAAMC,iBAC1CrgB,WAAYkW,KAAKgK,aAAaE,MAAMpgB,WAAY,OAChDC,SAAUigB,aAAaE,MAAMngB,SAC7B3c,oBAAqB48B,aAAaE,MAAME,WAAa,SAEzD,CAkBA,SAASC,gBAAgBxB,OAAQhgB,QAASyhB,aACxC,IAAI7vC,KAAOouB,QAAQpuB,KAQnB,OAPIA,OACFA,MAAQ,MAEVouC,QAAU,gBAAkBhgB,QAAQxc,UAAY,qBAAuB5R,KAAO,cAC1E6vC,aAAeA,YAAYj+B,UAAYwc,QAAQ1a,UACjD06B,QAAU,gBAAkBhgB,QAAQ1a,QAAU,iCAEzC06B,MACT,CACA,SAAS0B,iBAAiB5e,cACxB,IAQI6e,cAAgBt/C,OARCljB,OAAO2jD,aAAaN,kBAAkBnC,UAAU,SAAUuhB,WAAY5hB,SACzF,IArjDK1jC,OAAQgL,KAqjDTu6C,UAAY7hB,QAAQzb,oBACxB,OAAKs9B,YAtjDQv6C,KAsjDqBu6C,UArjDvB,OADNvlD,OAsjDiBslD,aArjDHp6C,QAAQlL,OAAQgL,KAAM0vC,YAwjDzC4K,WAAWC,YAAa,GAFfD,UAIX,GAAG,CAAC,IAEJ,OAAgC,IAAzBD,cAAcpuE,OAAeouE,cAAc,GAAG5zC,cAAgB,QACvE,CAwBA,MAAO,CACLojC,YAhEF,SAAgCxT,MAAOpiB,0BACrCA,yBAA2BA,0BAA4BqkC,kBAAkBK,2CACzE,IAAIzd,kBAAoBzB,6BACpB3yB,OAASyT,YAAYlW,SAASgyB,MAAO,aACzC,IAAKvvB,OACH,MAAM,IAAIplB,MAAM,kBAElB,IAAI84D,aAAe1zC,OAAOI,qBAAqB,QAC3CuzC,yBAA2BnB,4BAA4BxyC,QAO3D,OAJAo0B,kBAhEF,SAA6DA,mBAC3D,IAAK,IAAIlvD,EAAI,EAAGA,EAAIkvD,kBAAkBnC,SAAS9sD,OAAQD,IAAK,CAC1D,IAAI0uE,eAAiBxf,kBAAkBnC,SAAS/sD,GAC5CmuE,YAAc,KACdnuE,EAAI,EAAIkvD,kBAAkBnC,SAAS9sD,SACrCkuE,YAAcjf,kBAAkBnC,SAAS/sD,EAAI,IAE/C,IACIqwC,SAAW89B,YAAcA,YAAYj+B,UAAYw+B,eAAe18B,QAD9C,IAEtB08B,eAAet+B,YAAYC,SAC7B,CACA,OAAO6e,iBACT,CAoDsByf,CADpBzf,kBAAoBrjD,OAAO2iE,aADwBpE,MAAM8C,sBAAN9C,CAA6BqE,yBAAyBx9B,oBAAqBhJ,0BACvCinB,oBAEvFuf,yBAAyB1hB,SAAWmC,kBAAkBnC,SACtD0hB,yBAAyBxmC,yBAA2BA,yBACjCqnB,sBAAsBmf,yBAE3C,EAiDEG,UAzBF,SAA0Bpf,cAcxB,IAbA,IA5Raz8C,MA4RT66C,SA3Re,iBADN76C,MA4RYy8C,aAAa5B,WA3RP76C,OAASkjB,UAAUljB,OA2RAy8C,aAAa5B,SAAW,KAAO4B,aAAa5B,SAC1FD,WAAa6B,aAAa7B,WAC1BmB,WAAaU,aAAaV,WAC1BE,WAAaQ,aAAaR,WAQ1B0d,OAJoB,4JAHR0B,iBAAiB5e,cAGT,eAA+N5B,SAA/N,iBAAkQD,WAAlQ,6DAA6VqB,WAA7V,WAA4XF,WAA5X,mFAKpBI,kBAAoBM,aAAaN,kBAC5BlvD,EAAI,EAAGA,EAAIkvD,kBAAkBnC,SAAS9sD,OAAQD,IAAK,CAI1D0sE,OAASwB,gBAAgBxB,OAHJxd,kBAAkBnC,SAAS/sD,GAC5BA,IAAMkvD,kBAAkBnC,SAAS9sD,OAAS,EAC5B,KAAOivD,kBAAkBnC,SAAS/sD,EAAI,GAE1E,CAEA,OADA0sE,QAXwB,gBAa1B,EAKF,GACF,EAuBImC,yBAnBmB,WACrB3R,wBAAwB,MAAO,CAAC,SAAS,WAYvC,MAAO,CACLW,YAXF,SAAgCxT,MAAOpiB,0BACrC,OAAOqkC,kBAAkBE,uBAAuBniB,MAF3B,IAEoDpiB,yBAC3E,EAUE2mC,UATF,SAA0B1f,mBACxB,OAAOod,kBAAkBG,iBAAiBvd,kBAAmB,CAC3Dyb,cANmB,IAOnBvG,YAAa,GACbuH,aAAc,GAElB,EAKF,GACF,EAyBImD,yBArBmB,WACrB5R,wBAAwB,MAAO,CAAC,SAAS,WAcvC,MAAO,CACLW,YAZF,SAAgCxT,MAAOpiB,0BACrC,OAAOqkC,kBAAkBC,gCAAgCliB,MAFpC,WAE4DwZ,OAAQ57B,yBAC3F,EAWE2mC,UAVF,SAA0B1f,mBAMxB,OALoBod,kBAAkBG,iBAAiBvd,kBAAmB,CACxEyb,cANmB,WAOnBvG,YAAa,OACbwG,UAAU,IATW,QAYzB,EAKF,GACF,EAuNImE,0BAnNmB,WACrB7R,wBAAwB,OAAQ,CAAC,QAAS,UAAU,WAGlD,IAAI8R,YAAc,kBACdC,WAAa,mBACbC,UAAY,gBAGhB,SAASC,cAAcC,KAAMC,WAAYrwC,QAKvC,IAJA,IAGIswC,UAHAC,SAAWH,KAAKI,WAChBC,WAAaC,cAAcN,KAAMpwC,QACjC2wC,OAAS,GAENJ,UACqB,IAAtBA,SAASlnE,WACe,MAAtBknE,SAASK,SAEXD,OAAOxsE,KAAK0sE,UAAUN,SAAUF,WAAYI,aACb,QAAtBF,SAASK,YAElBN,UAAYjF,UAAUkF,SAASpgE,aAAa,WAC5B,IACdmgE,UAAYD,YAEdM,OAAOxsE,KAAK2vB,MAAM68C,OAAQR,cAAcI,SAAUD,UAAWG,eAGjEF,SAAWA,SAASO,YAEtB,OAAOH,MACT,CAGA,SAASD,cAAcN,KAAMW,WAC3B,IAAI/wC,OAASowC,KAAKjgE,aAAa,UAC/B,OAAe,OAAX6vB,OACKA,OAEF+wC,WAAa,EACtB,CAGA,SAASF,UAAUT,KAAMC,WAAYrwC,QACnC,IAAIgxC,IAAM,CAAC,EAkBX,OAfAA,IAAI1xC,MAAQ8wC,KAAKpiE,aAAeoiE,KAAK9wC,MAAM1V,QAAQomD,YAAa,IAAIpmD,QAAQqmD,WAAY,UACxFe,IAAI3+D,GAAK+9D,KAAKjgE,aAAa,WAAaigE,KAAKjgE,aAAa,MAC1D6gE,IAAIn5C,MAAQwzC,UAAU+E,KAAKjgE,aAAa,SAAUkgE,YAClDW,IAAIl5C,IAAMuzC,UAAU+E,KAAKjgE,aAAa,OAAQkgE,YAC9CW,IAAIhrE,OAAS0qE,cAAcN,KAAMpwC,QAC7BgxC,IAAIl5C,IAAM,IAGZk5C,IAAIl5C,IAAMuzC,UAAU+E,KAAKjgE,aAAa,YAAa,GAC/C6gE,IAAIl5C,KAAO,EACbk5C,IAAIl5C,KAAOk5C,IAAIn5C,MAEfm5C,IAAIl5C,IAAMqU,OAAO8kC,WAGd,CACLC,SAAUF,IAEd,CA+CA,SAAS3F,UAAUC,OAAQj/C,QACzB,IAAIrrB,EACJ,IAAKsqE,OACH,OAAQ,EAEV,IACE,OApDJ,SAA2B6F,QAASC,WAIlC,IAEIC,WACAn4C,UACAo4C,SACAC,UACAC,UACAC,UACJ,GAAuB,iBAAZN,QACT,OAAOA,QAET,GAAuB,iBAAZA,UAXW,sCAW8BrnD,KAAKqnD,SACvD,KAXiB,sBA6BnB,OAdAG,UAFAD,WAAaF,QAAQ3zC,MAAM,MAC3BtE,UAAYm4C,WAAWpwE,OAAS,IAInB8T,QAAQ,MAAQ,IAC3By8D,UAAYF,SAAS9zC,MAAM,KAC3Bi0C,UAAY,EACRL,WAAkC,iBAAdA,YACtBK,UAAY5qB,WAAW2qB,UAAU,GAAI,IAAMJ,WAE7CC,WAAWn4C,WAAarC,SAAS26C,UAAU,GAAI,IAAMC,WAEvDF,UAAYF,WAAW,GAGhB,CACL,EAAGxqB,WAAW0qB,UAAW,IACzB,EAA6B,GAA1B16C,SAAS06C,UAAW,IAAW1qB,WAAWwqB,WAAW,GAAI,IAC5D,EAA6B,KAA1Bx6C,SAAS06C,UAAW,IAA2C,GAA9B16C,SAASw6C,WAAW,GAAI,IAAWxqB,WAAWwqB,WAAW,GAAI,KACjGA,WAAWpwE,QAAU,EAEzB,CAYWywE,CAAkBpG,OAC3B,CAAE,MAAO7qE,GAEP,OADAO,EAMJ,SAAwBsqE,QACtB,IAAItqE,EAAIsqE,OAAOrqE,OAAS,EACxB,KAAOD,GAAK,GAAKsqE,OAAOtqE,IAAM,KAAOsqE,OAAOtqE,IAAM,KAChDA,IAEF,OAAOA,CACT,CAZQ2wE,CAAerG,QACZzkB,WAAWykB,OAAOp+B,UAAU,EAAGlsC,KAejC,CACLiU,EAAG,KACHjI,EAAG,GACHjJ,EAAG,EACHiiC,GAAI,MAnBqDslC,OAAOp+B,UAAUlsC,MAoB9D,IApBqEqrB,QAAU,EAC7F,CACF,CAkEA,SAAS6iD,gBAAgBxB,OAAQhgB,QAAS5mC,OAGxC,OADA4mD,QAAU,uBADU5mD,MAAQ,GACsB,YAAc4mC,QAAQxc,UAAY,IAAO,WAAawc,QAAQ1a,QAAU,IAAO,MAAQ0a,QAAQpuB,KAAO,MAE1J,CAYA,MAAO,CACLu/B,YA/DF,SAAgCxT,MAAOpiB,0BACrCA,yBAA2BA,0BAA4BqkC,kBAAkBK,2CACzE,IACIyC,KACAwB,YAFA1hB,kBAAoBzB,6BAKxB,IAAKpD,MACH,OAAO,KAMT,GAHAA,OADAA,MAAQA,MAAMzhC,QAAQ,mBAAoB,KAC5BA,QAAQsmD,UAAW,SAEjC0B,aADkB,IAAIt1C,YACIjD,SAASgyB,QAEjC,OAAO6E,kBAKT,IAHAkgB,KAAOwB,YAAYx2C,gBAAgBo1C,WAGV,SAAlBJ,KAAKQ,UACVR,KAAOA,KAAKU,YAuBd,OArBIV,MAEFzmE,IADewmE,cAAcC,KAAM,IACrB,SAAU1iB,SAEtB,IAAIygB,aAAe,CACjBj9B,UAA2B,KAF7Bwc,QAAUA,QAAQwjB,UAEGr5C,MACnBwZ,SAAwB,IAAdqc,QAAQ51B,IAA6B,IAAhB41B,QAAQ71B,MACvCob,gBAAiB,CAACjD,qBAAqB,CACrC1Q,KAAMouB,QAAQpuB,KAAK1V,QAAQ,MAAO,MAClCqf,4BAEFgJ,oBAAqB,SACrBE,kBAAmB,UAErB+d,kBAAkBvC,WAAWva,iBAAiB+6B,cAChD,IAEiB7d,sBAAsB,CACvCvC,SAAUmC,kBAAkBnC,SAC5B9kB,0BAGJ,EAmBE2mC,UAbF,SAA0Bpf,cAIxB,IAHA,IAEIkd,OAFa,iqBAGR1sE,EAAI,EAAGA,EAAIwvD,aAAaN,kBAAkBnC,SAAS9sD,OAAQD,IAAK,CAEvE0sE,OAASwB,gBAAgBxB,OADJld,aAAaN,kBAAkBnC,SAAS/sD,GACZA,EACnD,CAEA,OADA0sE,QANiB,oBAQnB,EAKF,GACF,EA8IImE,yBA1ImB,WACrB3T,wBAAwB,MAAO,CAAC,SAAS,WAMvC,SAASmN,UAAUC,QACjB,IAEIQ,KAFAjkE,EAAIyjE,OAAO9tC,MAAM,KACjBj5B,EAAI+mE,OAAOrqE,OAIf,GAAU,KAANsD,GAAkB,IAANA,EACd,MAAM,IAAImS,MAAM,WAElBnS,EAAIsD,EAAE5G,OAAS,EACf,IACE6qE,KAAgC,GAAzBj1C,SAAShvB,EAAEtD,EAAI,GAAI,IAAWsiD,WAAWh/C,EAAEtD,GAAI,IAG5C,IAANA,IACFunE,MAA6B,KAArBj1C,SAAShvB,EAAE,GAAI,IAE3B,CAAE,MAAOpH,GACP,MAAM,IAAIiW,MAAM,UAClB,CACA,OAAOo1D,IACT,CAGA,SAASgG,eAAeC,MACtB,IAAIC,aACAhB,IAAM,CAAC,EAGX,IAAKe,OAA4C,IAApCA,KAAKh9D,QAlCG,UAmCnB,MAAM,IAAI2B,MAAM,WAGlB,IADAs7D,aAAeD,KAAKnoD,QALP,MAKuB,YAA8B4T,MAJhD,WAKDv8B,OAAS,EACxB,MAAM,IAAIyV,MAAM,WAKlB,OAHAs6D,IAAI3+D,GAAK0/D,KACTf,IAAIn5C,MAAQwzC,UAAU2G,aAAa,IACnChB,IAAIl5C,IAAMuzC,UAAU2G,aAAa,IAC1BhB,GACT,CACA,SAASiB,eAAepG,MAAOthC,IAAKvpC,GAClC,KAAOA,EAAIupC,MAAQshC,MAAM7qE,IACvBA,IAEF,OAAOA,CACT,CACA,SAASkxE,kBAAkBrG,MAAOthC,IAAKvpC,GACrC,KAAOA,EAAIupC,KAAOshC,MAAM7qE,IACtBA,IAEF,OAAOA,CACT,CACA,SAASmxE,gBAAgBtG,MAAOthC,IAAKvpC,GACnC,KAAOA,EAAIupC,MAA+C,IAAxCshC,MAAM7qE,GAAG+T,QA3DN,WA4DnB/T,IAEF,OAAOA,CACT,CAmEA,MAAO,CACL69D,YAnEF,SAAgCxT,MAAOpiB,0BACrCA,yBAA2BA,0BAA4BqkC,kBAAkBK,2CACzE,IAEIpjC,IACAshC,MACAvsC,KACA0xC,IALA9gB,kBAAoBzB,6BACpBztD,EAAI,EAMJoxE,cAAgB,gBAQpB,GAAY,KAHZ7nC,KADAshC,MAAQxgB,MAAM7tB,MALK,qBAMPv8B,SAGkB,WAAb4qE,MAAM,GACrB,OAAO3b,kBAGT,IADAlvD,IACOA,EAAIupC,KAAK,CACdjL,KAAO,GACP,IAME,IAJAt+B,EAAImxE,gBAAgBtG,MAAOthC,IAD3BvpC,EAAIixE,eAAepG,MAAOthC,IAAKvpC,IAE/BgwE,IAAMc,eAAejG,MAAM7qE,MAGpBA,EAAIupC,KAAOshC,MAAM7qE,IACtBs+B,KAAKn7B,KAAK0nE,MAAM7qE,MAIlBgwE,IAAI1xC,KAAOA,KAAKQ,KAAK,MAAMlW,QAAQwoD,cAAe,MAClDpB,IAAI1xC,MAAO,IAAI//B,OAAOk7B,WAAYI,gBAAgBm2C,IAAI1xC,KAAM,aAAalE,gBAAgBptB,YACzF,IAAImgE,aAAe,CACjBj9B,UAAuB,IAAZ8/B,IAAIn5C,MACfwZ,SAAoB,IAAV2/B,IAAIl5C,IAAyB,IAAZk5C,IAAIn5C,MAC/Bob,gBAAiB,CAACjD,qBAAqB,CACrC1Q,KAAM0xC,IAAI1xC,KACV2J,4BAEFgJ,oBAAqB,SACrBE,kBAAmB,UAErB+d,kBAAkBvC,WAAWva,iBAAiB+6B,cAChD,CAAE,MAAO1tE,GACPO,EAAIkxE,kBAAkBrG,MAAOthC,IAAKvpC,EACpC,CACF,CAKA,OAJmBsvD,sBAAsB,CACvCvC,SAAUmC,kBAAkBnC,SAC5B9kB,0BAGJ,EAYE2mC,UAXF,SAA0B1f,mBAOxB,OANoBod,kBAAkBG,iBAAiBvd,kBAAmB,CACxEyb,cA3HmB,SA4HnBvG,YAAa,aACbwG,UAAU,EACVyB,qBAAsB,KAG1B,EAKF,GACF,EAIAO,4BACAiC,2BACAC,2BACAC,4BACA8B,2BAEA,IAAIQ,8BAAgC,GAChCC,4BAA8B,GAC9BC,qBAAuB,SAA8BjwE,MAAOyR,OAE9D,IADA,IAAI+S,OAAS,EACJ9lB,EAAI,EAAGA,EAAIsB,MAAMrB,OAAQD,IAChC,GAAIsB,MAAMtB,KAAO+S,MAAO,CACtB+S,MAAQ9lB,EACR,KACF,CAEF,OAAe,IAAX8lB,QACFxkB,MAAM0S,OAAO8R,MAAO,IACb,EAGX,EACI0rD,IAAM,CACRC,aAAc,SAAsBh8D,OAClC47D,8BAA8BlwE,SAAQ,SAAUY,UAC9CA,SAAS,IAAI2T,MAAMD,OACrB,GACF,EACAi8D,WAAY,SAAoB7gD,SAC9BygD,4BAA4BnwE,SAAQ,SAAUY,UAC5CA,SAAS8uB,QACX,GACF,EACAxrB,iBAAkB,SAA0BR,KAAM8sE,UAChD,IAAIA,UAAgC,mBAAbA,SASrB,MAAM,IAAIj8D,MAAM,mEARhB,GAAa,cAAT7Q,KACFwsE,8BAA8BluE,KAAKwuE,cAC9B,IAAa,YAAT9sE,KAGT,MAAM,IAAI6Q,MAAM,yEAFhB47D,4BAA4BnuE,KAAKwuE,SAGnC,CAIJ,EACApsE,oBAAqB,SAA6BV,KAAM8sE,UACtD,IAAIC,WAAa,WACf,MAAM,IAAIl8D,MAAM,iCAAmCi8D,SAAW,6BAA+B9sE,KAAO,cACtG,EACA,GAAa,cAATA,KACG0sE,qBAAqBF,8BAA+BM,WACvDC,iBAEG,IAAa,YAAT/sE,KAKT,MAAM,IAAI6Q,MAAM,4EAJX67D,qBAAqBD,4BAA6BK,WACrDC,YAIJ,CACF,EACAC,wBAAyB,WACvBR,8BAAgC,GAChCC,4BAA8B,EAChC,GAGEQ,kBAAoBjzE,OAAO2X,OAAO,CACpCu7D,0BAA2B,4BAC3BC,0BAA2B,4BAC3BC,qBAAsB,uBACtBC,2BAA4B,6BAC5BC,uBAAwB,yBACxBC,sBAAuB,wBACvBC,gCAAiC,kCACjCC,kCAAmC,oCACnCC,mCAAoC,qCACpCC,yCAA0C,2CAC1CC,oBAAqB,sBACrBC,0BAA2B,4BAC3BC,yBAA0B,2BAC1BC,oBAAqB,sBACrBC,kBAAmB,oBACnBC,0BAA2B,4BAC3BC,sBAAuB,wBACvBC,cAAe,gBACfC,aAAc,eACdC,cAAe,gBACfC,kBAAmB,oBACnBC,qBAAsB,uBACtBC,gBAAiB,kBACjBC,iBAAkB,mBAClBC,kBAAmB,oBACnBC,oBAAqB,sBACrBC,kBAAmB,oBACnBC,yBAA0B,2BAC1BC,kBAAmB,oBACnBC,gBAAiB,kBACjBC,sBAAuB,wBACvBC,uBAAwB,yBACxBC,0BAA2B,4BAC3BC,wBAAyB,0BACzBC,0BAA2B,4BAC3BC,mCAAoC,qCACpCC,kBAAmB,oBACnBC,8BAA+B,gCAC/BC,gBAAiB,kBACjBC,yBAA0B,2BAC1BC,iBAAkB,mBAClBC,gBAAiB,kBACjBC,iCAAkC,mCAClCC,0BAA2B,4BAC3BC,qBAAsB,uBACtBC,yBAA0B,2BAC1BC,eAAgB,iBAChBC,MAAO,QACPC,cAAe,gBACfC,cAAe,gBACfC,sBAAuB,wBACvBC,eAAgB,iBAChBC,wBAAyB,0BACzBC,OAAQ,SACRC,yBAA0B,2BAC1BC,kBAAmB,oBACnBC,kBAAmB,oBACnBC,gBAAiB,kBACjBC,SAAU,WACVC,YAAa,cACbC,WAAY,aACZC,iBAAkB,mBAClBC,iBAAkB,mBAClBC,cAAe,gBACfC,kBAAmB,oBACnBC,iBAAkB,mBAClBC,WAAY,aACZC,4BAA6B,8BAC7BC,kCAAmC,oCACnCC,gCAAiC,kCACjCC,aAAc,eACdC,mBAAoB,qBACpBC,eAAgB,iBAChBC,cAAe,gBACfC,2BAA4B,6BAC5BC,QAAS,UACTC,YAAa,cACbC,YAAa,cACbC,kBAAmB,oBACnBC,qBAAsB,uBACtBC,QAAS,UACTC,iBAAkB,mBAClBC,4BAA6B,8BAC7BC,oBAAqB,sBACrBC,wBAAyB,0BACzBC,kCAAmC,oCACnCC,eAAgB,iBAChBC,mBAAoB,qBACpBC,WAAY,aACZC,UAAW,YACXC,gBAAiB,kBACjBC,QAAS,UACTC,UAAW,YACXC,qBAAsB,uBACtBC,gCAAiC,kCACjCC,aAAc,eACdC,cAAe,gBACfC,aAAc,eACdC,kBAAmB,oBACnBC,YAAa,cACbC,SAAU,WACVC,yCAA0C,2CAC1CC,4CAA6C,8CAC7CC,oCAAqC,sCACrCC,wBAAyB,0BACzBC,mBAAoB,qBACpBC,eAAgB,iBAChBC,8BAA+B,gCAC/BC,0CAA2C,4CAC3CC,yCAA0C,2CAC1CC,kDAAmD,oDACnDC,2CAA4C,6CAC5CC,uDAAwD,yDACxDC,2CAA4C,6CAC5CC,uDAAwD,yDACxDC,sBAAuB,wBACvBC,eAAgB,iBAChBC,kBAAmB,oBACnBC,qBAAsB,uBACtBC,yBAA0B,2BAC1BC,sBAAuB,wBACvBC,kBAAmB,oBACnBC,uBAAwB,yBACxBC,wBAAyB,0BACzBC,wBAAyB,4BAGvBC,UAAY,CAAC,EACjBA,UAAU9H,kBAAkBqG,UAAY,yGACxCyB,UAAU9H,kBAAkBoG,aAAe,wKAC3C0B,UAAU9H,kBAAkBmG,mBAAqB,uCACjD2B,UAAU9H,kBAAkBkD,eAAiB,4CAC7C4E,UAAU9H,kBAAkBsD,QAAU,SACtCwE,UAAU9H,kBAAkBwD,mBAAqB,YACjDsE,UAAU9H,kBAAkBoD,gBAAkB,iBAC9C0E,UAAU9H,kBAAkBmD,uBAAyB,CACnD,IAAM,OACN,GAAK,MACL,IAAM,OACN,EAAG,SACH,KAAM,OACN,IAAK,MACL,KAAM,OACN,EAAK,OAEP2E,UAAU9H,kBAAkB+C,gBAAkB,kBAC9C+E,UAAU9H,kBAAkBuD,0BAA4B,yCACxDuE,UAAU9H,kBAAkBiD,eAAiB,mQAC7C6E,UAAU9H,kBAAkBkG,cAAgB,wBAC5C4B,UAAU9H,kBAAkBgD,OAAS,QACrC8E,UAAU9H,kBAAkBwF,oBAAsB,4CAClDsC,UAAU9H,kBAAkB4F,SAAW,6BACvCkC,UAAU9H,kBAAkB2D,UAAY,sBACxCmE,UAAU9H,kBAAkBiE,mBAAqB,mBACjD6D,UAAU9H,kBAAkBkE,kBAAoB,kBAChD4D,UAAU9H,kBAAkBgE,eAAiB,sBAC7C8D,UAAU9H,kBAAkBmE,YAAc,UAC1C2D,UAAU9H,kBAAkBoE,6BAA+B,mCAC3D0D,UAAU9H,kBAAkBqE,mCAAqC,oCACjEyD,UAAU9H,kBAAkByE,gBAAkB,gBAC9CqD,UAAU9H,kBAAkB0E,eAAiB,eAC7CoD,UAAU9H,kBAAkB8E,aAAe,YAC3CgD,UAAU9H,kBAAkB+E,mBAAqB,wCACjD+C,UAAU9H,kBAAkBgF,sBAAwB,GACpD8C,UAAU9H,kBAAkB0F,WAAa,sBACzCoC,UAAU9H,kBAAkBuF,gBAAkB,eAC9CuC,UAAU9H,kBAAkByD,mBAAqB,gBACjDqE,UAAU9H,kBAAkBiF,SAAW,WACvC6C,UAAU9H,kBAAkB4E,SAAW,OACvCkD,UAAU9H,kBAAkB6E,aAAe,OAC3CiD,UAAU9H,kBAAkB6F,WAAa,iBACzCiC,UAAU9H,kBAAkB8F,sBAAwB,sBACpDgC,UAAU9H,kBAAkB4D,aAAe,WAC3CkE,UAAU9H,kBAAkB2F,iBAAmB,eAC/CmC,UAAU9H,kBAAkB0D,iBAAmB,kIAC/CoE,UAAU9H,kBAAkB+F,iCAAmC,2LAC/D+B,UAAU9H,kBAAkBsE,iCAAmC,2LAC/DwD,UAAU9H,kBAAkBoF,qBAAuB,mGACnD0C,UAAU9H,kBAAkBqF,yBAA2B,qFACvDyC,UAAU9H,kBAAkBmF,6BAA+B,gPAC3D2C,UAAU9H,kBAAkBsF,mCAAqC,iBACjEwC,UAAU9H,kBAAkB2E,4BAA8B,uBAC1DmD,UAAU9H,kBAAkBkF,kBAAoB,qDAChD4C,UAAU9H,kBAAkByF,YAAc,YAC1CqC,UAAU9H,kBAAkB+D,kBAAoB,UAChD+D,UAAU9H,kBAAkBwE,oBAAsB,YAClDsD,UAAU9H,kBAAkB6D,YAAc,4BAC1CiE,UAAU9H,kBAAkBuE,cAAgB,gCAC5CuD,UAAU9H,kBAAkBiG,eAAiB,gBAC7C6B,UAAU9H,kBAAkB8D,kBAAoB,mBAChDgE,UAAU9H,kBAAkBgG,cAAgB,aAC5C8B,UAAU9H,kBAAkBE,2BAA6B,oBACzD4H,UAAU9H,kBAAkBG,sBAAwB,eACpD2H,UAAU9H,kBAAkBuB,iBAAmB,iCAC/CuG,UAAU9H,kBAAkBwB,kBAAoB,oCAChDsG,UAAU9H,kBAAkBoB,eAAiB,aAC7C0G,UAAU9H,kBAAkBqB,mBAAqB,WACjDyG,UAAU9H,kBAAkBkB,eAAiB,OAC7C4G,UAAU9H,kBAAkBsB,sBAAwB,sBACpDwG,UAAU9H,kBAAkB8B,iBAAmB,OAC/CgG,UAAU9H,kBAAkBuC,iBAAmB,SAC/CuF,UAAU9H,kBAAkBK,wBAA0B,iBACtDyH,UAAU9H,kBAAkB4B,0BAA4B,oBACxDkG,UAAU9H,kBAAkByB,mBAAqB,kBACjDqG,UAAU9H,kBAAkBmB,cAAgB,qBAC5C2G,UAAU9H,kBAAkBW,qBAAuB,cACnDmH,UAAU9H,kBAAkBY,2BAA6B,kBACzDkH,UAAU9H,kBAAkB6B,mBAAqB,0BACjDiG,UAAU9H,kBAAkB2B,mBAAqB,YACjDmG,UAAU9H,kBAAkBe,mBAAqB,YACjD+G,UAAU9H,kBAAkBgB,2BAA6B,oBACzD8G,UAAU9H,kBAAkBiB,uBAAyB,gBACrD6G,UAAU9H,kBAAkByC,kBAAoB,uBAChDqF,UAAU9H,kBAAkB0C,iBAAmB,wBAC/CoF,UAAU9H,kBAAkB0B,qBAAuB,eACnDoG,UAAU9H,kBAAkBc,qBAAuB,eACnDgH,UAAU9H,kBAAkBC,2BAA6B,qBACzD6H,UAAU9H,kBAAkBgC,wBAA0B,oBACtD8F,UAAU9H,kBAAkB+B,uBAAyB,mBACrD+F,UAAU9H,kBAAkBM,uBAAyB,mBACrDwH,UAAU9H,kBAAkBa,0BAA4B,qBACxDiH,UAAU9H,kBAAkBI,4BAA8B,SAC1D0H,UAAU9H,kBAAkBO,iCAAmC,cAC/DuH,UAAU9H,kBAAkBQ,mCAAqC,gBACjEsH,UAAU9H,kBAAkBS,oCAAsC,oCAClEqH,UAAU9H,kBAAkBU,0CAA4C,qEACxEoH,UAAU9H,kBAAkBqD,yBAA2B,6FACvDyE,UAAU9H,kBAAkBmC,2BAA6B,WACzD2F,UAAU9H,kBAAkBkC,yBAA2B,wCACvD4F,UAAU9H,kBAAkBiC,2BAA6B,mBACzD6F,UAAU9H,kBAAkBoC,oCAAsC,OAClE0F,UAAU9H,kBAAkBwC,0BAA4B,wBACxDsF,UAAU9H,kBAAkBqC,mBAAqB,eACjDyF,UAAU9H,kBAAkBsC,+BAAiC,sBAC7DwF,UAAU9H,kBAAkB2C,kCAAoC,OAChEmF,UAAU9H,kBAAkB4C,2BAA6B,wBACzDkF,UAAU9H,kBAAkB6C,sBAAwB,eACpDiF,UAAU9H,kBAAkB8C,0BAA4B,eACxDgF,UAAU9H,kBAAkBsG,0CAA4C,4DACxEwB,UAAU9H,kBAAkBuG,6CAA+C,0BAC3EuB,UAAU9H,kBAAkBwG,qCAAuC,gDACnEsB,UAAU9H,kBAAkByG,yBAA2B,uBACvDqB,UAAU9H,kBAAkB0G,oBAAsB,iBAClDoB,UAAU9H,kBAAkB2G,gBAAkB,aAC9CmB,UAAU9H,kBAAkB4G,+BAAiC,2CAC7DkB,UAAU9H,kBAAkB8G,0CAA4C,yEACxEgB,UAAU9H,kBAAkB6G,2CAA6C,8FACzEiB,UAAU9H,kBAAkB+G,mDAAqD,wHACjFe,UAAU9H,kBAAkBgH,4CAA8C,kBAC1Ec,UAAU9H,kBAAkBiH,wDAA0D,kBACtFa,UAAU9H,kBAAkBkH,4CAA8C,aAC1EY,UAAU9H,kBAAkBmH,wDAA0D,aACtFW,UAAU9H,kBAAkBoH,uBAAyB,qDACrDU,UAAU9H,kBAAkBqH,gBAAkB,qBAC9CS,UAAU9H,kBAAkBsH,mBAAqB,uBACjDQ,UAAU9H,kBAAkBuH,sBAAwB,8CACpDO,UAAU9H,kBAAkBwH,0BAA4B,sBACxDM,UAAU9H,kBAAkByH,uBAAyB,mBACrDK,UAAU9H,kBAAkB0H,mBAAqB,yBACjDI,UAAU9H,kBAAkB2H,wBAA0B,uBACtDG,UAAU9H,kBAAkB+H,mBAAqB,UACjDD,UAAU9H,kBAAkB4H,yBAA2B,QACvDE,UAAU9H,kBAAkB6H,yBAA2B,mBACvD,IAsBIG,WAAaj7E,OAAOsX,iBAAiB,CACvC4jE,wBApB8B,SAAiCnO,MAAOE,QAASE,SAC/E,IAAIgO,eAAiB,GACrB,GAAIpO,MAAQ,EAAG,CACb,IAAIqO,oBAAsBrO,MAAQ,QAClCqO,qBAAuBrO,MAAQ,EAAI,IAAM,GACzCoO,eAAe72E,KAAK82E,oBACtB,CACA,GAAInO,QAAU,EAAG,CACf,IAAIoO,sBAAwBpO,QAAU,UACtCoO,uBAAyBpO,QAAU,EAAI,IAAM,GAC7CkO,eAAe72E,KAAK+2E,sBACtB,CACA,GAAIlO,QAAU,EAAG,CACf,IAAImO,sBAAwBnO,QAAU,UACtCmO,uBAAyBnO,QAAU,EAAI,IAAM,GAC7CgO,eAAe72E,KAAKg3E,sBACtB,CACA,OAAOH,eAAel7C,KAAK,QAC7B,GAGG,CACD9Z,SAAU,CACRnjB,IA1BgB,WAClB,OAAOmiB,cAAcC,OACvB,GA0BEm2D,QAAS,CACPv4E,IAAK,WACH,OAAO+3E,SACT,KAIAS,UAAY,CAAC,EACjBA,UAAUvI,kBAAkBqG,UAAY,8HACxCkC,UAAUvI,kBAAkBoG,aAAe,sOAC3CmC,UAAUvI,kBAAkBmG,mBAAqB,mDACjDoC,UAAUvI,kBAAkBkD,eAAiB,wDAC7CqF,UAAUvI,kBAAkBsD,QAAU,SACtCiF,UAAUvI,kBAAkBwD,mBAAqB,YACjD+E,UAAUvI,kBAAkBoD,gBAAkB,6BAC9CmF,UAAUvI,kBAAkBmD,uBAAyB,CACnD,IAAM,OACN,GAAK,MACL,IAAM,OACN,EAAG,SACH,KAAM,OACN,IAAK,MACL,KAAM,OACN,EAAK,OAEPoF,UAAUvI,kBAAkB+C,gBAAkB,0BAC9CwF,UAAUvI,kBAAkBuD,0BAA4B,8CACxDgF,UAAUvI,kBAAkBiD,eAAiB,2SAC7CsF,UAAUvI,kBAAkBkG,cAAgB,0BAC5CqC,UAAUvI,kBAAkBgD,OAAS,YACrCuF,UAAUvI,kBAAkBwF,oBAAsB,2DAClD+C,UAAUvI,kBAAkB4F,SAAW,yBACvC2C,UAAUvI,kBAAkB2D,UAAY,4BACxC4E,UAAUvI,kBAAkBiE,mBAAqB,0BACjDsE,UAAUvI,kBAAkBkE,kBAAoB,2BAChDqE,UAAUvI,kBAAkBgE,eAAiB,gCAC7CuE,UAAUvI,kBAAkBmE,YAAc,UAC1CoE,UAAUvI,kBAAkBoE,6BAA+B,qCAC3DmE,UAAUvI,kBAAkBqE,mCAAqC,qCACjEkE,UAAUvI,kBAAkByE,gBAAkB,qBAC9C8D,UAAUvI,kBAAkB0E,eAAiB,wBAC7C6D,UAAUvI,kBAAkB8E,aAAe,cAC3CyD,UAAUvI,kBAAkB+E,mBAAqB,kEACjDwD,UAAUvI,kBAAkBgF,sBAAwB,GACpDuD,UAAUvI,kBAAkB0F,WAAa,uCACzC6C,UAAUvI,kBAAkBuF,gBAAkB,yBAC9CgD,UAAUvI,kBAAkByD,mBAAqB,2BACjD8E,UAAUvI,kBAAkBiF,SAAW,SACvCsD,UAAUvI,kBAAkB4E,SAAW,SACvC2D,UAAUvI,kBAAkB6E,aAAe,aAC3C0D,UAAUvI,kBAAkB6F,WAAa,uBACzC0C,UAAUvI,kBAAkB8F,sBAAwB,yBACpDyC,UAAUvI,kBAAkB4D,aAAe,aAC3C2E,UAAUvI,kBAAkB2F,iBAAmB,qBAC/C4C,UAAUvI,kBAAkB0D,iBAAmB,mIAC/C6E,UAAUvI,kBAAkB+F,iCAAmC,4OAC/DwC,UAAUvI,kBAAkBsE,iCAAmC,uMAC/DiE,UAAUvI,kBAAkBoF,qBAAuB,uHACnDmD,UAAUvI,kBAAkBqF,yBAA2B,mHACvDkD,UAAUvI,kBAAkBmF,6BAA+B,gRAC3DoD,UAAUvI,kBAAkBsF,mCAAqC,uBACjEiD,UAAUvI,kBAAkB2E,4BAA8B,yBAC1D4D,UAAUvI,kBAAkBkF,kBAAoB,mDAChDqD,UAAUvI,kBAAkByF,YAAc,eAC1C8C,UAAUvI,kBAAkB+D,kBAAoB,UAChDwE,UAAUvI,kBAAkBwE,oBAAsB,SAClD+D,UAAUvI,kBAAkB6D,YAAc,4BAC1C0E,UAAUvI,kBAAkBuE,cAAgB,6BAC5CgE,UAAUvI,kBAAkBiG,eAAiB,iBAC7CsC,UAAUvI,kBAAkB8D,kBAAoB,qBAChDyE,UAAUvI,kBAAkBgG,cAAgB,mBAC5CuC,UAAUvI,kBAAkBE,2BAA6B,qBACzDqI,UAAUvI,kBAAkBG,sBAAwB,gBACpDoI,UAAUvI,kBAAkBuB,iBAAmB,+BAC/CgH,UAAUvI,kBAAkBwB,kBAAoB,4BAChD+G,UAAUvI,kBAAkBoB,eAAiB,oBAC7CmH,UAAUvI,kBAAkBqB,mBAAqB,SACjDkH,UAAUvI,kBAAkBkB,eAAiB,SAC7CqH,UAAUvI,kBAAkBsB,sBAAwB,qBACpDiH,UAAUvI,kBAAkB8B,iBAAmB,QAC/CyG,UAAUvI,kBAAkBuC,iBAAmB,UAC/CgG,UAAUvI,kBAAkBK,wBAA0B,4BACtDkI,UAAUvI,kBAAkB4B,0BAA4B,uBACxD2G,UAAUvI,kBAAkByB,mBAAqB,gBACjD8G,UAAUvI,kBAAkBmB,cAAgB,MAC5CoH,UAAUvI,kBAAkBW,qBAAuB,WACnD4H,UAAUvI,kBAAkBY,2BAA6B,sBACzD2H,UAAUvI,kBAAkB6B,mBAAqB,sDACjD0G,UAAUvI,kBAAkB2B,mBAAqB,gBACjD4G,UAAUvI,kBAAkBe,mBAAqB,kBACjDwH,UAAUvI,kBAAkBgB,2BAA6B,kBACzDuH,UAAUvI,kBAAkBiB,uBAAyB,gBACrDsH,UAAUvI,kBAAkByC,kBAAoB,0BAChD8F,UAAUvI,kBAAkB0C,iBAAmB,4BAC/C6F,UAAUvI,kBAAkB0B,qBAAuB,qBACnD6G,UAAUvI,kBAAkBc,qBAAuB,uBACnDyH,UAAUvI,kBAAkBC,2BAA6B,gCACzDsI,UAAUvI,kBAAkBgC,wBAA0B,0BACtDuG,UAAUvI,kBAAkB+B,uBAAyB,0BACrDwG,UAAUvI,kBAAkBM,uBAAyB,2BACrDiI,UAAUvI,kBAAkBa,0BAA4B,yBACxD0H,UAAUvI,kBAAkBI,4BAA8B,cAC1DmI,UAAUvI,kBAAkBO,iCAAmC,eAC/DgI,UAAUvI,kBAAkBQ,mCAAqC,cACjE+H,UAAUvI,kBAAkBS,oCAAsC,2CAClE8H,UAAUvI,kBAAkBU,0CAA4C,6EACxE6H,UAAUvI,kBAAkB6C,sBAAwB,eACpD0F,UAAUvI,kBAAkB8C,0BAA4B,gBACxDyF,UAAUvI,kBAAkBqD,yBAA2B,2IACvDkF,UAAUvI,kBAAkBmC,2BAA6B,UACzDoG,UAAUvI,kBAAkBkC,yBAA2B,4CACvDqG,UAAUvI,kBAAkBiC,2BAA6B,4BACzDsG,UAAUvI,kBAAkBoC,oCAAsC,OAClEmG,UAAUvI,kBAAkBwC,0BAA4B,4CACxD+F,UAAUvI,kBAAkBqC,mBAAqB,iBACjDkG,UAAUvI,kBAAkBsC,+BAAiC,uBAC7DiG,UAAUvI,kBAAkB2C,kCAAoC,QAChE4F,UAAUvI,kBAAkB4C,2BAA6B,sCACzD2F,UAAUvI,kBAAkBsG,0CAA4C,4DACxEiC,UAAUvI,kBAAkBuG,6CAA+C,2BAC3EgC,UAAUvI,kBAAkBwG,qCAAuC,yDACnE+B,UAAUvI,kBAAkByG,yBAA2B,2BACvD8B,UAAUvI,kBAAkB0G,oBAAsB,wBAClD6B,UAAUvI,kBAAkB2G,gBAAkB,gBAC9C4B,UAAUvI,kBAAkB4G,+BAAiC,yCAC7D2B,UAAUvI,kBAAkB8G,0CAA4C,oFACxEyB,UAAUvI,kBAAkB6G,2CAA6C,uGACzE0B,UAAUvI,kBAAkB+G,mDAAqD,yIACjFwB,UAAUvI,kBAAkBgH,4CAA8C,mBAC1EuB,UAAUvI,kBAAkBiH,wDAA0D,mBACtFsB,UAAUvI,kBAAkBkH,4CAA8C,gBAC1EqB,UAAUvI,kBAAkBmH,wDAA0D,gBACtFoB,UAAUvI,kBAAkBoH,uBAAyB,0EACrDmB,UAAUvI,kBAAkBqH,gBAAkB,2BAC9CkB,UAAUvI,kBAAkBsH,mBAAqB,qBACjDiB,UAAUvI,kBAAkBuH,sBAAwB,sDACpDgB,UAAUvI,kBAAkBwH,0BAA4B,4BACxDe,UAAUvI,kBAAkByH,uBAAyB,6BACrDc,UAAUvI,kBAAkB0H,mBAAqB,yBACjDa,UAAUvI,kBAAkB2H,wBAA0B,iDACtDY,UAAUvI,kBAAkB+H,mBAAqB,gBACjDQ,UAAUvI,kBAAkB4H,yBAA2B,aACvDW,UAAUvI,kBAAkB6H,yBAA2B,iBACvD,IAsBIW,WAAaz7E,OAAOsX,iBAAiB,CACvC4jE,wBApB8B,SAAiCnO,MAAOE,QAASE,SAC/E,IAAIgO,eAAiB,GACrB,GAAIpO,MAAQ,EAAG,CACb,IAAIqO,oBAAsBrO,MAAQ,UAClCqO,qBAAuBrO,MAAQ,EAAI,IAAM,GACzCoO,eAAe72E,KAAK82E,oBACtB,CACA,GAAInO,QAAU,EAAG,CACf,IAAIoO,sBAAwBpO,QAAU,UACtCoO,uBAAyBpO,QAAU,EAAI,IAAM,GAC7CkO,eAAe72E,KAAK+2E,sBACtB,CACA,GAAIlO,QAAU,EAAG,CACf,IAAImO,sBAAwBnO,QAAU,WACtCmO,uBAAyBnO,QAAU,EAAI,IAAM,GAC7CgO,eAAe72E,KAAKg3E,sBACtB,CACA,OAAOH,eAAel7C,KAAK,QAC7B,GAGG,CACD9Z,SAAU,CACRnjB,IA1BgB,WAClB,OAAOmiB,cAAcE,MACvB,GA0BEk2D,QAAS,CACPv4E,IAAK,WACH,OAAOw4E,SACT,KAIAE,UAAY,CAAC,EACjBA,UAAUzI,kBAAkBqG,UAAY,mDACxCoC,UAAUzI,kBAAkBoG,aAAe,yFAC3CqC,UAAUzI,kBAAkBmG,mBAAqB,2BACjDsC,UAAUzI,kBAAkBkD,eAAiB,+BAC7CuF,UAAUzI,kBAAkBsD,QAAU,KACtCmF,UAAUzI,kBAAkBwD,mBAAqB,QACjDiF,UAAUzI,kBAAkBoD,gBAAkB,OAC9CqF,UAAUzI,kBAAkBmD,uBAAyB,CACnD,IAAM,OACN,GAAK,MACL,IAAM,OACN,EAAG,KACH,KAAM,OACN,IAAK,MACL,KAAM,OACN,EAAK,OAEPsF,UAAUzI,kBAAkB+C,gBAAkB,eAC9C0F,UAAUzI,kBAAkBuD,0BAA4B,sBACxDkF,UAAUzI,kBAAkBiD,eAAiB,uMAC7CwF,UAAUzI,kBAAkBkG,cAAgB,gBAC5CuC,UAAUzI,kBAAkBgD,OAAS,MACrCyF,UAAUzI,kBAAkBwF,oBAAsB,2BAClDiD,UAAUzI,kBAAkB4F,SAAW,aACvC6C,UAAUzI,kBAAkB2D,UAAY,SACxC8E,UAAUzI,kBAAkBiE,mBAAqB,aACjDwE,UAAUzI,kBAAkBkE,kBAAoB,aAChDuE,UAAUzI,kBAAkBgE,eAAiB,mBAC7CyE,UAAUzI,kBAAkBmE,YAAc,UAC1CsE,UAAUzI,kBAAkBoE,6BAA+B,oCAC3DqE,UAAUzI,kBAAkBqE,mCAAqC,oCACjEoE,UAAUzI,kBAAkByE,gBAAkB,YAC9CgE,UAAUzI,kBAAkB0E,eAAiB,UAC7C+D,UAAUzI,kBAAkB8E,aAAe,SAC3C2D,UAAUzI,kBAAkB+E,mBAAqB,WACjD0D,UAAUzI,kBAAkBgF,sBAAwB,cACpDyD,UAAUzI,kBAAkB0F,WAAa,mBACzC+C,UAAUzI,kBAAkBuF,gBAAkB,aAC9CkD,UAAUzI,kBAAkByD,mBAAqB,cACjDgF,UAAUzI,kBAAkBiF,SAAW,KACvCwD,UAAUzI,kBAAkB4E,SAAW,KACvC6D,UAAUzI,kBAAkB6E,aAAe,MAC3C4D,UAAUzI,kBAAkB6F,WAAa,WACzC4C,UAAUzI,kBAAkB8F,sBAAwB,YACpD2C,UAAUzI,kBAAkB4D,aAAe,KAC3C6E,UAAUzI,kBAAkB2F,iBAAmB,WAC/C8C,UAAUzI,kBAAkB0D,iBAAmB,4DAC/C+E,UAAUzI,kBAAkB+F,iCAAmC,kGAC/D0C,UAAUzI,kBAAkBsE,iCAAmC,6GAC/DmE,UAAUzI,kBAAkBoF,qBAAuB,2CACnDqD,UAAUzI,kBAAkBqF,yBAA2B,iDACvDoD,UAAUzI,kBAAkBmF,6BAA+B,4MAC3DsD,UAAUzI,kBAAkBsF,mCAAqC,aACjEmD,UAAUzI,kBAAkB2E,4BAA8B,gBAC1D8D,UAAUzI,kBAAkBkF,kBAAoB,gDAChDuD,UAAUzI,kBAAkByF,YAAc,OAC1CgD,UAAUzI,kBAAkB+D,kBAAoB,KAChD0E,UAAUzI,kBAAkBwE,oBAAsB,MAClDiE,UAAUzI,kBAAkB6D,YAAc,uBAC1C4E,UAAUzI,kBAAkBuE,cAAgB,0BAC5CkE,UAAUzI,kBAAkBiG,eAAiB,UAC7CwC,UAAUzI,kBAAkB8D,kBAAoB,OAChD2E,UAAUzI,kBAAkBgG,cAAgB,SAC5CyC,UAAUzI,kBAAkBE,2BAA6B,QACzDuI,UAAUzI,kBAAkBG,sBAAwB,SACpDsI,UAAUzI,kBAAkBuB,iBAAmB,qBAC/CkH,UAAUzI,kBAAkBwB,kBAAoB,qBAChDiH,UAAUzI,kBAAkBoB,eAAiB,WAC7CqH,UAAUzI,kBAAkBqB,mBAAqB,KACjDoH,UAAUzI,kBAAkBkB,eAAiB,KAC7CuH,UAAUzI,kBAAkBsB,sBAAwB,eACpDmH,UAAUzI,kBAAkB8B,iBAAmB,OAC/C2G,UAAUzI,kBAAkBuC,iBAAmB,KAC/CkG,UAAUzI,kBAAkBK,wBAA0B,eACtDoI,UAAUzI,kBAAkB4B,0BAA4B,cACxD6G,UAAUzI,kBAAkByB,mBAAqB,UACjDgH,UAAUzI,kBAAkBmB,cAAgB,qBAC5CsH,UAAUzI,kBAAkBW,qBAAuB,MACnD8H,UAAUzI,kBAAkBY,2BAA6B,WACzD6H,UAAUzI,kBAAkB6B,mBAAqB,iBACjD4G,UAAUzI,kBAAkB2B,mBAAqB,SACjD8G,UAAUzI,kBAAkBe,mBAAqB,UACjD0H,UAAUzI,kBAAkBgB,2BAA6B,OACzDyH,UAAUzI,kBAAkBiB,uBAAyB,OACrDwH,UAAUzI,kBAAkByC,kBAAoB,gBAChDgG,UAAUzI,kBAAkB0C,iBAAmB,cAC/C+F,UAAUzI,kBAAkB0B,qBAAuB,WACnD+G,UAAUzI,kBAAkBc,qBAAuB,YACnD2H,UAAUzI,kBAAkBC,2BAA6B,gBACzDwI,UAAUzI,kBAAkBgC,wBAA0B,gBACtDyG,UAAUzI,kBAAkB+B,uBAAyB,gBACrD0G,UAAUzI,kBAAkBM,uBAAyB,OACrDmI,UAAUzI,kBAAkBa,0BAA4B,eACxD4H,UAAUzI,kBAAkBI,4BAA8B,KAC1DqI,UAAUzI,kBAAkBO,iCAAmC,SAC/DkI,UAAUzI,kBAAkBQ,mCAAqC,UACjEiI,UAAUzI,kBAAkBS,oCAAsC,gBAClEgI,UAAUzI,kBAAkBU,0CAA4C,6BACxE+H,UAAUzI,kBAAkBqD,yBAA2B,4CACvDoF,UAAUzI,kBAAkBmC,2BAA6B,QACzDsG,UAAUzI,kBAAkBkC,yBAA2B,aACvDuG,UAAUzI,kBAAkBiC,2BAA6B,aACzDwG,UAAUzI,kBAAkBoC,oCAAsC,MAClEqG,UAAUzI,kBAAkBwC,0BAA4B,sBACxDiG,UAAUzI,kBAAkBqC,mBAAqB,SACjDoG,UAAUzI,kBAAkBsC,+BAAiC,eAC7DmG,UAAUzI,kBAAkB2C,kCAAoC,IAChE8F,UAAUzI,kBAAkB4C,2BAA6B,iBACzD6F,UAAUzI,kBAAkB6C,sBAAwB,WACpD4F,UAAUzI,kBAAkB8C,0BAA4B,YACxD2F,UAAUzI,kBAAkBsG,0CAA4C,mCACxEmC,UAAUzI,kBAAkBuG,6CAA+C,iBAC3EkC,UAAUzI,kBAAkBwG,qCAAuC,uBACnEiC,UAAUzI,kBAAkByG,yBAA2B,cACvDgC,UAAUzI,kBAAkB0G,oBAAsB,YAClD+B,UAAUzI,kBAAkB2G,gBAAkB,UAC9C8B,UAAUzI,kBAAkB4G,+BAAiC,aAC7D6B,UAAUzI,kBAAkB8G,0CAA4C,6BACxE2B,UAAUzI,kBAAkB6G,2CAA6C,wCACzE4B,UAAUzI,kBAAkB+G,mDAAqD,mDACjF0B,UAAUzI,kBAAkBgH,4CAA8C,SAC1EyB,UAAUzI,kBAAkBiH,wDAA0D,SACtFwB,UAAUzI,kBAAkBkH,4CAA8C,UAC1EuB,UAAUzI,kBAAkBmH,wDAA0D,UACtFsB,UAAUzI,kBAAkBoH,uBAAyB,yBACrDqB,UAAUzI,kBAAkBqH,gBAAkB,uBAC9CoB,UAAUzI,kBAAkBsH,mBAAqB,gBACjDmB,UAAUzI,kBAAkBuH,sBAAwB,kCACpDkB,UAAUzI,kBAAkBwH,0BAA4B,iBACxDiB,UAAUzI,kBAAkByH,uBAAyB,mBACrDgB,UAAUzI,kBAAkB0H,mBAAqB,yBACjDe,UAAUzI,kBAAkB2H,wBAA0B,uBACtDc,UAAUzI,kBAAkB+H,mBAAqB,OACjDU,UAAUzI,kBAAkB4H,yBAA2B,OACvDa,UAAUzI,kBAAkB6H,yBAA2B,KACvD,IAmBIa,WAAa37E,OAAOsX,iBAAiB,CACvC4jE,wBAjB8B,SAAiCnO,MAAOE,QAASE,SAC/E,IAAIgO,eAAiB,GACrB,GAAIpO,MAAQ,EAAG,CACb,IAAIqO,oBAAsBrO,MAAQ,KAClCoO,eAAe72E,KAAK82E,oBACtB,CACA,GAAInO,QAAU,EAAG,CACf,IAAIoO,sBAAwBpO,QAAU,KACtCkO,eAAe72E,KAAK+2E,sBACtB,CACA,GAAIlO,QAAU,EAAG,CACf,IAAImO,sBAAwBnO,QAAU,IACtCgO,eAAe72E,KAAKg3E,sBACtB,CACA,OAAOH,eAAel7C,KAAK,GAC7B,GAGG,CACD9Z,SAAU,CACRnjB,IAvBgB,WAClB,OAAOmiB,cAAcG,QACvB,GAuBEi2D,QAAS,CACPv4E,IAAK,WACH,OAAO04E,SACT,KAIAE,UAAY,CAAC,EACjBA,UAAU3I,kBAAkBqG,UAAY,0IACxCsC,UAAU3I,kBAAkBoG,aAAe,wNAC3CuC,UAAU3I,kBAAkBmG,mBAAqB,iDACjDwC,UAAU3I,kBAAkBkD,eAAiB,sDAC7CyF,UAAU3I,kBAAkBsD,QAAU,aACtCqF,UAAU3I,kBAAkBwD,mBAAqB,gBACjDmF,UAAU3I,kBAAkBoD,gBAAkB,qBAC9CuF,UAAU3I,kBAAkBmD,uBAAyB,CACnD,IAAM,OACN,GAAK,MACL,IAAM,OACN,EAAG,UACH,KAAM,OACN,IAAK,MACL,KAAM,OACN,EAAK,OAEPwF,UAAU3I,kBAAkB+C,gBAAkB,yBAC9C4F,UAAU3I,kBAAkBuD,0BAA4B,mDACxDoF,UAAU3I,kBAAkBiD,eAAiB,8RAC7C0F,UAAU3I,kBAAkBkG,cAAgB,uCAC5CyC,UAAU3I,kBAAkBgD,OAAS,SACrC2F,UAAU3I,kBAAkBwF,oBAAsB,kEAClDmD,UAAU3I,kBAAkB4F,SAAW,+BACvC+C,UAAU3I,kBAAkB2D,UAAY,uBACxCgF,UAAU3I,kBAAkBiE,mBAAqB,mBACjD0E,UAAU3I,kBAAkBkE,kBAAoB,gBAChDyE,UAAU3I,kBAAkBgE,eAAiB,0BAC7C2E,UAAU3I,kBAAkBmE,YAAc,iBAC1CwE,UAAU3I,kBAAkBoE,6BAA+B,iDAC3DuE,UAAU3I,kBAAkBqE,mCAAqC,oDACjEsE,UAAU3I,kBAAkByE,gBAAkB,kCAC9CkE,UAAU3I,kBAAkB0E,eAAiB,sBAC7CiE,UAAU3I,kBAAkB8E,aAAe,iBAC3C6D,UAAU3I,kBAAkB+E,mBAAqB,4CACjD4D,UAAU3I,kBAAkBgF,sBAAwB,GACpD2D,UAAU3I,kBAAkB0F,WAAa,6BACzCiD,UAAU3I,kBAAkBuF,gBAAkB,kBAC9CoD,UAAU3I,kBAAkByD,mBAAqB,4BACjDkF,UAAU3I,kBAAkBiF,SAAW,YACvC0D,UAAU3I,kBAAkB4E,SAAW,UACvC+D,UAAU3I,kBAAkB6E,aAAe,UAC3C8D,UAAU3I,kBAAkB6F,WAAa,uBACzC8C,UAAU3I,kBAAkB8F,sBAAwB,+BACpD6C,UAAU3I,kBAAkB4D,aAAe,YAC3C+E,UAAU3I,kBAAkB2F,iBAAmB,wBAC/CgD,UAAU3I,kBAAkB0D,iBAAmB,iKAC/CiF,UAAU3I,kBAAkB+F,iCAAmC,sNAC/D4C,UAAU3I,kBAAkBsE,iCAAmC,qNAC/DqE,UAAU3I,kBAAkBoF,qBAAuB,yGACnDuD,UAAU3I,kBAAkBqF,yBAA2B,gHACvDsD,UAAU3I,kBAAkBmF,6BAA+B,oTAC3DwD,UAAU3I,kBAAkBsF,mCAAqC,aACjEqD,UAAU3I,kBAAkB2E,4BAA8B,+CAC1DgE,UAAU3I,kBAAkBkF,kBAAoB,sDAChDyD,UAAU3I,kBAAkByF,YAAc,eAC1CkD,UAAU3I,kBAAkB+D,kBAAoB,UAChD4E,UAAU3I,kBAAkBwE,oBAAsB,YAClDmE,UAAU3I,kBAAkB6D,YAAc,4BAC1C8E,UAAU3I,kBAAkBuE,cAAgB,gCAC5CoE,UAAU3I,kBAAkBiG,eAAiB,mBAC7C0C,UAAU3I,kBAAkB8D,kBAAoB,sBAChD6E,UAAU3I,kBAAkBgG,cAAgB,oBAC5C2C,UAAU3I,kBAAkBE,2BAA6B,oBACzDyI,UAAU3I,kBAAkBG,sBAAwB,uBACpDwI,UAAU3I,kBAAkBuB,iBAAmB,mCAC/CoH,UAAU3I,kBAAkBwB,kBAAoB,mCAChDmH,UAAU3I,kBAAkBoB,eAAiB,gBAC7CuH,UAAU3I,kBAAkBqB,mBAAqB,YACjDsH,UAAU3I,kBAAkBkB,eAAiB,UAC7CyH,UAAU3I,kBAAkBsB,sBAAwB,yBACpDqH,UAAU3I,kBAAkB8B,iBAAmB,oBAC/C6G,UAAU3I,kBAAkBuC,iBAAmB,SAC/CoG,UAAU3I,kBAAkBK,wBAA0B,uBACtDsI,UAAU3I,kBAAkB4B,0BAA4B,6BACxD+G,UAAU3I,kBAAkByB,mBAAqB,uBACjDkH,UAAU3I,kBAAkBmB,cAAgB,wBAC5CwH,UAAU3I,kBAAkBW,qBAAuB,cACnDgI,UAAU3I,kBAAkBY,2BAA6B,+BACzD+H,UAAU3I,kBAAkB6B,mBAAqB,0CACjD8G,UAAU3I,kBAAkB2B,mBAAqB,4BACjDgH,UAAU3I,kBAAkBe,mBAAqB,2BACjD4H,UAAU3I,kBAAkBgB,2BAA6B,sBACzD2H,UAAU3I,kBAAkBiB,uBAAyB,oBACrD0H,UAAU3I,kBAAkByC,kBAAoB,gCAChDkG,UAAU3I,kBAAkB0C,iBAAmB,0CAC/CiG,UAAU3I,kBAAkB0B,qBAAuB,wBACnDiH,UAAU3I,kBAAkBc,qBAAuB,uBACnD6H,UAAU3I,kBAAkBC,2BAA6B,qBACzD0I,UAAU3I,kBAAkBgC,wBAA0B,yBACtD2G,UAAU3I,kBAAkB+B,uBAAyB,sBACrD4G,UAAU3I,kBAAkBM,uBAAyB,oBACrDqI,UAAU3I,kBAAkBa,0BAA4B,qBACxD8H,UAAU3I,kBAAkBI,4BAA8B,SAC1DuI,UAAU3I,kBAAkBO,iCAAmC,gBAC/DoI,UAAU3I,kBAAkBQ,mCAAqC,kBACjEmI,UAAU3I,kBAAkBS,oCAAsC,4CAClEkI,UAAU3I,kBAAkBU,0CAA4C,gFACxEiI,UAAU3I,kBAAkBqD,yBAA2B,sGACvDsF,UAAU3I,kBAAkBmC,2BAA6B,YACzDwG,UAAU3I,kBAAkBkC,yBAA2B,kDACvDyG,UAAU3I,kBAAkBiC,2BAA6B,iBACzD0G,UAAU3I,kBAAkBoC,oCAAsC,gBAClEuG,UAAU3I,kBAAkBwC,0BAA4B,wCACxDmG,UAAU3I,kBAAkBqC,mBAAqB,6BACjDsG,UAAU3I,kBAAkBsC,+BAAiC,kCAC7DqG,UAAU3I,kBAAkB2C,kCAAoC,QAChEgG,UAAU3I,kBAAkB4C,2BAA6B,kCACzD+F,UAAU3I,kBAAkB6C,sBAAwB,cACpD8F,UAAU3I,kBAAkB8C,0BAA4B,gBACxD6F,UAAU3I,kBAAkBsG,0CAA4C,oDACxEqC,UAAU3I,kBAAkBuG,6CAA+C,kCAC3EoC,UAAU3I,kBAAkBwG,qCAAuC,kDACnEmC,UAAU3I,kBAAkByG,yBAA2B,8BACvDkC,UAAU3I,kBAAkB0G,oBAAsB,oBAClDiC,UAAU3I,kBAAkB2G,gBAAkB,mBAC9CgC,UAAU3I,kBAAkB4G,+BAAiC,6CAC7D+B,UAAU3I,kBAAkB8G,0CAA4C,4EACxE6B,UAAU3I,kBAAkB6G,2CAA6C,8FACzE8B,UAAU3I,kBAAkB+G,mDAAqD,uJACjF4B,UAAU3I,kBAAkBgH,4CAA8C,qBAC1E2B,UAAU3I,kBAAkBiH,wDAA0D,qBACtF0B,UAAU3I,kBAAkBkH,4CAA8C,mBAC1EyB,UAAU3I,kBAAkBmH,wDAA0D,mBACtFwB,UAAU3I,kBAAkBoH,uBAAyB,wDACrDuB,UAAU3I,kBAAkBqH,gBAAkB,sCAC9CsB,UAAU3I,kBAAkBsH,mBAAqB,+BACjDqB,UAAU3I,kBAAkBuH,sBAAwB,2DACpDoB,UAAU3I,kBAAkBwH,0BAA4B,sBACxDmB,UAAU3I,kBAAkByH,uBAAyB,qBACrDkB,UAAU3I,kBAAkB0H,mBAAqB,yBACjDiB,UAAU3I,kBAAkB2H,wBAA0B,mDACtDgB,UAAU3I,kBAAkB+H,mBAAqB,wBACjDY,UAAU3I,kBAAkB4H,yBAA2B,eACvDe,UAAU3I,kBAAkB6H,yBAA2B,UACvD,IAsBIe,WAAa77E,OAAOsX,iBAAiB,CACvC4jE,wBApB8B,SAAiCnO,MAAOE,QAASE,SAC/E,IAAIgO,eAAiB,GACrB,GAAIpO,MAAQ,EAAG,CACb,IAAIqO,oBAAsBrO,MAAQ,SAClCqO,qBAAuBrO,MAAQ,EAAI,IAAM,GACzCoO,eAAe72E,KAAK82E,oBACtB,CACA,GAAInO,QAAU,EAAG,CACf,IAAIoO,sBAAwBpO,QAAU,UACtCoO,uBAAyBpO,QAAU,EAAI,IAAM,GAC7CkO,eAAe72E,KAAK+2E,sBACtB,CACA,GAAIlO,QAAU,EAAG,CACf,IAAImO,sBAAwBnO,QAAU,WACtCmO,uBAAyBnO,QAAU,EAAI,IAAM,GAC7CgO,eAAe72E,KAAKg3E,sBACtB,CACA,OAAOH,eAAel7C,KAAK,OAC7B,GAGG,CACD9Z,SAAU,CACRnjB,IA1BgB,WAClB,OAAOmiB,cAAcI,MACvB,GA0BEg2D,QAAS,CACPv4E,IAAK,WACH,OAAO44E,SACT,KAIAE,UAAY,CAAC,EACjBA,UAAU7I,kBAAkBqG,UAAY,kHACxCwC,UAAU7I,kBAAkBoG,aAAe,oNAC3CyC,UAAU7I,kBAAkBmG,mBAAqB,gDACjD0C,UAAU7I,kBAAkBkD,eAAiB,wCAC7C2F,UAAU7I,kBAAkBsD,QAAU,SACtCuF,UAAU7I,kBAAkBwD,mBAAqB,YACjDqF,UAAU7I,kBAAkBoD,gBAAkB,4BAC9CyF,UAAU7I,kBAAkBmD,uBAAyB,CACnD,IAAM,OACN,GAAK,MACL,IAAM,OACN,EAAG,SACH,KAAM,OACN,IAAK,MACL,KAAM,OACN,EAAK,OAEP0F,UAAU7I,kBAAkB+C,gBAAkB,aAC9C8F,UAAU7I,kBAAkBuD,0BAA4B,sEACxDsF,UAAU7I,kBAAkBiD,eAAiB,6QAC7C4F,UAAU7I,kBAAkBkG,cAAgB,6BAC5C2C,UAAU7I,kBAAkBgD,OAAS,SACrC6F,UAAU7I,kBAAkBwF,oBAAsB,sDAClDqD,UAAU7I,kBAAkB4F,SAAW,0BACvCiD,UAAU7I,kBAAkB2D,UAAY,qBACxCkF,UAAU7I,kBAAkBiE,mBAAqB,uBACjD4E,UAAU7I,kBAAkBkE,kBAAoB,2BAChD2E,UAAU7I,kBAAkBgE,eAAiB,gDAC7C6E,UAAU7I,kBAAkBmE,YAAc,cAC1C0E,UAAU7I,kBAAkBoE,6BAA+B,yCAC3DyE,UAAU7I,kBAAkBqE,mCAAqC,4CACjEwE,UAAU7I,kBAAkByE,gBAAkB,kBAC9CoE,UAAU7I,kBAAkB0E,eAAiB,mBAC7CmE,UAAU7I,kBAAkB8E,aAAe,gBAC3C+D,UAAU7I,kBAAkB+E,mBAAqB,gCACjD8D,UAAU7I,kBAAkBgF,sBAAwB,GACpD6D,UAAU7I,kBAAkB0F,WAAa,4BACzCmD,UAAU7I,kBAAkBuF,gBAAkB,eAC9CsD,UAAU7I,kBAAkByD,mBAAqB,kCACjDoF,UAAU7I,kBAAkBiF,SAAW,WACvC4D,UAAU7I,kBAAkB4E,SAAW,YACvCiE,UAAU7I,kBAAkB6E,aAAe,UAC3CgE,UAAU7I,kBAAkB6F,WAAa,oBACzCgD,UAAU7I,kBAAkB8F,sBAAwB,uBACpD+C,UAAU7I,kBAAkB4D,aAAe,YAC3CiF,UAAU7I,kBAAkB2F,iBAAmB,iBAC/CkD,UAAU7I,kBAAkB0D,iBAAmB,4IAC/CmF,UAAU7I,kBAAkB+F,iCAAmC,4OAC/D8C,UAAU7I,kBAAkBsE,iCAAmC,6OAC/DuE,UAAU7I,kBAAkBoF,qBAAuB,oFACnDyD,UAAU7I,kBAAkBqF,yBAA2B,+GACvDwD,UAAU7I,kBAAkBmF,6BAA+B,yRAC3D0D,UAAU7I,kBAAkBsF,mCAAqC,4BACjEuD,UAAU7I,kBAAkB2E,4BAA8B,oCAC1DkE,UAAU7I,kBAAkBkF,kBAAoB,qDAChD2D,UAAU7I,kBAAkByF,YAAc,eAC1CoD,UAAU7I,kBAAkB+D,kBAAoB,WAChD8E,UAAU7I,kBAAkBwE,oBAAsB,aAClDqE,UAAU7I,kBAAkB6D,YAAc,yCAC1CgF,UAAU7I,kBAAkBuE,cAAgB,6CAC5CsE,UAAU7I,kBAAkBiG,eAAiB,iBAC7C4C,UAAU7I,kBAAkB8D,kBAAoB,uBAChD+E,UAAU7I,kBAAkBgG,cAAgB,mBAC5C6C,UAAU7I,kBAAkBE,2BAA6B,uBACzD2I,UAAU7I,kBAAkBG,sBAAwB,kBACpD0I,UAAU7I,kBAAkBuB,iBAAmB,mCAC/CsH,UAAU7I,kBAAkBwB,kBAAoB,gCAChDqH,UAAU7I,kBAAkBoB,eAAiB,mBAC7CyH,UAAU7I,kBAAkBqB,mBAAqB,WACjDwH,UAAU7I,kBAAkBkB,eAAiB,YAC7C2H,UAAU7I,kBAAkBsB,sBAAwB,+BACpDuH,UAAU7I,kBAAkB8B,iBAAmB,WAC/C+G,UAAU7I,kBAAkBuC,iBAAmB,UAC/CsG,UAAU7I,kBAAkBK,wBAA0B,YACtDwI,UAAU7I,kBAAkB4B,0BAA4B,wBACxDiH,UAAU7I,kBAAkByB,mBAAqB,0BACjDoH,UAAU7I,kBAAkBmB,cAAgB,0BAC5C0H,UAAU7I,kBAAkBW,qBAAuB,oBACnDkI,UAAU7I,kBAAkBY,2BAA6B,6BACzDiI,UAAU7I,kBAAkB6B,mBAAqB,wCACjDgH,UAAU7I,kBAAkB2B,mBAAqB,uBACjDkH,UAAU7I,kBAAkBe,mBAAqB,uBACjD8H,UAAU7I,kBAAkBgB,2BAA6B,oBACzD6H,UAAU7I,kBAAkBiB,uBAAyB,qBACrD4H,UAAU7I,kBAAkByC,kBAAoB,iCAChDoG,UAAU7I,kBAAkB0C,iBAAmB,mCAC/CmG,UAAU7I,kBAAkB0B,qBAAuB,qBACnDmH,UAAU7I,kBAAkBc,qBAAuB,qBACnD+H,UAAU7I,kBAAkBC,2BAA6B,wBACzD4I,UAAU7I,kBAAkBgC,wBAA0B,4BACtD6G,UAAU7I,kBAAkB+B,uBAAyB,0BACrD8G,UAAU7I,kBAAkBM,uBAAyB,mBACrDuI,UAAU7I,kBAAkBa,0BAA4B,0BACxDgI,UAAU7I,kBAAkBI,4BAA8B,aAC1DyI,UAAU7I,kBAAkBO,iCAAmC,eAC/DsI,UAAU7I,kBAAkBQ,mCAAqC,iBACjEqI,UAAU7I,kBAAkBS,oCAAsC,kCAClEoI,UAAU7I,kBAAkBU,0CAA4C,kEACxEmI,UAAU7I,kBAAkBqD,yBAA2B,2GACvDwF,UAAU7I,kBAAkBmC,2BAA6B,YACzD0G,UAAU7I,kBAAkBkC,yBAA2B,kDACvD2G,UAAU7I,kBAAkBiC,2BAA6B,kCACzD4G,UAAU7I,kBAAkBoC,oCAAsC,eAClEyG,UAAU7I,kBAAkBwC,0BAA4B,sCACxDqG,UAAU7I,kBAAkBqC,mBAAqB,8BACjDwG,UAAU7I,kBAAkBsC,+BAAiC,+BAC7DuG,UAAU7I,kBAAkB2C,kCAAoC,OAChEkG,UAAU7I,kBAAkB4C,2BAA6B,iCACzDiG,UAAU7I,kBAAkB6C,sBAAwB,4BACpDgG,UAAU7I,kBAAkB8C,0BAA4B,sBACxD+F,UAAU7I,kBAAkBsG,0CAA4C,8DACxEuC,UAAU7I,kBAAkBuG,6CAA+C,+BAC3EsC,UAAU7I,kBAAkBwG,qCAAuC,mDACnEqC,UAAU7I,kBAAkByG,yBAA2B,8BACvDoC,UAAU7I,kBAAkB0G,oBAAsB,oBAClDmC,UAAU7I,kBAAkB2G,gBAAkB,kBAC9CkC,UAAU7I,kBAAkB4G,+BAAiC,uCAC7DiC,UAAU7I,kBAAkB8G,0CAA4C,oFACxE+B,UAAU7I,kBAAkB6G,2CAA6C,yHACzEgC,UAAU7I,kBAAkB+G,mDAAqD,kHACjF8B,UAAU7I,kBAAkBgH,4CAA8C,kBAC1E6B,UAAU7I,kBAAkBiH,wDAA0D,kBACtF4B,UAAU7I,kBAAkBkH,4CAA8C,kBAC1E2B,UAAU7I,kBAAkBmH,wDAA0D,kBACtF0B,UAAU7I,kBAAkBoH,uBAAyB,8CACrDyB,UAAU7I,kBAAkBqH,gBAAkB,oBAC9CwB,UAAU7I,kBAAkBsH,mBAAqB,6BACjDuB,UAAU7I,kBAAkBuH,sBAAwB,8DACpDsB,UAAU7I,kBAAkBwH,0BAA4B,uBACxDqB,UAAU7I,kBAAkByH,uBAAyB,qBACrDoB,UAAU7I,kBAAkB0H,mBAAqB,yBACjDmB,UAAU7I,kBAAkB2H,wBAA0B,kDACtDkB,UAAU7I,kBAAkB+H,mBAAqB,kBACjDc,UAAU7I,kBAAkB4H,yBAA2B,eACvDiB,UAAU7I,kBAAkB6H,yBAA2B,kBACvD,IAsBIiB,WAAa/7E,OAAOsX,iBAAiB,CACvC4jE,wBApB8B,SAAiCnO,MAAOE,QAASE,SAC/E,IAAIgO,eAAiB,GACrB,GAAIpO,MAAQ,EAAG,CACb,IAAIqO,oBAAsBrO,MAAQ,QAClCqO,qBAAuBrO,MAAQ,EAAI,IAAM,GACzCoO,eAAe72E,KAAK82E,oBACtB,CACA,GAAInO,QAAU,EAAG,CACf,IAAIoO,sBAAwBpO,QAAU,UACtCoO,uBAAyBpO,QAAU,EAAI,IAAM,GAC7CkO,eAAe72E,KAAK+2E,sBACtB,CACA,GAAIlO,QAAU,EAAG,CACf,IAAImO,sBAAwBnO,QAAU,WACtCmO,uBAAyBnO,QAAU,EAAI,IAAM,GAC7CgO,eAAe72E,KAAKg3E,sBACtB,CACA,OAAOH,eAAel7C,KAAK,MAC7B,GAGG,CACD9Z,SAAU,CACRnjB,IA1BgB,WAClB,OAAOmiB,cAAcK,OACvB,GA0BE+1D,QAAS,CACPv4E,IAAK,WACH,OAAO84E,SACT,KAIAE,UAAY,CAAC,EACjBA,UAAU/I,kBAAkBqG,UAAY,4BACxC0C,UAAU/I,kBAAkBoG,aAAe,mDAC3C2C,UAAU/I,kBAAkBmG,mBAAqB,gBACjD4C,UAAU/I,kBAAkBkD,eAAiB,mBAC7C6F,UAAU/I,kBAAkBsD,QAAU,KACtCyF,UAAU/I,kBAAkBwD,mBAAqB,QACjDuF,UAAU/I,kBAAkBoD,gBAAkB,OAC9C2F,UAAU/I,kBAAkBmD,uBAAyB,CACnD,IAAM,OACN,GAAK,MACL,IAAM,OACN,EAAG,KACH,KAAM,OACN,IAAK,MACL,KAAM,OACN,EAAK,OAEP4F,UAAU/I,kBAAkB+C,gBAAkB,QAC9CgG,UAAU/I,kBAAkBuD,0BAA4B,eACxDwF,UAAU/I,kBAAkBiD,eAAiB,kLAC7C8F,UAAU/I,kBAAkBkG,cAAgB,SAC5C6C,UAAU/I,kBAAkBgD,OAAS,KACrC+F,UAAU/I,kBAAkBwF,oBAAsB,eAClDuD,UAAU/I,kBAAkB4F,SAAW,aACvCmD,UAAU/I,kBAAkB2D,UAAY,QACxCoF,UAAU/I,kBAAkBiE,mBAAqB,OACjD8E,UAAU/I,kBAAkBkE,kBAAoB,OAChD6E,UAAU/I,kBAAkBgE,eAAiB,WAC7C+E,UAAU/I,kBAAkBmE,YAAc,KAC1C4E,UAAU/I,kBAAkBoE,6BAA+B,0BAC3D2E,UAAU/I,kBAAkBqE,mCAAqC,0BACjE0E,UAAU/I,kBAAkByE,gBAAkB,QAC9CsE,UAAU/I,kBAAkB0E,eAAiB,QAC7CqE,UAAU/I,kBAAkB8E,aAAe,OAC3CiE,UAAU/I,kBAAkB+E,mBAAqB,YACjDgE,UAAU/I,kBAAkBgF,sBAAwB,GACpD+D,UAAU/I,kBAAkB0F,WAAa,UACzCqD,UAAU/I,kBAAkBuF,gBAAkB,OAC9CwD,UAAU/I,kBAAkByD,mBAAqB,SACjDsF,UAAU/I,kBAAkBiF,SAAW,MACvC8D,UAAU/I,kBAAkB4E,SAAW,MACvCmE,UAAU/I,kBAAkB6E,aAAe,KAC3CkE,UAAU/I,kBAAkB6F,WAAa,OACzCkD,UAAU/I,kBAAkB8F,sBAAwB,UACpDiD,UAAU/I,kBAAkB4D,aAAe,KAC3CmF,UAAU/I,kBAAkB2F,iBAAmB,OAC/CoD,UAAU/I,kBAAkB0D,iBAAmB,kCAC/CqF,UAAU/I,kBAAkB+F,iCAAmC,wDAC/DgD,UAAU/I,kBAAkBsE,iCAAmC,wDAC/DyE,UAAU/I,kBAAkBoF,qBAAuB,8BACnD2D,UAAU/I,kBAAkBqF,yBAA2B,0BACvD0D,UAAU/I,kBAAkBmF,6BAA+B,yKAC3D4D,UAAU/I,kBAAkBsF,mCAAqC,QACjEyD,UAAU/I,kBAAkB2E,4BAA8B,UAC1DoE,UAAU/I,kBAAkBkF,kBAAoB,4CAChD6D,UAAU/I,kBAAkByF,YAAc,MAC1CsD,UAAU/I,kBAAkB+D,kBAAoB,KAChDgF,UAAU/I,kBAAkBwE,oBAAsB,MAClDuE,UAAU/I,kBAAkB6D,YAAc,sBAC1CkF,UAAU/I,kBAAkBuE,cAAgB,yBAC5CwE,UAAU/I,kBAAkBiG,eAAiB,QAC7C8C,UAAU/I,kBAAkB8D,kBAAoB,QAChDiF,UAAU/I,kBAAkBgG,cAAgB,OAC5C+C,UAAU/I,kBAAkBE,2BAA6B,OACzD6I,UAAU/I,kBAAkBG,sBAAwB,OACpD4I,UAAU/I,kBAAkBuB,iBAAmB,sBAC/CwH,UAAU/I,kBAAkBwB,kBAAoB,sBAChDuH,UAAU/I,kBAAkBoB,eAAiB,OAC7C2H,UAAU/I,kBAAkBqB,mBAAqB,MACjD0H,UAAU/I,kBAAkBkB,eAAiB,MAC7C6H,UAAU/I,kBAAkBsB,sBAAwB,OACpDyH,UAAU/I,kBAAkB8B,iBAAmB,KAC/CiH,UAAU/I,kBAAkBuC,iBAAmB,KAC/CwG,UAAU/I,kBAAkBK,wBAA0B,QACtD0I,UAAU/I,kBAAkB4B,0BAA4B,UACxDmH,UAAU/I,kBAAkByB,mBAAqB,QACjDsH,UAAU/I,kBAAkBmB,cAAgB,MAC5C4H,UAAU/I,kBAAkBW,qBAAuB,KACnDoI,UAAU/I,kBAAkBY,2BAA6B,WACzDmI,UAAU/I,kBAAkB6B,mBAAqB,WACjDkH,UAAU/I,kBAAkB2B,mBAAqB,OACjDoH,UAAU/I,kBAAkBe,mBAAqB,OACjDgI,UAAU/I,kBAAkBgB,2BAA6B,QACzD+H,UAAU/I,kBAAkBiB,uBAAyB,QACrD8H,UAAU/I,kBAAkByC,kBAAoB,QAChDsG,UAAU/I,kBAAkB0C,iBAAmB,QAC/CqG,UAAU/I,kBAAkB0B,qBAAuB,OACnDqH,UAAU/I,kBAAkBc,qBAAuB,OACnDiI,UAAU/I,kBAAkBC,2BAA6B,SACzD8I,UAAU/I,kBAAkBgC,wBAA0B,QACtD+G,UAAU/I,kBAAkB+B,uBAAyB,QACrDgH,UAAU/I,kBAAkBM,uBAAyB,UACrDyI,UAAU/I,kBAAkBa,0BAA4B,UACxDkI,UAAU/I,kBAAkBI,4BAA8B,KAC1D2I,UAAU/I,kBAAkBO,iCAAmC,OAC/DwI,UAAU/I,kBAAkBQ,mCAAqC,OACjEuI,UAAU/I,kBAAkBS,oCAAsC,aAClEsI,UAAU/I,kBAAkBU,0CAA4C,sBACxEqI,UAAU/I,kBAAkBqD,yBAA2B,iDACvD0F,UAAU/I,kBAAkBmC,2BAA6B,KACzD4G,UAAU/I,kBAAkBkC,yBAA2B,YACvD6G,UAAU/I,kBAAkBiC,2BAA6B,QACzD8G,UAAU/I,kBAAkBoC,oCAAsC,KAClE2G,UAAU/I,kBAAkBwC,0BAA4B,WACxDuG,UAAU/I,kBAAkBqC,mBAAqB,OACjD0G,UAAU/I,kBAAkBsC,+BAAiC,QAC7DyG,UAAU/I,kBAAkB2C,kCAAoC,MAChEoG,UAAU/I,kBAAkB4C,2BAA6B,UACzDmG,UAAU/I,kBAAkB6C,sBAAwB,OACpDkG,UAAU/I,kBAAkB8C,0BAA4B,OACxDiG,UAAU/I,kBAAkBsG,0CAA4C,yBACxEyC,UAAU/I,kBAAkBuG,6CAA+C,SAC3EwC,UAAU/I,kBAAkBwG,qCAAuC,eACnEuC,UAAU/I,kBAAkByG,yBAA2B,SACvDsC,UAAU/I,kBAAkB0G,oBAAsB,OAClDqC,UAAU/I,kBAAkB2G,gBAAkB,OAC9CoC,UAAU/I,kBAAkB4G,+BAAiC,aAC7DmC,UAAU/I,kBAAkB8G,0CAA4C,4BACxEiC,UAAU/I,kBAAkB6G,2CAA6C,4BACzEkC,UAAU/I,kBAAkB+G,mDAAqD,kCACjFgC,UAAU/I,kBAAkBgH,4CAA8C,OAC1E+B,UAAU/I,kBAAkBiH,wDAA0D,OACtF8B,UAAU/I,kBAAkBkH,4CAA8C,OAC1E6B,UAAU/I,kBAAkBmH,wDAA0D,OACtF4B,UAAU/I,kBAAkBoH,uBAAyB,iBACrD2B,UAAU/I,kBAAkBqH,gBAAkB,SAC9C0B,UAAU/I,kBAAkBsH,mBAAqB,WACjDyB,UAAU/I,kBAAkBuH,sBAAwB,yBACpDwB,UAAU/I,kBAAkBwH,0BAA4B,SACxDuB,UAAU/I,kBAAkByH,uBAAyB,SACrDsB,UAAU/I,kBAAkB0H,mBAAqB,yBACjDqB,UAAU/I,kBAAkB2H,wBAA0B,UACtDoB,UAAU/I,kBAAkB+H,mBAAqB,UACjDgB,UAAU/I,kBAAkB4H,yBAA2B,KACvDmB,UAAU/I,kBAAkB6H,yBAA2B,KACvD,IAmBImB,WAAaj8E,OAAOsX,iBAAiB,CACvC4jE,wBAjB8B,SAAiCnO,MAAOE,QAASE,SAC/E,IAAIgO,eAAiB,GACrB,GAAIpO,MAAQ,EAAG,CACb,IAAIqO,oBAAsBrO,MAAQ,KAClCoO,eAAe72E,KAAK82E,oBACtB,CACA,GAAInO,QAAU,EAAG,CACf,IAAIoO,sBAAwBpO,QAAU,IACtCkO,eAAe72E,KAAK+2E,sBACtB,CACA,GAAIlO,QAAU,EAAG,CACf,IAAImO,sBAAwBnO,QAAU,IACtCgO,eAAe72E,KAAKg3E,sBACtB,CACA,OAAOH,eAAel7C,KAAK,GAC7B,GAGG,CACD9Z,SAAU,CACRnjB,IAvBgB,WAClB,OAAOmiB,cAAcM,OACvB,GAuBE81D,QAAS,CACPv4E,IAAK,WACH,OAAOg5E,SACT,KAIAE,UAAY,CAAC,EACjBA,UAAUjJ,kBAAkBqG,UAAY,4GACxC4C,UAAUjJ,kBAAkBoG,aAAe,kMAC3C6C,UAAUjJ,kBAAkBmG,mBAAqB,gDACjD8C,UAAUjJ,kBAAkBkD,eAAiB,wCAC7C+F,UAAUjJ,kBAAkBsD,QAAU,YACtC2F,UAAUjJ,kBAAkBwD,mBAAqB,eACjDyF,UAAUjJ,kBAAkBoD,gBAAkB,2BAC9C6F,UAAUjJ,kBAAkBmD,uBAAyB,CACnD,IAAM,OACN,GAAK,MACL,IAAM,OACN,EAAG,SACH,KAAM,OACN,IAAK,MACL,KAAM,OACN,EAAK,OAEP8F,UAAUjJ,kBAAkB+C,gBAAkB,kBAC9CkG,UAAUjJ,kBAAkBuD,0BAA4B,iDACxD0F,UAAUjJ,kBAAkBiD,eAAiB,kQAC7CgG,UAAUjJ,kBAAkBkG,cAAgB,2BAC5C+C,UAAUjJ,kBAAkBgD,OAAS,SACrCiG,UAAUjJ,kBAAkBwF,oBAAsB,wDAClDyD,UAAUjJ,kBAAkB4F,SAAW,0BACvCqD,UAAUjJ,kBAAkB2D,UAAY,qBACxCsF,UAAUjJ,kBAAkBiE,mBAAqB,gBACjDgF,UAAUjJ,kBAAkBkE,kBAAoB,qBAChD+E,UAAUjJ,kBAAkBgE,eAAiB,8BAC7CiF,UAAUjJ,kBAAkBmE,YAAc,UAC1C8E,UAAUjJ,kBAAkBoE,6BAA+B,oCAC3D6E,UAAUjJ,kBAAkBqE,mCAAqC,sCACjE4E,UAAUjJ,kBAAkByE,gBAAkB,gBAC9CwE,UAAUjJ,kBAAkB0E,eAAiB,gBAC7CuE,UAAUjJ,kBAAkB8E,aAAe,aAC3CmE,UAAUjJ,kBAAkB+E,mBAAqB,4CACjDkE,UAAUjJ,kBAAkBgF,sBAAwB,GACpDiE,UAAUjJ,kBAAkB0F,WAAa,uBACzCuD,UAAUjJ,kBAAkBuF,gBAAkB,gBAC9C0D,UAAUjJ,kBAAkByD,mBAAqB,sBACjDwF,UAAUjJ,kBAAkBiF,SAAW,WACvCgE,UAAUjJ,kBAAkB4E,SAAW,UACvCqE,UAAUjJ,kBAAkB6E,aAAe,UAC3CoE,UAAUjJ,kBAAkB6F,WAAa,mBACzCoD,UAAUjJ,kBAAkB8F,sBAAwB,sBACpDmD,UAAUjJ,kBAAkB4D,aAAe,YAC3CqF,UAAUjJ,kBAAkB2F,iBAAmB,gBAC/CsD,UAAUjJ,kBAAkB0D,iBAAmB,qIAC/CuF,UAAUjJ,kBAAkB+F,iCAAmC,6MAC/DkD,UAAUjJ,kBAAkBsE,iCAAmC,0MAC/D2E,UAAUjJ,kBAAkBoF,qBAAuB,uGACnD6D,UAAUjJ,kBAAkBqF,yBAA2B,8FACvD4D,UAAUjJ,kBAAkBmF,6BAA+B,0PAC3D8D,UAAUjJ,kBAAkBsF,mCAAqC,qBACjE2D,UAAUjJ,kBAAkB2E,4BAA8B,2BAC1DsE,UAAUjJ,kBAAkBkF,kBAAoB,qDAChD+D,UAAUjJ,kBAAkByF,YAAc,eAC1CwD,UAAUjJ,kBAAkB+D,kBAAoB,UAChDkF,UAAUjJ,kBAAkBwE,oBAAsB,YAClDyE,UAAUjJ,kBAAkB6D,YAAc,4BAC1CoF,UAAUjJ,kBAAkBuE,cAAgB,gCAC5C0E,UAAUjJ,kBAAkBiG,eAAiB,iBAC7CgD,UAAUjJ,kBAAkB8D,kBAAoB,qBAChDmF,UAAUjJ,kBAAkBgG,cAAgB,eAC5CiD,UAAUjJ,kBAAkBE,2BAA6B,qBACzD+I,UAAUjJ,kBAAkBG,sBAAwB,kBACpD8I,UAAUjJ,kBAAkBuB,iBAAmB,mCAC/C0H,UAAUjJ,kBAAkBwB,kBAAoB,gCAChDyH,UAAUjJ,kBAAkBoB,eAAiB,mBAC7C6H,UAAUjJ,kBAAkBqB,mBAAqB,WACjD4H,UAAUjJ,kBAAkBkB,eAAiB,UAC7C+H,UAAUjJ,kBAAkBsB,sBAAwB,gCACpD2H,UAAUjJ,kBAAkB8B,iBAAmB,OAC/CmH,UAAUjJ,kBAAkBuC,iBAAmB,SAC/C0G,UAAUjJ,kBAAkBK,wBAA0B,iBACtD4I,UAAUjJ,kBAAkB4B,0BAA4B,wBACxDqH,UAAUjJ,kBAAkByB,mBAAqB,0BACjDwH,UAAUjJ,kBAAkBmB,cAAgB,qBAC5C8H,UAAUjJ,kBAAkBW,qBAAuB,aACnDsI,UAAUjJ,kBAAkBY,2BAA6B,yBACzDqI,UAAUjJ,kBAAkB6B,mBAAqB,6BACjDoH,UAAUjJ,kBAAkB2B,mBAAqB,gBACjDsH,UAAUjJ,kBAAkBe,mBAAqB,gBACjDkI,UAAUjJ,kBAAkBgB,2BAA6B,oBACzDiI,UAAUjJ,kBAAkBiB,uBAAyB,mBACrDgI,UAAUjJ,kBAAkByC,kBAAoB,uBAChDwG,UAAUjJ,kBAAkB0C,iBAAmB,6BAC/CuG,UAAUjJ,kBAAkB0B,qBAAuB,oBACnDuH,UAAUjJ,kBAAkBc,qBAAuB,oBACnDmI,UAAUjJ,kBAAkBC,2BAA6B,sBACzDgJ,UAAUjJ,kBAAkBgC,wBAA0B,wBACtDiH,UAAUjJ,kBAAkB+B,uBAAyB,qBACrDkH,UAAUjJ,kBAAkBM,uBAAyB,kBACrD2I,UAAUjJ,kBAAkBa,0BAA4B,wBACxDoI,UAAUjJ,kBAAkBI,4BAA8B,UAC1D6I,UAAUjJ,kBAAkBO,iCAAmC,gBAC/D0I,UAAUjJ,kBAAkBQ,mCAAqC,kBACjEyI,UAAUjJ,kBAAkBS,oCAAsC,iCAClEwI,UAAUjJ,kBAAkBU,0CAA4C,2EACxEuI,UAAUjJ,kBAAkBqD,yBAA2B,iGACvD4F,UAAUjJ,kBAAkBmC,2BAA6B,YACzD8G,UAAUjJ,kBAAkBkC,yBAA2B,kDACvD+G,UAAUjJ,kBAAkBiC,2BAA6B,8BACzDgH,UAAUjJ,kBAAkBoC,oCAAsC,QAClE6G,UAAUjJ,kBAAkBwC,0BAA4B,2BACxDyG,UAAUjJ,kBAAkBqC,mBAAqB,sBACjD4G,UAAUjJ,kBAAkBsC,+BAAiC,uBAC7D2G,UAAUjJ,kBAAkB2C,kCAAoC,OAChEsG,UAAUjJ,kBAAkB4C,2BAA6B,iCACzDqG,UAAUjJ,kBAAkB6C,sBAAwB,cACpDoG,UAAUjJ,kBAAkB8C,0BAA4B,cACxDmG,UAAUjJ,kBAAkBsG,0CAA4C,sDACxE2C,UAAUjJ,kBAAkBuG,6CAA+C,2BAC3E0C,UAAUjJ,kBAAkBwG,qCAAuC,2DACnEyC,UAAUjJ,kBAAkByG,yBAA2B,8BACvDwC,UAAUjJ,kBAAkB0G,oBAAsB,mBAClDuC,UAAUjJ,kBAAkB2G,gBAAkB,gBAC9CsC,UAAUjJ,kBAAkB4G,+BAAiC,2CAC7DqC,UAAUjJ,kBAAkB8G,0CAA4C,8EACxEmC,UAAUjJ,kBAAkB6G,2CAA6C,oFACzEoC,UAAUjJ,kBAAkB+G,mDAAqD,4GACjFkC,UAAUjJ,kBAAkBgH,4CAA8C,oBAC1EiC,UAAUjJ,kBAAkBiH,wDAA0D,oBACtFgC,UAAUjJ,kBAAkBkH,4CAA8C,gBAC1E+B,UAAUjJ,kBAAkBmH,wDAA0D,gBACtF8B,UAAUjJ,kBAAkBoH,uBAAyB,sDACrD6B,UAAUjJ,kBAAkBqH,gBAAkB,2BAC9C4B,UAAUjJ,kBAAkBsH,mBAAqB,6BACjD2B,UAAUjJ,kBAAkBuH,sBAAwB,6DACpD0B,UAAUjJ,kBAAkBwH,0BAA4B,sBACxDyB,UAAUjJ,kBAAkByH,uBAAyB,qBACrDwB,UAAUjJ,kBAAkB0H,mBAAqB,yBACjDuB,UAAUjJ,kBAAkB2H,wBAA0B,+BACtDsB,UAAUjJ,kBAAkB+H,mBAAqB,WACjDkB,UAAUjJ,kBAAkB4H,yBAA2B,aACvDqB,UAAUjJ,kBAAkB6H,yBAA2B,WACvD,IAsBIqB,WAAan8E,OAAOsX,iBAAiB,CACvC4jE,wBApB8B,SAAiCnO,MAAOE,QAASE,SAC/E,IAAIgO,eAAiB,GACrB,GAAIpO,MAAQ,EAAG,CACb,IAAIqO,oBAAsBrO,MAAQ,QAClCqO,qBAAuBrO,MAAQ,EAAI,IAAM,GACzCoO,eAAe72E,KAAK82E,oBACtB,CACA,GAAInO,QAAU,EAAG,CACf,IAAIoO,sBAAwBpO,QAAU,UACtCoO,uBAAyBpO,QAAU,EAAI,IAAM,GAC7CkO,eAAe72E,KAAK+2E,sBACtB,CACA,GAAIlO,QAAU,EAAG,CACf,IAAImO,sBAAwBnO,QAAU,WACtCmO,uBAAyBnO,QAAU,EAAI,IAAM,GAC7CgO,eAAe72E,KAAKg3E,sBACtB,CACA,OAAOH,eAAel7C,KAAK,MAC7B,GAGG,CACD9Z,SAAU,CACRnjB,IA1BgB,WAClB,OAAOmiB,cAAcO,UACvB,GA0BE61D,QAAS,CACPv4E,IAAK,WACH,OAAOk5E,SACT,KAwBAE,cAAgBp8E,OAAOsX,iBAAiB,CAC1C+kE,wBArB4B,SAAiCC,cAC7D,OAAQA,cACN,KAAKn3D,cAAcC,QACjB,OAAO61D,WACT,KAAK91D,cAAcE,OACjB,OAAOo2D,WACT,KAAKt2D,cAAcG,SACjB,OAAOq2D,WACT,KAAKx2D,cAAcI,OACjB,OAAOs2D,WACT,KAAK12D,cAAcK,QACjB,OAAOu2D,WACT,KAAK52D,cAAcM,QACjB,OAAOw2D,WACT,KAAK92D,cAAcO,WACjB,OAAOy2D,WACT,QACE,OAAOlB,WAEb,GAGG,CAAC,GAEAM,QAAU,CAAC,EAUXgB,cAAgBv8E,OAAOsX,iBAAiB,CAC1CklE,UAVc,SAAmBC,UAAWvoE,OAC5C,IAAK++D,kBAAkBwJ,WACrB,MAAM,IAAI5lE,MAAM,2BAElB0kE,QAAQtI,kBAAkBwJ,YAAcvoE,KAC1C,EAMEwoE,aALiB,WACjBnB,QAAU,CAAC,CACb,GAIG,CACDA,QAAS,CACPv4E,IAAK,WACH,OAAOu4E,OACT,KAMAx7C,UAAY,KACZ48C,eAAiB,KACjBC,YAAc,SAAqBz2D,UACjChB,cAAce,QAAQC,YACxB4Z,UAAY5Z,SACZw2D,eAAiBP,cAAcC,wBAAwBt8C,WAE3D,EAII88C,gBAAkB,SAAyBC,YAC7C,OAAIP,cAAchB,QAAQuB,YACjBP,cAAchB,QAAQuB,YACpBH,eAAepB,QAAQuB,YACzBH,eAAepB,QAAQuB,YAEzB,EACT,EAqCAF,YAAYz3D,cAAcC,SAC1B,IAAI23D,oBAAsB/8E,OAAOsX,iBAAiB,CAChDslE,YACAI,YAlDgB,WAChB,OAAOj9C,SACT,EAiDEk9C,oCAxCwC,SAA6C7zC,0BACrF,IAAIxJ,mBAAqBD,4BAA4ByJ,0BACrD,OAAOF,oBAAoBG,YAAYzJ,mBAAmBzZ,UAAY+iB,oBAAoBG,YAAYzJ,mBAAmBzZ,UAAUma,YAAc8I,wBACnJ,EAsCE8zC,iBAhBuB,SAA0B9iD,MAhBpB,SAAkCA,KAC/DA,IAAI+iD,qBAAqB76E,SAAQ,SAAU86E,qBACM,WAA3CA,oBAAoBp5E,KAAK43B,eAC3BghD,YAAYQ,oBAAoBlpE,MAEpC,GACF,CAWEmpE,CAAyBjjD,KAVS,SAAuCA,KACzEA,IAAIkjD,eAAeh7E,SAAQ,SAAUi7E,eACnC,IACEhB,cAAcC,UAAUe,cAAcv5E,KAAMu5E,cAAcrpE,MAC5D,CAAE,MAAOtT,GACP+xE,IAAIE,WAAWjyE,EAAEoxB,QACnB,CACF,GACF,CAGEwrD,CAA8BpjD,IAChC,EAcE8gD,wBAb4B,SAAiCnO,MAAOE,QAASE,SAC7E,OAAOwP,eAAezB,wBAAwBnO,MAAOE,QAASE,QAChE,EAYE0P,gBACAY,uBAxC2B,SAAgCC,sBAAuBC,sBAClF,IAAIC,oBAAsBf,gBAAgB5J,kBAAkBkF,kBAE5D,OADAyF,oBAAsBA,oBAAoB7zD,QA3Bf,sBA2B+C2zD,wBAC/C3zD,QA3BD,qBA2BgC4zD,qBAC5D,EAqCEE,MAbY,WACZtB,cAAcG,eACdE,YAAYz3D,cAAcC,QAC5B,GAWG,CAAC,GAEA04D,cAAgB99E,OAAO2X,OAAO,CAChComE,KAAM,mBACNC,IAAK,sBACLC,IAAK,YACLC,KAAM,aACNC,IAAK,YACLC,KAAM,aACNC,IAAK,YACLC,IAAK,YACLC,QAAS,KAGPC,OAAS,CAACn+E,QAAS,CAAC,IAExB,SAAWD,QACT,IAAWq+E,OAAQ/mE,QAAR+mE,OAmBU,oBAAX/+E,OAAyBA,OAASF,eAnBzBkY,QAmByC,SAAUhY,OAAQg/E,UAE5E,IAAIzzC,IAAM,GACN0zC,SAAW3+E,OAAO4pD,eAClBg1B,OAAS3zC,IAAIjhC,MACb60E,KAAO5zC,IAAI4zC,KAAO,SAAUp8E,OAC9B,OAAOwoC,IAAI4zC,KAAK1+E,KAAKsC,MACvB,EAAI,SAAUA,OACZ,OAAOwoC,IAAIx+B,OAAOwnB,MAAM,GAAIxxB,MAC9B,EACI6B,KAAO2mC,IAAI3mC,KACX4Q,QAAU+1B,IAAI/1B,QACd4pE,WAAa,CAAC,EACd32D,SAAW22D,WAAW32D,SACtB42D,OAASD,WAAW5+E,eACpB8+E,WAAaD,OAAO52D,SACpB82D,qBAAuBD,WAAW7+E,KAAKH,QACvCk/E,QAAU,CAAC,EACXn2D,WAAa,SAAoBo2D,KAQnC,MAAsB,mBAARA,KAA8C,iBAAjBA,IAAI31E,UAA6C,mBAAb21E,IAAInkB,IACrF,EACIokB,SAAW,SAAkBD,KAC/B,OAAc,MAAPA,KAAeA,MAAQA,IAAIz/E,MACpC,EACImB,SAAWnB,OAAOmB,SAClBw+E,0BAA4B,CAC9Br5E,MAAM,EACNs5E,KAAK,EACLC,OAAO,EACPC,UAAU,GAEZ,SAASC,QAAQC,KAAMnP,KAAMp1C,KAE3B,IAAIh6B,EACFgqC,IACAw0C,QAHFxkD,IAAMA,KAAOt6B,UAGEqN,cAAc,UAE7B,GADAyxE,OAAOlgD,KAAOigD,KACVnP,KACF,IAAKpvE,KAAKk+E,2BAWRl0C,IAAMolC,KAAKpvE,IAAMovE,KAAKjgE,cAAgBigE,KAAKjgE,aAAanP,KAEtDw+E,OAAOrgD,aAAan+B,EAAGgqC,KAI7BhQ,IAAIttB,KAAKO,YAAYuxE,QAAQp4E,WAAWq4E,YAAYD,OACtD,CACA,SAASE,OAAOV,KACd,OAAW,MAAPA,IACKA,IAAM,GAIW,WAAnBz4D,UAAUy4D,MAAoC,mBAARA,IAAqBL,WAAW32D,SAAShoB,KAAKg/E,OAAS,SAAWz4D,UAAUy4D,IAC3H,CAKA,IACEW,YAAc,SAEdC,OAAS,SAASA,OAAOx0E,SAAUy0E,SAGjC,OAAO,IAAID,OAAO95E,GAAGg6E,KAAK10E,SAAUy0E,QACtC,EA2UF,SAAS/vD,YAAYkvD,KAKnB,IAAI/9E,SAAW+9E,KAAO,WAAYA,KAAOA,IAAI/9E,OAC3C4E,KAAO65E,OAAOV,KAChB,OAAIp2D,WAAWo2D,OAAQC,SAASD,OAGhB,UAATn5E,MAA+B,IAAX5E,QAAkC,iBAAXA,QAAuBA,OAAS,GAAKA,OAAS,KAAK+9E,IACvG,CACA,SAASpO,SAASh6D,KAAM/S,MACtB,OAAO+S,KAAKg6D,UAAYh6D,KAAKg6D,SAASn1C,gBAAkB53B,KAAK43B,aAC/D,CAxVAmkD,OAAO95E,GAAK85E,OAAO9/E,UAAY,CAE7Bu+E,OAVY,QAWZ13D,YAAai5D,OAEb3+E,OAAQ,EACR2I,QAAS,WACP,OAAO60E,OAAOz+E,KAAKqC,KACrB,EAGAQ,IAAK,SAAak9E,KAEhB,OAAW,MAAPA,IACKtB,OAAOz+E,KAAKqC,MAId09E,IAAM,EAAI19E,KAAK09E,IAAM19E,KAAKpB,QAAUoB,KAAK09E,IAClD,EAGAC,UAAW,SAAmBC,OAE5B,IAAIhuE,IAAM2tE,OAAOM,MAAM79E,KAAKskB,cAAes5D,OAM3C,OAHAhuE,IAAIkuE,WAAa99E,KAGV4P,GACT,EAEAmuE,KAAM,SAAcr9E,UAClB,OAAO68E,OAAOQ,KAAK/9E,KAAMU,SAC3B,EACA4G,IAAK,SAAa5G,UAChB,OAAOV,KAAK29E,UAAUJ,OAAOj2E,IAAItH,MAAM,SAAUuU,KAAM5V,GACrD,OAAO+B,SAAS/C,KAAK4W,KAAM5V,EAAG4V,KAChC,IACF,EACA/M,MAAO,WACL,OAAOxH,KAAK29E,UAAUvB,OAAO3qD,MAAMzxB,KAAMorB,WAC3C,EACA4yD,MAAO,WACL,OAAOh+E,KAAK2kB,GAAG,EACjB,EACA2Q,KAAM,WACJ,OAAOt1B,KAAK2kB,IAAI,EAClB,EACAs5D,KAAM,WACJ,OAAOj+E,KAAK29E,UAAUJ,OAAOW,KAAKl+E,MAAM,SAAUm+E,MAAOx/E,GACvD,OAAQA,EAAI,GAAK,CACnB,IACF,EACAy/E,IAAK,WACH,OAAOp+E,KAAK29E,UAAUJ,OAAOW,KAAKl+E,MAAM,SAAUm+E,MAAOx/E,GACvD,OAAOA,EAAI,CACb,IACF,EACAgmB,GAAI,SAAYhmB,GACd,IAAIupC,IAAMloC,KAAKpB,OACby/E,GAAK1/E,GAAKA,EAAI,EAAIupC,IAAM,GAC1B,OAAOloC,KAAK29E,UAAUU,GAAK,GAAKA,EAAIn2C,IAAM,CAACloC,KAAKq+E,IAAM,GACxD,EACA5oD,IAAK,WACH,OAAOz1B,KAAK89E,YAAc99E,KAAKskB,aACjC,EAGAxiB,KACA0oD,KAAM/hB,IAAI+hB,KACV73C,OAAQ81B,IAAI91B,QAEd4qE,OAAOe,OAASf,OAAO95E,GAAG66E,OAAS,WACjC,IAAIjU,QACF7oE,KACAs7E,IACA5zB,KACAq1B,YACA7lC,MACA/0C,OAASynB,UAAU,IAAM,CAAC,EAC1BzsB,EAAI,EACJC,OAASwsB,UAAUxsB,OACnB4/E,MAAO,EAqBT,IAlBsB,kBAAX76E,SACT66E,KAAO76E,OAGPA,OAASynB,UAAUzsB,IAAM,CAAC,EAC1BA,KAIwB,WAAtBulB,UAAUvgB,SAAyB4iB,WAAW5iB,UAChDA,OAAS,CAAC,GAIRhF,IAAMC,SACR+E,OAAS3D,KACTrB,KAEKA,EAAIC,OAAQD,IAEjB,GAAgC,OAA3B0rE,QAAUj/C,UAAUzsB,IAEvB,IAAK6C,QAAQ6oE,QACXnhB,KAAOmhB,QAAQ7oE,MAIF,cAATA,MAAwBmC,SAAWulD,OAKnCs1B,MAAQt1B,OAASq0B,OAAOkB,cAAcv1B,QAAUq1B,YAAcl3E,MAAM6iB,QAAQg/B,SAC9E4zB,IAAMn5E,OAAOnC,MAIXk3C,MADE6lC,cAAgBl3E,MAAM6iB,QAAQ4yD,KACxB,GACEyB,aAAgBhB,OAAOkB,cAAc3B,KAGvCA,IAFA,CAAC,EAIXyB,aAAc,EAGd56E,OAAOnC,MAAQ+7E,OAAOe,OAAOE,KAAM9lC,MAAOwQ,YAGxB5oD,IAAT4oD,OACTvlD,OAAOnC,MAAQ0nD,OAOvB,OAAOvlD,MACT,EACA45E,OAAOe,OAAO,CAEZI,QAAS,UA5JG,QA4JmBjyE,KAAKmlC,UAAUrqB,QAAQ,MAAO,IAE7Do3D,SAAS,EACTvqE,MAAO,SAAewqE,KACpB,MAAM,IAAIvqE,MAAMuqE,IAClB,EACAC,KAAM,WAAiB,EACvBJ,cAAe,SAAuB9B,KACpC,IAAIp0B,MAAOp7B,KAIX,SAAKwvD,KAA8B,oBAAvBh3D,SAAShoB,KAAKg/E,OAG1Bp0B,MAAQ4zB,SAASQ,QASM,mBADvBxvD,KAAOovD,OAAO5+E,KAAK4qD,MAAO,gBAAkBA,MAAMjkC,cACbk4D,WAAW7+E,KAAKwvB,QAAUsvD,sBACjE,EACAqC,cAAe,SAAuBnC,KACpC,IAAIn7E,KACJ,IAAKA,QAAQm7E,IACX,OAAO,EAET,OAAO,CACT,EAGAoC,WAAY,SAAoB7B,KAAM7S,QAAS1xC,KAC7CskD,QAAQC,KAAM,CACZH,MAAO1S,SAAWA,QAAQ0S,OACzBpkD,IACL,EACAolD,KAAM,SAAcpB,IAAKj8E,UACvB,IAAI9B,OACFD,EAAI,EACN,GAAI8uB,YAAYkvD,KAEd,IADA/9E,OAAS+9E,IAAI/9E,OACND,EAAIC,SACgC,IAArC8B,SAAS/C,KAAKg/E,IAAIh+E,GAAIA,EAAGg+E,IAAIh+E,IADhBA,UAMnB,IAAKA,KAAKg+E,IACR,IAAyC,IAArCj8E,SAAS/C,KAAKg/E,IAAIh+E,GAAIA,EAAGg+E,IAAIh+E,IAC/B,MAIN,OAAOg+E,GACT,EAEA1/C,KAAM,SAAc1oB,MAClB,IAAIw5D,KACFn+D,IAAM,GACNjR,EAAI,EACJqI,SAAWuN,KAAKvN,SAClB,IAAKA,SAEH,KAAO+mE,KAAOx5D,KAAK5V,MAEjBiR,KAAO2tE,OAAOtgD,KAAK8wC,MAGvB,OAAiB,IAAb/mE,UAA+B,KAAbA,SACbuN,KAAK5I,YAEG,IAAb3E,SACKuN,KAAKwkB,gBAAgBptB,YAEb,IAAb3E,UAA+B,IAAbA,SACbuN,KAAKyqE,UAKPpvE,GACT,EAEAqvE,UAAW,SAAmBx2C,IAAK2N,SACjC,IAAIxmC,IAAMwmC,SAAW,GAQrB,OAPW,MAAP3N,MACEhb,YAAYjwB,OAAOirC,MACrB80C,OAAOM,MAAMjuE,IAAoB,iBAAR64B,IAAmB,CAACA,KAAOA,KAEpD3mC,KAAKnE,KAAKiS,IAAK64B,MAGZ74B,GACT,EACAsvE,QAAS,SAAiB3qE,KAAMk0B,IAAK9pC,GACnC,OAAc,MAAP8pC,KAAe,EAAI/1B,QAAQ/U,KAAK8qC,IAAKl0B,KAAM5V,EACpD,EACAwgF,SAAU,SAAkB5qE,MAC1B,IAAI6qE,UAAY7qE,MAAQA,KAAK8qE,aAC3BC,QAAU/qE,OAASA,KAAKE,eAAiBF,MAAMwkB,gBAIjD,OAAQukD,YAAY71D,KAAK23D,WAAaE,SAAWA,QAAQ/Q,UAAY,OACvE,EAGAsP,MAAO,SAAeG,MAAOuB,QAI3B,IAHA,IAAIr3C,KAAOq3C,OAAO3gF,OAChBy/E,EAAI,EACJ1/E,EAAIq/E,MAAMp/E,OACLy/E,EAAIn2C,IAAKm2C,IACdL,MAAMr/E,KAAO4gF,OAAOlB,GAGtB,OADAL,MAAMp/E,OAASD,EACRq/E,KACT,EACAE,KAAM,SAAcN,MAAOl9E,SAAU8+E,QASnC,IARA,IACEC,QAAU,GACV9gF,EAAI,EACJC,OAASg/E,MAAMh/E,OACf8gF,gBAAkBF,OAIb7gF,EAAIC,OAAQD,KACE+B,SAASk9E,MAAMj/E,GAAIA,KACd+gF,gBACtBD,QAAQ39E,KAAK87E,MAAMj/E,IAGvB,OAAO8gF,OACT,EAEAn4E,IAAK,SAAas2E,MAAOl9E,SAAU4sB,KACjC,IAAI1uB,OACF8S,MACA/S,EAAI,EACJiR,IAAM,GAGR,GAAI6d,YAAYmwD,OAEd,IADAh/E,OAASg/E,MAAMh/E,OACRD,EAAIC,OAAQD,IAEJ,OADb+S,MAAQhR,SAASk9E,MAAMj/E,GAAIA,EAAG2uB,OAE5B1d,IAAI9N,KAAK4P,YAMb,IAAK/S,KAAKi/E,MAEK,OADblsE,MAAQhR,SAASk9E,MAAMj/E,GAAIA,EAAG2uB,OAE5B1d,IAAI9N,KAAK4P,OAMf,OAAO2qE,KAAKzsE,IACd,EAEA+vE,KAAM,EAGNjD,UAEoB,mBAAXt4D,SACTm5D,OAAO95E,GAAG2gB,OAAOC,UAAYokB,IAAIrkB,OAAOC,WAI1Ck5D,OAAOQ,KAAK,uEAAuE5iD,MAAM,MAAM,SAAUykD,GAAIp+E,MAC3G86E,WAAW,WAAa96E,KAAO,KAAOA,KAAK43B,aAC7C,IAgBA,IAAIjU,IAAMsjB,IAAItjB,IACVqlC,KAAO/hB,IAAI+hB,KACX73C,OAAS81B,IAAI91B,OACbktE,WAAa,sBACbC,SAAW,IAAIx4D,OAAO,uEAAsE,KAGhGi2D,OAAOn7E,SAAW,SAAUyL,EAAGokC,GAC7B,IAAI8tC,IAAM9tC,GAAKA,EAAEltC,WACjB,OAAO8I,IAAMkyE,QAAUA,KAAwB,IAAjBA,IAAI/4E,YAGlC6G,EAAEzL,SAAWyL,EAAEzL,SAAS29E,KAAOlyE,EAAEmyE,yBAA4D,GAAjCnyE,EAAEmyE,wBAAwBD,MACxF,EAIA,IAAIE,WAAa,+CACjB,SAASC,WAAWj+C,GAAIk+C,aACtB,OAAIA,YAES,OAAPl+C,GACK,IAIFA,GAAGz6B,MAAM,GAAI,GAAK,KAAOy6B,GAAGjQ,WAAWiQ,GAAGrjC,OAAS,GAAG+mB,SAAS,IAAM,IAIvE,KAAOsc,EAChB,CACAs7C,OAAO6C,eAAiB,SAAUC,KAChC,OAAQA,IAAM,IAAI94D,QAAQ04D,WAAYC,WACxC,EACA,IAAII,aAAejiF,SACjBkiF,WAAaz+E,MACf,WACE,IAAInD,EACF6hF,KACAC,iBACAC,UACAC,aAGAtiF,SACA06B,gBACA6nD,eACAC,UACApB,QANA39E,KAAOy+E,WAQP7B,QAAUnB,OAAOmB,QACjBoC,QAAU,EACV14C,KAAO,EACP24C,WAAaC,cACbC,WAAaD,cACbE,cAAgBF,cAChBG,uBAAyBH,cACzBI,UAAY,SAAmBvzE,EAAGokC,GAIhC,OAHIpkC,IAAMokC,IACR0uC,cAAe,GAEV,CACT,EACAU,SAAW,6HAIXxyE,WAAa,oFAEb5G,WAAa,2BAA4B4G,WAAa,OAASgxE,WAE/D,gBAAkBA,WAElB,2DAA6DhxE,WAAa,OAASgxE,WAAa,OAChGyB,QAAU,KAAOzyE,WAAP,wFAKmB5G,WALnB,eASVs5E,YAAc,IAAIj6D,OAAOu4D,WAAa,IAAK,KAC3C2B,OAAS,IAAIl6D,OAAO,8CACpBm6D,mBAAqB,IAAIn6D,OAAO,wEAChCo6D,SAAW,IAAIp6D,OAAOu4D,WAAa,MACnC8B,QAAU,IAAIr6D,OAAOg6D,SACrBM,YAAc,IAAIt6D,OAAO,IAAMzY,WAAa,KAC5CgzE,UAAY,CACVC,GAAI,IAAIx6D,OAAO,MAAQzY,WAAa,KACpCkzE,MAAO,IAAIz6D,OAAO,QAAUzY,WAAa,KACzCmzE,IAAK,IAAI16D,OAAO,KAAOzY,WAAa,SACpCozE,KAAM,IAAI36D,OAAO,IAAMrf,YACvBi6E,OAAQ,IAAI56D,OAAO,IAAMg6D,SACzBa,MAAO,IAAI76D,OAAO,4LAAyL,KAC3M86D,KAAM,IAAI96D,OAAO,OAAS+5D,SAAW,KAAM,KAG3CgB,aAAc,IAAI/6D,OAAO,6IAA2I,MAEtKg7D,QAAU,sCACVC,QAAU,SAEVC,WAAa,mCACbC,SAAW,OAGXC,UAAY,IAAIp7D,OAAO,8DAA8D,KACrFq7D,UAAY,SAAmBC,OAAQC,QACrC,IAAIv9B,KAAO,KAAOs9B,OAAOp7E,MAAM,GAAK,MACpC,OAAIq7E,SASGv9B,KAAO,EAAI75C,OAAOggE,aAAanmB,KAAO,OAAW75C,OAAOggE,aAAanmB,MAAQ,GAAK,MAAe,KAAPA,KAAe,OAClH,EAKAw9B,cAAgB,WACdC,aACF,EACAC,mBAAqBC,eAAc,SAAU1uE,MAC3C,OAAyB,IAAlBA,KAAK2uE,UAAqB3U,SAASh6D,KAAM,WAClD,GAAG,CACD4uE,IAAK,aACLC,KAAM,WAaV,IACEthF,KAAK2vB,MAAMgX,IAAM2zC,OAAOz+E,KAAK2iF,aAAa+C,YAAa/C,aAAa+C,YAKpE56C,IAAI63C,aAAa+C,WAAWzkF,QAAQoI,QACtC,CAAE,MAAO5I,GACP0D,KAAO,CACL2vB,MAAO,SAAe9tB,OAAQ2/E,KAC5B/C,WAAW9uD,MAAM9tB,OAAQy4E,OAAOz+E,KAAK2lF,KACvC,EACA3lF,KAAM,SAAcgG,QAClB48E,WAAW9uD,MAAM9tB,OAAQy4E,OAAOz+E,KAAKytB,UAAW,GAClD,EAEJ,CACA,SAAS8J,KAAKnsB,SAAUy0E,QAASpnC,QAASmtC,MACxC,IAAI54E,EACFhM,EACA4V,KACAivE,IACAvxD,MACAwxD,OACAC,YACAC,WAAanG,SAAWA,QAAQ/oE,cAEhCzN,SAAWw2E,QAAUA,QAAQx2E,SAAW,EAI1C,GAHAovC,QAAUA,SAAW,GAGG,iBAAbrtC,WAA0BA,UAAyB,IAAb/B,UAA+B,IAAbA,UAA+B,KAAbA,SACnF,OAAOovC,QAIT,IAAKmtC,OACHR,YAAYvF,SACZA,QAAUA,SAAWn/E,SACjBuiF,gBAAgB,CAGlB,GAAiB,KAAb55E,WAAoBirB,MAAQuwD,WAAW/zE,KAAK1F,WAE9C,GAAI4B,EAAIsnB,MAAM,IAEZ,GAAiB,IAAbjrB,SAAgB,CAClB,KAAIuN,KAAOipE,QAAQoG,eAAej5E,IAQhC,OAAOyrC,QALP,GAAI7hC,KAAKvE,KAAOrF,EAEd,OADA7I,KAAKnE,KAAKy4C,QAAS7hC,MACZ6hC,OAOb,MAGE,GAAIutC,aAAepvE,KAAOovE,WAAWC,eAAej5E,KAAOuqB,KAAK9yB,SAASo7E,QAASjpE,OAASA,KAAKvE,KAAOrF,EAErG,OADA7I,KAAKnE,KAAKy4C,QAAS7hC,MACZ6hC,YAKN,IAAInkB,MAAM,GAEf,OADAnwB,KAAK2vB,MAAM2kB,QAASonC,QAAQ3jD,qBAAqB9wB,WAC1CqtC,QAGF,IAAKzrC,EAAIsnB,MAAM,KAAOurD,QAAQqG,uBAEnC,OADA/hF,KAAK2vB,MAAM2kB,QAASonC,QAAQqG,uBAAuBl5E,IAC5CyrC,OACT,CAIF,KAAK+qC,uBAAuBp4E,SAAW,MAAU83E,WAAcA,UAAUp5D,KAAK1e,WAAY,CAWxF,GAVA26E,YAAc36E,SACd46E,WAAanG,QASI,IAAbx2E,WAAmB06E,SAASj6D,KAAK1e,WAAa04E,mBAAmBh6D,KAAK1e,WAAY,CAsBpF,KApBA46E,WAAalB,SAASh7D,KAAK1e,WAAa+6E,YAAYtG,QAAQz4E,aAAey4E,UAQzDA,SAAYd,QAAQqH,SAEhCP,IAAMhG,QAAQ1vE,aAAa,OAC7B01E,IAAMjG,OAAO6C,eAAeoD,KAE5BhG,QAAQ1gD,aAAa,KAAM0mD,IAAM9E,UAMrC//E,GADA8kF,OAASO,SAASj7E,WACPnK,OACJD,KACL8kF,OAAO9kF,IAAM6kF,IAAM,IAAMA,IAAM,UAAY,IAAMS,WAAWR,OAAO9kF,IAErE+kF,YAAcD,OAAOhmD,KAAK,IAC5B,CACA,IAEE,OADA37B,KAAK2vB,MAAM2kB,QAASutC,WAAWl6E,iBAAiBi6E,cACzCttC,OACT,CAAE,MAAO8tC,UACP/C,uBAAuBp4E,UAAU,EACnC,CAAE,QACIy6E,MAAQ9E,SACVlB,QAAQ2G,gBAAgB,KAE5B,CACF,CACF,CAIF,OAAOC,OAAOr7E,SAASwe,QAAQu4D,SAAU,MAAOtC,QAASpnC,QAASmtC,KACpE,CAQA,SAASvC,cACP,IAAIr6D,KAAO,GAUX,OATA,SAAS+K,MAAM/f,IAAKD,OAOlB,OAJIiV,KAAK7kB,KAAK6P,IAAM,KAAO6uE,KAAK6D,oBAEvB3yD,MAAM/K,KAAK29D,SAEb5yD,MAAM/f,IAAM,KAAOD,KAC5B,CAEF,CAMA,SAAS6yE,aAAa9gF,IAEpB,OADAA,GAAGi7E,UAAW,EACPj7E,EACT,CAMA,SAAS+gF,OAAO/gF,IACd,IAAIkG,GAAKtL,SAASqN,cAAc,YAChC,IACE,QAASjI,GAAGkG,GACd,CAAE,MAAOvL,GACP,OAAO,CACT,CAAE,QAEIuL,GAAG5E,YACL4E,GAAG5E,WAAWq4E,YAAYzzE,IAI5BA,GAAK,IACP,CACF,CAMA,SAAS86E,kBAAkBjhF,MACzB,OAAO,SAAU+Q,MACf,OAAOg6D,SAASh6D,KAAM,UAAYA,KAAK/Q,OAASA,IAClD,CACF,CAMA,SAASkhF,mBAAmBlhF,MAC1B,OAAO,SAAU+Q,MACf,OAAQg6D,SAASh6D,KAAM,UAAYg6D,SAASh6D,KAAM,YAAcA,KAAK/Q,OAASA,IAChF,CACF,CAMA,SAASmhF,qBAAqBzB,UAE5B,OAAO,SAAU3uE,MAIf,MAAI,SAAUA,KAQRA,KAAKxP,aAAgC,IAAlBwP,KAAK2uE,SAEtB,UAAW3uE,KACT,UAAWA,KAAKxP,WACXwP,KAAKxP,WAAWm+E,WAAaA,SAE7B3uE,KAAK2uE,WAAaA,SAMtB3uE,KAAKqwE,aAAe1B,UAE3B3uE,KAAKqwE,cAAgB1B,UAAYF,mBAAmBzuE,QAAU2uE,SAEzD3uE,KAAK2uE,WAAaA,SAKhB,UAAW3uE,MACbA,KAAK2uE,WAAaA,QAK7B,CACF,CAMA,SAAS2B,uBAAuBphF,IAC9B,OAAO8gF,cAAa,SAAUO,UAE5B,OADAA,UAAYA,SACLP,cAAa,SAAUhB,KAAM9D,SAMlC,IALA,IAAIpB,EACF0G,aAAethF,GAAG,GAAI8/E,KAAK3kF,OAAQkmF,UACnCnmF,EAAIomF,aAAanmF,OAGZD,KACD4kF,KAAKlF,EAAI0G,aAAapmF,MACxB4kF,KAAKlF,KAAOoB,QAAQpB,GAAKkF,KAAKlF,IAGpC,GACF,GACF,CAOA,SAASyF,YAAYtG,SACnB,OAAOA,cAAmD,IAAjCA,QAAQ3jD,sBAAwC2jD,OAC3E,CAOA,SAASuF,YAAYhV,MACnB,IAAIiX,UACFrsD,IAAMo1C,KAAOA,KAAKt5D,eAAiBs5D,KAAOuS,aAO5C,OAAI3nD,KAAOt6B,UAA6B,IAAjBs6B,IAAI3xB,UAAmB2xB,IAAII,iBAMlDA,iBADA16B,SAAWs6B,KACgBI,gBAC3B6nD,gBAAkBrD,OAAO4B,SAAS9gF,UAIlCohF,QAAU1mD,gBAAgB0mD,SAAW1mD,gBAAgBksD,uBAAyBlsD,gBAAgBmsD,kBAO1FnsD,gBAAgBmsD,mBAKpB5E,cAAgBjiF,WAAa2mF,UAAY3mF,SAAS8mF,cAAgBH,UAAUI,MAAQJ,WAElFA,UAAUhhF,iBAAiB,SAAU8+E,eAOvCpG,QAAQ2I,QAAUb,QAAO,SAAU76E,IAEjC,OADAovB,gBAAgBntB,YAAYjC,IAAIqG,GAAKutE,OAAOmB,SACpCrgF,SAASinF,oBAAsBjnF,SAASinF,kBAAkB/H,OAAOmB,SAAS9/E,MACpF,IAKA89E,QAAQ6I,kBAAoBf,QAAO,SAAU76E,IAC3C,OAAO81E,QAAQ9hF,KAAKgM,GAAI,IAC1B,IAIA+yE,QAAQqH,MAAQS,QAAO,WACrB,OAAOnmF,SAASoL,iBAAiB,SACnC,IAWAizE,QAAQ8I,OAAShB,QAAO,WACtB,IAEE,OADAnmF,SAASkI,cAAc,oBAChB,CACT,CAAE,MAAOnI,GACP,OAAO,CACT,CACF,IAGIs+E,QAAQ2I,SACV7E,KAAK/4E,OAAOq6E,GAAK,SAAU9xE,IACzB,IAAIy1E,OAASz1E,GAAGuX,QAAQm7D,UAAWC,WACnC,OAAO,SAAUpuE,MACf,OAAOA,KAAKzG,aAAa,QAAU23E,MACrC,CACF,EACAjF,KAAKtrD,KAAK4sD,GAAK,SAAU9xE,GAAIwtE,SAC3B,QAAsC,IAA3BA,QAAQoG,gBAAkChD,eAAgB,CACnE,IAAIrsE,KAAOipE,QAAQoG,eAAe5zE,IAClC,OAAOuE,KAAO,CAACA,MAAQ,EACzB,CACF,IAEAisE,KAAK/4E,OAAOq6E,GAAK,SAAU9xE,IACzB,IAAIy1E,OAASz1E,GAAGuX,QAAQm7D,UAAWC,WACnC,OAAO,SAAUpuE,MACf,IAAIw5D,UAAwC,IAA1Bx5D,KAAKmxE,kBAAoCnxE,KAAKmxE,iBAAiB,MACjF,OAAO3X,MAAQA,KAAKr8D,QAAU+zE,MAChC,CACF,EAIAjF,KAAKtrD,KAAK4sD,GAAK,SAAU9xE,GAAIwtE,SAC3B,QAAsC,IAA3BA,QAAQoG,gBAAkChD,eAAgB,CACnE,IAAI7S,KACFpvE,EACAi/E,MACArpE,KAAOipE,QAAQoG,eAAe5zE,IAChC,GAAIuE,KAAM,CAGR,IADAw5D,KAAOx5D,KAAKmxE,iBAAiB,QACjB3X,KAAKr8D,QAAU1B,GACzB,MAAO,CAACuE,MAMV,IAFAqpE,MAAQJ,QAAQ8H,kBAAkBt1E,IAClCrR,EAAI,EACG4V,KAAOqpE,MAAMj/E,MAElB,IADAovE,KAAOx5D,KAAKmxE,iBAAiB,QACjB3X,KAAKr8D,QAAU1B,GACzB,MAAO,CAACuE,KAGd,CACA,MAAO,EACT,CACF,GAIFisE,KAAKtrD,KAAK8sD,IAAM,SAAU97D,IAAKs3D,SAC7B,YAA4C,IAAjCA,QAAQ3jD,qBACV2jD,QAAQ3jD,qBAAqB3T,KAI7Bs3D,QAAQ/zE,iBAAiByc,IAEpC,EAGAs6D,KAAKtrD,KAAK6sD,MAAQ,SAAU4D,UAAWnI,SACrC,QAA8C,IAAnCA,QAAQqG,wBAA0CjD,eAC3D,OAAOpD,QAAQqG,uBAAuB8B,UAE1C,EAOA9E,UAAY,GAIZ2D,QAAO,SAAU76E,IACf,IAAIq/C,MACJjwB,gBAAgBntB,YAAYjC,IAAIqvB,UAAY,UAAY0lD,QAAZ,iDAA8EA,QAA9E,oEAIvC/0E,GAAGF,iBAAiB,cAAc7K,QACrCiiF,UAAU/+E,KAAK,mCAAoCu/E,SAAW,KAI3D13E,GAAGF,iBAAiB,QAAUi1E,QAAU,MAAM9/E,QACjDiiF,UAAU/+E,KAAK,MAMZ6H,GAAGF,iBAAiB,KAAOi1E,QAAU,MAAM9/E,QAC9CiiF,UAAU/+E,KAAK,YAOZ6H,GAAGF,iBAAiB,YAAY7K,QACnCiiF,UAAU/+E,KAAK,aAKjBknD,MAAQ3qD,SAASqN,cAAc,UACzBoxB,aAAa,OAAQ,UAC3BnzB,GAAGiC,YAAYo9C,OAAOlsB,aAAa,OAAQ,KAQ3C/D,gBAAgBntB,YAAYjC,IAAIu5E,UAAW,EACK,IAA5Cv5E,GAAGF,iBAAiB,aAAa7K,QACnCiiF,UAAU/+E,KAAK,WAAY,cAQ7BknD,MAAQ3qD,SAASqN,cAAc,UACzBoxB,aAAa,OAAQ,IAC3BnzB,GAAGiC,YAAYo9C,OACVr/C,GAAGF,iBAAiB,aAAa7K,QACpCiiF,UAAU/+E,KAAK,kFAEnB,IACK46E,QAAQ8I,QAOX3E,UAAU/+E,KAAK,QAEjB++E,UAAYA,UAAUjiF,QAAU,IAAI0oB,OAAOu5D,UAAUpjD,KAAK,MAM1D2jD,UAAY,SAAmBvzE,EAAGokC,GAEhC,GAAIpkC,IAAMokC,EAER,OADA0uC,cAAe,EACR,EAIT,IAAIiF,SAAW/3E,EAAEmyE,yBAA2B/tC,EAAE+tC,wBAC9C,OAAI4F,UAcU,GALdA,SAAW/3E,EAAE4G,eAAiB5G,KAAOokC,EAAEx9B,eAAiBw9B,GAAKpkC,EAAEmyE,wBAAwB/tC,GAEvF,KAGoByqC,QAAQmJ,cAAgB5zC,EAAE+tC,wBAAwBnyE,KAAO+3E,QAMvE/3E,IAAMxP,UAAYwP,EAAE4G,eAAiB6rE,cAAgBprD,KAAK9yB,SAASk+E,aAAczyE,IAC3E,EAONokC,IAAM5zC,UAAY4zC,EAAEx9B,eAAiB6rE,cAAgBprD,KAAK9yB,SAASk+E,aAAcruC,GAC5E,EAIFyuC,UAAYhuE,QAAQ/U,KAAK+iF,UAAW7yE,GAAK6E,QAAQ/U,KAAK+iF,UAAWzuC,GAAK,EAE9D,EAAV2zC,SAAe,EAAI,EAC5B,EACOvnF,UA3QEA,QA4QX,CAkhBA,IAAKM,KAjhBLu2B,KAAKuqD,QAAU,SAAUqG,KAAM1kB,UAC7B,OAAOlsC,KAAK4wD,KAAM,KAAM,KAAM1kB,SAChC,EACAlsC,KAAK6wD,gBAAkB,SAAUxxE,KAAMuxE,MAErC,GADA/C,YAAYxuE,MACRqsE,iBAAmBO,uBAAuB2E,KAAO,QAAUjF,YAAcA,UAAUp5D,KAAKq+D,OAC1F,IACE,IAAIl2E,IAAM6vE,QAAQ9hF,KAAK4W,KAAMuxE,MAG7B,GAAIl2E,KAAO8sE,QAAQ6I,mBAGnBhxE,KAAKlW,UAAuC,KAA3BkW,KAAKlW,SAAS2I,SAC7B,OAAO4I,GAEX,CAAE,MAAOxR,GACP+iF,uBAAuB2E,MAAM,EAC/B,CAEF,OAAO5wD,KAAK4wD,KAAMznF,SAAU,KAAM,CAACkW,OAAO3V,OAAS,CACrD,EACAs2B,KAAK9yB,SAAW,SAAUo7E,QAASjpE,MASjC,OAHKipE,QAAQ/oE,eAAiB+oE,UAAYn/E,UACxC0kF,YAAYvF,SAEPD,OAAOn7E,SAASo7E,QAASjpE,KAClC,EACA2gB,KAAK8wD,KAAO,SAAUzxE,KAAM/S,OAMrB+S,KAAKE,eAAiBF,OAASlW,UAClC0kF,YAAYxuE,MAEd,IAAI9Q,GAAK+8E,KAAKyF,WAAWzkF,KAAK43B,eAE5BuP,IAAMllC,IAAM84E,OAAO5+E,KAAK6iF,KAAKyF,WAAYzkF,KAAK43B,eAAiB31B,GAAG8Q,KAAM/S,MAAOo/E,qBAAkBtgF,EACnG,YAAYA,IAARqoC,IACKA,IAEFp0B,KAAKzG,aAAatM,KAC3B,EACA0zB,KAAK9gB,MAAQ,SAAUwqE,KACrB,MAAM,IAAIvqE,MAAM,0CAA4CuqE,IAC9D,EAMArB,OAAO2I,WAAa,SAAU9vC,SAC5B,IAAI7hC,KACF4xE,WAAa,GACb9H,EAAI,EACJ1/E,EAAI,EAUN,GAHAgiF,cAAgBjE,QAAQ0J,WACxB1F,WAAahE,QAAQ0J,YAAchK,OAAOz+E,KAAKy4C,QAAS,GACxDoU,KAAK7sD,KAAKy4C,QAASgrC,WACfT,aAAc,CAChB,KAAOpsE,KAAO6hC,QAAQz3C,MAChB4V,OAAS6hC,QAAQz3C,KACnB0/E,EAAI8H,WAAWrkF,KAAKnD,IAGxB,KAAO0/E,KACL1rE,OAAOhV,KAAKy4C,QAAS+vC,WAAW9H,GAAI,EAExC,CAKA,OADAqC,UAAY,KACLtqC,OACT,EACAmnC,OAAO95E,GAAGyiF,WAAa,WACrB,OAAOlmF,KAAK29E,UAAUJ,OAAO2I,WAAW9J,OAAO3qD,MAAMzxB,OACvD,EACAwgF,KAAOjD,OAAOuI,KAAO,CAEnBzB,YAAa,GACbgC,aAAc9B,aACdtyD,MAAO4vD,UACPoE,WAAY,CAAC,EACb/wD,KAAM,CAAC,EACPoxD,SAAU,CACR,IAAK,CACHnD,IAAK,aACLnF,OAAO,GAET,IAAK,CACHmF,IAAK,cAEP,IAAK,CACHA,IAAK,kBACLnF,OAAO,GAET,IAAK,CACHmF,IAAK,oBAGToD,UAAW,CACTtE,KAAM,SAAchwD,OAQlB,OAPAA,MAAM,GAAKA,MAAM,GAAG1K,QAAQm7D,UAAWC,WAGvC1wD,MAAM,IAAMA,MAAM,IAAMA,MAAM,IAAMA,MAAM,IAAM,IAAI1K,QAAQm7D,UAAWC,WACtD,OAAb1wD,MAAM,KACRA,MAAM,GAAK,IAAMA,MAAM,GAAK,KAEvBA,MAAMzqB,MAAM,EAAG,EACxB,EACA26E,MAAO,SAAelwD,OA2BpB,OAhBAA,MAAM,GAAKA,MAAM,GAAGmH,cACS,QAAzBnH,MAAM,GAAGzqB,MAAM,EAAG,IAEfyqB,MAAM,IACTiD,KAAK9gB,MAAM6d,MAAM,IAKnBA,MAAM,KAAOA,MAAM,GAAKA,MAAM,IAAMA,MAAM,IAAM,GAAK,GAAkB,SAAbA,MAAM,IAA8B,QAAbA,MAAM,KACvFA,MAAM,KAAOA,MAAM,GAAKA,MAAM,IAAmB,QAAbA,MAAM,KAGjCA,MAAM,IACfiD,KAAK9gB,MAAM6d,MAAM,IAEZA,KACT,EACAiwD,OAAQ,SAAgBjwD,OACtB,IAAIu0D,OACFC,UAAYx0D,MAAM,IAAMA,MAAM,GAChC,OAAI4vD,UAAUM,MAAM16D,KAAKwK,MAAM,IACtB,MAILA,MAAM,GACRA,MAAM,GAAKA,MAAM,IAAMA,MAAM,IAAM,GAG1Bw0D,UAAY9E,QAAQl6D,KAAKg/D,YAEpCD,OAASxC,SAASyC,UAAU,MAE5BD,OAASC,SAAS/zE,QAAQ,IAAK+zE,SAAS7nF,OAAS4nF,QAAUC,SAAS7nF,UAElEqzB,MAAM,GAAKA,MAAM,GAAGzqB,MAAM,EAAGg/E,QAC7Bv0D,MAAM,GAAKw0D,SAASj/E,MAAM,EAAGg/E,SAIxBv0D,MAAMzqB,MAAM,EAAG,GACxB,GAEFC,OAAQ,CACNu6E,IAAK,SAAa0E,kBAChB,IAAIC,iBAAmBD,iBAAiBn/D,QAAQm7D,UAAWC,WAAWvpD,cACtE,MAA4B,MAArBstD,iBAA2B,WAChC,OAAO,CACT,EAAI,SAAUnyE,MACZ,OAAOg6D,SAASh6D,KAAMoyE,iBACxB,CACF,EACA5E,MAAO,SAAe4D,WACpB,IAAIiB,QAAU7F,WAAW4E,UAAY,KACrC,OAAOiB,UAAYA,QAAU,IAAIt/D,OAAO,0BAA2Bq+D,UAAY,IAAM9F,WAAa,SAAWkB,WAAW4E,WAAW,SAAUpxE,MAC3I,OAAOqyE,QAAQn/D,KAA+B,iBAAnBlT,KAAKoxE,WAA0BpxE,KAAKoxE,gBAA0C,IAAtBpxE,KAAKzG,cAAgCyG,KAAKzG,aAAa,UAAY,GACxJ,GACF,EACAm0E,KAAM,SAAczgF,KAAMqlF,SAAUC,OAClC,OAAO,SAAUvyE,MACf,IAAImQ,OAASwQ,KAAK8wD,KAAKzxE,KAAM/S,MAC7B,OAAc,MAAVkjB,OACkB,OAAbmiE,UAEJA,WAGLniE,QAAU,GACO,MAAbmiE,SACKniE,SAAWoiE,MAEH,OAAbD,SACKniE,SAAWoiE,MAEH,OAAbD,SACKC,OAAmC,IAA1BpiE,OAAOhS,QAAQo0E,OAEhB,OAAbD,SACKC,OAASpiE,OAAOhS,QAAQo0E,QAAU,EAE1B,OAAbD,SACKC,OAASpiE,OAAOld,OAAOs/E,MAAMloF,UAAYkoF,MAEjC,OAAbD,UACM,IAAMniE,OAAO6C,QAAQg6D,YAAa,KAAO,KAAK7uE,QAAQo0E,QAAU,EAEzD,OAAbD,WACKniE,SAAWoiE,OAASpiE,OAAOld,MAAM,EAAGs/E,MAAMloF,OAAS,KAAOkoF,MAAQ,KAG7E,CACF,EACA3E,MAAO,SAAe3+E,KAAMujF,KAAMC,UAAWhJ,MAAO1oD,MAClD,IAAI2xD,OAA8B,QAArBzjF,KAAKgE,MAAM,EAAG,GACzB0/E,QAA6B,SAAnB1jF,KAAKgE,OAAO,GACtB2/E,OAAkB,YAATJ,KACX,OAAiB,IAAV/I,OAAwB,IAAT1oD,KAEtB,SAAU/gB,MACR,QAASA,KAAKxP,UAChB,EAAI,SAAUwP,KAAM6yE,SAAUlwD,KAC5B,IAAIxF,MACF21D,WACAtZ,KACAuZ,UACA9xD,MACA2tD,IAAM8D,SAAWC,QAAU,cAAgB,kBAC3C1yE,OAASD,KAAKxP,WACdvD,KAAO2lF,QAAU5yE,KAAKg6D,SAASn1C,cAC/BmuD,UAAYrwD,MAAQiwD,OACpBK,MAAO,EACT,GAAIhzE,OAAQ,CAEV,GAAIyyE,OAAQ,CACV,KAAO9D,KAAK,CAEV,IADApV,KAAOx5D,KACAw5D,KAAOA,KAAKoV,MACjB,GAAIgE,OAAS5Y,SAASR,KAAMvsE,MAA0B,IAAlBusE,KAAK/mE,SACvC,OAAO,EAKXwuB,MAAQ2tD,IAAe,SAAT3/E,OAAoBgyB,OAAS,aAC7C,CACA,OAAO,CACT,CAIA,GAHAA,MAAQ,CAAC0xD,QAAU1yE,OAAO25D,WAAa35D,OAAOizE,WAG1CP,SAAWK,UAOb,IAFAC,MADAF,WADA51D,OADA21D,WAAa7yE,OAAOkqE,WAAalqE,OAAOkqE,SAAW,CAAC,IACjCl7E,OAAS,IACV,KAAOs9E,SAAWpvD,MAAM,KACtBA,MAAM,GAC1Bq8C,KAAOuZ,WAAa9yE,OAAO6uE,WAAWiE,WAC/BvZ,OAASuZ,WAAavZ,MAAQA,KAAKoV,OAE1CqE,KAAOF,UAAY,IAAM9xD,MAAMrQ,OAE7B,GAAsB,IAAlB4oD,KAAK/mE,YAAoBwgF,MAAQzZ,OAASx5D,KAAM,CAClD8yE,WAAW7jF,MAAQ,CAACs9E,QAASwG,UAAWE,MACxC,KACF,OAaF,GATID,WAIFC,KADAF,WADA51D,OADA21D,WAAa9yE,KAAKmqE,WAAanqE,KAAKmqE,SAAW,CAAC,IAC7Bl7E,OAAS,IACV,KAAOs9E,SAAWpvD,MAAM,KAM/B,IAAT81D,KAEF,MAAOzZ,OAASuZ,WAAavZ,MAAQA,KAAKoV,OAASqE,KAAOF,UAAY,IAAM9xD,MAAMrQ,WAC3EgiE,OAAS5Y,SAASR,KAAMvsE,MAA0B,IAAlBusE,KAAK/mE,cAAqBwgF,OAEzDD,YACFF,WAAatZ,KAAK2Q,WAAa3Q,KAAK2Q,SAAW,CAAC,IACrCl7E,MAAQ,CAACs9E,QAAS0G,OAE3BzZ,OAASx5D,SAUrB,OADAizE,MAAQlyD,QACQ0oD,OAASwJ,KAAOxJ,OAAU,GAAKwJ,KAAOxJ,OAAS,CACjE,CACF,CACF,EACAkE,OAAQ,SAAgBwF,OAAQ5C,UAK9B,IAAItzD,KACF/tB,GAAK+8E,KAAKc,QAAQoG,SAAWlH,KAAKmH,WAAWD,OAAOtuD,gBAAkBlE,KAAK9gB,MAAM,uBAAyBszE,QAK5G,OAAIjkF,GAAGi7E,SACEj7E,GAAGqhF,UAIRrhF,GAAG7E,OAAS,GACd4yB,KAAO,CAACk2D,OAAQA,OAAQ,GAAI5C,UACrBtE,KAAKmH,WAAWjqF,eAAegqF,OAAOtuD,eAAiBmrD,cAAa,SAAUhB,KAAM9D,SAIzF,IAHA,IAAIrW,IACFwe,QAAUnkF,GAAG8/E,KAAMuB,UACnBnmF,EAAIipF,QAAQhpF,OACPD,KAEL4kF,KADAna,IAAM12D,QAAQ/U,KAAK4lF,KAAMqE,QAAQjpF,OACnB8gF,QAAQrW,KAAOwe,QAAQjpF,GAEzC,IAAK,SAAU4V,MACb,OAAO9Q,GAAG8Q,KAAM,EAAGid,KACrB,GAEK/tB,EACT,GAEF69E,QAAS,CAEPuG,IAAKtD,cAAa,SAAUx7E,UAI1B,IAAIigD,MAAQ,GACV5S,QAAU,GACV0xC,QAAUC,QAAQh/E,SAASwe,QAAQu4D,SAAU,OAC/C,OAAOgI,QAAQpJ,SAAW6F,cAAa,SAAUhB,KAAM9D,QAAS2H,SAAUlwD,KAMxE,IALA,IAAI3iB,KACFyzE,UAAYF,QAAQvE,KAAM,KAAMrsD,IAAK,IACrCv4B,EAAI4kF,KAAK3kF,OAGJD,MACD4V,KAAOyzE,UAAUrpF,MACnB4kF,KAAK5kF,KAAO8gF,QAAQ9gF,GAAK4V,MAG/B,IAAK,SAAUA,KAAM6yE,SAAUlwD,KAO7B,OANA8xB,MAAM,GAAKz0C,KACXuzE,QAAQ9+B,MAAO,KAAM9xB,IAAKkf,SAI1B4S,MAAM,GAAK,MACH5S,QAAQjxB,KAClB,CACF,IACA5kB,IAAKgkF,cAAa,SAAUx7E,UAC1B,OAAO,SAAUwL,MACf,OAAO2gB,KAAKnsB,SAAUwL,MAAM3V,OAAS,CACvC,CACF,IACAwD,SAAUmiF,cAAa,SAAUtnD,MAE/B,OADAA,KAAOA,KAAK1V,QAAQm7D,UAAWC,WACxB,SAAUpuE,MACf,OAAQA,KAAK5I,aAAe4xE,OAAOtgD,KAAK1oB,OAAO7B,QAAQuqB,OAAS,CAClE,CACF,IAQA07B,KAAM4rB,cAAa,SAAU5rB,MAM3B,OAJKipB,YAAYn6D,KAAKkxC,MAAQ,KAC5BzjC,KAAK9gB,MAAM,qBAAuBukD,MAEpCA,KAAOA,KAAKpxC,QAAQm7D,UAAWC,WAAWvpD,cACnC,SAAU7kB,MACf,IAAI0zE,SACJ,GACE,GAAIA,SAAWrH,eAAiBrsE,KAAKokD,KAAOpkD,KAAKzG,aAAa,aAAeyG,KAAKzG,aAAa,QAE7F,OADAm6E,SAAWA,SAAS7uD,iBACAu/B,MAAyC,IAAjCsvB,SAASv1E,QAAQimD,KAAO,YAE9CpkD,KAAOA,KAAKxP,aAAiC,IAAlBwP,KAAKvN,UAC1C,OAAO,CACT,CACF,IAEArD,OAAQ,SAAgB4Q,MACtB,IAAI2zE,KAAOhrF,OAAOm1D,UAAYn1D,OAAOm1D,SAAS61B,KAC9C,OAAOA,MAAQA,KAAK1gF,MAAM,KAAO+M,KAAKvE,EACxC,EACAsV,KAAM,SAAc/Q,MAClB,OAAOA,OAASwkB,eAClB,EACAovD,MAAO,SAAe5zE,MACpB,OAAOA,OAz+Bb,WACE,IACE,OAAOlW,SAAS+pF,aAClB,CAAE,MAAOt/C,KAAM,CACjB,CAq+BsBu/C,IAAuBhqF,SAASiqF,eAAiB/zE,KAAK/Q,MAAQ+Q,KAAKg0E,OAASh0E,KAAKi0E,SACnG,EAEAC,QAAS9D,sBAAqB,GAC9BzB,SAAUyB,sBAAqB,GAC/B+D,QAAS,SAAiBn0E,MAGxB,OAAOg6D,SAASh6D,KAAM,YAAcA,KAAKm0E,SAAWna,SAASh6D,KAAM,aAAeA,KAAKo0E,QACzF,EACAA,SAAU,SAAkBp0E,MAS1B,OAJIA,KAAKxP,YAEPwP,KAAKxP,WAAW6jF,eAEO,IAAlBr0E,KAAKo0E,QACd,EAEAE,MAAO,SAAet0E,MAKpB,IAAKA,KAAOA,KAAK45D,WAAY55D,KAAMA,KAAOA,KAAKk6D,YAC7C,GAAIl6D,KAAKvN,SAAW,EAClB,OAAO,EAGX,OAAO,CACT,EACAwN,OAAQ,SAAgBD,MACtB,OAAQisE,KAAKc,QAAQuH,MAAMt0E,KAC7B,EAEAu0E,OAAQ,SAAgBv0E,MACtB,OAAOguE,QAAQ96D,KAAKlT,KAAKg6D,SAC3B,EACAvlB,MAAO,SAAez0C,MACpB,OAAO+tE,QAAQ76D,KAAKlT,KAAKg6D,SAC3B,EACAthE,OAAQ,SAAgBsH,MACtB,OAAOg6D,SAASh6D,KAAM,UAA0B,WAAdA,KAAK/Q,MAAqB+qE,SAASh6D,KAAM,SAC7E,EACA0oB,KAAM,SAAc1oB,MAClB,IAAIyxE,KACJ,OAAOzX,SAASh6D,KAAM,UAA0B,SAAdA,KAAK/Q,OAID,OAArCwiF,KAAOzxE,KAAKzG,aAAa,UAA2C,SAAvBk4E,KAAK5sD,cACrD,EAEA4kD,MAAO6G,wBAAuB,WAC5B,MAAO,CAAC,EACV,IACAvvD,KAAMuvD,wBAAuB,SAAUkE,cAAenqF,QACpD,MAAO,CAACA,OAAS,EACnB,IACA+lB,GAAIkgE,wBAAuB,SAAUkE,cAAenqF,OAAQkmF,UAC1D,MAAO,CAACA,SAAW,EAAIA,SAAWlmF,OAASkmF,SAC7C,IACA7G,KAAM4G,wBAAuB,SAAUE,aAAcnmF,QAEnD,IADA,IAAID,EAAI,EACDA,EAAIC,OAAQD,GAAK,EACtBomF,aAAajjF,KAAKnD,GAEpB,OAAOomF,YACT,IACA3G,IAAKyG,wBAAuB,SAAUE,aAAcnmF,QAElD,IADA,IAAID,EAAI,EACDA,EAAIC,OAAQD,GAAK,EACtBomF,aAAajjF,KAAKnD,GAEpB,OAAOomF,YACT,IACAtyE,GAAIoyE,wBAAuB,SAAUE,aAAcnmF,OAAQkmF,UACzD,IAAInmF,EAQJ,IANEA,EADEmmF,SAAW,EACTA,SAAWlmF,OACNkmF,SAAWlmF,OAChBA,OAEAkmF,WAEGnmF,GAAK,GACZomF,aAAajjF,KAAKnD,GAEpB,OAAOomF,YACT,IACA5/C,GAAI0/C,wBAAuB,SAAUE,aAAcnmF,OAAQkmF,UAEzD,IADA,IAAInmF,EAAImmF,SAAW,EAAIA,SAAWlmF,OAASkmF,WAClCnmF,EAAIC,QACXmmF,aAAajjF,KAAKnD,GAEpB,OAAOomF,YACT,MAGJvE,KAAKc,QAAQ0H,IAAMxI,KAAKc,QAAQ38D,GAGtB,CACRskE,OAAO,EACPC,UAAU,EACVl5C,MAAM,EACNm5C,UAAU,EACVj5C,OAAO,GAEPswC,KAAKc,QAAQ3iF,GAAK8lF,kBAAkB9lF,GAEtC,IAAKA,IAAK,CACRyqF,QAAQ,EACR/N,OAAO,GAEPmF,KAAKc,QAAQ3iF,GAAK+lF,mBAAmB/lF,GAIvC,SAASgpF,aAAc,CAGvB,SAAS3D,SAASj7E,SAAUsgF,WAC1B,IAAIzB,QACF31D,MACA+J,OACAx4B,KACA8lF,MACA7F,OACA8F,WACAC,OAASvI,WAAWl4E,SAAW,KACjC,GAAIygF,OACF,OAAOH,UAAY,EAAIG,OAAOhiF,MAAM,GAKtC,IAHA8hF,MAAQvgF,SACR06E,OAAS,GACT8F,WAAa/I,KAAK+F,UACX+C,OAAO,CAuBZ,IAAK9lF,QArBAokF,WAAY31D,MAAQuvD,OAAO/yE,KAAK66E,UAC/Br3D,QAEFq3D,MAAQA,MAAM9hF,MAAMyqB,MAAM,GAAGrzB,SAAW0qF,OAE1C7F,OAAO3hF,KAAKk6B,OAAS,KAEvB4rD,SAAU,GAGN31D,MAAQwvD,mBAAmBhzE,KAAK66E,UAClC1B,QAAU31D,MAAMqyD,QAChBtoD,OAAOl6B,KAAK,CACV4P,MAAOk2E,QAEPpkF,KAAMyuB,MAAM,GAAG1K,QAAQu4D,SAAU,OAEnCwJ,MAAQA,MAAM9hF,MAAMogF,QAAQhpF,SAIjB4hF,KAAK/4E,SACXwqB,MAAQ4vD,UAAUr+E,MAAMiL,KAAK66E,SAAaC,WAAW/lF,SAAUyuB,MAAQs3D,WAAW/lF,MAAMyuB,UAC3F21D,QAAU31D,MAAMqyD,QAChBtoD,OAAOl6B,KAAK,CACV4P,MAAOk2E,QACPpkF,KACAi8E,QAASxtD,QAEXq3D,MAAQA,MAAM9hF,MAAMogF,QAAQhpF,SAGhC,IAAKgpF,QACH,KAEJ,CAKA,OAAIyB,UACKC,MAAM1qF,OAER0qF,MAAQp0D,KAAK9gB,MAAMrL,UAE1Bk4E,WAAWl4E,SAAU06E,QAAQj8E,MAAM,EACrC,CACA,SAASy8E,WAAWjoD,QAIlB,IAHA,IAAIr9B,EAAI,EACNupC,IAAMlM,OAAOp9B,OACbmK,SAAW,GACNpK,EAAIupC,IAAKvpC,IACdoK,UAAYizB,OAAOr9B,GAAG+S,MAExB,OAAO3I,QACT,CACA,SAASk6E,cAAc6E,QAAS2B,WAAYC,MAC1C,IAAIvG,IAAMsG,WAAWtG,IACnBwG,KAAOF,WAAWrG,KAClBzxE,IAAMg4E,MAAQxG,IACdyG,iBAAmBF,MAAgB,eAAR/3E,IAC3Bk4E,SAAWzhD,OACb,OAAOqhD,WAAWzL,MAElB,SAAUzpE,KAAMipE,QAAStmD,KACvB,KAAO3iB,KAAOA,KAAK4uE,MACjB,GAAsB,IAAlB5uE,KAAKvN,UAAkB4iF,iBACzB,OAAO9B,QAAQvzE,KAAMipE,QAAStmD,KAGlC,OAAO,CACT,EAEA,SAAU3iB,KAAMipE,QAAStmD,KACvB,IAAI4yD,SACFzC,WACA0C,SAAW,CAACjJ,QAAS+I,UAGvB,GAAI3yD,KACF,KAAO3iB,KAAOA,KAAK4uE,MACjB,IAAsB,IAAlB5uE,KAAKvN,UAAkB4iF,mBACrB9B,QAAQvzE,KAAMipE,QAAStmD,KACzB,OAAO,OAKb,KAAO3iB,KAAOA,KAAK4uE,MACjB,GAAsB,IAAlB5uE,KAAKvN,UAAkB4iF,iBAEzB,GADAvC,WAAa9yE,KAAKmqE,WAAanqE,KAAKmqE,SAAW,CAAC,GAC5CiL,MAAQpb,SAASh6D,KAAMo1E,MACzBp1E,KAAOA,KAAK4uE,MAAQ5uE,SACf,KAAKu1E,SAAWzC,WAAW11E,OAASm4E,SAAS,KAAOhJ,SAAWgJ,SAAS,KAAOD,SAEpF,OAAOE,SAAS,GAAKD,SAAS,GAM9B,GAHAzC,WAAW11E,KAAOo4E,SAGdA,SAAS,GAAKjC,QAAQvzE,KAAMipE,QAAStmD,KACvC,OAAO,CAEX,CAIN,OAAO,CACT,CACF,CACA,SAAS8yD,eAAe13C,UACtB,OAAOA,SAAS1zC,OAAS,EAAI,SAAU2V,KAAMipE,QAAStmD,KAEpD,IADA,IAAIv4B,EAAI2zC,SAAS1zC,OACVD,KACL,IAAK2zC,SAAS3zC,GAAG4V,KAAMipE,QAAStmD,KAC9B,OAAO,EAGX,OAAO,CACT,EAAIob,SAAS,EACf,CASA,SAAS23C,SAASjC,UAAW1gF,IAAKG,OAAQ+1E,QAAStmD,KAMjD,IALA,IAAI3iB,KACF21E,aAAe,GACfvrF,EAAI,EACJupC,IAAM8/C,UAAUppF,OAChBurF,OAAgB,MAAP7iF,IACJ3I,EAAIupC,IAAKvpC,KACV4V,KAAOyzE,UAAUrpF,MACd8I,SAAUA,OAAO8M,KAAMipE,QAAStmD,OACnCgzD,aAAapoF,KAAKyS,MACd41E,QACF7iF,IAAIxF,KAAKnD,KAKjB,OAAOurF,YACT,CACA,SAASE,WAAW7D,UAAWx9E,SAAU++E,QAASuC,WAAYC,WAAYC,cAOxE,OANIF,aAAeA,WAAW3L,WAC5B2L,WAAaD,WAAWC,aAEtBC,aAAeA,WAAW5L,WAC5B4L,WAAaF,WAAWE,WAAYC,eAE/BhG,cAAa,SAAUhB,KAAMntC,QAASonC,QAAStmD,KACpD,IAAIszD,KACF7rF,EACA4V,KACAk2E,WACAC,OAAS,GACTC,QAAU,GACVC,YAAcx0C,QAAQx3C,OAEtBg/E,MAAQ2F,MA1Cd,SAA0Bx6E,SAAU8hF,SAAUz0C,SAG5C,IAFA,IAAIz3C,EAAI,EACNupC,IAAM2iD,SAASjsF,OACVD,EAAIupC,IAAKvpC,IACdu2B,KAAKnsB,SAAU8hF,SAASlsF,GAAIy3C,SAE9B,OAAOA,OACT,CAmCsB00C,CAAiB/hF,UAAY,IAAKy0E,QAAQx2E,SAAW,CAACw2E,SAAWA,QAAS,IAE1FuN,WAAYxE,YAAchD,MAASx6E,SAA+D60E,MAAnDqM,SAASrM,MAAO8M,OAAQnE,UAAW/I,QAAStmD,KAiB7F,GAhBI4wD,QAUFA,QAAQiD,UAPRN,WAAaH,aAAe/G,KAAOgD,UAAYqE,aAAeP,YAE9D,GAEAj0C,QAG+BonC,QAAStmD,KAExCuzD,WAAaM,UAIXV,WAMF,IALAG,KAAOP,SAASQ,WAAYE,SAC5BN,WAAWG,KAAM,GAAIhN,QAAStmD,KAG9Bv4B,EAAI6rF,KAAK5rF,OACFD,MACD4V,KAAOi2E,KAAK7rF,MACd8rF,WAAWE,QAAQhsF,MAAQosF,UAAUJ,QAAQhsF,IAAM4V,OAIzD,GAAIgvE,MACF,GAAI+G,YAAc/D,UAAW,CAC3B,GAAI+D,WAAY,CAId,IAFAE,KAAO,GACP7rF,EAAI8rF,WAAW7rF,OACRD,MACD4V,KAAOk2E,WAAW9rF,KAEpB6rF,KAAK1oF,KAAKipF,UAAUpsF,GAAK4V,MAG7B+1E,WAAW,KAAMG,WAAa,GAAID,KAAMtzD,IAC1C,CAIA,IADAv4B,EAAI8rF,WAAW7rF,OACRD,MACA4V,KAAOk2E,WAAW9rF,MAAQ6rF,KAAOF,WAAa53E,QAAQ/U,KAAK4lF,KAAMhvE,MAAQm2E,OAAO/rF,KAAO,IAC1F4kF,KAAKiH,QAAUp0C,QAAQo0C,MAAQj2E,MAGrC,OAIAk2E,WAAaR,SAASQ,aAAer0C,QAAUq0C,WAAW93E,OAAOi4E,YAAaH,WAAW7rF,QAAU6rF,YAC/FH,WACFA,WAAW,KAAMl0C,QAASq0C,WAAYvzD,KAEtCp1B,KAAK2vB,MAAM2kB,QAASq0C,WAG1B,GACF,CACA,SAASO,kBAAkBhvD,QA2BzB,IA1BA,IAAIivD,aACFnD,QACAzJ,EACAn2C,IAAMlM,OAAOp9B,OACbssF,gBAAkB1K,KAAK8F,SAAStqD,OAAO,GAAGx4B,MAC1C2nF,iBAAmBD,iBAAmB1K,KAAK8F,SAAS,KACpD3nF,EAAIusF,gBAAkB,EAAI,EAE1BE,aAAenI,eAAc,SAAU1uE,MACrC,OAAOA,OAAS02E,YAClB,GAAGE,kBAAkB,GACrBE,gBAAkBpI,eAAc,SAAU1uE,MACxC,OAAO7B,QAAQ/U,KAAKstF,aAAc12E,OAAS,CAC7C,GAAG42E,kBAAkB,GACrB74C,SAAW,CAAC,SAAU/9B,KAAMipE,QAAStmD,KAKnC,IAAItnB,KAAOs7E,kBAAoBh0D,KAAOsmD,SAAWiD,qBAAuBwK,aAAezN,SAASx2E,SAAWokF,aAAa72E,KAAMipE,QAAStmD,KAAOm0D,gBAAgB92E,KAAMipE,QAAStmD,MAK7K,OADA+zD,aAAe,KACRr7E,GACT,GACKjR,EAAIupC,IAAKvpC,IACd,GAAImpF,QAAUtH,KAAK8F,SAAStqD,OAAOr9B,GAAG6E,MACpC8uC,SAAW,CAAC2wC,cAAc+G,eAAe13C,UAAWw1C,cAC/C,CAIL,IAHAA,QAAUtH,KAAK/4E,OAAOu0B,OAAOr9B,GAAG6E,MAAMiuB,MAAM,KAAMuK,OAAOr9B,GAAG8gF,UAGhDf,SAAU,CAGpB,IADAL,IAAM1/E,EACC0/E,EAAIn2C,MACLs4C,KAAK8F,SAAStqD,OAAOqiD,GAAG76E,MADd66E,KAKhB,OAAO+L,WAAWzrF,EAAI,GAAKqrF,eAAe13C,UAAW3zC,EAAI,GAAKslF,WAE9DjoD,OAAOx0B,MAAM,EAAG7I,EAAI,GAAGsL,OAAO,CAC5ByH,MAA8B,MAAvBsqB,OAAOr9B,EAAI,GAAG6E,KAAe,IAAM,MACxC+jB,QAAQu4D,SAAU,MAAOgI,QAASnpF,EAAI0/E,GAAK2M,kBAAkBhvD,OAAOx0B,MAAM7I,EAAG0/E,IAAKA,EAAIn2C,KAAO8iD,kBAAkBhvD,OAASA,OAAOx0B,MAAM62E,IAAKA,EAAIn2C,KAAO+7C,WAAWjoD,QACtK,CACAsW,SAASxwC,KAAKgmF,QAChB,CAEF,OAAOkC,eAAe13C,SACxB,CAmHA,SAASy1C,QAAQh/E,SAAUkpB,OACzB,IAAItzB,EACF2sF,YAAc,GACdC,gBAAkB,GAClB/B,OAAStI,cAAcn4E,SAAW,KACpC,IAAKygF,OAAQ,CAMX,IAJKv3D,QACHA,MAAQ+xD,SAASj7E,WAEnBpK,EAAIszB,MAAMrzB,OACHD,MACL6qF,OAASwB,kBAAkB/4D,MAAMtzB,KACtB+/E,SACT4M,YAAYxpF,KAAK0nF,QAEjB+B,gBAAgBzpF,KAAK0nF,QAKzBA,OAAStI,cAAcn4E,SAvI3B,SAAkCwiF,gBAAiBD,aACjD,IAAIE,MAAQF,YAAY1sF,OAAS,EAC/B6sF,UAAYF,gBAAgB3sF,OAAS,EACrC8sF,aAAe,SAAsBnI,KAAM/F,QAAStmD,IAAKkf,QAASu1C,WAChE,IAAIp3E,KACF8pE,EACAyJ,QACA8D,aAAe,EACfjtF,EAAI,IACJqpF,UAAYzE,MAAQ,GACpBsI,WAAa,GACbC,cAAgBrL,iBAEhB7C,MAAQ2F,MAAQkI,WAAajL,KAAKtrD,KAAK8sD,IAAI,IAAK2J,WAEhDI,cAAgBjL,SAA4B,MAAjBgL,cAAwB,EAAIr/E,KAAKmlC,UAAY,GACxE1J,IAAM01C,MAAMh/E,OAad,IAZI+sF,YAKFlL,iBAAmBjD,SAAWn/E,UAAYm/E,SAAWmO,WAOhDhtF,IAAMupC,KAA4B,OAApB3zB,KAAOqpE,MAAMj/E,IAAaA,IAAK,CAClD,GAAI8sF,WAAal3E,KAAM,CAWrB,IAVA8pE,EAAI,EAMCb,SAAWjpE,KAAKE,eAAiBpW,WACpC0kF,YAAYxuE,MACZ2iB,KAAO0pD,gBAEFkH,QAAUyD,gBAAgBlN,MAC/B,GAAIyJ,QAAQvzE,KAAMipE,SAAWn/E,SAAU64B,KAAM,CAC3Cp1B,KAAKnE,KAAKy4C,QAAS7hC,MACnB,KACF,CAEEo3E,YACF7K,QAAUiL,cAEd,CAGIP,SAEEj3E,MAAQuzE,SAAWvzE,OACrBq3E,eAIErI,MACFyE,UAAUlmF,KAAKyS,MAGrB,CAaA,GATAq3E,cAAgBjtF,EASZ6sF,OAAS7sF,IAAMitF,aAAc,CAE/B,IADAvN,EAAI,EACGyJ,QAAUwD,YAAYjN,MAC3ByJ,QAAQE,UAAW6D,WAAYrO,QAAStmD,KAE1C,GAAIqsD,KAAM,CAER,GAAIqI,aAAe,EACjB,KAAOjtF,KACCqpF,UAAUrpF,IAAMktF,WAAWltF,KAC/BktF,WAAWltF,GAAKwmB,IAAIxnB,KAAKy4C,UAM/By1C,WAAa5B,SAAS4B,WACxB,CAGA/pF,KAAK2vB,MAAM2kB,QAASy1C,YAGhBF,YAAcpI,MAAQsI,WAAWjtF,OAAS,GAAKgtF,aAAeN,YAAY1sF,OAAS,GACrF2+E,OAAO2I,WAAW9vC,QAEtB,CAOA,OAJIu1C,YACF7K,QAAUiL,cACVtL,iBAAmBqL,eAEd9D,SACT,EACF,OAAOwD,MAAQjH,aAAamH,cAAgBA,YAC9C,CAsBqCM,CAAyBT,gBAAiBD,cAG3E9B,OAAOzgF,SAAWA,QACpB,CACA,OAAOygF,MACT,CAWA,SAASpF,OAAOr7E,SAAUy0E,QAASpnC,QAASmtC,MAC1C,IAAI5kF,EACFq9B,OACAiwD,MACAzoF,KACA0xB,KACAg3D,SAA+B,mBAAbnjF,UAA2BA,SAC7CkpB,OAASsxD,MAAQS,SAASj7E,SAAWmjF,SAASnjF,UAAYA,UAK5D,GAJAqtC,QAAUA,SAAW,GAIA,IAAjBnkB,MAAMrzB,OAAc,CAGtB,IADAo9B,OAAS/J,MAAM,GAAKA,MAAM,GAAGzqB,MAAM,IACxB5I,OAAS,GAAkC,QAA5BqtF,MAAQjwD,OAAO,IAAIx4B,MAAsC,IAArBg6E,QAAQx2E,UAAkB45E,gBAAkBJ,KAAK8F,SAAStqD,OAAO,GAAGx4B,MAAO,CAEvI,KADAg6E,SAAWgD,KAAKtrD,KAAK4sD,GAAGmK,MAAMxM,QAAQ,GAAGl4D,QAAQm7D,UAAWC,WAAYnF,UAAY,IAAI,IAEtF,OAAOpnC,QAGE81C,WACT1O,QAAUA,QAAQz4E,YAEpBgE,SAAWA,SAASvB,MAAMw0B,OAAOsoD,QAAQ5yE,MAAM9S,OACjD,CAIA,IADAD,EAAIkjF,UAAUQ,aAAa56D,KAAK1e,UAAY,EAAIizB,OAAOp9B,OAChDD,MACLstF,MAAQjwD,OAAOr9B,IAGX6hF,KAAK8F,SAAS9iF,KAAOyoF,MAAMzoF,QAG/B,IAAI0xB,KAAOsrD,KAAKtrD,KAAK1xB,SAEf+/E,KAAOruD,KAAK+2D,MAAMxM,QAAQ,GAAGl4D,QAAQm7D,UAAWC,WAAYF,SAASh7D,KAAKuU,OAAO,GAAGx4B,OAASsgF,YAAYtG,QAAQz4E,aAAey4E,UAAU,CAI5I,GAFAxhD,OAAOrpB,OAAOhU,EAAG,KACjBoK,SAAWw6E,KAAK3kF,QAAUqlF,WAAWjoD,SAGnC,OADAl6B,KAAK2vB,MAAM2kB,QAASmtC,MACbntC,QAET,KACF,CAGN,CAKA,OADC81C,UAAYnE,QAAQh/E,SAAUkpB,QAAQsxD,KAAM/F,SAAUoD,eAAgBxqC,SAAUonC,SAAWiF,SAASh7D,KAAK1e,WAAa+6E,YAAYtG,QAAQz4E,aAAey4E,SACnJpnC,OACT,CA9fAuxC,WAAWlqF,UAAY+iF,KAAK2L,QAAU3L,KAAKc,QAC3Cd,KAAKmH,WAAa,IAAIA,WAmgBtBjL,QAAQ0J,WAAa1H,QAAQvjD,MAAM,IAAIqvB,KAAK42B,WAAW3jD,KAAK,MAAQihD,QAGpEqE,cAIArG,QAAQmJ,aAAerB,QAAO,SAAU76E,IAEtC,OAAwE,EAAjEA,GAAGq2E,wBAAwB3hF,SAASqN,cAAc,YAC3D,IACA6xE,OAAOroD,KAAOA,KAGdqoD,OAAOuI,KAAK,KAAOvI,OAAOuI,KAAKxE,QAC/B/D,OAAO6O,OAAS7O,OAAO2I,WAIvBhxD,KAAK6yD,QAAUA,QACf7yD,KAAKkvD,OAASA,OACdlvD,KAAK6tD,YAAcA,YACnB7tD,KAAK8uD,SAAWA,SAChB9uD,KAAK0tD,OAASrF,OAAO6C,eACrBlrD,KAAKm3D,QAAU9O,OAAOtgD,KACtB/H,KAAKo3D,MAAQ/O,OAAO4B,SACpBjqD,KAAKnqB,UAAYwyE,OAAOuI,KACxB5wD,KAAKwnD,QAAUa,OAAOb,QACtBxnD,KAAKgxD,WAAa3I,OAAO2I,UAG1B,CA9uDD,GA+uDA,IAAI/C,IAAM,SAAa5uE,KAAMg4E,KAAMC,OAGjC,IAFA,IAAI5E,QAAU,GACZ6E,cAAqBnsF,IAAVksF,OACLj4E,KAAOA,KAAKg4E,QAA4B,IAAlBh4E,KAAKvN,UACjC,GAAsB,IAAlBuN,KAAKvN,SAAgB,CACvB,GAAIylF,UAAYlP,OAAOhpE,MAAMuuB,GAAG0pD,OAC9B,MAEF5E,QAAQ9lF,KAAKyS,KACf,CAEF,OAAOqzE,OACT,EACI8E,UAAY,SAAkBviF,EAAGoK,MAEnC,IADA,IAAIqzE,QAAU,GACPz9E,EAAGA,EAAIA,EAAEskE,YACK,IAAftkE,EAAEnD,UAAkBmD,IAAMoK,MAC5BqzE,QAAQ9lF,KAAKqI,GAGjB,OAAOy9E,OACT,EACI+E,cAAgBpP,OAAOuI,KAAK7zD,MAAMowD,aAClCuK,WAAa,kEAGjB,SAASC,OAAOzrB,SAAU0rB,UAAWjF,KACnC,OAAIthE,WAAWumE,WACNvP,OAAOW,KAAK9c,UAAU,SAAU7sD,KAAM5V,GAC3C,QAASmuF,UAAUnvF,KAAK4W,KAAM5V,EAAG4V,QAAUszE,GAC7C,IAIEiF,UAAU9lF,SACLu2E,OAAOW,KAAK9c,UAAU,SAAU7sD,MACrC,OAAOA,OAASu4E,YAAcjF,GAChC,IAIuB,iBAAdiF,UACFvP,OAAOW,KAAK9c,UAAU,SAAU7sD,MACrC,OAAO7B,QAAQ/U,KAAKmvF,UAAWv4E,OAAS,IAAMszE,GAChD,IAIKtK,OAAO91E,OAAOqlF,UAAW1rB,SAAUymB,IAC5C,CACAtK,OAAO91E,OAAS,SAAUq+E,KAAMlI,MAAOiK,KACrC,IAAItzE,KAAOqpE,MAAM,GAIjB,OAHIiK,MACF/B,KAAO,QAAUA,KAAO,KAEL,IAAjBlI,MAAMh/E,QAAkC,IAAlB2V,KAAKvN,SACtBu2E,OAAOroD,KAAK6wD,gBAAgBxxE,KAAMuxE,MAAQ,CAACvxE,MAAQ,GAErDgpE,OAAOroD,KAAKuqD,QAAQqG,KAAMvI,OAAOW,KAAKN,OAAO,SAAUrpE,MAC5D,OAAyB,IAAlBA,KAAKvN,QACd,IACF,EACAu2E,OAAO95E,GAAG66E,OAAO,CACfppD,KAAM,SAAcnsB,UAClB,IAAIpK,EACFiR,IACAs4B,IAAMloC,KAAKpB,OACXxB,KAAO4C,KACT,GAAwB,iBAAb+I,SACT,OAAO/I,KAAK29E,UAAUJ,OAAOx0E,UAAUtB,QAAO,WAC5C,IAAK9I,EAAI,EAAGA,EAAIupC,IAAKvpC,IACnB,GAAI4+E,OAAOn7E,SAAShF,KAAKuB,GAAIqB,MAC3B,OAAO,CAGb,KAGF,IADA4P,IAAM5P,KAAK29E,UAAU,IAChBh/E,EAAI,EAAGA,EAAIupC,IAAKvpC,IACnB4+E,OAAOroD,KAAKnsB,SAAU3L,KAAKuB,GAAIiR,KAEjC,OAAOs4B,IAAM,EAAIq1C,OAAO2I,WAAWt2E,KAAOA,GAC5C,EACAnI,OAAQ,SAAgBsB,UACtB,OAAO/I,KAAK29E,UAAUkP,OAAO7sF,KAAM+I,UAAY,IAAI,GACrD,EACA8+E,IAAK,SAAa9+E,UAChB,OAAO/I,KAAK29E,UAAUkP,OAAO7sF,KAAM+I,UAAY,IAAI,GACrD,EACA+5B,GAAI,SAAY/5B,UACd,QAAS8jF,OAAO7sF,KAGI,iBAAb+I,UAAyB4jF,cAAcllE,KAAK1e,UAAYw0E,OAAOx0E,UAAYA,UAAY,IAAI,GAAOnK,MAC3G,IAMF,IAAImuF,WAKFvK,WAAa,sCACb/E,KAAOF,OAAO95E,GAAGg6E,KAAO,SAAU10E,SAAUy0E,QAASl4D,MACnD,IAAI2M,MAAO1d,KAGX,IAAKxL,SACH,OAAO/I,KAQT,GAHAslB,KAAOA,MAAQynE,WAGS,iBAAbhkF,SAAuB,CAShC,KANEkpB,MAFkB,MAAhBlpB,SAAS,IAAgD,MAAlCA,SAASA,SAASnK,OAAS,IAAcmK,SAASnK,QAAU,EAE7E,CAAC,KAAMmK,SAAU,MAEjBy5E,WAAW/zE,KAAK1F,aAIZkpB,MAAM,IAAOurD,QAoCpB,OAAKA,SAAWA,QAAQxB,QACrBwB,SAAWl4D,MAAM4P,KAAKnsB,UAKvB/I,KAAKskB,YAAYk5D,SAAStoD,KAAKnsB,UAxCtC,GAAIkpB,MAAM,GAAI,CAQZ,GAPAurD,QAAUA,mBAAmBD,OAASC,QAAQ,GAAKA,QAInDD,OAAOM,MAAM79E,KAAMu9E,OAAOyP,UAAU/6D,MAAM,GAAIurD,SAAWA,QAAQx2E,SAAWw2E,QAAQ/oE,eAAiB+oE,QAAUn/E,UAAU,IAGrHuuF,WAAWnlE,KAAKwK,MAAM,KAAOsrD,OAAOkB,cAAcjB,SACpD,IAAKvrD,SAASurD,QAERj3D,WAAWvmB,KAAKiyB,QAClBjyB,KAAKiyB,OAAOurD,QAAQvrD,QAIpBjyB,KAAKgmF,KAAK/zD,MAAOurD,QAAQvrD,QAI/B,OAAOjyB,IAGT,CAOE,OANAuU,KAAOlW,SAASulF,eAAe3xD,MAAM,OAGnCjyB,KAAK,GAAKuU,KACVvU,KAAKpB,OAAS,GAEToB,IAcb,CAAO,OAAI+I,SAAS/B,UAClBhH,KAAK,GAAK+I,SACV/I,KAAKpB,OAAS,EACPoB,MAIEumB,WAAWxd,eACEzI,IAAfglB,KAAK2nE,MAAsB3nE,KAAK2nE,MAAMlkF,UAE7CA,SAASw0E,QAEJA,OAAO0B,UAAUl2E,SAAU/I,KACpC,EAGFy9E,KAAKhgF,UAAY8/E,OAAO95E,GAGxBspF,WAAaxP,OAAOl/E,UACpB,IAAI6uF,aAAe,iCAEjBC,iBAAmB,CACjBpwD,UAAU,EACVqwD,UAAU,EACVhK,MAAM,EACNiK,MAAM,GA8DV,SAASC,QAAQC,IAAKpK,KACpB,MAAQoK,IAAMA,IAAIpK,OAA0B,IAAjBoK,IAAIvmF,WAC/B,OAAOumF,GACT,CA/DAhQ,OAAO95E,GAAG66E,OAAO,CACf/9E,IAAK,SAAaoD,QAChB,IAAImB,QAAUy4E,OAAO55E,OAAQ3D,MAC3BkC,EAAI4C,QAAQlG,OACd,OAAOoB,KAAKyH,QAAO,WAEjB,IADA,IAAI9I,EAAI,EACDA,EAAIuD,EAAGvD,IACZ,GAAI4+E,OAAOn7E,SAASpC,KAAM8E,QAAQnG,IAChC,OAAO,CAGb,GACF,EACA6uF,QAAS,SAAiBziF,UAAWyyE,SACnC,IAAI+P,IACF5uF,EAAI,EACJuD,EAAIlC,KAAKpB,OACTgpF,QAAU,GACV9iF,QAA+B,iBAAdiG,WAA0BwyE,OAAOxyE,WAGpD,IAAK4hF,cAAcllE,KAAK1c,WACtB,KAAOpM,EAAIuD,EAAGvD,IACZ,IAAK4uF,IAAMvtF,KAAKrB,GAAI4uF,KAAOA,MAAQ/P,QAAS+P,IAAMA,IAAIxoF,WAEpD,GAAIwoF,IAAIvmF,SAAW,KAAOlC,QAAUA,QAAQ2f,MAAM8oE,MAAQ,EAEzC,IAAjBA,IAAIvmF,UAAkBu2E,OAAOroD,KAAK6wD,gBAAgBwH,IAAKxiF,YAAa,CAClE68E,QAAQ9lF,KAAKyrF,KACb,KACF,CAIN,OAAOvtF,KAAK29E,UAAUiK,QAAQhpF,OAAS,EAAI2+E,OAAO2I,WAAW0B,SAAWA,QAC1E,EAEAnjE,MAAO,SAAelQ,MAEpB,OAAKA,KAKe,iBAATA,KACF7B,QAAQ/U,KAAK4/E,OAAOhpE,MAAOvU,KAAK,IAIlC0S,QAAQ/U,KAAKqC,KAEpBuU,KAAKynE,OAASznE,KAAK,GAAKA,MAXfvU,KAAK,IAAMA,KAAK,GAAG+E,WAAa/E,KAAKg+E,QAAQyP,UAAU7uF,QAAU,CAY5E,EACAyJ,IAAK,SAAaU,SAAUy0E,SAC1B,OAAOx9E,KAAK29E,UAAUJ,OAAO2I,WAAW3I,OAAOM,MAAM79E,KAAKQ,MAAO+8E,OAAOx0E,SAAUy0E,WACpF,EACAkQ,QAAS,SAAiB3kF,UACxB,OAAO/I,KAAKqI,IAAgB,MAAZU,SAAmB/I,KAAK89E,WAAa99E,KAAK89E,WAAWr2E,OAAOsB,UAC9E,IAMFw0E,OAAOQ,KAAK,CACVvpE,OAAQ,SAAgBD,MACtB,IAAIC,OAASD,KAAKxP,WAClB,OAAOyP,QAA8B,KAApBA,OAAOxN,SAAkBwN,OAAS,IACrD,EACAm5E,QAAS,SAAiBp5E,MACxB,OAAO4uE,IAAI5uE,KAAM,aACnB,EACAq5E,aAAc,SAAsBr5E,KAAMqrE,GAAI4M,OAC5C,OAAOrJ,IAAI5uE,KAAM,aAAci4E,MACjC,EACApJ,KAAM,SAAc7uE,MAClB,OAAO+4E,QAAQ/4E,KAAM,cACvB,EACA84E,KAAM,SAAc94E,MAClB,OAAO+4E,QAAQ/4E,KAAM,kBACvB,EACAs5E,QAAS,SAAiBt5E,MACxB,OAAO4uE,IAAI5uE,KAAM,cACnB,EACAk5E,QAAS,SAAiBl5E,MACxB,OAAO4uE,IAAI5uE,KAAM,kBACnB,EACAu5E,UAAW,SAAmBv5E,KAAMqrE,GAAI4M,OACtC,OAAOrJ,IAAI5uE,KAAM,cAAei4E,MAClC,EACAuB,UAAW,SAAmBx5E,KAAMqrE,GAAI4M,OACtC,OAAOrJ,IAAI5uE,KAAM,kBAAmBi4E,MACtC,EACAwB,SAAU,SAAkBz5E,MAC1B,OAAOm4E,WAAWn4E,KAAKxP,YAAc,CAAC,GAAGopE,WAAY55D,KACvD,EACAwoB,SAAU,SAAkBxoB,MAC1B,OAAOm4E,UAAUn4E,KAAK45D,WACxB,EACAif,SAAU,SAAkB74E,MAC1B,OAA4B,MAAxBA,KAAK05E,iBAIT9R,SAAS5nE,KAAK05E,iBACL15E,KAAK05E,iBAMV1f,SAASh6D,KAAM,cACjBA,KAAOA,KAAK25E,SAAW35E,MAElBgpE,OAAOM,MAAM,GAAItpE,KAAK8uE,YAC/B,IACC,SAAU7hF,KAAMiC,IACjB85E,OAAO95E,GAAGjC,MAAQ,SAAUgrF,MAAOzjF,UACjC,IAAI6+E,QAAUrK,OAAOj2E,IAAItH,KAAMyD,GAAI+oF,OAkBnC,MAjBuB,UAAnBhrF,KAAKgG,OAAO,KACduB,SAAWyjF,OAETzjF,UAAgC,iBAAbA,WACrB6+E,QAAUrK,OAAO91E,OAAOsB,SAAU6+E,UAEhC5nF,KAAKpB,OAAS,IAEXuuF,iBAAiB3rF,OACpB+7E,OAAO2I,WAAW0B,SAIhBsF,aAAazlE,KAAKjmB,OACpBomF,QAAQ5iF,WAGLhF,KAAK29E,UAAUiK,QACxB,CACF,IACA,IAAIuG,cAAgB,oBAiMpB,SAASC,SAAS/tF,GAChB,OAAOA,CACT,CACA,SAASguF,QAAQ9rF,IACf,MAAMA,EACR,CACA,SAAS+rF,WAAW58E,MAAO+c,QAAS8Z,OAAQgmD,SAC1C,IAAIC,OACJ,IAEM98E,OAAS6U,WAAWioE,OAAS98E,MAAMk2B,SACrC4mD,OAAO7wF,KAAK+T,OAAO02B,KAAK3Z,SAASggE,KAAKlmD,QAG7B72B,OAAS6U,WAAWioE,OAAS98E,MAAMq2B,MAC5CymD,OAAO7wF,KAAK+T,MAAO+c,QAAS8Z,QAO5B9Z,QAAQgD,WAAMnxB,EAAW,CAACoR,OAAOlK,MAAM+mF,SAM3C,CAAE,MAAO78E,OAGP62B,OAAO9W,WAAMnxB,EAAW,CAACoR,OAC3B,CACF,CAjMA6rE,OAAOmR,UAAY,SAAUrkB,SAG3BA,QAA6B,iBAAZA,QAjCnB,SAAuBA,SACrB,IAAI1iD,OAAS,CAAC,EAId,OAHA41D,OAAOQ,KAAK1T,QAAQp4C,MAAMk8D,gBAAkB,IAAI,SAAUQ,EAAGC,MAC3DjnE,OAAOinE,OAAQ,CACjB,IACOjnE,MACT,CA2B0CknE,CAAcxkB,SAAWkT,OAAOe,OAAO,CAAC,EAAGjU,SACnF,IAEEykB,OAEAC,OAEAC,OAEAC,QAEAjlF,KAAO,GAEPklF,MAAQ,GAERC,aAAe,EAEfC,KAAO,WAOL,IALAH,QAAUA,SAAW5kB,QAAQglB,KAI7BL,OAASF,QAAS,EACXI,MAAMtwF,OAAQuwF,aAAe,EAElC,IADAJ,OAASG,MAAM5K,UACN6K,YAAcnlF,KAAKpL,SAE4B,IAAlDoL,KAAKmlF,aAAa19D,MAAMs9D,OAAO,GAAIA,OAAO,KAAiB1kB,QAAQilB,cAErEH,YAAcnlF,KAAKpL,OACnBmwF,QAAS,GAMV1kB,QAAQ0kB,SACXA,QAAS,GAEXD,QAAS,EAGLG,UAGAjlF,KADE+kF,OACK,GAIA,GAGb,EAEA3xF,KAAO,CAELiL,IAAK,WAuBH,OAtBI2B,OAEE+kF,SAAWD,SACbK,YAAcnlF,KAAKpL,OAAS,EAC5BswF,MAAMptF,KAAKitF,SAEb,SAAU1mF,IAAImpB,MACZ+rD,OAAOQ,KAAKvsD,MAAM,SAAUm9D,EAAGrhE,KACzB/G,WAAW+G,KACR+8C,QAAQ+hB,QAAWhvF,KAAKmD,IAAI+sB,MAC/BtjB,KAAKlI,KAAKwrB,KAEHA,KAAOA,IAAI1uB,QAA0B,WAAhBy+E,OAAO/vD,MAErCjlB,IAAIilB,IAER,GACD,CAXD,CAWGlC,WACC2jE,SAAWD,QACbM,QAGGpvF,IACT,EAEAsI,OAAQ,WAYN,OAXAi1E,OAAOQ,KAAK3yD,WAAW,SAAUujE,EAAGrhE,KAElC,IADA,IAAI7I,OACIA,MAAQ84D,OAAO2B,QAAQ5xD,IAAKtjB,KAAMya,SAAW,GACnDza,KAAK2I,OAAO8R,MAAO,GAGfA,OAAS0qE,aACXA,aAGN,IACOnvF,IACT,EAGAO,IAAK,SAAakD,IAChB,OAAOA,GAAK85E,OAAO2B,QAAQz7E,GAAIuG,OAAS,EAAIA,KAAKpL,OAAS,CAC5D,EAEAiqF,MAAO,WAIL,OAHI7+E,OACFA,KAAO,IAEFhK,IACT,EAIAuvF,QAAS,WAGP,OAFAN,QAAUC,MAAQ,GAClBllF,KAAO+kF,OAAS,GACT/uF,IACT,EACAkjF,SAAU,WACR,OAAQl5E,IACV,EAIAwlF,KAAM,WAKJ,OAJAP,QAAUC,MAAQ,GACbH,QAAWD,SACd9kF,KAAO+kF,OAAS,IAEX/uF,IACT,EACAyvF,OAAQ,WACN,QAASR,OACX,EAEAS,SAAU,SAAkBlS,QAAShsD,MASnC,OARKy9D,UAEHz9D,KAAO,CAACgsD,SADRhsD,KAAOA,MAAQ,IACOhqB,MAAQgqB,KAAKhqB,QAAUgqB,MAC7C09D,MAAMptF,KAAK0vB,MACNs9D,QACHM,QAGGpvF,IACT,EAEAovF,KAAM,WAEJ,OADAhyF,KAAKsyF,SAAS1vF,KAAMorB,WACbprB,IACT,EAEA2vF,MAAO,WACL,QAASX,MACX,GAEJ,OAAO5xF,IACT,EAmCAmgF,OAAOe,OAAO,CACZsR,SAAU,SAAkB7oE,MAC1B,IAAI8oE,OAAS,CAGX,CAAC,SAAU,WAAYtS,OAAOmR,UAAU,UAAWnR,OAAOmR,UAAU,UAAW,GAAI,CAAC,UAAW,OAAQnR,OAAOmR,UAAU,eAAgBnR,OAAOmR,UAAU,eAAgB,EAAG,YAAa,CAAC,SAAU,OAAQnR,OAAOmR,UAAU,eAAgBnR,OAAOmR,UAAU,eAAgB,EAAG,aACjRznD,OAAS,UACT6oD,SAAW,CACTC,MAAO,WACL,OAAO9oD,MACT,EACA+oD,OAAQ,WAEN,OADAzoD,SAASa,KAAKhd,WAAWqjE,KAAKrjE,WACvBprB,IACT,EACA,MAAS,SAAgByD,IACvB,OAAOqsF,SAAS/nD,KAAK,KAAMtkC,GAC7B,EAEAwsF,KAAM,WAEJ,IAAIC,IAAM9kE,UACV,OAAOmyD,OAAOqS,UAAS,SAAUO,UAC/B5S,OAAOQ,KAAK8R,QAAQ,SAAUjQ,GAAIwQ,OAEhC,IAAI3sF,GAAK8iB,WAAW2pE,IAAIE,MAAM,MAAQF,IAAIE,MAAM,IAKhD7oD,SAAS6oD,MAAM,KAAI,WACjB,IAAIC,SAAW5sF,IAAMA,GAAGguB,MAAMzxB,KAAMorB,WAChCilE,UAAY9pE,WAAW8pE,SAASzoD,SAClCyoD,SAASzoD,UAAU0oD,SAASH,SAASI,QAAQnoD,KAAK+nD,SAAS1hE,SAASggE,KAAK0B,SAAS5nD,QAElF4nD,SAASC,MAAM,GAAK,QAAQpwF,KAAMyD,GAAK,CAAC4sF,UAAYjlE,UAExD,GACF,IACA8kE,IAAM,IACR,IAAGtoD,SACL,EACAG,KAAM,SAAcN,YAAaC,WAAY8oD,YAC3C,IAAIC,SAAW,EACf,SAAShiE,QAAQs7B,MAAOxiB,SAAUmpD,QAASC,SACzC,OAAO,WACL,IAAIt0D,KAAOr8B,KACTwxB,KAAOpG,UACPwlE,WAAa,WACX,IAAIP,SAAUtoD,KAKd,KAAIgiB,MAAQ0mC,UAAZ,CAOA,IAJAJ,SAAWK,QAAQj/D,MAAM4K,KAAM7K,SAId+V,SAASK,UACxB,MAAM,IAAItW,UAAU,4BAOtByW,KAAOsoD,WAIiB,WAAxBnsE,UAAUmsE,WAA8C,mBAAbA,WAA4BA,SAAStoD,KAG5ExhB,WAAWwhB,MAET4oD,QACF5oD,KAAKpqC,KAAK0yF,SAAU5hE,QAAQgiE,SAAUlpD,SAAU6mD,SAAUuC,SAAUliE,QAAQgiE,SAAUlpD,SAAU8mD,QAASsC,WAKzGF,WACA1oD,KAAKpqC,KAAK0yF,SAAU5hE,QAAQgiE,SAAUlpD,SAAU6mD,SAAUuC,SAAUliE,QAAQgiE,SAAUlpD,SAAU8mD,QAASsC,SAAUliE,QAAQgiE,SAAUlpD,SAAU6mD,SAAU7mD,SAASspD,eAOhKH,UAAYtC,WACd/xD,UAAO/7B,EACPkxB,KAAO,CAAC6+D,YAKTM,SAAWppD,SAASupD,aAAaz0D,KAAM7K,MA3C1C,CA6CF,EAEAvF,QAAU0kE,QAAUC,WAAa,WAC/B,IACEA,YACF,CAAE,MAAOxyF,GACHm/E,OAAOqS,SAASmB,eAClBxT,OAAOqS,SAASmB,cAAc3yF,EAAG6tB,QAAQ7X,OAMvC21C,MAAQ,GAAK0mC,WAGXC,UAAYrC,UACdhyD,UAAO/7B,EACPkxB,KAAO,CAACpzB,IAEVmpC,SAASypD,WAAW30D,KAAM7K,MAE9B,CACF,EAMEu4B,MACF99B,WAIIsxD,OAAOqS,SAASqB,aAClBhlE,QAAQ7X,MAAQmpE,OAAOqS,SAASqB,eAMvB1T,OAAOqS,SAASsB,eACzBjlE,QAAQ7X,MAAQmpE,OAAOqS,SAASsB,gBAElCh0F,OAAOuS,WAAWwc,SAEtB,CACF,CACA,OAAOsxD,OAAOqS,UAAS,SAAUO,UAE/BN,OAAO,GAAG,GAAGxnF,IAAIomB,QAAQ,EAAG0hE,SAAU5pE,WAAWiqE,YAAcA,WAAapC,SAAU+B,SAASU,aAG/FhB,OAAO,GAAG,GAAGxnF,IAAIomB,QAAQ,EAAG0hE,SAAU5pE,WAAWkhB,aAAeA,YAAc2mD,WAG9EyB,OAAO,GAAG,GAAGxnF,IAAIomB,QAAQ,EAAG0hE,SAAU5pE,WAAWmhB,YAAcA,WAAa2mD,SAC9E,IAAGzmD,SACL,EAGAA,QAAS,SAAiB+0C,KACxB,OAAc,MAAPA,IAAcY,OAAOe,OAAO3B,IAAKmT,UAAYA,QACtD,GAEFvoD,SAAW,CAAC,EA2Dd,OAxDAg2C,OAAOQ,KAAK8R,QAAQ,SAAUlxF,EAAGyxF,OAC/B,IAAIpmF,KAAOomF,MAAM,GACfe,YAAcf,MAAM,GAKtBN,SAASM,MAAM,IAAMpmF,KAAK3B,IAGtB8oF,aACFnnF,KAAK3B,KAAI,WAGP4+B,OAASkqD,WACX,GAGAtB,OAAO,EAAIlxF,GAAG,GAAG4wF,QAGjBM,OAAO,EAAIlxF,GAAG,GAAG4wF,QAEjBM,OAAO,GAAG,GAAGL,KAEbK,OAAO,GAAG,GAAGL,MAMfxlF,KAAK3B,IAAI+nF,MAAM,GAAGhB,MAKlB7nD,SAAS6oD,MAAM,IAAM,WAEnB,OADA7oD,SAAS6oD,MAAM,GAAK,QAAQpwF,OAASunC,cAAWjnC,EAAYN,KAAMorB,WAC3DprB,IACT,EAKAunC,SAAS6oD,MAAM,GAAK,QAAUpmF,KAAK0lF,QACrC,IAGAI,SAASloD,QAAQL,UAGbxgB,MACFA,KAAKppB,KAAK4pC,SAAUA,UAIfA,QACT,EAEA6pD,KAAM,SAAcC,aAClB,IAEEl7D,UAAY/K,UAAUxsB,OAEtBD,EAAIw3B,UAEJm7D,gBAAkBjqF,MAAM1I,GACxB4yF,cAAgBnV,OAAOz+E,KAAKytB,WAE5BomE,QAAUjU,OAAOqS,WAEjB6B,WAAa,SAAoB9yF,GAC/B,OAAO,SAAU+S,OACf4/E,gBAAgB3yF,GAAKqB,KACrBuxF,cAAc5yF,GAAKysB,UAAUxsB,OAAS,EAAIw9E,OAAOz+E,KAAKytB,WAAa1Z,QAC3DykB,WACNq7D,QAAQV,YAAYQ,gBAAiBC,cAEzC,CACF,EAGF,GAAIp7D,WAAa,IACfm4D,WAAW+C,YAAaG,QAAQppD,KAAKqpD,WAAW9yF,IAAI8vB,QAAS+iE,QAAQjpD,QAASpS,WAGtD,YAApBq7D,QAAQzB,SAAyBxpE,WAAWgrE,cAAc5yF,IAAM4yF,cAAc5yF,GAAGopC,OACnF,OAAOypD,QAAQzpD,OAKnB,KAAOppC,KACL2vF,WAAWiD,cAAc5yF,GAAI8yF,WAAW9yF,GAAI6yF,QAAQjpD,QAEtD,OAAOipD,QAAQ5pD,SACjB,IAKF,IAAI8pD,YAAc,yDAKlBnU,OAAOqS,SAASmB,cAAgB,SAAU38E,MAAOu9E,YAG3Cz0F,OAAO6rC,SAAW7rC,OAAO6rC,QAAQC,MAAQ50B,OAASs9E,YAAYjqE,KAAKrT,MAAM5S,OAC3EtE,OAAO6rC,QAAQC,KAAK,8BAAgC50B,MAAMob,QAASpb,MAAM2U,MAAO4oE,WAEpF,EACApU,OAAOqU,eAAiB,SAAUx9E,OAChClX,OAAOuS,YAAW,WAChB,MAAM2E,KACR,GACF,EAGA,IAAIy9E,UAAYtU,OAAOqS,WAwCvB,SAASkC,YACPzzF,SAAS6F,oBAAoB,mBAAoB4tF,WACjD50F,OAAOgH,oBAAoB,OAAQ4tF,WACnCvU,OAAO0P,OACT,CA3CA1P,OAAO95E,GAAGwpF,MAAQ,SAAUxpF,IAS1B,OARAouF,UAAU9pD,KAAKtkC,IAKP,OAAE,SAAU2Q,OAClBmpE,OAAOqU,eAAex9E,MACxB,IACOpU,IACT,EACAu9E,OAAOe,OAAO,CAEZK,SAAS,EAGToT,UAAW,EAEX9E,MAAO,SAAe+E,QAEP,IAATA,OAAkBzU,OAAOwU,UAAYxU,OAAOoB,WAKhDpB,OAAOoB,SAAU,GAGJ,IAATqT,QAAmBzU,OAAOwU,UAAY,GAK1CF,UAAUf,YAAYzyF,SAAU,CAACk/E,SACnC,IAEFA,OAAO0P,MAAMllD,KAAO8pD,UAAU9pD,KAaF,aAAxB1pC,SAAS+K,YAAqD,YAAxB/K,SAAS+K,aAA6B/K,SAAS06B,gBAAgBk5D,SAEvG/0F,OAAOuS,WAAW8tE,OAAO0P,QAGzB5uF,SAAS2F,iBAAiB,mBAAoB8tF,WAG9C50F,OAAO8G,iBAAiB,OAAQ8tF,YAKlC,IAAII,OAAS,SAASA,OAAOtU,MAAOn6E,GAAIkO,IAAKD,MAAOygF,UAAWC,SAAUC,KACvE,IAAI1zF,EAAI,EACNupC,IAAM01C,MAAMh/E,OACZ0zF,KAAc,MAAP3gF,IAGT,GAAoB,WAAhB0rE,OAAO1rE,KAET,IAAKhT,KADLwzF,WAAY,EACFxgF,IACRugF,OAAOtU,MAAOn6E,GAAI9E,EAAGgT,IAAIhT,IAAI,EAAMyzF,SAAUC,UAI1C,QAAc/xF,IAAVoR,QACTygF,WAAY,EACP5rE,WAAW7U,SACd2gF,KAAM,GAEJC,OAEED,KACF5uF,GAAG9F,KAAKigF,MAAOlsE,OACfjO,GAAK,OAIL6uF,KAAO7uF,GACPA,GAAK,SAAY8Q,KAAMg+E,KAAM7gF,OAC3B,OAAO4gF,KAAK30F,KAAK4/E,OAAOhpE,MAAO7C,MACjC,IAGAjO,IACF,KAAO9E,EAAIupC,IAAKvpC,IACd8E,GAAGm6E,MAAMj/E,GAAIgT,IAAK0gF,IAAM3gF,MAAQA,MAAM/T,KAAKigF,MAAMj/E,GAAIA,EAAG8E,GAAGm6E,MAAMj/E,GAAIgT,OAI3E,OAAIwgF,UACKvU,MAIL0U,KACK7uF,GAAG9F,KAAKigF,OAEV11C,IAAMzkC,GAAGm6E,MAAM,GAAIjsE,KAAOygF,QACnC,EAGII,UAAY,QACdC,WAAa,YAGf,SAASC,WAAWC,KAAMC,QACxB,OAAOA,OAAOn4C,aAChB,CAKA,SAASo4C,UAAU9gE,QACjB,OAAOA,OAAOxK,QAAQirE,UAAW,OAAOjrE,QAAQkrE,WAAYC,WAC9D,CACA,IAAII,WAAa,SAAoB/rF,OAOnC,OAA0B,IAAnBA,MAAMC,UAAqC,IAAnBD,MAAMC,YAAoBD,MAAMC,QACjE,EACA,SAAS+rF,OACP/yF,KAAK0+E,QAAUnB,OAAOmB,QAAUqU,KAAKvsE,KACvC,CACAusE,KAAKvsE,IAAM,EACXusE,KAAKt1F,UAAY,CACfi0B,MAAO,SAAe3qB,OAEpB,IAAI2K,MAAQ3K,MAAM/G,KAAK0+E,SA0BvB,OAvBKhtE,QACHA,MAAQ,CAAC,EAKLohF,WAAW/rF,SAGTA,MAAMC,SACRD,MAAM/G,KAAK0+E,SAAWhtE,MAMtBlU,OAAOwW,eAAejN,MAAO/G,KAAK0+E,QAAS,CACzChtE,MACAshF,cAAc,MAKfthF,KACT,EACAvR,IAAK,SAAa4G,MAAOme,KAAMxT,OAC7B,IAAIuhF,KACFvhE,MAAQ1xB,KAAK0xB,MAAM3qB,OAIrB,GAAoB,iBAATme,KACTwM,MAAMmhE,UAAU3tE,OAASxT,WAKzB,IAAKuhF,QAAQ/tE,KACXwM,MAAMmhE,UAAUI,OAAS/tE,KAAK+tE,MAGlC,OAAOvhE,KACT,EACAlxB,IAAK,SAAauG,MAAO4K,KACvB,YAAerR,IAARqR,IAAoB3R,KAAK0xB,MAAM3qB,OAEtCA,MAAM/G,KAAK0+E,UAAY33E,MAAM/G,KAAK0+E,SAASmU,UAAUlhF,KACvD,EACAugF,OAAQ,SAAgBnrF,MAAO4K,IAAKD,OAYlC,YAAYpR,IAARqR,KAAqBA,KAAsB,iBAARA,UAA8BrR,IAAVoR,MAClD1R,KAAKQ,IAAIuG,MAAO4K,MASzB3R,KAAKG,IAAI4G,MAAO4K,IAAKD,YAIJpR,IAAVoR,MAAsBA,MAAQC,IACvC,EACArJ,OAAQ,SAAgBvB,MAAO4K,KAC7B,IAAIhT,EACF+yB,MAAQ3qB,MAAM/G,KAAK0+E,SACrB,QAAcp+E,IAAVoxB,MAAJ,CAGA,QAAYpxB,IAARqR,IAAmB,CAarBhT,GAREgT,IAHEtK,MAAM6iB,QAAQvY,KAGVA,IAAIrK,IAAIurF,YAEdlhF,IAAMkhF,UAAUlhF,QAIH+f,MAAQ,CAAC/f,KAAOA,IAAIsgB,MAAMk8D,gBAAkB,IAEnDvvF,OACR,KAAOD,YACE+yB,MAAM/f,IAAIhT,GAErB,OAGY2B,IAARqR,KAAqB4rE,OAAOuB,cAAcptD,UAKxC3qB,MAAMC,SACRD,MAAM/G,KAAK0+E,cAAWp+E,SAEfyG,MAAM/G,KAAK0+E,SA7BtB,CAgCF,EACAwU,QAAS,SAAiBnsF,OACxB,IAAI2qB,MAAQ3qB,MAAM/G,KAAK0+E,SACvB,YAAiBp+E,IAAVoxB,QAAwB6rD,OAAOuB,cAAcptD,MACtD,GAEF,IAAIyhE,SAAW,IAAIJ,KACfK,SAAW,IAAIL,KAYfM,OAAS,gCACXC,WAAa,SAqBf,SAASC,SAASh/E,KAAM5C,IAAKuT,MAC3B,IAAI1jB,KAIJ,QAAalB,IAAT4kB,MAAwC,IAAlB3Q,KAAKvN,SAG7B,GAFAxF,KAAO,QAAUmQ,IAAI4V,QAAQ+rE,WAAY,OAAOl6D,cAE5B,iBADpBlU,KAAO3Q,KAAKzG,aAAatM,OACK,CAC5B,IACE0jB,KA9BR,SAAiBA,MACf,MAAa,SAATA,MAGS,UAATA,OAGS,SAATA,KACK,KAILA,QAAUA,KAAO,IACXA,KAENmuE,OAAO5rE,KAAKvC,MACPq2D,KAAKiY,MAAMtuE,MAEbA,KACT,CAWe8/C,CAAQ9/C,KACjB,CAAE,MAAO9mB,GAAI,CAGbg1F,SAASjzF,IAAIoU,KAAM5C,IAAKuT,KAC1B,MACEA,UAAO5kB,EAGX,OAAO4kB,IACT,CACAq4D,OAAOe,OAAO,CACZ4U,QAAS,SAAiB3+E,MACxB,OAAO6+E,SAASF,QAAQ3+E,OAAS4+E,SAASD,QAAQ3+E,KACpD,EACA2Q,KAAM,SAAc3Q,KAAM/S,KAAMiyF,OAC9B,OAAOL,SAASlB,OAAO39E,KAAM/S,KAAMiyF,MACrC,EACAC,WAAY,SAAoBn/E,KAAM/S,MACpC4xF,SAAS9qF,OAAOiM,KAAM/S,KACxB,EAGAiyF,MAAO,SAAel/E,KAAM/S,KAAM0jB,MAChC,OAAOiuE,SAASjB,OAAO39E,KAAM/S,KAAM0jB,KACrC,EACAyuE,YAAa,SAAqBp/E,KAAM/S,MACtC2xF,SAAS7qF,OAAOiM,KAAM/S,KACxB,IAEF+7E,OAAO95E,GAAG66E,OAAO,CACfp5D,KAAM,SAAcvT,IAAKD,OACvB,IAAI/S,EACF6C,KACA0jB,KACA3Q,KAAOvU,KAAK,GACZ4zF,MAAQr/E,MAAQA,KAAKtM,WAGvB,QAAY3H,IAARqR,IAAmB,CACrB,GAAI3R,KAAKpB,SACPsmB,KAAOkuE,SAAS5yF,IAAI+T,MACE,IAAlBA,KAAKvN,WAAmBmsF,SAAS3yF,IAAI+T,KAAM,iBAAiB,CAE9D,IADA5V,EAAIi1F,MAAMh1F,OACHD,KAGDi1F,MAAMj1F,IAEsB,KAD9B6C,KAAOoyF,MAAMj1F,GAAG6C,MACPkR,QAAQ,WACflR,KAAOqxF,UAAUrxF,KAAKgG,MAAM,IAC5B+rF,SAASh/E,KAAM/S,KAAM0jB,KAAK1jB,QAIhC2xF,SAAShzF,IAAIoU,KAAM,gBAAgB,EACrC,CAEF,OAAO2Q,IACT,CAGA,MAAuB,WAAnBhB,UAAUvS,KACL3R,KAAK+9E,MAAK,WACfqV,SAASjzF,IAAIH,KAAM2R,IACrB,IAEKugF,OAAOlyF,MAAM,SAAU0R,OAC5B,IAAIwT,KAOJ,GAAI3Q,WAAkBjU,IAAVoR,MAIV,YAAapR,KADb4kB,KAAOkuE,SAAS5yF,IAAI+T,KAAM5C,YAQbrR,KADb4kB,KAAOquE,SAASh/E,KAAM5C,MALbuT,UAWT,EAIFllB,KAAK+9E,MAAK,WAERqV,SAASjzF,IAAIH,KAAM2R,IAAKD,MAC1B,GACF,GAAG,KAAMA,MAAO0Z,UAAUxsB,OAAS,EAAG,MAAM,EAC9C,EACA80F,WAAY,SAAoB/hF,KAC9B,OAAO3R,KAAK+9E,MAAK,WACfqV,SAAS9qF,OAAOtI,KAAM2R,IACxB,GACF,IAEF4rE,OAAOe,OAAO,CACZ4Q,MAAO,SAAe36E,KAAM/Q,KAAM0hB,MAChC,IAAIgqE,MACJ,GAAI36E,KAYF,OAXA/Q,MAAQA,MAAQ,MAAQ,QACxB0rF,MAAQiE,SAAS3yF,IAAI+T,KAAM/Q,MAGvB0hB,QACGgqE,OAAS7nF,MAAM6iB,QAAQhF,MAC1BgqE,MAAQiE,SAASjB,OAAO39E,KAAM/Q,KAAM+5E,OAAO0B,UAAU/5D,OAErDgqE,MAAMptF,KAAKojB,OAGRgqE,OAAS,EAEpB,EACA2E,QAAS,SAAiBt/E,KAAM/Q,MAE9B,IAAI0rF,MAAQ3R,OAAO2R,MAAM36E,KADzB/Q,KAAOA,MAAQ,MAEbswF,YAAc5E,MAAMtwF,OACpB6E,GAAKyrF,MAAM5K,QACXyP,MAAQxW,OAAOyW,YAAYz/E,KAAM/Q,MAMxB,eAAPC,KACFA,GAAKyrF,MAAM5K,QACXwP,eAEErwF,KAGW,OAATD,MACF0rF,MAAM+E,QAAQ,qBAITF,MAAMG,KACbzwF,GAAG9F,KAAK4W,MAlBD,WACLgpE,OAAOsW,QAAQt/E,KAAM/Q,KACvB,GAgBoBuwF,SAEjBD,aAAeC,OAClBA,MAAMlL,MAAMuG,MAEhB,EAEA4E,YAAa,SAAqBz/E,KAAM/Q,MACtC,IAAImO,IAAMnO,KAAO,aACjB,OAAO2vF,SAAS3yF,IAAI+T,KAAM5C,MAAQwhF,SAASjB,OAAO39E,KAAM5C,IAAK,CAC3Dk3E,MAAOtL,OAAOmR,UAAU,eAAermF,KAAI,WACzC8qF,SAAS7qF,OAAOiM,KAAM,CAAC/Q,KAAO,QAASmO,KACzC,KAEJ,IAEF4rE,OAAO95E,GAAG66E,OAAO,CACf4Q,MAAO,SAAe1rF,KAAM0hB,MAC1B,IAAIivE,OAAS,EAMb,MALoB,iBAAT3wF,OACT0hB,KAAO1hB,KACPA,KAAO,KACP2wF,UAEE/oE,UAAUxsB,OAASu1F,OACd5W,OAAO2R,MAAMlvF,KAAK,GAAIwD,WAEflD,IAAT4kB,KAAqBllB,KAAOA,KAAK+9E,MAAK,WAC3C,IAAImR,MAAQ3R,OAAO2R,MAAMlvF,KAAMwD,KAAM0hB,MAGrCq4D,OAAOyW,YAAYh0F,KAAMwD,MACZ,OAATA,MAA8B,eAAb0rF,MAAM,IACzB3R,OAAOsW,QAAQ7zF,KAAMwD,KAEzB,GACF,EACAqwF,QAAS,SAAiBrwF,MACxB,OAAOxD,KAAK+9E,MAAK,WACfR,OAAOsW,QAAQ7zF,KAAMwD,KACvB,GACF,EACA4wF,WAAY,SAAoB5wF,MAC9B,OAAOxD,KAAKkvF,MAAM1rF,MAAQ,KAAM,GAClC,EAGAokC,QAAS,SAAiBpkC,KAAMm5E,KAC9B,IAAI0X,IACFr+D,MAAQ,EACRs+D,MAAQ/W,OAAOqS,WACfxuB,SAAWphE,KACXrB,EAAIqB,KAAKpB,OACT6vB,QAAU,aACAuH,OACNs+D,MAAMxD,YAAY1vB,SAAU,CAACA,UAEjC,EAMF,IALoB,iBAAT59D,OACTm5E,IAAMn5E,KACNA,UAAOlD,GAETkD,KAAOA,MAAQ,KACR7E,MACL01F,IAAMlB,SAAS3yF,IAAI4gE,SAASziE,GAAI6E,KAAO,gBAC5B6wF,IAAIxL,QACb7yD,QACAq+D,IAAIxL,MAAMxgF,IAAIomB,UAIlB,OADAA,UACO6lE,MAAM1sD,QAAQ+0C,IACvB,IAEF,IAAI4X,KAAO,sCAAsC9yF,OAC7C+yF,QAAU,IAAIltE,OAAO,iBAAmBitE,KAAO,cAAe,KAC9DE,UAAY,CAAC,MAAO,QAAS,SAAU,QACvC17D,gBAAkB16B,SAAS06B,gBAC3B27D,WAAa,SAAoBngF,MACjC,OAAOgpE,OAAOn7E,SAASmS,KAAKE,cAAeF,KAC7C,EACAogF,SAAW,CACTA,UAAU,GAQV57D,gBAAgB67D,cAClBF,WAAa,SAAoBngF,MAC/B,OAAOgpE,OAAOn7E,SAASmS,KAAKE,cAAeF,OAASA,KAAKqgF,YAAYD,YAAcpgF,KAAKE,aAC1F,GAEF,IAAIogF,mBAAqB,SAA4BtgF,KAAM5K,IAMzD,MAA8B,UAH9B4K,KAAO5K,IAAM4K,MAGDm4D,MAAMooB,SAA6C,KAAvBvgF,KAAKm4D,MAAMooB,SAKnDJ,WAAWngF,OAAyC,SAAhCgpE,OAAOwX,IAAIxgF,KAAM,UACvC,EACA,SAASygF,UAAUzgF,KAAM0+E,KAAMgC,WAAYC,OACzC,IAAIC,SACFl2B,MACAm2B,cAAgB,GAChBC,aAAeH,MAAQ,WACrB,OAAOA,MAAM3H,KACf,EAAI,WACF,OAAOhQ,OAAOwX,IAAIxgF,KAAM0+E,KAAM,GAChC,EACAqC,QAAUD,eACVr2B,KAAOi2B,YAAcA,WAAW,KAAO1X,OAAOgY,UAAUtC,MAAQ,GAAK,MAErEuC,cAAgBjhF,KAAKvN,WAAau2E,OAAOgY,UAAUtC,OAAkB,OAATj0B,OAAkBs2B,UAAYd,QAAQ/lF,KAAK8uE,OAAOwX,IAAIxgF,KAAM0+E,OAC1H,GAAIuC,eAAiBA,cAAc,KAAOx2B,KAAM,CAU9C,IAPAs2B,SAAoB,EAGpBt2B,KAAOA,MAAQw2B,cAAc,GAG7BA,eAAiBF,SAAW,EACrBF,iBAGL7X,OAAO7Q,MAAMn4D,KAAM0+E,KAAMuC,cAAgBx2B,OACpC,EAAIC,QAAU,GAAKA,MAAQo2B,eAAiBC,SAAW,MAAS,IACnEF,cAAgB,GAElBI,eAAgCv2B,MAGlCse,OAAO7Q,MAAMn4D,KAAM0+E,MADnBuC,eAAgC,GACSx2B,MAGzCi2B,WAAaA,YAAc,EAC7B,CAYA,OAXIA,aACFO,eAAiBA,gBAAkBF,SAAW,EAG9CH,SAAWF,WAAW,GAAKO,eAAiBP,WAAW,GAAK,GAAKA,WAAW,IAAMA,WAAW,GACzFC,QACFA,MAAMl2B,KAAOA,KACbk2B,MAAM1/D,MAAQggE,cACdN,MAAMz/D,IAAM0/D,WAGTA,QACT,CACA,IAAIM,kBAAoB,CAAC,EACzB,SAASC,kBAAkBnhF,MACzB,IAAIi2E,KACF7xD,IAAMpkB,KAAKE,cACX85D,SAAWh6D,KAAKg6D,SAChBumB,QAAUW,kBAAkBlnB,UAC9B,OAAIumB,UAGJtK,KAAO7xD,IAAIyzC,KAAKxgE,YAAY+sB,IAAIjtB,cAAc6iE,WAC9CumB,QAAUvX,OAAOwX,IAAIvK,KAAM,WAC3BA,KAAKzlF,WAAWq4E,YAAYoN,MACZ,SAAZsK,UACFA,QAAU,SAEZW,kBAAkBlnB,UAAYumB,QACvBA,QACT,CACA,SAASa,SAASv0B,SAAUw0B,MAQ1B,IAPA,IAAId,QACFvgF,KACAiU,OAAS,GACT/D,MAAQ,EACR7lB,OAASwiE,SAASxiE,OAGb6lB,MAAQ7lB,OAAQ6lB,SACrBlQ,KAAO6sD,SAAS38C,QACNioD,QAGVooB,QAAUvgF,KAAKm4D,MAAMooB,QACjBc,MAIc,SAAZd,UACFtsE,OAAO/D,OAAS0uE,SAAS3yF,IAAI+T,KAAM,YAAc,KAC5CiU,OAAO/D,SACVlQ,KAAKm4D,MAAMooB,QAAU,KAGE,KAAvBvgF,KAAKm4D,MAAMooB,SAAkBD,mBAAmBtgF,QAClDiU,OAAO/D,OAASixE,kBAAkBnhF,QAGpB,SAAZugF,UACFtsE,OAAO/D,OAAS,OAGhB0uE,SAAShzF,IAAIoU,KAAM,UAAWugF,WAMpC,IAAKrwE,MAAQ,EAAGA,MAAQ7lB,OAAQ6lB,QACT,MAAjB+D,OAAO/D,SACT28C,SAAS38C,OAAOioD,MAAMooB,QAAUtsE,OAAO/D,QAG3C,OAAO28C,QACT,CACAmc,OAAO95E,GAAG66E,OAAO,CACfsX,KAAM,WACJ,OAAOD,SAAS31F,MAAM,EACxB,EACA61F,KAAM,WACJ,OAAOF,SAAS31F,KAClB,EACA81F,OAAQ,SAAgB/F,OACtB,MAAqB,kBAAVA,MACFA,MAAQ/vF,KAAK41F,OAAS51F,KAAK61F,OAE7B71F,KAAK+9E,MAAK,WACX8W,mBAAmB70F,MACrBu9E,OAAOv9E,MAAM41F,OAEbrY,OAAOv9E,MAAM61F,MAEjB,GACF,IAEF,IAKIp1D,IACAuoB,MANA+sC,eAAiB,wBACjBC,SAAW,iCACXC,YAAc,qCAGdx1D,IADapiC,SAAS63F,yBACPtqF,YAAYvN,SAASqN,cAAc,SAClDs9C,MAAQ3qD,SAASqN,cAAc,UAM3BoxB,aAAa,OAAQ,SAC3BksB,MAAMlsB,aAAa,UAAW,WAC9BksB,MAAMlsB,aAAa,OAAQ,KAC3B2D,IAAI70B,YAAYo9C,OAIhB0zB,QAAQyZ,WAAa11D,IAAI21D,WAAU,GAAMA,WAAU,GAAM3O,UAAUiB,QAInEjoD,IAAIzH,UAAY,yBAChB0jD,QAAQ2Z,iBAAmB51D,IAAI21D,WAAU,GAAM3O,UAAUz0D,aAKzDyN,IAAIzH,UAAY,oBAChB0jD,QAAQ4Z,SAAW71D,IAAIgnD,UAIzB,IAAI8O,QAAU,CAIZC,MAAO,CAAC,EAAG,UAAW,YACtBC,IAAK,CAAC,EAAG,oBAAqB,uBAC9BvwD,GAAI,CAAC,EAAG,iBAAkB,oBAC1BwwD,GAAI,CAAC,EAAG,qBAAsB,yBAC9BC,SAAU,CAAC,EAAG,GAAI,KASpB,SAASC,OAAOpZ,QAASt3D,KAGvB,IAAItW,IAQJ,OANEA,SAD0C,IAAjC4tE,QAAQ3jD,qBACX2jD,QAAQ3jD,qBAAqB3T,KAAO,UACG,IAA7Bs3D,QAAQ/zE,iBAClB+zE,QAAQ/zE,iBAAiByc,KAAO,KAEhC,QAEI5lB,IAAR4lB,KAAqBA,KAAOqoD,SAASiP,QAASt3D,KACzCq3D,OAAOM,MAAM,CAACL,SAAU5tE,KAE1BA,GACT,CAGA,SAASinF,cAAcjZ,MAAOkZ,aAG5B,IAFA,IAAIn4F,EAAI,EACNuD,EAAI07E,MAAMh/E,OACLD,EAAIuD,EAAGvD,IACZw0F,SAAShzF,IAAIy9E,MAAMj/E,GAAI,cAAem4F,aAAe3D,SAAS3yF,IAAIs2F,YAAYn4F,GAAI,cAEtF,CA/BA43F,QAAQQ,MAAQR,QAAQS,MAAQT,QAAQU,SAAWV,QAAQlrC,QAAUkrC,QAAQC,MAC7ED,QAAQtwD,GAAKswD,QAAQG,GAGhBha,QAAQ4Z,SACXC,QAAQW,SAAWX,QAAQD,OAAS,CAAC,EAAG,+BAAgC,cA2B1E,IAAIa,MAAQ,YACZ,SAASC,cAAcxZ,MAAOJ,QAAS6Z,QAASC,UAAWC,SAWzD,IAVA,IAAIhjF,KACF8/E,IACAnuE,IACAsxE,KACAC,SACApZ,EACAqZ,SAAWla,QAAQ0Y,yBACnByB,MAAQ,GACRh5F,EAAI,EACJuD,EAAI07E,MAAMh/E,OACLD,EAAIuD,EAAGvD,IAEZ,IADA4V,KAAOqpE,MAAMj/E,KACQ,IAAT4V,KAEV,GAAqB,WAAjB8oE,OAAO9oE,MAGTgpE,OAAOM,MAAM8Z,MAAOpjF,KAAKvN,SAAW,CAACuN,MAAQA,WAGxC,GAAK4iF,MAAM1vE,KAAKlT,MAIhB,CAUL,IATA8/E,IAAMA,KAAOqD,SAAS9rF,YAAY4xE,QAAQ9xE,cAAc,QAGxDwa,KAAO8vE,SAASvnF,KAAK8F,OAAS,CAAC,GAAI,KAAK,GAAG6kB,cAC3Co+D,KAAOjB,QAAQrwE,MAAQqwE,QAAQI,SAC/BtC,IAAIr7D,UAAYw+D,KAAK,GAAKja,OAAOqa,cAAcrjF,MAAQijF,KAAK,GAG5DnZ,EAAImZ,KAAK,GACFnZ,KACLgW,IAAMA,IAAI5M,UAKZlK,OAAOM,MAAM8Z,MAAOtD,IAAIhR,aAGxBgR,IAAMqD,SAASvpB,YAGXxiE,YAAc,EACpB,MA1BEgsF,MAAM71F,KAAK07E,QAAQ7iD,eAAepmB,OAiCxC,IAFAmjF,SAAS/rF,YAAc,GACvBhN,EAAI,EACG4V,KAAOojF,MAAMh5F,MAElB,GAAI24F,WAAa/Z,OAAO2B,QAAQ3qE,KAAM+iF,YAAc,EAC9CC,SACFA,QAAQz1F,KAAKyS,WAejB,GAXAkjF,SAAW/C,WAAWngF,MAGtB8/E,IAAMuC,OAAOc,SAAS9rF,YAAY2I,MAAO,UAGrCkjF,UACFZ,cAAcxC,KAIZgD,QAEF,IADAhZ,EAAI,EACG9pE,KAAO8/E,IAAIhW,MACZ4X,YAAYxuE,KAAKlT,KAAK/Q,MAAQ,KAChC6zF,QAAQv1F,KAAKyS,MAKrB,OAAOmjF,QACT,CACA,IAAIG,eAAiB,sBACrB,SAASC,aACP,OAAO,CACT,CACA,SAASC,cACP,OAAO,CACT,CACA,SAASC,IAAIzjF,KAAM4X,MAAOpjB,SAAUmc,KAAMzhB,GAAIw0F,KAC5C,IAAIC,OAAQ10F,KAGZ,GAAyB,WAArB0gB,UAAUiI,OAAqB,CAOjC,IAAK3oB,OALmB,iBAAbuF,WAETmc,KAAOA,MAAQnc,SACfA,cAAWzI,GAEA6rB,MACX6rE,IAAIzjF,KAAM/Q,KAAMuF,SAAUmc,KAAMiH,MAAM3oB,MAAOy0F,KAE/C,OAAO1jF,IACT,CAiBA,GAhBY,MAAR2Q,MAAsB,MAANzhB,IAElBA,GAAKsF,SACLmc,KAAOnc,cAAWzI,GACH,MAANmD,KACe,iBAAbsF,UAETtF,GAAKyhB,KACLA,UAAO5kB,IAGPmD,GAAKyhB,KACLA,KAAOnc,SACPA,cAAWzI,KAGJ,IAAPmD,GACFA,GAAKs0F,iBACA,IAAKt0F,GACV,OAAO8Q,KAaT,OAXY,IAAR0jF,MACFC,OAASz0F,GACTA,GAAK,SAAYN,OAGf,OADAo6E,SAAS4a,IAAIh1F,OACN+0F,OAAOzmE,MAAMzxB,KAAMorB,UAC5B,EAGA3nB,GAAGk8E,KAAOuY,OAAOvY,OAASuY,OAAOvY,KAAOpC,OAAOoC,SAE1CprE,KAAKwpE,MAAK,WACfR,OAAOp6E,MAAMkF,IAAIrI,KAAMmsB,MAAO1oB,GAAIyhB,KAAMnc,SAC1C,GACF,CAmYA,SAASqvF,eAAezuF,GAAInG,KAAM60F,SAE3BA,SAQLlF,SAAShzF,IAAIwJ,GAAInG,MAAM,GACvB+5E,OAAOp6E,MAAMkF,IAAIsB,GAAInG,KAAM,CACzB47E,WAAW,EACXsR,QAAS,SAAiBvtF,OACxB,IAAIuhB,OACF4zE,MAAQnF,SAAS3yF,IAAIR,KAAMwD,MAC7B,GAAsB,EAAlBL,MAAMo1F,WAAiBv4F,KAAKwD,OAE9B,GAAK80F,OAwBO/a,OAAOp6E,MAAMwtF,QAAQntF,OAAS,CAAC,GAAGg1F,cAC5Cr1F,MAAMs1F,uBAdN,GAPAH,MAAQlc,OAAOz+E,KAAKytB,WACpB+nE,SAAShzF,IAAIH,KAAMwD,KAAM80F,OAGzBt4F,KAAKwD,QACLkhB,OAASyuE,SAAS3yF,IAAIR,KAAMwD,MAC5B2vF,SAAShzF,IAAIH,KAAMwD,MAAM,GACrB80F,QAAU5zE,OAIZ,OAFAvhB,MAAMu1F,2BACNv1F,MAAMkB,iBACCqgB,YAeF4zE,QAETnF,SAAShzF,IAAIH,KAAMwD,KAAM+5E,OAAOp6E,MAAMw1F,QAAQL,MAAM,GAAIA,MAAM9wF,MAAM,GAAIxH,OAUxEmD,MAAMs1F,kBACNt1F,MAAMy1F,8BAAgCd,WAE1C,UA5D+Bx3F,IAA3B6yF,SAAS3yF,IAAImJ,GAAInG,OACnB+5E,OAAOp6E,MAAMkF,IAAIsB,GAAInG,KAAMs0F,WA6DjC,CA9bAva,OAAOp6E,MAAQ,CACb84E,OAAQ,CAAC,EACT5zE,IAAK,SAAakM,KAAM4X,MAAOukE,QAASxrE,KAAMnc,UAC5C,IAAI8vF,YACFC,YACAzE,IACAzyF,OACA4D,EACAuzF,UACApI,QACAqI,SACAx1F,KACAy1F,WACAC,SACAC,SAAWhG,SAAS3yF,IAAI+T,MAG1B,GAAKu+E,WAAWv+E,MAqChB,IAhCIm8E,QAAQA,UAEVA,SADAmI,YAAcnI,SACQA,QACtB3nF,SAAW8vF,YAAY9vF,UAKrBA,UACFw0E,OAAOroD,KAAK6wD,gBAAgBhtD,gBAAiBhwB,UAI1C2nF,QAAQ/Q,OACX+Q,QAAQ/Q,KAAOpC,OAAOoC,SAIlB/9E,OAASu3F,SAASv3F,UACtBA,OAASu3F,SAASv3F,OAASpE,OAAOW,OAAO,QAErC26F,YAAcK,SAASC,UAC3BN,YAAcK,SAASC,OAAS,SAAUh7F,GAGxC,OAAwCm/E,OAAOp6E,MAAMk2F,YAAcj7F,EAAEoF,KAAO+5E,OAAOp6E,MAAMm2F,SAAS7nE,MAAMld,KAAM6W,gBAAa9qB,CAC7H,GAKFkF,GADA2mB,OAASA,OAAS,IAAI8F,MAAMk8D,gBAAkB,CAAC,KACrCvvF,OACH4G,KAELhC,KAAO01F,UADP7E,IAAMwD,eAAeppF,KAAK0d,MAAM3mB,KAAO,IACjB,GACtByzF,YAAc5E,IAAI,IAAM,IAAIl5D,MAAM,KAAKqvB,OAGlChnD,OAKLmtF,QAAUpT,OAAOp6E,MAAMwtF,QAAQntF,OAAS,CAAC,EAGzCA,MAAQuF,SAAW4nF,QAAQ6H,aAAe7H,QAAQ4I,WAAa/1F,KAG/DmtF,QAAUpT,OAAOp6E,MAAMwtF,QAAQntF,OAAS,CAAC,EAGzCu1F,UAAYxb,OAAOe,OAAO,CACxB96E,KACA01F,SACAh0E,KACAwrE,QACA/Q,KAAM+Q,QAAQ/Q,KACd52E,SACAs5E,aAAct5E,UAAYw0E,OAAOuI,KAAK7zD,MAAMowD,aAAa56D,KAAK1e,UAC9Dq2E,UAAW6Z,WAAWx7D,KAAK,MAC1Bo7D,cAGGG,SAAWp3F,OAAO4B,UACtBw1F,SAAWp3F,OAAO4B,MAAQ,IACjBg2F,cAAgB,EAGpB7I,QAAQ8I,QAAqE,IAA5D9I,QAAQ8I,MAAM97F,KAAK4W,KAAM2Q,KAAM+zE,WAAYH,cAC3DvkF,KAAKvQ,kBACPuQ,KAAKvQ,iBAAiBR,KAAMs1F,cAI9BnI,QAAQtoF,MACVsoF,QAAQtoF,IAAI1K,KAAK4W,KAAMwkF,WAClBA,UAAUrI,QAAQ/Q,OACrBoZ,UAAUrI,QAAQ/Q,KAAO+Q,QAAQ/Q,OAKjC52E,SACFiwF,SAASrmF,OAAOqmF,SAASQ,gBAAiB,EAAGT,WAE7CC,SAASl3F,KAAKi3F,WAIhBxb,OAAOp6E,MAAM84E,OAAOz4E,OAAQ,EAEhC,EAEA8E,OAAQ,SAAgBiM,KAAM4X,MAAOukE,QAAS3nF,SAAU2wF,aACtD,IAAIrb,EACFsb,UACAtF,IACAzyF,OACA4D,EACAuzF,UACApI,QACAqI,SACAx1F,KACAy1F,WACAC,SACAC,SAAWhG,SAASD,QAAQ3+E,OAAS4+E,SAAS3yF,IAAI+T,MACpD,GAAK4kF,WAAcv3F,OAASu3F,SAASv3F,QAArC,CAOA,IADA4D,GADA2mB,OAASA,OAAS,IAAI8F,MAAMk8D,gBAAkB,CAAC,KACrCvvF,OACH4G,KAML,GAJAhC,KAAO01F,UADP7E,IAAMwD,eAAeppF,KAAK0d,MAAM3mB,KAAO,IACjB,GACtByzF,YAAc5E,IAAI,IAAM,IAAIl5D,MAAM,KAAKqvB,OAGlChnD,KAAL,CAaA,IAPAmtF,QAAUpT,OAAOp6E,MAAMwtF,QAAQntF,OAAS,CAAC,EAEzCw1F,SAAWp3F,OADX4B,MAAQuF,SAAW4nF,QAAQ6H,aAAe7H,QAAQ4I,WAAa/1F,OACpC,GAC3B6wF,IAAMA,IAAI,IAAM,IAAI/sE,OAAO,UAAY2xE,WAAWx7D,KAAK,iBAAmB,WAG1Ek8D,UAAYtb,EAAI2a,SAASp6F,OAClBy/E,KACL0a,UAAYC,SAAS3a,IAChBqb,aAAeR,WAAaH,UAAUG,UAAexI,SAAWA,QAAQ/Q,OAASoZ,UAAUpZ,MAAW0U,MAAOA,IAAI5sE,KAAKsxE,UAAU3Z,YAAiBr2E,UAAYA,WAAagwF,UAAUhwF,WAAyB,OAAbA,WAAqBgwF,UAAUhwF,YAClOiwF,SAASrmF,OAAO0rE,EAAG,GACf0a,UAAUhwF,UACZiwF,SAASQ,gBAEP7I,QAAQroF,QACVqoF,QAAQroF,OAAO3K,KAAK4W,KAAMwkF,YAO5BY,YAAcX,SAASp6F,SACpB+xF,QAAQiJ,WAAyE,IAA7DjJ,QAAQiJ,SAASj8F,KAAK4W,KAAM0kF,WAAYE,SAASC,SACxE7b,OAAOz5E,YAAYyQ,KAAM/Q,KAAM21F,SAASC,eAEnCx3F,OAAO4B,MA3BhB,MAJE,IAAKA,QAAQ5B,OACX27E,OAAOp6E,MAAMmF,OAAOiM,KAAM/Q,KAAO2oB,MAAM3mB,GAAIkrF,QAAS3nF,UAAU,GAmChEw0E,OAAOuB,cAAcl9E,SACvBuxF,SAAS7qF,OAAOiM,KAAM,gBAjDxB,CAmDF,EACA+kF,SAAU,SAAkBO,aAC1B,IAAIl7F,EACF0/E,EACAzuE,IACAg4E,QACAmR,UACAe,aACAtoE,KAAO,IAAInqB,MAAM+jB,UAAUxsB,QAE3BuE,MAAQo6E,OAAOp6E,MAAM42F,IAAIF,aACzBb,UAAY7F,SAAS3yF,IAAIR,KAAM,WAAaxC,OAAOW,OAAO,OAAOgF,MAAMK,OAAS,GAChFmtF,QAAUpT,OAAOp6E,MAAMwtF,QAAQxtF,MAAMK,OAAS,CAAC,EAIjD,IADAguB,KAAK,GAAKruB,MACLxE,EAAI,EAAGA,EAAIysB,UAAUxsB,OAAQD,IAChC6yB,KAAK7yB,GAAKysB,UAAUzsB,GAKtB,GAHAwE,MAAM62F,eAAiBh6F,MAGnB2wF,QAAQsJ,cAAyD,IAA1CtJ,QAAQsJ,YAAYt8F,KAAKqC,KAAMmD,OAA1D,CASA,IAJA22F,aAAevc,OAAOp6E,MAAM61F,SAASr7F,KAAKqC,KAAMmD,MAAO61F,UAGvDr6F,EAAI,GACIipF,QAAUkS,aAAan7F,QAAUwE,MAAM+2F,wBAG7C,IAFA/2F,MAAM+N,cAAgB02E,QAAQrzE,KAC9B8pE,EAAI,GACI0a,UAAYnR,QAAQoR,SAAS3a,QAAUl7E,MAAMy1F,iCAG9Cz1F,MAAMg3F,aAAsC,IAAxBpB,UAAU3Z,YAAuBj8E,MAAMg3F,WAAW1yE,KAAKsxE,UAAU3Z,aACxFj8E,MAAM41F,UAAYA,UAClB51F,MAAM+hB,KAAO6zE,UAAU7zE,UAEX5kB,KADZsP,MAAQ2tE,OAAOp6E,MAAMwtF,QAAQoI,UAAUG,WAAa,CAAC,GAAGE,QAAUL,UAAUrI,SAASj/D,MAAMm2D,QAAQrzE,KAAMid,SAE1E,KAAxBruB,MAAMuhB,OAAS9U,OAClBzM,MAAMkB,iBACNlB,MAAMs1F,oBAWhB,OAHI9H,QAAQyJ,cACVzJ,QAAQyJ,aAAaz8F,KAAKqC,KAAMmD,OAE3BA,MAAMuhB,MA/Bb,CAgCF,EACAs0E,SAAU,SAAkB71F,MAAOk3F,WACjC,IAAI17F,EACFo6F,UACA1Y,IACAia,gBACAC,iBACAT,aAAe,GACfN,cAAgBa,UAAUb,cAC1BjM,IAAMpqF,MAAMQ,OAGd,GAAI61F,eAGJjM,IAAIvmF,YAMa,UAAf7D,MAAMK,MAAoBL,MAAM8J,QAAU,GAC1C,KAAOsgF,MAAQvtF,KAAMutF,IAAMA,IAAIxoF,YAAc/E,KAG3C,GAAqB,IAAjButF,IAAIvmF,WAAmC,UAAf7D,MAAMK,OAAqC,IAAjB+pF,IAAIrK,UAAoB,CAG5E,IAFAoX,gBAAkB,GAClBC,iBAAmB,CAAC,EACf57F,EAAI,EAAGA,EAAI66F,cAAe76F,SAKC2B,IAA1Bi6F,iBADJla,KAHA0Y,UAAYsB,UAAU17F,IAGNoK,SAAW,OAEzBwxF,iBAAiBla,KAAO0Y,UAAU1W,aAAe9E,OAAO8C,IAAKrgF,MAAMykB,MAAM8oE,MAAQ,EAAIhQ,OAAOroD,KAAKmrD,IAAKrgF,KAAM,KAAM,CAACutF,MAAM3uF,QAEvH27F,iBAAiBla,MACnBia,gBAAgBx4F,KAAKi3F,WAGrBuB,gBAAgB17F,QAClBk7F,aAAah4F,KAAK,CAChByS,KAAMg5E,IACNyL,SAAUsB,iBAGhB,CAYJ,OAPA/M,IAAMvtF,KACFw5F,cAAgBa,UAAUz7F,QAC5Bk7F,aAAah4F,KAAK,CAChByS,KAAMg5E,IACNyL,SAAUqB,UAAU7yF,MAAMgyF,iBAGvBM,YACT,EACAU,QAAS,SAAiBh5F,KAAMi5F,MAC9Bj9F,OAAOwW,eAAeupE,OAAOmd,MAAMj9F,UAAW+D,KAAM,CAClDyS,YAAY,EACZ++E,cAAc,EACdxyF,IAAK+lB,WAAWk0E,MAAQ,WACtB,GAAIz6F,KAAK26F,cACP,OAAOF,KAAKz6F,KAAK26F,cAErB,EAAI,WACF,GAAI36F,KAAK26F,cACP,OAAO36F,KAAK26F,cAAcn5F,KAE9B,EACArB,IAAK,SAAauR,OAChBlU,OAAOwW,eAAehU,KAAMwB,KAAM,CAChCyS,YAAY,EACZ++E,cAAc,EACd4H,UAAU,EACVlpF,OAEJ,GAEJ,EACAqoF,IAAK,SAAaY,eAChB,OAAOA,cAAcpd,OAAOmB,SAAWic,cAAgB,IAAIpd,OAAOmd,MAAMC,cAC1E,EACAhK,QAAS,CACPkK,KAAM,CAEJC,UAAU,GAEZC,MAAO,CAELtB,MAAO,SAAev0E,MAGpB,IAAIvb,GAAK3J,MAAQklB,KASjB,OANI6wE,eAAetuE,KAAK9d,GAAGnG,OAASmG,GAAGoxF,OAASxsB,SAAS5kE,GAAI,UAE3DyuF,eAAezuF,GAAI,SAAS,IAIvB,CACT,EACAgvF,QAAS,SAAiBzzE,MAGxB,IAAIvb,GAAK3J,MAAQklB,KAQjB,OALI6wE,eAAetuE,KAAK9d,GAAGnG,OAASmG,GAAGoxF,OAASxsB,SAAS5kE,GAAI,UAC3DyuF,eAAezuF,GAAI,UAId,CACT,EAGAgtF,SAAU,SAAkBxzF,OAC1B,IAAIQ,OAASR,MAAMQ,OACnB,OAAOoyF,eAAetuE,KAAK9jB,OAAOH,OAASG,OAAOo3F,OAASxsB,SAAS5qE,OAAQ,UAAYwvF,SAAS3yF,IAAImD,OAAQ,UAAY4qE,SAAS5qE,OAAQ,IAC5I,GAEFq3F,aAAc,CACZZ,aAAc,SAAsBj3F,YAGb7C,IAAjB6C,MAAMuhB,QAAwBvhB,MAAMw3F,gBACtCx3F,MAAMw3F,cAAcM,YAAc93F,MAAMuhB,OAE5C,KA2EN64D,OAAOz5E,YAAc,SAAUyQ,KAAM/Q,KAAM41F,QAErC7kF,KAAKrQ,qBACPqQ,KAAKrQ,oBAAoBV,KAAM41F,OAEnC,GACA7b,OAAOmd,MAAQ,SAAU5d,IAAKppD,OAE5B,KAAM1zB,gBAAgBu9E,OAAOmd,OAC3B,OAAO,IAAInd,OAAOmd,MAAM5d,IAAKppD,OAI3BopD,KAAOA,IAAIt5E,MACbxD,KAAK26F,cAAgB7d,IACrB98E,KAAKwD,KAAOs5E,IAAIt5E,KAIhBxD,KAAKk7F,mBAAqBpe,IAAIqe,uBAA6C76F,IAAzBw8E,IAAIqe,mBAElC,IAApBre,IAAIme,YAAwBnD,WAAaC,YAKzC/3F,KAAK2D,OAASm5E,IAAIn5E,QAAkC,IAAxBm5E,IAAIn5E,OAAOqD,SAAiB81E,IAAIn5E,OAAOoB,WAAa+3E,IAAIn5E,OACpF3D,KAAKkR,cAAgB4rE,IAAI5rE,cACzBlR,KAAKoE,cAAgB04E,IAAI14E,eAIzBpE,KAAKwD,KAAOs5E,IAIVppD,OACF6pD,OAAOe,OAAOt+E,KAAM0zB,OAItB1zB,KAAKo7F,UAAYte,KAAOA,IAAIse,WAAavlE,KAAKC,MAG9C91B,KAAKu9E,OAAOmB,UAAW,CACzB,GAIajhF,UAAY,CACvB6mB,YAAai5D,OAAOmd,MACpBQ,mBAAoBnD,YACpBmC,qBAAsBnC,YACtBa,8BAA+Bb,YAC/BsD,aAAa,EACbh3F,eAAgB,WACd,IAAIjG,EAAI4B,KAAK26F,cACb36F,KAAKk7F,mBAAqBpD,WACtB15F,IAAM4B,KAAKq7F,aACbj9F,EAAEiG,gBAEN,EACAo0F,gBAAiB,WACf,IAAIr6F,EAAI4B,KAAK26F,cACb36F,KAAKk6F,qBAAuBpC,WACxB15F,IAAM4B,KAAKq7F,aACbj9F,EAAEq6F,iBAEN,EACAC,yBAA0B,WACxB,IAAIt6F,EAAI4B,KAAK26F,cACb36F,KAAK44F,8BAAgCd,WACjC15F,IAAM4B,KAAKq7F,aACbj9F,EAAEs6F,2BAEJ14F,KAAKy4F,iBACP,GAIFlb,OAAOQ,KAAK,CACVvtE,QAAQ,EACRhS,SAAS,EACTC,YAAY,EACZsS,gBAAgB,EAChBN,SAAS,EACTR,QAAQ,EACRqrF,YAAY,EACZ5qF,SAAS,EACT6qF,OAAO,EACPC,OAAO,EACP7qF,UAAU,EACV8qF,MAAM,EACN,MAAQ,EACRve,MAAM,EACNwe,UAAU,EACV/pF,KAAK,EACLgqF,SAAS,EACT1uF,QAAQ,EACRpO,SAAS,EACTE,SAAS,EACTE,SAAS,EACT28F,SAAS,EACTC,SAAS,EACT38F,WAAW,EACXO,aAAa,EACbq8F,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXzqF,SAAS,EACTzE,OAAO,GACNwwE,OAAOp6E,MAAMq3F,SAChBjd,OAAOQ,KAAK,CACVoK,MAAO,UACP+T,KAAM,aACL,SAAU14F,KAAMg1F,cACjB,SAAS2D,mBAAmBtC,aAC1B,GAAIx7F,SAAS+9F,aAAc,CAQzB,IAAIhD,OAASjG,SAAS3yF,IAAIR,KAAM,UAC9BmD,MAAQo6E,OAAOp6E,MAAM42F,IAAIF,aAC3B12F,MAAMK,KAA4B,YAArBq2F,YAAYr2F,KAAqB,QAAU,OACxDL,MAAMk4F,aAAc,EAGpBjC,OAAOS,aAMH12F,MAAMQ,SAAWR,MAAM+N,eAIzBkoF,OAAOj2F,MAEX,MAGEo6E,OAAOp6E,MAAMk5F,SAAS7D,aAAcqB,YAAYl2F,OAAQ45E,OAAOp6E,MAAM42F,IAAIF,aAE7E,CACAtc,OAAOp6E,MAAMwtF,QAAQntF,MAAQ,CAE3Bi2F,MAAO,WACL,IAAI6C,SAMJ,GADAlE,eAAep4F,KAAMwD,MAAM,IACvBnF,SAAS+9F,aAYX,OAAO,GAPPE,SAAWnJ,SAAS3yF,IAAIR,KAAMw4F,gBAE5Bx4F,KAAKgE,iBAAiBw0F,aAAc2D,oBAEtChJ,SAAShzF,IAAIH,KAAMw4F,cAAe8D,UAAY,GAAK,EAKvD,EACA3D,QAAS,WAKP,OAHAP,eAAep4F,KAAMwD,OAGd,CACT,EACAo2F,SAAU,WACR,IAAI0C,SACJ,IAAIj+F,SAAS+9F,aAUX,OAAO,GATPE,SAAWnJ,SAAS3yF,IAAIR,KAAMw4F,cAAgB,GAK5CrF,SAAShzF,IAAIH,KAAMw4F,aAAc8D,WAHjCt8F,KAAKkE,oBAAoBs0F,aAAc2D,oBACvChJ,SAAS7qF,OAAOtI,KAAMw4F,cAQ5B,EAGA7B,SAAU,SAAkBxzF,OAC1B,OAAOgwF,SAAS3yF,IAAI2C,MAAMQ,OAAQH,KACpC,EACAg1F,cAeFjb,OAAOp6E,MAAMwtF,QAAQ6H,cAAgB,CACnCiB,MAAO,WAGL,IAAI9gE,IAAM34B,KAAKyU,eAAiBzU,KAAK3B,UAAY2B,KAC/Cu8F,WAAal+F,SAAS+9F,aAAep8F,KAAO24B,IAC5C2jE,SAAWnJ,SAAS3yF,IAAI+7F,WAAY/D,cAMjC8D,WACCj+F,SAAS+9F,aACXp8F,KAAKgE,iBAAiBw0F,aAAc2D,oBAEpCxjE,IAAI30B,iBAAiBR,KAAM24F,oBAAoB,IAGnDhJ,SAAShzF,IAAIo8F,WAAY/D,cAAe8D,UAAY,GAAK,EAC3D,EACA1C,SAAU,WACR,IAAIjhE,IAAM34B,KAAKyU,eAAiBzU,KAAK3B,UAAY2B,KAC/Cu8F,WAAal+F,SAAS+9F,aAAep8F,KAAO24B,IAC5C2jE,SAAWnJ,SAAS3yF,IAAI+7F,WAAY/D,cAAgB,EACjD8D,SAQHnJ,SAAShzF,IAAIo8F,WAAY/D,aAAc8D,WAPnCj+F,SAAS+9F,aACXp8F,KAAKkE,oBAAoBs0F,aAAc2D,oBAEvCxjE,IAAIz0B,oBAAoBV,KAAM24F,oBAAoB,GAEpDhJ,SAAS7qF,OAAOi0F,WAAY/D,cAIhC,EAEJ,IAUAjb,OAAOQ,KAAK,CACVye,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,eACb,SAAUC,KAAM7C,KACjBxc,OAAOp6E,MAAMwtF,QAAQiM,MAAQ,CAC3BpE,aAAcuB,IACdR,SAAUQ,IACVX,OAAQ,SAAgBj2F,OACtB,IAAIyM,IAEFitF,QAAU15F,MAAMiB,cAChB20F,UAAY51F,MAAM41F,UASpB,OALK8D,UAAWA,UANL78F,MAM4Bu9E,OAAOn7E,SANnCpC,KAMoD68F,YAC7D15F,MAAMK,KAAOu1F,UAAUG,SACvBtpF,IAAMmpF,UAAUrI,QAAQj/D,MAAMzxB,KAAMorB,WACpCjoB,MAAMK,KAAOu2F,KAERnqF,GACT,EAEJ,IACA2tE,OAAO95E,GAAG66E,OAAO,CACfwe,GAAI,SAAY3wE,MAAOpjB,SAAUmc,KAAMzhB,IACrC,OAAOu0F,IAAIh4F,KAAMmsB,MAAOpjB,SAAUmc,KAAMzhB,GAC1C,EACAw0F,IAAK,SAAa9rE,MAAOpjB,SAAUmc,KAAMzhB,IACvC,OAAOu0F,IAAIh4F,KAAMmsB,MAAOpjB,SAAUmc,KAAMzhB,GAAI,EAC9C,EACA00F,IAAK,SAAahsE,MAAOpjB,SAAUtF,IACjC,IAAIs1F,UAAWv1F,KACf,GAAI2oB,OAASA,MAAM9nB,gBAAkB8nB,MAAM4sE,UAIzC,OAFAA,UAAY5sE,MAAM4sE,UAClBxb,OAAOpxD,MAAM6tE,gBAAgB7B,IAAIY,UAAU3Z,UAAY2Z,UAAUG,SAAW,IAAMH,UAAU3Z,UAAY2Z,UAAUG,SAAUH,UAAUhwF,SAAUgwF,UAAUrI,SACnJ1wF,KAET,GAAyB,WAArBkkB,UAAUiI,OAAqB,CAEjC,IAAK3oB,QAAQ2oB,MACXnsB,KAAKm4F,IAAI30F,KAAMuF,SAAUojB,MAAM3oB,OAEjC,OAAOxD,IACT,CASA,OARiB,IAAb+I,UAA0C,mBAAbA,WAE/BtF,GAAKsF,SACLA,cAAWzI,IAEF,IAAPmD,KACFA,GAAKs0F,aAEA/3F,KAAK+9E,MAAK,WACfR,OAAOp6E,MAAMmF,OAAOtI,KAAMmsB,MAAO1oB,GAAIsF,SACvC,GACF,IAEF,IAIEg0F,aAAe,wBAEfC,SAAW,oCACXC,aAAe,6BAGjB,SAASC,mBAAmB3oF,KAAM25E,SAChC,OAAI3f,SAASh6D,KAAM,UAAYg6D,SAA8B,KAArB2f,QAAQlnF,SAAkBknF,QAAUA,QAAQ/f,WAAY,OACvFoP,OAAOhpE,MAAMwoB,SAAS,SAAS,IAEjCxoB,IACT,CAGA,SAAS4oF,cAAc5oF,MAErB,OADAA,KAAK/Q,MAAsC,OAA9B+Q,KAAKzG,aAAa,SAAoB,IAAMyG,KAAK/Q,KACvD+Q,IACT,CACA,SAAS6oF,cAAc7oF,MAMrB,MALsC,WAAjCA,KAAK/Q,MAAQ,IAAIgE,MAAM,EAAG,GAC7B+M,KAAK/Q,KAAO+Q,KAAK/Q,KAAKgE,MAAM,GAE5B+M,KAAK4vE,gBAAgB,QAEhB5vE,IACT,CACA,SAAS8oF,eAAevgB,IAAKwgB,MAC3B,IAAI3+F,EAAGuD,EAAGsB,KAAgB+5F,SAAUC,SAAU57F,OAC9C,GAAsB,IAAlB07F,KAAKt2F,SAAT,CAKA,GAAImsF,SAASD,QAAQpW,OAEnBl7E,OADWuxF,SAAS3yF,IAAIs8E,KACNl7E,QAGhB,IAAK4B,QADL2vF,SAAS7qF,OAAOg1F,KAAM,iBACT17F,OACX,IAAKjD,EAAI,EAAGuD,EAAIN,OAAO4B,MAAM5E,OAAQD,EAAIuD,EAAGvD,IAC1C4+E,OAAOp6E,MAAMkF,IAAIi1F,KAAM95F,KAAM5B,OAAO4B,MAAM7E,IAO9Cy0F,SAASF,QAAQpW,OACnBygB,SAAWnK,SAASlB,OAAOpV,KAC3B0gB,SAAWjgB,OAAOe,OAAO,CAAC,EAAGif,UAC7BnK,SAASjzF,IAAIm9F,KAAME,UApBrB,CAsBF,CAGA,SAASC,SAAS3gB,IAAKwgB,MACrB,IAAI/uB,SAAW+uB,KAAK/uB,SAASn1C,cAGZ,UAAbm1C,UAAwBwnB,eAAetuE,KAAKq1D,IAAIt5E,MAClD85F,KAAK5U,QAAU5L,IAAI4L,QAGG,UAAbna,UAAqC,aAAbA,WACjC+uB,KAAKtqE,aAAe8pD,IAAI9pD,aAE5B,CACA,SAAS0qE,SAAS7pE,WAAYrC,KAAM9wB,SAAU62F,SAE5C/lE,KAAO6qD,KAAK7qD,MACZ,IAAIkmE,SACF1Z,MACAqZ,QACAsG,WACA5vB,KACAp1C,IACAh6B,EAAI,EACJuD,EAAI2xB,WAAWj1B,OACfg/F,SAAW17F,EAAI,EACfwP,MAAQ8f,KAAK,GACbqsE,gBAAkBt3E,WAAW7U,OAG/B,GAAImsF,iBAAmB37F,EAAI,GAAsB,iBAAVwP,QAAuBgrE,QAAQyZ,YAAc6G,SAASv1E,KAAK/V,OAChG,OAAOmiB,WAAWkqD,MAAK,SAAUt5D,OAC/B,IAAIrnB,KAAOy2B,WAAWlP,GAAGF,OACrBo5E,kBACFrsE,KAAK,GAAK9f,MAAM/T,KAAKqC,KAAMykB,MAAOrnB,KAAK0gG,SAEzCJ,SAAStgG,KAAMo0B,KAAM9wB,SAAU62F,QACjC,IAEF,GAAIr1F,IAEF87E,OADA0Z,SAAWN,cAAc5lE,KAAMqC,WAAW,GAAGpf,eAAe,EAAOof,WAAY0jE,UAC9DppB,WACkB,IAA/BupB,SAASrU,WAAWzkF,SACtB84F,SAAW1Z,OAITA,OAASuZ,SAAS,CAOpB,IALAoG,YADAtG,QAAU9Z,OAAOj2E,IAAIsvF,OAAOc,SAAU,UAAWyF,gBAC5Bv+F,OAKdD,EAAIuD,EAAGvD,IACZovE,KAAO2pB,SACH/4F,IAAMi/F,WACR7vB,KAAOwP,OAAO7kC,MAAMq1B,MAAM,GAAM,GAG5B4vB,YAGFpgB,OAAOM,MAAMwZ,QAAST,OAAO7oB,KAAM,YAGvCrtE,SAAS/C,KAAKk2B,WAAWl1B,GAAIovE,KAAMpvE,GAErC,GAAIg/F,WAOF,IANAhlE,IAAM0+D,QAAQA,QAAQz4F,OAAS,GAAG6V,cAGlC8oE,OAAOj2E,IAAI+vF,QAAS+F,eAGfz+F,EAAI,EAAGA,EAAIg/F,WAAYh/F,IAC1BovE,KAAOspB,QAAQ14F,GACXs3F,YAAYxuE,KAAKsmD,KAAKvqE,MAAQ,MAAQ2vF,SAASjB,OAAOnkB,KAAM,eAAiBwP,OAAOn7E,SAASu2B,IAAKo1C,QAChGA,KAAK+O,KAA2C,YAAnC/O,KAAKvqE,MAAQ,IAAI41B,cAE5BmkD,OAAOwgB,WAAahwB,KAAKiP,UAC3BO,OAAOwgB,SAAShwB,KAAK+O,IAAK,CACxBC,MAAOhP,KAAKgP,OAAShP,KAAKjgE,aAAa,UACtC6qB,KAQLskD,QAAQlP,KAAKpiE,YAAY4b,QAAQ01E,aAAc,IAAKlvB,KAAMp1C,KAKpE,CAEF,OAAO9E,UACT,CACA,SAASmqE,QAAQzpF,KAAMxL,SAAUk1F,UAI/B,IAHA,IAAIlwB,KACF4pB,MAAQ5uF,SAAWw0E,OAAO91E,OAAOsB,SAAUwL,MAAQA,KACnD5V,EAAI,EACsB,OAApBovE,KAAO4pB,MAAMh5F,IAAaA,IAC3Bs/F,UAA8B,IAAlBlwB,KAAK/mE,UACpBu2E,OAAO2gB,UAAUtH,OAAO7oB,OAEtBA,KAAKhpE,aACHk5F,UAAYvJ,WAAW3mB,OACzB8oB,cAAcD,OAAO7oB,KAAM,WAE7BA,KAAKhpE,WAAWq4E,YAAYrP,OAGhC,OAAOx5D,IACT,CACAgpE,OAAOe,OAAO,CACZsZ,cAAe,SAAuBkG,MACpC,OAAOA,IACT,EACAplD,MAAO,SAAenkC,KAAM4pF,cAAeC,mBACzC,IAAIz/F,EACFuD,EACAm8F,YACAC,aACA5lD,MAAQnkC,KAAK6hF,WAAU,GACvBmI,OAAS7J,WAAWngF,MAGtB,KAAKmoE,QAAQ2Z,gBAAqC,IAAlB9hF,KAAKvN,UAAoC,KAAlBuN,KAAKvN,UAAqBu2E,OAAO4B,SAAS5qE,OAK/F,IAFA+pF,aAAe1H,OAAOl+C,OAEjB/5C,EAAI,EAAGuD,GADZm8F,YAAczH,OAAOriF,OACO3V,OAAQD,EAAIuD,EAAGvD,IACzC8+F,SAASY,YAAY1/F,GAAI2/F,aAAa3/F,IAK1C,GAAIw/F,cACF,GAAIC,kBAGF,IAFAC,YAAcA,aAAezH,OAAOriF,MACpC+pF,aAAeA,cAAgB1H,OAAOl+C,OACjC/5C,EAAI,EAAGuD,EAAIm8F,YAAYz/F,OAAQD,EAAIuD,EAAGvD,IACzC0+F,eAAegB,YAAY1/F,GAAI2/F,aAAa3/F,SAG9C0+F,eAAe9oF,KAAMmkC,OAWzB,OANA4lD,aAAe1H,OAAOl+C,MAAO,WACZ95C,OAAS,GACxBi4F,cAAcyH,cAAeC,QAAU3H,OAAOriF,KAAM,WAI/CmkC,KACT,EACAwlD,UAAW,SAAmBtgB,OAM5B,IALA,IAAI14D,KACF3Q,KACA/Q,KACAmtF,QAAUpT,OAAOp6E,MAAMwtF,QACvBhyF,EAAI,OACuB2B,KAArBiU,KAAOqpE,MAAMj/E,IAAmBA,IACtC,GAAIm0F,WAAWv+E,MAAO,CACpB,GAAI2Q,KAAO3Q,KAAK4+E,SAASzU,SAAU,CACjC,GAAIx5D,KAAKtjB,OACP,IAAK4B,QAAQ0hB,KAAKtjB,OACZ+uF,QAAQntF,MACV+5E,OAAOp6E,MAAMmF,OAAOiM,KAAM/Q,MAI1B+5E,OAAOz5E,YAAYyQ,KAAM/Q,KAAM0hB,KAAKk0E,QAO1C7kF,KAAK4+E,SAASzU,cAAWp+E,CAC3B,CACIiU,KAAK6+E,SAAS1U,WAGhBnqE,KAAK6+E,SAAS1U,cAAWp+E,EAE7B,CAEJ,IAEFi9E,OAAO95E,GAAG66E,OAAO,CACfkgB,OAAQ,SAAgBz1F,UACtB,OAAOi1F,QAAQh+F,KAAM+I,UAAU,EACjC,EACAT,OAAQ,SAAgBS,UACtB,OAAOi1F,QAAQh+F,KAAM+I,SACvB,EACAk0B,KAAM,SAAcvrB,OAClB,OAAOwgF,OAAOlyF,MAAM,SAAU0R,OAC5B,YAAiBpR,IAAVoR,MAAsB6rE,OAAOtgD,KAAKj9B,MAAQA,KAAK6oF,QAAQ9K,MAAK,WAC3C,IAAlB/9E,KAAKgH,UAAoC,KAAlBhH,KAAKgH,UAAqC,IAAlBhH,KAAKgH,WACtDhH,KAAK2L,YAAc+F,MAEvB,GACF,GAAG,KAAMA,MAAO0Z,UAAUxsB,OAC5B,EACA6/F,OAAQ,WACN,OAAOf,SAAS19F,KAAMorB,WAAW,SAAU7W,MACnB,IAAlBvU,KAAKgH,UAAoC,KAAlBhH,KAAKgH,UAAqC,IAAlBhH,KAAKgH,UACzCk2F,mBAAmBl9F,KAAMuU,MAC/B3I,YAAY2I,KAEvB,GACF,EACAmqF,QAAS,WACP,OAAOhB,SAAS19F,KAAMorB,WAAW,SAAU7W,MACzC,GAAsB,IAAlBvU,KAAKgH,UAAoC,KAAlBhH,KAAKgH,UAAqC,IAAlBhH,KAAKgH,SAAgB,CACtE,IAAIrD,OAASu5F,mBAAmBl9F,KAAMuU,MACtC5Q,OAAOg7F,aAAapqF,KAAM5Q,OAAOwqE,WACnC,CACF,GACF,EACAywB,OAAQ,WACN,OAAOlB,SAAS19F,KAAMorB,WAAW,SAAU7W,MACrCvU,KAAK+E,YACP/E,KAAK+E,WAAW45F,aAAapqF,KAAMvU,KAEvC,GACF,EACA6+F,MAAO,WACL,OAAOnB,SAAS19F,KAAMorB,WAAW,SAAU7W,MACrCvU,KAAK+E,YACP/E,KAAK+E,WAAW45F,aAAapqF,KAAMvU,KAAKyuE,YAE5C,GACF,EACAoa,MAAO,WAGL,IAFA,IAAIt0E,KACF5V,EAAI,EACqB,OAAnB4V,KAAOvU,KAAKrB,IAAaA,IACT,IAAlB4V,KAAKvN,WAEPu2E,OAAO2gB,UAAUtH,OAAOriF,MAAM,IAG9BA,KAAK5I,YAAc,IAGvB,OAAO3L,IACT,EACA04C,MAAO,SAAeylD,cAAeC,mBAGnC,OAFAD,cAAiC,MAAjBA,eAAgCA,cAChDC,kBAAyC,MAArBA,kBAA4BD,cAAgBC,kBACzDp+F,KAAKsH,KAAI,WACd,OAAOi2E,OAAO7kC,MAAM14C,KAAMm+F,cAAeC,kBAC3C,GACF,EACAN,KAAM,SAAcpsF,OAClB,OAAOwgF,OAAOlyF,MAAM,SAAU0R,OAC5B,IAAI6C,KAAOvU,KAAK,IAAM,CAAC,EACrBrB,EAAI,EACJuD,EAAIlC,KAAKpB,OACX,QAAc0B,IAAVoR,OAAyC,IAAlB6C,KAAKvN,SAC9B,OAAOuN,KAAKykB,UAId,GAAqB,iBAAVtnB,QAAuBqrF,aAAat1E,KAAK/V,SAAW6kF,SAASP,SAASvnF,KAAKiD,QAAU,CAAC,GAAI,KAAK,GAAG0nB,eAAgB,CAC3H1nB,MAAQ6rE,OAAOqa,cAAclmF,OAC7B,IACE,KAAO/S,EAAIuD,EAAGvD,IAIU,KAHtB4V,KAAOvU,KAAKrB,IAAM,CAAC,GAGVqI,WACPu2E,OAAO2gB,UAAUtH,OAAOriF,MAAM,IAC9BA,KAAKykB,UAAYtnB,OAGrB6C,KAAO,CAGT,CAAE,MAAOnW,GAAI,CACf,CACImW,MACFvU,KAAK6oF,QAAQ4V,OAAO/sF,MAExB,GAAG,KAAMA,MAAO0Z,UAAUxsB,OAC5B,EACAkgG,YAAa,WACX,IAAIvH,QAAU,GAGd,OAAOmG,SAAS19F,KAAMorB,WAAW,SAAU7W,MACzC,IAAIC,OAASxU,KAAK+E,WACdw4E,OAAO2B,QAAQl/E,KAAMu3F,SAAW,IAClCha,OAAO2gB,UAAUtH,OAAO52F,OACpBwU,QACFA,OAAO6kB,aAAa9kB,KAAMvU,MAKhC,GAAGu3F,QACL,IAEFha,OAAOQ,KAAK,CACVghB,SAAU,SACVC,UAAW,UACXL,aAAc,SACdM,YAAa,QACbC,WAAY,gBACX,SAAU19F,KAAM29F,UACjB5hB,OAAO95E,GAAGjC,MAAQ,SAAUuH,UAM1B,IALA,IAAI60E,MACFhuE,IAAM,GACNwvF,OAAS7hB,OAAOx0E,UAChBusB,KAAO8pE,OAAOxgG,OAAS,EACvBD,EAAI,EACCA,GAAK22B,KAAM32B,IAChBi/E,MAAQj/E,IAAM22B,KAAOt1B,KAAOA,KAAK04C,OAAM,GACvC6kC,OAAO6hB,OAAOzgG,IAAIwgG,UAAUvhB,OAI5B97E,KAAK2vB,MAAM7hB,IAAKguE,MAAMp9E,OAExB,OAAOR,KAAK29E,UAAU/tE,IACxB,CACF,IACA,IAAIyvF,UAAY,IAAI/3E,OAAO,KAAOitE,KAAO,kBAAmB,KACxD+K,YAAc,MACdC,UAAY,SAAmBhrF,MAIjC,IAAIknF,KAAOlnF,KAAKE,cAAc0wE,YAI9B,OAHKsW,MAASA,KAAK+D,SACjB/D,KAAOv+F,QAEFu+F,KAAKgE,iBAAiBlrF,KAC/B,EACImrF,KAAO,SAAcnrF,KAAM81D,QAAS3pE,UACtC,IAAIkP,IACFpO,KACAm+F,IAAM,CAAC,EAGT,IAAKn+F,QAAQ6oE,QACXs1B,IAAIn+F,MAAQ+S,KAAKm4D,MAAMlrE,MACvB+S,KAAKm4D,MAAMlrE,MAAQ6oE,QAAQ7oE,MAK7B,IAAKA,QAHLoO,IAAMlP,SAAS/C,KAAK4W,MAGP81D,QACX91D,KAAKm4D,MAAMlrE,MAAQm+F,IAAIn+F,MAEzB,OAAOoO,GACT,EACIgwF,UAAY,IAAIt4E,OAAOmtE,UAAUh3D,KAAK,KAAM,KA0HhD,SAASoiE,OAAOtrF,KAAM/S,KAAMokD,UAC1B,IAAIzmD,MACF2gG,SACAC,SACAnwF,IACAowF,aAAeV,YAAY73E,KAAKjmB,MAKhCkrE,MAAQn4D,KAAKm4D,MA6Df,OA5DA9mB,SAAWA,UAAY25C,UAAUhrF,SAe/B3E,IAAMg2C,SAASq6C,iBAAiBz+F,OAASokD,SAASpkD,MAC9Cw+F,cAAgBpwF,MAiBlBA,IAAMA,IAAI2X,QAAQu4D,SAAU,YAASx/E,GAE3B,KAARsP,KAAe8kF,WAAWngF,QAC5B3E,IAAM2tE,OAAO7Q,MAAMn4D,KAAM/S,QAQtBk7E,QAAQwjB,kBAAoBb,UAAU53E,KAAK7X,MAAQgwF,UAAUn4E,KAAKjmB,QAErErC,MAAQutE,MAAMvtE,MACd2gG,SAAWpzB,MAAMozB,SACjBC,SAAWrzB,MAAMqzB,SAGjBrzB,MAAMozB,SAAWpzB,MAAMqzB,SAAWrzB,MAAMvtE,MAAQyQ,IAChDA,IAAMg2C,SAASzmD,MAGfutE,MAAMvtE,MAAQA,MACdutE,MAAMozB,SAAWA,SACjBpzB,MAAMqzB,SAAWA,gBAGNz/F,IAARsP,IAGPA,IAAM,GAAKA,GACb,CACA,SAASuwF,aAAaC,YAAaC,QAEjC,MAAO,CACL7/F,IAAK,WACH,IAAI4/F,cAQJ,OAAQpgG,KAAKQ,IAAM6/F,QAAQ5uE,MAAMzxB,KAAMorB,kBAL9BprB,KAAKQ,GAMhB,EAEJ,EApNA,WAGE,SAAS8/F,oBAEP,GAAK7/D,IAAL,CAGAp+B,UAAUqqE,MAAM6zB,QAAU,+EAC1B9/D,IAAIisC,MAAM6zB,QAAU,4HACpBxnE,gBAAgBntB,YAAYvJ,WAAWuJ,YAAY60B,KACnD,IAAI+/D,SAAWtjG,OAAOuiG,iBAAiBh/D,KACvCggE,iBAAoC,OAAjBD,SAASpb,IAG5Bsb,sBAAoE,KAA5CC,mBAAmBH,SAASI,YAIpDngE,IAAIisC,MAAMm0B,MAAQ,MAClBC,kBAA2D,KAAvCH,mBAAmBH,SAASK,OAIhDE,qBAA8D,KAAvCJ,mBAAmBH,SAASrhG,OAMnDshC,IAAIisC,MAAMzf,SAAW,WACrB+zC,iBAA+D,KAA5CL,mBAAmBlgE,IAAIwgE,YAAc,GACxDloE,gBAAgBqkD,YAAY/6E,WAI5Bo+B,IAAM,IA7BN,CA8BF,CACA,SAASkgE,mBAAmBO,SAC1B,OAAOz0F,KAAK8kC,MAAMiT,WAAW08C,SAC/B,CACA,IAAIT,iBACFM,qBACAC,iBACAF,kBACAK,wBACAT,sBACAr+F,UAAYhE,SAASqN,cAAc,OACnC+0B,IAAMpiC,SAASqN,cAAc,OAG1B+0B,IAAIisC,QAMTjsC,IAAIisC,MAAM00B,eAAiB,cAC3B3gE,IAAI21D,WAAU,GAAM1pB,MAAM00B,eAAiB,GAC3C1kB,QAAQ2kB,gBAA+C,gBAA7B5gE,IAAIisC,MAAM00B,eACpC7jB,OAAOe,OAAO5B,QAAS,CACrB4kB,kBAAmB,WAEjB,OADAhB,oBACOS,oBACT,EACAb,eAAgB,WAEd,OADAI,oBACOQ,iBACT,EACAS,cAAe,WAEb,OADAjB,oBACOG,gBACT,EACAe,mBAAoB,WAElB,OADAlB,oBACOI,qBACT,EACAe,cAAe,WAEb,OADAnB,oBACOU,gBACT,EAUAU,qBAAsB,WACpB,IAAIC,MAAOz7D,GAAI07D,QAASC,QA0BxB,OAzB+B,MAA3BV,0BACFQ,MAAQtjG,SAASqN,cAAc,SAC/Bw6B,GAAK7nC,SAASqN,cAAc,MAC5Bk2F,QAAUvjG,SAASqN,cAAc,OACjCi2F,MAAMj1B,MAAM6zB,QAAU,2DACtBr6D,GAAGwmC,MAAM6zB,QAAU,0CAKnBr6D,GAAGwmC,MAAMttE,OAAS,MAClBwiG,QAAQl1B,MAAMttE,OAAS,MAQvBwiG,QAAQl1B,MAAMooB,QAAU,QACxB/7D,gBAAgBntB,YAAY+1F,OAAO/1F,YAAYs6B,IAAIt6B,YAAYg2F,SAC/DC,QAAU3kG,OAAOuiG,iBAAiBv5D,IAClCi7D,wBAA0B3sE,SAASqtE,QAAQziG,OAAQ,IAAMo1B,SAASqtE,QAAQC,eAAgB,IAAMttE,SAASqtE,QAAQE,kBAAmB,MAAQ77D,GAAG87D,aAC/IjpE,gBAAgBqkD,YAAYukB,QAEvBR,uBACT,IAEH,CAxHD,GAqNA,IAAIc,YAAc,CAAC,SAAU,MAAO,MAClCC,WAAa7jG,SAASqN,cAAc,OAAOghE,MAC3Cy1B,YAAc,CAAC,EAgBjB,SAASC,cAAc5gG,MACrB,IAAI6gG,OAAS9kB,OAAO+kB,SAAS9gG,OAAS2gG,YAAY3gG,MAClD,OAAI6gG,SAGA7gG,QAAQ0gG,WACH1gG,KAEF2gG,YAAY3gG,MArBrB,SAAwBA,MAItB,IAFA,IAAI+gG,QAAU/gG,KAAK,GAAGi5C,cAAgBj5C,KAAKgG,MAAM,GAC/C7I,EAAIsjG,YAAYrjG,OACXD,KAEL,IADA6C,KAAOygG,YAAYtjG,GAAK4jG,WACZL,WACV,OAAO1gG,IAGb,CAW6BghG,CAAehhG,OAASA,KACrD,CACA,IAIEihG,aAAe,4BACfC,QAAU,CACRz1C,SAAU,WACV01C,WAAY,SACZ7N,QAAS,SAEX8N,mBAAqB,CACnBC,cAAe,IACfC,WAAY,OAEhB,SAASC,kBAAkB5kB,MAAOzsE,MAAOsxF,UAGvC,IAAIvjB,QAAU+U,QAAQ/lF,KAAKiD,OAC3B,OAAO+tE,QAEPhzE,KAAKsoB,IAAI,EAAG0qD,QAAQ,IAAMujB,UAAY,KAAOvjB,QAAQ,IAAM,MAAQ/tE,KACrE,CACA,SAASuxF,mBAAmB1uF,KAAM2uF,UAAWC,IAAKC,YAAap4F,OAAQq4F,aACrE,IAAI1kG,EAAkB,UAAdukG,UAAwB,EAAI,EAClCI,MAAQ,EACRC,MAAQ,EACRC,YAAc,EAGhB,GAAIL,OAASC,YAAc,SAAW,WACpC,OAAO,EAET,KAAOzkG,EAAI,EAAGA,GAAK,EAIL,WAARwkG,MACFK,aAAejmB,OAAOwX,IAAIxgF,KAAM4uF,IAAM1O,UAAU91F,IAAI,EAAMqM,SAIvDo4F,aAiBS,YAARD,MACFI,OAAShmB,OAAOwX,IAAIxgF,KAAM,UAAYkgF,UAAU91F,IAAI,EAAMqM,SAIhD,WAARm4F,MACFI,OAAShmB,OAAOwX,IAAIxgF,KAAM,SAAWkgF,UAAU91F,GAAK,SAAS,EAAMqM,WArBrEu4F,OAAShmB,OAAOwX,IAAIxgF,KAAM,UAAYkgF,UAAU91F,IAAI,EAAMqM,QAG9C,YAARm4F,IACFI,OAAShmB,OAAOwX,IAAIxgF,KAAM,SAAWkgF,UAAU91F,GAAK,SAAS,EAAMqM,QAInEs4F,OAAS/lB,OAAOwX,IAAIxgF,KAAM,SAAWkgF,UAAU91F,GAAK,SAAS,EAAMqM,SA4BzE,OATKo4F,aAAeC,aAAe,IAGjCE,OAAS92F,KAAKsoB,IAAI,EAAGtoB,KAAKg3F,KAAKlvF,KAAK,SAAW2uF,UAAU,GAAGzoD,cAAgByoD,UAAU17F,MAAM,IAAM67F,YAAcE,MAAQD,MAAQ,MAI1H,GAEDC,MAAQC,WACjB,CACA,SAASE,iBAAiBnvF,KAAM2uF,UAAWI,OAEzC,IAAIt4F,OAASu0F,UAAUhrF,MAIrB6uF,cADmB1mB,QAAQ4kB,qBAAuBgC,QACgC,eAAjD/lB,OAAOwX,IAAIxgF,KAAM,aAAa,EAAOvJ,QACtE24F,iBAAmBP,YACnBz6D,IAAMk3D,OAAOtrF,KAAM2uF,UAAWl4F,QAC9B44F,WAAa,SAAWV,UAAU,GAAGzoD,cAAgByoD,UAAU17F,MAAM,GAIvE,GAAI63F,UAAU53E,KAAKkhB,KAAM,CACvB,IAAK26D,MACH,OAAO36D,IAETA,IAAM,MACR,CAkCA,QA7BM+zC,QAAQ4kB,qBAAuB8B,cAKpC1mB,QAAQglB,wBAA0BnzB,SAASh6D,KAAM,OAG1C,SAARo0B,MAGC6b,WAAW7b,MAAuD,WAA/C40C,OAAOwX,IAAIxgF,KAAM,WAAW,EAAOvJ,UAEvDuJ,KAAKsvF,iBAAiBjlG,SACpBwkG,YAA+D,eAAjD7lB,OAAOwX,IAAIxgF,KAAM,aAAa,EAAOvJ,SAKnD24F,iBAAmBC,cAAcrvF,QAE/Bo0B,IAAMp0B,KAAKqvF,eAKfj7D,IAAM6b,WAAW7b,MAAQ,GAGZs6D,mBAAmB1uF,KAAM2uF,UAAWI,QAAUF,YAAc,SAAW,WAAYO,iBAAkB34F,OAElH29B,KAAO,IACT,CAgQA,SAASm7D,MAAMvvF,KAAM81D,QAAS4oB,KAAMx9D,IAAKsuE,QACvC,OAAO,IAAID,MAAMrmG,UAAUggF,KAAKlpE,KAAM81D,QAAS4oB,KAAMx9D,IAAKsuE,OAC5D,CAjQAxmB,OAAOe,OAAO,CAGZ0lB,SAAU,CACRC,QAAS,CACPzjG,IAAK,SAAa+T,KAAMqxC,UACtB,GAAIA,SAAU,CAEZ,IAAIh2C,IAAMiwF,OAAOtrF,KAAM,WACvB,MAAe,KAAR3E,IAAa,IAAMA,GAC5B,CACF,IAIJ2lF,UAAW,CACT2O,yBAAyB,EACzBC,aAAa,EACbC,kBAAkB,EAClBC,aAAa,EACbC,UAAU,EACVC,YAAY,EACZzB,YAAY,EACZ0B,UAAU,EACVC,YAAY,EACZC,eAAe,EACfC,iBAAiB,EACjBC,SAAS,EACTC,YAAY,EACZC,cAAc,EACdC,YAAY,EACZd,SAAS,EACTe,OAAO,EACPC,SAAS,EACThmC,OAAO,EACPimC,QAAQ,EACRC,QAAQ,EACRC,MAAM,EAENC,aAAa,EACbC,cAAc,EACdC,aAAa,EACbC,kBAAkB,EAClBC,eAAe,GAIjBnD,SAAU,CAAC,EAEX51B,MAAO,SAAen4D,KAAM/S,KAAMkQ,MAAO4xF,OAEvC,GAAK/uF,MAA0B,IAAlBA,KAAKvN,UAAoC,IAAlBuN,KAAKvN,UAAmBuN,KAAKm4D,MAAjE,CAKA,IAAI98D,IACFpM,KACAuwF,MACA2R,SAAW7S,UAAUrxF,MACrBw+F,aAAeV,YAAY73E,KAAKjmB,MAChCkrE,MAAQn4D,KAAKm4D,MAaf,GARKszB,eACHx+F,KAAO4gG,cAAcsD,WAIvB3R,MAAQxW,OAAOymB,SAASxiG,OAAS+7E,OAAOymB,SAAS0B,eAGnCplG,IAAVoR,MAsCF,OAAIqiF,OAAS,QAASA,YAAmDzzF,KAAzCsP,IAAMmkF,MAAMvzF,IAAI+T,MAAM,EAAO+uF,QACpD1zF,IAIF88D,MAAMlrE,MAvCA,YAHbgC,KAAO0gB,UAAUxS,UAGS9B,IAAM4kF,QAAQ/lF,KAAKiD,SAAW9B,IAAI,KAC1D8B,MAAQsjF,UAAUzgF,KAAM/S,KAAMoO,KAG9BpM,KAAO,UAII,MAATkO,OAAiBA,OAAUA,QAOlB,WAATlO,MAAsBw8F,eACxBtuF,OAAS9B,KAAOA,IAAI,KAAO2tE,OAAOgY,UAAUmQ,UAAY,GAAK,OAI1DhpB,QAAQ2kB,iBAA6B,KAAV3vF,OAA+C,IAA/BlQ,KAAKkR,QAAQ,gBAC3Dg6D,MAAMlrE,MAAQ,WAIXuyF,OAAW,QAASA,YAAsDzzF,KAA3CoR,MAAQqiF,MAAM5zF,IAAIoU,KAAM7C,MAAO4xF,UAC7DtD,aACFtzB,MAAMi5B,YAAYnkG,KAAMkQ,OAExBg7D,MAAMlrE,MAAQkQ,OAtDpB,CAkEF,EACAqjF,IAAK,SAAaxgF,KAAM/S,KAAM8hG,MAAOt4F,QACnC,IAAI29B,IACF+0C,IACAqW,MACA2R,SAAW7S,UAAUrxF,MA6BvB,OA5BiB89F,YAAY73E,KAAKjmB,QAMhCA,KAAO4gG,cAAcsD,YAIvB3R,MAAQxW,OAAOymB,SAASxiG,OAAS+7E,OAAOymB,SAAS0B,YAGpC,QAAS3R,QACpBprD,IAAMorD,MAAMvzF,IAAI+T,MAAM,EAAM+uF,aAIlBhjG,IAARqoC,MACFA,IAAMk3D,OAAOtrF,KAAM/S,KAAMwJ,SAIf,WAAR29B,KAAoBnnC,QAAQohG,qBAC9Bj6D,IAAMi6D,mBAAmBphG,OAIb,KAAV8hG,OAAgBA,OAClB5lB,IAAMl5B,WAAW7b,MACA,IAAV26D,OAAkBsC,SAASloB,KAAOA,KAAO,EAAI/0C,KAE/CA,GACT,IAEF40C,OAAOQ,KAAK,CAAC,SAAU,UAAU,SAAU6B,GAAIsjB,WAC7C3lB,OAAOymB,SAASd,WAAa,CAC3B1iG,IAAK,SAAa+T,KAAMqxC,SAAU09C,OAChC,GAAI19C,SAGF,OAAO68C,aAAah7E,KAAK81D,OAAOwX,IAAIxgF,KAAM,aAOzCA,KAAKsvF,iBAAiBjlG,QAAW2V,KAAKsxF,wBAAwB1mG,MAE1DukG,iBAAiBnvF,KAAM2uF,UAAWI,OAFiC5D,KAAKnrF,KAAMmuF,SAAS,WAC1F,OAAOgB,iBAAiBnvF,KAAM2uF,UAAWI,MAC3C,GAEJ,EACAnjG,IAAK,SAAaoU,KAAM7C,MAAO4xF,OAC7B,IAAI7jB,QACFz0E,OAASu0F,UAAUhrF,MAGnBuxF,oBAAsBppB,QAAQ+kB,iBAAuC,aAApBz2F,OAAOiiD,SAGxDm2C,aADkB0C,oBAAsBxC,QAC0C,eAAjD/lB,OAAOwX,IAAIxgF,KAAM,aAAa,EAAOvJ,QACtEg4F,SAAWM,MAAQL,mBAAmB1uF,KAAM2uF,UAAWI,MAAOF,YAAap4F,QAAU,EAavF,OATIo4F,aAAe0C,qBACjB9C,UAAYv2F,KAAKg3F,KAAKlvF,KAAK,SAAW2uF,UAAU,GAAGzoD,cAAgByoD,UAAU17F,MAAM,IAAMg9C,WAAWx5C,OAAOk4F,YAAcD,mBAAmB1uF,KAAM2uF,UAAW,UAAU,EAAOl4F,QAAU,KAItLg4F,WAAavjB,QAAU+U,QAAQ/lF,KAAKiD,SAAoC,QAAxB+tE,QAAQ,IAAM,QAChElrE,KAAKm4D,MAAMw2B,WAAaxxF,MACxBA,MAAQ6rE,OAAOwX,IAAIxgF,KAAM2uF,YAEpBH,kBAAkBxuF,EAAM7C,MAAOsxF,SACxC,EAEJ,IACAzlB,OAAOymB,SAASpD,WAAaT,aAAazjB,QAAQ8kB,oBAAoB,SAAUjtF,KAAMqxC,UACpF,GAAIA,SACF,OAAQpB,WAAWq7C,OAAOtrF,KAAM,gBAAkBA,KAAKsxF,wBAAwBE,KAAOrG,KAAKnrF,KAAM,CAC/FqsF,WAAY,IACX,WACD,OAAOrsF,KAAKsxF,wBAAwBE,IACtC,KAAM,IAEV,IAGAxoB,OAAOQ,KAAK,CACVioB,OAAQ,GACRC,QAAS,GACTC,OAAQ,UACP,SAAUjuE,OAAQkuE,QACnB5oB,OAAOymB,SAAS/rE,OAASkuE,QAAU,CACjCC,OAAQ,SAAgB10F,OAKtB,IAJA,IAAI/S,EAAI,EACN0nG,SAAW,CAAC,EAEZC,MAAyB,iBAAV50F,MAAqBA,MAAMypB,MAAM,KAAO,CAACzpB,OACnD/S,EAAI,EAAGA,IACZ0nG,SAASpuE,OAASw8D,UAAU91F,GAAKwnG,QAAUG,MAAM3nG,IAAM2nG,MAAM3nG,EAAI,IAAM2nG,MAAM,GAE/E,OAAOD,QACT,GAEa,WAAXpuE,SACFslD,OAAOymB,SAAS/rE,OAASkuE,QAAQhmG,IAAM4iG,kBAE3C,IACAxlB,OAAO95E,GAAG66E,OAAO,CACfyW,IAAK,SAAavzF,KAAMkQ,OACtB,OAAOwgF,OAAOlyF,MAAM,SAAUuU,KAAM/S,KAAMkQ,OACxC,IAAI1G,OACFk9B,IACA5gC,IAAM,CAAC,EACP3I,EAAI,EACN,GAAI0I,MAAM6iB,QAAQ1oB,MAAO,CAGvB,IAFAwJ,OAASu0F,UAAUhrF,MACnB2zB,IAAM1mC,KAAK5C,OACJD,EAAIupC,IAAKvpC,IACd2I,IAAI9F,KAAK7C,IAAM4+E,OAAOwX,IAAIxgF,KAAM/S,KAAK7C,IAAI,EAAOqM,QAElD,OAAO1D,GACT,CACA,YAAiBhH,IAAVoR,MAAsB6rE,OAAO7Q,MAAMn4D,KAAM/S,KAAMkQ,OAAS6rE,OAAOwX,IAAIxgF,KAAM/S,KAClF,GAAGA,KAAMkQ,MAAO0Z,UAAUxsB,OAAS,EACrC,IAKF2+E,OAAOumB,MAAQA,MACfA,MAAMrmG,UAAY,CAChB6mB,YAAaw/E,MACbrmB,KAAM,SAAclpE,KAAM81D,QAAS4oB,KAAMx9D,IAAKsuE,OAAQ/kC,MACpDh/D,KAAKuU,KAAOA,KACZvU,KAAKizF,KAAOA,KACZjzF,KAAK+jG,OAASA,QAAUxmB,OAAOwmB,OAAOpN,SACtC32F,KAAKqqE,QAAUA,QACfrqE,KAAKw1B,MAAQx1B,KAAK81B,IAAM91B,KAAKutF,MAC7BvtF,KAAKy1B,IAAMA,IACXz1B,KAAKg/D,KAAOA,OAASue,OAAOgY,UAAUtC,MAAQ,GAAK,KACrD,EACA1F,IAAK,WACH,IAAIwG,MAAQ+P,MAAMyC,UAAUvmG,KAAKizF,MACjC,OAAOc,OAASA,MAAMvzF,IAAMuzF,MAAMvzF,IAAIR,MAAQ8jG,MAAMyC,UAAU5P,SAASn2F,IAAIR,KAC7E,EACAwmG,IAAK,SAAaC,SAChB,IAAIC,MACF3S,MAAQ+P,MAAMyC,UAAUvmG,KAAKizF,MAe/B,OAdIjzF,KAAKqqE,QAAQr7B,SACfhvC,KAAK2mG,IAAMD,MAAQnpB,OAAOwmB,OAAO/jG,KAAK+jG,QAAQ0C,QAASzmG,KAAKqqE,QAAQr7B,SAAWy3D,QAAS,EAAG,EAAGzmG,KAAKqqE,QAAQr7B,UAE3GhvC,KAAK2mG,IAAMD,MAAQD,QAErBzmG,KAAK81B,KAAO91B,KAAKy1B,IAAMz1B,KAAKw1B,OAASkxE,MAAQ1mG,KAAKw1B,MAC9Cx1B,KAAKqqE,QAAQu8B,MACf5mG,KAAKqqE,QAAQu8B,KAAKjpG,KAAKqC,KAAKuU,KAAMvU,KAAK81B,IAAK91B,MAE1C+zF,OAASA,MAAM5zF,IACjB4zF,MAAM5zF,IAAIH,MAEV8jG,MAAMyC,UAAU5P,SAASx2F,IAAIH,MAExBA,IACT,GAEF8jG,MAAMrmG,UAAUggF,KAAKhgF,UAAYqmG,MAAMrmG,UACvCqmG,MAAMyC,UAAY,CAChB5P,SAAU,CACRn2F,IAAK,SAAa00F,OAChB,IAAIxwE,OAIJ,OAA4B,IAAxBwwE,MAAM3gF,KAAKvN,UAA4C,MAA1BkuF,MAAM3gF,KAAK2gF,MAAMjC,OAAiD,MAAhCiC,MAAM3gF,KAAKm4D,MAAMwoB,MAAMjC,MACjFiC,MAAM3gF,KAAK2gF,MAAMjC,OAO1BvuE,OAAS64D,OAAOwX,IAAIG,MAAM3gF,KAAM2gF,MAAMjC,KAAM,MAGf,SAAXvuE,OAAwBA,OAAJ,CACxC,EACAvkB,IAAK,SAAa+0F,OAIZ3X,OAAOspB,GAAGD,KAAK1R,MAAMjC,MACvB1V,OAAOspB,GAAGD,KAAK1R,MAAMjC,MAAMiC,OACM,IAAxBA,MAAM3gF,KAAKvN,WAAmBu2E,OAAOymB,SAAS9O,MAAMjC,OAAwD,MAA/CiC,MAAM3gF,KAAKm4D,MAAM01B,cAAclN,MAAMjC,OAG3GiC,MAAM3gF,KAAK2gF,MAAMjC,MAAQiC,MAAMp/D,IAF/BynD,OAAO7Q,MAAMwoB,MAAM3gF,KAAM2gF,MAAMjC,KAAMiC,MAAMp/D,IAAMo/D,MAAMl2B,KAI3D,IAMJ8kC,MAAMyC,UAAUO,UAAYhD,MAAMyC,UAAUQ,WAAa,CACvD5mG,IAAK,SAAa+0F,OACZA,MAAM3gF,KAAKvN,UAAYkuF,MAAM3gF,KAAKxP,aACpCmwF,MAAM3gF,KAAK2gF,MAAMjC,MAAQiC,MAAMp/D,IAEnC,GAEFynD,OAAOwmB,OAAS,CACdiD,OAAQ,SAAgBtoG,GACtB,OAAOA,CACT,EACAuoG,MAAO,SAAevoG,GACpB,MAAO,GAAM+N,KAAKy6F,IAAIxoG,EAAI+N,KAAK06F,IAAM,CACvC,EACAxQ,SAAU,UAEZpZ,OAAOspB,GAAK/C,MAAMrmG,UAAUggF,MAGlBmpB,KAAO,CAAC,EAClB,IAAIQ,MACFC,WACAC,SAAW,yBACXC,KAAO,cACT,SAASC,WACHH,cACsB,IAApBhpG,SAASopG,QAAoBvqG,OAAOuI,sBACtCvI,OAAOuI,sBAAsB+hG,UAE7BtqG,OAAOuS,WAAW+3F,SAAUjqB,OAAOspB,GAAGa,UAExCnqB,OAAOspB,GAAGc,OAEd,CAGA,SAASC,cAIP,OAHA1qG,OAAOuS,YAAW,WAChB23F,WAAQ9mG,CACV,IACO8mG,MAAQvxE,KAAKC,KACtB,CAGA,SAAS+xE,MAAMrkG,KAAMskG,cACnB,IAAI/6F,MACFpO,EAAI,EACJi1F,MAAQ,CACNx0F,OAAQoE,MAMZ,IADAskG,aAAeA,aAAe,EAAI,EAC3BnpG,EAAI,EAAGA,GAAK,EAAImpG,aAErBlU,MAAM,UADN7mF,MAAQ0nF,UAAU91F,KACQi1F,MAAM,UAAY7mF,OAASvJ,KAKvD,OAHIskG,eACFlU,MAAMqQ,QAAUrQ,MAAMz0F,MAAQqE,MAEzBowF,KACT,CACA,SAASmU,YAAYr2F,MAAOuhF,KAAM+U,WAKhC,IAJA,IAAI9S,MACFrhE,YAAco0E,UAAUC,SAASjV,OAAS,IAAIhpF,OAAOg+F,UAAUC,SAAS,MACxEzjF,MAAQ,EACR7lB,OAASi1B,WAAWj1B,OACf6lB,MAAQ7lB,OAAQ6lB,QACrB,GAAIywE,MAAQrhE,WAAWpP,OAAO9mB,KAAKqqG,UAAW/U,KAAMvhF,OAElD,OAAOwjF,KAGb,CA8MA,SAAS+S,UAAU1zF,KAAM4zF,WAAY99B,SACnC,IAAI3lD,OACF0jF,QACA3jF,MAAQ,EACR7lB,OAASqpG,UAAUI,WAAWzpG,OAC9B2oC,SAAWg2C,OAAOqS,WAAWI,QAAO,kBAE3B2X,KAAKpzF,IACd,IACAozF,KAAO,WACL,GAAIS,QACF,OAAO,EAUT,IARA,IAAIE,YAAclB,OAASQ,cACzBzxE,UAAY1pB,KAAKsoB,IAAI,EAAGizE,UAAUn5D,UAAYm5D,UAAUh5D,SAAWs5D,aAInE7B,QAAU,GADHtwE,UAAY6xE,UAAUh5D,UAAY,GAEzCvqB,MAAQ,EACR7lB,OAASopG,UAAUO,OAAO3pG,OACrB6lB,MAAQ7lB,OAAQ6lB,QACrBujF,UAAUO,OAAO9jF,OAAO+hF,IAAIC,SAK9B,OAHAl/D,SAASspD,WAAWt8E,KAAM,CAACyzF,UAAWvB,QAAStwE,YAG3CswE,QAAU,GAAK7nG,OACVu3B,WAIJv3B,QACH2oC,SAASspD,WAAWt8E,KAAM,CAACyzF,UAAW,EAAG,IAI3CzgE,SAASupD,YAAYv8E,KAAM,CAACyzF,aACrB,EACT,EACAA,UAAYzgE,SAASK,QAAQ,CAC3BrzB,KACAmf,MAAO6pD,OAAOe,OAAO,CAAC,EAAG6pB,YACzBp2D,KAAMwrC,OAAOe,QAAO,EAAM,CACxBkqB,cAAe,CAAC,EAChBzE,OAAQxmB,OAAOwmB,OAAOpN,UACrBtsB,SACHo+B,mBAAoBN,WACpBO,gBAAiBr+B,QACjBx7B,UAAWu4D,OAASQ,cACpB54D,SAAUq7B,QAAQr7B,SAClBu5D,OAAQ,GACRR,YAAa,SAAqB9U,KAAMx9D,KACtC,IAAIy/D,MAAQ3X,OAAOumB,MAAMvvF,KAAMyzF,UAAUj2D,KAAMkhD,KAAMx9D,IAAKuyE,UAAUj2D,KAAKy2D,cAAcvV,OAAS+U,UAAUj2D,KAAKgyD,QAE/G,OADAiE,UAAUO,OAAOzmG,KAAKozF,OACfA,KACT,EACAhB,KAAM,SAAcyU,SAClB,IAAIlkF,MAAQ,EAGV7lB,OAAS+pG,QAAUX,UAAUO,OAAO3pG,OAAS,EAC/C,GAAIwpG,QACF,OAAOpoG,KAGT,IADAooG,SAAU,EACH3jF,MAAQ7lB,OAAQ6lB,QACrBujF,UAAUO,OAAO9jF,OAAO+hF,IAAI,GAU9B,OANImC,SACFphE,SAASspD,WAAWt8E,KAAM,CAACyzF,UAAW,EAAG,IACzCzgE,SAASupD,YAAYv8E,KAAM,CAACyzF,UAAWW,WAEvCphE,SAASypD,WAAWz8E,KAAM,CAACyzF,UAAWW,UAEjC3oG,IACT,IAEF0zB,MAAQs0E,UAAUt0E,MAEpB,IApHF,SAAoBA,MAAO80E,eACzB,IAAI/jF,MAAOjjB,KAAMuiG,OAAQryF,MAAOqiF,MAGhC,IAAKtvE,SAASiP,MAaZ,GAXAqwE,OAASyE,cADThnG,KAAOqxF,UAAUpuE,QAEjB/S,MAAQgiB,MAAMjP,OACVpd,MAAM6iB,QAAQxY,SAChBqyF,OAASryF,MAAM,GACfA,MAAQgiB,MAAMjP,OAAS/S,MAAM,IAE3B+S,QAAUjjB,OACZkyB,MAAMlyB,MAAQkQ,aACPgiB,MAAMjP,SAEfsvE,MAAQxW,OAAOymB,SAASxiG,QACX,WAAYuyF,MAMvB,IAAKtvE,SALL/S,MAAQqiF,MAAMqS,OAAO10F,cACdgiB,MAAMlyB,MAICkQ,MACN+S,SAASiP,QACbA,MAAMjP,OAAS/S,MAAM+S,OACrB+jF,cAAc/jF,OAASs/E,aAI3ByE,cAAchnG,MAAQuiG,MAG5B,CAkFE6E,CAAWl1E,MAAOs0E,UAAUj2D,KAAKy2D,eAC1B/jF,MAAQ7lB,OAAQ6lB,QAErB,GADAC,OAASujF,UAAUI,WAAW5jF,OAAO9mB,KAAKqqG,UAAWzzF,KAAMmf,MAAOs0E,UAAUj2D,MAK1E,OAHIxrB,WAAW7B,OAAOwvE,QACpB3W,OAAOyW,YAAYgU,UAAUzzF,KAAMyzF,UAAUj2D,KAAKm9C,OAAOgF,KAAOxvE,OAAOwvE,KAAKryF,KAAK6iB,SAE5EA,OAeX,OAZA64D,OAAOj2E,IAAIosB,MAAOq0E,YAAaC,WAC3BzhF,WAAWyhF,UAAUj2D,KAAKvc,QAC5BwyE,UAAUj2D,KAAKvc,MAAM73B,KAAK4W,KAAMyzF,WAIlCA,UAAU1X,SAAS0X,UAAUj2D,KAAKu+C,UAAUloD,KAAK4/D,UAAUj2D,KAAK3J,KAAM4/D,UAAUj2D,KAAK82D,UAAUpa,KAAKuZ,UAAUj2D,KAAK08C,MAAMuB,OAAOgY,UAAUj2D,KAAKi+C,QAC/IzS,OAAOspB,GAAGiC,MAAMvrB,OAAOe,OAAOqpB,KAAM,CAClCpzF,KACAw0F,KAAMf,UACN9Y,MAAO8Y,UAAUj2D,KAAKm9C,SAEjB8Y,SACT,CACAzqB,OAAO0qB,UAAY1qB,OAAOe,OAAO2pB,UAAW,CAC1CC,SAAU,CACR,IAAK,CAAC,SAAUjV,KAAMvhF,OACpB,IAAIwjF,MAAQl1F,KAAK+nG,YAAY9U,KAAMvhF,OAEnC,OADAsjF,UAAUE,MAAM3gF,KAAM0+E,KAAMuB,QAAQ/lF,KAAKiD,OAAQwjF,OAC1CA,KACT,IAEF8T,QAAS,SAAiBt1E,MAAOhzB,UAC3B6lB,WAAWmN,QACbhzB,SAAWgzB,MACXA,MAAQ,CAAC,MAETA,MAAQA,MAAMzB,MAAMk8D,eAKtB,IAHA,IAAI8E,KACFxuE,MAAQ,EACR7lB,OAAS80B,MAAM90B,OACV6lB,MAAQ7lB,OAAQ6lB,QACrBwuE,KAAOv/D,MAAMjP,OACbwjF,UAAUC,SAASjV,MAAQgV,UAAUC,SAASjV,OAAS,GACvDgV,UAAUC,SAASjV,MAAMgB,QAAQvzF,SAErC,EACA2nG,WAAY,CA9Ud,SAA0B9zF,KAAMmf,MAAOqe,MACrC,IAAIkhD,KACFvhF,MACAokF,OACA/B,MACAkV,QACAC,UACAC,eACArU,QACAsU,MAAQ,UAAW11E,OAAS,WAAYA,MACxCq1E,KAAO/oG,KACP48F,KAAO,CAAC,EACRlwB,MAAQn4D,KAAKm4D,MACb+6B,OAASlzF,KAAKvN,UAAY6tF,mBAAmBtgF,MAC7C80F,SAAWlW,SAAS3yF,IAAI+T,KAAM,UA2BhC,IAAK0+E,QAxBAlhD,KAAKm9C,QAEc,OADtB6E,MAAQxW,OAAOyW,YAAYz/E,KAAM,OACvB+0F,WACRvV,MAAMuV,SAAW,EACjBL,QAAUlV,MAAMlL,MAAMuG,KACtB2E,MAAMlL,MAAMuG,KAAO,WACZ2E,MAAMuV,UACTL,SAEJ,GAEFlV,MAAMuV,WACNP,KAAK/Y,QAAO,WAEV+Y,KAAK/Y,QAAO,WACV+D,MAAMuV,WACD/rB,OAAO2R,MAAM36E,KAAM,MAAM3V,QAC5Bm1F,MAAMlL,MAAMuG,MAEhB,GACF,KAIW17D,MAEX,GADAhiB,MAAQgiB,MAAMu/D,MACVqU,SAAS7/E,KAAK/V,OAAQ,CAGxB,UAFOgiB,MAAMu/D,MACb6C,OAASA,QAAoB,WAAVpkF,MACfA,SAAW+1F,OAAS,OAAS,QAAS,CAGxC,GAAc,SAAV/1F,QAAoB23F,eAA+B/oG,IAAnB+oG,SAASpW,MAK3C,SAJAwU,QAAS,CAMb,CACA7K,KAAK3J,MAAQoW,UAAYA,SAASpW,OAAS1V,OAAO7Q,MAAMn4D,KAAM0+E,KAChE,CAKF,IADAiW,WAAa3rB,OAAOuB,cAAcprD,UAChB6pD,OAAOuB,cAAc8d,MA0DvC,IAAK3J,QArDDmW,OAA2B,IAAlB70F,KAAKvN,WAKhB+qC,KAAKw3D,SAAW,CAAC78B,MAAM68B,SAAU78B,MAAM88B,UAAW98B,MAAM+8B,WAIlC,OADtBN,eAAiBE,UAAYA,SAASvU,WAEpCqU,eAAiBhW,SAAS3yF,IAAI+T,KAAM,YAGtB,UADhBugF,QAAUvX,OAAOwX,IAAIxgF,KAAM,cAErB40F,eACFrU,QAAUqU,gBAGVxT,SAAS,CAACphF,OAAO,GACjB40F,eAAiB50F,KAAKm4D,MAAMooB,SAAWqU,eACvCrU,QAAUvX,OAAOwX,IAAIxgF,KAAM,WAC3BohF,SAAS,CAACphF,UAKE,WAAZugF,SAAoC,iBAAZA,SAAgD,MAAlBqU,iBACtB,SAA9B5rB,OAAOwX,IAAIxgF,KAAM,WAEd20F,YACHH,KAAK3gE,MAAK,WACRskC,MAAMooB,QAAUqU,cAClB,IACsB,MAAlBA,iBACFrU,QAAUpoB,MAAMooB,QAChBqU,eAA6B,SAAZrU,QAAqB,GAAKA,UAG/CpoB,MAAMooB,QAAU,iBAIlB/iD,KAAKw3D,WACP78B,MAAM68B,SAAW,SACjBR,KAAK/Y,QAAO,WACVtjB,MAAM68B,SAAWx3D,KAAKw3D,SAAS,GAC/B78B,MAAM88B,UAAYz3D,KAAKw3D,SAAS,GAChC78B,MAAM+8B,UAAY13D,KAAKw3D,SAAS,EAClC,KAIFL,WAAY,EACCtM,KAENsM,YACCG,SACE,WAAYA,WACd5B,OAAS4B,SAAS5B,QAGpB4B,SAAWlW,SAASjB,OAAO39E,KAAM,SAAU,CACzCugF,QAASqU,iBAKTrT,SACFuT,SAAS5B,QAAUA,QAIjBA,QACF9R,SAAS,CAACphF,OAAO,GAKnBw0F,KAAK3gE,MAAK,WAQR,IAAK6qD,QAJAwU,QACH9R,SAAS,CAACphF,OAEZ4+E,SAAS7qF,OAAOiM,KAAM,UACTqoF,KACXrf,OAAO7Q,MAAMn4D,KAAM0+E,KAAM2J,KAAK3J,MAElC,KAIFiW,UAAYnB,YAAYN,OAAS4B,SAASpW,MAAQ,EAAGA,KAAM8V,MACrD9V,QAAQoW,WACZA,SAASpW,MAAQiW,UAAU1zE,MACvBiyE,SACFyB,UAAUzzE,IAAMyzE,UAAU1zE,MAC1B0zE,UAAU1zE,MAAQ,GAI1B,GAqKEk0E,UAAW,SAAmBhpG,SAAUg+F,SAClCA,QACFuJ,UAAUI,WAAWpU,QAAQvzF,UAE7BunG,UAAUI,WAAWvmG,KAAKpB,SAE9B,IAEF68E,OAAOosB,MAAQ,SAAUA,MAAO5F,OAAQtgG,IACtC,IAAImmG,IAAMD,OAA8B,WAArBzlF,UAAUylF,OAAsBpsB,OAAOe,OAAO,CAAC,EAAGqrB,OAAS,CAC5Ed,SAAUplG,KAAOA,IAAMsgG,QAAUx9E,WAAWojF,QAAUA,MACtD36D,SAAU26D,MACV5F,OAAQtgG,IAAMsgG,QAAUA,SAAWx9E,WAAWw9E,SAAWA,QA+B3D,OA3BIxmB,OAAOspB,GAAG1O,IACZyR,IAAI56D,SAAW,EAEa,iBAAjB46D,IAAI56D,WACT46D,IAAI56D,YAAYuuC,OAAOspB,GAAGgD,OAC5BD,IAAI56D,SAAWuuC,OAAOspB,GAAGgD,OAAOD,IAAI56D,UAEpC46D,IAAI56D,SAAWuuC,OAAOspB,GAAGgD,OAAOlT,UAMrB,MAAbiT,IAAI1a,QAA+B,IAAd0a,IAAI1a,QAC3B0a,IAAI1a,MAAQ,MAId0a,IAAIjK,IAAMiK,IAAIf,SACde,IAAIf,SAAW,WACTtiF,WAAWqjF,IAAIjK,MACjBiK,IAAIjK,IAAIhiG,KAAKqC,MAEX4pG,IAAI1a,OACN3R,OAAOsW,QAAQ7zF,KAAM4pG,IAAI1a,MAE7B,EACO0a,GACT,EACArsB,OAAO95E,GAAG66E,OAAO,CACfwrB,OAAQ,SAAgBH,MAAOI,GAAIhG,OAAQrjG,UAEzC,OAAOV,KAAKyH,OAAOotF,oBAAoBE,IAAI,UAAW,GAAGa,OAGxDngE,MAAMu0E,QAAQ,CACb/F,QAAS8F,IACRJ,MAAO5F,OAAQrjG,SACpB,EACAspG,QAAS,SAAiB/W,KAAM0W,MAAO5F,OAAQrjG,UAC7C,IAAImoF,MAAQtL,OAAOuB,cAAcmU,MAC/BgX,OAAS1sB,OAAOosB,MAAMA,MAAO5F,OAAQrjG,UACrCwpG,YAAc,WAEZ,IAAInB,KAAOd,UAAUjoG,KAAMu9E,OAAOe,OAAO,CAAC,EAAG2U,MAAOgX,SAGhDphB,OAASsK,SAAS3yF,IAAIR,KAAM,YAC9B+oG,KAAK7U,MAAK,EAEd,EAEF,OADAgW,YAAYC,OAASD,YACdrhB,QAA0B,IAAjBohB,OAAO/a,MAAkBlvF,KAAK+9E,KAAKmsB,aAAelqG,KAAKkvF,MAAM+a,OAAO/a,MAAOgb,YAC7F,EACAhW,KAAM,SAAc1wF,KAAM4wF,WAAYuU,SACpC,IAAIyB,UAAY,SAAmBrW,OACjC,IAAIG,KAAOH,MAAMG,YACVH,MAAMG,KACbA,KAAKyU,QACP,EASA,MARoB,iBAATnlG,OACTmlG,QAAUvU,WACVA,WAAa5wF,KACbA,UAAOlD,GAEL8zF,YACFp0F,KAAKkvF,MAAM1rF,MAAQ,KAAM,IAEpBxD,KAAK+9E,MAAK,WACf,IAAI8V,SAAU,EACZpvE,MAAgB,MAARjhB,MAAgBA,KAAO,aAC/B6mG,OAAS9sB,OAAO8sB,OAChBnlF,KAAOiuE,SAAS3yF,IAAIR,MACtB,GAAIykB,MACES,KAAKT,QAAUS,KAAKT,OAAOyvE,MAC7BkW,UAAUllF,KAAKT,aAGjB,IAAKA,SAASS,KACRA,KAAKT,QAAUS,KAAKT,OAAOyvE,MAAQqT,KAAK9/E,KAAKhD,QAC/C2lF,UAAUllF,KAAKT,QAIrB,IAAKA,MAAQ4lF,OAAOzrG,OAAQ6lB,SACtB4lF,OAAO5lF,OAAOlQ,OAASvU,MAAiB,MAARwD,MAAgB6mG,OAAO5lF,OAAOyqE,QAAU1rF,OAC1E6mG,OAAO5lF,OAAOskF,KAAK7U,KAAKyU,SACxB9U,SAAU,EACVwW,OAAO13F,OAAO8R,MAAO,KAOrBovE,SAAY8U,SACdprB,OAAOsW,QAAQ7zF,KAAMwD,KAEzB,GACF,EACA2mG,OAAQ,SAAgB3mG,MAItB,OAHa,IAATA,OACFA,KAAOA,MAAQ,MAEVxD,KAAK+9E,MAAK,WACf,IAAIt5D,MACFS,KAAOiuE,SAAS3yF,IAAIR,MACpBkvF,MAAQhqE,KAAK1hB,KAAO,SACpBuwF,MAAQ7uE,KAAK1hB,KAAO,cACpB6mG,OAAS9sB,OAAO8sB,OAChBzrG,OAASswF,MAAQA,MAAMtwF,OAAS,EAYlC,IATAsmB,KAAKilF,QAAS,EAGd5sB,OAAO2R,MAAMlvF,KAAMwD,KAAM,IACrBuwF,OAASA,MAAMG,MACjBH,MAAMG,KAAKv2F,KAAKqC,MAAM,GAInBykB,MAAQ4lF,OAAOzrG,OAAQ6lB,SACtB4lF,OAAO5lF,OAAOlQ,OAASvU,MAAQqqG,OAAO5lF,OAAOyqE,QAAU1rF,OACzD6mG,OAAO5lF,OAAOskF,KAAK7U,MAAK,GACxBmW,OAAO13F,OAAO8R,MAAO,IAKzB,IAAKA,MAAQ,EAAGA,MAAQ7lB,OAAQ6lB,QAC1ByqE,MAAMzqE,QAAUyqE,MAAMzqE,OAAO0lF,QAC/Bjb,MAAMzqE,OAAO0lF,OAAOxsG,KAAKqC,aAKtBklB,KAAKilF,MACd,GACF,IAEF5sB,OAAOQ,KAAK,CAAC,SAAU,OAAQ,SAAS,SAAU6B,GAAIp+E,MACpD,IAAI8oG,MAAQ/sB,OAAO95E,GAAGjC,MACtB+7E,OAAO95E,GAAGjC,MAAQ,SAAUmoG,MAAO5F,OAAQrjG,UACzC,OAAgB,MAATipG,OAAkC,kBAAVA,MAAsBW,MAAM74E,MAAMzxB,KAAMorB,WAAaprB,KAAKgqG,QAAQnC,MAAMrmG,MAAM,GAAOmoG,MAAO5F,OAAQrjG,SACrI,CACF,IAGA68E,OAAOQ,KAAK,CACVwsB,UAAW1C,MAAM,QACjB2C,QAAS3C,MAAM,QACf4C,YAAa5C,MAAM,UACnB6C,OAAQ,CACNzG,QAAS,QAEX0G,QAAS,CACP1G,QAAS,QAEX2G,WAAY,CACV3G,QAAS,YAEV,SAAUziG,KAAMkyB,OACjB6pD,OAAO95E,GAAGjC,MAAQ,SAAUmoG,MAAO5F,OAAQrjG,UACzC,OAAOV,KAAKgqG,QAAQt2E,MAAOi2E,MAAO5F,OAAQrjG,SAC5C,CACF,IACA68E,OAAO8sB,OAAS,GAChB9sB,OAAOspB,GAAGc,KAAO,WACf,IAAImB,MACFnqG,EAAI,EACJ0rG,OAAS9sB,OAAO8sB,OAElB,IADAjD,MAAQvxE,KAAKC,MACNn3B,EAAI0rG,OAAOzrG,OAAQD,KACxBmqG,MAAQuB,OAAO1rG,OAGC0rG,OAAO1rG,KAAOmqG,OAC5BuB,OAAO13F,OAAOhU,IAAK,GAGlB0rG,OAAOzrG,QACV2+E,OAAOspB,GAAG3S,OAEZkT,WAAQ9mG,CACV,EACAi9E,OAAOspB,GAAGiC,MAAQ,SAAUA,OAC1BvrB,OAAO8sB,OAAOvoG,KAAKgnG,OACnBvrB,OAAOspB,GAAGrxE,OACZ,EACA+nD,OAAOspB,GAAGa,SAAW,GACrBnqB,OAAOspB,GAAGrxE,MAAQ,WACZ6xE,aAGJA,YAAa,EACbG,WACF,EACAjqB,OAAOspB,GAAG3S,KAAO,WACfmT,WAAa,IACf,EACA9pB,OAAOspB,GAAGgD,OAAS,CACjBgB,KAAM,IACNC,KAAM,IAENnU,SAAU,KAIZpZ,OAAO95E,GAAGsnG,MAAQ,SAAUthC,KAAMjmE,MAGhC,OAFAimE,KAAO8T,OAAOspB,IAAKtpB,OAAOspB,GAAGgD,OAAOpgC,OAAgBA,KACpDjmE,KAAOA,MAAQ,KACRxD,KAAKkvF,MAAM1rF,MAAM,SAAU4/E,KAAM2Q,OACtC,IAAIiX,QAAU9tG,OAAOuS,WAAW2zE,KAAM3Z,MACtCsqB,MAAMG,KAAO,WACXh3F,OAAOwS,aAAas7F,QACtB,CACF,GACF,EACA,WACE,IAAIhiD,MAAQ3qD,SAASqN,cAAc,SAEjCk+F,IADSvrG,SAASqN,cAAc,UACnBE,YAAYvN,SAASqN,cAAc,WAClDs9C,MAAMxlD,KAAO,WAIbk5E,QAAQuuB,QAA0B,KAAhBjiD,MAAMt3C,MAIxBgrE,QAAQwuB,YAActB,IAAIjhB,UAI1B3/B,MAAQ3qD,SAASqN,cAAc,UACzBgG,MAAQ,IACds3C,MAAMxlD,KAAO,QACbk5E,QAAQyuB,WAA6B,MAAhBniD,MAAMt3C,KAC5B,CApBD,GAqBA,IAAI05F,SACFnlB,WAAa1I,OAAOuI,KAAKG,WAC3B1I,OAAO95E,GAAG66E,OAAO,CACf0H,KAAM,SAAcxkF,KAAMkQ,OACxB,OAAOwgF,OAAOlyF,KAAMu9E,OAAOyI,KAAMxkF,KAAMkQ,MAAO0Z,UAAUxsB,OAAS,EACnE,EACAysG,WAAY,SAAoB7pG,MAC9B,OAAOxB,KAAK+9E,MAAK,WACfR,OAAO8tB,WAAWrrG,KAAMwB,KAC1B,GACF,IAEF+7E,OAAOe,OAAO,CACZ0H,KAAM,SAAczxE,KAAM/S,KAAMkQ,OAC9B,IAAI9B,IACFmkF,MACAuX,MAAQ/2F,KAAKvN,SAGf,GAAc,IAAVskG,OAAyB,IAAVA,OAAyB,IAAVA,MAKlC,YAAiC,IAAtB/2F,KAAKzG,aACPyvE,OAAO0V,KAAK1+E,KAAM/S,KAAMkQ,QAKnB,IAAV45F,OAAgB/tB,OAAO4B,SAAS5qE,QAClCw/E,MAAQxW,OAAOguB,UAAU/pG,KAAK43B,iBAAmBmkD,OAAOuI,KAAK7zD,MAAMmwD,KAAK36D,KAAKjmB,MAAQ4pG,cAAW9qG,SAEpFA,IAAVoR,MACY,OAAVA,WACF6rE,OAAO8tB,WAAW92F,KAAM/S,MAGtBuyF,OAAS,QAASA,YAAkDzzF,KAAxCsP,IAAMmkF,MAAM5zF,IAAIoU,KAAM7C,MAAOlQ,OACpDoO,KAET2E,KAAKuoB,aAAat7B,KAAMkQ,MAAQ,IACzBA,OAELqiF,OAAS,QAASA,OAA2C,QAAjCnkF,IAAMmkF,MAAMvzF,IAAI+T,KAAM/S,OAC7CoO,IAKK,OAHdA,IAAM2tE,OAAOroD,KAAK8wD,KAAKzxE,KAAM/S,YAGRlB,EAAYsP,IACnC,EACA27F,UAAW,CACT/nG,KAAM,CACJrD,IAAK,SAAaoU,KAAM7C,OACtB,IAAKgrE,QAAQyuB,YAAwB,UAAVz5F,OAAqB68D,SAASh6D,KAAM,SAAU,CACvE,IAAIo0B,IAAMp0B,KAAK7C,MAKf,OAJA6C,KAAKuoB,aAAa,OAAQprB,OACtBi3B,MACFp0B,KAAK7C,MAAQi3B,KAERj3B,KACT,CACF,IAGJ25F,WAAY,SAAoB92F,KAAM7C,OACpC,IAAIlQ,KACF7C,EAAI,EAGJ6sG,UAAY95F,OAASA,MAAMugB,MAAMk8D,eACnC,GAAIqd,WAA+B,IAAlBj3F,KAAKvN,SACpB,KAAOxF,KAAOgqG,UAAU7sG,MACtB4V,KAAK4vE,gBAAgB3iF,KAG3B,IAIF4pG,SAAW,CACTjrG,IAAK,SAAaoU,KAAM7C,MAAOlQ,MAO7B,OANc,IAAVkQ,MAEF6rE,OAAO8tB,WAAW92F,KAAM/S,MAExB+S,KAAKuoB,aAAat7B,KAAMA,MAEnBA,IACT,GAEF+7E,OAAOQ,KAAKR,OAAOuI,KAAK7zD,MAAMmwD,KAAK3gF,OAAOwwB,MAAM,SAAS,SAAU2tD,GAAIp+E,MACrE,IAAIiqG,OAASxlB,WAAWzkF,OAAS+7E,OAAOroD,KAAK8wD,KAC7CC,WAAWzkF,MAAQ,SAAU+S,KAAM/S,KAAM8qF,OACvC,IAAI18E,IACFwpF,OACAsS,cAAgBlqG,KAAK43B,cAQvB,OAPKkzD,QAEH8M,OAASnT,WAAWylB,eACpBzlB,WAAWylB,eAAiB97F,IAC5BA,IAAmC,MAA7B67F,OAAOl3F,KAAM/S,KAAM8qF,OAAiBof,cAAgB,KAC1DzlB,WAAWylB,eAAiBtS,QAEvBxpF,GACT,CACF,IACA,IAAI+7F,WAAa,sCACfC,WAAa,gBAmGf,SAASC,iBAAiBn6F,OAExB,OADaA,MAAMugB,MAAMk8D,gBAAkB,IAC7B1wD,KAAK,IACrB,CACA,SAASquE,SAASv3F,MAChB,OAAOA,KAAKzG,cAAgByG,KAAKzG,aAAa,UAAY,EAC5D,CACA,SAASi+F,eAAer6F,OACtB,OAAIrK,MAAM6iB,QAAQxY,OACTA,MAEY,iBAAVA,OACFA,MAAMugB,MAAMk8D,gBAEd,EACT,CAjHA5Q,OAAO95E,GAAG66E,OAAO,CACf2U,KAAM,SAAczxF,KAAMkQ,OACxB,OAAOwgF,OAAOlyF,KAAMu9E,OAAO0V,KAAMzxF,KAAMkQ,MAAO0Z,UAAUxsB,OAAS,EACnE,EACAotG,WAAY,SAAoBxqG,MAC9B,OAAOxB,KAAK+9E,MAAK,kBACR/9E,KAAKu9E,OAAO0uB,QAAQzqG,OAASA,KACtC,GACF,IAEF+7E,OAAOe,OAAO,CACZ2U,KAAM,SAAc1+E,KAAM/S,KAAMkQ,OAC9B,IAAI9B,IACFmkF,MACAuX,MAAQ/2F,KAAKvN,SAGf,GAAc,IAAVskG,OAAyB,IAAVA,OAAyB,IAAVA,MAQlC,OALc,IAAVA,OAAgB/tB,OAAO4B,SAAS5qE,QAElC/S,KAAO+7E,OAAO0uB,QAAQzqG,OAASA,KAC/BuyF,MAAQxW,OAAOgpB,UAAU/kG,YAEblB,IAAVoR,MACEqiF,OAAS,QAASA,YAAkDzzF,KAAxCsP,IAAMmkF,MAAM5zF,IAAIoU,KAAM7C,MAAOlQ,OACpDoO,IAEF2E,KAAK/S,MAAQkQ,MAElBqiF,OAAS,QAASA,OAA2C,QAAjCnkF,IAAMmkF,MAAMvzF,IAAI+T,KAAM/S,OAC7CoO,IAEF2E,KAAK/S,KACd,EACA+kG,UAAW,CACT/d,SAAU,CACRhoF,IAAK,SAAa+T,MAKhB,IAAI23F,SAAW3uB,OAAOroD,KAAK8wD,KAAKzxE,KAAM,YACtC,OAAI23F,SACK13E,SAAS03E,SAAU,IAExBP,WAAWlkF,KAAKlT,KAAKg6D,WAAaq9B,WAAWnkF,KAAKlT,KAAKg6D,WAAah6D,KAAKg0E,KACpE,GAED,CACV,IAGJ0jB,QAAS,CACP,IAAO,UACP,MAAS,eAYRvvB,QAAQwuB,cACX3tB,OAAOgpB,UAAU5d,SAAW,CAC1BnoF,IAAK,SAAa+T,MAGhB,IAAIC,OAASD,KAAKxP,WAIlB,OAHIyP,QAAUA,OAAOzP,YACnByP,OAAOzP,WAAW6jF,cAEb,IACT,EACAzoF,IAAK,SAAaoU,MAGhB,IAAIC,OAASD,KAAKxP,WACdyP,SACFA,OAAOo0E,cACHp0E,OAAOzP,YACTyP,OAAOzP,WAAW6jF,cAGxB,IAGJrL,OAAOQ,KAAK,CAAC,WAAY,WAAY,YAAa,cAAe,cAAe,UAAW,UAAW,SAAU,cAAe,oBAAoB,WACjJR,OAAO0uB,QAAQjsG,KAAKo5B,eAAiBp5B,IACvC,IAoBAu9E,OAAO95E,GAAG66E,OAAO,CACf6tB,SAAU,SAAkBz6F,OAC1B,IAAI06F,WAAY7e,IAAK8e,SAAU1mB,UAAWhnF,EAAG2tG,WAC7C,OAAI/lF,WAAW7U,OACN1R,KAAK+9E,MAAK,SAAUM,GACzBd,OAAOv9E,MAAMmsG,SAASz6F,MAAM/T,KAAKqC,KAAMq+E,EAAGytB,SAAS9rG,OACrD,KAEFosG,WAAaL,eAAer6F,QACb9S,OACNoB,KAAK+9E,MAAK,WAGf,GAFAsuB,SAAWP,SAAS9rG,MACpButF,IAAwB,IAAlBvtF,KAAKgH,UAAkB,IAAM6kG,iBAAiBQ,UAAY,IACvD,CACP,IAAK1tG,EAAI,EAAGA,EAAIytG,WAAWxtG,OAAQD,IACjCgnF,UAAYymB,WAAWztG,GACnB4uF,IAAI76E,QAAQ,IAAMizE,UAAY,KAAO,IACvC4H,KAAO5H,UAAY,KAKvB2mB,WAAaT,iBAAiBte,KAC1B8e,WAAaC,YACftsG,KAAK88B,aAAa,QAASwvE,WAE/B,CACF,IAEKtsG,IACT,EACAusG,YAAa,SAAqB76F,OAChC,IAAI06F,WAAY7e,IAAK8e,SAAU1mB,UAAWhnF,EAAG2tG,WAC7C,OAAI/lF,WAAW7U,OACN1R,KAAK+9E,MAAK,SAAUM,GACzBd,OAAOv9E,MAAMusG,YAAY76F,MAAM/T,KAAKqC,KAAMq+E,EAAGytB,SAAS9rG,OACxD,IAEGorB,UAAUxsB,QAGfwtG,WAAaL,eAAer6F,QACb9S,OACNoB,KAAK+9E,MAAK,WAKf,GAJAsuB,SAAWP,SAAS9rG,MAGpButF,IAAwB,IAAlBvtF,KAAKgH,UAAkB,IAAM6kG,iBAAiBQ,UAAY,IACvD,CACP,IAAK1tG,EAAI,EAAGA,EAAIytG,WAAWxtG,OAAQD,IAIjC,IAHAgnF,UAAYymB,WAAWztG,GAGhB4uF,IAAI76E,QAAQ,IAAMizE,UAAY,MAAQ,GAC3C4H,IAAMA,IAAIhmE,QAAQ,IAAMo+D,UAAY,IAAK,KAK7C2mB,WAAaT,iBAAiBte,KAC1B8e,WAAaC,YACftsG,KAAK88B,aAAa,QAASwvE,WAE/B,CACF,IAEKtsG,KA3BEA,KAAKgmF,KAAK,QAAS,GA4B9B,EACAwmB,YAAa,SAAqB96F,MAAO+6F,UACvC,IAAIL,WACFzmB,UACAhnF,EACAvB,KACAoG,KAAO0gB,UAAUxS,OACjBg7F,aAAwB,WAATlpG,MAAqB6D,MAAM6iB,QAAQxY,OACpD,OAAI6U,WAAW7U,OACN1R,KAAK+9E,MAAK,SAAUp/E,GACzB4+E,OAAOv9E,MAAMwsG,YAAY96F,MAAM/T,KAAKqC,KAAMrB,EAAGmtG,SAAS9rG,MAAOysG,UAAWA,SAC1E,IAEsB,kBAAbA,UAA0BC,aAC5BD,SAAWzsG,KAAKmsG,SAASz6F,OAAS1R,KAAKusG,YAAY76F,QAE5D06F,WAAaL,eAAer6F,OACrB1R,KAAK+9E,MAAK,WACf,GAAI2uB,aAGF,IADAtvG,KAAOmgF,OAAOv9E,MACTrB,EAAI,EAAGA,EAAIytG,WAAWxtG,OAAQD,IACjCgnF,UAAYymB,WAAWztG,GAGnBvB,KAAKuvG,SAAShnB,WAChBvoF,KAAKmvG,YAAY5mB,WAEjBvoF,KAAK+uG,SAASxmB,qBAKCrlF,IAAVoR,OAAgC,YAATlO,QAChCmiF,UAAYmmB,SAAS9rG,QAGnBmzF,SAAShzF,IAAIH,KAAM,gBAAiB2lF,WAOlC3lF,KAAK88B,cACP98B,KAAK88B,aAAa,QAAS6oD,YAAuB,IAAVj0E,MAAkB,GAAKyhF,SAAS3yF,IAAIR,KAAM,kBAAoB,IAG5G,IACF,EACA2sG,SAAU,SAAkB5jG,UAC1B,IAAI48E,UACFpxE,KACA5V,EAAI,EAEN,IADAgnF,UAAY,IAAM58E,SAAW,IACtBwL,KAAOvU,KAAKrB,MACjB,GAAsB,IAAlB4V,KAAKvN,WAAmB,IAAM6kG,iBAAiBC,SAASv3F,OAAS,KAAK7B,QAAQizE,YAAc,EAC9F,OAAO,EAGX,OAAO,CACT,IAEF,IAAIinB,QAAU,MACdrvB,OAAO95E,GAAG66E,OAAO,CACf31C,IAAK,SAAaj3B,OAChB,IAAIqiF,MACFnkF,IACAiuF,gBACAtpF,KAAOvU,KAAK,GACd,OAAKorB,UAAUxsB,QAkBfi/F,gBAAkBt3E,WAAW7U,OACtB1R,KAAK+9E,MAAK,SAAUp/E,GACzB,IAAIgqC,IACkB,IAAlB3oC,KAAKgH,WAUE,OANT2hC,IADEk1D,gBACInsF,MAAM/T,KAAKqC,KAAMrB,EAAG4+E,OAAOv9E,MAAM2oC,OAEjCj3B,OAKNi3B,IAAM,GACkB,iBAARA,IAChBA,KAAO,GACEthC,MAAM6iB,QAAQye,OACvBA,IAAM40C,OAAOj2E,IAAIqhC,KAAK,SAAUj3B,OAC9B,OAAgB,MAATA,MAAgB,GAAKA,MAAQ,EACtC,MAEFqiF,MAAQxW,OAAOsvB,SAAS7sG,KAAKwD,OAAS+5E,OAAOsvB,SAAS7sG,KAAKuuE,SAASn1C,iBAGpD,QAAS26D,YAA4CzzF,IAAlCyzF,MAAM5zF,IAAIH,KAAM2oC,IAAK,WACtD3oC,KAAK0R,MAAQi3B,KAEjB,KA7CMp0B,MACFw/E,MAAQxW,OAAOsvB,SAASt4F,KAAK/Q,OAAS+5E,OAAOsvB,SAASt4F,KAAKg6D,SAASn1C,iBACvD,QAAS26D,YAA8CzzF,KAApCsP,IAAMmkF,MAAMvzF,IAAI+T,KAAM,UAC7C3E,IAKU,iBAHnBA,IAAM2E,KAAK7C,OAIF9B,IAAI2X,QAAQqlF,QAAS,IAIhB,MAAPh9F,IAAc,GAAKA,SAE5B,CA+BJ,IAEF2tE,OAAOe,OAAO,CACZuuB,SAAU,CACRvW,OAAQ,CACN91F,IAAK,SAAa+T,MAChB,IAAIo0B,IAAM40C,OAAOroD,KAAK8wD,KAAKzxE,KAAM,SACjC,OAAc,MAAPo0B,IAAcA,IAKrBkjE,iBAAiBtuB,OAAOtgD,KAAK1oB,MAC/B,GAEF6vE,OAAQ,CACN5jF,IAAK,SAAa+T,MAChB,IAAI7C,MACF4kF,OACA33F,EACA0rE,QAAU91D,KAAK81D,QACf5lD,MAAQlQ,KAAKq0E,cACbqP,IAAoB,eAAd1jF,KAAK/Q,KACXglB,OAASyvE,IAAM,KAAO,GACtBljE,IAAMkjE,IAAMxzE,MAAQ,EAAI4lD,QAAQzrE,OAQlC,IANED,EADE8lB,MAAQ,EACNsQ,IAEAkjE,IAAMxzE,MAAQ,EAIb9lB,EAAIo2B,IAAKp2B,IAKd,KAJA23F,OAASjsB,QAAQ1rE,IAILgqF,UAAYhqF,IAAM8lB,SAE7B6xE,OAAOpT,YAAcoT,OAAOvxF,WAAWm+E,WAAa3U,SAAS+nB,OAAOvxF,WAAY,aAAc,CAK7F,GAHA2M,MAAQ6rE,OAAO+Y,QAAQ3tD,MAGnBsvD,IACF,OAAOvmF,MAIT8W,OAAO1mB,KAAK4P,MACd,CAEF,OAAO8W,MACT,EACAroB,IAAK,SAAaoU,KAAM7C,OAMtB,IALA,IAAIo7F,UACFxW,OACAjsB,QAAU91D,KAAK81D,QACf7hD,OAAS+0D,OAAO0B,UAAUvtE,OAC1B/S,EAAI0rE,QAAQzrE,OACPD,OACL23F,OAASjsB,QAAQ1rE,IAINgqF,SAAWpL,OAAO2B,QAAQ3B,OAAOsvB,SAASvW,OAAO91F,IAAI81F,QAAS9tE,SAAW,KAClFskF,WAAY,GAUhB,OAHKA,YACHv4F,KAAKq0E,eAAiB,GAEjBpgE,MACT,MAMN+0D,OAAOQ,KAAK,CAAC,QAAS,aAAa,WACjCR,OAAOsvB,SAAS7sG,MAAQ,CACtBG,IAAK,SAAaoU,KAAM7C,OACtB,GAAIrK,MAAM6iB,QAAQxY,OAChB,OAAO6C,KAAKm0E,QAAUnL,OAAO2B,QAAQ3B,OAAOhpE,MAAMo0B,MAAOj3B,QAAU,CAEvE,GAEGgrE,QAAQuuB,UACX1tB,OAAOsvB,SAAS7sG,MAAMQ,IAAM,SAAU+T,MACpC,OAAsC,OAA/BA,KAAKzG,aAAa,SAAoB,KAAOyG,KAAK7C,KAC3D,EAEJ,IAGA,IAAI2gD,SAAWn1D,OAAOm1D,SAClB0qB,MAAQ,CACV4C,KAAM9pD,KAAKC,OAETi3E,OAAS,KAGbxvB,OAAOyvB,SAAW,SAAU9nF,MAC1B,IAAIgS,IAAK+1E,gBACT,IAAK/nF,MAAwB,iBAATA,KAClB,OAAO,KAKT,IACEgS,KAAM,IAAIh6B,OAAOk7B,WAAYI,gBAAgBtT,KAAM,WACrD,CAAE,MAAO9mB,GAAI,CAOb,OANA6uG,gBAAkB/1E,KAAOA,IAAI2C,qBAAqB,eAAe,GAC5D3C,MAAO+1E,iBACV1vB,OAAOnpE,MAAM,iBAAmB64F,gBAAkB1vB,OAAOj2E,IAAI2lG,gBAAgB5pB,YAAY,SAAU15E,IACjG,OAAOA,GAAGgC,WACZ,IAAG8xB,KAAK,MAAQvY,OAEXgS,GACT,EACA,IAAIg2E,YAAc,kCAChBC,wBAA0B,SAAiC/uG,GACzDA,EAAEq6F,iBACJ,EACFlb,OAAOe,OAAOf,OAAOp6E,MAAO,CAC1Bw1F,QAAS,SAAiBx1F,MAAO+hB,KAAM3Q,KAAM64F,cAC3C,IAAIzuG,EACF4uF,IACA8G,IACAgZ,WACAC,OACAlU,OACAzI,QACA4c,YACAC,UAAY,CAACj5F,MAAQlW,UACrBmF,KAAO+4E,OAAO5+E,KAAKwF,MAAO,QAAUA,MAAMK,KAAOL,MACjD81F,WAAa1c,OAAO5+E,KAAKwF,MAAO,aAAeA,MAAMi8E,UAAUjkD,MAAM,KAAO,GAI9E,GAHAoyD,IAAMggB,YAAclZ,IAAM9/E,KAAOA,MAAQlW,SAGnB,IAAlBkW,KAAKvN,UAAoC,IAAlBuN,KAAKvN,WAK5BkmG,YAAYzlF,KAAKjkB,KAAO+5E,OAAOp6E,MAAMk2F,aAGrC71F,KAAKkP,QAAQ,MAAQ,IAEvBumF,WAAaz1F,KAAK23B,MAAM,KACxB33B,KAAOy1F,WAAW3U,QAClB2U,WAAWzuC,QAEb8iD,OAAS9pG,KAAKkP,QAAQ,KAAO,GAAK,KAAOlP,MAGzCL,MAAQA,MAAMo6E,OAAOmB,SAAWv7E,MAAQ,IAAIo6E,OAAOmd,MAAMl3F,KAA2B,WAArB0gB,UAAU/gB,QAAuBA,QAG1Fo1F,UAAY6U,aAAe,EAAI,EACrCjqG,MAAMi8E,UAAY6Z,WAAWx7D,KAAK,KAClCt6B,MAAMg3F,WAAah3F,MAAMi8E,UAAY,IAAI93D,OAAO,UAAY2xE,WAAWx7D,KAAK,iBAAmB,WAAa,KAG5Gt6B,MAAMuhB,YAASpkB,EACV6C,MAAMQ,SACTR,MAAMQ,OAAS4Q,MAIjB2Q,KAAe,MAARA,KAAe,CAAC/hB,OAASo6E,OAAO0B,UAAU/5D,KAAM,CAAC/hB,QAGxDwtF,QAAUpT,OAAOp6E,MAAMwtF,QAAQntF,OAAS,CAAC,EACpC4pG,eAAgBzc,QAAQgI,UAAiD,IAAtChI,QAAQgI,QAAQlnE,MAAMld,KAAM2Q,OAApE,CAMA,IAAKkoF,eAAiBzc,QAAQmK,WAAale,SAASroE,MAAO,CAKzD,IAJA84F,WAAa1c,QAAQ6H,cAAgBh1F,KAChC0pG,YAAYzlF,KAAK4lF,WAAa7pG,QACjC+pF,IAAMA,IAAIxoF,YAELwoF,IAAKA,IAAMA,IAAIxoF,WACpByoG,UAAU1rG,KAAKyrF,KACf8G,IAAM9G,IAIJ8G,OAAS9/E,KAAKE,eAAiBpW,WACjCmvG,UAAU1rG,KAAKuyF,IAAIlP,aAAekP,IAAIoZ,cAAgBvwG,OAE1D,CAIA,IADAyB,EAAI,GACI4uF,IAAMigB,UAAU7uG,QAAUwE,MAAM+2F,wBACtCqT,YAAchgB,IACdpqF,MAAMK,KAAO7E,EAAI,EAAI0uG,WAAa1c,QAAQ4I,UAAY/1F,MAGtD41F,QAAUjG,SAAS3yF,IAAI+sF,IAAK,WAAa/vF,OAAOW,OAAO,OAAOgF,MAAMK,OAAS2vF,SAAS3yF,IAAI+sF,IAAK,YAE7F6L,OAAO3nE,MAAM87D,IAAKroE,OAIpBk0E,OAASkU,QAAU/f,IAAI+f,UACTlU,OAAO3nE,OAASqhE,WAAWvF,OACvCpqF,MAAMuhB,OAAS00E,OAAO3nE,MAAM87D,IAAKroE,OACZ,IAAjB/hB,MAAMuhB,QACRvhB,MAAMkB,kBAkCZ,OA9BAlB,MAAMK,KAAOA,KAGR4pG,cAAiBjqG,MAAM+3F,sBACpBvK,QAAQgG,WAA8D,IAAlDhG,QAAQgG,SAASllE,MAAM+7E,UAAUroF,MAAOD,QAAoB4tE,WAAWv+E,OAG3F+4F,QAAU/mF,WAAWhS,KAAK/Q,SAAWo5E,SAASroE,SAEhD8/E,IAAM9/E,KAAK+4F,WAET/4F,KAAK+4F,QAAU,MAIjB/vB,OAAOp6E,MAAMk2F,UAAY71F,KACrBL,MAAM+2F,wBACRqT,YAAYvpG,iBAAiBR,KAAM2pG,yBAErC54F,KAAK/Q,QACDL,MAAM+2F,wBACRqT,YAAYrpG,oBAAoBV,KAAM2pG,yBAExC5vB,OAAOp6E,MAAMk2F,eAAY/4F,EACrB+zF,MACF9/E,KAAK+4F,QAAUjZ,MAKhBlxF,MAAMuhB,MAvEb,CAwEF,EAGA23E,SAAU,SAAkB74F,KAAM+Q,KAAMpR,OACtC,IAAI/E,EAAIm/E,OAAOe,OAAO,IAAIf,OAAOmd,MAASv3F,MAAO,CAC/CK,KACA63F,aAAa,IAEf9d,OAAOp6E,MAAMw1F,QAAQv6F,EAAG,KAAMmW,KAChC,IAEFgpE,OAAO95E,GAAG66E,OAAO,CACfqa,QAAS,SAAiBn1F,KAAM0hB,MAC9B,OAAOllB,KAAK+9E,MAAK,WACfR,OAAOp6E,MAAMw1F,QAAQn1F,KAAM0hB,KAAMllB,KACnC,GACF,EACA0tG,eAAgB,SAAwBlqG,KAAM0hB,MAC5C,IAAI3Q,KAAOvU,KAAK,GAChB,GAAIuU,KACF,OAAOgpE,OAAOp6E,MAAMw1F,QAAQn1F,KAAM0hB,KAAM3Q,MAAM,EAElD,IAEF,IAAIo5F,SAAW,QACbC,MAAQ,SACRC,gBAAkB,wCAClBC,aAAe,qCACjB,SAASC,YAAY91E,OAAQ0kD,IAAKqxB,YAAa3lG,KAC7C,IAAI7G,KACJ,GAAI6F,MAAM6iB,QAAQyyD,KAEhBY,OAAOQ,KAAKpB,KAAK,SAAUh+E,EAAG0B,GACxB2tG,aAAeL,SAASlmF,KAAKwQ,QAE/B5vB,IAAI4vB,OAAQ53B,GAGZ0tG,YAAY91E,OAAS,KAAwB,WAAjB/T,UAAU7jB,IAAwB,MAALA,EAAY1B,EAAI,IAAM,IAAK0B,EAAG2tG,YAAa3lG,IAExG,SACK,GAAK2lG,aAA+B,WAAhB3wB,OAAOV,KAOhCt0E,IAAI4vB,OAAQ0kD,UALZ,IAAKn7E,QAAQm7E,IACXoxB,YAAY91E,OAAS,IAAMz2B,KAAO,IAAKm7E,IAAIn7E,MAAOwsG,YAAa3lG,IAMrE,CAIAk1E,OAAOjnB,MAAQ,SAAUzoD,EAAGmgG,aAC1B,IAAI/1E,OACFv2B,EAAI,GACJ2G,IAAM,SAAasJ,IAAKs8F,iBAEtB,IAAIv8F,MAAQ6U,WAAW0nF,iBAAmBA,kBAAoBA,gBAC9DvsG,EAAEA,EAAE9C,QAAUsvG,mBAAmBv8F,KAAO,IAAMu8F,mBAA4B,MAATx8F,MAAgB,GAAKA,MACxF,EACF,GAAS,MAAL7D,EACF,MAAO,GAIT,GAAIxG,MAAM6iB,QAAQrc,IAAMA,EAAEmuE,SAAWuB,OAAOkB,cAAc5wE,GAExD0vE,OAAOQ,KAAKlwE,GAAG,WACbxF,IAAIrI,KAAKwB,KAAMxB,KAAK0R,MACtB,SAIA,IAAKumB,UAAUpqB,EACbkgG,YAAY91E,OAAQpqB,EAAEoqB,QAAS+1E,YAAa3lG,KAKhD,OAAO3G,EAAE+7B,KAAK,IAChB,EACA8/C,OAAO95E,GAAG66E,OAAO,CACf/Q,UAAW,WACT,OAAOgQ,OAAOjnB,MAAMt2D,KAAKmuG,iBAC3B,EACAA,eAAgB,WACd,OAAOnuG,KAAKsH,KAAI,WAEd,IAAI85D,SAAWmc,OAAO0V,KAAKjzF,KAAM,YACjC,OAAOohE,SAAWmc,OAAO0B,UAAU7d,UAAYphE,IACjD,IAAGyH,QAAO,WACR,IAAIjE,KAAOxD,KAAKwD,KAGhB,OAAOxD,KAAKwB,OAAS+7E,OAAOv9E,MAAM8iC,GAAG,cAAgBgrE,aAAarmF,KAAKznB,KAAKuuE,YAAcs/B,gBAAgBpmF,KAAKjkB,QAAUxD,KAAK0oF,UAAYqN,eAAetuE,KAAKjkB,MAChK,IAAG8D,KAAI,SAAUs4E,GAAIrrE,MACnB,IAAIo0B,IAAM40C,OAAOv9E,MAAM2oC,MACvB,OAAW,MAAPA,IACK,KAELthC,MAAM6iB,QAAQye,KACT40C,OAAOj2E,IAAIqhC,KAAK,SAAUA,KAC/B,MAAO,CACLnnC,KAAM+S,KAAK/S,KACXkQ,MAAOi3B,IAAIphB,QAAQqmF,MAAO,QAE9B,IAEK,CACLpsG,KAAM+S,KAAK/S,KACXkQ,MAAOi3B,IAAIphB,QAAQqmF,MAAO,QAE9B,IAAGptG,KACL,IAEF,IAAI4tG,IAAM,OACRC,MAAQ,OACRC,WAAa,gBACbC,SAAW,6BAGXC,WAAa,iBACbC,UAAY,QAUZpG,WAAa,CAAC,EAMdqG,WAAa,CAAC,EAEdC,SAAW,KAAK1kG,OAAO,KAEvB2kG,aAAevwG,SAASqN,cAAc,KAIxC,SAASmjG,4BAA4BC,WAEnC,OAAO,SAAUC,mBAAoBhoF,MACD,iBAAvBgoF,qBACThoF,KAAOgoF,mBACPA,mBAAqB,KAEvB,IAAIC,SACFrwG,EAAI,EACJswG,UAAYF,mBAAmB31E,cAAcnH,MAAMk8D,gBAAkB,GACvE,GAAI5nE,WAAWQ,MAEb,KAAOioF,SAAWC,UAAUtwG,MAEN,MAAhBqwG,SAAS,IACXA,SAAWA,SAASxnG,MAAM,IAAM,KAC/BsnG,UAAUE,UAAYF,UAAUE,WAAa,IAAI/a,QAAQltE,QAIzD+nF,UAAUE,UAAYF,UAAUE,WAAa,IAAIltG,KAAKilB,KAI/D,CACF,CAGA,SAASmoF,8BAA8BJ,UAAWzkC,QAASq+B,gBAAiByG,OAC1E,IAAIC,UAAY,CAAC,EACfC,iBAAmBP,YAAcJ,WACnC,SAASY,QAAQN,UACf,IAAIrmB,SAYJ,OAXAymB,UAAUJ,WAAY,EACtBzxB,OAAOQ,KAAK+wB,UAAUE,WAAa,IAAI,SAAUrgB,EAAG4gB,oBAClD,IAAIC,oBAAsBD,mBAAmBllC,QAASq+B,gBAAiByG,OACvE,MAAmC,iBAAxBK,qBAAqCH,kBAAqBD,UAAUI,qBAIpEH,mBACA1mB,SAAW6mB,0BADf,GAHLnlC,QAAQ4kC,UAAUhb,QAAQub,qBAC1BF,QAAQE,sBACD,EAIX,IACO7mB,QACT,CACA,OAAO2mB,QAAQjlC,QAAQ4kC,UAAU,MAAQG,UAAU,MAAQE,QAAQ,IACrE,CAKA,SAASG,WAAW9rG,OAAQm5E,KAC1B,IAAInrE,IACF6sE,KACAkxB,YAAcnyB,OAAOoyB,aAAaD,aAAe,CAAC,EACpD,IAAK/9F,OAAOmrE,SACOx8E,IAAbw8E,IAAInrE,QACL+9F,YAAY/9F,KAAOhO,OAAS66E,OAASA,KAAO,CAAC,IAAI7sE,KAAOmrE,IAAInrE,MAMjE,OAHI6sE,MACFjB,OAAOe,QAAO,EAAM36E,OAAQ66E,MAEvB76E,MACT,CApEAirG,aAAarmB,KAAOl2B,SAASk2B,KA6N7BhL,OAAOe,OAAO,CAEZsxB,OAAQ,EAERC,aAAc,CAAC,EACfC,KAAM,CAAC,EACPH,aAAc,CACZI,IAAK19C,SAASk2B,KACd/kF,KAAM,MACNwsG,QA7Pe,4DA6PSvoF,KAAK4qC,SAAS49C,UACtCh0B,QAAQ,EACRi0B,aAAa,EACbx2E,OAAO,EACPH,YAAa,mDAab42E,QAAS,CACP,IAAKxB,SACL1xE,KAAM,aACN6gE,KAAM,YACN5mE,IAAK,4BACLk5E,KAAM,qCAERhjB,SAAU,CACRl2D,IAAK,UACL4mE,KAAM,SACNsS,KAAM,YAERC,eAAgB,CACdn5E,IAAK,cACL+F,KAAM,eACNmzE,KAAM,gBAIRE,WAAY,CAEV,SAAU7kG,OAEV,aAAa,EAEb,YAAa8vE,KAAKiY,MAElB,WAAYjW,OAAOyvB,UAMrB0C,YAAa,CACXK,KAAK,EACLvyB,SAAS,IAMb+yB,UAAW,SAAmB5sG,OAAQ6sG,UACpC,OAAOA,SAEPf,WAAWA,WAAW9rG,OAAQ45E,OAAOoyB,cAAea,UAEpDf,WAAWlyB,OAAOoyB,aAAchsG,OAClC,EACA8sG,cAAe5B,4BAA4BxG,YAC3CqI,cAAe7B,4BAA4BH,YAE3CiC,KAAM,SAAcZ,IAAK1lC,SAEA,WAAnBnmD,UAAU6rF,OACZ1lC,QAAU0lC,IACVA,SAAMzvG,GAKR,IAAIswG,UAEFC,SAEAC,sBACAC,gBAEAC,aAEAC,UAEAnf,UAEAof,YAEAvyG,EAEAwyG,SAEAzvG,EAAI67E,OAAOgzB,UAAU,CAAC,EApBxBlmC,QAAUA,SAAW,CAAC,GAsBpB+mC,gBAAkB1vG,EAAE87E,SAAW97E,EAE/B2vG,mBAAqB3vG,EAAE87E,UAAY4zB,gBAAgBpqG,UAAYoqG,gBAAgBp1B,QAAUuB,OAAO6zB,iBAAmB7zB,OAAOp6E,MAE1HokC,SAAWg2C,OAAOqS,WAClB0hB,iBAAmB/zB,OAAOmR,UAAU,eAEpC6iB,YAAc7vG,EAAE8vG,YAAc,CAAC,EAE/BC,eAAiB,CAAC,EAClBC,oBAAsB,CAAC,EAEvBC,SAAW,WAEXxC,MAAQ,CACN/lG,WAAY,EAEZwoG,kBAAmB,SAA2BjgG,KAC5C,IAAIsgB,MACJ,GAAI6/D,UAAW,CACb,IAAKif,gBAEH,IADAA,gBAAkB,CAAC,EACZ9+E,MAAQs8E,SAAS9/F,KAAKqiG,wBAC3BC,gBAAgB9+E,MAAM,GAAGmH,cAAgB,MAAQ23E,gBAAgB9+E,MAAM,GAAGmH,cAAgB,MAAQ,IAAInvB,OAAOgoB,MAAM,IAGvHA,MAAQ8+E,gBAAgBp/F,IAAIynB,cAAgB,IAC9C,CACA,OAAgB,MAATnH,MAAgB,KAAOA,MAAMwL,KAAK,KAC3C,EAEAo0E,sBAAuB,WACrB,OAAO/f,UAAYgf,sBAAwB,IAC7C,EAEAgB,iBAAkB,SAA0BtwG,KAAMkQ,OAKhD,OAJiB,MAAbogF,YACFtwF,KAAOkwG,oBAAoBlwG,KAAK43B,eAAiBs4E,oBAAoBlwG,KAAK43B,gBAAkB53B,KAC5FiwG,eAAejwG,MAAQkQ,OAElB1R,IACT,EAEA+xG,iBAAkB,SAA0BvuG,MAI1C,OAHiB,MAAbsuF,YACFpwF,EAAEswG,SAAWxuG,MAERxD,IACT,EAEAwxG,WAAY,SAAoBlqG,KAC9B,IAAI41E,KACJ,GAAI51E,IACF,GAAIwqF,UAEFqd,MAAMnf,OAAO1oF,IAAI6nG,MAAM8C,cAGvB,IAAK/0B,QAAQ51E,IACXiqG,YAAYr0B,MAAQ,CAACq0B,YAAYr0B,MAAO51E,IAAI41E,OAIlD,OAAOl9E,IACT,EAEAkyG,MAAO,SAAeC,YACpB,IAAIC,UAAYD,YAAcR,SAK9B,OAJIf,WACFA,UAAUsB,MAAME,WAElBhqE,KAAK,EAAGgqE,WACDpyG,IACT,GAkBJ,GAdAunC,SAASK,QAAQunE,OAKjBztG,EAAEquG,MAAQA,KAAOruG,EAAEquG,KAAO19C,SAASk2B,MAAQ,IAAIhhE,QAAQknF,UAAWp8C,SAAS49C,SAAW,MAGtFvuG,EAAE8B,KAAO6mE,QAAQmkB,QAAUnkB,QAAQ7mE,MAAQ9B,EAAE8sF,QAAU9sF,EAAE8B,KAGzD9B,EAAEutG,WAAavtG,EAAEstG,UAAY,KAAK51E,cAAcnH,MAAMk8D,gBAAkB,CAAC,IAGpD,MAAjBzsF,EAAE2wG,YAAqB,CACzBpB,UAAY5yG,SAASqN,cAAc,KAKnC,IACEulG,UAAU1oB,KAAO7mF,EAAEquG,IAInBkB,UAAU1oB,KAAO0oB,UAAU1oB,KAC3B7mF,EAAE2wG,YAAczD,aAAaqB,SAAW,KAAOrB,aAAa0D,MAASrB,UAAUhB,SAAW,KAAOgB,UAAUqB,IAC7G,CAAE,MAAOl0G,GAGPsD,EAAE2wG,aAAc,CAClB,CACF,CAWA,GARI3wG,EAAEwjB,MAAQxjB,EAAEwuG,aAAiC,iBAAXxuG,EAAEwjB,OACtCxjB,EAAEwjB,KAAOq4D,OAAOjnB,MAAM50D,EAAEwjB,KAAMxjB,EAAEssG,cAIlCkB,8BAA8B7G,WAAY3mG,EAAG2oE,QAAS8kC,OAGlDrd,UACF,OAAOqd,MAqET,IAAKxwG,KAhELuyG,YAAc3zB,OAAOp6E,OAASzB,EAAEu6E,SAGO,GAApBsB,OAAOqyB,UACxBryB,OAAOp6E,MAAMw1F,QAAQ,aAIvBj3F,EAAE8B,KAAO9B,EAAE8B,KAAKi3C,cAGhB/4C,EAAE6wG,YAAc/D,WAAW/mF,KAAK/lB,EAAE8B,MAKlCqtG,SAAWnvG,EAAEquG,IAAIxoF,QAAQ8mF,MAAO,IAG3B3sG,EAAE6wG,WAsBI7wG,EAAEwjB,MAAQxjB,EAAEwuG,aAAsF,KAAtExuG,EAAE63B,aAAe,IAAI7mB,QAAQ,uCAClEhR,EAAEwjB,KAAOxjB,EAAEwjB,KAAKqC,QAAQ6mF,IAAK,OArB7B+C,SAAWzvG,EAAEquG,IAAIvoG,MAAMqpG,SAASjyG,QAG5B8C,EAAEwjB,OAASxjB,EAAEwuG,aAAiC,iBAAXxuG,EAAEwjB,QACvC2rF,WAAa9D,OAAOtlF,KAAKopF,UAAY,IAAM,KAAOnvG,EAAEwjB,YAG7CxjB,EAAEwjB,OAIK,IAAZxjB,EAAEgwB,QACJm/E,SAAWA,SAAStpF,QAAQ+mF,WAAY,MACxC6C,UAAYpE,OAAOtlF,KAAKopF,UAAY,IAAM,KAAO,KAAO9zB,MAAM4C,OAASwxB,UAIzEzvG,EAAEquG,IAAMc,SAAWM,UAQjBzvG,EAAE8wG,aACAj1B,OAAOsyB,aAAagB,WACtB1B,MAAM2C,iBAAiB,oBAAqBv0B,OAAOsyB,aAAagB,WAE9DtzB,OAAOuyB,KAAKe,WACd1B,MAAM2C,iBAAiB,gBAAiBv0B,OAAOuyB,KAAKe,aAKpDnvG,EAAEwjB,MAAQxjB,EAAE6wG,aAAgC,IAAlB7wG,EAAE63B,aAAyB8wC,QAAQ9wC,cAC/D41E,MAAM2C,iBAAiB,eAAgBpwG,EAAE63B,aAI3C41E,MAAM2C,iBAAiB,SAAUpwG,EAAEutG,UAAU,IAAMvtG,EAAEyuG,QAAQzuG,EAAEutG,UAAU,IAAMvtG,EAAEyuG,QAAQzuG,EAAEutG,UAAU,KAA0B,MAAnBvtG,EAAEutG,UAAU,GAAa,KAAON,SAAW,WAAa,IAAMjtG,EAAEyuG,QAAQ,MAG1KzuG,EAAE+wG,QACVtD,MAAM2C,iBAAiBnzG,EAAG+C,EAAE+wG,QAAQ9zG,IAItC,GAAI+C,EAAEgxG,cAAgE,IAAjDhxG,EAAEgxG,WAAW/0G,KAAKyzG,gBAAiBjC,MAAOztG,IAAgBowF,WAE7E,OAAOqd,MAAM+C,QAef,GAXAP,SAAW,QAGXL,iBAAiBjpG,IAAI3G,EAAEmnG,UACvBsG,MAAM/mE,KAAK1mC,EAAEixG,SACbxD,MAAM1gB,KAAK/sF,EAAE0S,OAGbw8F,UAAY1B,8BAA8BR,WAAYhtG,EAAG2oE,QAAS8kC,OAK3D,CASL,GARAA,MAAM/lG,WAAa,EAGf8nG,aACFG,mBAAmB1Y,QAAQ,WAAY,CAACwW,MAAOztG,IAI7CowF,UACF,OAAOqd,MAILztG,EAAEg4B,OAASh4B,EAAEspG,QAAU,IACzBgG,aAAe9zG,OAAOuS,YAAW,WAC/B0/F,MAAM+C,MAAM,UACd,GAAGxwG,EAAEspG,UAEP,IACElZ,WAAY,EACZ8e,UAAUgC,KAAKnB,eAAgBrpE,KACjC,CAAE,MAAOhqC,GAEP,GAAI0zF,UACF,MAAM1zF,EAIRgqC,MAAM,EAAGhqC,EACX,CACF,MAhCEgqC,MAAM,EAAG,gBAmCX,SAASA,KAAK6pE,OAAQY,iBAAkBC,UAAWL,SACjD,IAAIM,UACFJ,QACAv+F,MACA4+F,SACAC,SACAd,WAAaU,iBAGX/gB,YAGJA,WAAY,EAGRkf,cACF9zG,OAAOwS,aAAashG,cAKtBJ,eAAYtwG,EAGZwwG,sBAAwB2B,SAAW,GAGnCtD,MAAM/lG,WAAa6oG,OAAS,EAAI,EAAI,EAGpCc,UAAYd,QAAU,KAAOA,OAAS,KAAkB,MAAXA,OAGzCa,YACFE,SAxhBR,SAA6BtxG,EAAGytG,MAAO2D,WASrC,IARA,IAAII,GACF1vG,KACA2vG,cACAC,cACAhmB,SAAW1rF,EAAE0rF,SACb6hB,UAAYvtG,EAAEutG,UAGQ,MAAjBA,UAAU,IACfA,UAAU3qB,aACChkF,IAAP4yG,KACFA,GAAKxxG,EAAEswG,UAAY7C,MAAMyC,kBAAkB,iBAK/C,GAAIsB,GACF,IAAK1vG,QAAQ4pF,SACX,GAAIA,SAAS5pF,OAAS4pF,SAAS5pF,MAAMikB,KAAKyrF,IAAK,CAC7CjE,UAAUhb,QAAQzwF,MAClB,KACF,CAKJ,GAAIyrG,UAAU,KAAM6D,UAClBK,cAAgBlE,UAAU,OACrB,CAEL,IAAKzrG,QAAQsvG,UAAW,CACtB,IAAK7D,UAAU,IAAMvtG,EAAE4uG,WAAW9sG,KAAO,IAAMyrG,UAAU,IAAK,CAC5DkE,cAAgB3vG,KAChB,KACF,CACK4vG,gBACHA,cAAgB5vG,KAEpB,CAGA2vG,cAAgBA,eAAiBC,aACnC,CAKA,GAAID,cAIF,OAHIA,gBAAkBlE,UAAU,IAC9BA,UAAUhb,QAAQkf,eAEbL,UAAUK,cAErB,CAkemBE,CAAoB3xG,EAAGytG,MAAO2D,aAItCC,WAAax1B,OAAO2B,QAAQ,SAAUx9E,EAAEutG,YAAc,GAAK1xB,OAAO2B,QAAQ,OAAQx9E,EAAEutG,WAAa,IACpGvtG,EAAE4uG,WAAW,eAAiB,WAAa,GAI7C0C,SAteN,SAAqBtxG,EAAGsxG,SAAU7D,MAAO4D,WACvC,IAAIO,MACFC,QACAC,KACAnf,IACAhH,KACAijB,WAAa,CAAC,EAEdrB,UAAYvtG,EAAEutG,UAAUznG,QAG1B,GAAIynG,UAAU,GACZ,IAAKuE,QAAQ9xG,EAAE4uG,WACbA,WAAWkD,KAAKp6E,eAAiB13B,EAAE4uG,WAAWkD,MAMlD,IAHAD,QAAUtE,UAAU3qB,QAGbivB,SAWL,GAVI7xG,EAAE2uG,eAAekD,WACnBpE,MAAMztG,EAAE2uG,eAAekD,UAAYP,WAIhC3lB,MAAQ0lB,WAAarxG,EAAE+xG,aAC1BT,SAAWtxG,EAAE+xG,WAAWT,SAAUtxG,EAAEstG,WAEtC3hB,KAAOkmB,QACPA,QAAUtE,UAAU3qB,QAGlB,GAAgB,MAAZivB,QACFA,QAAUlmB,UAGL,GAAa,MAATA,MAAgBA,OAASkmB,QAAS,CAK3C,KAHAC,KAAOlD,WAAWjjB,KAAO,IAAMkmB,UAAYjD,WAAW,KAAOiD,UAI3D,IAAKD,SAAShD,WAGZ,IADAjc,IAAMif,MAAMn4E,MAAM,MACV,KAAOo4E,UAEbC,KAAOlD,WAAWjjB,KAAO,IAAMgH,IAAI,KAAOic,WAAW,KAAOjc,IAAI,KACtD,EAEK,IAATmf,KACFA,KAAOlD,WAAWgD,QAGa,IAAtBhD,WAAWgD,SACpBC,QAAUlf,IAAI,GACd4a,UAAUhb,QAAQI,IAAI,KAExB,KACF,CAMN,IAAa,IAATmf,KAEF,GAAIA,MAAQ9xG,EAAU,OACpBsxG,SAAWQ,KAAKR,eAEhB,IACEA,SAAWQ,KAAKR,SAClB,CAAE,MAAO50G,GACP,MAAO,CACL2xF,MAAO,cACP37E,MAAOo/F,KAAOp1G,EAAI,sBAAwBivF,KAAO,OAASkmB,QAE9D,CAGN,CAGJ,MAAO,CACLxjB,MAAO,UACP7qE,KAAM8tF,SAEV,CA+YiBU,CAAYhyG,EAAGsxG,SAAU7D,MAAO4D,WAGvCA,WAEErxG,EAAE8wG,cACJS,SAAW9D,MAAMyC,kBAAkB,oBAEjCr0B,OAAOsyB,aAAagB,UAAYoC,WAElCA,SAAW9D,MAAMyC,kBAAkB,WAEjCr0B,OAAOuyB,KAAKe,UAAYoC,WAKb,MAAXhB,QAA6B,SAAXvwG,EAAE8B,KACtB2uG,WAAa,YAGO,MAAXF,OACTE,WAAa,eAIbA,WAAaa,SAASjjB,MACtB4iB,QAAUK,SAAS9tF,KAEnB6tF,YADA3+F,MAAQ4+F,SAAS5+F,UAKnBA,MAAQ+9F,YACJF,QAAWE,aACbA,WAAa,QACTF,OAAS,IACXA,OAAS,KAMf9C,MAAM8C,OAASA,OACf9C,MAAMgD,YAAcU,kBAAoBV,YAAc,GAGlDY,UACFxrE,SAASupD,YAAYsgB,gBAAiB,CAACuB,QAASR,WAAYhD,QAE5D5nE,SAASypD,WAAWogB,gBAAiB,CAACjC,MAAOgD,WAAY/9F,QAI3D+6F,MAAMqC,WAAWD,aACjBA,iBAAcjxG,EACV4wG,aACFG,mBAAmB1Y,QAAQoa,UAAY,cAAgB,YAAa,CAAC5D,MAAOztG,EAAGqxG,UAAYJ,QAAUv+F,QAIvGk9F,iBAAiB5hB,SAAS0hB,gBAAiB,CAACjC,MAAOgD,aAC/CjB,cACFG,mBAAmB1Y,QAAQ,eAAgB,CAACwW,MAAOztG,MAG3C67E,OAAOqyB,QACbryB,OAAOp6E,MAAMw1F,QAAQ,aAG3B,CACA,OAAOwW,KACT,EACAwE,QAAS,SAAiB5D,IAAK7qF,KAAMxkB,UACnC,OAAO68E,OAAO/8E,IAAIuvG,IAAK7qF,KAAMxkB,SAAU,OACzC,EACAkzG,UAAW,SAAmB7D,IAAKrvG,UACjC,OAAO68E,OAAO/8E,IAAIuvG,SAAKzvG,EAAWI,SAAU,SAC9C,IAEF68E,OAAOQ,KAAK,CAAC,MAAO,SAAS,SAAU6B,GAAI4O,QACzCjR,OAAOiR,QAAU,SAAUuhB,IAAK7qF,KAAMxkB,SAAU8C,MAS9C,OAPI+iB,WAAWrB,QACb1hB,KAAOA,MAAQ9C,SACfA,SAAWwkB,KACXA,UAAO5kB,GAIFi9E,OAAOozB,KAAKpzB,OAAOe,OAAO,CAC/ByxB,IACAvsG,KAAMgrF,OACNwgB,SAAUxrG,KACV0hB,KACAytF,QAASjyG,UACR68E,OAAOkB,cAAcsxB,MAAQA,KAClC,CACF,IACAxyB,OAAOkzB,eAAc,SAAU/uG,GAC7B,IAAI/C,EACJ,IAAKA,KAAK+C,EAAE+wG,QACc,iBAApB9zG,EAAEy6B,gBACJ13B,EAAE63B,YAAc73B,EAAE+wG,QAAQ9zG,IAAM,GAGtC,IACA4+E,OAAOwgB,SAAW,SAAUgS,IAAK1lC,QAAS1xC,KACxC,OAAO4kD,OAAOozB,KAAK,CACjBZ,IAEAvsG,KAAM,MACNwrG,SAAU,SACVt9E,OAAO,EACPgI,OAAO,EACPuiD,QAAQ,EAIRq0B,WAAY,CACV,cAAe,WAAuB,GAExCmD,WAAY,SAAoBT,UAC9Bz1B,OAAOwB,WAAWi0B,SAAU3oC,QAAS1xC,IACvC,GAEJ,EACA4kD,OAAO95E,GAAG66E,OAAO,CACfu1B,QAAS,SAAiB/V,MACxB,IAAItG,KAmBJ,OAlBIx3F,KAAK,KACHumB,WAAWu3E,QACbA,KAAOA,KAAKngG,KAAKqC,KAAK,KAIxBw3F,KAAOja,OAAOugB,KAAM99F,KAAK,GAAGyU,eAAekQ,GAAG,GAAG+zB,OAAM,GACnD14C,KAAK,GAAG+E,YACVyyF,KAAKmH,aAAa3+F,KAAK,IAEzBw3F,KAAKlwF,KAAI,WAEP,IADA,IAAIiN,KAAOvU,KACJuU,KAAK0kB,mBACV1kB,KAAOA,KAAK0kB,kBAEd,OAAO1kB,IACT,IAAGkqF,OAAOz+F,OAELA,IACT,EACA8zG,UAAW,SAAmBhW,MAC5B,OAAIv3E,WAAWu3E,MACN99F,KAAK+9E,MAAK,SAAUp/E,GACzB4+E,OAAOv9E,MAAM8zG,UAAUhW,KAAKngG,KAAKqC,KAAMrB,GACzC,IAEKqB,KAAK+9E,MAAK,WACf,IAAI3gF,KAAOmgF,OAAOv9E,MAChBotF,SAAWhwF,KAAKgwF,WACdA,SAASxuF,OACXwuF,SAASymB,QAAQ/V,MAEjB1gG,KAAKqhG,OAAOX,KAEhB,GACF,EACAtG,KAAM,SAAcsG,MAClB,IAAIiW,eAAiBxtF,WAAWu3E,MAChC,OAAO99F,KAAK+9E,MAAK,SAAUp/E,GACzB4+E,OAAOv9E,MAAM6zG,QAAQE,eAAiBjW,KAAKngG,KAAKqC,KAAMrB,GAAKm/F,KAC7D,GACF,EACAkW,OAAQ,SAAgBjrG,UAItB,OAHA/I,KAAKwU,OAAOzL,UAAU8+E,IAAI,QAAQ9J,MAAK,WACrCR,OAAOv9E,MAAM8+F,YAAY9+F,KAAKqjF,WAChC,IACOrjF,IACT,IAEFu9E,OAAOuI,KAAKxE,QAAQmmB,OAAS,SAAUlzF,MACrC,OAAQgpE,OAAOuI,KAAKxE,QAAQ2yB,QAAQ1/F,KACtC,EACAgpE,OAAOuI,KAAKxE,QAAQ2yB,QAAU,SAAU1/F,MACtC,SAAUA,KAAK0sF,aAAe1sF,KAAKytF,cAAgBztF,KAAKsvF,iBAAiBjlG,OAC3E,EACA2+E,OAAOoyB,aAAauE,IAAM,WACxB,IACE,OAAO,IAAIh3G,OAAOi3G,cACpB,CAAE,MAAO/1G,GAAI,CACf,EACA,IAAIg2G,iBAAmB,CAEnB,EAAG,IAGH,KAAM,KAERC,aAAe92B,OAAOoyB,aAAauE,MACrCx3B,QAAQ43B,OAASD,cAAgB,oBAAqBA,aACtD33B,QAAQi0B,KAAO0D,eAAiBA,aAChC92B,OAAOmzB,eAAc,SAAUrmC,SAC7B,IAAIkqC,UAAWC,cAGf,GAAI93B,QAAQ43B,MAAQD,eAAiBhqC,QAAQgoC,YAC3C,MAAO,CACLO,KAAM,SAAcH,QAAS5J,UAC3B,IAAIlqG,EACFu1G,IAAM7pC,QAAQ6pC,MAIhB,GAHAA,IAAIO,KAAKpqC,QAAQ7mE,KAAM6mE,QAAQ0lC,IAAK1lC,QAAQ3wC,MAAO2wC,QAAQqqC,SAAUrqC,QAAQ8e,UAGzE9e,QAAQsqC,UACV,IAAKh2G,KAAK0rE,QAAQsqC,UAChBT,IAAIv1G,GAAK0rE,QAAQsqC,UAAUh2G,GAmB/B,IAAKA,KAdD0rE,QAAQ2nC,UAAYkC,IAAInC,kBAC1BmC,IAAInC,iBAAiB1nC,QAAQ2nC,UAQ1B3nC,QAAQgoC,aAAgBI,QAAQ,sBACnCA,QAAQ,oBAAsB,kBAItBA,QACRyB,IAAIpC,iBAAiBnzG,EAAG8zG,QAAQ9zG,IAIlC41G,UAAY,SAAkB/wG,MAC5B,OAAO,WACD+wG,YACFA,UAAYC,cAAgBN,IAAIU,OAASV,IAAIW,QAAUX,IAAIY,QAAUZ,IAAIa,UAAYb,IAAIc,mBAAqB,KACjG,UAATxxG,KACF0wG,IAAIhC,QACc,UAAT1uG,KAIiB,iBAAf0wG,IAAIjC,OACbpJ,SAAS,EAAG,SAEZA,SAEAqL,IAAIjC,OAAQiC,IAAI/B,YAGlBtJ,SAASuL,iBAAiBF,IAAIjC,SAAWiC,IAAIjC,OAAQiC,IAAI/B,WAIxB,UAAhC+B,IAAIe,cAAgB,SAAkD,iBAArBf,IAAIgB,aAA4B,CAChFC,OAAQjB,IAAIlB,UACV,CACF/1E,KAAMi3E,IAAIgB,cACThB,IAAIrC,yBAGb,CACF,EAGAqC,IAAIU,OAASL,YACbC,cAAgBN,IAAIW,QAAUX,IAAIa,UAAYR,UAAU,cAKpCj0G,IAAhB4zG,IAAIY,QACNZ,IAAIY,QAAUN,cAEdN,IAAIc,mBAAqB,WAEA,IAAnBd,IAAI9qG,YAKNlM,OAAOuS,YAAW,WACZ8kG,WACFC,eAEJ,GAEJ,EAIFD,UAAYA,UAAU,SACtB,IAEEL,IAAItB,KAAKvoC,QAAQkoC,YAAcloC,QAAQnlD,MAAQ,KACjD,CAAE,MAAO9mB,GAEP,GAAIm2G,UACF,MAAMn2G,CAEV,CACF,EACA8zG,MAAO,WACDqC,WACFA,WAEJ,EAGN,IAGAh3B,OAAOkzB,eAAc,SAAU/uG,GACzBA,EAAE2wG,cACJ3wG,EAAE0rF,SAASjQ,QAAS,EAExB,IAGAI,OAAOgzB,UAAU,CACfJ,QAAS,CACPhzB,OAAQ,6FAEViQ,SAAU,CACRjQ,OAAQ,2BAEVmzB,WAAY,CACV,cAAe,SAAoBrzE,MAEjC,OADAsgD,OAAOwB,WAAW9hD,MACXA,IACT,KAKJsgD,OAAOkzB,cAAc,UAAU,SAAU/uG,QACvBpB,IAAZoB,EAAEgwB,QACJhwB,EAAEgwB,OAAQ,GAERhwB,EAAE2wG,cACJ3wG,EAAE8B,KAAO,MAEb,IAGA+5E,OAAOmzB,cAAc,UAAU,SAAUhvG,GAGrC,IAAIy7E,OAAQi4B,WADd,GAAI1zG,EAAE2wG,aAAe3wG,EAAE2zG,YAErB,MAAO,CACLzC,KAAM,SAAcjkB,EAAGka,UACrB1rB,OAASI,OAAO,YAAYyI,KAAKtkF,EAAE2zG,aAAe,CAAC,GAAGpiB,KAAK,CACzDqiB,QAAS5zG,EAAE6zG,cACXz4B,IAAKp7E,EAAEquG,MACNjT,GAAG,aAAcsY,WAAa,SAAkBI,KACjDr4B,OAAO70E,SACP8sG,WAAa,KACTI,KACF3M,SAAsB,UAAb2M,IAAIhyG,KAAmB,IAAM,IAAKgyG,IAAIhyG,KAEnD,GAGAnF,SAASgN,KAAKO,YAAYuxE,OAAO,GACnC,EACA+0B,MAAO,WACDkD,YACFA,YAEJ,EAGN,IACA,IAuFMhpC,KAvFFqpC,aAAe,GACjBC,OAAS,oBAGXn4B,OAAOgzB,UAAU,CACfoF,MAAO,WACPC,cAAe,WACb,IAAIl1G,SAAW+0G,aAAatwF,OAASo4D,OAAOmB,QAAU,IAAM3B,MAAM4C,OAElE,OADA3/E,KAAKU,WAAY,EACVA,QACT,IAIF68E,OAAOkzB,cAAc,cAAc,SAAU/uG,EAAGm0G,iBAAkB1G,OAChE,IAAI2G,aACFC,YACAC,kBACAC,UAAuB,IAAZv0G,EAAEi0G,QAAoBD,OAAOjuF,KAAK/lB,EAAEquG,KAAO,MAA0B,iBAAXruG,EAAEwjB,MAA4F,KAAtExjB,EAAE63B,aAAe,IAAI7mB,QAAQ,sCAA8CgjG,OAAOjuF,KAAK/lB,EAAEwjB,OAAS,QAGjM,GAAI+wF,UAA+B,UAAnBv0G,EAAEutG,UAAU,GAwD1B,OAtDA6G,aAAep0G,EAAEk0G,cAAgBrvF,WAAW7kB,EAAEk0G,eAAiBl0G,EAAEk0G,gBAAkBl0G,EAAEk0G,cAGjFK,SACFv0G,EAAEu0G,UAAYv0G,EAAEu0G,UAAU1uF,QAAQmuF,OAAQ,KAAOI,eAC5B,IAAZp0G,EAAEi0G,QACXj0G,EAAEquG,MAAQhD,OAAOtlF,KAAK/lB,EAAEquG,KAAO,IAAM,KAAOruG,EAAEi0G,MAAQ,IAAMG,cAI9Dp0G,EAAE4uG,WAAW,eAAiB,WAI5B,OAHK0F,mBACHz4B,OAAOnpE,MAAM0hG,aAAe,mBAEvBE,kBAAkB,EAC3B,EAGAt0G,EAAEutG,UAAU,GAAK,OAGjB8G,YAAc74G,OAAO44G,cACrB54G,OAAO44G,cAAgB,WACrBE,kBAAoB5qF,SACtB,EAGA+jF,MAAMnf,QAAO,gBAES1vF,IAAhBy1G,YACFx4B,OAAOrgF,QAAQ8uG,WAAW8J,cAI1B54G,OAAO44G,cAAgBC,YAIrBr0G,EAAEo0G,gBAEJp0G,EAAEk0G,cAAgBC,iBAAiBD,cAGnCH,aAAa3zG,KAAKg0G,eAIhBE,mBAAqBzvF,WAAWwvF,cAClCA,YAAYC,kBAAkB,IAEhCA,kBAAoBD,iBAAcz1G,CACpC,IAGO,QAEX,IAOAo8E,QAAQ7jD,qBACFuzC,KAAO/tE,SAASu6B,eAAeC,mBAAmB,IAAIuzC,MACrDpzC,UAAY,6BACiB,IAA3BozC,KAAKiX,WAAWzkF,QAOzB2+E,OAAOyP,UAAY,SAAU9nE,KAAMs4D,QAAS04B,aAC1C,MAAoB,iBAAThxF,KACF,IAEc,kBAAZs4D,UACT04B,YAAc14B,QACdA,SAAU,GAGPA,UAGCd,QAAQ7jD,qBAMV6wD,MALAlM,QAAUn/E,SAASu6B,eAAeC,mBAAmB,KAKtCntB,cAAc,SACxB68E,KAAOlqF,SAASg0D,SAASk2B,KAC9B/K,QAAQnyE,KAAKO,YAAY89E,OAEzBlM,QAAUn/E,UAIdg5F,SAAW6e,aAAe,IAD1BC,OAASvpB,WAAWn+E,KAAKyW,OAKhB,CAACs4D,QAAQ9xE,cAAcyqG,OAAO,MAEvCA,OAAS/e,cAAc,CAAClyE,MAAOs4D,QAAS6Z,SACpCA,SAAWA,QAAQz4F,QACrB2+E,OAAO8Z,SAAS/uF,SAEXi1E,OAAOM,MAAM,GAAIs4B,OAAO9yB,cA5B/B,IAAIqG,KAAMysB,OAAQ9e,OA6BpB,EAKA9Z,OAAO95E,GAAGo3F,KAAO,SAAUkV,IAAKnjE,OAAQlsC,UACtC,IAAIqI,SACFvF,KACAwvG,SACA51G,KAAO4C,KACPm4F,IAAM4X,IAAIr9F,QAAQ,KA8CpB,OA7CIylF,KAAO,IACTpvF,SAAW8iG,iBAAiBkE,IAAIvoG,MAAM2wF,MACtC4X,IAAMA,IAAIvoG,MAAM,EAAG2wF,MAIjB5xE,WAAWqmB,SAEblsC,SAAWksC,OACXA,YAAStsC,GAGAssC,QAAgC,WAAtB1oB,UAAU0oB,UAC7BppC,KAAO,QAILpG,KAAKwB,OAAS,GAChB2+E,OAAOozB,KAAK,CACVZ,IAIAvsG,KAAMA,MAAQ,MACdwrG,SAAU,OACV9pF,KAAM0nB,SACLxE,MAAK,SAAU8sE,cAEhBlC,SAAW5nF,UACXhuB,KAAK0gG,KAAK/0F,SAGVw0E,OAAO,SAASkhB,OAAOlhB,OAAOyP,UAAUkoB,eAAehgF,KAAKnsB,UAE5DmsG,aAKF,IAAGllB,OAAOtvF,UAAY,SAAUyuG,MAAO8C,QACrC70G,KAAK2gF,MAAK,WACRr9E,SAAS+wB,MAAMzxB,KAAMgzG,UAAY,CAAC7D,MAAM+F,aAAcjD,OAAQ9C,OAChE,GACF,GAEKnvG,IACT,EACAu9E,OAAOuI,KAAKxE,QAAQ80B,SAAW,SAAU7hG,MACvC,OAAOgpE,OAAOW,KAAKX,OAAO8sB,QAAQ,SAAU5mG,IAC1C,OAAO8Q,OAAS9Q,GAAG8Q,IACrB,IAAG3V,MACL,EACA2+E,OAAOvzD,OAAS,CACdqsF,UAAW,SAAmB9hG,KAAM81D,QAAS1rE,GAC3C,IAAI23G,YACFC,QACAC,UACAC,OACAC,UACAC,WAEA1pD,SAAWswB,OAAOwX,IAAIxgF,KAAM,YAC5BqiG,QAAUr5B,OAAOhpE,MACjBmf,MAAQ,CAAC,EAGM,WAAbu5B,WACF14C,KAAKm4D,MAAMzf,SAAW,YAExBypD,UAAYE,QAAQ5sF,SACpBwsF,UAAYj5B,OAAOwX,IAAIxgF,KAAM,OAC7BoiG,WAAap5B,OAAOwX,IAAIxgF,KAAM,SACI,aAAb04C,UAAwC,UAAbA,YAA0BupD,UAAYG,YAAYjkG,QAAQ,SAAW,GAMnH+jG,QADAH,YAAcM,QAAQ3pD,YACDm4B,IACrBmxB,QAAUD,YAAYvQ,OAEtB0Q,OAASjyD,WAAWgyD,YAAc,EAClCD,QAAU/xD,WAAWmyD,aAAe,GAElCpwF,WAAW8jD,WAEbA,QAAUA,QAAQ1sE,KAAK4W,KAAM5V,EAAG4+E,OAAOe,OAAO,CAAC,EAAGo4B,aAEjC,MAAfrsC,QAAQ+a,MACV1xD,MAAM0xD,IAAM/a,QAAQ+a,IAAMsxB,UAAUtxB,IAAMqxB,QAExB,MAAhBpsC,QAAQ07B,OACVryE,MAAMqyE,KAAO17B,QAAQ07B,KAAO2Q,UAAU3Q,KAAOwQ,SAE3C,UAAWlsC,QACbA,QAAQwsC,MAAMl5G,KAAK4W,KAAMmf,OAEzBkjF,QAAQ7hB,IAAIrhE,MAEhB,GAEF6pD,OAAO95E,GAAG66E,OAAO,CAEft0D,OAAQ,SAAgBqgD,SAEtB,GAAIj/C,UAAUxsB,OACZ,YAAmB0B,IAAZ+pE,QAAwBrqE,KAAOA,KAAK+9E,MAAK,SAAUp/E,GACxD4+E,OAAOvzD,OAAOqsF,UAAUr2G,KAAMqqE,QAAS1rE,EACzC,IAEF,IAAIm4G,KACFC,IACAxiG,KAAOvU,KAAK,GACd,OAAKuU,KAQAA,KAAKsvF,iBAAiBjlG,QAQ3Bk4G,KAAOviG,KAAKsxF,wBACZkR,IAAMxiG,KAAKE,cAAc0wE,YAClB,CACLC,IAAK0xB,KAAK1xB,IAAM2xB,IAAIC,YACpBjR,KAAM+Q,KAAK/Q,KAAOgR,IAAIE,cAXf,CACL7xB,IAAK,EACL2gB,KAAM,QAXV,CAsBF,EAGA94C,SAAU,WACR,GAAKjtD,KAAK,GAAV,CAGA,IAAIk3G,aACFltF,OACA2O,IACApkB,KAAOvU,KAAK,GACZm3G,aAAe,CACb/xB,IAAK,EACL2gB,KAAM,GAIV,GAAqC,UAAjCxoB,OAAOwX,IAAIxgF,KAAM,YAEnByV,OAASzV,KAAKsxF,4BACT,CAOL,IANA77E,OAAShqB,KAAKgqB,SAId2O,IAAMpkB,KAAKE,cACXyiG,aAAe3iG,KAAK2iG,cAAgBv+E,IAAII,gBACjCm+E,eAAiBA,eAAiBv+E,IAAIyzC,MAAQ8qC,eAAiBv+E,IAAII,kBAA6D,WAAzCwkD,OAAOwX,IAAImiB,aAAc,aACrHA,aAAeA,aAAanyG,WAE1BmyG,cAAgBA,eAAiB3iG,MAAkC,IAA1B2iG,aAAalwG,YAExDmwG,aAAe55B,OAAO25B,cAAcltF,UACvBo7D,KAAO7H,OAAOwX,IAAImiB,aAAc,kBAAkB,GAC/DC,aAAapR,MAAQxoB,OAAOwX,IAAImiB,aAAc,mBAAmB,GAErE,CAGA,MAAO,CACL9xB,IAAKp7D,OAAOo7D,IAAM+xB,aAAa/xB,IAAM7H,OAAOwX,IAAIxgF,KAAM,aAAa,GACnEwxF,KAAM/7E,OAAO+7E,KAAOoR,aAAapR,KAAOxoB,OAAOwX,IAAIxgF,KAAM,cAAc,GAnCzE,CAqCF,EAWA2iG,aAAc,WACZ,OAAOl3G,KAAKsH,KAAI,WAEd,IADA,IAAI4vG,aAAel3G,KAAKk3G,aACjBA,cAAyD,WAAzC35B,OAAOwX,IAAImiB,aAAc,aAC9CA,aAAeA,aAAaA,aAE9B,OAAOA,cAAgBn+E,eACzB,GACF,IAIFwkD,OAAOQ,KAAK,CACVgpB,WAAY,cACZD,UAAW,gBACV,SAAUtY,OAAQyE,MACnB,IAAI7N,IAAM,gBAAkB6N,KAC5B1V,OAAO95E,GAAG+qF,QAAU,SAAU7lD,KAC5B,OAAOupD,OAAOlyF,MAAM,SAAUuU,KAAMi6E,OAAQ7lD,KAE1C,IAAIouE,IAMJ,GALIn6B,SAASroE,MACXwiG,IAAMxiG,KACqB,IAAlBA,KAAKvN,WACd+vG,IAAMxiG,KAAK4wE,kBAED7kF,IAARqoC,IACF,OAAOouE,IAAMA,IAAI9jB,MAAQ1+E,KAAKi6E,QAE5BuoB,IACFA,IAAIK,SAAUhyB,IAAY2xB,IAAIE,YAAVtuE,IAAuBy8C,IAAMz8C,IAAMouE,IAAIC,aAE3DziG,KAAKi6E,QAAU7lD,GAEnB,GAAG6lD,OAAQ7lD,IAAKvd,UAAUxsB,OAC5B,CACF,IAQA2+E,OAAOQ,KAAK,CAAC,MAAO,SAAS,SAAU6B,GAAIqT,MACzC1V,OAAOymB,SAAS/Q,MAAQkN,aAAazjB,QAAQ6kB,eAAe,SAAUhtF,KAAMqxC,UAC1E,GAAIA,SAIF,OAHAA,SAAWi6C,OAAOtrF,KAAM0+E,MAGjBoM,UAAU53E,KAAKm+B,UAAY23B,OAAOhpE,MAAM04C,WAAWgmC,MAAQ,KAAOrtC,QAE7E,GACF,IAGA23B,OAAOQ,KAAK,CACVs5B,OAAQ,SACRC,MAAO,UACN,SAAU91G,KAAMgC,MACjB+5E,OAAOQ,KAAK,CACVkoB,QAAS,QAAUzkG,KACnB0sF,QAAS1qF,KACT,GAAI,QAAUhC,OACb,SAAU+1G,aAAc1xC,UAEzB0X,OAAO95E,GAAGoiE,UAAY,SAAUmgC,OAAQt0F,OACtC,IAAIygF,UAAY/mE,UAAUxsB,SAAW24G,cAAkC,kBAAXvR,QAC1D1C,MAAQiU,gBAA4B,IAAXvR,SAA6B,IAAVt0F,MAAiB,SAAW,UAC1E,OAAOwgF,OAAOlyF,MAAM,SAAUuU,KAAM/Q,KAAMkO,OACxC,IAAIinB,IACJ,OAAIikD,SAASroE,MAE0B,IAA9BsxD,SAASnzD,QAAQ,SAAiB6B,KAAK,QAAU/S,MAAQ+S,KAAKlW,SAAS06B,gBAAgB,SAAWv3B,MAIrF,IAAlB+S,KAAKvN,UACP2xB,IAAMpkB,KAAKwkB,gBAIJtsB,KAAKsoB,IAAIxgB,KAAK63D,KAAK,SAAW5qE,MAAOm3B,IAAI,SAAWn3B,MAAO+S,KAAK63D,KAAK,SAAW5qE,MAAOm3B,IAAI,SAAWn3B,MAAOm3B,IAAI,SAAWn3B,aAEpHlB,IAAVoR,MAEP6rE,OAAOwX,IAAIxgF,KAAM/Q,KAAM8/F,OAEvB/lB,OAAO7Q,MAAMn4D,KAAM/Q,KAAMkO,MAAO4xF,MAClC,GAAG9/F,KAAM2uF,UAAY6T,YAAS1lG,EAAW6xF,UAC3C,CACF,GACF,IACA5U,OAAOQ,KAAK,CAAC,YAAa,WAAY,eAAgB,YAAa,cAAe,aAAa,SAAU6B,GAAIp8E,MAC3G+5E,OAAO95E,GAAGD,MAAQ,SAAUC,IAC1B,OAAOzD,KAAK88F,GAAGt5F,KAAMC,GACvB,CACF,IACA85E,OAAO95E,GAAG66E,OAAO,CACfz8E,KAAM,SAAcsqB,MAAOjH,KAAMzhB,IAC/B,OAAOzD,KAAK88F,GAAG3wE,MAAO,KAAMjH,KAAMzhB,GACpC,EACA+zG,OAAQ,SAAgBrrF,MAAO1oB,IAC7B,OAAOzD,KAAKm4F,IAAIhsE,MAAO,KAAM1oB,GAC/B,EACAg0G,SAAU,SAAkB1uG,SAAUojB,MAAOjH,KAAMzhB,IACjD,OAAOzD,KAAK88F,GAAG3wE,MAAOpjB,SAAUmc,KAAMzhB,GACxC,EACAi0G,WAAY,SAAoB3uG,SAAUojB,MAAO1oB,IAE/C,OAA4B,IAArB2nB,UAAUxsB,OAAeoB,KAAKm4F,IAAIpvF,SAAU,MAAQ/I,KAAKm4F,IAAIhsE,MAAOpjB,UAAY,KAAMtF,GAC/F,EACAk0G,MAAO,SAAeC,OAAQC,OAC5B,OAAO73G,KAAK88F,GAAG,aAAc8a,QAAQ9a,GAAG,aAAc+a,OAASD,OACjE,IAEFr6B,OAAOQ,KAAK,wLAAoM5iD,MAAM,MAAM,SAAUykD,GAAIp+E,MAExO+7E,OAAO95E,GAAGjC,MAAQ,SAAU0jB,KAAMzhB,IAChC,OAAO2nB,UAAUxsB,OAAS,EAAIoB,KAAK88F,GAAGt7F,KAAM,KAAM0jB,KAAMzhB,IAAMzD,KAAK24F,QAAQn3F,KAC7E,CACF,IAMA,IAAIs2G,MAAQ,sDAMZv6B,OAAOw6B,MAAQ,SAAUt0G,GAAI+5E,SAC3B,IAAI6W,IAAK7iE,KAAMumF,MASf,GARuB,iBAAZv6B,UACT6W,IAAM5wF,GAAG+5E,SACTA,QAAU/5E,GACVA,GAAK4wF,KAKF9tE,WAAW9iB,IAYhB,OAPA+tB,KAAO4qD,OAAOz+E,KAAKytB,UAAW,GAC9B2sF,MAAQ,WACN,OAAOt0G,GAAGguB,MAAM+rD,SAAWx9E,KAAMwxB,KAAKvnB,OAAOmyE,OAAOz+E,KAAKytB,YAC3D,EAGA2sF,MAAMp4B,KAAOl8E,GAAGk8E,KAAOl8E,GAAGk8E,MAAQpC,OAAOoC,OAClCo4B,KACT,EACAx6B,OAAOy6B,UAAY,SAAUC,MACvBA,KACF16B,OAAOwU,YAEPxU,OAAO0P,OAAM,EAEjB,EACA1P,OAAOrzD,QAAU7iB,MAAM6iB,QACvBqzD,OAAO26B,UAAY38B,KAAKiY,MACxBjW,OAAOhP,SAAWA,SAClBgP,OAAOh3D,WAAaA,WACpBg3D,OAAOX,SAAWA,SAClBW,OAAOsV,UAAYA,UACnBtV,OAAO/5E,KAAO65E,OACdE,OAAOznD,IAAMD,KAAKC,IAClBynD,OAAO46B,UAAY,SAAUx7B,KAI3B,IAAIn5E,KAAO+5E,OAAO/5E,KAAKm5E,KACvB,OAAiB,WAATn5E,MAA8B,WAATA,QAI5BihD,MAAMk4B,IAAMn4B,WAAWm4B,KAC1B,EACAY,OAAO/a,KAAO,SAAUvlC,MACtB,OAAe,MAARA,KAAe,IAAMA,KAAO,IAAI1V,QAAQuwF,MAAO,KACxD,EACA,IAEEM,QAAUl7G,OAAOqgF,OAEjB86B,GAAKn7G,OAAOo7G,EAiBd,OAhBA/6B,OAAOg7B,WAAa,SAAU/5B,MAO5B,OANIthF,OAAOo7G,IAAM/6B,SACfrgF,OAAOo7G,EAAID,IAET75B,MAAQthF,OAAOqgF,SAAWA,SAC5BrgF,OAAOqgF,OAAS66B,SAEX76B,MACT,OAKwB,IAAbrB,WACTh/E,OAAOqgF,OAASrgF,OAAOo7G,EAAI/6B,QAEtBA,MACT,EAvvRI3/E,OAAOC,QAAUo+E,OAAO59E,SAAW6W,QAAQ+mE,QAAQ,GAAQ,SAAUu8B,GACnE,IAAKA,EAAEn6G,SACL,MAAM,IAAIgW,MAAM,4CAElB,OAAOa,QAAQsjG,EACjB,CAmvRL,CAnwRD,CAmwRGx8B,QACH,IA0OIy8B,QACAC,gBAEAC,cA4BAC,mBAIAC,qBACAC,kBAGAtlD,YACAulD,8BAEAC,YACAC,eAIAC,YAIAC,cA7RAC,cAAgBp9B,OAAOn+E,QACvBy6G,EAAiBj7G,wBAAwB+7G,eAEzCC,8BACe,WACf,OAAOn8G,OAAOm1D,SAASk2B,IACzB,EAHE8wB,0BAIW,WACX,OAAOn8G,OAAOm1D,QAChB,EANEgnD,2BAOY,WACZ,OAAOn8G,OAAO0W,SAChB,EATEylG,wBAUS,WACT,OAAOn8G,MACT,EAZEm8G,0BAaW,SAAqBC,cAChC,OAAOA,aAAehB,EAAEp7G,OAAOmB,UAAYnB,OAAOmB,QACpD,EAfEg7G,mBAgBI,SAActJ,IAAKwJ,UACnBA,SACFr8G,OAAOu3G,KAAK1E,IAAKwJ,UAEjBr8G,OAAOu3G,KAAK1E,IAEhB,EAGEyJ,4BACW,WACX,OAAOt8G,OAAOmB,QAChB,EAIEo7G,gBAAiB,EACjBC,cAAe,EACfC,aAAc,EACdC,cAAe,EACfC,OAAQ,EACRC,SAAU,EACVC,WAAa,KACbC,oBAAsB,KACtBC,YAAa,EACbC,WAAY,EACZC,SAAU,EACVC,WAAY,EACZC,SAAU,EACVC,QAAS,EACTC,YAAa,EACbC,WAAY,EACZC,kBAAmB,EACnBC,gBAAiB,EAUjBC,mBAAqB,WAEvB,OADgBtB,6BACCtlG,gBACnB,EACI6mG,iBAAmB,WACrB,MAAO,iBAAkBpB,8BAA8BzgF,iBAAmB4hF,oBAC5E,EA8DIE,WAAa,CACfC,cAAe,WACb,OAAOJ,cACT,EACAK,gBAAiB,WACf,OAAON,gBACT,EACAO,OAAQ,WACN,OAAOb,OACT,EACAc,eAAgB,WACd,OAAOb,WAAaC,OACtB,EACAa,MAAO,WACL,OAAOZ,MACT,EACAa,KAAM,WACJ,OAAOtB,KACT,EACAuB,OAAQ,WACN,OAAOtB,OACT,EACAuB,aAAc,WACZ,OAAOtB,UACT,EACAuB,sBAAuB,WACrB,OAAOtB,mBACT,EACAuB,UAAW,WACT,OAAOtB,UACT,EACAuB,SAAU,WACR,OAAOtB,SACT,EACAuB,SAAU,WACR,OAAOjB,SACT,EACAkB,UAAW,WACT,OAAOnB,UACT,EACAoB,kBAAmB,WACjB,OAAOlC,cACT,EACAmC,WAAY,WACV,OAAOlC,YACT,EACAmC,WAAY,WACV,OAAOlC,WACT,EACAmC,YAAa,WACX,OAAOlC,YACT,EACAgB,iBACAD,mBACAoB,8BAA+B,WAC7B,IAAIC,YAAcxC,8BAClB,YAA8C,IAAnCwC,YAAYC,mBACd,wBACkD,IAAzCD,YAAYE,yBACrB,8BADF,CAGT,EACAC,sBAAuB,WACrB,OAAO7B,QAAUC,UACnB,EACA6B,mBAxEuB,WACvB,IAAIJ,YAAcxC,8BAClB,OAAOwC,YAAYK,mBAAqBL,YAAYM,uBACtD,EAsEEC,4BArEgC,SAAqCC,cACrE,OAAOlC,QAAUkC,cAAgBA,aAAaC,wBAChD,EAoEEC,cAAe,WACb,IAAI/pF,KAAO0mF,4BAA4B9wB,KACnCo0B,UAAYhqF,KAAKiqF,YAAY,KAC7BC,MAAQlqF,KAAKkY,UAAU,EAAG8xE,UAAY,GAK1C,OAJI9C,QACFgD,MAAQC,UAAUD,QAEpBA,MAAQA,MAAM1hF,MAAM,OAAOsC,KAAK,IAElC,EACAuyE,QAAS,WACP,OA3JwB,WAC1B,OAAQqJ,4BAA4BpJ,UAClC,IAAK,QACL,IAAK,SACH,OAAO,EACT,IAAK,QACH,OAAO,EAEb,CAmJW8M,EACT,EACAC,aAAc,YA7II,WAClB,IAAIC,OAASzD,8BAA8B9tG,cAAc,WAAY,EACrE+tG,eAAiBwD,aAAwC,IAAvBA,OAAOC,YACzCxD,aAAeD,gBAAkBwD,OAAOC,YAAY5hC,cAAcG,KAClEk+B,YAAcF,gBAAkBwD,OAAOC,YAAY5hC,cAAc6hC,KACjEvD,aAAeH,gBAAkBwD,OAAOC,YAAY5hC,cAAcI,MAClE,IAAI9nE,UAAYylG,6BAChBc,QAAiD,OAAvCvmG,UAAUwpG,UAAUnrF,MAAM,SACpCmoF,UAAqD,OAAzCxmG,UAAUwpG,UAAUnrF,MAAM,WACtCooF,QAAiD,OAAvCzmG,UAAUwpG,UAAUnrF,MAAM,SACpCqoF,OAASH,SAAWC,WAAaC,QACjCE,YAAuE,IAA1D3mG,UAAUwpG,UAAUhkF,cAAc1mB,QAAQ,WACvDwnG,WAAqE,IAAzDtmG,UAAUwpG,UAAUhkF,cAAc1mB,QAAQ,UACtDmnG,MAA8B,gCAAtBjmG,UAAUypG,SAAmE,aAAtBzpG,UAAUypG,SAA0G,OAAhF,IAAI/1F,OAAO,sCAAuC7Y,KAAKmF,UAAUwpG,WACpKtD,QAAiD,OAAvClmG,UAAUwpG,UAAUnrF,MAAM,SACpCgoF,YAAuE,IAA1DrmG,UAAUwpG,UAAUhkF,cAAc1mB,QAAQ,WAEvD8nG,UAAqD,OAAzC5mG,UAAUwpG,UAAUnrF,MAAM,aAAwBioF,UAG9D,IAAIoD,kBAAoB,IAAIh2F,OAAO,cAOnC,GANI1T,UAAU2pG,WAAWtrF,MAAMqrF,qBAC7BpD,WAAY,EACZM,WAAY,GAIVX,MAAO,CACT,IAAIzzE,GAAKxyB,UAAUwpG,UAEC,OADX,IAAI91F,OAAO,8BACb7Y,KAAK23B,MACV2zE,WAAav1D,WAAWl9B,OAAOk2F,IAEnC,CACA,GAAIhD,UAAW,CACb,IAAIiD,SAAW,IAAIn2F,OAAO,uBAC1B,GAAI1T,UAAU2pG,WAAWtrF,MAAMwrF,UAAW,CACxC,IAAIC,cAAgB9pG,UAAU2pG,WAAWtrF,MAAMwrF,UAAUj2G,MAAM,GAAG,KAClEwyG,oBAAsB0D,cAAc7yE,UAAU,EAAG6yE,cAAchrG,QAAQ,QAzE/C,KA4EgC0nG,YAAcC,SAAWO,qBAC/ET,SAAU,EACVG,QAAS,EAEb,CACF,CAGAI,eAAiBrB,0BAA0BsE,OAAOC,WAAa,KAAOvE,0BAA0BsE,OAAOE,YAAc,KAAOxE,0BAA0BsE,OAAOC,WAAa,KAAOvE,0BAA0BsE,OAAOE,YAAc,IAGhOpD,iBAAmBpB,0BAA0ByE,kBAAoBzE,0BAA0ByE,iBAAmB,CAChH,CAyFIC,EACF,GAGEC,WAAaxgH,OAAO2X,OAAO,CAC7B8oG,KAAM,OACNC,KAAM,SAGJC,eAAiB3gH,OAAO2X,OAAO,CACjCipG,KAAM,OACNC,SAAU,WACVC,KAAM,SASJC,mBAAqB,MACrBC,cAAgB,GAGhBC,YAAc,GAEdC,UAAY,KACZC,eAAiB,EACjBC,eAAiB,OACjBC,iBAAkB,EAClBC,+BAAiC,GACjCC,sBAAuB,EACvBC,eAAgB,EAChBC,gBAAiB,EACjBC,qBAAsB,EACtBC,oBAAsB,EACtBC,2BAA4B,EAC5BC,iBAAmB,KACnBC,oCAAqC,EACrCC,iBAAkB,EAClBC,iBAAmB,OACnBC,iBAAmB,OACnBC,aAAc,EACdC,mBAAoB,EACpBC,sBAAuB,EACvBC,gBAAiB,EACjBC,0BAA2B,EAC3BC,uBAAwB,EACxBC,kBAAmB,EACnBC,yBAA0B,EAC1BC,0BAA2B,EAC3BC,kCAAmC,EACnCC,2BAA4B,EAE5BC,kBAAmB,EACnBC,eAAgB,EAChBC,sBAAuB,EAGvBC,6BAA8B,EAC9BC,uBAAwB,EAGxBC,mBAAoB,EAGpBC,0BAA4B,GAC5BC,yBAA0B,EAC1BC,yBAA0B,EAE1BC,aAAe,GACfC,SAAW5C,eAAeC,KAC1B4C,eAAgB,EAEhBC,iBAAmB,GACnBC,6BAA8B,EAC9BC,OAASnD,WAAWE,KACpBkD,2BAA4B,EAC5BC,2BAA4B,EAC5BC,oBAAsB,KACtBC,uBAAwB,EACxBC,uBAAwB,EACxBC,0BAA4B,KAC5BC,gBAAkB,GAClBC,sBAAuB,EACvBC,mBAAoB,EACpBC,2BAA4B,EAC5BC,mBAAoB,EACpBC,mBAAoB,EACpBC,UAAY,CAAC,EACbC,oBAAsB,KACtBC,qBAAuB,EACvBC,sBAAwB,EACxBC,wBAA0B,EAC1BC,uBAAyB,EACzBC,yBAA2B,KAC3BC,sCAAuC,EACvCC,4BAA8B,KAC9BC,oBAAsB,KACtBC,uBAAyB,KACzBC,oBAAqB,EACrBC,0BAA2B,EAC3BC,aAAe,SAAsBC,WACvC,OAAOtlH,OAAOmpB,KAAKq3F,YAAYp6F,MAAK,SAAUm/F,UAC5C,OAAO/E,WAAW+E,YAAcD,SAClC,GACF,EACIE,kBAAoB,SAA2Br6E,KAEjD,OAAOA,IAAIphB,QAAQ,WAAY,IACjC,EAII07F,YAAc,WAChB,OAAyD,IAAlD/lH,OAAOmB,SAASg0D,SAASk2B,KAAK71E,QAAQ,OAC/C,EACIwwG,qBAAuB,SAA8Bv6E,KACvD,YAAYroC,IAARqoC,IACKA,IAEJ+2E,YAGA7E,WAAWM,OAGX8H,cAfE,mBAAmBx7F,KAkBKkhB,KACtBm0E,UAAUn0E,KAEZA,IALEw6E,UAAUx6E,KAHVm0E,UAAUn0E,KAHVA,GAYX,EAwCIy6E,oBAAsB,WACxB,OAAOtK,iBACT,EACIuK,oBAAsB,SAA6BC,kBACrDxK,kBAAoBwK,gBACtB,EAUIC,oBAAsB,WACxB,OAAO7C,iBACT,EAuFI8C,oBAAsB,SAA6BltD,OACrD,IAAK,IAAI33D,EAAI,EAAGA,EAAImgH,+BAA+BlgH,OAAQD,IACzD,GAAI23D,QAAUwoD,+BAA+BngH,GAC3C,OAAO,EAGX,OAAO,CACT,EACI8kH,mBAAqB,SAA4BC,OAAQC,QAC3D,OAAID,SAAWC,SAGPH,oBAAoBE,OAC9B,EA4DIE,YAAc,WAEhB,OAAOpF,cAAc5/G,OAAS,EAAI4/G,cAAc,GAAK,EACvD,EACIqF,YAAc,SAAqBC,UACrCtF,cAAc,GAAKwE,kBAAkBc,SACvC,EACIC,UAAY,WACd,OAAOb,qBAAqBzK,QAC9B,EACIuL,UAAY,SAAmBC,QACjCxL,QAAUuK,kBAAkBiB,OAC9B,EACIC,uBAAyB,WAC3B,OAAOvC,oBACT,EACIwC,yBAA2B,SAAgCC,qBAC7DzC,qBAAuByC,mBACzB,EACIC,kBAAoB,WACtB,OAAOnB,qBAAqBxK,gBAC9B,EACI4L,kBAAoB,SAA2BC,gBACjD7L,gBAAkB6L,cACpB,EACIC,gBAAkB,WACpB,OAAOtB,qBAAqBvK,cAC9B,EACI8L,gBAAkB,SAAyBC,cAC7C/L,cAAgB+L,YAClB,EACIC,cAAgB,WAClB,OAAOlG,WACT,EACImG,cAAgB,SAAuBC,YACzCpG,YAAcoG,UAChB,EACIC,YAAc,WAChB,OAAOpG,SACT,EACIqG,YAAc,SAAqBC,UACrCtG,UAAYsG,QACd,EACIC,iBAAmB,WACrB,OAAOtG,cACT,EACIuG,iBAAmB,SAA0BC,UAC/CxG,eAAiBwG,QACnB,EACIC,mBAAqB,WACvB,OAAOxG,cACT,EACIyG,iBAAmB,SAA0BC,eAC/C1G,eAAiB0G,aACnB,EACIC,kBAAoB,WACtB,OAAO1G,eACT,EACI2G,kBAAoB,SAA2BC,gBACjD5G,gBAAkB4G,cACpB,EACIC,iCAAmC,WACrC,OAAO5G,8BACT,EACI6G,iCAAmC,SAA0CC,+BAC/E,IAAIC,kBAAoBD,8BAA8Bt+G,KAAI,SAAU5I,GAClE,OAAOA,EAAE+7C,aACX,IACAqkE,+BAAiC+G,iBACnC,EACIC,uBAAyB,WAC3B,OAAO/G,oBACT,EACIgH,uBAAyB,SAAgCC,qBAC3DjH,qBAAuBiH,mBACzB,EACIC,gBAAkB,WACpB,OAAOjH,aACT,EACIkH,gBAAkB,SAAyBC,cAC7CnH,cAAgBmH,YAClB,EACIC,iBAAmB,WACrB,OAAOnH,cACT,EACIoH,iBAAmB,SAA0BC,eAC/CrH,eAAiBqH,aACnB,EACIC,sBAAwB,WAC1B,OAAOrH,mBACT,EACIsH,sBAAwB,SAA+BC,oBACzDvH,oBAAsBuH,kBACxB,EACIC,mBAAqB,WACvB,OAA4B,IAArBrH,gBACT,EACIsH,mBAAqB,SAA4BC,iBACnDvH,iBAAmBuH,eACrB,EACIC,qCAAuC,WACzC,OAAOvH,kCACT,EACIwH,qCAAuC,SAA8CC,cACvFzH,mCAAqCyH,YACvC,EACIC,kBAAoB,WACtB,OAAOzH,eACT,EACI0H,kBAAoB,SAA2BC,gBACjD3H,gBAAkB2H,cACpB,EACIC,mBAAqB,WACvB,OAAO3H,gBACT,EACI4H,mBAAqB,SAA4BC,iBACnD7H,iBAAmB6H,eACrB,EACIC,mBAAqB,WACvB,OAAO7H,gBACT,EACI8H,mBAAqB,SAA4B56C,iBACnD8yC,iBAAmB9yC,eACrB,EACI66C,oBAAsB,WACxB,OAAO7H,iBACT,EACI8H,oBAAsB,SAA6BC,kBACrD/H,kBAAoB+H,gBACtB,EACIC,uBAAyB,WAC3B,OAAOjI,WACT,EACIkI,uBAAyB,SAAgCC,YAC3DnI,YAAcmI,UAChB,EACIC,2BAA6B,WAC/B,OAAOhI,wBACT,EACIiI,2BAA6B,SAAoCC,yBACnElI,yBAA2BkI,uBAC7B,EACIC,wBAA0B,WAC5B,OAAOlI,qBACT,EACImI,wBAA0B,SAAiCC,sBAC7DpI,sBAAwBoI,oBAC1B,EACIC,mBAAqB,WACvB,OAAOpI,gBACT,EACIqI,mBAAqB,SAA4BC,iBACnDtI,iBAAmBsI,eACrB,EACIC,0BAA4B,WAC9B,OAAOtI,uBACT,EACIuI,0BAA4B,SAAmCC,wBACjExI,wBAA0BwI,sBAC5B,EACIC,2BAA6B,WAC/B,OAAOxI,wBACT,EACIyI,2BAA6B,SAAoCC,yBACnE1I,yBAA2B0I,uBAC7B,EACIC,mCAAqC,WACvC,OAAO1I,gCACT,EACI2I,mCAAqC,SAA4CC,iCACnF5I,iCAAmC4I,+BACrC,EACIC,4BAA8B,WAChC,OAAO5I,yBACT,EACI6I,4BAA8B,SAAqCC,aACrE9I,0BAA4B8I,WAC9B,EACIC,qBAAuB,WACzB,OAAOvQ,kBACT,EACIwQ,qBAAuB,SAA8Bp5G,IACvD+4B,QAAQC,KAAK,oDACb4vE,mBAAqB5oG,EACvB,EACIq5G,sBAAwB,WAC1B,OAAOhJ,gBACT,EACIiJ,sBAAwB,SAA+BC,iBACzDlJ,iBAAmBkJ,eACrB,EACIC,mBAAqB,WACvB,OAAOlJ,aACT,EACImJ,mBAAqB,SAA4BC,cACnDpJ,cAAgBoJ,YAClB,EACIC,8BAAgC,WAClC,OAAOnJ,2BACT,EACIoJ,8BAAgC,SAAuCC,4BACzErJ,4BAA8BqJ,0BAChC,EACIC,wBAA0B,WAC5B,OAAOrJ,qBACT,EACIsJ,wBAA0B,SAAiCC,sBAC7DvJ,sBAAwBuJ,oBAC1B,EACIC,gCAAkC,WACpC,OAAOlR,6BACT,EACImR,gCAAkC,SAAyCC,qBAC7EpR,8BAAgCoR,oBAChCC,iBAAgB,EAClB,EACIC,cAAgB,WAClB,OAAO72D,WACT,EACI82D,cAAgB,SAAuB7gD,MACzCjW,YAAciW,IAChB,EACI8gD,YAAc,WAChB,OAAOvR,WACT,EACIwR,YAAc,SAAqBC,UACrCzR,YAAcyR,QAChB,EACIC,iBAAmB,WACrB,OAAOzR,cACT,EACI0R,iBAAmB,SAA0BC,eAC/C3R,eAAiB2R,aACnB,EACIC,0BAA4B,WAC9B,OAAOjK,uBACT,EACIkK,0BAA4B,SAAmCC,wBACjEnK,wBAA0BmK,sBAC5B,EAIIC,8BAAgC,SAAuCC,4BACzE/J,4BAA8B+J,0BAChC,EACIC,0BAA4B,WAC9B,OAAOrK,uBACT,EACIsK,0BAA4B,SAAmCC,iBACjEvK,wBAA0BuK,eAC5B,EACIC,cAAgB,WAClB,OAAOnS,WACT,EACIoS,cAAgB,SAAuBC,YACzCrS,YAAcqS,UAChB,EACIC,eAAiB,WACnB,OAAOvK,gBACT,EACIwK,eAAiB,SAAwB/5G,OAC3CuvG,iBAAmBvvG,KACrB,EACIg6G,eAAiB,WACnB,OAAO5K,YACT,EACI6K,eAAiB,SAAwBpyF,aAC3CunF,aAAevnF,WACjB,EACIqyF,WAAa,WACf,OAAO7K,QACT,EACI8K,WAAa,SAAoBC,gBAnmBV,SAA8BA,eACvD,OAAOtuH,OAAOmpB,KAAKw3F,gBAAgBv6F,MAAK,SAAU0yE,QAChD,OAAOw1B,gBAAkB3N,eAAe7nB,OAC1C,GACF,EAgmBMy1B,CAAqBD,iBACvB/K,SAAW+K,cAEf,EACIE,gBAAkB,WACpB,OAAOhL,aACT,EACIiL,gBAAkB,SAAyBv6G,OAC7CsvG,cAAgBtvG,KAClB,EACIw6G,gBAAkB,WACpB,OAAO/S,aACT,EACIgT,gBAAkB,SAAyBz6G,OAC7CynG,cAAgBznG,KAClB,EACI06G,SAAW,WACb,OAAOjL,MACT,EACIkL,WAAa,SAAkB36G,OAC7BmxG,aAAanxG,SACfyvG,OAASzvG,MAEb,EACI46G,4BAA8B,WAChC,OAAOlL,yBACT,EACImL,4BAA8B,SAAqC76G,OACrE0vG,0BAA4B1vG,KAC9B,EACI86G,4BAA8B,WAChC,OAAOnL,yBACT,EACIoL,4BAA8B,SAAqC/6G,OACrE2vG,0BAA4B3vG,KAC9B,EACIg7G,oBAAsB,WACxB,OAAOpL,mBACT,EACIqL,oBAAsB,SAA6BC,kBACrDtL,oBAAsBsL,gBACxB,EACIC,wBAA0B,WAC5B,OAAOtL,qBACT,EACIuL,wBAA0B,SAAiCC,sBAC7DxL,sBAAwBwL,oBAC1B,EAiBIC,wBAA0B,WAC5B,OAAOxL,qBACT,EACIyL,wBAA0B,SAAiCC,sBAC7D1L,sBAAwB0L,oBAC1B,EACIC,4BAA8B,WAChC,OAAO1L,yBACT,EACI2L,4BAA8B,SAAqCC,0BACrE5L,0BAA4B4L,wBAC9B,EAUIC,4BAA8B,WAChC,OAAOlO,yBACT,EACImO,4BAA8B,SAAqCC,0BACrEpO,0BAA4BoO,wBAC9B,EACIC,qBAAuB,WACzB,OAA+B,IAAxBtO,mBA1rB8B,EA0rBiCA,kBACxE,EACIuO,qBAAuB,SAA8BC,mBACtB,iBAAtBA,oBAGXxO,mBAAqBwO,kBACvB,EACIC,oBAAsB,WACxB,OAAOhM,iBACT,EACIiM,oBAAsB,SAA6BC,kBACrDlM,kBAAoBkM,gBACtB,EACIC,4BAA8B,WAChC,OAAOlM,yBACT,EACImM,4BAA8B,SAAqCC,0BACrEpM,0BAA4BoM,wBAC9B,EACIC,oBAAsB,WACxB,OAAOpM,iBACT,EACIqM,oBAAsB,SAA6BC,kBACrDtM,kBAAoBsM,gBACtB,EACIC,oBAAsB,WACxB,OAAOtM,iBACT,EACIuM,oBAAsB,SAA6BC,kBACrDxM,kBAAoBwM,gBACtB,EACIC,YAAc,WAChB,OAAOxM,SACT,EACIyM,YAAc,SAAqBC,UACrC1M,UAAY0M,QACd,EACItE,gBAAkB,SAAyBuE,cAC7CjO,kBAAoBiO,YACtB,EACIC,qBAAuB,WACzB,OAAO3M,mBACT,EACI4M,qBAAuB,SAA8BC,mBACvD7M,oBAAsB6M,iBACxB,EACIC,uBAAyB,WAC3B,OAAO7M,oBACT,EACI8M,uBAAyB,SAAgCC,qBAC3D/M,qBAAuB+M,mBACzB,EACIC,wBAA0B,WAC5B,OAAO/M,qBACT,EACIgN,wBAA0B,SAAiCC,sBAC7DjN,sBAAwBiN,oBAC1B,EACIC,0BAA4B,WAC9B,OAAOjN,uBACT,EACIkN,0BAA4B,SAAmCC,wBACjEnN,wBAA0BmN,sBAC5B,EACIC,yBAA2B,WAC7B,OAAOnN,sBACT,EACIoN,yBAA2B,SAAkCC,uBAC/DrN,uBAAyBqN,qBAC3B,EACIC,2BAA6B,WAC/B,OAAOrN,wBACT,EACIsN,2BAA6B,SAAoCC,yBACnEvN,yBAA2BuN,uBAC7B,EACIC,uCAAyC,WAC3C,OAAOvN,oCACT,EACIwN,uCAAyC,SAAgDC,qCAC3FzN,qCAAuCyN,mCACzC,EACIC,8BAAgC,WAClC,OAAOzN,2BACT,EACI0N,8BAAgC,SAAuCC,4BACzE3N,4BAA8B2N,0BAChC,EAmBIC,qBAAuB,WACzB,OAAOzN,kBACT,EACI0N,qBAAuB,SAA8B5nC,SACvDk6B,mBAAqBl6B,OACvB,EACI6nC,2BAA6B,WAC/B,OAAO1N,wBACT,EACI2N,2BAA6B,SAAoCC,yBACnE5N,yBAA2B4N,uBAC7B,EACIC,eAAiB,WAA2B,EAE5CC,oBAAsBlzH,OAAOsX,iBAAiB,CAChD67G,mBAhsBuB,WACvBnS,cAAgB,GAChBuC,SAAW5C,eAAeC,KAC1BkB,oCAAqC,EACrCD,iBAAmB,KACnBiC,oBAAsB,KACtBxC,+BAAiC,GACjCC,sBAAuB,EACvB2C,gBAAkB,GAClBtC,2BAA4B,EAC5BD,oBAAsB,EACtByC,mBAAoB,EACpBC,2BAA4B,EAC5BC,mBAAoB,EACpBrD,YAAc,GACdC,UAAY,KACZsD,UAAY,CAAC,EACbD,mBAAoB,EACpBE,oBAAsB,KACtBC,qBAAuB,EACvBC,sBAAwB,EACxBC,wBAA0B,EAC1BC,uBAAyB,EACzBC,yBAA2B,KAC3BC,sCAAuC,EACvCE,oBAAsB,KACtBC,uBAAyB,KACzBF,4BAA8B,KAC9BG,oBAAqB,EACrB7J,kBAAoB,KACpB8J,0BAA2B,CAC7B,EAkqBEK,YACA2N,YA/nBkB,SAAqB9M,UACf,iBAAbA,SACTtF,cAAc18G,KAAKkhH,kBAAkBc,WAErCtF,cAAc18G,KAAKgiH,SAEvB,EA0nBE+M,gBAznBoB,WACpB,OAAOrS,aACT,EAwnBEsS,cA9IkB,SAAuBC,WAAYnqF,0BACrD86E,gBAAgB5/G,KAAK,CACnBg7E,IAAKi0C,WACL3zF,mBAAoBwJ,0BAExB,EA0IEoqF,iBAxnBqB,WACrB,IAAIC,YAAczS,cAAc5/G,OAAS,EAAI4/G,cAAc,QAAKl+G,EAChE,GAAI2wH,YAAa,CACf,IAAIC,QAAUD,YAAY91F,MAAM,KAEhC,OADoB+1F,QAAQA,QAAQtyH,OAAS,GACxBu8B,MAAM,KAAK,IAAM,eACxC,CACA,MAAO,UACT,EAinBE+nF,qBACAiO,gCAvqBoC,WACpC,OAAO52C,oBAAoBF,gBAAgB5J,kBAAkBmG,kBAC/D,EAsqBEw6C,uBArqB2B,SAAgCC,oBAAqBC,qBAChF/Q,qBAAuB8Q,oBACvBxY,qBAAuByY,mBACzB,EAmqBEC,eA5pBmB,WACnB,OAAOhR,2BAA+CjgH,IAAvBs4G,kBACjC,EA2pBE4Y,uBA1pB2B,WAC3B,OAAOjR,oBACT,EAypBEkR,uBAxpB2B,WAC3B,OAAO5Y,oBACT,EAupBE0K,oBACAmO,oCAppBwC,SAA6C9kF,QACrF,IAAI+kF,YAAc,GAClB,IAAK,IAAIhgH,OAAOi7B,OACd+kF,aAAe,IAAMhgH,IAAM,IAAMi7B,OAAOj7B,KAE1CgvG,0BAA4BgR,WAC9B,EA+oBEC,4BA9oBgC,WAChC,OAAOjR,yBACT,EA6oBEkR,iCAznBqC,SAA0CC,cAC/E,GAAMA,wBAAwBzqH,MAK9B,IAFA,IAAIivD,MACAy7D,aAAeD,aAAalzH,OACvBD,EAAI,EAAGA,EAAIozH,aAAcpzH,IAEhC,GAAqB,KADrB23D,MAAQw7D,aAAanzH,GAAGw8B,MAAM,MACpBv8B,OACR,OAAQ03D,MAAM,GAAGl9B,eACf,IAAK,gBAED6/E,eAAiB3iD,MAAM,GACvB,MAEJ,IAAK,IAED9C,YAAc8C,MAAM,GACpB,MAEJ,IAAK,WAE8B,SAA3BA,MAAM,GAAGl9B,cACX6lF,gBAAiB,EACmB,UAA3B3oD,MAAM,GAAGl9B,gBAClB6lF,gBAAiB,GAEnB,MAEJ,IAAK,gBAE8B,SAA3B3oD,MAAM,GAAGl9B,cACX8lF,qBAAsB,EACc,UAA3B5oD,MAAM,GAAGl9B,gBAClB8lF,qBAAsB,GAExB,MAEJ,IAAK,mBAE8B,SAA3B5oD,MAAM,GAAGl9B,cACXumF,mBAAoB,EACgB,UAA3BrpD,MAAM,GAAGl9B,gBAClBumF,mBAAoB,GAEtB,MAEJ,IAAK,QAEGkD,aAAavsD,MAAM,MACrB6qD,OAAS7qD,MAAM,IAM7B,EAkkBEokB,iBAnjBqB,SAA0B9iD,KAC/C,IAAI4rF,oBAAoB,KAAxB,CAGA5rF,IAAI+iD,qBAAqB76E,SAAQ,SAAU86E,qBACzC,IAAItkB,MAAQskB,oBAAoBp5E,KAAKi5C,cACrC,QAAQ,GACN,KAAKgpE,mBAAmB,WAAYntD,OAClCqpD,kBAAkD,SAA9B/kC,oBAAoBlpE,MACxC,MACF,KAAK+xG,mBAAmB,YAAantD,OACrC,KAAKmtD,mBAAmB,WAAYntD,OAC7B2oD,iBACHA,eAA+C,SAA9BrkC,oBAAoBlpE,OAEvC,MACF,KAAK+xG,mBAAmB,aAAcntD,OACpC0oD,cAA8C,SAA9BpkC,oBAAoBlpE,MACpC,MACF,KAAK+xG,mBAAmB,kBAAmBntD,OACpCgpD,qCACHD,iBAAiD,SAA9BzkC,oBAAoBlpE,OAEzC,MACF,KAAK+xG,mBAAmB,iBAAkBntD,OACxCipD,gBAAgD,SAA9B3kC,oBAAoBlpE,MACtC,MACF,KAAK+xG,mBAAmB,iBAAkBntD,OACxCopD,YAA4C,SAA9B9kC,oBAAoBlpE,MAClC,MACF,KAAK+xG,mBAAmB,kBAAmBntD,OACzC,IAAI7J,QAAUmuB,oBAAoBlpE,OACJ,IAA1B+6C,QAAQ/5C,QAAQ,OAClB+5C,QAAU,IAAMA,SAElBgzD,iBAAmBhzD,QACnB,MACF,KAAKg3D,mBAAmB,kBAAmBntD,OACzCkpD,iBAAiD,UAA9B5kC,oBAAoBlpE,OAAmD,MAA9BkpE,oBAAoBlpE,MAAgB,QAAU,OAC1G,MACF,KAAK+xG,mBAAmB,YAAantD,OACnCsoD,eAAiBhkC,oBAAoBlpE,MACrC,MACF,KAAK+xG,mBAAmB,iBAAkBntD,OACxCuoD,gBAAkBjkC,oBAAoBlpE,MAG5C,IAGA,IAAI4zG,cAAgB1G,eAAexlF,cACnC,GAAsB,cAAlBksF,eAAmD,iBAAlBA,cAAkC,CACrE,IAAIG,eAAiB5G,gBAAgBzlF,cACK,IAAtCqsF,eAAe/yG,QAAQ,YAA2D,IAAvC+yG,eAAe/yG,QAAQ,cACpEksG,eAAiB,OACjBC,gBAAkB,OAEtB,CAtDA,CAuDF,EA0fE+E,YACAC,YACAE,UACAC,UACAK,kBACAC,kBACAK,cACAC,cACAJ,gBACAC,gBACAK,YACAC,YACAoI,4BACAC,4BACAnI,iBACAC,iBACA8M,iBAAkB5M,mBAClBC,iBACAE,kBACAC,kBACAE,iCACAC,iCACAG,uBACAC,uBACAE,gBACAC,gBACAhC,uBACA+N,uBAAwB9N,yBACxBiC,iBACAC,iBACAE,sBACAC,sBACAE,mBACAC,mBACAE,qCACAC,qCACAE,kBACAC,kBACAE,mBACAC,mBACAE,mBACAC,mBACAC,oBACAC,oBACAE,uBACAC,uBACAsK,uBAnO2B,WAC3B,OAAOtS,oBACT,EAkOEuS,uBAjO2B,SAAgCC,aAC3DxS,qBAAuBwS,WACzB,EAgOEtK,2BACAC,2BACAE,wBACAC,wBACAE,mBACAC,mBACAE,0BACAC,0BACAE,2BACAC,2BACAE,mCACAC,mCACAE,4BACAC,4BACAE,qBACAC,qBACAC,sBACAC,sBACAE,mBACAC,mBACAE,8BACAC,8BACAE,wBACAC,wBACAE,gCACAC,gCACAG,cACAC,cACAC,YACAC,YACAE,iBACAC,iBACAE,0BACAC,0BACAuH,8BA3VkC,WAClC,OAAOnR,2BACT,EA0VE8J,8BACAE,0BACAC,0BACAE,cACAC,cACAE,eACAC,eACAC,eACAC,eACAC,WACAC,WACAG,gBACAC,gBACAC,gBACAC,gBACAC,SACAkG,SAAUjG,WACVC,4BACAC,4BACAC,4BACAC,4BACAC,oBACAC,oBACAE,wBACAC,wBACAE,wBACAC,wBACAK,4BACAC,4BACAE,qBACAC,qBACAE,oBACAC,oBACAE,4BACAC,4BACAE,oBACAC,oBACAE,oBACAC,oBACAE,YACAC,YACA8D,gBAAiBhP,oBACjB6G,gBACAwE,qBACAC,qBACAE,uBACAC,uBACAE,wBACAC,wBACAE,0BACAC,0BACAE,yBACAC,yBACAE,2BACAC,2BACAE,uCACAC,uCACAE,8BACAC,8BACAsC,sBAhM0B,WAC1B,OAAO/P,mBACT,EA+LEgQ,sBA9L0B,SAA+BC,oBACrDA,qBAAyE,IAAnDA,mBAAmB3+C,OAAOwqC,sBAClDmU,oBAAsB,KAExBjQ,oBAAsBiQ,kBACxB,EA0LEC,yBAzL6B,WAC7B,OAAOjQ,sBACT,EAwLEkQ,yBAvL6B,SAAkCC,uBAC3DA,wBAA+E,IAAtDA,sBAAsB9+C,OAAOwqC,sBACxDsU,uBAAyB,KAE3BnQ,uBAAyBmQ,qBAC3B,EAmLEzC,qBACAC,qBACAjN,oBACAC,oBACAiN,2BACAC,2BAEAuC,WAAYrH,eACZsH,wBAAyBtC,eACzBuC,2BAA4BvC,eAC5BwC,mBAAoBxC,eACpByC,mBAAoBzC,eACpB0C,eAAgB1C,eAChB2C,eAAgB3C,eAChB4C,eAAgB5C,eAChB6C,eAAgB7C,eAChB8C,gBAAiB9C,eACjB+C,gBAAiB/C,eACjBgD,kBAAmBhD,eACnBiD,oBAAqBjD,eACrBkD,oBAAqBlD,eACrBmD,oBAAqBnD,eACrBoD,wBAAyBpD,eACzBqD,4BAA6BrD,eAC7BsD,4BAA6BtD,eAC7BuD,eAAgBvD,gBACf,CACD3M,SAAU,CACRtjH,IAAKojH,YACLzjH,IAAK0jH,aAEPI,OAAQ,CACNzjH,IAAKujH,UACL5jH,IAAK6jH,WAEPO,eAAgB,CACd/jH,IAAK6jH,kBACLlkH,IAAKmkH,mBAEPO,WAAY,CACVrkH,IAAKmkH,cACLxkH,IAAKykH,eAEPF,aAAc,CACZlkH,IAAKgkH,gBACLrkH,IAAKskH,iBAEPO,SAAU,CACRxkH,IAAKskH,YACL3kH,IAAK4kH,aAEPkP,cAAe,CACbzzH,IAAKykH,iBACL9kH,IAAK+kH,kBAEPI,cAAe,CACb9kH,IAAK4kH,mBACLjlH,IAAKklH,kBAEPI,eAAgB,CACdjlH,IAAK+kH,kBACLplH,IAAKqlH,mBAEPI,8BAA+B,CAC7BplH,IAAKklH,iCACLvlH,IAAKwlH,kCAEPK,oBAAqB,CACnBxlH,IAAKslH,uBACL3lH,IAAK4lH,wBAEP3B,oBAAqB,CACnB5jH,IAAK0jH,uBACL/jH,IAAKgkH,0BAEPgC,aAAc,CACZ3lH,IAAKylH,gBACL9lH,IAAK+lH,iBAEPI,cAAe,CACb9lH,IAAK4lH,iBACLjmH,IAAKkmH,kBAEPI,mBAAoB,CAClBjmH,IAAK+lH,sBACLpmH,IAAKqmH,uBAEPI,gBAAiB,CACfpmH,IAAKkmH,mBACLvmH,IAAKwmH,oBAEPuN,kCAAmC,CACjC1zH,IAAKqmH,qCACL1mH,IAAK2mH,sCAEPI,eAAgB,CACd1mH,IAAKwmH,kBACL7mH,IAAK8mH,mBAEPI,gBAAiB,CACf7mH,IAAK2mH,mBACLhnH,IAAKinH,oBAEPz6C,gBAAiB,CACfnsE,IAAK8mH,mBACLnnH,IAAKonH,oBAEPG,iBAAkB,CAChBlnH,IAAKgnH,oBACLrnH,IAAKsnH,qBAEP0M,oBAAqB,CACnB3zH,IAAKmnH,uBACLxnH,IAAKynH,wBAEPI,wBAAyB,CACvBxnH,IAAKsnH,2BACL3nH,IAAK4nH,4BAEPI,qBAAsB,CACpB3nH,IAAKynH,wBACL9nH,IAAK+nH,yBAEPI,gBAAiB,CACf9nH,IAAK4nH,mBACLjoH,IAAKkoH,oBAEPI,uBAAwB,CACtBjoH,IAAK+nH,0BACLpoH,IAAKqoH,2BAEPI,wBAAyB,CACvBpoH,IAAKkoH,2BACLvoH,IAAKwoH,4BAEPI,gCAAiC,CAC/BvoH,IAAKqoH,mCACL1oH,IAAK2oH,oCAEPsL,yBAA0B,CACxB5zH,IAAKwoH,4BACL7oH,IAAK8oH,6BAEPoL,kBAAmB,CACjB7zH,IAAK2oH,qBACLhpH,IAAKipH,sBAEPkL,gCAAiC,CAC/B9zH,IAAK6oH,sBACLlpH,IAAKmpH,uBAEPiL,6BAA8B,CAC5B/zH,IAAKgpH,mBACLrpH,IAAKspH,oBAEPI,2BAA4B,CAC1BrpH,IAAKmpH,8BACLxpH,IAAKypH,+BAEPI,qBAAsB,CACpBxpH,IAAKspH,wBACL3pH,IAAK4pH,yBAEPyK,6BAA8B,CAC5Bh0H,IAAKypH,gCACL9pH,IAAK+pH,iCAEPz2D,WAAY,CACVjzD,IAAK6pH,cACLlqH,IAAKmqH,eAEPG,SAAU,CACRjqH,IAAK+pH,YACLpqH,IAAKqqH,aAEPI,cAAe,CACbpqH,IAAKkqH,iBACLvqH,IAAKwqH,kBAEPI,uBAAwB,CACtBvqH,IAAKqqH,0BACL1qH,IAAK2qH,2BAEPG,2BAA4B,CAC1BzqH,IAAKwqH,8BACL7qH,IAAK6qH,+BAEPyJ,uBAAwB,CACtBj0H,IAAK0qH,0BACL/qH,IAAKgrH,2BAEPI,WAAY,CACV/qH,IAAK6qH,cACLlrH,IAAKmrH,eAEPoJ,YAAa,CACXl0H,IAAKgrH,eACLrrH,IAAKsrH,gBAEPlyF,YAAa,CACX/4B,IAAKkrH,eACLvrH,IAAKwrH,gBAEPgJ,QAAS,CACPn0H,IAAKorH,WACLzrH,IAAK0rH,YAEP+I,aAAc,CACZp0H,IAAKwrH,gBACL7rH,IAAK8rH,iBAEP4I,aAAc,CACZr0H,IAAK0rH,gBACL/rH,IAAKgsH,iBAEP2I,MAAO,CACLt0H,IAAK4rH,SACLjsH,IAAKksH,YAEP0I,yBAA0B,CACxBv0H,IAAK8rH,4BACLnsH,IAAKosH,6BAEPyI,yBAA0B,CACxBx0H,IAAKgsH,4BACLrsH,IAAKssH,6BAEPG,iBAAkB,CAChBpsH,IAAKksH,oBACLvsH,IAAKwsH,qBAEPI,qBAAsB,CACpBvsH,IAAKqsH,wBACL1sH,IAAK2sH,yBAEPmI,cAAe,CACbz0H,IA3iBmB,WACrB,OAAOq/G,cACT,EA0iBI1/G,IAziBmB,SAA0B80H,eAC/CpV,eAAiBoV,aACnB,GAyiBE/H,qBAAsB,CACpB1sH,IAAKwsH,wBACL7sH,IAAK8sH,yBAEPI,yBAA0B,CACxB7sH,IAAK2sH,4BACLhtH,IAAKitH,6BAEP8H,eAAgB,CACd10H,IA/hBoB,WACtB,OAAOkhH,eACT,GA+hBE8L,yBAA0B,CACxBhtH,IAAK8sH,4BACLntH,IAAKotH,6BAEPI,kBAAmB,CACjBntH,IAAKitH,qBACLttH,IAAKutH,sBAEPI,iBAAkB,CAChBttH,IAAKotH,oBACLztH,IAAK0tH,qBAEPI,yBAA0B,CACxBztH,IAAKutH,4BACL5tH,IAAK6tH,6BAEPI,iBAAkB,CAChB5tH,IAAK0tH,oBACL/tH,IAAKguH,qBAEPI,iBAAkB,CAChB/tH,IAAK6tH,oBACLluH,IAAKmuH,qBAEPI,SAAU,CACRluH,IAAKguH,YACLruH,IAAKsuH,aAEPE,aAAc,CACZnuH,IAAK+iH,oBACLpjH,IAAKiqH,iBAEP+K,mBAAoB,CAClB30H,IAAKouH,qBACLzuH,IAAK0uH,sBAEPI,oBAAqB,CACnBzuH,IAAKuuH,uBACL5uH,IAAK6uH,wBAEPI,qBAAsB,CACpB5uH,IAAK0uH,wBACL/uH,IAAKgvH,yBAEPI,uBAAwB,CACtB/uH,IAAK6uH,0BACLlvH,IAAKmvH,2BAEPI,sBAAuB,CACrBlvH,IAAKgvH,yBACLrvH,IAAKsvH,0BAEPI,wBAAyB,CACvBrvH,IAAKmvH,2BACLxvH,IAAKyvH,4BAEPI,oCAAqC,CACnCxvH,IAAKsvH,uCACL3vH,IAAK4vH,wCAEPI,2BAA4B,CAC1B3vH,IAAKyvH,8BACL9vH,IAAK+vH,+BAEPkF,kBAAmB,CACjB50H,IAAK4vH,qBACLjwH,IAAKkwH,sBAEP/M,iBAAkB,CAChB9iH,IAAK4iH,oBACLjjH,IAAKkjH,qBAEPmN,wBAAyB,CACvBhwH,IAAK8vH,2BACLnwH,IAAKowH,8BAmET,SAAS8E,eAAeC,OAAQ9lG,SAC9BxvB,KAAKwB,KAAO,iBAAkBxB,KAAKs1H,OAASA,OAC5Ct1H,KAAKwvB,QAAUA,SAAW,EAC5B,CACA6lG,eAAe53H,UAAY4W,MAAM5W,UA2BjC,IAAI83H,eAAiB9lH,WACrB,SAASya,QAAQ5sB,GACf,OAAO0I,QAAQ1I,QAAyB,IAAbA,EAAEsB,OAC/B,CACA,SAAS42H,SAAU,CAanB,SAASC,UAAUhyH,IACjB,KAAMzD,gBAAgBy1H,WAAY,MAAM,IAAInkG,UAAU,wCACtD,GAAkB,mBAAP7tB,GAAmB,MAAM,IAAI6tB,UAAU,kBAElDtxB,KAAKinC,OAAS,EAEdjnC,KAAKknC,UAAW,EAEhBlnC,KAAKmnC,YAAS7mC,EAEdN,KAAKonC,WAAa,GAClBsuF,UAAUjyH,GAAIzD,KAChB,CACA,SAASo5F,OAAOh8F,KAAMmqC,UACpB,KAAuB,IAAhBnqC,KAAK6pC,QACV7pC,KAAOA,KAAK+pC,OAEM,IAAhB/pC,KAAK6pC,QAIT7pC,KAAK8pC,UAAW,EAChBuuF,UAAUjuF,cAAa,WACrB,IAAIzG,GAAqB,IAAhB3jC,KAAK6pC,OAAeM,SAASE,YAAcF,SAASG,WAC7D,GAAW,OAAP3G,GAAJ,CAIA,IAAInxB,IACJ,IACEA,IAAMmxB,GAAG3jC,KAAK+pC,OAChB,CAAE,MAAO/oC,GAEP,YADAmqC,OAAOhB,SAASK,QAASxpC,EAE3B,CACAqwB,QAAQ8Y,SAASK,QAASh4B,IAR1B,MAFmB,IAAhBxS,KAAK6pC,OAAexY,QAAU8Z,QAAQhB,SAASK,QAASxqC,KAAK+pC,OAWlE,KAlBE/pC,KAAKgqC,WAAWtlC,KAAKylC,SAmBzB,CACA,SAAS9Y,QAAQrxB,KAAM0qC,UACrB,IAEE,GAAIA,WAAa1qC,KAAM,MAAM,IAAIk0B,UAAU,6CAC3C,GAAIwW,WAAqC,WAAxB5jB,UAAU4jB,WAA8C,mBAAbA,UAA0B,CACpF,IAAIC,KAAOD,SAASC,KACpB,GAAID,oBAAoB2tF,UAItB,OAHAr4H,KAAK6pC,OAAS,EACd7pC,KAAK+pC,OAASW,cACd6tF,OAAOv4H,MAEF,GAAoB,mBAAT2qC,KAEhB,YADA2tF,WA5DMjyH,GA4DSskC,KA5DLpnC,QA4DWmnC,SA3DpB,WACLrkC,GAAGguB,MAAM9wB,QAASyqB,UACpB,GAyDsChuB,KAGpC,CACAA,KAAK6pC,OAAS,EACd7pC,KAAK+pC,OAASW,SACd6tF,OAAOv4H,KACT,CAAE,MAAOgB,GACPmqC,OAAOnrC,KAAMgB,EACf,CArEF,IAAcqF,GAAI9C,OAsElB,CACA,SAAS4nC,OAAOnrC,KAAM0qC,UACpB1qC,KAAK6pC,OAAS,EACd7pC,KAAK+pC,OAASW,SACd6tF,OAAOv4H,KACT,CACA,SAASu4H,OAAOv4H,MACM,IAAhBA,KAAK6pC,QAA2C,IAA3B7pC,KAAKgqC,WAAWxoC,QACvC62H,UAAUjuF,cAAa,WAChBpqC,KAAK8pC,UACRuuF,UAAUxtF,sBAAsB7qC,KAAK+pC,OAEzC,IAEF,IAAK,IAAIxoC,EAAI,EAAGupC,IAAM9qC,KAAKgqC,WAAWxoC,OAAQD,EAAIupC,IAAKvpC,IACrDy6F,OAAOh8F,KAAMA,KAAKgqC,WAAWzoC,IAE/BvB,KAAKgqC,WAAa,IACpB,CAKA,SAASwuF,QAAQnuF,YAAaC,WAAYE,SACxC5nC,KAAKynC,YAAqC,mBAAhBA,YAA6BA,YAAc,KACrEznC,KAAK0nC,WAAmC,mBAAfA,WAA4BA,WAAa,KAClE1nC,KAAK4nC,QAAUA,OACjB,CAQA,SAAS8tF,UAAUjyH,GAAIrG,MACrB,IAAIgrC,MAAO,EACX,IACE3kC,IAAG,SAAUiO,OACP02B,OACJA,MAAO,EACP3Z,QAAQrxB,KAAMsU,OAChB,IAAG,SAAU22B,QACPD,OACJA,MAAO,EACPG,OAAOnrC,KAAMirC,QACf,GACF,CAAE,MAAO9lC,IACP,GAAI6lC,KAAM,OACVA,MAAO,EACPG,OAAOnrC,KAAMmF,GACf,CACF,CACAkzH,UAAUh4H,UAAiB,MAAI,SAAUiqC,YACvC,OAAO1nC,KAAK+nC,KAAK,KAAML,WACzB,EACA+tF,UAAUh4H,UAAUsqC,KAAO,SAAUN,YAAaC,YAEhD,IAAIY,KAAO,IAAItoC,KAAKskB,YAAYkxG,QAEhC,OADAp8B,OAAOp5F,KAAM,IAAI41H,QAAQnuF,YAAaC,WAAYY,OAC3CA,IACT,EACAmtF,UAAUh4H,UAAmB,QAtO7B,SAA4BiD,UAC1B,IAAI4jB,YAActkB,KAAKskB,YACvB,OAAOtkB,KAAK+nC,MAAK,SAAUr2B,OAEzB,OAAO4S,YAAYmK,QAAQ/tB,YAAYqnC,MAAK,WAC1C,OAAOr2B,KACT,GACF,IAAG,SAAU22B,QAEX,OAAO/jB,YAAYmK,QAAQ/tB,YAAYqnC,MAAK,WAE1C,OAAOzjB,YAAYikB,OAAOF,OAC5B,GACF,GACF,EAyNAotF,UAAUjtF,IAAM,SAAUC,KACxB,OAAO,IAAIgtF,WAAU,SAAUhnG,QAAS8Z,QACtC,IAAKre,QAAQue,KACX,OAAOF,OAAO,IAAIjX,UAAU,iCAE9B,IAAIE,KAAOnqB,MAAM5J,UAAU+J,MAAM7J,KAAK8qC,KACtC,GAAoB,IAAhBjX,KAAK5yB,OAAc,OAAO6vB,QAAQ,IACtC,IAAI0H,UAAY3E,KAAK5yB,OACrB,SAAS8pC,IAAI/pC,EAAGgqC,KACd,IACE,GAAIA,MAA2B,WAAnBzkB,UAAUykB,MAAoC,mBAARA,KAAqB,CACrE,IAAIZ,KAAOY,IAAIZ,KACf,GAAoB,mBAATA,KAIT,YAHAA,KAAKpqC,KAAKgrC,KAAK,SAAUA,KACvBD,IAAI/pC,EAAGgqC,IACT,GAAGJ,OAGP,CACA/W,KAAK7yB,GAAKgqC,IACU,KAAdxS,WACJ1H,QAAQ+C,KAEZ,CAAE,MAAOjvB,IACPgmC,OAAOhmC,GACT,CACF,CACA,IAAK,IAAI5D,EAAI,EAAGA,EAAI6yB,KAAK5yB,OAAQD,IAC/B+pC,IAAI/pC,EAAG6yB,KAAK7yB,GAEhB,GACF,EACA82H,UAAUI,IAtMV,SAAaptF,KACX,IAAIqtF,EAAI91H,KACR,OAAO,IAAI81H,GAAE,SAAUrnG,QAAS8Z,QAC9B,IAAME,UAA6B,IAAfA,IAAI7pC,OACtB,OAAO2pC,OAAO,IAAIjX,UAAU,iCAE9B,IAAIE,KAAOnqB,MAAM5J,UAAU+J,MAAM7J,KAAK8qC,KACtC,GAAoB,IAAhBjX,KAAK5yB,OAAc,OAAO2pC,SAE9B,IADA,IAAIwtF,iBAAmB,GACdp3H,EAAI,EAAGA,EAAI6yB,KAAK5yB,OAAQD,IAC/B,IACEm3H,EAAErnG,QAAQ+C,KAAK7yB,IAAIopC,KAAKtZ,SAAgB,OAAE,SAAUra,OAClD2hH,iBAAiBj0H,KAAKsS,OAClB2hH,iBAAiBn3H,SAAW4yB,KAAK5yB,QACnC2pC,OAAO,IAAI8sF,eAAeU,iBAAkB,8BAEhD,GACF,CAAE,MAAOxzH,IACPgmC,OAAOhmC,GACT,CAEJ,GACF,EAiLAkzH,UAAUO,WAxPV,SAAoBvtF,KAElB,OAAO,IADCzoC,MACK,SAAUyuB,QAAS8Z,QAC9B,IAAME,UAA6B,IAAfA,IAAI7pC,OACtB,OAAO2pC,OAAO,IAAIjX,UAAUpN,UAAUukB,KAAO,IAAMA,IAAM,mEAE3D,IAAIjX,KAAOnqB,MAAM5J,UAAU+J,MAAM7J,KAAK8qC,KACtC,GAAoB,IAAhBjX,KAAK5yB,OAAc,OAAO6vB,QAAQ,IACtC,IAAI0H,UAAY3E,KAAK5yB,OACrB,SAAS8pC,IAAI/pC,EAAGgqC,KACd,GAAIA,MAA2B,WAAnBzkB,UAAUykB,MAAoC,mBAARA,KAAqB,CACrE,IAAIZ,KAAOY,IAAIZ,KACf,GAAoB,mBAATA,KAYT,YAXAA,KAAKpqC,KAAKgrC,KAAK,SAAUA,KACvBD,IAAI/pC,EAAGgqC,IACT,IAAG,SAAUvqC,GACXozB,KAAK7yB,GAAK,CACRszG,OAAQ,WACR5pE,OAAQjqC,GAEU,KAAd+3B,WACJ1H,QAAQ+C,KAEZ,GAGJ,CACAA,KAAK7yB,GAAK,CACRszG,OAAQ,YACRvgG,MAAOi3B,KAEW,KAAdxS,WACJ1H,QAAQ+C,KAEZ,CACA,IAAK,IAAI7yB,EAAI,EAAGA,EAAI6yB,KAAK5yB,OAAQD,IAC/B+pC,IAAI/pC,EAAG6yB,KAAK7yB,GAEhB,GACF,EAkNA82H,UAAUhnG,QAAU,SAAU/c,OAC5B,OAAIA,OAA8B,WAArBwS,UAAUxS,QAAuBA,MAAM4S,cAAgBmxG,UAC3D/jH,MAEF,IAAI+jH,WAAU,SAAUhnG,SAC7BA,QAAQ/c,MACV,GACF,EACA+jH,UAAUltF,OAAS,SAAU72B,OAC3B,OAAO,IAAI+jH,WAAU,SAAUhnG,QAAS8Z,QACtCA,OAAO72B,MACT,GACF,EACA+jH,UAAU7sF,KAAO,SAAUH,KACzB,OAAO,IAAIgtF,WAAU,SAAUhnG,QAAS8Z,QACtC,IAAKre,QAAQue,KACX,OAAOF,OAAO,IAAIjX,UAAU,kCAE9B,IAAK,IAAI3yB,EAAI,EAAGupC,IAAMO,IAAI7pC,OAAQD,EAAIupC,IAAKvpC,IACzC82H,UAAUhnG,QAAQga,IAAI9pC,IAAIopC,KAAKtZ,QAAS8Z,OAE5C,GACF,EAGAktF,UAAUjuF,aAEc,mBAAjBqB,cAA+B,SAAUplC,IAE9ColC,aAAaplC,GACf,GAAK,SAAUA,IACb8xH,eAAe9xH,GAAI,EACrB,EACAgyH,UAAUxtF,sBAAwB,SAA+Ba,KACxC,oBAAZC,SAA2BA,SACpCA,QAAQC,KAAK,wCAAyCF,IAE1D,EAEA,IAulBImtF,qBAtlBAC,yBAA2Bh5H,OAAOi5H,aAAej5H,OAAOi5H,YAAYC,MAAQl5H,OAAOi5H,YAAYj1B,SAAWhkG,OAAOi5H,YAAYE,iBA2D7HC,gCAzCe,SAAsBC,YACvC,GAAKL,yBAGL,IACEh5H,OAAOi5H,YAAYC,KAAKG,WAC1B,CAAE,MAAOn4H,GAET,CACF,EAgCIk4H,iCA/BgB,SAAuBE,YAAaC,UAAWC,SACjE,GAAKR,yBAGL,IAEMQ,QACFx5H,OAAOi5H,YAAYj1B,QAAQs1B,YAAaC,UAAWC,SAEnDx5H,OAAOi5H,YAAYj1B,QAAQs1B,YAAaC,UAE5C,CAAE,MAAOr4H,GAET,CACF,EAiBIk4H,mCAhBkB,SAAyBK,cAC7C,IAAKT,yBACH,MAAO,GAET,IAAIU,QAAU,GAUd,OATAD,aAAa72H,SAAQ,SAAU02H,aAC7B,IAAIK,gBAhDiB,SAA4BL,aACnD,IAAKN,yBACH,OAJ0B,EAM5B,IAGE,IAFA,IAAIW,iBAPsB,EAQtBC,SAAW55H,OAAOi5H,YAAYE,iBAAiB,WAC1C13H,EAAI,EAAGA,EAAIm4H,SAASl4H,OAAQD,IAC/Bm4H,SAASn4H,GAAG6C,OAASg1H,cACvBK,gBAAkBC,SAASn4H,GAAGqwC,UAGlC,OAAOviC,KAAK8kC,MAAMslF,gBACpB,CAAE,MAAOz4H,GACP,OAhB0B,CAiB5B,CACF,CAgC0B24H,CAAmBP,cAlDf,IAmDtBK,iBACFD,QAAQ90H,KAAK,CACXN,KAAMg1H,YACN/sD,KAAMotD,iBAGZ,IACOD,OACT,EAOII,iBAAmB,CAAC,EACpBC,+BAAgC,EAChCC,kBAAoB,SAA2B94H,GAEjD,GAAKA,EAAE8mB,MAAkC,mBAAnB9mB,EAAE8mB,KAAKxS,UAAsE,IAA5CtU,EAAE8mB,KAAKxS,QAAQ,wBAAtE,CAGA,IAAI8c,QAAUtyB,OAAOq+E,KAAKiY,MAAMp1F,EAAE8mB,MAC9B8xG,iBAAiBxnG,QAAQ2nG,uBAC3BH,iBAAiBxnG,QAAQ2nG,sBAAsBx5H,KAAKqC,KAAMwvB,QAAQtK,KAHpE,CAKF,EAYIkyG,4BAA8B,WAC3BH,gCAGD/5H,OAAOgH,oBACThH,OAAOgH,oBAAoB,UAAWgzH,mBAAmB,GAEzDh6H,OAAO4G,YAAY,YAAaozH,mBAElCD,+BAAgC,EAClC,EACII,sCACW,SAAqBtzH,UAAWuzH,kBAtBzCL,gCAGA/5H,OAAO8G,iBACT9G,OAAO8G,iBAAiB,UAAWkzH,mBAAmB,GAEtDh6H,OAAOq6H,YAAY,YAAaL,mBAElCD,+BAAgC,GAgB9BD,iBAAiBjzH,WAAauzH,gBAChC,EAJED,yCAKc,SAAwBtzH,WAClCizH,iBAAiBjzH,mBACZizH,iBAAiBjzH,WAEmB,IAAzCvG,OAAOmpB,KAAKqwG,kBAAkBp4H,QAChCw4H,6BAEJ,EAqBEI,yBAdc,SAAqBzzH,UAAW0zH,OAAQvyG,MACxD,IAAIsK,QAAU,CAAC,EACfA,QAAQ2nG,qBAAuBpzH,UAC3B2sH,oBAAoBhG,qBACtBl7F,QAAQkoG,SAAWhH,oBAAoBhG,oBAErCxlG,OACFsK,QAAQtK,KAAOA,MAEjBhoB,OAAOkoF,IAAIuyC,YAAYz6H,OAAOq+E,KAAKq8C,UAAUpoG,SAAUioG,OACzD,EAIID,wBAHa,WACf,OAAOt6H,SAAWA,OAAOkoF,GAC3B,EAMIyyC,qBAAuB,SAA8BlG,aACvD,IAAImG,gBAAkBnG,YAAYnqH,MAAMmqH,YAAYj/G,QAAQ,KAAO,GAAGyoB,MAAM,KACxE28F,iBAAmBA,gBAAgBl5H,OAAS,GAC9C8xH,oBAAoBmB,iCAAiCiG,gBAEzD,EAKIC,uBAAyB,SAAgC7yG,MAC3DmyG,yCAAyC,qBACzCQ,qBAAqB3yG,KACvB,EACI8yG,0BACK,WACLH,qBAAqBxe,iCACjBme,4BAVNH,sCAAsC,oBAAqBU,wBAC3DP,yBAAyB,wBAAyB,KAYlD,EAGES,UAAYz6H,OAAO2X,OAAO,CAC5BumE,KAAM,OACND,IAAK,MACL0hC,IAAK,MACL+a,QAAS,UACTC,IAAK,MACLt8C,IAAK,MACLC,IAAK,MACLs8C,SAAU,WACVr8C,QAAS,UACTs8C,cAAe,gBACfC,eAAgB,mBA+BdC,eA5BQ,SAAeC,MAAOh1H,KAAMwuG,SAAUymB,KAChD,IAAIC,OAASF,MACTzkE,MAAQvwD,KACRm1H,UAAY3mB,SACZ4mB,KAAOH,IACX,OAAOj7H,OAAOsX,iBAAiB,CAAC,EAAG,CACjC0jH,MAAO,CACLh4H,IAAK,WACH,OAAOk4H,MACT,GAEFl1H,KAAM,CACJhD,IAAK,WACH,OAAOuzD,KACT,GAEFi+C,SAAU,CACRxxG,IAAK,WACH,OAAOm4H,SACT,GAEFF,IAAK,CACHj4H,IAAK,WACH,OAAOo4H,IACT,IAGN,EAMIC,iBAAmB,SAA0Bv8D,UAC/C,OAAOA,SAASnhC,MAAM,KAAK,GAAGA,MAAM,KAAK,GAAGA,MAAM,KAAKhW,MAAMiU,aAC/D,EAqCI0/F,sBAAwB,SAA+B9mB,UACzD,OAAQA,UACN,KAAK12B,cAAcE,IACjB,OAAOy8C,UAAUG,SACnB,KAAK98C,cAAcG,IACjB,OAAOw8C,UAAUx8C,IACnB,KAAKH,cAAcI,KACjB,OAAOu8C,UAAUv8C,KACnB,KAAKJ,cAAcK,IACjB,OAAOs8C,UAAU9a,IACnB,KAAK7hC,cAAcO,IACjB,OAAOo8C,UAAUp8C,IACnB,KAAKP,cAAcQ,IACjB,OAAOm8C,UAAUn8C,IACnB,KAAKR,cAAcM,KACjB,OAAOq8C,UAAUE,IACnB,QACE,OAAOF,UAAUl8C,QAEvB,EA8HIg9C,yBA7GkB,SAAyBC,cAC7C,IACIC,OADAC,WAAa,GAEbC,wBAA0B,GAuB1BC,oBAAsB,SAA6BC,oBAAqB50G,OAC1E,OAAO,IAAIgxG,WAAU,SAAUhnG,QAAS8Z,QACtC,IA5C2C+wF,YA4CvCC,MA5CuCD,YA4CfD,oBA3CzB/gB,EAAE3H,KAAK,CACZntG,KAAM,MACNusG,IAAKupB,YACLtpB,SAAS,EACThB,SAAU,UAwCRuqB,KAAKnxF,MAAK,SAAUljB,MAzBL,IAAsBs0G,2BA0BtBt0G,KAzBV,IAAIuwG,WAAU,SAAUhnG,QAAS8Z,QACtC,IAAIkxF,sBAAwB,GACxBC,cAAgB,GACIF,aAAar+F,MAAM,UAAU1zB,QAAO,SAAUiK,OACpE,MAAiB,KAAVA,KACT,IACkB5R,SAAQ,SAAUgkH,SAAUr/F,OAC5Cg1G,sBAAsB33H,KAAK63H,cAAc7V,SAAU4V,cAAej1G,OACpE,IACAgxG,UAAUjtF,IAAIixF,uBAAuB1xF,MAAK,WACxCtZ,QAAQirG,cACV,IAAU,OAAE,WACVnxF,OAAO,2DACT,GACF,KAWuBR,MAAK,SAAU6xF,eAChC,IAAIpB,MAAQD,eAAeqB,cAAe3B,UAAUG,SAAU98C,cAAcE,IAAK69C,qBACjFH,WAAWz0G,OAAS+zG,MACpB/pG,QAAQ+pG,MACV,IAAU,OAAE,WACVjwF,QACF,GACF,IACAgxF,KAAK9qC,MAAK,WACRlmD,OAAO,yCAA2C8wF,oBAAsB,IAC1E,GACF,GACF,EACIM,cAAgB,SAAuB1I,YAAa4I,UAAWp1G,OACjE,OAAO,IAAIgxG,WAAU,SAAUhnG,QAAS8Z,QACtC,IAAIiwF,MAAQ,KACZ,GAAI9H,oBAAoBhF,iBACtB8M,MAAQD,eAAetH,YAAa6H,sBAAsBpI,oBAAoBhF,kBAAmBgF,oBAAoBhF,iBAAkBuF,aACvI4I,UAAUp1G,OAAS+zG,MACnB/pG,QAAQ+pG,WACH,CACL,IAAIsB,iBA9GyB,SAAwCC,KAC3E,OAAQA,KACN,IAnBe,MAoBb,OAAOz+C,cAAcE,IACvB,IAAK,MACL,IAAK,MACL,IAAK,MACH,OAAOF,cAAcG,IACvB,IAAK,OACH,OAAOH,cAAcI,KACvB,IAAK,MACH,OAAOJ,cAAcK,IACvB,IAAK,MACL,IAAK,OACH,OAAOL,cAAcM,KACvB,IAAK,MACH,OAAON,cAAcO,IACvB,IAAK,MACH,OAAOP,cAAcQ,IACvB,QACE,OAAOR,cAAcS,QAE3B,CAwF+Bi+C,CAA+BnB,iBAAiB5H,cACnE6I,mBAAqBx+C,cAAcS,QA5HR,SAA0Ck1C,aAC/E,OAAO,IAAIwE,WAAU,SAAUhnG,SAC7B6pF,EAAE3H,KAAK,CACLntG,KAAM,OACNusG,IAAKkhB,cACJ7oF,MAAK,SAAUljB,KAAM+0G,WAAY9qB,OAClC,IAAI51E,YAAc41E,MAAMyC,kBAAkB,iBAAmBt2B,cAAcS,QAC3EttD,QAAQ8K,YACV,IAAGk1D,MAAK,WACNhgE,QAAQ6sD,cAAcS,QACxB,GACF,GACF,CAiHUm+C,CAAiCjJ,aAAalpF,MAAK,SAAUiqE,UACvDA,WAAa12B,cAAcS,SAC7By8C,MAAQD,eAAetH,YAAa6H,sBAAsB9mB,UAAWA,SAAUif,aAC/E4I,UAAUp1G,OAAS+zG,MACnB/pG,QAAQ+pG,QAERjwF,OAAO,kDAAoD0oF,YAAc,IAE7E,KAEAuH,MAAQD,eAAetH,YAAa6H,sBAAsBgB,kBAAmBA,iBAAkB7I,aAC/F4I,UAAUp1G,OAAS+zG,MACnB/pG,QAAQ+pG,OAEZ,CACF,GACF,EACI2B,WAAa,SAAoBlJ,YAAaxsG,OAEhD,MADmB,0BACFgD,KAAKwpG,aAnDA,SAA2BmJ,mBAAoB31G,OACrE,IAAI+zG,MAAQD,eAAe6B,mBAAoBnC,UAAUC,QAAS58C,cAAcS,QAASq+C,oBAEzF,OADAlB,WAAWz0G,OAAS+zG,MACb/C,UAAUhnG,QAAQ+pG,MAC3B,CAgDW6B,CAAkBpJ,YAAaxsG,OArJzB,QAuJXo0G,iBAAiB5H,aACZmI,oBAAoBnI,YAAaxsG,OAEnCk1G,cAAc1I,YAAaiI,WAAYz0G,MAChD,EAKA,OAJAu0G,aAAal5H,SAAQ,SAAU2B,OAAQgjB,OACrC00G,wBAAwBr3H,KAAKq4H,WAAW14H,OAAQgjB,OAClD,IACAw0G,OAASxD,UAAUjtF,IAAI2wF,yBAChB37H,OAAOsX,iBAAiB,CAAC,EAAG,CAOjC+kH,UAAW,CACTr5H,IAAK,WACH,MAAO,GAAGyJ,OAAOivH,WACnB,GAQFjsC,MAAO,CACLzsF,IAAK,WACH,OAAOy4H,MACT,IAGN,EA6LIqB,mBAzKY,SAAmBtB,cACjC,IAAIuB,qBACAC,oBAKAC,iBAEAvB,WANAwB,cAAgB,IAAIjF,WAAU,SAAUhnG,QAAS8Z,QACnDgyF,qBAAuB9rG,QACvB+rG,oBAAsBjyF,MACxB,IAEIoyF,mBAAqB,GAEzBF,iBAAmB1B,yBAAyBC,eAC3B/rC,MAAMllD,MAAK,WAC1BmxF,WAAauB,iBAAiBZ,UAAU,GAAGr2H,OAASy0H,UAAUG,SAAWqC,iBAAiBZ,UAAU,GAAGrB,MAAQiC,iBAAiBZ,UAChIU,sBACF,IAAU,OAAE,WACVC,qBACF,IAkCA,OAAOh9H,OAAOsX,iBAAiB,CAQ7B8lH,mBAzCuB,SAA4BnC,KACnD,IAAIoC,YAAc,EAOlB,OANA3B,WAAWt1G,MAAK,SAAU40G,MAAO/zG,OAI/B,OAHI+zG,MAAMC,MAAQA,MAChBoC,WAAap2G,OAER+zG,MAAMC,MAAQA,GACvB,IACOoC,UACT,EAwCEC,qBAvCyB,SAA8Bt3H,MACvD,OAAO01H,WAAWt1G,MAAK,SAAU40G,OAC/B,OAAOh1H,OAASg1H,MAAMh1H,IACxB,GACF,GAoCG,CAODypF,MAAO,CACLzsF,IAAK,WACH,OAAOk6H,aACT,GAQFK,aAAc,CACZv6H,IAAK,WACH,OAAO04H,WAAWyB,mBACpB,GAOFK,kBAAmB,CACjBx6H,IAAK,WACH,OAAOm6H,kBACT,EACAx6H,IAnEuB,SAA8B86H,eAgBvD,MAf6B,iBAAlBA,cACa,SAAlBA,cACEN,mBAAqBzB,WAAWt6H,OAAS,GAC3C+7H,qBAEyB,aAAlBM,eACLN,mBAAqB,GACvBA,qBAG8B,iBAAlBM,eACZA,eAAiB,GAAKA,cAAgB/B,WAAWt6H,SACnD+7H,mBAAqBM,eAGlBN,kBACT,GA0DEd,UAAW,CACTr5H,IAAK,WACH,OAAO04H,UACT,GAQFgC,iBAAkB,CAChB16H,IAAK,WACH,OAAO04H,WAAWyB,oBAAoBn3H,IACxC,GAQF23H,aAAc,CACZ36H,IAAK,WACH,OAA8B,IAAvBm6H,kBACT,GAQFS,YAAa,CACX56H,IAAK,WACH,OAAOm6H,mBAAqB,IAAMzB,WAAWt6H,MAC/C,GAQFy8H,SAAU,CACR76H,IAAK,WACH,OAAO04H,WAAW,GAAG11H,OAASy0H,UAAUE,KAAOe,WAAW,GAAG11H,OAASy0H,UAAUn8C,KAAOo9C,WAAW,GAAG11H,OAASy0H,UAAUp8C,GAC1H,GAQFy/C,WAAY,CACV96H,IAAK,WACH,OAAOi6H,iBAAiBZ,UAAU,GAAGr2H,OAASy0H,UAAUG,QAC1D,IAGN,EAaImD,WAAa/9H,OAAO2X,OAAO,CAC7BqmH,YAAa,QACbtD,QAAS,UACTuD,MAAO,QACPC,cAAe,kBAyBbC,oCACa,SAAuB9B,WACpC,OAAO5D,uBAAyBA,qBAtBf,SAAuB4D,WAC1C,IAAI+B,UAAY/B,UAAUwB,SACtBQ,mBAAqBhC,UAAUiB,qBAAqB7C,UAAUv8C,OAASm/B,WAAWiB,cAClFggB,kBAAoBjC,UAAUiB,qBAAqB7C,UAAUx8C,MAAQo/B,WAAWe,aAChFmgB,kBAAoBlC,UAAUiB,qBAAqB7C,UAAU9a,MAAQtC,WAAWgB,aAChFmgB,oBAAsBnC,UAAUiB,qBAAqB7C,UAAUC,SACnE,OAAIrd,WAAWM,QAAwC,OAA9BN,WAAWQ,gBAA2BR,WAAWQ,gBAPvD,EAQVkgB,WAAWG,cAEhBM,oBACKT,WAAWrD,QAEhB2D,oBAAsBC,mBAAqBC,kBACtCR,WAAWC,YAEhBI,UACKL,WAAWE,MAEbF,WAAWG,aACpB,CAG2DO,CAAepC,WACxE,EAoEEqC,WAAa1+H,OAAOsX,iBAAiB,CAAC,EAAG,CAC3CqnH,qBAAsB,CACpBzqH,MAhEwB,mBAkE1B0qH,aAAc,CACZ1qH,MAlEgB,iBAoElB2qH,YAAa,CACX3qH,MApEe,gBAsEjB4qH,+BAAgC,CAC9B5qH,MAtEkC,qCAwEpC6qH,sBAAuB,CACrB7qH,MAxEyB,2BA0E3B8qH,kBAAmB,CACjB9qH,MA1EqB,uBA4EvBmkF,KAAM,CACJnkF,MA3EQ,QA6EV+qH,YAAa,CACX/qH,MA7Ee,gBA+EjBgrH,mBAAoB,CAClBhrH,MA/EsB,wBAiFxBirH,sBAAuB,CACrBjrH,MAjFyB,2BAmF3BwxE,SAAU,CACRxxE,MAxFY,mBA0FdkrH,eAAgB,CACdlrH,MAtFkB,mBAwFpBmrH,uBAAwB,CACtBnrH,MAxF0B,6BA0F5BorH,qBAAsB,CACpBprH,MA1FwB,2BA4F1BqrH,wBAAyB,CACvBrrH,MA5F2B,8BA8F7BsrH,sBAAuB,CACrBtrH,MA9FyB,4BAgG3BurH,gBAAiB,CACfvrH,MAhGmB,qBAkGrBwrH,iBAAkB,CAChBxrH,MAlGoB,sBAoGtByrH,sBAAuB,CACrBzrH,MApGyB,2BAsG3B0rH,4BAA6B,CAC3B1rH,MAtG+B,kCAwGjC2rH,qBAAsB,CACpB3rH,MAxGwB,2BA0G1B4rH,2BAA4B,CAC1B5rH,MA1G8B,kCA4GhC6rH,kBAAmB,CACjB7rH,MA1G2B,uBA4G7B8rH,4BAA6B,CAC3B9rH,MA5G+B,kCA8GjC+rH,kCAAmC,CACjC/rH,MA9GqC,yCAgHvCgsH,yBAA0B,CACxBhsH,MAhH4B,wBAkH9BisH,mCAAoC,CAClCjsH,MAlHsC,+BAoHxCksH,+BAAgC,CAC9BlsH,MApHkC,+BAsHpCmsH,yCAA0C,CACxCnsH,MAtH4C,sCAwH9CosH,eAAgB,CACdpsH,MAxHkB,oBA0HpBqsH,qBAAsB,CACpBrsH,MA1HwB,2BA4H1BssH,oBAAqB,CACnBtsH,MA5HuB,yBA8HzBusH,0BAA2B,CACzBvsH,MA9H6B,gCAgI/BwsH,eAAgB,CACdxsH,MAhIkB,mBAkIpBysH,qBAAsB,CACpBzsH,MAlIwB,0BAoI1B0sH,yBAA0B,CACxB1sH,MApI4B,8BAsI9B2sH,2BAA4B,CAC1B3sH,MAtI8B,WAwIhC4sH,eAAgB,CACd5sH,MAxIkB,mBA0IpB6sH,kBAAmB,CACjB7sH,MA1IqB,cA4IvB8sH,4BAA6B,CAC3B9sH,MA5I+B,uBA8IjC+sH,kBAAmB,CACjB/sH,MA9IqB,0BAgJvBgtH,mBAAoB,CAClBhtH,MAhJsB,uBAkJxBitH,yBAA0B,CACxBjtH,MAlJ4B,oBAoJ9BktH,4BAA6B,CAC3BltH,MApJ+B,uBAsJjCmtH,4BAA6B,CAC3BntH,MAtJ+B,qBAwJjCotH,8BAA+B,CAC7BptH,MAxJiC,uBA0JnCqtH,6BAA8B,CAC5BrtH,MA1JgC,sBA4JlCstH,uBAAwB,CACtBttH,MA5J0B,2BA8J5ButH,wBAAyB,CACvBvtH,MA9J2B,oBAgK7BwtH,2BAA4B,CAC1BxtH,MAhK8B,wBAkKhCytH,eAAgB,CACdztH,MAlKkB,eAoKpB0tH,eAAgB,CACd1tH,MApKkB,eAsKpB2tH,+BAAgC,CAC9B3tH,MAtKkC,mBAwKpC4tH,gBAAiB,CACf5tH,MAxKmB,qBA0KrB6tH,4BAA6B,CAC3B7tH,MA1K+B,kCA4KjC8tH,yBAA0B,CACxB9tH,MA5K4B,iBA8K9B+tH,qBAAsB,CACpB/tH,MA9KwB,0BAgL1BguH,qBAAsB,CACpBhuH,MAhLwB,0BAkL1BiuH,oBAAqB,CACnBjuH,MAlLuB,yBAoLzBkuH,iBAAkB,CAChBluH,MApLoB,sBAsLtBmuH,uBAAwB,CACtBnuH,MA9N0B,6BAgO5BouH,6BAA8B,CAC5BpuH,MAhOgC,sCAoOhCquH,aAAeviI,OAAOsX,iBAAiB,CAAC,EAAG,CAC7CkrH,YAAa,CACXtuH,MAAO,kBAETuuH,aAAc,CACZvuH,MAAO,mBAETwuH,oBAAqB,CACnBxuH,MAAO,2BAETyuH,qBAAsB,CACpBzuH,MAAO,4BAET0uH,0BAA2B,CACzB1uH,MAAO,kCAET2uH,gCAAiC,CAC/B3uH,MAAO,yCAET4uH,mBAAoB,CAClB5uH,MAAO,0BAET6uH,oBAAqB,CACnB7uH,MAAO,2BAET8uH,yBAA0B,CACxB9uH,MAAO,iCAET+uH,+BAAgC,CAC9B/uH,MAAO,wCAETgvH,kBAAmB,CACjBhvH,MAAO,kCAETivH,qBAAsB,CACpBjvH,MAAO,4BAETkvH,qBAAsB,CACpBlvH,MAAO,4BAETmvH,aAAc,CACZnvH,MAAO,sBA8SPovH,8BAnSuB,SAA8BC,gBACvD,IAAIC,gBAAkBD,eAClBE,yBAA2B,KAC3BC,uBAAyB,KACzBC,sBAAwB,EACxBC,uBAAyB,EACzBC,4BAA8B,EAC9BC,gBAAkB,EAClBC,iBAAmB,EACnBC,sBAAwB,EACxBC,6BAA+B,KAC/BC,iCAAmC,KACnCC,eAAgB,EAChBC,wBAA0B,SAAiCC,mBAAoBC,oBAKjF,OAAOr1H,KAAK8kC,MAAMswF,sBAAwBp1H,KAAK8kC,MAAMiT,WAAWw8E,gBAAgB,GAAGt0D,MAAMuzB,iBAAiB6hC,oBAAqB,IACjI,EACAL,6BAA+B,IAAIM,gBAAe,YAC3CJ,eAAiBC,wBAAwBZ,gBAAgB7hI,QAAS4gI,aAAaC,cAAgB4B,wBAAwBZ,gBAAgB5hI,SAAU2gI,aAAaE,gBAGnK0B,eAAgB,EAChBK,0BACAhB,gBAAgB,GAAGt0D,MAAMi5B,YAAYo6B,aAAaC,YAAa,GAAG/1H,OAAO+2H,gBAAgB7hI,QAAS,OAClG6hI,gBAAgB,GAAGt0D,MAAMi5B,YAAYo6B,aAAaE,aAAc,GAAGh2H,OAAO+2H,gBAAgB5hI,SAAU,OACpG4hI,gBAAgBroC,QAAQ/2F,OAAO+W,SAAS9B,cAC1C,IACA6qH,iCAAmC,IAAIK,gBAAe,WACpDE,mCACAC,gBAAgBlB,gBAAgB,IAChCA,gBAAgBroC,QAAQ/2F,OAAO+W,SAASe,YAC1C,IACA,IAAIyoH,uBAAyB3kI,OAAO2X,OAAO,CACzC,eAAgB,CACdhW,MAAO,EACPC,OAAQ,GAEV,gBAAiB,CACfD,MAAO,IACPC,OAAQ,KAEV,gBAAiB,CACfD,MAAO,IACPC,OAAQ,KAEV,iBAAkB,CAChBD,MAAO,IACPC,OAAQ,OAeR6iI,iCAAmC,WACrC,GAAKhB,0BAAgD,IAApBK,iBAA8C,IAArBC,iBAA1D,CAGA,IAAIa,cAAgBnB,yBAAyB9hI,QACzCkjI,eAAiBpB,yBAAyB7hI,SACxB,IAAlBgjI,eAA0C,IAAnBC,iBAGvBT,wBAAwBQ,cAAerC,aAAaO,qBAAuBsB,wBAAwBS,eAAgBtC,aAAaQ,wBAKpIc,6BAFAF,sBAAwBiB,gBACxBhB,uBAAyBiB,iBAcSb,uBAEhCN,uBAAuB/0B,SAAS+vB,WAAWwD,sBAC3CwB,uBAAuB30B,YAAY2vB,WAAWyD,uBAG9CuB,uBAAuB/0B,SAAS+vB,WAAWyD,qBAC3CuB,uBAAuB30B,YAAY2vB,WAAWwD,wBA/BhD,CAiCF,EACIwC,gBAAkB,SAAyBI,cAC7CA,aAAa51D,MAAMi5B,YAAYo6B,aAAaG,oBAAqB,GAAGj2H,OAAOq3H,gBAAiB,OAC5FgB,aAAa51D,MAAMi5B,YAAYo6B,aAAaI,qBAAsB,GAAGl2H,OAAOs3H,iBAAkB,OAC9Fe,aAAa51D,MAAMi5B,YAAYo6B,aAAaK,0BAA2B,GAAGn2H,OAAOq3H,gBAAiB,OAAOr3H,OAAOs3H,mBAChHe,aAAa51D,MAAMi5B,YAAYo6B,aAAaM,gCAAiC,GAAGp2H,OAAOu3H,wBACzD,IAA1BL,uBAA0D,IAA3BC,yBACjCkB,aAAa51D,MAAMi5B,YAAYo6B,aAAaO,mBAAoB,GAAGr2H,OAAOk3H,sBAAuB,OACjGmB,aAAa51D,MAAMi5B,YAAYo6B,aAAaQ,oBAAqB,GAAGt2H,OAAOm3H,uBAAwB,OACnGkB,aAAa51D,MAAMi5B,YAAYo6B,aAAaS,yBAA0B,GAAGv2H,OAAOwC,KAAK8kC,MAAM4vF,uBAAwB,OAAOl3H,OAAOwC,KAAK8kC,MAAM6vF,0BAC5IkB,aAAa51D,MAAMi5B,YAAYo6B,aAAaU,+BAAgC,GAAGx2H,OAAOo3H,8BAE1F,EAaIW,wBAA0B,WAC5B,GAAKhB,gBAAL,CAGA,IAAIuB,eAAiBvB,gBAAgB7hI,QACjCqjI,gBAAkBxB,gBAAgB5hI,SACtCk5G,EAAEv6B,KAAKokD,wBAAwB,SAAUxwH,IAAK8wH,YAC5C,IAAIC,eAAiB,CAAC/wH,IAAK,SAAS8rB,KAAK,KACrCklG,gBAAkB,CAAChxH,IAAK,UAAU8rB,KAAK,KACvCglG,WAAWtjI,OAASojI,eAAiBE,WAAWtjI,MAClD6hI,gBAAgB70B,SAASu2B,gBAEzB1B,gBAAgBz0B,YAAYm2B,gBAE1BD,WAAWrjI,QAAUojI,gBAAkBC,WAAWrjI,OACpD4hI,gBAAgB70B,SAASw2B,iBAEzB3B,gBAAgBz0B,YAAYo2B,gBAEhC,GAhBA,CAiBF,EAcA,OAAOnlI,OAAOsX,iBAAiB,CAO7B8tH,qBAzGyB,WACzBnB,6BAA6Bv4H,QAAQ83H,gBAAgB,GACvD,EAkHE6B,yBAhE6B,SAAkCC,wBAAyBC,sBAAuBC,eAAgBC,iBAC/HhC,yBAA2B6B,wBAC3B5B,uBAAyB6B,sBACrBC,eAAiB,GAAKC,gBAAkB,IAC1C3B,gBAAkB0B,eAClBzB,iBAAmB0B,gBACnBzB,sBAAwByB,gBAAkBD,eAAiBC,gBAAkB,GAE/EhB,mCACAC,gBAAgBlB,gBAAgB,IAChCU,iCAAiCx4H,QAAQ+3H,yBAAyB,GACpE,EA8DEiC,0BAtI8B,SAAmCF,eAAgBC,iBACzD,IAApB3B,iBAA8C,IAArBC,mBAC3BD,gBAAkB0B,eAClBzB,iBAAmB0B,gBACnBzB,sBAAwBwB,eAAiBC,iBAE3ChB,mCACAC,gBAAgBnB,eAAe,GACjC,EAqIEoC,uBA/C2B,WAC3B1B,6BAA6B2B,aAC7B1B,iCAAiC0B,aAIjCjC,sBAAwB,EACxBC,uBAAyB,EACzBC,4BAA8B,EAC9BC,gBAAkB,EAClBC,iBAAmB,EACnBC,sBAAwB,CAC1B,GAoCG,CACD6B,sBAAuB,CACrB7iI,IAAK,WACH,OAAO2hI,sBACT,GAQFmB,kBAAmB,CACjB9iI,IAAK,WACH,OAAO0gI,uBAAuB/hI,OAChC,GAQFokI,mBAAoB,CAClB/iI,IAAK,WACH,OAAO0gI,uBAAuB9hI,QAChC,GAQFokI,oBAAqB,CACnBhjI,IAAK,WACH,OAAO8gI,eACT,GAQFmC,qBAAsB,CACpBjjI,IAAK,WACH,OAAO+gI,gBACT,GAQFmC,0BAA2B,CACzBljI,IAAK,WACH,OAAOghI,qBACT,GAQFmC,qBAAsB,CACpBnjI,IAAK,WACH,OAAO2gI,qBACT,GAQFyC,sBAAuB,CACrBpjI,IAAK,WACH,OAAO4gI,sBACT,GAQFyC,2BAA4B,CAC1BrjI,IAAK,WACH,OAAO6gI,2BACT,IAGN,EAiBIyC,WAAatmI,OAAO2X,OAAO,CAC7B4uH,KALc,OAMdC,IALa,MAMbpiH,MALe,QAMfqiH,YALqB,cAMrBvgH,QAAS,SAAiBlgB,MACxB,MAVY,SAULA,MATI,QASkBA,MARhB,UAQqCA,MAP/B,gBAOsDA,IAC3E,IAmEE0gI,2BAtDoB,SAA2BC,iBAAkBC,aACnE,IAAIC,kBAAoBF,iBACpBl2F,WAAam2F,YAAYv1F,UACzBy1F,YAAcF,YAAYv1F,UAbN,IAcpB01F,UAAYH,YAAYv1F,UAbN,IAclB21F,cAAe,EACnB,OAAOhnI,OAAOsX,iBAAiB,CAAC,EAAG,CACjCqvH,iBAAkB,CAChB3jI,IAAK,WACH,OAAO6jI,iBACT,EACAlkI,IAAK,SAAaskI,eAChBJ,kBAAoBI,aACtB,GAEFC,WAAY,CACVlkI,IAAK,WACH,OAAO8jI,WACT,EACAnkI,IAAK,SAAaukI,YAChBJ,YAAcI,UAChB,GAEFC,SAAU,CACRnkI,IAAK,WACH,OAAO+jI,SACT,EACApkI,IAAK,SAAawkI,UAChBJ,UAAYI,QACd,GAEF91F,UAAW,CACTruC,IAAK,WACH,OAAOytC,UACT,EACA9tC,IAAK,SAAaspE,MAChBx7B,WAAaw7B,IACf,GAEFqoB,UAAW,CACTtxF,IAAK,WACH,OAAO4jI,YAAYtyC,SACrB,GAEF8yC,YAAa,CACXpkI,IAAK,WACH,OAAO4jI,YAAYtyC,WAAa0yC,YAClC,EACArkI,IAAK,SAAaykI,aAChBJ,aAAeI,WACjB,IAGN,EAcIC,aAAernI,OAAO2X,OAAO,CAC/B2vH,QAAS,OACTC,OAAQ,KACRC,MAAO,UAkLLC,kBAvKW,SAAkBC,oBAC/B,IACIC,cACAC,mBAEApxE,eAGmCxwD,KAAM2wD,cAAeC,QAPxDixE,WAAY,EAGZC,iBAAmB,EAEnBC,iBAAkB,EAClBC,yBAA0B,EACShiI,KAGf0hI,mBAAmB1hI,KAHE2wD,cAGI+wE,mBAAmB/wE,cAHRC,QAGuB8wE,mBAAmB9wE,QAAtGixE,UAFS7hI,OAASqhI,aAAaE,QAAU5wE,eAAiBA,cAAgB,GAAK3wD,OAASqhI,aAAaC,SAAW1wE,QAAQx1D,OAAS,EAGjIo1D,eAAiBkxE,mBAAmB/wE,cA2DpC,OAAO32D,OAAOsX,iBAAiB,CAC7B2wH,OA3DW,WACX,MAAO,CACLz1H,GAAIk1H,mBAAmBl1H,GACvBxM,KAAM0hI,mBAAmB1hI,KACzBkiI,aAAcR,mBAAmBjoG,KACjC0oG,QAAST,mBAAmB9wE,QAAQ9sD,KAAI,SAAUs+H,QAChD,OAAOA,OAAO3oG,IAChB,IACAk3B,cAAeH,eAEnB,EAkDE6xE,YAjDgB,WAEhB,IAAIC,qBAAuBX,cAI3B,OAHID,mBAAmB1hI,OAASqhI,aAAaG,OAASG,gBACpDW,qBApC2B,OAsCtB,CACL91H,GAAIk1H,mBAAmBl1H,GACvB+1H,GAAIR,gBACJS,GAAIV,iBACJj/F,GAAIy/F,qBACJG,IAAKb,mBAET,EAqCEc,iBApCqB,SAA0BC,kBAC3CA,iBAAiBn2H,KAAOk1H,mBAAmBl1H,KAC7Cu1H,gBAAkBY,iBAAiBJ,GACnCT,iBAAmBa,iBAAiBH,GACpCb,cAAgBgB,iBAAiB9/F,GACjC++F,mBAAqBe,iBAAiBF,IAE1C,EA8BEG,mBA7BuB,SAA4BC,8BACnD,IAAIC,aAAe,CACjB9iI,KAAM0hI,mBAAmB1hI,KACzBwM,GAAIk1H,mBAAmBl1H,GACvBg/B,SAAUs2F,iBACVtyB,SAAUmyB,cACVoB,QAASnB,mBACToB,eAAgBH,8BAOlB,OAHInB,mBAAmB1hI,OAASqhI,aAAaE,QAA6B,IAAnB/wE,uBAC9CsyE,aAAaC,QAEfD,YACT,EAeEG,qBAdyB,SAA8Bp+F,QACvD,IAAIgsB,SAAW,KAMf,OALA6wE,mBAAmB7wE,SAASv0D,SAAQ,SAAU4mI,cACxCA,aAAar+F,SAAWA,SAC1BgsB,SAAWqyE,aAEf,IACOryE,QACT,GAOG,CACDrkD,GAAI,CACFxP,IAAK,WACH,OAAO0kI,mBAAmBl1H,EAC5B,GAEFxM,KAAM,CACJhD,IAAK,WACH,OAAO0kI,mBAAmB1hI,IAC5B,GAEFy5B,KAAM,CACJz8B,IAAK,WACH,OAAO0kI,mBAAmBjoG,IAC5B,GAEFk3B,cAAe,CACb3zD,IAAK,WACH,OAAOwzD,cACT,EACA7zD,IAAK,SAAag0D,eAChBH,eAAiBG,aACnB,GAEFC,QAAS,CACP5zD,IAAK,WACH,OAAO0kI,mBAAmB9wE,OAC5B,GAEFC,SAAU,CACR7zD,IAAK,WACH,OAAO0kI,mBAAmB7wE,QAC5B,GAEFsyE,SAAU,CACRnmI,IAAK,WACH,OAAO6kI,SACT,EACAllI,IAAK,SAAawmI,UAChBtB,UAAYsB,QACd,GAEFC,aAAc,CACZpmI,IAAK,WACH,OAAO2kI,aACT,EACAhlI,IAAK,SAAaymI,cACZrB,kBAGJJ,cAAgByB,aAClB,GAEFC,kBAAmB,CACjBrmI,IAAK,WACH,OAAO4kI,kBACT,EACAjlI,IAAK,SAAa0mI,mBAChBzB,mBAAqByB,iBACvB,GAEFC,gBAAiB,CACftmI,IAAK,WACH,OAAO8kI,gBACT,EACAnlI,IAAK,SAAa2mI,iBACZvB,kBAGJD,iBAAmBwB,gBACrB,GAEFC,eAAgB,CACdvmI,IAAK,WACH,OAAO+kI,eACT,EACAplI,IAAK,SAAa4mI,gBAChBxB,gBAAkBwB,cACpB,GAEFC,uBAAwB,CACtBxmI,IAAK,WACH,OAAOglI,uBACT,EACArlI,IAAK,SAAa6mI,wBAChBxB,wBAA0BwB,sBAC5B,IAGN,EAkKIC,qBA9Ic,SAAqBC,sBAAuBh0E,SAC5D,IAAIyB,WAAa,GACb1B,SAAWC,QACXi0E,8BAAgC,EAChCC,uBAAyB,EACzBC,yBAA2B,EAM3BC,qBAAuB,WACzBF,uBAAyB,EACzBC,yBAA2B,EAC3B1yE,WAAW70D,SAAQ,SAAUynI,UACvBA,SAASZ,SACXS,yBAEAC,0BAEJ,GACF,EA6CA,OA3DEH,sBAAsBtyE,UAAU90D,SAAQ,SAAU0nI,eAChD7yE,WAAW7yD,KAAKmjI,kBAAkBuC,eACpC,IAwDFF,uBACO9pI,OAAOsX,iBAAiB,CAC7B2wH,OA7CW,WACX,MAAO,CACLjkI,KAAM0lI,sBAAsB1lI,KAC5BimI,kBAAmBP,sBAAsBr4F,UACzCm2D,MAAO/xC,SACP2B,UAAWD,WAAWrtD,KAAI,SAAUigI,UAClC,OAAOA,SAAS9B,QAClB,IAEJ,EAqCEI,YApCgB,WAChB,MAAO,CACL17H,EAAG+8H,sBAAsB1lI,KACzBkmI,IAAKP,8BACL3zF,EAAGmhB,WAAWrtD,KAAI,SAAUigI,UAC1B,OAAOA,SAAS1B,aAClB,IAEJ,EA6BE8B,oBA5BwB,SAA6BC,qBACjDV,sBAAsB1lI,OAASomI,oBAAoBz9H,IACrDg9H,8BAAgCS,oBAAoBF,IACpDE,oBAAoBp0F,EAAE1zC,SAAQ,SAAUqmI,kBACtC,IAAK,IAAIxnI,EAAI,EAAGA,EAAIg2D,WAAW/1D,OAAQD,IACjCg2D,WAAWh2D,GAAGqR,KAAOm2H,iBAAiBn2H,IACxC2kD,WAAWh2D,GAAGunI,iBAAiBC,iBAGrC,IAEJ,EAkBEC,mBAjBuB,SAA4ByB,QACnD,IAAIC,gBAAkB,CAAC,EAQvB,OAPAA,gBAAgBD,OAASA,OACzBC,gBAAgB9iC,MAAQ/xC,SACxB60E,gBAAgBlzE,UAAYD,WAAWltD,QAAO,SAAU8/H,UACtD,OAAOA,SAASR,cAClB,IAAGz/H,KAAI,SAAUigI,UACf,OAAOA,SAASnB,mBAAmBe,8BACrC,IACO5rD,KAAKq8C,UAAUkQ,gBACxB,EAQER,sBACC,CACD9lI,KAAM,CACJhB,IAAK,WACH,OAAO0mI,sBAAsB1lI,IAC/B,GAEFumI,gBAAiB,CACfvnI,IAAK,WACH,OAAO0mI,sBAAsB7yE,QAC/B,GAEFxlB,UAAW,CACTruC,IAAK,WACH,OAAO0mI,sBAAsBr4F,SAC/B,GAEF+lB,UAAW,CACTp0D,IAAK,WACH,OAAOm0D,UACT,GAEF0yC,WAAY,CACV7mG,IAAK,WACH,OAAOm0D,WAAW/wC,MAAK,SAAU2jH,UAC/B,OAAOA,SAASR,cAClB,GACF,GAEFj1C,UAAW,CACTtxF,IAAK,WACH,OAAOm0D,WAAWqzE,OAAM,SAAUT,UAChC,OAAOA,SAASR,cAClB,GACF,GAEFV,6BAA8B,CAC5B7lI,IAAK,WACH,OAAO2mI,6BACT,EACAhnI,IAAK,SAAakmI,8BAChBc,8BAAgCd,4BAClC,GAEF4B,sBAAuB,CACrBznI,IAAK,WACH,OAAO4mI,sBACT,GAEFc,wBAAyB,CACvB1nI,IAAK,WACH,OAAO6mI,wBACT,GAEFc,uBAAwB,CACtB3nI,IAAK,WAIH,OAHuBm0D,WAAWltD,QAAO,SAAU8/H,UACjD,OAAOA,SAASZ,UAAYY,SAASV,iBACvC,IACwBjoI,MAC1B,GAEFwpI,cAAe,CACb5nI,IAAK,WACH,OAAOm0D,WAAW/wC,MAAK,SAAU2jH,UAC/B,OAAOA,SAASlzE,SAASz1D,OAAS,CACpC,GACF,IAGN,EAkRIypI,cA5PO,SAAcC,UACvB,IAAIC,gBACAhrE,UACAirE,aACAC,WACAC,QACAC,gBACA1zE,eACAI,UACAC,UAwB6Ca,cAvB7Cf,cAAgB0uE,WAAWC,KAC3B7uE,gBAAiB,EACjBK,aAAc,EACdG,cAAgB,GAChBkzE,oBAAsB,GACtBC,eAAiB,EACjB1zE,QAAU,GACVK,gBAAiB,EAmBjBszE,gBAAkB,SAAyBt6C,QACzCs1C,WAAWpgH,QAAQ8qE,UACrBp5B,cAAgBo5B,OAEpB,EA4FA,OA9EE+5C,gBAAkBD,SAASnpE,MAC3B5B,UAAY+qE,SAASzoE,SACrB2oE,aAAeF,SAAS1oE,QACxBzK,QAAUmzE,SAASS,WACnBN,WAAaH,SAASnpE,MACtBupE,QAAUJ,SAAS3yE,SACnBT,eAAiBozE,SAASU,kBAC1BzzE,YAAc+yE,SAASW,eACvBh0E,eAAiBqzE,SAASY,kBAC1B7zE,UAAYizE,SAASa,aACrB7zE,UAAYgzE,SAASryE,SACrB4yE,eAAiBP,SAASc,cAC1BN,gBAAgBR,SAASe,kBAjCsBlzE,cAkC9BmyE,SAASgB,kBAjC1B9zE,iBAAqC,MAAlBW,gBAA2C,IAAlBA,eAkC5CmyE,SAASiB,qBAAqBzpI,SAAQ,SAAU0pI,iBAAkB/kH,OAChEixC,cAAc5zD,KAAKmlI,qBAAqBuC,iBAAkB/kH,MAAQ,GACpE,IAtBAmkH,oBAAsB,GACtBlzE,cAAc51D,SAAQ,SAAUskI,YAAa3/G,OAC3CmkH,oBAAoB9mI,KAAKoiI,2BAA2Bz/G,MAAO2/G,aAC7D,IAiFK5mI,OAAOsX,iBAAiB,CAC7B20H,yBA5F6B,SAAkCtF,kBAC/D,KAAIA,iBAAmB,GAAKA,kBAAoBzuE,cAAc92D,QAG9D,OAAO82D,cAAcyuE,kBAAkBiC,mBAAmBsC,QAC5D,EAwFEgB,cA9DkB,WAClB,IAAIC,WAAa,EACbC,uBAAyB,EACzBC,sBAAwB,EAQ5B,OAPAn0E,cAAc51D,SAAQ,SAAUskI,aAC9BwF,wBAA0BxF,YAAY6D,sBACtC4B,uBAAyBzF,YAAY+D,sBACvC,IAC+B,IAA3ByB,yBACFD,WAAaE,sBAAwBD,uBAAyB,KAEzDD,UACT,EAmDEG,uBAlD2B,SAAgCC,+BAI3D,YAHsCzpI,IAAlCypI,gCACFA,+BAAiC,GAE5Br0E,cAAcsyE,OAAM,SAAU5D,YAAa3/G,OAChD,OAA6C,IAAtC2/G,YAAY6D,uBAA+B7D,YAAYtyC,WAAartE,QAAUslH,6BACvF,GACF,EA4CEC,+BA3CmC,SAAwC7F,kBAC3E,IAAI8F,WAAa,EAEjB,GAAI9F,iBAAmB,EACrB,GAAIA,kBAAoBzuE,cAAc92D,OACpCqrI,WAAav0E,cAAcA,cAAc92D,OAAS,GAAGiwC,eAErD,IAAK,IAAIlwC,EAAIwlI,iBAAmB,EAAGxlI,GAAK,EAAGA,IACzC,GAAK+2D,cAAc/2D,GAAGmzF,WAGXp8B,cAAcyuE,kBAAkBt1F,UAAY6mB,cAAc/2D,GAAGkwC,WAhHvD,IAiHqB,CACpCo7F,WAAav0E,cAAc/2D,GAAGkwC,UAC9B,KACF,CAIN,OAAOo7F,UACT,EAwBEpE,YAvBgB,WAChB,MAAO,CACLqE,GAAIx0E,cAAcpuD,KAAI,SAAU88H,aAC9B,OAAOA,YAAYyB,aACrB,IAEJ,EAkBEsE,aAjBiB,SAAsBC,mBACvCA,kBAAkBF,GAAGpqI,SAAQ,SAAUuqI,qBACrC,IAAK,IAAI1rI,EAAI,EAAGA,EAAI+2D,cAAc92D,OAAQD,IACpC+2D,cAAc/2D,GAAG6C,OAAS6oI,oBAAoBlgI,GAChDurD,cAAc/2D,GAAGgpI,oBAAoB0C,oBAG3C,GACF,GAUG,CACDC,eAAgB,CACd9pI,IAAK,WACH,OA3HA+pI,QAAU,CAAC,GACP1C,OAASa,QACjB6B,QAAQ5xE,KAAOxD,QACfo1E,QAAQC,YAAchC,aACtB+B,QAAQE,eAAiBlC,gBACzBgC,QAAQ1qE,SAAWtC,UACnBgtE,QAAQnB,cAAgBP,eACxB0B,QAAQG,iBAAmB,CAACz1E,gBAC5Bs1E,QAAQl0E,aAAe,GACvBX,cAAc51D,SAAQ,SAAUskI,aAC9BmG,QAAQl0E,aAAav0D,KAAKsiI,YAAYqB,SACxC,IACOvoI,OAAOq+E,KAAKq8C,UAAU2S,SAbJ,IACrBA,OA4HF,GAEFI,WAAY,CACVnqI,IAAK,WACH,OAAO40D,gBAAkB0uE,WAAWE,KAAO5uE,gBAAkB0uE,WAAWG,WAC1E,GAEF2G,SAAU,CACRpqI,IAAK,WACH,OAAO40D,gBAAkB0uE,WAAWliH,OAASwzC,gBAAkB0uE,WAAWG,WAC5E,GAEF4G,UAAW,CACTrqI,IAAK,WACH,OAAOioI,UACT,GAEFqC,OAAQ,CACNtqI,IAAK,WACH,OAAOkoI,OACT,GAEFqC,eAAgB,CACd5qI,IAAK,SAAa6qI,gBAChBrC,gBAAkBqC,cACpB,EACAxqI,IAAK,WACH,OAAOmoI,eACT,GAEF/yE,cAAe,CACbp1D,IAAK,WACH,OAAOy0D,cACT,GAEFe,SAAU,CACRx1D,IAAK,WACH,OAAO60D,SACT,GAEFY,SAAU,CACRz1D,IAAK,WACH,OAAO80D,SACT,GAEF8zE,cAAe,CACb5oI,IAAK,WACH,OAAOqoI,cACT,GAEF9yE,aAAc,CACZ51D,IAAK2oI,gBACLtoI,IAAK,WACH,OAAO40D,aACT,GAEFS,cAAe,CACbr1D,IAAK,WACH,OAAO00D,cACT,GAEFgB,WAAY,CACV11D,IAAK,WACH,OAAO+0D,WACT,GAEFY,cAAe,CACb31D,IAAK,WACH,OAAOg1D,cACT,GAEFM,OAAQ,CACNt1D,IAAK,WACH,OAAO20D,OACT,GAEF81E,uBAAwB,CACtBzqI,IAAK,WACH,OAAOooI,mBACT,GAEFsC,mBAAoB,CAClB1qI,IAAK,WACH,OAAOk1D,cAAc92D,MACvB,GAEFy3D,aAAc,CACZ71D,IAAK,WACH,OAAOk1D,aACT,GAEFy1E,kBAAmB,CACjB3qI,IAAK,WACH,OApPmB,GAqPrB,GAEF4qI,gCAAiC,CAC/B5qI,IAAK,WACH,IAAI6qI,0BAA4B,EAMhC,OALA31E,cAAc51D,SAAQ,SAAUskI,aAC1BA,YAAY6D,sBAAwB,GACtCoD,2BAEJ,IACOA,yBACT,IAGN,EAgHIC,mBAxFU,SAAiBv7B,IAAKwJ,UAClCxJ,IAP4B,SAAiCA,KAI7D,MAHmB,iBAARA,KAA+C,IAA3BA,IAAIr9F,QAAQ,YAAgD,IAA5Bq9F,IAAIr9F,QAAQ,cACzEq9F,IAAM,UAAYA,KAEbA,GACT,CAEQw7B,CAAwBx7B,KAC1BwJ,SACFF,mBAAmBtJ,IAAKwJ,UAExBF,mBAAmBtJ,IAEvB,EAiFIu7B,yBAhFgB,SAAuBv7B,KACzC,OAAkC,IAA3BA,IAAIr9F,QAAQ,YAAgD,IAA5Bq9F,IAAIr9F,QAAQ,WACrD,EA8EI44H,iDArDwC,SAA+CE,UAAWC,YACpG,IAAI13D,OAzBkC,SAA2CpiE,IAAKD,OACtFC,IAAMmrG,UAAUnrG,KAChBD,MAAQorG,UAAUprG,OAKlB,IAJA,IAGIpU,EAFAouI,IADiBryB,4BACItlC,OAAO1gC,OAAO,GAAGlY,MAAM,KAC5Cx8B,EAAI+sI,IAAI9sI,OAELD,KAEL,IADArB,EAAIouI,IAAI/sI,GAAGw8B,MAAM,MACX,KAAOxpB,IAAK,CAChBrU,EAAE,GAAKoU,MACPg6H,IAAI/sI,GAAKrB,EAAEmgC,KAAK,KAChB,KACF,CAEE9+B,EAAI,IACN+sI,IAAIA,IAAI9sI,QAAU,CAAC+S,IAAKD,OAAO+rB,KAAK,MAEtC,IAAIkuG,MAAQD,IAAIjuG,KAAK,KAIrB,OAH2B,IAAvBkuG,MAAMj5H,QAAQ,OAChBi5H,MAAQA,MAAMt4F,OAAO,IAEhB,IAAMs4F,KACf,CAEeC,CAAkCJ,UAAWC,YACtDI,eAAiBxyB,4BACjByyB,KAAOD,eAAeC,KAAO,IAAMD,eAAeC,KAAO,GAC7D,OAAOD,eAAe57B,SAAW,KAAO47B,eAAeE,SAAWD,KAAOD,eAAeG,SAAWj4D,OAAS83D,eAAe3jD,IAC7H,EAgDIojD,0BA/CiB,SAAwB3iG,KAC3C,GAAI8b,MAAM9b,KAAM,CACd,IAAIsjG,IAAM,EACNx6F,IAAM,EACNy6F,IAAM,EACNC,QAAUxjG,IAAIvP,cAEdgzG,WAAa,IAAI9kH,OAAO,YAAc,KACtC+kH,WAAa,IAAI/kH,OAAO,YAAc,KACtCglH,WAAa,IAAIhlH,OAAO,YAAc,KACtCilH,WAAa,IAAIjlH,OAAO,OAAQ,KAEhCklH,QAAUL,QAAQl6G,MAAMm6G,YACxBK,QAAUN,QAAQl6G,MAAMo6G,YACxBK,QAAUP,QAAQl6G,MAAMq6G,YACxBK,QAAUR,QAAQl6G,MAAMs6G,YAC5B,OAAIG,SAAWD,SAAWD,SAIpBA,UAEFP,IAA+C,GAAzCniG,OAAO0iG,QAAQ,GAAGrxG,MAAM,KAAKsC,KAAK,KAAY,IAElDgvG,UAEFh7F,IAA+C,GAAzC3H,OAAO2iG,QAAQ,GAAGtxG,MAAM,KAAKsC,KAAK,MAEtCivG,UAEFR,IAAMpiG,OAAO4iG,QAAQ,GAAGvxG,MAAM,KAAKsC,KAAK,MAGnCqM,OAAOmiG,IAAMx6F,IAAMy6F,MACjBS,QACTT,IAAMpiG,OAAO6iG,QAAQ,IAKhB,CACT,CAIA,OAHIhkG,IAAM,IACRA,IAAM,GAEDA,GACT,EASA,SAASikG,QAAQjwD,KAGf,OAAOiwD,QAAU,mBAAqBxoH,QAAU,iBAAmBA,OAAOC,SAAW,SAAUs4D,KAC7F,cAAcA,GAChB,EAAI,SAAUA,KACZ,OAAOA,KAAO,mBAAqBv4D,QAAUu4D,IAAIr4D,cAAgBF,QAAUu4D,MAAQv4D,OAAO3mB,UAAY,gBAAkBk/E,GAC1H,EAAGiwD,QAAQjwD,IACb,CAKA,IAAIxrC,SAAW,OACXC,UAAY,OAChB,SAASS,UAAUC,MAAOC,MAKxB,GAHAA,KAAOA,MAAQ,CAAC,GADhBD,MAAQA,OAAgB,cAIHD,UACnB,OAAOC,MAGT,KAAM9xC,gBAAgB6xC,WACpB,OAAO,IAAIA,UAAUC,MAAOC,MAE9B,IAAIC,IAmRN,SAAoBF,OAClB,IAAIE,IAAM,CACRxmC,EAAG,EACHrO,EAAG,EACH80C,EAAG,GAEDpkC,EAAI,EACJnM,EAAI,KACJrB,EAAI,KACJ6B,EAAI,KACJgwC,IAAK,EACLC,QAAS,EACO,iBAATL,QACTA,MAmuBJ,SAA6BA,OAC3BA,MAAQA,MAAMvqB,QAAQ4pB,SAAU,IAAI5pB,QAAQ6pB,UAAW,IAAIhY,cAC3D,IAkBInH,MAlBAmgB,OAAQ,EACZ,GAAIC,MAAMP,OACRA,MAAQO,MAAMP,OACdM,OAAQ,OACH,GAAa,eAATN,MACT,MAAO,CACLtmC,EAAG,EACHrO,EAAG,EACH80C,EAAG,EACHpkC,EAAG,EACHskC,OAAQ,QASZ,GAAIlgB,MAAQqgB,SAASN,IAAIvjC,KAAKqjC,OAC5B,MAAO,CACLtmC,EAAGymB,MAAM,GACT90B,EAAG80B,MAAM,GACTggB,EAAGhgB,MAAM,IAGb,GAAIA,MAAQqgB,SAASC,KAAK9jC,KAAKqjC,OAC7B,MAAO,CACLtmC,EAAGymB,MAAM,GACT90B,EAAG80B,MAAM,GACTggB,EAAGhgB,MAAM,GACTpkB,EAAGokB,MAAM,IAGb,GAAIA,MAAQqgB,SAASE,IAAI/jC,KAAKqjC,OAC5B,MAAO,CACLl/B,EAAGqf,MAAM,GACTvwB,EAAGuwB,MAAM,GACT/vB,EAAG+vB,MAAM,IAGb,GAAIA,MAAQqgB,SAASG,KAAKhkC,KAAKqjC,OAC7B,MAAO,CACLl/B,EAAGqf,MAAM,GACTvwB,EAAGuwB,MAAM,GACT/vB,EAAG+vB,MAAM,GACTpkB,EAAGokB,MAAM,IAGb,GAAIA,MAAQqgB,SAASI,IAAIjkC,KAAKqjC,OAC5B,MAAO,CACLl/B,EAAGqf,MAAM,GACTvwB,EAAGuwB,MAAM,GACT5xB,EAAG4xB,MAAM,IAGb,GAAIA,MAAQqgB,SAASK,KAAKlkC,KAAKqjC,OAC7B,MAAO,CACLl/B,EAAGqf,MAAM,GACTvwB,EAAGuwB,MAAM,GACT5xB,EAAG4xB,MAAM,GACTpkB,EAAGokB,MAAM,IAGb,GAAIA,MAAQqgB,SAASM,KAAKnkC,KAAKqjC,OAC7B,MAAO,CACLtmC,EAAGqnC,gBAAgB5gB,MAAM,IACzB90B,EAAG01C,gBAAgB5gB,MAAM,IACzBggB,EAAGY,gBAAgB5gB,MAAM,IACzBpkB,EAAGilC,oBAAoB7gB,MAAM,IAC7BkgB,OAAQC,MAAQ,OAAS,QAG7B,GAAIngB,MAAQqgB,SAASS,KAAKtkC,KAAKqjC,OAC7B,MAAO,CACLtmC,EAAGqnC,gBAAgB5gB,MAAM,IACzB90B,EAAG01C,gBAAgB5gB,MAAM,IACzBggB,EAAGY,gBAAgB5gB,MAAM,IACzBkgB,OAAQC,MAAQ,OAAS,OAG7B,GAAIngB,MAAQqgB,SAASU,KAAKvkC,KAAKqjC,OAC7B,MAAO,CACLtmC,EAAGqnC,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzC90B,EAAG01C,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzCggB,EAAGY,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzCpkB,EAAGilC,oBAAoB7gB,MAAM,GAAK,GAAKA,MAAM,IAC7CkgB,OAAQC,MAAQ,OAAS,QAG7B,GAAIngB,MAAQqgB,SAASW,KAAKxkC,KAAKqjC,OAC7B,MAAO,CACLtmC,EAAGqnC,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzC90B,EAAG01C,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzCggB,EAAGY,gBAAgB5gB,MAAM,GAAK,GAAKA,MAAM,IACzCkgB,OAAQC,MAAQ,OAAS,OAG7B,OAAO,CACT,CAx0BYc,CAAoBpB,QAER,UAAlB86F,QAAQ96F,SACNqB,eAAerB,MAAMtmC,IAAM2nC,eAAerB,MAAM30C,IAAMg2C,eAAerB,MAAMG,IA2CjEzmC,EA1CGsmC,MAAMtmC,EA0CNrO,EA1CS20C,MAAM30C,EA0CZ80C,EA1CeH,MAAMG,EAAvCD,IA2CG,CACLxmC,EAAqB,IAAlB4nC,QAAQ5nC,EAAG,KACdrO,EAAqB,IAAlBi2C,QAAQj2C,EAAG,KACd80C,EAAqB,IAAlBmB,QAAQnB,EAAG,MA7CZC,IAAK,EACLC,OAAwC,MAA/B1mC,OAAOqmC,MAAMtmC,GAAG6nC,QAAQ,GAAa,OAAS,OAC9CF,eAAerB,MAAMl/B,IAAMugC,eAAerB,MAAMpwC,IAAMyxC,eAAerB,MAAMzxC,IACpFqB,EAAI4xC,oBAAoBxB,MAAMpwC,GAC9BrB,EAAIizC,oBAAoBxB,MAAMzxC,GAC9B2xC,IA6JN,SAAkBp/B,EAAGlR,EAAGrB,GACtBuS,EAAsB,EAAlBwgC,QAAQxgC,EAAG,KACflR,EAAI0xC,QAAQ1xC,EAAG,KACfrB,EAAI+yC,QAAQ/yC,EAAG,KACf,IAAI1B,EAAI8N,KAAKqiC,MAAMl8B,GACjB2gC,EAAI3gC,EAAIjU,EACRD,EAAI2B,GAAK,EAAIqB,GACb8xC,EAAInzC,GAAK,EAAIkzC,EAAI7xC,GACjB8D,EAAInF,GAAK,GAAK,EAAIkzC,GAAK7xC,GACvB+xC,IAAM90C,EAAI,EACV6M,EAAI,CAACnL,EAAGmzC,EAAG90C,EAAGA,EAAG8G,EAAGnF,GAAGozC,KACvBt2C,EAAI,CAACqI,EAAGnF,EAAGA,EAAGmzC,EAAG90C,EAAGA,GAAG+0C,KACvBxB,EAAI,CAACvzC,EAAGA,EAAG8G,EAAGnF,EAAGA,EAAGmzC,GAAGC,KACzB,MAAO,CACLjoC,EAAO,IAAJA,EACHrO,EAAO,IAAJA,EACH80C,EAAO,IAAJA,EAEP,CA/KYyB,CAAS5B,MAAMl/B,EAAGlR,EAAGrB,GAC3B6xC,IAAK,EACLC,OAAS,OACAgB,eAAerB,MAAMl/B,IAAMugC,eAAerB,MAAMpwC,IAAMyxC,eAAerB,MAAM5vC,KACpFR,EAAI4xC,oBAAoBxB,MAAMpwC,GAC9BQ,EAAIoxC,oBAAoBxB,MAAM5vC,GAC9B8vC,IAgFN,SAAkBp/B,EAAGlR,EAAGQ,GACtB,IAAIsJ,EAAGrO,EAAG80C,EAIV,SAAS0B,QAAQj1C,EAAG80C,EAAGhuC,GAGrB,OAFIA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,EAAI,EAAU9G,EAAc,GAAT80C,EAAI90C,GAAS8G,EACpCA,EAAI,GAAcguC,EAClBhuC,EAAI,EAAI,EAAU9G,GAAK80C,EAAI90C,IAAM,EAAI,EAAI8G,GAAK,EAC3C9G,CACT,CACA,GAXAkU,EAAIwgC,QAAQxgC,EAAG,KACflR,EAAI0xC,QAAQ1xC,EAAG,KACfQ,EAAIkxC,QAAQlxC,EAAG,KASL,IAANR,EACF8J,EAAIrO,EAAI80C,EAAI/vC,MACP,CACL,IAAIsxC,EAAItxC,EAAI,GAAMA,GAAK,EAAIR,GAAKQ,EAAIR,EAAIQ,EAAIR,EACxChD,EAAI,EAAIwD,EAAIsxC,EAChBhoC,EAAImoC,QAAQj1C,EAAG80C,EAAG5gC,EAAI,EAAI,GAC1BzV,EAAIw2C,QAAQj1C,EAAG80C,EAAG5gC,GAClBq/B,EAAI0B,QAAQj1C,EAAG80C,EAAG5gC,EAAI,EAAI,EAC5B,CACA,MAAO,CACLpH,EAAO,IAAJA,EACHrO,EAAO,IAAJA,EACH80C,EAAO,IAAJA,EAEP,CA3GY2B,CAAS9B,MAAMl/B,EAAGlR,EAAGQ,GAC3BgwC,IAAK,EACLC,OAAS,OAEPL,MAAMp0C,eAAe,OACvBmQ,EAAIikC,MAAMjkC,IAyBhB,IAAkBrC,EAAGrO,EAAG80C,EArBtB,OADApkC,EAAIgmC,WAAWhmC,GACR,CACLqkC,GACAC,OAAQL,MAAMK,QAAUA,OACxB3mC,EAAGiB,KAAKglC,IAAI,IAAKhlC,KAAKsoB,IAAIid,IAAIxmC,EAAG,IACjCrO,EAAGsP,KAAKglC,IAAI,IAAKhlC,KAAKsoB,IAAIid,IAAI70C,EAAG,IACjC80C,EAAGxlC,KAAKglC,IAAI,IAAKhlC,KAAKsoB,IAAIid,IAAIC,EAAG,IACjCpkC,EAEJ,CAjUYimC,CAAWhC,OACrB9xC,KAAK+zC,eAAiBjC,MAAO9xC,KAAKg0C,GAAKhC,IAAIxmC,EAAGxL,KAAKi0C,GAAKjC,IAAI70C,EAAG6C,KAAKk0C,GAAKlC,IAAIC,EAAGjyC,KAAKm0C,GAAKnC,IAAInkC,EAAG7N,KAAKo0C,QAAU3nC,KAAK8kC,MAAM,IAAMvxC,KAAKm0C,IAAM,IAAKn0C,KAAKq0C,QAAUtC,KAAKI,QAAUH,IAAIG,OACnLnyC,KAAKs0C,cAAgBvC,KAAKwC,aAMtBv0C,KAAKg0C,GAAK,IAAGh0C,KAAKg0C,GAAKvnC,KAAK8kC,MAAMvxC,KAAKg0C,KACvCh0C,KAAKi0C,GAAK,IAAGj0C,KAAKi0C,GAAKxnC,KAAK8kC,MAAMvxC,KAAKi0C,KACvCj0C,KAAKk0C,GAAK,IAAGl0C,KAAKk0C,GAAKznC,KAAK8kC,MAAMvxC,KAAKk0C,KAC3Cl0C,KAAKw0C,IAAMxC,IAAIE,EACjB,CA8UA,SAASwC,SAASlpC,EAAGrO,EAAG80C,GACtBzmC,EAAI4nC,QAAQ5nC,EAAG,KACfrO,EAAIi2C,QAAQj2C,EAAG,KACf80C,EAAImB,QAAQnB,EAAG,KACf,IAEIr/B,EACFlR,EAHEqzB,IAAMtoB,KAAKsoB,IAAIvpB,EAAGrO,EAAG80C,GACvBR,IAAMhlC,KAAKglC,IAAIjmC,EAAGrO,EAAG80C,GAGrB/vC,GAAK6yB,IAAM0c,KAAO,EACpB,GAAI1c,KAAO0c,IACT7+B,EAAIlR,EAAI,MACH,CACL,IAAI+P,EAAIsjB,IAAM0c,IAEd,OADA/vC,EAAIQ,EAAI,GAAMuP,GAAK,EAAIsjB,IAAM0c,KAAOhgC,GAAKsjB,IAAM0c,KACvC1c,KACN,KAAKvpB,EACHoH,GAAKzV,EAAI80C,GAAKxgC,GAAKtU,EAAI80C,EAAI,EAAI,GAC/B,MACF,KAAK90C,EACHyV,GAAKq/B,EAAIzmC,GAAKiG,EAAI,EAClB,MACF,KAAKwgC,EACHr/B,GAAKpH,EAAIrO,GAAKsU,EAAI,EAGtBmB,GAAK,CACP,CACA,MAAO,CACLA,EACAlR,EACAQ,EAEJ,CAuCA,SAASyyC,SAASnpC,EAAGrO,EAAG80C,GACtBzmC,EAAI4nC,QAAQ5nC,EAAG,KACfrO,EAAIi2C,QAAQj2C,EAAG,KACf80C,EAAImB,QAAQnB,EAAG,KACf,IAEIr/B,EACFlR,EAHEqzB,IAAMtoB,KAAKsoB,IAAIvpB,EAAGrO,EAAG80C,GACvBR,IAAMhlC,KAAKglC,IAAIjmC,EAAGrO,EAAG80C,GAGrB5xC,EAAI00B,IACFtjB,EAAIsjB,IAAM0c,IAEd,GADA/vC,EAAY,IAARqzB,IAAY,EAAItjB,EAAIsjB,IACpBA,KAAO0c,IACT7+B,EAAI,MACC,CACL,OAAQmiB,KACN,KAAKvpB,EACHoH,GAAKzV,EAAI80C,GAAKxgC,GAAKtU,EAAI80C,EAAI,EAAI,GAC/B,MACF,KAAK90C,EACHyV,GAAKq/B,EAAIzmC,GAAKiG,EAAI,EAClB,MACF,KAAKwgC,EACHr/B,GAAKpH,EAAIrO,GAAKsU,EAAI,EAGtBmB,GAAK,CACP,CACA,MAAO,CACLA,EACAlR,EACArB,EAEJ,CA8BA,SAASu0C,SAASppC,EAAGrO,EAAG80C,EAAG4C,YACzB,IAAIC,IAAM,CAACC,KAAKtoC,KAAK8kC,MAAM/lC,GAAGma,SAAS,KAAMovB,KAAKtoC,KAAK8kC,MAAMp0C,GAAGwoB,SAAS,KAAMovB,KAAKtoC,KAAK8kC,MAAMU,GAAGtsB,SAAS,MAG3G,OAAIkvB,YAAcC,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,GAC3HiJ,IAAI,GAAGjJ,OAAO,GAAKiJ,IAAI,GAAGjJ,OAAO,GAAKiJ,IAAI,GAAGjJ,OAAO,GAEtDiJ,IAAIrX,KAAK,GAClB,CAmBA,SAASuX,cAAcxpC,EAAGrO,EAAG80C,EAAGpkC,GAE9B,MADU,CAACknC,KAAKE,oBAAoBpnC,IAAKknC,KAAKtoC,KAAK8kC,MAAM/lC,GAAGma,SAAS,KAAMovB,KAAKtoC,KAAK8kC,MAAMp0C,GAAGwoB,SAAS,KAAMovB,KAAKtoC,KAAK8kC,MAAMU,GAAGtsB,SAAS,MAC9H8X,KAAK,GAClB,CAqBA,SAASyX,YAAYpD,MAAOqD,QAC1BA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAI3C,IAAMX,UAAUC,OAAOsD,QAG3B,OAFA5C,IAAI9wC,GAAKyzC,OAAS,IAClB3C,IAAI9wC,EAAI2zC,QAAQ7C,IAAI9wC,GACbmwC,UAAUW,IACnB,CACA,SAAS8C,UAAUxD,MAAOqD,QACxBA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAI3C,IAAMX,UAAUC,OAAOsD,QAG3B,OAFA5C,IAAI9wC,GAAKyzC,OAAS,IAClB3C,IAAI9wC,EAAI2zC,QAAQ7C,IAAI9wC,GACbmwC,UAAUW,IACnB,CACA,SAAS+C,WAAWzD,OAClB,OAAOD,UAAUC,OAAO0D,WAAW,IACrC,CACA,SAASC,SAAS3D,MAAOqD,QACvBA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAI3C,IAAMX,UAAUC,OAAOsD,QAG3B,OAFA5C,IAAItwC,GAAKizC,OAAS,IAClB3C,IAAItwC,EAAImzC,QAAQ7C,IAAItwC,GACb2vC,UAAUW,IACnB,CACA,SAASkD,UAAU5D,MAAOqD,QACxBA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAInD,IAAMH,UAAUC,OAAO6D,QAI3B,OAHA3D,IAAIxmC,EAAIiB,KAAKsoB,IAAI,EAAGtoB,KAAKglC,IAAI,IAAKO,IAAIxmC,EAAIiB,KAAK8kC,OAAc4D,OAAS,IAAjB,OACrDnD,IAAI70C,EAAIsP,KAAKsoB,IAAI,EAAGtoB,KAAKglC,IAAI,IAAKO,IAAI70C,EAAIsP,KAAK8kC,OAAc4D,OAAS,IAAjB,OACrDnD,IAAIC,EAAIxlC,KAAKsoB,IAAI,EAAGtoB,KAAKglC,IAAI,IAAKO,IAAIC,EAAIxlC,KAAK8kC,OAAc4D,OAAS,IAAjB,OAC9CtD,UAAUG,IACnB,CACA,SAAS4D,QAAQ9D,MAAOqD,QACtBA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAI3C,IAAMX,UAAUC,OAAOsD,QAG3B,OAFA5C,IAAItwC,GAAKizC,OAAS,IAClB3C,IAAItwC,EAAImzC,QAAQ7C,IAAItwC,GACb2vC,UAAUW,IACnB,CAIA,SAASqD,MAAM/D,MAAOqD,QACpB,IAAI3C,IAAMX,UAAUC,OAAOsD,QACvBU,KAAOtD,IAAI5/B,EAAIuiC,QAAU,IAE7B,OADA3C,IAAI5/B,EAAIkjC,IAAM,EAAI,IAAMA,IAAMA,IACvBjE,UAAUW,IACnB,CAOA,SAASuD,YAAYjE,OACnB,IAAIU,IAAMX,UAAUC,OAAOsD,QAE3B,OADA5C,IAAI5/B,GAAK4/B,IAAI5/B,EAAI,KAAO,IACjBi/B,UAAUW,IACnB,CACA,SAASq6F,OAAO/6F,MAAO5f,QACrB,GAAIuyB,MAAMvyB,SAAWA,QAAU,EAC7B,MAAM,IAAI7d,MAAM,gDAKlB,IAHA,IAAIm+B,IAAMX,UAAUC,OAAOsD,QACvB1wB,OAAS,CAACmtB,UAAUC,QACpB80D,KAAO,IAAM10E,OACRvzB,EAAI,EAAGA,EAAIuzB,OAAQvzB,IAC1B+lB,OAAO5iB,KAAK+vC,UAAU,CACpBj/B,GAAI4/B,IAAI5/B,EAAIjU,EAAIioG,MAAQ,IACxBllG,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,KAGX,OAAOwiB,MACT,CACA,SAASwxB,iBAAiBpE,OACxB,IAAIU,IAAMX,UAAUC,OAAOsD,QACvBxiC,EAAI4/B,IAAI5/B,EACZ,MAAO,CAACi/B,UAAUC,OAAQD,UAAU,CAClCj/B,GAAIA,EAAI,IAAM,IACdlR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,IACL2vC,UAAU,CACZj/B,GAAIA,EAAI,KAAO,IACflR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,IAEX,CACA,SAASi0C,WAAWrE,MAAOsE,QAASC,QAClCD,QAAUA,SAAW,EACrBC,OAASA,QAAU,GACnB,IAAI7D,IAAMX,UAAUC,OAAOsD,QACvBkB,KAAO,IAAMD,OACbzmC,IAAM,CAACiiC,UAAUC,QACrB,IAAKU,IAAI5/B,GAAK4/B,IAAI5/B,GAAK0jC,KAAOF,SAAW,GAAK,KAAO,MAAOA,SAC1D5D,IAAI5/B,GAAK4/B,IAAI5/B,EAAI0jC,MAAQ,IACzB1mC,IAAI9N,KAAK+vC,UAAUW,MAErB,OAAO5iC,GACT,CACA,SAAS2mC,eAAezE,MAAOsE,SAC7BA,QAAUA,SAAW,EAOrB,IANA,IAAI1D,IAAMb,UAAUC,OAAO0E,QACvB5jC,EAAI8/B,IAAI9/B,EACVlR,EAAIgxC,IAAIhxC,EACRrB,EAAIqyC,IAAIryC,EACNuP,IAAM,GACN6mC,aAAe,EAAIL,QAChBA,WACLxmC,IAAI9N,KAAK+vC,UAAU,CACjBj/B,EACAlR,EACArB,KAEFA,GAAKA,EAAIo2C,cAAgB,EAE3B,OAAO7mC,GACT,CA1nBAiiC,UAAUp0C,UAAY,CACpBi5C,OAAQ,WACN,OAAO12C,KAAK22C,gBAAkB,GAChC,EACAC,QAAS,WACP,OAAQ52C,KAAK02C,QACf,EACAhzB,QAAS,WACP,OAAO1jB,KAAKw0C,GACd,EACAqC,iBAAkB,WAChB,OAAO72C,KAAK+zC,cACd,EACA+C,UAAW,WACT,OAAO92C,KAAKq0C,OACd,EACA0C,SAAU,WACR,OAAO/2C,KAAKm0C,EACd,EACAwC,cAAe,WAEb,IAAI3E,IAAMhyC,KAAK21C,QACf,OAAgB,IAAR3D,IAAIxmC,EAAkB,IAARwmC,IAAI70C,EAAkB,IAAR60C,IAAIC,GAAW,GACrD,EACA+E,aAAc,WAEZ,IACIC,MAAOC,MAAOC,MADdnF,IAAMhyC,KAAK21C,QAQf,OANAsB,MAAQjF,IAAIxmC,EAAI,IAChB0rC,MAAQlF,IAAI70C,EAAI,IAChBg6C,MAAQnF,IAAIC,EAAI,IAIT,OAHHgF,OAAS,OAAaA,MAAQ,MAAexqC,KAAK2qC,KAAKH,MAAQ,MAAS,MAAO,MAG/D,OAFhBC,OAAS,OAAaA,MAAQ,MAAezqC,KAAK2qC,KAAKF,MAAQ,MAAS,MAAO,MAElD,OAD7BC,OAAS,OAAaA,MAAQ,MAAe1qC,KAAK2qC,KAAKD,MAAQ,MAAS,MAAO,KAErF,EACAE,SAAU,SAAkB3lC,OAG1B,OAFA1R,KAAKm0C,GAAKN,WAAWniC,OACrB1R,KAAKo0C,QAAU3nC,KAAK8kC,MAAM,IAAMvxC,KAAKm0C,IAAM,IACpCn0C,IACT,EACAw2C,MAAO,WACL,IAAI9D,IAAMiC,SAAS30C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,IAC1C,MAAO,CACLthC,EAAW,IAAR8/B,IAAI9/B,EACPlR,EAAGgxC,IAAIhxC,EACPrB,EAAGqyC,IAAIryC,EACPwN,EAAG7N,KAAKm0C,GAEZ,EACAmD,YAAa,WACX,IAAI5E,IAAMiC,SAAS30C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,IACtCthC,EAAInG,KAAK8kC,MAAc,IAARmB,IAAI9/B,GACrBlR,EAAI+K,KAAK8kC,MAAc,IAARmB,IAAIhxC,GACnBrB,EAAIoM,KAAK8kC,MAAc,IAARmB,IAAIryC,GACrB,OAAkB,GAAXL,KAAKm0C,GAAU,OAASvhC,EAAI,KAAOlR,EAAI,MAAQrB,EAAI,KAAO,QAAUuS,EAAI,KAAOlR,EAAI,MAAQrB,EAAI,MAAQL,KAAKo0C,QAAU,GAC/H,EACAgB,MAAO,WACL,IAAI5C,IAAMkC,SAAS10C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,IAC1C,MAAO,CACLthC,EAAW,IAAR4/B,IAAI5/B,EACPlR,EAAG8wC,IAAI9wC,EACPQ,EAAGswC,IAAItwC,EACP2L,EAAG7N,KAAKm0C,GAEZ,EACAoD,YAAa,WACX,IAAI/E,IAAMkC,SAAS10C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,IACtCthC,EAAInG,KAAK8kC,MAAc,IAARiB,IAAI5/B,GACrBlR,EAAI+K,KAAK8kC,MAAc,IAARiB,IAAI9wC,GACnBQ,EAAIuK,KAAK8kC,MAAc,IAARiB,IAAItwC,GACrB,OAAkB,GAAXlC,KAAKm0C,GAAU,OAASvhC,EAAI,KAAOlR,EAAI,MAAQQ,EAAI,KAAO,QAAU0Q,EAAI,KAAOlR,EAAI,MAAQQ,EAAI,MAAQlC,KAAKo0C,QAAU,GAC/H,EACAoD,MAAO,SAAe3C,YACpB,OAAOD,SAAS50C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,GAAIW,WAC7C,EACA4C,YAAa,SAAqB5C,YAChC,MAAO,IAAM70C,KAAKw3C,MAAM3C,WAC1B,EACA6C,OAAQ,SAAgBC,YACtB,OAgZJ,SAAmBnsC,EAAGrO,EAAG80C,EAAGpkC,EAAG8pC,YAC7B,IAAI7C,IAAM,CAACC,KAAKtoC,KAAK8kC,MAAM/lC,GAAGma,SAAS,KAAMovB,KAAKtoC,KAAK8kC,MAAMp0C,GAAGwoB,SAAS,KAAMovB,KAAKtoC,KAAK8kC,MAAMU,GAAGtsB,SAAS,KAAMovB,KAAKE,oBAAoBpnC,KAG1I,GAAI8pC,YAAc7C,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,IAAMiJ,IAAI,GAAGjJ,OAAO,GAC1K,OAAOiJ,IAAI,GAAGjJ,OAAO,GAAKiJ,IAAI,GAAGjJ,OAAO,GAAKiJ,IAAI,GAAGjJ,OAAO,GAAKiJ,IAAI,GAAGjJ,OAAO,GAEhF,OAAOiJ,IAAIrX,KAAK,GAClB,CAxZWma,CAAU53C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,GAAIl0C,KAAKm0C,GAAIwD,WACvD,EACAE,aAAc,SAAsBF,YAClC,MAAO,IAAM33C,KAAK03C,OAAOC,WAC3B,EACAhC,MAAO,WACL,MAAO,CACLnqC,EAAGiB,KAAK8kC,MAAMvxC,KAAKg0C,IACnB72C,EAAGsP,KAAK8kC,MAAMvxC,KAAKi0C,IACnBhC,EAAGxlC,KAAK8kC,MAAMvxC,KAAKk0C,IACnBrmC,EAAG7N,KAAKm0C,GAEZ,EACA2D,YAAa,WACX,OAAkB,GAAX93C,KAAKm0C,GAAU,OAAS1nC,KAAK8kC,MAAMvxC,KAAKg0C,IAAM,KAAOvnC,KAAK8kC,MAAMvxC,KAAKi0C,IAAM,KAAOxnC,KAAK8kC,MAAMvxC,KAAKk0C,IAAM,IAAM,QAAUznC,KAAK8kC,MAAMvxC,KAAKg0C,IAAM,KAAOvnC,KAAK8kC,MAAMvxC,KAAKi0C,IAAM,KAAOxnC,KAAK8kC,MAAMvxC,KAAKk0C,IAAM,KAAOl0C,KAAKo0C,QAAU,GACvO,EACA2D,gBAAiB,WACf,MAAO,CACLvsC,EAAGiB,KAAK8kC,MAA8B,IAAxB6B,QAAQpzC,KAAKg0C,GAAI,MAAc,IAC7C72C,EAAGsP,KAAK8kC,MAA8B,IAAxB6B,QAAQpzC,KAAKi0C,GAAI,MAAc,IAC7ChC,EAAGxlC,KAAK8kC,MAA8B,IAAxB6B,QAAQpzC,KAAKk0C,GAAI,MAAc,IAC7CrmC,EAAG7N,KAAKm0C,GAEZ,EACA6D,sBAAuB,WACrB,OAAkB,GAAXh4C,KAAKm0C,GAAU,OAAS1nC,KAAK8kC,MAA8B,IAAxB6B,QAAQpzC,KAAKg0C,GAAI,MAAc,MAAQvnC,KAAK8kC,MAA8B,IAAxB6B,QAAQpzC,KAAKi0C,GAAI,MAAc,MAAQxnC,KAAK8kC,MAA8B,IAAxB6B,QAAQpzC,KAAKk0C,GAAI,MAAc,KAAO,QAAUznC,KAAK8kC,MAA8B,IAAxB6B,QAAQpzC,KAAKg0C,GAAI,MAAc,MAAQvnC,KAAK8kC,MAA8B,IAAxB6B,QAAQpzC,KAAKi0C,GAAI,MAAc,MAAQxnC,KAAK8kC,MAA8B,IAAxB6B,QAAQpzC,KAAKk0C,GAAI,MAAc,MAAQl0C,KAAKo0C,QAAU,GACrW,EACA6D,OAAQ,WACN,OAAgB,IAAZj4C,KAAKm0C,GACA,gBAELn0C,KAAKm0C,GAAK,KAGP+D,SAAStD,SAAS50C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,IAAI,MAAU,EAChE,EACAiE,SAAU,SAAkBC,aAC1B,IAAIC,WAAa,IAAMrD,cAAch1C,KAAKg0C,GAAIh0C,KAAKi0C,GAAIj0C,KAAKk0C,GAAIl0C,KAAKm0C,IACjEmE,iBAAmBD,WACnB9D,aAAev0C,KAAKs0C,cAAgB,qBAAuB,GAC/D,GAAI8D,YAAa,CACf,IAAI12C,EAAImwC,UAAUuG,aAClBE,iBAAmB,IAAMtD,cAActzC,EAAEsyC,GAAItyC,EAAEuyC,GAAIvyC,EAAEwyC,GAAIxyC,EAAEyyC,GAC7D,CACA,MAAO,8CAAgDI,aAAe,iBAAmB8D,WAAa,gBAAkBC,iBAAmB,GAC7I,EACA3yB,SAAU,SAAkBwsB,QAC1B,IAAIoG,YAAcpG,OAClBA,OAASA,QAAUnyC,KAAKq0C,QACxB,IAAImE,iBAAkB,EAClBC,SAAWz4C,KAAKm0C,GAAK,GAAKn0C,KAAKm0C,IAAM,EAEzC,OADwBoE,YAAaE,UAAwB,QAAXtG,QAA+B,SAAXA,QAAgC,SAAXA,QAAgC,SAAXA,QAAgC,SAAXA,QAAgC,SAAXA,QAS3I,QAAXA,SACFqG,gBAAkBx4C,KAAK83C,eAEV,SAAX3F,SACFqG,gBAAkBx4C,KAAKg4C,yBAEV,QAAX7F,QAA+B,SAAXA,SACtBqG,gBAAkBx4C,KAAKy3C,eAEV,SAAXtF,SACFqG,gBAAkBx4C,KAAKy3C,aAAY,IAEtB,SAAXtF,SACFqG,gBAAkBx4C,KAAK63C,cAAa,IAEvB,SAAX1F,SACFqG,gBAAkBx4C,KAAK63C,gBAEV,SAAX1F,SACFqG,gBAAkBx4C,KAAKi4C,UAEV,QAAX9F,SACFqG,gBAAkBx4C,KAAKu3C,eAEV,QAAXpF,SACFqG,gBAAkBx4C,KAAKs3C,eAElBkB,iBAAmBx4C,KAAKy3C,eAhCd,SAAXtF,QAAiC,IAAZnyC,KAAKm0C,GACrBn0C,KAAKi4C,SAEPj4C,KAAK83C,aA8BhB,EACAY,MAAO,WACL,OAAO7G,UAAU7xC,KAAK2lB,WACxB,EACAgzB,mBAAoB,SAA4Bl1C,GAAI+tB,MAClD,IAAIsgB,MAAQruC,GAAGguB,MAAM,KAAM,CAACzxB,MAAMiK,OAAO,GAAGzC,MAAM7J,KAAK6zB,QAKvD,OAJAxxB,KAAKg0C,GAAKlC,MAAMkC,GAChBh0C,KAAKi0C,GAAKnC,MAAMmC,GAChBj0C,KAAKk0C,GAAKpC,MAAMoC,GAChBl0C,KAAKq3C,SAASvF,MAAMqC,IACbn0C,IACT,EACA44C,QAAS,WACP,OAAO54C,KAAK24C,mBAAmBlD,SAAUrqB,UAC3C,EACAytB,SAAU,WACR,OAAO74C,KAAK24C,mBAAmBjD,UAAWtqB,UAC5C,EACA0tB,OAAQ,WACN,OAAO94C,KAAK24C,mBAAmB/C,QAASxqB,UAC1C,EACAoqB,WAAY,WACV,OAAOx1C,KAAK24C,mBAAmBzD,YAAa9pB,UAC9C,EACA2tB,SAAU,WACR,OAAO/4C,KAAK24C,mBAAmBrD,UAAWlqB,UAC5C,EACA4tB,UAAW,WACT,OAAOh5C,KAAK24C,mBAAmBpD,WAAYnqB,UAC7C,EACA6tB,KAAM,WACJ,OAAOj5C,KAAK24C,mBAAmB9C,MAAOzqB,UACxC,EACA8tB,kBAAmB,SAA2Bz1C,GAAI+tB,MAChD,OAAO/tB,GAAGguB,MAAM,KAAM,CAACzxB,MAAMiK,OAAO,GAAGzC,MAAM7J,KAAK6zB,OACpD,EACA2nB,UAAW,WACT,OAAOn5C,KAAKk5C,kBAAkB/C,WAAY/qB,UAC5C,EACAguB,WAAY,WACV,OAAOp5C,KAAKk5C,kBAAkBnD,YAAa3qB,UAC7C,EACAiuB,cAAe,WACb,OAAOr5C,KAAKk5C,kBAAkB3C,eAAgBnrB,UAChD,EACAkuB,gBAAiB,WACf,OAAOt5C,KAAKk5C,kBAAkBhD,iBAAkB9qB,UAClD,EAKAmuB,MAAO,WACL,OAAOv5C,KAAKk5C,kBAAkB2zF,OAAQ,CAAC,GACzC,EACArzF,OAAQ,WACN,OAAOx5C,KAAKk5C,kBAAkB2zF,OAAQ,CAAC,GACzC,GAKFh7F,UAAU4H,UAAY,SAAU3H,MAAOC,MACrC,GAAsB,UAAlB66F,QAAQ96F,OAAoB,CAC9B,IAAI4H,SAAW,CAAC,EAChB,IAAK,IAAI/6C,KAAKmzC,MACRA,MAAMp0C,eAAeiB,KAErB+6C,SAAS/6C,GADD,MAANA,EACYmzC,MAAMnzC,GAEN20C,oBAAoBxB,MAAMnzC,KAI9CmzC,MAAQ4H,QACV,CACA,OAAO7H,UAAUC,MAAOC,KAC1B,EA+PAF,UAAU8H,OAAS,SAAUC,OAAQC,QACnC,SAAKD,SAAWC,SACThI,UAAU+H,QAAQ9B,eAAiBjG,UAAUgI,QAAQ/B,aAC9D,EACAjG,UAAUD,OAAS,WACjB,OAAOC,UAAU4H,UAAU,CACzBjuC,EAAGiB,KAAKmlC,SACRz0C,EAAGsP,KAAKmlC,SACRK,EAAGxlC,KAAKmlC,UAEZ,EAiIAC,UAAUiI,IAAM,SAAUF,OAAQC,OAAQ1E,QACxCA,OAAoB,IAAXA,OAAe,EAAIA,QAAU,GACtC,IAAI4E,KAAOlI,UAAU+H,QAAQjE,QACzBqE,KAAOnI,UAAUgI,QAAQlE,QACzBj3C,EAAIy2C,OAAS,IAOjB,OAAOtD,UANI,CACTrmC,GAAIwuC,KAAKxuC,EAAIuuC,KAAKvuC,GAAK9M,EAAIq7C,KAAKvuC,EAChCrO,GAAI68C,KAAK78C,EAAI48C,KAAK58C,GAAKuB,EAAIq7C,KAAK58C,EAChC80C,GAAI+H,KAAK/H,EAAI8H,KAAK9H,GAAKvzC,EAAIq7C,KAAK9H,EAChCpkC,GAAImsC,KAAKnsC,EAAIksC,KAAKlsC,GAAKnP,EAAIq7C,KAAKlsC,GAGpC,EAQAgkC,UAAUoI,YAAc,SAAUL,OAAQC,QACxC,IAAIK,GAAKrI,UAAU+H,QACfO,GAAKtI,UAAUgI,QACnB,OAAQptC,KAAKsoB,IAAImlB,GAAGlD,eAAgBmD,GAAGnD,gBAAkB,MAASvqC,KAAKglC,IAAIyI,GAAGlD,eAAgBmD,GAAGnD,gBAAkB,IACrH,EAYAnF,UAAUuI,WAAa,SAAUR,OAAQC,OAAQQ,OAC/C,IACIC,WAAYt3C,IADZi3C,YAAcpI,UAAUoI,YAAYL,OAAQC,QAIhD,OAFA72C,KAAM,GACNs3C,WAqbF,SAA4BC,OAG1B,IAAIC,MAAOt6C,KAKXs6C,QAJAD,MAAQA,OAAS,CACfC,MAAO,KACPt6C,KAAM,UAEOs6C,OAAS,MAAMC,cAC9Bv6C,MAAQq6C,MAAMr6C,MAAQ,SAASk5B,cACjB,OAAVohB,OAA4B,QAAVA,QACpBA,MAAQ,MAEG,UAATt6C,MAA6B,UAATA,OACtBA,KAAO,SAET,MAAO,CACLs6C,MACAt6C,KAEJ,CAzcew6C,CAAmBL,QACbG,MAAQF,WAAWp6C,MACpC,IAAK,UACL,IAAK,WACH8C,IAAMi3C,aAAe,IACrB,MACF,IAAK,UACHj3C,IAAMi3C,aAAe,EACrB,MACF,IAAK,WACHj3C,IAAMi3C,aAAe,EAGzB,OAAOj3C,GACT,EAWA6uC,UAAU8I,aAAe,SAAUC,UAAWC,UAAWrpB,MACvD,IAEIyoB,YACAa,sBAAuBN,MAAOt6C,KAH9B66C,UAAY,KACZC,UAAY,EAIhBF,uBADAtpB,KAAOA,MAAQ,CAAC,GACaspB,sBAC7BN,MAAQhpB,KAAKgpB,MACbt6C,KAAOsxB,KAAKtxB,KACZ,IAAK,IAAIvB,EAAI,EAAGA,EAAIk8C,UAAUj8C,OAAQD,KACpCs7C,YAAcpI,UAAUoI,YAAYW,UAAWC,UAAUl8C,KACvCq8C,YAChBA,UAAYf,YACZc,UAAYlJ,UAAUgJ,UAAUl8C,KAGpC,OAAIkzC,UAAUuI,WAAWQ,UAAWG,UAAW,CAC7CP,MACAt6C,SACK46C,sBACEC,WAEPvpB,KAAKspB,uBAAwB,EACtBjJ,UAAU8I,aAAaC,UAAW,CAAC,OAAQ,QAASppB,MAE/D,EAKA,IAAI6gB,MAAQR,UAAUQ,MAAQ,CAC5B4I,UAAW,SACXC,aAAc,SACdC,KAAM,MACNC,WAAY,SACZC,MAAO,SACPC,MAAO,SACPC,OAAQ,SACRC,MAAO,MACPC,eAAgB,SAChBC,KAAM,MACNC,WAAY,SACZC,MAAO,SACPC,UAAW,SACXC,YAAa,SACbC,UAAW,SACXC,WAAY,SACZC,UAAW,SACXC,MAAO,SACPC,eAAgB,SAChBC,SAAU,SACVC,QAAS,SACTC,KAAM,MACNC,SAAU,SACVC,SAAU,SACVC,cAAe,SACfC,SAAU,SACVC,UAAW,SACXC,SAAU,SACVC,UAAW,SACXC,YAAa,SACbC,eAAgB,SAChBC,WAAY,SACZC,WAAY,SACZC,QAAS,SACTC,WAAY,SACZC,aAAc,SACdC,cAAe,SACfC,cAAe,SACfC,cAAe,SACfC,cAAe,SACfC,WAAY,SACZC,SAAU,SACVC,YAAa,SACbC,QAAS,SACTC,QAAS,SACTC,WAAY,SACZC,UAAW,SACXC,YAAa,SACbC,YAAa,SACbC,QAAS,MACTC,UAAW,SACXC,WAAY,SACZC,KAAM,SACNC,UAAW,SACXC,KAAM,SACNC,MAAO,SACPC,YAAa,SACbC,KAAM,SACNC,SAAU,SACVC,QAAS,SACTC,UAAW,SACXC,OAAQ,SACRC,MAAO,SACPC,MAAO,SACPC,SAAU,SACVC,cAAe,SACfC,UAAW,SACXC,aAAc,SACdC,UAAW,SACXC,WAAY,SACZC,UAAW,SACXC,qBAAsB,SACtBC,UAAW,SACXC,WAAY,SACZC,UAAW,SACXC,UAAW,SACXC,YAAa,SACbC,cAAe,SACfC,aAAc,SACdC,eAAgB,MAChBC,eAAgB,MAChBC,eAAgB,SAChBC,YAAa,SACbC,KAAM,MACNC,UAAW,SACXC,MAAO,SACPC,QAAS,MACTC,OAAQ,SACRC,iBAAkB,SAClBC,WAAY,SACZC,aAAc,SACdC,aAAc,SACdC,eAAgB,SAChBC,gBAAiB,SACjBC,kBAAmB,SACnBC,gBAAiB,SACjBC,gBAAiB,SACjBC,aAAc,SACdC,UAAW,SACXC,UAAW,SACXC,SAAU,SACVC,YAAa,SACbC,KAAM,SACNC,QAAS,SACTC,MAAO,SACPC,UAAW,SACXC,OAAQ,SACRC,UAAW,SACXC,OAAQ,SACRC,cAAe,SACfC,UAAW,SACXC,cAAe,SACfC,cAAe,SACfC,WAAY,SACZC,UAAW,SACXC,KAAM,SACNC,KAAM,SACNC,KAAM,SACNC,WAAY,SACZC,OAAQ,SACRC,cAAe,SACfC,IAAK,MACLC,UAAW,SACXC,UAAW,SACXC,YAAa,SACbC,OAAQ,SACRC,WAAY,SACZC,SAAU,SACVC,SAAU,SACVC,OAAQ,SACRC,OAAQ,SACRC,QAAS,SACTC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,KAAM,SACNC,YAAa,SACbC,UAAW,SACXC,IAAK,SACLC,KAAM,SACNC,QAAS,SACTC,OAAQ,SACRC,UAAW,SACXC,OAAQ,SACRC,MAAO,SACPC,MAAO,MACPC,WAAY,SACZC,OAAQ,MACRC,YAAa,UAIXnM,SAAWrG,UAAUqG,SAMzB,SAAc/zB,GACZ,IAAImgC,QAAU,CAAC,EACf,IAAK,IAAI3lD,KAAKwlB,EACRA,EAAEzmB,eAAeiB,KACnB2lD,QAAQngC,EAAExlB,IAAMA,GAGpB,OAAO2lD,OACT,CAdoCC,CAAKlS,OAiBzC,SAASwB,WAAWhmC,GAKlB,OAJAA,EAAI22C,WAAW32C,IACX42C,MAAM52C,IAAMA,EAAI,GAAKA,EAAI,KAC3BA,EAAI,GAECA,CACT,CAGA,SAASulC,QAAQjpC,EAAG4qB,MA+BpB,SAAwB5qB,GACtB,MAAmB,iBAALA,IAAoC,GAAnBA,EAAEuI,QAAQ,MAAgC,IAAlB8xC,WAAWr6C,EACpE,EAhCMu6C,CAAev6C,KAAIA,EAAI,QAC3B,IAAIw6C,eAkCN,SAAsBx6C,GACpB,MAAoB,iBAANA,IAAqC,GAAnBA,EAAEuI,QAAQ,IAC5C,CApCuBkyC,CAAaz6C,GASlC,OARAA,EAAIsC,KAAKglC,IAAI1c,IAAKtoB,KAAKsoB,IAAI,EAAGyvB,WAAWr6C,KAGrCw6C,iBACFx6C,EAAIqqB,SAASrqB,EAAI4qB,IAAK,IAAM,KAI1BtoB,KAAKC,IAAIvC,EAAI4qB,KAAO,KACf,EAIF5qB,EAAI4qB,IAAMyvB,WAAWzvB,IAC9B,CAGA,SAASsgB,QAAQ1M,KACf,OAAOl8B,KAAKglC,IAAI,EAAGhlC,KAAKsoB,IAAI,EAAG4T,KACjC,CAGA,SAASkK,gBAAgBlK,KACvB,OAAOnU,SAASmU,IAAK,GACvB,CAcA,SAASoM,KAAK8P,GACZ,OAAmB,GAAZA,EAAEjmD,OAAc,IAAMimD,EAAI,GAAKA,CACxC,CAGA,SAASvR,oBAAoBnpC,GAI3B,OAHIA,GAAK,IACPA,EAAQ,IAAJA,EAAU,KAETA,CACT,CAGA,SAAS8qC,oBAAoBxjC,GAC3B,OAAOhF,KAAK8kC,MAAsB,IAAhBiT,WAAW/yC,IAAUkU,SAAS,GAClD,CAEA,SAASmtB,oBAAoBlgC,GAC3B,OAAOigC,gBAAgBjgC,GAAK,GAC9B,CACA,IAQMkyC,SAKAC,kBACAC,kBAdF1S,UAaEyS,kBAAoB,eALpBD,SAAW,8CAKoC,aAAeA,SAAW,aAAeA,SAAW,YACnGE,kBAAoB,cAAgBF,SAAW,aAAeA,SAAW,aAAeA,SAAW,aAAeA,SAAW,YAC1H,CACLA,SAAU,IAAIx9B,OAAOw9B,UACrB9S,IAAK,IAAI1qB,OAAO,MAAQy9B,mBACxBxS,KAAM,IAAIjrB,OAAO,OAAS09B,mBAC1BxS,IAAK,IAAIlrB,OAAO,MAAQy9B,mBACxBtS,KAAM,IAAInrB,OAAO,OAAS09B,mBAC1BtS,IAAK,IAAIprB,OAAO,MAAQy9B,mBACxBpS,KAAM,IAAIrrB,OAAO,OAAS09B,mBAC1B/R,KAAM,uDACNF,KAAM,uDACNC,KAAM,uEACNJ,KAAM,yEAOV,SAASO,eAAerB,OACtB,QAASQ,SAASwS,SAASr2C,KAAKqjC,MAClC,CAiIA,IAmnBIg7F,UACAC,qBACAC,sBACAC,UAu8BAC,SAytCAC,6BAgxBAC,oBACAC,kBAwiCAC,uBACAC,qCA5kJAC,wBAA0BhwI,OAAO2X,OAAO08B,UAAU,CACpDrmC,EAAG,IACHrO,EAAG,IACH80C,EAAG,IACHpkC,EAAG,KAED4/H,sBAAwBjwI,OAAO2X,OAAO08B,UAAU,CAClDrmC,EAAG,EACHrO,EAAG,EACH80C,EAAG,EACHpkC,EAAG,MAED6/H,UAAYlwI,OAAO2X,OAAO,CAC5Bw4H,kBAAmB,gCACnBC,gBAAiB,GACjBC,mBAAoB,GACpBC,mBAAoB,IACpBC,iBAAkBP,wBAClBQ,eAAgBP,sBAChBQ,gBAAiB,UACjBC,iBAAkB,IAQhB3uH,eAAiB,WACnB,IAAIytC,UAAY0gF,UAAUO,gBACtB/gF,WAAawgF,UAAUQ,iBACvBC,MAAQT,UAAUC,kBAClB7gF,UAAY4gF,UAAUE,gBACtBQ,6BAA+BV,UAAUE,gBACzCS,aAAeX,UAAUG,mBACzBS,aAAeZ,UAAUI,mBACzBS,WAAab,UAAUK,iBAAiBr1F,QACxC+mE,iBAAmBiuB,UAAUM,eAAet1F,QAC5CmlB,mBAAqB5N,+BACrBu+E,eAAiB,CAAC,EAIlBC,YAAc,SAAqB/8H,OACrCo7C,UAAYrgD,KAAKglC,IAAIhlC,KAAKsoB,IAAIrjB,MAAO28H,cAAeC,aACtD,EAyEA,OA7EEE,eAAe5sI,OAAO2d,eAAeC,iBAAmB,GA6EnDhiB,OAAOsX,iBAAiB,CAC7B45H,YAzEgB,SAAqB92G,KACrCo1B,UAAYp1B,IAAIq2G,gBAChB/gF,WAAat1B,IAAIs2G,iBACjBC,MAAQv2G,IAAI+1G,kBACZ7gF,UAAYl1B,IAAIg2G,gBAChBS,aAAez2G,IAAI+2G,mBACnBL,aAAe12G,IAAIg3G,mBACnBL,WAAa18F,UAAUja,IAAIm2G,kBAC3BtuB,iBAAmB5tE,UAAUja,IAAIi3G,WACjChxE,mBAAqBjmC,IAAIykC,iBAC3B,EAgEEyyE,aA/DiB,WACjB9hF,UAAY0gF,UAAUO,gBACtB/gF,WAAawgF,UAAUQ,iBACvBC,MAAQT,UAAUC,kBAClB7gF,UAAY4gF,UAAUE,gBACtBQ,6BAA+BV,UAAUE,gBACzCS,aAAeX,UAAUG,mBACzBS,aAAeZ,UAAUI,mBACzBS,WAAab,UAAUK,iBAAiBr1F,QACxC+mE,iBAAmBiuB,UAAUM,eAAet1F,OAC9C,EAsDEq2F,+BArDmC,SAAwC/O,YAAaC,cACxF,IAAI+O,OAAShP,YAxEM,KAyEfiP,OAAShP,aAxEO,KAyEpBmO,6BAA+B3hI,KAAKqiC,MA3EH,GA2E0CriC,KAAKglC,IAAIu9F,OAAQC,QAxExE,GAyEtB,EAkDEjrI,iBA1CqB,SAA0BD,UAAWT,cACrDkrI,eAAezqI,YAGpByqI,eAAezqI,WAAWjC,KAAKwB,aACjC,EAsCEY,oBArCwB,SAA6BH,UAAWT,cAChE,GAAKkrI,eAAezqI,WAIpB,IADA,IAAImrI,WAAaV,eAAezqI,WACvBpF,EAAI,EAAGA,EAAIuwI,WAAWtwI,OAAQD,IACrC,GAAIuwI,WAAWvwI,KAAO2E,aAAc,CAClC4rI,WAAWv8H,OAAOhU,EAAG,GACrB,KACF,CAEJ,GA2BG,CACDsuD,SAAU,CACRzsD,IAAK,WACH,OAAOwsD,SACT,GAEF5tD,OAAQ,CACNoB,IAAK,WACH,OAAO0sD,UACT,GAEFiiF,KAAM,CACJ3uI,IAAK,WACH,OAAO2tI,KACT,EACAhuI,IAAK,SAAauR,OAChBy8H,MAAQz8H,KACV,GAEF09H,uBAAwB,CACtB5uI,IAAK,WAKH,OAJmB2tI,MAAMhzG,MAAM,KACO7zB,KAAI,SAAUglD,YAClD,MAAO,IAAOA,WAAWkW,OAAS,GACpC,IAC0B/kC,KAAK,IACjC,GAEF8uB,SAAU,CACR/rD,IAAK,WACH,OAAOssD,SACT,EACA3sD,IAAKsuI,aAEPY,4BAA6B,CAC3B7uI,IAAK,WACH,OAAO4tI,4BACT,GAEFkB,YAAa,CACX9uI,IAAK,WACH,OAAO6tI,YACT,GAEFkB,YAAa,CACX/uI,IAAK,WACH,OAAO8tI,YACT,GAEFkB,UAAW,CACThvI,IAAK,WACH,OAAO+tI,UACT,EACApuI,IAAK,SAAauR,OAChB68H,WAAa18F,UAAUngC,MACzB,GAEFi7D,gBAAiB,CACfnsE,IAAK,WACH,OAAOi/G,gBACT,EACAt/G,IAAK,SAAauR,OAChB+tG,iBAAmB5tE,UAAUngC,MAC/B,GAEF+9H,kBAAmB,CACjBjvI,IAAK,WACH,OAAOi/G,iBAAiB1oE,UAC1B,EACA52C,IAAK,SAAauR,OAChB+tG,iBAAiBpoE,SAAS3lC,MAC5B,GAEF2qD,kBAAmB,CACjB77D,IAAK,WACH,OAAOq9D,kBACT,GAEF1P,aAAc,CACZ3tD,IAAK,WACH,OAAOq9D,mBAAmBxO,kBAC5B,EACAlvD,IA5GkB,SAAyBuvI,iBAzB3B,IAAuB3rI,UA0BzC85D,mBAAmBlP,gBAAgB+gF,iBACnCjwB,iBAAmB5tE,UAAU,CAC3BrmC,EAAGqyD,mBAAmBxO,mBAAmB5C,QAAQjhD,EACjDrO,EAAG0gE,mBAAmBxO,mBAAmB5C,QAAQtvD,EACjD80C,EAAG4rB,mBAAmBxO,mBAAmB5C,QAAQxa,EACjDpkC,EAAGgwD,mBAAmBxO,mBAAmB3B,YAE3C6gF,WAAa18F,UAAU,CACrBrmC,EAAGqyD,mBAAmBxO,mBAAmB7C,QAAQhhD,EACjDrO,EAAG0gE,mBAAmBxO,mBAAmB7C,QAAQrvD,EACjD80C,EAAG4rB,mBAAmBxO,mBAAmB7C,QAAQva,IAEnDw8F,YAAY5wE,mBAAmBxO,mBAAmB9C,UAClD4hF,MAAQtwE,mBAAmBxO,mBAAmB/C,WAC9CY,WAAa2Q,mBAAmBxO,mBAAmBlC,UACnDH,UAAY6Q,mBAAmBxO,mBAAmBpC,SAzCTlpD,UA0C3BnC,OAAO2d,eAAeC,gBAzChCgvH,eAAezqI,YACjByqI,eAAezqI,WAAWjE,SAAQ,SAAU6vI,eAC1CA,eACF,GAuCJ,GA4FEC,YAAa,CACXpvI,IAAK,WACH,OAAOq9D,mBAAmBtO,gBAC5B,IAGN,EACIsgF,wBAQM,WACN,OAAOtwH,gBACT,EAVEswH,0BAWQ,WACR,OAAOnC,SACT,EAgYEoC,WAxXW,WACb,IAAIvV,qBACAC,oBACAE,cAAgB,IAAIjF,WAAU,SAAUhnG,QAAS8Z,QACnDgyF,qBAAuB9rG,QACvB+rG,oBAAsBjyF,MACxB,IACI0kG,UAAYr1G,WAAW,IAIvBm4G,wBAA0B,KAC1BC,iBAAmBH,4BACnBI,gBAAkB,KAClBC,4BAA8B,GAC9BC,iBAAmB,SAASA,iBAAiBlsB,OAAQmsB,WAAYC,oBACnEJ,gBAAkB33B,EAAE3H,KAAK,CACvBntG,KAAM,MACNusG,IAAKkU,OACL5R,YAAag+B,mBACbrhC,SAAU,OACVhE,QAbkB,MAcjB5iE,MAAK,SAAUljB,MACZkrH,WAdU,GAeZjgE,IAAIE,WAAW,mCAfH,EAesD+/D,YAAc,qBAElFH,gBAAkB,KAClBK,SAASprH,KACX,IAAGupE,MAAK,WACNwhD,gBAAkB,KACdG,WAAa,EACf3gI,YAAW,WACT0gI,iBAAiBlsB,SAAUmsB,WAC7B,GAvBoB,EAuBIC,oBAExB7V,oBAAoB,yCAExB,GACF,EAII8V,SAAW,SAAkB5zE,QAC/B,IACEuwE,UAAYr1G,WAAW8kC,QACvB69D,sBACF,CAAE,MAAOzxF,KACPC,QAAQC,KAAK,oCAAqCF,KAClD0xF,oBAAoB,mCACtB,CACF,EAqEI+V,iCAAmC,WACrC,OAAO7f,oBAAoBb,yBAA2Ba,oBAAoBb,wBAAwBr/D,MAAM5xD,QAAU8xH,oBAAoBb,wBAAwBr/D,MAAM,GAAGtgB,KACzK,EACA,OAAO1yC,OAAOsX,iBAAiB,CAC7B+lF,KApFY,SAAiBopB,OAAQosB,oBACrCF,iBAAiBlsB,OA/BD,EA+BsBosB,mBACxC,EAmFE78C,MAAO88C,SACPpuE,uBA7B2B,SAAgCsuE,iBAC3D,IAAIC,kBAAoB,CAAC,EACzB,OAAOhb,UAAUjtF,IAAIgoG,gBAAgBlpI,KAAI,SAAUopI,gBACjD,OAtB2C5zD,IAsBpB4zD,eAAe5zD,IApBjC,IAAI24C,WAAU,SAAUhnG,SAC7BkiH,mBAAqBr4B,EAAE3H,KAAK,CAC1BntG,KAAM,MACNusG,IAAKjzB,IACLkyB,SAAU,OACVhE,QA5EgB,MA6Ef5iE,MAAK,SAAUwoG,aAChBD,mBAAqB,KACrBliH,QAAQmiH,YACV,IAAGniD,MAAK,WACN1lD,QAAQC,KAAK,iCAAmC8zC,IAAM,KACtD6zD,mBAAqB,KACrBliH,SACF,IACAyhH,4BAA4BpuI,KAAK6uI,mBACnC,KAK6C5oG,MAAK,SAAU6oG,aACxDH,kBAAkBC,eAAetzG,oBAAsBwzG,WACzD,IAxBkB,IAAyB9zD,IACzC6zD,kBAwBJ,KAAI5oG,MAAK,WACPklG,UAAU5wE,kBAAkB5M,gBAG5B+gF,gBAAgB1wI,SAAQ,SAAU4wI,gBAC5BD,kBAAkBC,eAAetzG,qBACnC6vG,UAAU/qE,uBAAuBwuE,eAAe5zD,IAAK2zD,kBAAkBC,eAAetzG,oBAAqBszG,eAAetzG,mBAE9H,GACF,GACF,EAcEyzG,qBAbyB,WACzBZ,iBAAmBA,gBAAgB/9B,QACnCg+B,4BAA4BpwI,SAAQ,SAAU6wI,oBAC5CA,oBAAsBA,mBAAmBz+B,OAC3C,GACF,GASG,CACDjlB,MAAO,CACLzsF,IAAK,WACH,OAAOk6H,aACT,GAEFoW,oBAAqB,CACnBtwI,IAAK,WACH,OAAOkwH,oBAAoBb,yBAA2Bod,UAAU9sE,aAAe8sE,UAAU19E,kBAAoB09E,UAAU7sE,kBAAoB6sE,UAAU5sE,YACvJ,GAEF0wE,YAAa,CACXvwI,IAAK,WACH,OAAOkwH,oBAAoBb,yBAA2Bod,UAAU9sE,WAClE,GAEF6wE,gBAAiB,CACfxwI,IAAK,WACH,OAAOysI,UAAU19E,gBACnB,GAEF0hF,gBAAiB,CACfzwI,IAAK,WACH,OAAOysI,UAAU7sE,gBACnB,GAEF8wE,QAAS,CACP1wI,IAAK,WACH,OAAOysI,UAAU5sE,YACnB,GAEF8wE,mBAAoB,CAClB3wI,IAAK,WACH,OAAOysI,UAAU1sE,kBACnB,GAEF6wE,mBAAoB,CAClB5wI,IAAK,WACH,OAAOysI,UAAUzsE,kBACnB,GAEF6wE,mBAAoB,CAClB7wI,IAAK,WACH,IAAI8wI,sBAAwBrE,UAAU19E,kBAAoB09E,UAAU1sE,oBAAsB0sE,UAAUzsE,mBACpG,OAAOkwD,oBAAoBb,yBAA2Bod,UAAU9sE,aAAemxE,uBAAyB5gB,oBAAoBzK,iBAC9H,GAEFrmD,QAAS,CACPp/D,IAAK,WACH,OAAOysI,UAAUrtE,OACnB,GAEFC,SAAU,CACRr/D,IAAK,WACH,OAAOysI,UAAUptE,QACnB,GAEFupE,cAAe,CACb5oI,IAAK,WACH,OAAOysI,UAAUj+F,SAASt9B,KAC5B,GAEFytD,MAAO,CACL3+D,IAAK,WACH,OAAOysI,UAAU9tE,KACnB,GAEFwb,qBAAsB,CACpBn6E,IAAK,WACH,OAAOysI,UAAUxsE,YAAcwsE,UAAUxsE,WAAWrK,WAAa62E,UAAUxsE,WAAWrK,WAAa,EACrG,GAEFm7E,YAAa,CACX/wI,IAAK,WACH,OAAOysI,UAAU9sE,YAAc8sE,UAAUr8E,qBAAqB1gB,MAAQ,IACxE,GAEFshG,kBAAmB,CACjBhxI,IAAK,WACH,OAAOysI,UAAU9sE,YAAc8sE,UAAUr8E,qBAAqBH,WAAa,IAC7E,GAEFghF,aAAc,CACZjxI,IAAK,WACH,OAAIkwH,oBAAoBb,wBACfa,oBAAoBb,wBAAwBr/D,MAC1Cy8E,UAAU9sE,YACZ8sE,UAAUr8E,qBAAqBJ,MAEjC,EACT,GAEFkhF,oBAAqB,CACnBlxI,IAAK,WACH,OAAOysI,UAAUzsE,mBAAqBysE,UAAUx1E,YAAYH,QAAU,EACxE,GAEFq6E,oBAAqB,CACnBnxI,IAAK,WA9KwB,IAC3BoxI,cACAC,WAgLA,OAHI5E,UAAU1sE,oBAAkD,OAA5BwvE,0BA9KpC6B,cAAgB,KAChBC,YAAc,EAClB9B,wBAA0B,GAC1B9C,UAAU/0E,gBAAgBZ,QAAQx3D,SAAQ,SAAU04D,MAC9CA,KAAK3pB,YAAc+iG,gBACrBC,aACAD,cAAgBp5E,KAAK3pB,UACrBkhG,wBAAwB8B,YAAc,CACpChjG,UAAW2pB,KAAK3pB,UAChBmB,KAAMwoB,KAAKxoB,KACXE,MAAOsoB,KAAKtoB,MACZM,eAAgBgoB,KAAKhoB,eACrBggB,MAAO,KAGXu/E,wBAAwB8B,YAAYrhF,MAAM1uD,KAAK02D,KACjD,IACAu3E,wBAAwBjwI,SAAQ,SAAUgyI,aACxCA,YAAY70G,KAAO60G,YAAYthF,MAAMlpD,KAAI,SAAUkxD,MACjD,OAAOA,KAAKh3D,IACd,IAAGgJ,QAAO,SAAUunI,iBAAkBC,iBACpC,OAAOD,iBAAmB,IAAMC,eAClC,GACF,KA0JW/E,UAAU1sE,mBAAqBwvE,wBAA0B,EAClE,GAEFkC,iBAAkB,CAChBzxI,IAAK,WACH,OAAOysI,UAAU7sE,iBAAmB6sE,UAAUl6E,aAAaH,SAAW,EACxE,GAEF+C,SAAU,CACRn1D,IAAK,WACH,OAAOysI,UAAU5sE,aAAe4sE,UAAUn2E,UAAUnB,SAAW,IACjE,GAEFuzE,kBAAmB,CACjB1oI,IAAK,WACH,OAAOysI,UAAU5sE,aAAe4sE,UAAUn2E,UAAUlB,cAAgB,IACtE,GAEFozE,kBAAmB,CACjBxoI,IAAK,WACH,OAAOysI,UAAU5sE,aAAe4sE,UAAUn2E,UAAUjB,cAAgB,IACtE,GAEFkzE,WAAY,CACVvoI,IAAK,WACH,OAAOysI,UAAU5sE,aAAe4sE,UAAUn2E,UAAUhB,OAAS,IAC/D,GAEFuzE,iBAAkB,CAChB7oI,IAAK,WACH,OAAOysI,UAAU5sE,aAAe4sE,UAAUn2E,UAAUf,aAAe,IACrE,GAEFozE,aAAc,CACZ3oI,IAAK,WACH,OAAOysI,UAAU5sE,aAAe4sE,UAAUn2E,UAAUd,SAAW,IACjE,GAEFC,SAAU,CACRz1D,IAAK,WACH,OAAOysI,UAAU5sE,aAAe4sE,UAAUn2E,UAAUb,SAAW,IACjE,GAEFgzE,eAAgB,CACdzoI,IAAK,WACH,OAAOysI,UAAU5sE,aAAe4sE,UAAUn2E,UAAUZ,WAAa,IACnE,GAEFozE,kBAAmB,CACjB9oI,IAAK,WACH,OAAOysI,UAAU5sE,aAAe4sE,UAAUn2E,UAAUX,cAAgB,IACtE,GAEF2kB,eAAgB,CACdt6E,IAAK,WACH,OAAOysI,UAAU5sE,cAAgB4sE,UAAUn2E,UAAUV,WAAa62E,UAAUn2E,UAAUV,WAAa,EACrG,GAEFmzE,qBAAsB,CACpB/oI,IAAK,WACH,OAAOysI,UAAU5sE,aAAe4sE,UAAUn2E,UAAUT,aAAe,EACrE,GAEFgG,kBAAmB,CACjB77D,IAAK,WACH,OAAOysI,UAAU5wE,iBACnB,GAEF61E,6BAA8B,CAC5B1xI,IAAK,WACH,OAAOysI,UAAU19E,kBAAoB09E,UAAU5wE,kBAAkBvrB,wBAAwBlyC,OAAS,CACpG,GAEFuzI,aAAc,CACZ3xI,IAAK,WACH,OAAOysI,UAAU19E,iBAAmB09E,UAAU5wE,kBAAkBhN,mBAAmBxB,kBAAkBnC,SAAW,EAClH,GAEFiiF,kBAAmB,CACjBntI,IAAK,WACH,OAAOysI,UAAU19E,uBAAkFjvD,IAA9D2sI,UAAU5wE,kBAAkBhN,mBAAmB/C,WAA2B2gF,UAAU5wE,kBAAkBhN,mBAAmB/C,WAAa0jF,iBAAiBrC,iBAC9L,GAEFC,gBAAiB,CACfptI,IAAK,WACH,OAAOysI,UAAU19E,uBAAgFjvD,IAA5D2sI,UAAU5wE,kBAAkBhN,mBAAmB9C,SAAyB0gF,UAAU5wE,kBAAkBhN,mBAAmB9C,SAAWyjF,iBAAiBpC,eAC1L,GAEFe,mBAAoB,CAClBnuI,IAAK,WACH,OAAOwvI,iBAAiBnC,kBAC1B,GAEFe,mBAAoB,CAClBpuI,IAAK,WACH,OAAOwvI,iBAAiBlC,kBAC1B,GAEFsE,iBAAkB,CAChB5xI,IAAK,WACH,OAAOysI,UAAU19E,uBAAiFjvD,IAA7D2sI,UAAU5wE,kBAAkBhN,mBAAmB3B,UAA0Bu/E,UAAU5wE,kBAAkBhN,mBAAmB3B,UAAYsiF,iBAAiBhC,eAAej3F,UAC3M,GAEFg3F,iBAAkB,CAChBvtI,IAAK,WACH,OAAOysI,UAAU19E,uBAAkFjvD,IAA9D2sI,UAAU5wE,kBAAkBhN,mBAAmB5B,WAA2Bw/E,UAAU5wE,kBAAkBhN,mBAAmB5B,WAAauiF,iBAAiBjC,iBAAiBt2F,aAC/M,GAEFu2F,eAAgB,CACdxtI,IAAK,WACH,OAAOysI,UAAU19E,uBAA+EjvD,IAA3D2sI,UAAU5wE,kBAAkBhN,mBAAmB5C,QAAwBwgF,UAAU5wE,kBAAkBhN,mBAAmB5C,QAAUujF,iBAAiBhC,eAAev2F,aACvM,GAEFo3F,UAAW,CACTruI,IAAK,WACH,OAAOysI,UAAU19E,kBAAoB09E,UAAU5wE,kBAAkBhN,mBAAmBzB,eAAiBq/E,UAAU5wE,kBAAkBhN,mBAAmBzB,eAAiBoiF,iBAAiBhC,eAAel2F,aACvM,GAEFm2F,gBAAiB,CACfztI,IAAK,WACH,OAAOysI,UAAU19E,uBAAgFjvD,IAA5D2sI,UAAU5wE,kBAAkBhN,mBAAmBpC,SAAyBggF,UAAU5wE,kBAAkBhN,mBAAmBpC,SAAW+iF,iBAAiB/B,eAC1L,GAEFC,iBAAkB,CAChB1tI,IAAK,WACH,OAAOysI,UAAU19E,uBAAiFjvD,IAA7D2sI,UAAU5wE,kBAAkBhN,mBAAmBlC,UAA0B8/E,UAAU5wE,kBAAkBhN,mBAAmBlC,UAAY6iF,iBAAiB9B,gBAC5L,GAEFmE,kBAAmB,CACjB7xI,IAAK,WACH,OAAO+vI,oCAAsCtD,UAAU/sE,qBACzD,GAEFoyE,iBAAkB,CAChB9xI,IAAK,WACH,OAAI+vI,mCACK7f,oBAAoBb,wBAAwBr/D,MAAM,GAAGtgB,MACnDwgF,oBAAoBlM,kBACtBkM,oBAAoBlM,kBACjB8mB,yBAAyB2B,UAAUhtE,sBAGxCywD,oBAAoBxN,qBAAqB+pB,UAAUhtE,sBAFjDywD,oBAAoBlF,iBAAmBkF,oBAAoBxN,qBAAqB+pB,UAAUhtE,qBAGrG,IAGN,EAkCIsyE,WAAa,WAEb,IAAIxiC,KAjBF2gB,oBAAoBiC,2BACfjC,oBAAoBiC,2BAJhB,kCACU,kBAmByBma,UAAY,WAC1DG,UAAY6C,cACFj1C,KAAKkV,KAAK,GACpBk9B,UAAUhgD,MAAMllD,MAAK,YAfN,SAAsByqG,UACnCzF,sBACFA,qBAAqBpvI,KAAKqC,KAAMwyI,SAEpC,CAYMC,CAAaxF,UACf,IAAU,OAAE,SAAU74H,OACpB+7D,IAAIE,WAAW,uCAAyCj8D,OAZxD44H,uBACFA,sBAAsBrvI,MAatB,GAEJ,EAII+0I,cAAgB,CAClBC,UAAW,SAAmBloB,UAC5BqiB,UAAYriB,SACZ8nB,YACF,EACA1B,qBAR2B,WAC3B5D,WAAaA,UAAU4D,sBACzB,EAOE7sI,iBAAkB,SAA0BR,KAAM8sE,UAC5C9sE,OAAS5B,OAAOyf,OAAOC,YACzByrH,qBAAuBz8D,SACd9sE,OAAS5B,OAAOyf,OAAOhN,QAChC24H,sBAAwB18D,SAE5B,EACApsE,oBAAqB,SAA6BV,MAC5CA,OAAS5B,OAAOyf,OAAOC,YACzByrH,0BAAuBzsI,EACdkD,OAAS5B,OAAOyf,OAAOhN,QAChC24H,2BAAwB1sI,EAE5B,GA8FEsyI,6BA3FsB,WACxB,IAAIC,KAAO,WAAiB,EAE5B,OAAOr1I,OAAOsX,iBAAiB,CAC7Bg+H,UAAWD,KACXE,QAASF,KACTG,KAAMH,KACN1gF,MAAO0gF,KACPI,mBAAoBJ,KACpB7uI,iBAAkB6uI,KAClB3uI,oBAAqB2uI,KACrBK,sBAAuBL,KACvBM,yBAA0BN,KAC1BO,mBAAoBP,KACpBQ,mBAAoBR,KACpBS,aAAcT,KACdU,aAAcV,KACdW,gCAAiCX,KACjCY,gBAAiBZ,MAChB,CACDa,mBAAoB,CAClBlzI,IAAK,WACH,OAAOmzI,QAAQllH,SACjB,GAEFmlH,WAAY,CACVpzI,IAAK,WAEL,GAEF8nG,YAAa,CACX9nG,IAAK,WACH,OAAO,CACT,EACAL,IAAK0yI,MAEP7jG,SAAU,CACRxuC,IAAK,WACH,OAAO,CACT,GAEFqzI,OAAQ,CACNrzI,IAAK,WACH,OAAO,CACT,GAEFszI,OAAQ,CACNtzI,IAAK,WACH,OAAO,CACT,EACAL,IAAK0yI,MAEPkB,MAAO,CACLvzI,IAAK,WACH,OAAO,CACT,EACAL,IAAK0yI,MAEPmB,aAAc,CACZxzI,IAAK,WACH,OAAO,CACT,EACAL,IAAK0yI,MAEPoB,MAAO,CACLzzI,IAAK,WACH,OAAO,CACT,GAEF0zI,QAAS,CACP1zI,IAAK,WACH,OAAO,CACT,GAEF2zI,SAAU,CACR3zI,IAAK,WACH,MAAO,EACT,GAEF4zI,OAAQ,CACN5zI,IAAK,WACH,MAAO,EACT,GAEF6zI,SAAU,CACR7zI,IAAK,WACH,MAAO,EACT,IAGN,EAaI8zI,wBARgB,WAElB,IAAIC,IAAM,SAAa7yI,GACrB,IAAIhD,GAAK+N,KAAKmlC,SAASjsB,SAAS,IAAM,aAAa0tB,OAAO,EAAG,GAC7D,OAAO3xC,EAAI,IAAMhD,EAAE20C,OAAO,EAAG,GAAK,IAAM30C,EAAE20C,OAAO,EAAG,GAAK30C,CAC3D,EACA,OAAO61I,MAAQA,KAAI,GAAQA,KAAI,GAAQA,KACzC,EAKIC,mBAAqB,KAkCrBC,6BAjCc,WAChB,OAAOD,kBACT,EA+BIC,6BA9Bc,SAAqBC,mBACrCF,mBAAqBE,iBACvB,EA4BID,qCA3BsB,WACxBtkE,IAAIE,WAAW,6CACjB,EAyBIokE,2BAxBY,SAAmBE,OAAQ3iF,MAAOtgD,OAChD,GAA2B,OAAvB8iI,mBAAJ,CAIA,IAAIljB,oBAAsBZ,oBAAoBe,yBAC9C,GAAIf,oBAAoBc,0BAA2D,mBAAxBF,oBAEzDA,oBAAoB,CAClBsjB,SAFkBlkB,oBAAoB/G,gCAAkC+G,oBAAoBM,mBAAqBwjB,mBAGjHG,OACA3iF,MACAtgD,OARJ,MAFEy+D,IAAIE,WAAW,0EAanB,EASIokE,8BARe,SAAsB1wI,UAAW8wI,aAC9CnkB,oBAAoBpN,kBAAoE,mBAAzCoN,oBAAoBpN,kBACrEoN,oBAAoBpN,iBAAiB,CACnCv/G,UACA8wI,aAGN,EAYIC,6BAOgB,EAPhBA,6BASgB,EAuPhBC,qCA3O8B,SAAqCC,iBAAkBC,4BAA6BC,0BAA2BC,aAC/I,IAAIC,qCAAsC,EACtCC,qCAAsC,EACtCC,iCAAmC,EACnCC,mCAAqC,EACrCC,UAAYlB,0BACZmB,eAAiBp8B,4BACjBq8B,gBAAkB,CAAC,EACnBC,mBAAqB,KACrBC,YAAa,EACbC,qCAAsC,EACtCC,cAAgBd,iBAAiBe,aACjCC,YAAc,KACdC,cAAgB,GAChBC,oBAAsB,EAC1BhB,0BAA4BA,2BAA6B,WACvD,MAAO,EACT,EACA,IAGIiB,cAAgB,WAElB,OADSH,aAA4B,QAAUR,WACnC,KAAOC,cACrB,EACIW,mCAAqC,WACvCP,qCAAsC,EAClCH,gBAAgB9zI,OAAO+W,SAASiB,yBAClC87H,gBAAgB9zI,OAAO+W,SAASiB,yBAEpC,EACIy8H,8BAAgC,WAClCR,qCAAsC,EAClCH,gBAAgB9zI,OAAO+W,SAASkB,yBAClC67H,gBAAgB9zI,OAAO+W,SAASkB,yBAEpC,EACIy8H,iBAAmB,WACrBL,cAAcn2I,SAAQ,SAAUy2I,aAC9B9B,2BAA2B8B,YAAYpzI,MAAMK,KAAM+yI,YAAYpzI,MAAM6uD,MAAOukF,YAAYpzI,MAAMuO,OAC9F+iI,8BAA8B8B,YAAYC,SAASzyI,UAAWwyI,YAAYC,SAAS3B,YACrF,IACAoB,cAAgB,EAClB,EACIQ,qBAAuB,SAA8BC,mBAKvD,GAHIb,sCAAwCC,cAAcjC,SAAW+B,YAAcc,mBAAqB5B,8BACtGuB,gCAEEK,oBAAsBf,mBAA1B,CAGA,IAAIgB,mBAAqBhB,mBAEzB,GADAA,mBAAqBe,kBACjBC,qBAAuB7B,8BAAgCa,mBAAqBb,+BAAiCgB,cAAc7B,OAASoB,sCAAwCF,YAAYyB,cAAe,CACzM,IAAIC,WAAaV,gBACjBU,YAAc3B,4BACd,IAAI4B,UAAY3gB,YAAYrgG,MAC5BmgH,cAAcn0I,KAAK,CACjB2nE,KAAMqtE,UACN3zI,MAAO,CACLK,KAAM5B,OAAO+e,UAAUD,2BACvBsxC,MAAO6kF,WACPnlI,MAAO,GAET8kI,SAAU,CACRzyI,UAAWnC,OAAOme,IAAIW,2BACtBm0H,YAAa,CACXkC,iBAAkBF,eAIxBT,oCACF,CACIT,qBAAuBb,gCACgB,IAArCQ,kCACFhf,iCAAiC10H,OAAO+d,OAAOG,mBAAoBle,OAAO+d,OAAOG,oBACjFm1H,4BAA4B,CAACrzI,OAAO+d,OAAOG,qBAC3Cw1H,gCAAkCp4I,OAAOi5H,YAAYrgG,MAAQy/G,mCAE/DH,qCAAsC,EACtCC,qCAAsC,IAEZ,IAAxBa,oBACFxmI,aAAawmI,oBAEfA,mBAAqBzmI,WAAW6mI,iBA7GA,IA0EhC,CAoCF,EACIU,sBAAwB,SAA+B54I,GACrDA,EAAEuF,aAAkCrD,IAAxBlC,EAAEuF,OAAOyF,YACvBqtI,qBAAqBr4I,EAAEuF,OAAOyF,WAElC,EACI6tI,uBAAyB,SAAgC74I,GACvDA,EAAEuF,aAAkCrD,IAAxBlC,EAAEuF,OAAOyF,YACvBqtI,qBAAqBr4I,EAAEuF,OAAOyF,WAElC,EACI8tI,mCAAqC,WAEvC,IADA,IAAIztE,KAAO0sD,YAAYrgG,MACdn3B,EAAIs3I,cAAcr3I,OAAS,EAAGD,GAAK,EAAGA,IACzC8qE,KAAOwsE,cAAct3I,GAAG8qE,MA3HS,KA4HnCwsE,cAActjI,OAAOhU,EAAG,EAG9B,EACIw4I,sBAAwB,SAA+B/4I,GACzD84I,qCACKtB,aACHA,YAAa,EACbP,qCAAsC,EACtCe,qCACIh4I,EAAEuF,aAAkCrD,IAAxBlC,EAAEuF,OAAOyF,YACvBqtI,qBAAqBr4I,EAAEuF,OAAOyF,YAGpC,EACIguI,qBAAuB,SAA8Bh5I,GACnDA,EAAEuF,aAAkCrD,IAAxBlC,EAAEuF,OAAOyF,YACvBqtI,qBAAqBr4I,EAAEuF,OAAOyF,YAEhCitI,gCACAT,YAAa,CACf,EACIyB,sBAAwB,SAA+Bj5I,GACrDA,EAAEuF,aAAkCrD,IAAxBlC,EAAEuF,OAAOyF,YACvBqtI,qBAAqBr4I,EAAEuF,OAAOyF,WAElC,EACIkuI,yBAA2B,SAAkCl5I,GAC3DA,EAAEuF,aAAkCrD,IAAxBlC,EAAEuF,OAAOyF,YACvBqtI,qBAAqBr4I,EAAEuF,OAAOyF,WAElC,EACImuI,wBAA0B,SAASA,0BACrCjhB,gCAAgC10H,OAAO+d,OAAOE,qBAC9Cy2G,gCAAgC10H,OAAO+d,OAAOnI,iBAC9C8+G,gCAAgC10H,OAAO+d,OAAOlI,cAC9C6+G,gCAAgC10H,OAAO+d,OAAOG,oBAC9Cy1H,kCAAoCr4I,OAAOi5H,YAAYrgG,MACvD54B,OAAOuS,YAAW,WACX2lI,sCACHX,2BAA2B7yI,OAAO+e,UAAUF,6BAA8B01H,iBAC1E1B,8BAA8B7yI,OAAOme,IAAIU,6BAA8B,CACrEs2H,iBAAkBZ,kBAGxB,GA3KsC,KA4KtCL,cAAc5xI,oBAAoBtC,OAAOyV,cAAcC,eAAgBigI,wBACzE,EACIC,6BAA+B,SAASA,+BAC1C1B,cAAc5xI,oBAAoBtC,OAAOyV,cAAcE,oBAAqBigI,8BAC5ElhB,iCAAiC10H,OAAO+d,OAAOE,oBAAqBje,OAAO+d,OAAOE,qBAClFo1H,4BAA4B,CAACrzI,OAAO+d,OAAOE,qBAC7C,EACI43H,yBAA2B,SAASA,2BACtC3B,cAAc5xI,oBAAoBtC,OAAOyV,cAAcG,gBAAiBigI,0BACxEnhB,iCAAiC10H,OAAO+d,OAAOnI,gBAAiB5V,OAAO+d,OAAOnI,iBAC9Ey9H,4BAA4B,CAACrzI,OAAO+d,OAAOnI,iBAC7C,EACIkgI,sBAAwB,SAASA,wBACnC5B,cAAc5xI,oBAAoBtC,OAAOyV,cAAcI,aAAcigI,uBACrEphB,iCAAiC10H,OAAO+d,OAAOlI,aAAc7V,OAAO+d,OAAOlI,cAC3Ew9H,4BAA4B,CAACrzI,OAAO+d,OAAOlI,cAC7C,EACIkgI,sBAAwB,WAC1BT,qCACAvB,mBAAqB,KACrBP,qCAAsC,EACtCC,qCAAsC,CACxC,EACIuC,2BAA6B,WAC3BhC,YAGJS,+BACF,EAwCA,OAtCErB,iBAAiBhxI,iBAAiBpC,OAAO+W,SAASiB,uBAAwBw8H,oCAC1EpB,iBAAiBhxI,iBAAiBpC,OAAO+W,SAASkB,uBAAwBw8H,+BAC1EP,cAAc9xI,iBAAiBpC,OAAOyV,cAAcC,eAAgBigI,yBACpEzB,cAAc9xI,iBAAiBpC,OAAOyV,cAAcE,oBAAqBigI,8BACzE1B,cAAc9xI,iBAAiBpC,OAAOyV,cAAcG,gBAAiBigI,0BACrE3B,cAAc9xI,iBAAiBpC,OAAOyV,cAAcI,aAAcigI,uBAClE5B,cAAc9xI,iBAAiBpC,OAAOyV,cAAcQ,aAAcs/H,uBAClErB,cAAc9xI,iBAAiBpC,OAAOyV,cAAcS,YAAas/H,sBACjEtB,cAAc9xI,iBAAiBpC,OAAOyV,cAAcO,aAAcy/H,uBAClEvB,cAAc9xI,iBAAiBpC,OAAOyV,cAAciB,gBAAiBg/H,0BACrExB,cAAc9xI,iBAAiBpC,OAAOyV,cAAce,oBAAqBu/H,uBACzE7B,cAAc9xI,iBAAiBpC,OAAOwZ,MAAMW,SAAUk7H,wBACtDnB,cAAc9xI,iBAAiBpC,OAAOwZ,MAAMU,QAASk7H,uBACrDlB,cAAc9xI,iBAAiBpC,OAAOwZ,MAAME,QAASs8H,4BAyBhDp6I,OAAOsX,iBAAiB,CAC7B9Q,iBAxBqB,SAA0BD,UAAWT,cAC1DoyI,gBAAgB3xI,WAAaT,YAC/B,EAuBEY,oBAtBwB,SAA6BH,WACrD2xI,gBAAgB3xI,gBAAazD,CAC/B,EAqBEu3I,cAzMkB,SAAuBhB,YACzCb,YAAca,UAChB,EAwME9D,QArBY,WACZiC,iBAAiB9wI,oBAAoBtC,OAAO+W,SAASiB,wBACrDo7H,iBAAiB9wI,oBAAoBtC,OAAO+W,SAASkB,wBACrDi8H,cAAc5xI,oBAAoBtC,OAAOyV,cAAcC,eAAgBigI,yBACvEzB,cAAc5xI,oBAAoBtC,OAAOyV,cAAcE,oBAAqBigI,8BAC5E1B,cAAc5xI,oBAAoBtC,OAAOyV,cAAcG,gBAAiBigI,0BACxE3B,cAAc5xI,oBAAoBtC,OAAOyV,cAAcI,aAAcigI,uBACrE5B,cAAc5xI,oBAAoBtC,OAAOyV,cAAcQ,aAAcs/H,uBACrErB,cAAc5xI,oBAAoBtC,OAAOyV,cAAcS,YAAas/H,sBACpEtB,cAAc5xI,oBAAoBtC,OAAOyV,cAAcO,aAAcy/H,uBACrEvB,cAAc5xI,oBAAoBtC,OAAOyV,cAAciB,gBAAiBg/H,0BACxExB,cAAc5xI,oBAAoBtC,OAAOyV,cAAce,oBAAqBu/H,uBAC5E7B,cAAc5xI,oBAAoBtC,OAAOwZ,MAAMW,SAAUk7H,wBACzDnB,cAAc5xI,oBAAoBtC,OAAOwZ,MAAMU,QAASk7H,uBACxDlB,cAAc5xI,oBAAoBtC,OAAOwZ,MAAME,QAASs8H,2BAC1D,GAOG,CAAC,EACN,EAiBIpvD,SAAWhrF,OAAO2X,OAAO,CAC3B2iI,UAAW,EACXC,SAAU,IAIRn1D,OAAS,SAAgBlhF,GAC3B,GAAiB,iBAANA,EACT,OAAOA,EAET,IAAIs2I,QAAU,CACZ,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,QACL,IAAK,UAEP,OAAOt2I,EAAE6lB,QAAQ,YAAY,SAAU5c,GACrC,OAAOqtI,QAAQrtI,EACjB,GACF,EA8WIstI,eAAiB,SAAwBv6D,KAC3C,OAAOA,KAAO,GAAKA,IAAM,IAAIzzE,OAAOyzE,IACtC,EACIw6D,sCAAwC,SAA+CC,eAEzF,IACIC,qBAFJD,cAAgB1rI,KAAK8kC,MAAM4mG,gBAEe,KAG1C,MAAO,CACL5tE,MALU99D,KAAKqiC,MAAMqpG,cAAgB,MAMrC1tE,QAJYh+D,KAAKqiC,MAAMspG,oBAAsB,IAK7CztE,QAJYytE,oBAAsB,GAMtC,EA+CIC,yBA9Ca,SAAoBF,eACnC,IAAIG,eAAiBJ,sCAAsCC,eAC3D,OAAIG,eAAe/tE,MAAQ,EAClB,GAAGtgE,OAAOquI,eAAe/tE,MAAO,KAAKtgE,OAAOguI,eAAeK,eAAe7tE,SAAU,KAAKxgE,OAAOguI,eAAeK,eAAe3tE,UAC5H2tE,eAAe7tE,QAAU,EAC3B,GAAGxgE,OAAOquI,eAAe7tE,QAAS,KAAKxgE,OAAOguI,eAAeK,eAAe3tE,UAE9E,KAAK1gE,OAAOguI,eAAeK,eAAe3tE,SACnD,EAsCI0tE,uCArC2B,SAAkCF,eAC/D,IAAIG,eAAiBJ,sCAAsCC,eAC3D,OAAO59D,oBAAoB7B,wBAAwB4/D,eAAe/tE,MAAO+tE,eAAe7tE,QAAS6tE,eAAe3tE,QAClH,EAkCI0tE,uCAjC2B,SAAkCF,eAC/D,IAAIG,eAAiBJ,sCAAsCC,eAC3D,MAAO,GAAGluI,OAAOguI,eAAeK,eAAe/tE,OAAQ,KAAKtgE,OAAOguI,eAAeK,eAAe7tE,SAAU,KAAKxgE,OAAOguI,eAAeK,eAAe3tE,SACvJ,EA8BI0tE,uCA7B2B,SAAkCF,eAC/D,IAAIG,eAAiBJ,sCAAsCC,eACvDI,aAAe,KAQnB,OAPID,eAAe/tE,MAAQ,IACzBguE,cAAgBD,eAAe/tE,MAAQ,KAErC+tE,eAAe7tE,QAAU,IAC3B8tE,cAAgBD,eAAe7tE,QAAU,KAE3C8tE,cAAgBD,eAAe3tE,QAAU,GAE3C,EAkBI0tE,4CAjBgC,SAAuCG,UACzE,IAAKA,UAAgC,iBAAbA,SACtB,OAAO,EAMT,IAJA,IAAIL,cAAgB,EAChBM,WAAa,EACbC,cAAgBF,SAASr9G,MAtDP,KAuDlBw9G,cAAgBD,cAAc95I,OAtDL,EAsDyC85I,cAAc95I,OAtDvD,EAsD2F,EAC/GD,EAAI+5I,cAAc95I,OAAS,EAAGD,GAAKg6I,cAAeh6I,IAAK,CAC9D,IAAIi6I,iBAAmBpkH,SAASkkH,cAAc/5I,GAAI,IAC7C8lD,MAAMm0F,oBACTT,eAAiBS,iBAAmBH,YAEtCA,YA3DoB,EA4DtB,CACA,OA5D2B,IA4DpBN,aACT,EAkDIU,2BAA6B,isHAwZ7BC,uDArZuC,WACzC,OA9d2EC,KA8drC,CACpCpoE,0BAA2BiS,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBE,4BACxFqoE,gBAAiBxwD,SAASuvD,UA/dxBpnE,0BAA4BooE,KAAKpoE,0BACnCsoE,sBAAwBF,KAAKE,sBACxB,iIAAwIhvI,OAAO0mE,0BAA2B,gBAAkB1mE,OAAOgvI,sBAAuB,kGAH9L,IAAwCF,KACvEpoE,0BACFsoE,qBAgeJ,EAgZIH,sDA/YsC,SAA6CzrB,0BACrF,OA9dyE0rB,KA8dpC,CACnCG,yBAA0Bt2D,OAAOyqC,2BA9d/B6rB,yBAA2BH,KAAKG,yBAC7B,qDAAwDjvI,OAAOivI,yBAA0B,6BAF9D,IAAuCH,KACrEG,wBAgeN,EA2YIJ,wDA1YwC,WAC1C,IA9d6EC,KACzEI,gBACFC,UACAC,qBACAC,kBACAC,YACAC,uBAwdEC,gBAAkB,CACpBL,UAAW5wD,SAASuvD,SACpBwB,YAAa/wD,SAASuvD,SACtBoB,gBAAiB3wD,SAASuvD,SAC1BuB,kBAAmB9wD,SAASuvD,SAC5BsB,qBAAsBz2D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBoB,gBACnF2nE,uBAAwB52D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBI,8BAEvF,OAreIsoE,iBADyEJ,KAsetCU,iBAreZN,gBACzBC,UAAYL,KAAKK,UACjBC,qBAAuBN,KAAKM,qBAC5BC,kBAAoBP,KAAKO,kBACzBC,YAAcR,KAAKQ,YACnBC,uBAAyBT,KAAKS,uBACzB,mDAAsDvvI,OAAOkvI,gBAAiB,qGAA2GlvI,OAAOmvI,UAAW,kBAAoBnvI,OAAOovI,qBAAsB,yGAA+GpvI,OAAOqvI,kBAAmB,yGAA+GrvI,OAAOsvI,YAAa,kBAAoBtvI,OAAOuvI,uBAAwB,yEAgepkB,EAgYIV,+CA/X+B,WACjC,OA/d2DC,KA+d7B,CAC5BjoE,uBAAwB8R,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBK,yBACrF4oE,mBAAoBlxD,SAASuvD,UAhe3BjnE,uBAAyBioE,KAAKjoE,uBAChC4oE,mBAAqBX,KAAKW,mBACrB,qHAA4HzvI,OAAO6mE,uBAAwB,gBAAkB7mE,OAAOyvI,mBAAoB,0EAHpL,IAAgCX,KACvDjoE,uBACF4oE,kBAieJ,EA0XIZ,8CAzX8B,SAAqCpT,aAAciU,gBAAiB/S,cACpG,IAAI6S,gBAAkB,CAAC,EAmBvB,OAlBAA,gBAAgB/T,aAAe9iD,OAAO8iD,cACtC+T,gBAAgBrlF,QAAU,GAC1BqlF,gBAAgBG,eAAiBf,2BACjCY,gBAAgBha,qBAAuBvD,WAAWuD,qBAClDka,gBAAgB75I,SAAQ,SAAU8lI,OAAQnhH,OACpCmiH,cAAgBniH,QAAU+P,SAASoyG,aAAc,IACnD6S,gBAAgBrlF,QAAQtyD,KAAK,CAC3B+3I,YAAap1H,MACbmhH,OAAQhjD,OAAOgjD,OAAO3oG,MACtB68G,WAAW,IAGbL,gBAAgBrlF,QAAQtyD,KAAK,CAC3B+3I,YAAap1H,MACbmhH,OAAQhjD,OAAOgjD,OAAO3oG,OAG5B,IAjfyB,SAA8B87G,MACvD,IAAIrT,aAAeqT,KAAKrT,aACtBtxE,QAAU2kF,KAAK3kF,QACfwlF,eAAiBb,KAAKa,eACtBna,qBAAuBsZ,KAAKtZ,qBAC9B,MAAO,gFAAoFx1H,OAAOy7H,aAAc,oBAAoBz7H,OAAOmqD,QAAQ9sD,KAAI,SAAUyyI,OAC/J,IAAInU,OAASmU,MAAMnU,OACjBiU,YAAcE,MAAMF,YACpBC,UAAYC,MAAMD,UACpB,MAAO,4EAA6E7vI,OAAO2vI,eAAgB,2FAA2F3vI,OAAuB,IAAhB4vI,YAAoB,UAAW5vI,OAAOw1H,qBAAsB,KAAQ,GAAI,mCAAsCx1H,OAAO4vI,YAAa,MAAO5vI,OAAO6vI,UAAY,UAAY,GAAI,2DAA6D7vI,OAAO27H,OAAQ,yBACvc,IAAGnoG,KAAK,IAAK,6BACf,CAueSu8G,CAAqBP,gBAC9B,EAoWIX,qDAnWqC,SAA4CpT,aAAckB,aAAcqT,WAC/G,IAAIR,gBAAkB,CAAC,EAWvB,OAVAA,gBAAgB/T,aAAe9iD,OAAO8iD,cACtC+T,gBAAgBS,WAAa,0BAC7BT,gBAAgBU,QAAU,0BAC1BV,gBAAgBW,UAAY,0BAC5BX,gBAAgBG,eAAiBf,2BACjCY,gBAAgB7S,aAAehkD,OAAOgkD,cACtC6S,gBAAgBha,qBAAuBvD,WAAWuD,qBAC9Cwa,YACFR,gBAAgBY,aAAe,QAjfV,SAA4BtB,MACnD,IAAIrT,aAAeqT,KAAKrT,aACtByU,QAAUpB,KAAKoB,QACfD,WAAanB,KAAKmB,WAClBN,eAAiBb,KAAKa,eACtBQ,UAAYrB,KAAKqB,UACjBxT,aAAemS,KAAKnS,aACpByT,aAAetB,KAAKsB,aACpB5a,qBAAuBsZ,KAAKtZ,qBAC9B,MAAO,iFAAqFx1H,OAAOy7H,aAAc,iCAAkCz7H,OAAOkwI,QAAS,yCAA4ClwI,OAAOiwI,WAAY,iGAAkGjwI,OAAO2vI,eAAgB,mHAAuH3vI,OAAOkwI,QAAS,qCAAuClwI,OAAOw1H,qBAAsB,4BAAgCx1H,OAAOmwI,UAAW,aAAenwI,OAAO28H,cAA8B,GAAI,yBAA4B38H,OAAOowI,aAAe,YAAc,GAAI,6CACttB,CAyeSC,CAAmBb,gBAC5B,EAsVIX,kDArVkC,SAAyCyB,aAC7E,OA1eiExB,KA0ehC,CAC/B3nE,oBAAqBwR,OAAO23D,aAC5BvB,gBAAiBxwD,SAASuvD,UA3exB3mE,oBAAsB2nE,KAAK3nE,oBAC7B4nE,gBAAkBD,KAAKC,gBAClB,mIAA4I/uI,OAAOmnE,oBAAqB,gBAAkBnnE,OAAO+uI,gBAAiB,sEAH3L,IAAmCD,KAC7D3nE,oBACF4nE,eA4eJ,EAgVIF,wCA/UwB,SAA+B0B,sBAAuBC,uBAAwBC,aAAcC,cAAeC,mBAAoBC,aAAcC,oCAAqCC,sBAC5M,OArewB,SAA6BhC,MACrD,IAAIyB,sBAAwBzB,KAAKyB,sBAC/BC,uBAAyB1B,KAAK0B,uBAC9BC,aAAe3B,KAAK2B,aACpBxtB,qBAAuB6rB,KAAK7rB,qBAC5B8tB,qBAAuBjC,KAAKiC,qBAC5BJ,mBAAqB7B,KAAK6B,mBAC1BG,qBAAuBhC,KAAKgC,qBAC5BD,oCAAsC/B,KAAK+B,oCAC7C,MAAO,0IAAmJ7wI,OAAOuwI,sBAAuB,KAAKvwI,OAAOwwI,uBAAwB,oDAAwDxwI,OAAOywI,aAAc,wDAA6DzwI,OAAOijH,qBAAuB,iCAAmC,GAAI,mBAAoBjjH,OAAO+wI,qBAAsB,MAAO/wI,OAAO2wI,mBAAoB,yCAA4C3wI,OAAO8wI,qBAAsB,iEAAyE9wI,OAAO+wI,qBAAsB,0BAA4B/wI,OAAOywI,aAAc,+BAAiCzwI,OAAO6wI,oCAAqC,0BAA4B7wI,OAAOywI,aAAc,gCAC91B,CA2dSO,CAAoB,CACzBT,sBACAC,uBACAC,aACAM,qBAAsBp4D,OAAO+3D,eAC7BC,mBAAoBh4D,OAAOg4D,oBAC3B1tB,qBAAsB2tB,aACtBC,oCACAC,qBAAsBn4D,OAAOm4D,uBAEjC,EAoUIjC,kDAnUkC,SAAyCoC,uBAC7E,OAtf8B,SAAmCnC,MACjE,IAAImC,sBAAwBnC,KAAKmC,sBACjC,MAAO,gDAAoDjxI,OAAOixI,sBAAuB,WAC3F,CAmfSC,CAA0B,CAC/BD,sBAAuBt4D,OAAOs4D,wBAElC,EA+TIpC,yCA9TyB,SAAgCsC,qBAC3D,OA1eqB,SAA0BrC,MAC/C,IAAIqC,oBAAsBrC,KAAKqC,oBAC/B,MAAO,YAAanxI,OAAOmxI,oBAAqB,4BAClD,CAueSC,CAAiB,CACtBD,oBAAqBx4D,OAAOw4D,qBAC5BE,gBAAiB14D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBmE,cAElF,EAyTIkkE,0CAxT0B,SAAiCyC,kBAE7D,OADArO,SAAWqO,iBA3eW,SAA2BxC,MACjD,IAAIwC,iBAAmBxC,KAAKwC,iBAC5B,MAAO,8GAAmHtxI,OAAOsxI,iBAAkB,4cACrJ,CAyeSC,CAAkB,CACvBD,iBAAkB34D,OAAO24D,mBAE7B,EAmTIzC,sCAlTsB,SAA6B2C,kBACrD,OA5esB,SAA2B1C,MACjD,IAAI0C,iBAAmB1C,KAAK0C,iBAC5B,MAAO,cAAexxI,OAAOwxI,iBAAkB,8MACjD,CAyeSC,CAAkB,CACvBD,iBAAkB74D,OAAO64D,mBAE7B,EA8SI3C,0CA7S0B,WAC5B,OA5eyDC,KA4e5B,CAC3B4C,UA9Ga,itIA+GbC,cAAeh5D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBkG,gBA7e1EglE,UAAY5C,KAAK4C,UACnBC,cAAgB7C,KAAK6C,cAChB,oKAA+K3xI,OAAO0xI,UAAW,WAAa1xI,OAAO2xI,cAAe,8CAHjN,IAA+B7C,KACrD4C,UACFC,aA8eJ,EAwSI9C,2CAvS2B,SAAkC+C,YAAaC,yBAC5E,OA5e2B,SAAgC/C,MAC3D,IAAI8C,YAAc9C,KAAK8C,YACrBC,wBAA0B/C,KAAK+C,wBACjC,MAAO,8JAAsK7xI,OAAO4xI,YAAa,mBAAmB5xI,OAAO6xI,wBAA0B,+DAAiE7xI,OAAO6xI,wBAAyB,aAAe,GAAI,sBAC3W,CAweSC,CAAuB,CAC5BF,YACAC,wBAAyBl5D,OAAOk5D,0BAEpC,EAkSIhD,iDAjSiC,SAAwCkD,MAC3E,OA5e6B,SAAkCjD,MAC/D,IAAImC,sBAAwBnC,KAAKmC,sBAC/Be,WAAalD,KAAKkD,WAClBD,KAAOjD,KAAKiD,KACZE,cAAgBnD,KAAKmD,cACrBC,WAAapD,KAAKoD,WAClBC,2BAA6BrD,KAAKqD,2BAClCC,cAAgBtD,KAAKsD,cACvB,MAAO,uGAA+GpyI,OAAOixI,sBAAuB,qDAAuDjxI,OAAOgyI,WAAY,oEAAsEhyI,OAAO+xI,KAAM,KAAK/xI,OAAO+xI,KAAM,eAAe/xI,OAAOiyI,cAAgB,wCAA0CjyI,OAAOiyI,cAAe,UAAY,GAAI,4MAAqNjyI,OAAOkyI,WAAY,qJAA0JlyI,OAAOkyI,WAAY,oPAA6PlyI,OAAOmyI,2BAA4B,aAAenyI,OAAO+xI,KAAM,gFAAmF/xI,OAAOoyI,cAAe,0CACrvC,CAmeSC,CAAyB,CAC9BN,KAAMp5D,OAAOo5D,MACbG,WAAYv5D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBuF,iBACzEqmE,cAAez5D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBgG,eAC5EwlE,WAAYr5D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB+E,oBACzE0mE,cAAet5D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBgF,uBAC5EylE,sBAAuBt4D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBsG,0CAA0CxvD,QAAQ,YAAay0H,OACnJI,2BAA4Bx5D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBuG,+CAE7F,EAuRI8hE,2CAtR2B,SAAkCyB,aAC/D,OA5emDxB,KA4ezB,CACxBnnE,aAAcgR,OAAO23D,aACrBgC,eAAgB/zD,SAASuvD,UA7evBnmE,aAAemnE,KAAKnnE,aACtB2qE,eAAiBxD,KAAKwD,eACjB,mIAA8ItyI,OAAO2nE,aAAc,gBAAkB3nE,OAAOsyI,eAAgB,+DAH5L,IAA4BxD,KAC/CnnE,aACF2qE,cA8eJ,EAiRIzD,mDAhRmC,SAA0C0D,cAC/E,OA5emEzD,KA4ejC,CAChC/mE,gBAAiB4Q,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBuB,iBAAiBzqD,QAAQ,eAAgBi1H,eACvHvqE,iBAAkB2Q,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBwB,kBAAkB1qD,QAAQ,eAAgBi1H,eACzH3qE,cAAe+Q,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBoB,gBAC5E4qE,YAAaj0D,SAASuvD,SACtBqB,UAAW5wD,SAASuvD,SACpB2E,aAAcl0D,SAASuvD,UAjfrBlmE,cAAgBknE,KAAKlnE,cACvBunE,UAAYL,KAAKK,UACjBpnE,gBAAkB+mE,KAAK/mE,gBACvByqE,YAAc1D,KAAK0D,YACnBxqE,iBAAmB8mE,KAAK9mE,iBACxByqE,aAAe3D,KAAK2D,aACf,wHAAiIzyI,OAAO4nE,cAAe,gBAAkB5nE,OAAOmvI,UAAW,wNAAoOnvI,OAAO+nE,gBAAiB,gBAAkB/nE,OAAOwyI,YAAa,0KAAoLxyI,OAAOgoE,iBAAkB,gBAAkBhoE,OAAOyyI,aAAc,mEAPzrB,IAAoC3D,KAC/DlnE,cACFunE,UACApnE,gBACAyqE,YACAxqE,iBACAyqE,YA8eJ,EAuQI5D,6CAtQ6B,WAC/B,OAhRuDC,KAgR3B,CAC1B4D,kBAAmBn0D,SAASsvD,UAhR1B6E,kBAAoB5D,KAAK4D,kBACtB,mIAAwI1yI,OAAO0yI,kBAAmB,ipCAFhJ,IAA8B5D,KACnD4D,iBAkRN,EAkQI7D,wCAjQwB,SAA+BvtB,YACzD,OAjf6B,SAAkCwtB,MAC/D,IAAI6D,iBAAmB7D,KAAK6D,iBAC1BrxB,WAAawtB,KAAKxtB,WACpB,MAAO,gEAAmEthH,OAAO2yI,iBAAkB,WAAa3yI,OAAOshH,WAAY,8CACrI,CA6eSsxB,CAAyB,CAC9BD,iBAAkB,mBAClBrxB,WAAY3oC,OAAO2oC,aAEvB,EA4PIutB,iDA3PiC,WACnC,OAjf+DC,KAif/B,CAC9BjnE,kBAAmB8Q,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBqB,oBAChFH,cAAeiR,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBkB,gBAC5EmrE,cAAet0D,SAASuvD,SACxBgF,UAAWv0D,SAASuvD,UApflBjmE,kBAAoBinE,KAAKjnE,kBAC3BgrE,cAAgB/D,KAAK+D,cACrBnrE,cAAgBonE,KAAKpnE,cACrBorE,UAAYhE,KAAKgE,UACZ,iJAA0J9yI,OAAO6nE,kBAAmB,gBAAkB7nE,OAAO6yI,cAAe,4LAAwM7yI,OAAO0nE,cAAe,gBAAkB1nE,OAAO8yI,UAAW,gEALxc,IAAkChE,KAC3DjnE,kBACFgrE,cACAnrE,cACAorE,SAmfJ,EAoPIjE,4CAnP4B,WAC9B,OAjfmEC,KAifjC,CAChCiE,cAAex0D,SAASuvD,SACxBhmE,qBAAsB6Q,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBsB,wBAlfjFirE,cAAgBjE,KAAKiE,cACvBjrE,qBAAuBgnE,KAAKhnE,qBACvB,sGAA6G9nE,OAAO+yI,cAAe,kBAAoB/yI,OAAO8nE,qBAAsB,8aAH5J,IAAoCgnE,KAC/DiE,cACFjrE,oBAmfJ,EA8OI+mE,0DA7O0C,SAAiDmE,cAC7F,OAjfsC,SAA2ClE,MACjF,IAAIkE,aAAelE,KAAKkE,aACxB,MAAO,yDAA4DhzI,OAAOgzI,aAAc,uQAC1F,CA8eSC,CAAkC,CACvCD,cAEJ,EAyOInE,6CAxO6B,SAAoCpT,aAAclxE,mBAKjF,OAhcyB,SAA8BukF,MACvD,IAAIrT,aAAeqT,KAAKrT,aACtBlxE,kBAAoBukF,KAAKvkF,kBAC3B,MAAO,gBAAgBvqD,OAAOy7H,aAAc,aAAaz7H,OAAOuqD,kBAAoB,yBAA2BvqD,OAAOuqD,kBAAmB,WAAa,GAAI,WAC5J,CA4bS2oF,CAJmB,CACxBzX,aAAc9iD,OAAO8iD,cACrBlxE,kBAAmBouB,OAAOpuB,oBAG9B,EAkOIskF,wDAjOwC,SAA+CsE,6BAIzF,OAhcwC,SAA6CrE,MACrF,IAAIqE,4BAA8BrE,KAAKqE,4BACvC,MAAO,yBAA2BnzI,OAAOmzI,4BAA6B,UACxE,CA6bSC,CAH8B,CACnCD,4BAA6Bx6D,OAAOw6D,8BAGxC,EA4NItE,qDA3NqC,WACvC,IA9buEC,KACnEuE,kBACFC,oBA4bEC,4BAA8B,CAChCF,kBAAmB16D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB+D,mBAChF+oE,oBAAqB36D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBwE,sBAEpF,OAjcIqoE,mBADmEvE,KAkcnCyE,6BAjcPF,kBAC3BC,oBAAsBxE,KAAKwE,oBACtB,8EAAgFtzI,OAAOqzI,kBAAmB,yFAA2FrzI,OAAOszI,oBAAqB,WAgc1O,EAqNIzE,wDAjMwC,SAA+C2E,WAAYC,kBAOrG,OAzhBoC,SAAyC3E,MAC7E,IAAI55E,MAAQ45E,KAAK55E,MACfw+E,UAAY5E,KAAK4E,UACjBF,WAAa1E,KAAK0E,WAClBC,iBAAmB3E,KAAK2E,iBAC1B,MAAO,yFAA8FzzI,OAAOk1D,MAAO,2HAAkIl1D,OAAO0zI,UAAW,2JAAiK1zI,OAAOwzI,WAAY,6IAAmJxzI,OAAOyzI,iBAAkB,8DACzmB,CAmhBSE,CANO,CACZH,WAAY76D,OAAO66D,YACnBC,iBAAkB96D,OAAO86D,kBACzBv+E,MAAOyjB,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBoC,qCACpE8qE,UAAW/6D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBwC,4BAG5E,EAyLI6lE,yDAxLyC,SAAgD59D,sBAAuB2iE,gBAClH,IAhiBIC,kBAgiBAC,qBAAuB,CACzBD,kBAAmBvjE,oBAAoBU,uBAAuBC,sBAAuB2iE,iBAEvF,OAniBIC,kBAmiByBC,qBAniBAD,kBACtB,MAAM7zI,OAAO6zI,kBAAmB,OAmiBzC,EAmLIhF,4CApN4B,SAAmCkF,UAiBjE,OAlfwB,SAA6BjF,MACrD,IAAIkF,cAAgBlF,KAAKkF,cACvBC,qBAAuBnF,KAAKmF,qBAC5BC,+BAAiCpF,KAAKoF,+BACtCC,mBAAqBrF,KAAKqF,mBAC1BC,2BAA6BtF,KAAKsF,2BAClCC,eAAiBvF,KAAKuF,eACtBC,iBAAmBxF,KAAKwF,iBACxBC,mBAAqBzF,KAAKyF,mBAC1BC,iBAAmB1F,KAAK0F,iBACxBC,aAAe3F,KAAK2F,aACpBC,aAAe5F,KAAK4F,aACpBX,SAAWjF,KAAKiF,SAChBxlE,kBAAoBugE,KAAKvgE,kBACzBomE,QAAU7F,KAAK6F,QACjB,MAAO,8LAAuM30I,OAAOg0I,cAAe,WAAah0I,OAAOi0I,qBAAsB,gFAAoFj0I,OAAO20I,QAAS,oCAAsC30I,OAAO20I,QAAS,kCAAqC30I,OAAOuuE,kBAAmB,KAAKvuE,OAAO+zI,SAAU,mlBAA4mB/zI,OAAOk0I,+BAAgC,0BAA6Bl0I,OAAOm0I,mBAAoB,uGAA4Gn0I,OAAOo0I,2BAA4B,0BAA6Bp0I,OAAOq0I,eAAgB,+GAAqHr0I,OAAOs0I,iBAAkB,iHAAuHt0I,OAAOu0I,mBAAoB,+KAAsLv0I,OAAOw0I,iBAAkB,uDAA0Dx0I,OAAOy0I,aAAc,2KAA+Kz0I,OAAO00I,aAAc,+BAC/oE,CAkeSE,CAhBO,CACZT,mBAAoBx7D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBiF,UACjFyoE,+BAAgCv7D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBgB,4BAC7F6sE,eAAgB17D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB4E,UAC7EgpE,2BAA4Bz7D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBiB,wBACzF6sE,iBAAkB37D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB6F,YAC/EkoE,mBAAoB57D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB4D,cACjFqqE,aAAc97D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB6E,cAC3EmpE,iBAAkB77D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBe,oBAC/EmtE,aAAc/7D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB2B,oBAC3E6rE,cA9M4B,ipTA+M5BC,qBAAsBt7D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB8F,uBACnFynE,SAAU3F,uCAAuC2F,UACjDxlE,kBAAmBoK,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB+H,oBAChFomE,QAAS1R,UAGb,EAkMI4L,8DAlL8C,SAAqDgG,kBAAmBC,mBAAoBC,oBAAqBC,qBAAsBC,aAAczB,YAWrM,OApiB0C,SAA+C1E,MACzF,IAAI55E,MAAQ45E,KAAK55E,MACfw+E,UAAY5E,KAAK4E,UACjBwB,cAAgBpG,KAAKoG,cACrBC,eAAiBrG,KAAKqG,eACtBC,gBAAkBtG,KAAKsG,gBACvBC,iBAAmBvG,KAAKuG,iBACxBC,iBAAmBxG,KAAKwG,iBACxBL,aAAenG,KAAKmG,aACtB,MAAO,6EAAkFj1I,OAAOk1D,MAAO,iEAAoEl1D,OAAO0zI,UAAY,0EAA8E1zI,OAAO0zI,UAAW,QAAU,GAAI,SAAS1zI,OAAOk1I,cAAgB,sHAA4Hl1I,OAAOk1I,cAAe,gDAAkDl1I,OAAOm1I,eAAgB,yGAA6Gn1I,OAAOo1I,gBAAiB,gDAAkDp1I,OAAOq1I,iBAAkB,gCAAkC,GAAI,+JAAqKr1I,OAAOs1I,iBAAkB,6GAAiHt1I,OAAOi1I,aAAc,2EACnmC,CA0hBSM,CAVO,CACZrgF,MAAOob,oBAAoBF,gBAAgB5J,kBAAkBqC,mBAC7D6qE,UAAWmB,kBAAoBl8D,OAAO,GAAG34E,OAAO60I,kBAAmB,KAAK70I,OAAO80I,mBAAoB,MAAM90I,OAAO+0I,oBAAqB,KAAK/0I,OAAOg1I,uBAAyB,KAC1KE,cAAev8D,OAAOk8D,mBACtBM,eAAgBx8D,OAAOm8D,oBACvBM,gBAAiBL,oBACjBM,iBAAkBL,qBAClBC,aAAct8D,OAAOs8D,cACrBK,iBAAkB38D,OAAO66D,aAG7B,EAsKI3E,wDArKwC,SAA+C2G,gBAAiBC,oBAS1G,OAniBoC,SAAyC3G,MAC7E,IAAI4G,2BAA6B5G,KAAK4G,2BACpCC,oBAAsB7G,KAAK6G,oBAC3BC,iBAAmB9G,KAAK8G,iBACxBH,mBAAqB3G,KAAK2G,mBAC1BI,eAAiB/G,KAAK+G,eACtBC,eAAiBhH,KAAKgH,eACxB,MAAO,wFAA6F91I,OAAO01I,2BAA4B,yCAA4C11I,OAAO21I,oBAAqB,iDAAmD31I,OAAO41I,iBAAkB,mDAAqD51I,OAAOy1I,mBAAoB,0FAA8Fz1I,OAAO61I,eAAgB,+FAAmG71I,OAAO81I,eAAgB,yEAC5lB,CA2hBSC,CARO,CACZH,iBAAkBj9D,OAAO68D,iBACzBC,mBAAoB98D,OAAO88D,oBAC3BE,oBAAqBh9D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBC,4BAClFovE,eAAgBl9D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB0B,sBAC7E4tE,eAAgBn9D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBc,sBAC7EouE,2BAA4Bn3D,SAASuvD,UAGzC,EA2JIe,0CA1J0B,WAC5B,IAKImH,WACAC,WAGAC,WACAC,WARAC,aAAe9lE,oBAAoBC,gBAAkB73D,cAAcG,SACnEw9H,aAAe/lE,oBAAoBF,gBAAgB5J,kBAAkBwF,oBACrEsqE,WAAahmE,oBAAoBF,gBAAgB5J,kBAAkBgE,eAGnE+rE,gBAAkBjmE,oBAAoBF,gBAAgB5J,kBAAkB2D,UACxEqsE,gBAAkBlmE,oBAAoBF,gBAAgB5J,kBAAkB4F,SAwB5E,OArBIgqE,cACFJ,WAAa1lE,oBAAoBF,gBAAgB5J,kBAAkBkE,kBACnEurE,WAAa3lE,oBAAoBF,gBAAgB5J,kBAAkBiE,mBACnEyrE,WAboB,YAcpBC,WAfqB,eAiBrBH,WAAa1lE,oBAAoBF,gBAAgB5J,kBAAkBiE,mBACnEwrE,WAAa3lE,oBAAoBF,gBAAgB5J,kBAAkBkE,kBACnEwrE,WAnBqB,aAoBrBC,WAnBoB,aA1fA,SAA2BrH,MACjD,IAAIuH,aAAevH,KAAKuH,aACtBL,WAAalH,KAAKkH,WAClBE,WAAapH,KAAKoH,WAClBD,WAAanH,KAAKmH,WAClBE,WAAarH,KAAKqH,WAClBG,WAAaxH,KAAKwH,WAClBC,gBAAkBzH,KAAKyH,gBACvBC,gBAAkB1H,KAAK0H,gBACzB,MAAO,yLAAiMx2I,OAAOq2I,aAAc,6CAAgDr2I,OAAOg2I,WAAY,kBAAoBh2I,OAAOq2I,aAAc,KAAKr2I,OAAOg2I,WAAY,kDAAoDh2I,OAAOk2I,WAAY,oCAAsCl2I,OAAOg2I,WAAY,+HAA2Ih2I,OAAOi2I,WAAY,YAAcj2I,OAAOi2I,WAAY,kDAAoDj2I,OAAOm2I,WAAY,oCAAsCn2I,OAAOi2I,WAAY,iIAA6Ij2I,OAAOs2I,WAAY,YAAct2I,OAAOs2I,WAAY,0EAA8Et2I,OAAOs2I,WAAY,uPAAwQt2I,OAAOu2I,gBAAiB,oIAA0Iv2I,OAAOw2I,gBAAiB,8DACtgD,CA+gBSC,CAVO,CACZJ,aACAL,WAAYr9D,OAAOq9D,YACnBC,WAAYt9D,OAAOs9D,YACnBC,WAAYv9D,OAAOu9D,YACnBC,WAAYx9D,OAAOw9D,YACnBG,WAAY39D,OAAO29D,YACnBC,gBAAiB59D,OAAO49D,iBACxBC,gBAAiB79D,OAAO69D,kBAG5B,EAwHI3H,yCAvHyB,SAAgC6H,qBAAsBC,kBAAmBC,eAAgBC,cAAezzB,0BAmBnI,OAliByB,SAA8B0rB,MACvD,IAAI7mE,kBAAoB6mE,KAAK7mE,kBAC3B6uE,cAAgBhI,KAAKgI,cACrBltE,eAAiBklE,KAAKllE,eACtBmtE,kBAAoBjI,KAAKiI,kBACzBC,cAAgBlI,KAAKkI,cACrBN,qBAAuB5H,KAAK4H,qBAC5BntE,eAAiBulE,KAAKvlE,eACtB0tE,uBAAyBnI,KAAKmI,uBAC9BC,YAAcpI,KAAKoI,YACnBxwE,0BAA4BooE,KAAKpoE,0BACjC08C,yBAA2B0rB,KAAK1rB,yBAChCyzB,cAAgB/H,KAAK+H,cACrBztE,0BAA4B0lE,KAAK1lE,0BACjCiF,wBAA0BygE,KAAKzgE,wBAC/B8oE,kBAAoBrI,KAAKqI,kBAC3B,MAAO,0GAAiHn3I,OAAOioE,kBAAmB,gBAAkBjoE,OAAO82I,cAAe,wMAAkN92I,OAAOm3I,kBAAmB,wFAA+Fn3I,OAAOquE,wBAAyB,uGAA2GruE,OAAOioE,kBAAmB,qEAAwEjoE,OAAOopE,0BAA2B,6FAAgGppE,OAAOojH,yBAA2B,iHAAqHpjH,OAAO0mE,0BAA2B,yHAAgI1mE,OAAO0mE,0BAA2B,8EAAmF,GAAI,SAAS1mE,OAAO02I,qBAAuB,qEAAyE12I,OAAOupE,eAAgB,qCAAsCvpE,OAAOi3I,uBAAwB,kBAAoBj3I,OAAOupE,eAAgB,4DAA+DvpE,OAAOk3I,YAAY75I,KAAI,SAAUyyI,OAC3nD,IAAIpxD,SAAWoxD,MAAMpxD,SACnB04D,cAAgBtH,MAAMsH,cACtBC,cAAgBvH,MAAMuH,cACxB,MAAO,sCAAwCr3I,OAAO0+E,SAAW,WAAa,GAAI,YAAa1+E,OAAOo3I,cAAe,oBAAuBp3I,OAAOq3I,cAAe,YACpK,IAAG7jH,KAAK,IAAK,gCAAkC,GAAI,+EAAgFxzB,OAAQ62I,cAAyB,GAAT,OAAa,yCAA4C72I,OAAOupE,eAAgB,yHAAgIvpE,OAAOupE,eAAgB,qJAA4JvpE,OAAO4pE,eAAgB,qCAAsC5pE,OAAO+2I,kBAAmB,kBAAoB/2I,OAAO4pE,eAAgB,6DAAgE5pE,OAAOg3I,cAAc35I,KAAI,SAAUi6I,OACjwB,IAAI54D,SAAW44D,MAAM54D,SACnB64D,UAAYD,MAAMC,UAClBC,UAAYF,MAAME,UACpB,MAAO,uCAAyCx3I,OAAO0+E,SAAW,WAAa,GAAI,YAAa1+E,OAAOu3I,UAAW,oBAAuBv3I,OAAOw3I,UAAW,YAC7J,IAAGhkH,KAAK,IAAK,kGAAqGxzB,OAAOm3I,kBAAmB,wFAA+Fn3I,OAAOquE,wBAAyB,0BAC7Q,CAugBSopE,CAjBO,CACZxvE,kBAAmB0Q,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkByB,oBAChF6uE,cAAev4D,SAASuvD,SACxBlkE,eAAgB+O,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBoD,iBAC7EmtE,kBAAmBx4D,SAASuvD,SAC5BkJ,cAAeL,kBACfD,qBACAntE,eAAgBoP,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB+C,iBAC7E0tE,uBAAwB14D,SAASuvD,SACjCoJ,YAAaN,eACblwE,0BAA2BiS,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBE,4BACxF08C,yBACAyzB,cACAztE,0BAA2BuP,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB4C,4BACxFiF,wBAAyBiC,oBAAoBF,gBAAgB5J,kBAAkB6H,yBAC/E8oE,kBAhBsB,6HAmB1B,EAmGItI,4CAlG4B,SAAmCpT,aAAckB,aAAcqT,WAC7F,IAAIR,gBAAkB,CAAC,EAUvB,OATAA,gBAAgB/T,aAAe9iD,OAAO8iD,cACtC+T,gBAAgBS,WAAa,uBAC7BT,gBAAgBU,QAAU,qBAC1BV,gBAAgBW,UAAY,qBAC5BX,gBAAgB7S,aAAehkD,OAAOgkD,cACtC6S,gBAAgBha,qBAAuBvD,WAAWuD,qBAC9Cwa,YACFR,gBAAgBY,aAAe,QAhhBT,SAA6BtB,MACrD,IAAIrT,aAAeqT,KAAKrT,aACtByU,QAAUpB,KAAKoB,QACfD,WAAanB,KAAKmB,WAClBE,UAAYrB,KAAKqB,UACjBC,aAAetB,KAAKsB,aACpBzT,aAAemS,KAAKnS,aACpBnH,qBAAuBsZ,KAAKtZ,qBAC9B,MAAO,iFAAqFx1H,OAAOy7H,aAAc,iCAAkCz7H,OAAOkwI,QAAS,sBAAyBlwI,OAAOiwI,WAAY,sGAAyGjwI,OAAOmwI,UAAW,UAAYnwI,OAAOkwI,QAAS,gCAAkClwI,OAAOw1H,qBAAsB,gCAAqCx1H,OAAOowI,aAAe,YAAc,GAAI,KAAKpwI,OAAO28H,cAA8B,GAAI,qDACliB,CAygBS+a,CAAoBlI,gBAC7B,EAsFIX,0CA1E0B,WAC5B,OArhBiDC,KAqhBxB,CACvB1mE,yBAA0BuQ,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB4B,2BACvFuvE,SAAUp5D,SAASuvD,UAthBjB1lE,yBAA2B0mE,KAAK1mE,yBAClCuvE,SAAW7I,KAAK6I,SACX,4GAAmH33I,OAAOooE,yBAA0B,gBAAkBpoE,OAAO23I,SAAU,2FAHxK,IAA2B7I,KAC7C1mE,yBACFuvE,QAuhBJ,EAqEI9I,wCApEwB,SAA+B+I,YAAaC,aAAcC,cAAeC,cAAeC,SAAUC,QAASC,YACrI,OArhBoB,SAAyBpJ,MAC7C,IAAIkJ,SAAWlJ,KAAKkJ,SAClBD,cAAgBjJ,KAAKiJ,cACrBH,YAAc9I,KAAK8I,YACnBC,aAAe/I,KAAK+I,aACpBM,eAAiBrJ,KAAKqJ,eACtBC,aAAetJ,KAAKsJ,aACpBN,cAAgBhJ,KAAKgJ,cACrBO,YAAcvJ,KAAKuJ,YACrB,MAAO,0EAA+Er4I,OAAOg4I,SAAW,4BAA8B,GAAI,KAAKh4I,OAAO+3I,cAAgB,sBAAwB,GAAI,MAAO/3I,OAAO43I,YAAa,KAAK53I,OAAO63I,aAAc,iBAAkB73I,OAAOm4I,eAAgB,gBAAkBn4I,OAAOo4I,aAAc,cAAep4I,OAAO83I,cAAgB,kDAAoD,GAAI,YAAY93I,OAAOg4I,SAAW,6CAA+Ch4I,OAAOq4I,YAAa,sBAAwB,GAAI,wBACpiB,CA2gBSC,CAAgB,CACrBV,YACAC,aACAC,cACAC,cACAC,SACAK,YAAaJ,QACbE,eAAgBx/D,OAAOu/D,YACvBE,aAAc75D,SAASuvD,UAE3B,EAyDIe,oCArFoB,WACtB,OAxfqCC,KAwflB,CACjByJ,YAAa5/D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBsD,SAC1E0uE,UAAW7/D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBwD,oBACxEyuE,wBAAyB9/D,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBuD,2BACtFpD,qBAAsBgS,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBG,uBACnFkH,eAAgB8K,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBqH,iBAC7E6qE,eAAgBn6D,SAASuvD,SACzB6K,cAAep6D,SAASuvD,UA9ftByK,YAAczJ,KAAKyJ,YACrBC,UAAY1J,KAAK0J,UACjBE,eAAiB5J,KAAK4J,eACtB7qE,eAAiBihE,KAAKjhE,eACtBlH,qBAAuBmoE,KAAKnoE,qBAC5BgyE,cAAgB7J,KAAK6J,cACrBF,wBAA0B3J,KAAK2J,wBAC1B,yQAAqRz4I,OAAOu4I,YAAa,4EAAiFv4I,OAAOw4I,UAAW,gBAAkBx4I,OAAO04I,eAAgB,kBAAoB14I,OAAO6tE,eAAgB,oHAA4H7tE,OAAO2mE,qBAAsB,gBAAkB3mE,OAAO24I,cAAe,2FAA8F34I,OAAOy4I,wBAAyB,kQARtxB,IAAqB3J,KACjCyJ,YACFC,UACAE,eACA7qE,eACAlH,qBACAgyE,cACAF,uBA0fJ,EA2EI5J,8CAxD8B,SAAqC+J,cACrE,IA1gByD9J,KACrDxmE,gBACFuwE,YACAC,mBAygBF,OA5gByDhK,KA4gB5B,CAC3BxmE,gBAAiBqQ,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB8B,kBAC9EuwE,YAAat6D,SAASuvD,SACtBiL,UALsB,EAMtBC,UALsB,IAMtBC,cAAeL,aACfE,mBAAoBngE,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkBuC,mBAjhB/ET,gBAAkBwmE,KAAKxmE,gBACzBuwE,YAAc/J,KAAK+J,YACnBC,mBAAqBhK,KAAKgK,mBACrB,gCAAmC94I,OAAOsoE,gBAAiB,0FAA8FtoE,OAAO64I,YAAa,wLAAkM74I,OAAO84I,mBAAoB,mBAghBnZ,EA6CIjK,mDAhCmC,SAA0CqK,YAAaC,iBAC5F,OAjhB+B,SAAoCrK,MACnE,IAAIqK,gBAAkBrK,KAAKqK,gBACzBC,2BAA6BtK,KAAKsK,2BACpC,MAAO,yGAA8Gp5I,OAAOm5I,gBAAkB,iBAAmB,mBAAoB,oCAAqCn5I,OAAOo5I,2BAA4B,oBAC/P,CA6gBSC,CAA2B,CAChCD,2BAA4BzgE,OAAOugE,aACnCC,iBAEJ,EA2BItK,0DA1B0C,SAAiDoC,sBAAuBqI,YAAaC,kBAAmBC,8BAA+BC,kBAAmBC,8BAA+BC,qBACrO,OAjhBsC,SAA2C7K,MACjF,IAAImC,sBAAwBnC,KAAKmC,sBAC/BqI,YAAcxK,KAAKwK,YACnBE,8BAAgC1K,KAAK0K,8BACrCD,kBAAoBzK,KAAKyK,kBACzBI,oBAAsB7K,KAAK6K,oBAC3BD,8BAAgC5K,KAAK4K,8BACrCD,kBAAoB3K,KAAK2K,kBAC3B,MAAO,oJAA8Jz5I,OAAOixI,sBAAuB,oGAAwGjxI,OAAOs5I,YAAa,yIAA8It5I,OAAOw5I,8BAA+B,0BAA6Bx5I,OAAOu5I,kBAAmB,6EAA8Ev5I,OAAO25I,oBAAsB,qBAAuB,iBAAkB,kBAAoB35I,OAAO05I,8BAA+B,0BAA6B15I,OAAOy5I,kBAAmB,oDACjzB,CAwgBSG,CAAkC,CACvC3I,sBAAuBt4D,OAAOs4D,uBAC9BqI,YACAC,kBAAmB5gE,OAAO4gE,mBAC1BC,8BAA+B7gE,OAAO6gE,+BACtCC,kBAAmB9gE,OAAO8gE,mBAC1BC,8BAA+B/gE,OAAO+gE,+BACtCC,oBAAqBhhE,OAAOghE,sBAEhC,EAgBI9K,kDAfkC,SAAyCgL,kBAC7E,OAjhBiE/K,KAihBhC,CAC/BmC,sBAAuBt4D,OAAOkhE,kBAC9BjsE,sBAAuB+K,OAAOkhE,mBAlhB5B5I,sBAAwBnC,KAAKmC,sBAC/BrjE,sBAAwBkhE,KAAKlhE,sBACxB,6GAAqH5tE,OAAOixI,sBAAuB,sBAAsBjxI,OAAO4tE,sBAAuB,mBAHhL,IAAmCkhE,KAC7DmC,sBACFrjE,qBAmhBJ,EAUIihE,gEATgD,WAClD,MAhhBO,wSAihBT,EAOIA,kDANkC,WACpC,OA3gBiEC,KA2gBhC,CAC/BzlE,qBAAsBsP,OAAOrI,oBAAoBF,gBAAgB5J,kBAAkB6C,uBACnFywE,iBAAkBv7D,SAASuvD,UA5gBzBzkE,qBAAuBylE,KAAKzlE,qBAC9BywE,iBAAmBhL,KAAKgL,iBACnB,iHAAwH95I,OAAOqpE,qBAAsB,gBAAkBrpE,OAAO85I,iBAAkB,wEAHzK,IAAmChL,KAC7DzlE,qBACFywE,gBA6gBJ,EAuFIC,iCAhC0B,SAAiCC,YAC7D,IAAIC,WAAY,EACZC,mBAAqB,EACrB1rH,OAASqgH,kEACbmL,WAAWxlD,OAAOhmE,QAClB,IAAI2rH,0BAA4BH,WAAW/uH,KAAK,oCAC5CmvH,mBAAqB,WACvBF,mBAAqB,EACrBD,WAAY,EACZE,0BAA0BxuD,MAC5B,EAiBA,OAAOp4F,OAAOsX,iBAAiB,CAC7BwvI,SAXa,YACc,IAAvBH,oBACFjnJ,OAAOwS,aAAay0I,mBACpBA,mBAAqB,GAEnBD,YACFA,WAAY,EACZE,0BAA0BvuD,OAE9B,EAGE0uD,SAlBa,WACTL,YAAoC,IAAvBC,oBAGjBA,kBAAoBjnJ,OAAOuS,WAAW40I,mBAvBT,KAwB/B,GAcG,CAAC,EACN,EAeIG,eAAiB,KAsCjBC,8BAlCoB,SAAyB1O,aAAcoC,eAC7D,IACIuM,kBADAC,mBAP8B,IAOTxM,cAGzB,GAD+BqM,gBAAkBA,eAAeI,WAAaJ,eAAeK,cAAgBn0B,oBAAoB1K,oBAE9H,IAAK,IAAIrnH,EAAI,EAAGA,EAAI6lJ,eAAeI,UAAU3Z,uBAAuBrsI,OAAQD,IAE1E,KADA+lJ,kBAAoBF,eAAeI,UAAU3Z,uBAAuBtsI,IAC7CimI,aAAe8f,kBAAkB71G,UAAY81G,mBAClE,OAAOD,kBAAkB71G,UAdG,IAoBlC,OAAIspG,cAAgB,EACX,EAELA,cAAgBpC,aAAa/mG,SACxB+mG,aAAa/mG,SAEfmpG,aACT,EAaIsM,gCArCoB,SAA2BK,mBACjDN,eAAiBM,iBACnB,EAmCIL,mCAZuB,SAA8BM,UAAWC,aAAcC,eAChF,IAAIhmF,MAAQ,EACZ,GAAI8lF,UAAUG,WAAa,GAAKF,aAAe,GAAKC,cAAgB,GAAKF,UAAUI,YAAc,EAAG,CAClG,IAAIC,aAAeJ,aAAeD,UAAUG,WACxCG,cAAgBJ,cAAgBF,UAAUI,YAC9ClmF,MAAQxyD,KAAKglC,IAAI2zG,aAAcC,cACjC,CACA,OAAOpmF,KACT,EAIIwlF,wCAH4B,SAAmC1zB,YACjE,OAAOA,YArC6B,QAqCfA,WAAW33F,cAAc+B,MAAM,KAAKhW,KAC3D,EAaImgI,mBAAqB9nJ,OAAO2X,OAAO,CACrCipG,KAAM,OACNmnC,MAAO,QACPC,cAAe,kBAGbC,cAAgBjoJ,OAAO2X,OAAO,CAChCowI,MAAO,QACPthI,QAAS,UACTyhI,SAAU,WACVx1G,MAAO,UAibLy1G,0BA7ZmB,SAA0B5kB,eAAgB6kB,gBAAiB5sB,aAAc6sB,gBAAiBC,oBAAqBC,kBAAmBC,0BACvJ,IACIC,MACAC,cACApQ,cACAqQ,yBACAC,6BALAC,2BAA4B,EAM5BC,0BAA2B,EAC3BC,uBAAyB,KACzBC,sBAAwB,CAAC,EACxBR,2BACHA,0BAA2B,GAE7B,IA0CIS,uBAAyB,WAC3BN,yBAAyB5B,UAC3B,EACImC,uBAAyB,WAC3BP,yBAAyB7B,UAC3B,EA2BIqC,oBAAsB,WACxB5lB,eAAepoC,QAAQ/2F,OAAOwZ,MAAM/G,MAAO,CACzCuyI,YAAarsE,oBAAoBF,gBAAgB5J,kBAAkBiD,gBAEvE,EACImzE,mBAAqB,WAClBP,2BACHP,oBACAO,0BAA2B,EAC3BQ,oBAEJ,EACIA,kBAAoB,WACtBhR,eAAiBA,cAAc5xI,oBAAoBtC,OAAOyV,cAAcxB,UAAWgxI,oBACnF/Q,eAAiBA,cAAc5xI,oBAAoBtC,OAAOyV,cAAcQ,aAAcgvI,mBACxF,EAKIE,sBAAwB,YAE1BR,uBAAyBX,gBAAgB1wH,KAAK,wBACvB4nE,GAAGl7F,OAAOyV,cAAca,WAAYyuI,oBAC7D,EA4SA,OA9YiB,WACf,IAAIK,mBAAqB,SACrBhB,0BAA4Bt1B,oBAAoBrM,sBAClD2iC,oBAAsB,YAAct2B,oBAAoBrM,oBAAsB,KAE5EwhC,kBACFmB,oBAAsB,aAEpBnsC,WAAWK,UACb8rC,oBAAsB,mCAExBA,oBAAsB,IAClBt2B,oBAAoBwE,eAAet2H,OAAS,GAC9C8xH,oBAAoBwE,eAAep1H,SAAQ,SAAUixH,YACnD,GAAI0zB,wCAAwC1zB,WAAWj0C,KAAM,CAC3DupE,2BAA4B,EAC5B,IAAIjpH,mBAAqBD,4BAA4B4zF,WAAW3zF,oBAC5D6pH,oBAAsBvgH,oBAAoBG,YAAYzJ,mBAAmBzZ,UAAUma,YACvFkpH,oBAAsB,iBAAmBC,oBAAsB,+BAAiC7pH,mBAAmBzZ,SAAW,UAAYotG,WAAWj0C,IAAM,IAC7J,CACF,IAEFkqE,oBAAsBt2B,oBAAoBS,kCAAoC,WAC9E,IAAI+1B,uBAAyBtB,gBAAgB1wH,KAAK,cAClDgyH,uBAAuBppD,KAAKkpD,oBACxBnsC,WAAWY,aAAeZ,WAAWS,yBArDT,IAsD9B4rC,uBAAuB/6C,SAAS+vB,WAAWuC,oBAE7CynB,cAAgBN,gBAAgB1wH,KAAK,UACnBt2B,OAAS,IACzBk3I,cAAgBoQ,cAAc,IAEhCC,yBAA2BnC,iCAAiC4B,gBAC9D,CAmFAuB,GAzBErR,eAAiBA,cAAc9xI,iBAAiBpC,OAAOyV,cAAcxB,UAAWgxI,oBAChF/Q,eAAiBA,cAAc9xI,iBAAiBpC,OAAOyV,cAAcQ,aAAcgvI,oBArCrD,WAC9B,GAAIR,0BAEF,IADA,IAAIe,qBAAuBtR,cAAcuR,WAChC1oJ,EAAI,EAAG2oJ,aAAeF,qBAAqBxoJ,OAAQD,EAAI2oJ,aAAc3oJ,IAAK,CACjF,IAAI4oJ,gBAAkBH,qBAAqBzoJ,GAAGglB,SAC9C6iI,sBAAsBe,iBAAmBH,qBAAqBzoJ,EAChE,CAEJ,CAuDA6oJ,GACAvB,MAAQzoJ,OAAOsX,iBAAiB,CAC9B2yI,yBAN6B,SAAkCC,eAAgB,EAO/EC,iBAzDqB,SAA0BvqH,oBAC3CopH,sBAAsBppH,mBAAmBzZ,YAC3C6iI,sBAAsBppH,mBAAmBzZ,UAAUikI,KAhG7B,UAkG1B,EAsDEC,iBArDqB,SAA0BzqH,oBAC3CopH,sBAAsBppH,mBAAmBzZ,YAC3C6iI,sBAAsBppH,mBAAmBzZ,UAAUikI,KApG9B,SAsGzB,EAkDE5jJ,iBAbqB,SAA0BD,UAAW+jJ,gBAC5D,EAaE5jJ,oBAZwB,SAA6BH,WACvD,EAYEgkJ,8BAvBkC,WAEpC,EAsBEC,gBA3BoB,WACpB,OAAO,CACT,EA0BElV,UA7FoB,WAEpB,IADA,IAAImV,kBAAoBjvB,aAAap6H,OAC5BD,EAAI,EAAGA,EAAIspJ,kBAAmBtpJ,IAAK,CAC1C,IAAI8C,OAASivH,oBAAoBxN,qBAAqB8V,aAAar6H,GAAG65H,OACtE0tB,cAAcznD,OAAO,gBAAkBh9F,OAAS,WAAau3H,aAAar6H,GAAGqzG,SAAW,OAC1F,CACA+0C,uBACF,EAuFEhU,QAvBY,WACZ+T,oBACAP,wBAA0BA,uBAAuBpuD,MACjDiuD,6BAA6BrT,SAC/B,GAoBG,CAODmV,aAAc,CACZ1nJ,IAAK,WACH,OAAO0lJ,aACT,GAQFnQ,aAAc,CACZv1I,IAAK,WACH,OAAOs1I,aACT,GAQFqS,yBAA0B,CACxB3nJ,IAAK,WACH,OAAO6lJ,yBACT,GAQFnB,WAAY,CACV1kJ,IAAK,WACH,OAAOs1I,cAAcsS,UACvB,GAQFjD,YAAa,CACX3kJ,IAAK,WACH,OAAOs1I,cAAcuS,WACvB,GAQFC,0BAA2B,CACzB9nJ,IAAK,WACH,IAAIu1I,aAAe/1I,KAAK+1I,aACpBwS,qBAAuBxS,aAAaztC,YAAcytC,aAAa/mG,SAAW+mG,aAAa/mG,SAAW+mG,aAAaztC,YACnH,OAAOigD,qBAA8C,IAAvBA,qBAA8B,CAC9D,GAQFC,sBAAuB,CACrBhoJ,IAAK,WACH,OAAO,CACT,GAQFioJ,kBAAmB,CACjBjoJ,IAAK,WACH,OAAO8kJ,mBAAmBC,KAC5B,GAQF/hJ,KAAM,CACJhD,IAAK,WACH,OAAOilJ,cAAcF,KACvB,GAQFmD,4BAA6B,CAC3BloJ,IAAK,WACH,OAAO,CACT,GAQFmoJ,cAAe,CACbnoJ,IAAK,WACH,OAAO,CACT,GAQFooJ,uBAAwB,CACtBpoJ,IAAK,WACH,OAAO4lJ,4BACT,GAQFxS,WAAY,CACVpzI,IAAK,WACH,OAAOs1I,cAAclC,UACvB,GAQFtrC,YAAa,CACX9nG,IAAK,WACH,OAAOs1I,cAAcxtC,WACvB,GAQFt5D,SAAU,CACRxuC,IAAK,WACH,OAAOs1I,cAAc9mG,QACvB,GAQFilG,MAAO,CACLzzI,IAAK,WACH,OAAOs1I,cAAc7B,KACvB,GAQFJ,OAAQ,CACNrzI,IAAK,WACH,OAAOs1I,cAAcjC,MACvB,GAQFK,QAAS,CACP1zI,IAAK,WACH,OAAOs1I,cAAc5B,OACvB,GAQFJ,OAAQ,CACNtzI,IAAK,WACH,OAAOs1I,cAAchC,MACvB,GAQFC,MAAO,CACLvzI,IAAK,WACH,OAAOs1I,cAAc/B,KACvB,GAQFC,aAAc,CACZxzI,IAAK,WACH,OAAOs1I,cAAc9B,YACvB,GAQFG,SAAU,CACR3zI,IAAK,WACH,OAAOs1I,cAAc3B,QACvB,GAQFC,OAAQ,CACN5zI,IAAK,WACH,OAAOs1I,cAAc1B,MACvB,GAQFC,SAAU,CACR7zI,IAAK,WACH,OAAOs1I,cAAczB,QACvB,MAzVF+R,6BAA+BrR,qCA4VJkR,OA5V+C,SAAU4C,mBAClF/C,oBAAoB+C,kBA/FY,GAgGlC,GAAG,KAAM9nB,eAAeoU,cACKnxI,iBAAiBpC,OAAO+W,SAASiB,uBAAwB6sI,wBACtFL,6BAA6BpiJ,iBAAiBpC,OAAO+W,SAASkB,uBAAwB6sI,wBAyVjFT,KACT,EAKI6C,eAAiBtrJ,OAAO2X,OAAO,CACjC4zI,KAAM,OACNC,QAAS,YAwDPC,wBAzCiB,SAAwBhF,WAAYzgJ,KAAMq4I,YAAaC,wBAAyBoN,2BACnG,IAAIC,sBACAC,eAmBE3wH,OAlBF4wH,cAAgB,WAClB/gJ,SACI4gJ,2BACFA,2BAEJ,EAMI5gJ,OAAS,WACP8gJ,eAAexqJ,OAAS,GAC1BwqJ,eAAejxD,IAAI,SAErBgxD,sBAAsB7gJ,QACxB,EAkBA,OAhBMmwB,OAASqgH,2CAA2C+C,YAAaC,yBACrEmI,WAAWxlD,OAAOhmE,QAClB0wH,sBAAwBlF,WAAW/uH,KAAK,+BACxCk0H,eAAiBD,sBAAsBj0H,KAAK,8BACxC1xB,OAASslJ,eAAeE,SAC1BG,sBAAsBh9C,SAAS,WAI7Bi9C,eAAexqJ,OAAS,GAC1BwqJ,eAAetsD,GAAG,QAASusD,eArB7BF,sBAAsBj1D,OAAOa,IAAI,UAAW,GAAGa,OAAOoU,QAAQ,CAC5D/F,QAAS,GAvBiB,KAiDvB,CACL37F,OAEJ,EAiBIghJ,cAAgB,SAAuB/D,OACzC,IAIIgE,QAAU,WACZ,IAAIC,eAAiB,GACjBC,yBAA2B,EAC3BptH,KAAOr8B,KACPk0I,SAAU,EACVwV,eAAiB,EACrB1pJ,KAAKw1B,MAAQ,SAAUm0H,cACrB,GAAIA,aAAe,GAAKA,aAAeH,eAAe5qJ,OAAS,EAC7D,MAAM,IAAIyV,MAAM,kBAElB,OAAOm1I,eAAeG,cAAcn0H,KACtC,EACAx1B,KAAKy1B,IAAM,SAAUk0H,cACnB,GAAIA,aAAe,GAAKA,aAAeH,eAAe5qJ,OAAS,EAC7D,MAAM,IAAIyV,MAAM,kBAElB,OAAOm1I,eAAeG,cAAcl0H,GACtC,EACAj4B,OAAOwW,eAAehU,KAAM,SAAU,CACpCQ,IAAK,WACH,OAAOgpJ,eAAe5qJ,MACxB,IAEF,IAAIgrJ,4BAA8B,SAAqCngF,MAGrE,IAFA,IAAIogF,SAAW,EACXC,qBAAuBN,eAAe5qJ,OACjCD,EAAI,EAAGA,EAAImrJ,qBAAsBnrJ,IACpC8qE,KAAO+/E,eAAe7qJ,GAAG82B,KAC3Bo0H,WAGJL,eAAe72I,OAAOk3I,SAAU,EAAG,IAAIE,oBACvCN,yBAA2BI,QAC7B,EAqBIG,eAAiB,SAAwB7mJ,OAC3C,IAAI8mJ,yBAA2BC,iCAAiC/mJ,MAAM+hB,OACpC,IAA9B+kI,yBACFL,4BAA4BzmJ,MAAM+hB,MAElCukI,yBAA2BQ,wBAE/B,EACIE,8BAAgC,WAElC,IADA,IAAIC,eAAiBZ,eAAe5qJ,OAC3BD,EAAI,EAAGA,EAAIyrJ,eAAgBzrJ,IAClC,GAAI8qJ,2BAA6B9qJ,GAAK09B,KAAKguH,4BAA4Bb,eAAeC,0BAA2BD,eAAe7qJ,IAAK,CACnI2rJ,mBAAmBb,yBAA0B9qJ,GAC7C,KACF,CAEJ,EACI2rJ,mBAAqB,SAA4BC,gBAAiBC,iBACpE,IAAIC,YAAch+I,KAAKglC,IAAI84G,gBAAiBC,iBACxCE,eAAiBj+I,KAAKsoB,IAAIw1H,gBAAiBC,iBAC/ChB,eAAeiB,aAAaj1H,MAAQ/oB,KAAKglC,IAAI+3G,eAAee,iBAAiB/0H,MAAOg0H,eAAegB,iBAAiBh1H,OACpHg0H,eAAeiB,aAAah1H,IAAMhpB,KAAKsoB,IAAIy0H,eAAee,iBAAiB90H,IAAK+zH,eAAegB,iBAAiB/0H,KAChH+zH,eAAe72I,OAAO+3I,eAAgB,GACtCjB,yBAA2BgB,WAC7B,EACIP,iCAAmC,SAA0CzgF,MAG/E,IAFA,IAAIkgF,cAAgB,EAChBG,qBAAuBN,eAAe5qJ,OACjCD,EAAI,EAAGA,EAAImrJ,qBAAsBnrJ,IACxC,GAAI8qE,MAAQ+/E,eAAe7qJ,GAAG62B,OAASi0C,MAAQ+/E,eAAe7qJ,GAAG82B,IAAK,CACpEk0H,aAAehrJ,EACf,KACF,CAEF,OAAOgrJ,YACT,EACApE,MAAMvhJ,iBAAiB,cAxDJ,SAAsBb,OACvC,GAAIoiJ,MAAM1R,OACRK,SAAU,MADZ,CAIA,IAAIyW,0BAA4Bl+I,KAAKC,IAAIvJ,MAAM+hB,KAAOwkI,gBACtDA,eAAiBvmJ,MAAM+hB,MACnBgvH,SAAWyW,0BA1CmB,KA2ChCzW,SAAU,EACV8V,eAAe7mJ,QAEG,IAAhBk5B,KAAKz9B,SACPgrJ,4BAA4BzmJ,MAAM+hB,MAClCskI,eAAe,GAAGoB,WAAW,IAE/BpB,eAAeC,0BAA0BmB,WAAWznJ,MAAM+hB,MACtDskI,eAAe5qJ,OAAS,GAC1BurJ,+BAbF,CAeF,GAsCF,EAMA,OALAZ,QAAQ9rJ,UAAU4sJ,4BAA8B,SAAUQ,SAAUC,UAClE,IAAIC,oBAAsBD,SAASt1H,OAASq1H,SAASr1H,MAjGzB,IAiG4Ds1H,SAASt1H,OAASq1H,SAASp1H,IAjGvF,GAkGxBu1H,kBAAoBF,SAASr1H,KAAOo1H,SAASr1H,MAlGrB,IAkGwDs1H,SAASr1H,KAAOo1H,SAASp1H,IAlGjF,GAmG5B,OAAOs1H,qBAAuBC,iBAChC,EACO,IAAIzB,OACb,EACIQ,mBAAqB,WACvB,IAAIl7G,WAAa,EACb8B,SAAW,EACXs6G,QAAU,CAAC,EAyBf,OAxBAztJ,OAAOwW,eAAei3I,QAAS,QAAS,CACtCzqJ,IAAK,WACH,OAAOquC,SACT,EACA1uC,IAAK,SAAauR,OAChBm9B,WAAan9B,KACf,IAEFlU,OAAOwW,eAAei3I,QAAS,MAAO,CACpCzqJ,IAAK,WACH,OAAOmwC,OACT,EACAxwC,IAAK,SAAauR,OAChBi/B,SAAWj/B,KACb,IAEFu5I,QAAQL,WAAa,SAAUnhF,QACV,IAAf56B,WAAoB46B,KAAO56B,aAC7BA,UAAY46B,MAEVA,KAAO94B,UACTA,QAAU84B,KAEd,EACOwhF,OACT,EAOIC,6BALe,SAAsBC,UACvC,IACIC,aADe,2BACa38I,KAAK08I,UACrC,OAAOC,cAAgBA,aAAa,GAAKA,aAAa,GAAK,GAC7D,EA0BIC,sBAAwB,IAAI51B,WAAU,SAAUhnG,SAClD0+G,6BAA+B1+G,OACjC,IAkXI68H,eAjXgB,SAAuBH,SAAUzzB,SAAU6zB,YAAaC,QAASxrB,YAAaC,aAAcwrB,mBAAoBC,mBAClI,IAAIrvH,KAAOr8B,KAEP4B,OAAS,CAAC,EACV0mG,YAAc,EACdt5D,SAAW,EACX28G,cAAgB,EAChB3X,aAAe,EACfmB,aAAe,EACfyW,qBAAsB,EACtB9X,OAAS,GACTC,OAAQ,EACR8X,sBAAwB,GACxB5X,OAAQ,EACR6X,mBAAqB,EACrBlN,QAAUsM,6BAA6BC,UACvCY,oBAAsB,KACQ,iBAAvBN,qBACTA,mBAAqB,GAEvBpvH,KAAK2vH,qBAAuBX,sBAC5BrrJ,KAAKgE,iBAAmB,SAAUD,UAAW2sF,SAC3C9uF,OAAOmC,WAAanC,OAAOmC,YAAc,GACzCnC,OAAOmC,WAAWjC,KAAK4uF,QACzB,EACA1wF,KAAKkE,oBAAsB,SAAUH,UAAW2sF,SAC9C,GAAK9uF,OAAOmC,YAA2C,IAA7BnC,OAAOmC,WAAWnF,OAA5C,CAGA,IAAIqtJ,aAAerqJ,OAAOmC,WAAW2O,QAAQg+E,UACvB,IAAlBu7D,cACFrqJ,OAAOmC,WAAW4O,OAAOs5I,aAAc,EAHzC,CAKF,EACAjsJ,KAAK6B,KAAO,SAAUqqJ,KAAMC,MAC1B,GAAoB,iBAATD,KACTlsJ,KAAKgE,iBAAiBkoJ,KAAMC,WACvB,GAAwB,WAApBjoI,UAAUgoI,MAEnB,IADA,IAAIvlI,KAAOnpB,OAAOmpB,KAAKulI,MACdvtJ,EAAI,EAAGA,EAAIgoB,KAAK/nB,OAAQD,IAAK,CACpC,IAAIgT,IAAMgV,KAAKhoB,GACf09B,KAAKr4B,iBAAiB2N,IAAKu6I,KAAKv6I,KAClC,CAEJ,EACA3R,KAAK88F,GAAK98F,KAAK6B,KACf7B,KAAKw3G,OAAS,SAAUzzG,UAAW2sF,cACV,IAAZA,QACT1wF,KAAKkE,oBAAoBH,UAAW2sF,SAEpC9uF,OAAOmC,WAAa,EAExB,EACA/D,KAAKm4F,IAAMn4F,KAAKw3G,OAuBZg0C,SACFxrJ,KAAKgE,iBAAiB,QAASwnJ,SAEjC,IAAIY,UAAY,SAASA,YACvBp9G,SAAWq9G,OAAOC,cAClB/nJ,cAAc,kBACVgnJ,aACFA,cAEFhnJ,cAAc,kBACdA,cAAc,cACdA,cAAc,WAEd83B,KAAKn4B,oBAAoB,UAAWkoJ,WACpC7nJ,cAAc,WACdA,cAAc,OAChB,EA2CImsH,oBAAoBxF,8BACtB4gC,mBAAqB,GAIvB,IAAIO,OAAS,IAAInvJ,OAAOqvJ,GAAG/zI,OAAOk/G,SAAU,CAC1Cv4H,MAAO6gI,YACP5gI,OAAQ6gI,aACRusB,WAAY,CACVC,MAAO,SAEPC,KAAM,EACNC,SAAU,EACV5oI,SAAU2sG,oBAAoBnI,4BAA8B,EAAI,EAChEqkC,UAAWl8B,oBAAoBnI,4BAA8B,EAAI,EACjEskC,IAAK,EACLC,WAAY,EACZC,SAAU,EACVC,eAAgBlB,mBAChBmB,YAAa,EACbC,GAAIxB,kBAAoB,EAAI,EAC5ByB,eAAgB,GAElBvrJ,OAAQ,CACNwrJ,QApCe,WAPc,IAC3BC,aAOJ9oJ,cAAc,aACVmnJ,oBARA2B,aAAe/0C,EAAE,IAAMof,UACA,CAAC,kBAAmB,wBAAyB,sBACnD53H,SAAQ,SAAUkmF,MACrCqnE,aAAahiD,WAAWrlB,KAC1B,MAOA6lE,sBAAwBQ,OAAOiB,6BACL1uJ,OAAS,IACjCgtJ,qBAAsB,GAExBvvH,KAAKr4B,iBAAiB,UAAWooJ,WACjCjf,8BACF,EA0BIogB,cAnEgB,SAAuBpqJ,OAEzC,OADAgyI,YAAchyI,MAAM+hB,KACZ/hB,MAAM+hB,MACZ,KAAKhoB,OAAOqvJ,GAAGiB,YAAYC,OACzBlpJ,cAAc,SACd,MACF,KAAKrH,OAAOqvJ,GAAGiB,YAAYE,MACzBzZ,OAAQ,EACR1vI,cAAc,SACd,MACF,KAAKrH,OAAOqvJ,GAAGiB,YAAYG,QACzBppJ,cAAc,WACdA,cAAc,QACd,MACF,KAAKrH,OAAOqvJ,GAAGiB,YAAYI,UACzBrpJ,cAAc,WAGpB,EAkDIspJ,qBAjDuB,SAA8B1qJ,OACvD6wI,aAAe7wI,MAAM+hB,KACrB3gB,cAAc,aAAcyvI,aAC9B,EA+CIwX,QA5Ge,SAAsBroJ,OACvC,OAAQA,MAAM+hB,MACZ,KAAK,EAEH3gB,cAAc,QAAS,sBACvB,MACF,KAAK,EAEHA,cAAc,QAAS,+BACvB,MACF,KAAK,IAEHA,cAAc,QAAS,qFACvB,MACF,KAAK,IACL,KAAK,IAEHA,cAAc,QAAS,iGAI7B,KA0FIA,cAAgB,SAAuBR,UAAWupB,KACpD,IAAInqB,MAAQ,CACVK,KAAMO,UACNJ,OAAQ04B,KACRnX,KAAMoI,KAER,GAAI1rB,OAAOlE,eAAeqG,WAExB,IADA,IAAI+pJ,cAAgBlsJ,OAAOmC,WAAWyD,MAAM,GACnC7I,EAAI,EAAGA,EAAImvJ,cAAclvJ,OAAQD,IACxCmvJ,cAAcnvJ,GAAGwE,MAGvB,EACI4qJ,eAAiB,IAAIzE,cAActpJ,MAcvCxC,OAAOwW,eAAehU,KAAM,WAAY,CACtCQ,IAZe,WACf,MAAO,CACLg1B,MAAO,WACL,OAAO,CACT,EACAC,IAAK,WACH,OAAOuZ,SAAW28G,aACpB,EACA/sJ,OAAQ,EAEZ,IAIApB,OAAOwW,eAAehU,KAAM,aAAc,CACxCQ,IAAK,WACH,OAAO2qJ,QACT,IAEF3tJ,OAAOwW,eAAehU,KAAM,cAAe,CACzCQ,IAAK,WACH,OAAO6rJ,OAAO2B,gBAChB,EACA7tJ,IAAK,SAAauR,OAChBnN,cAAc,YACTmN,MAAQ2qB,KAAK83G,SAAS1+G,MACzB42H,OAAO4B,QAAQv8I,OAAO,GAEtB26I,OAAO4B,QAAQv8I,OAEjBnN,cAAc,SAChB,IAEF/G,OAAOwW,eAAehU,KAAM,WAAY,CACtCQ,IAAK,WACH,OAAOwuC,QACT,IAEFxxC,OAAOwW,eAAehU,KAAM,SAAU,CACpCQ,IAAK,WACH,OAAO20I,cAAgBj4I,OAAOqvJ,GAAGiB,YAAYC,MAC/C,IAEFjwJ,OAAOwW,eAAehU,KAAM,eAAgB,CAC1CQ,IAAK,WACH,OAAOwzI,YACT,EACA7zI,IAAK,SAAauR,OACZ26I,OAAO6B,iBACT7B,OAAO6B,iBAAiBx8I,MAG5B,IAEFlU,OAAOwW,eAAehU,KAAM,SAAU,CACpCQ,IAAK,WACH,OAAOutJ,cACT,IAEFvwJ,OAAOwW,eAAehU,KAAM,QAAS,CACnCQ,IAAK,WACH,OAAOyzI,KACT,IAEFz2I,OAAOwW,eAAehU,KAAM,WAAY,CACtCQ,IAAK,WACH,MAAO,CACLg1B,MAAO,WACL,OAAO,CACT,EACAC,IAAK,WACH,OAAOuZ,QACT,EACApwC,OAAQ,EAEZ,IAEFpB,OAAOwW,eAAehU,KAAM,sBAAuB,CACjDQ,IAAK,WACH,OAAOorJ,mBACT,IAEFpuJ,OAAOwW,eAAehU,KAAM,oBAAqB,CAC/CQ,IAAK,WACH,OAAOqrJ,qBACT,IAEFruJ,OAAOwW,eAAehU,KAAM,SAAU,CACpCQ,IAAK,WACH,OAAOszI,MACT,EACA3zI,IAAK,SAAauR,OAEhB,IAAIy8I,YAAsB,IAARz8I,MAClB26I,OAAO+B,WAAa/B,OAAO+B,UAAUD,aACrCra,OAASpiI,MACTnN,cAAc,eAAgB,KAChC,IAEF/G,OAAOwW,eAAehU,KAAM,QAAS,CACnCQ,IAAK,WACH,OAAOuzI,KACT,EACA5zI,IAAK,SAAauR,OACZqiI,QAAUriI,QACZqiI,MAAQriI,MACRnN,cAAc,eAAgB,OAE5BmN,MACF26I,OAAOgC,MAAQhC,OAAOgC,OAEtBhC,OAAOiC,QAAUjC,OAAOiC,QAE5B,IAEF9wJ,OAAOwW,eAAehU,KAAM,SAAU,CACpCQ,IAAK,WACH,OAAOy/H,YACT,IAEFziI,OAAOwW,eAAehU,KAAM,QAAS,CACnCQ,IAAK,WACH,OAAOw/H,WACT,IAEFxiI,OAAOwW,eAAehU,KAAM,uBAAwB,CAClDQ,IAAK,WACH,OAAO6qJ,qBACT,IAEFrrJ,KAAKgzI,KAAO,WACVqZ,OAAOkC,WACT,EACAvuJ,KAAKmyD,MAAQ,WACXk6F,OAAOmC,YACT,EACAxuJ,KAAKgmF,KAAO,SAAU5yD,SAAU1hB,OACdrT,SAASulF,eAAe8zC,UAC9B56F,aAAa1J,SAAU1hB,MACnC,EACA1R,KAAK66F,KAAO,WACVwwD,sBAAsBtjH,MAAK,WACzBskH,OAAOoC,aAAa7P,QAAS6M,mBAC/B,GACF,EACAzrJ,KAAK+yI,QAAU,WACTsZ,SACFA,OAAOtZ,UACP71I,OAAOwxJ,wBAA0B,MAE/B3C,qBACF4C,cAAc5C,oBAElB,EAyBAA,oBAAsB6C,aAxBN,WACd,QAAqC,IAA1BvC,OAAO2B,eAAlB,CAGA7Y,YAAckX,OAAOwC,iBACrB,IAAIplF,KAAO4iF,OAAO2B,iBACd1lD,cAAgB7+B,OAClB6+B,YAAc7+B,KACdllE,cAAc,aAAcklE,OAE9B,IAAIqlF,oBAAsBzC,OAAO0C,uBACjC,GAAI,MAAOD,oBAAX,CAGA,IAAIE,cAAgB3C,OAAO0C,yBACvBpD,gBAAkBqD,gBACpBrD,cAAgBqD,cAChBzqJ,cAAc,YAEVonJ,cAAgB,KAClBpnJ,cAAc,kBAPlB,CAVA,CAoBF,GAC6C,IAC/C,EASI+mJ,eARS,WAhYNpuJ,OAAOwxJ,0BACVxxJ,OAAOwxJ,wBAA0B,WAE/B,GADAxxJ,OAAOwxJ,wBAAwBzhE,OAAQ,EACnC5lF,MAAM6iB,QAAQhtB,OAAOwxJ,wBAAwBO,QAC/C,IAAK,IAAItwJ,EAAI,EAAGA,EAAIzB,OAAOwxJ,wBAAwBO,OAAOrwJ,OAAQD,IACR,mBAA7CzB,OAAOwxJ,wBAAwBO,OAAOtwJ,GAC/CzB,OAAOwxJ,wBAAwBO,OAAOtwJ,KAEtCoqC,QAAQC,KAAK,yCAA2CrqC,EAAI,4BAIhEoqC,QAAQC,KAAK,wDAEjB,EACA9rC,OAAOwxJ,wBAAwBO,OAAS,IAmX1C,IAAIC,gBAAkB52C,EAAE,oDAAuC15G,OAI/D,OAHKswJ,iBACH52C,EAAE1E,UAlXc,uCAoXVs7C,eACV,EAgZIC,4BA/XqB,SAA4BpuB,eAAgB6kB,gBAAiBwJ,yBAA0Bp2B,aAAc+sB,mBAC5H,IAAIsJ,eACAC,qBACAC,gCAAkC3J,gBAAgB1wH,KAAK,qCASvDs6H,0BAA4B,WAC9BzJ,mBAAqBA,mBACvB,EACI0J,iBAAmB,WACjB/+B,oBAAoBnI,6BACtBgnC,gCAAgChjD,YAAY2vB,WAAWrmC,KAE3D,EACI65D,kBAAoB,WACtBH,gCAAgCpjD,SAAS+vB,WAAWrmC,KACtD,EAOI85D,aAAe,WACjB5uB,eAAejkC,GAAGl7F,OAAO+W,SAASqB,qBAAsB01I,mBACxD3uB,eAAejkC,GAAGl7F,OAAO+W,SAASmB,oBAAqB21I,iBACzD,EAyBIjE,QAAU,SAAiBroJ,OAC7BmsJ,qBAAuBrG,wBAAwBloB,eAAgB+nB,eAAeC,KAAM5lJ,MAAM+hB,KAC5F,EAtDE67G,eAAe50B,SAAS+vB,WAAWoD,iBAsErC,IAAIzwF,UAAY6hF,oBAAoBrG,gBAElCx7E,eADgBvuC,IAAduuC,UACUy8F,0BAA0Bz8F,WAE1B,EAEd,IAAI+gH,yBAA2BpyJ,OAAOsX,iBAAiB,CACrD2yI,yBAtB6B,SAAkCC,eAC3Dh3B,oBAAoBtI,sBAAwBsI,oBAAoBxM,yBAQlEwjC,cAAc3yD,IAAI,UAAW,MAE7Bs6D,eAAet6D,IAAI,SAAU,eAAiB2yD,cAActoJ,SAAW,MAE3E,EAUEuoJ,iBAtCqB,WAEvB,EAqCEE,iBApCqB,WAEvB,EAmCE7jJ,iBAlCqB,SAA0BD,UAAW2sF,SAC1D2+D,eAAerrJ,iBAAiBD,UAAW2sF,QAC7C,EAiCExsF,oBAhCwB,SAA6BH,UAAW2sF,SAChE2+D,eAAenrJ,oBAAoBH,UAAW2sF,QAChD,EA+BEq3D,8BA7DkC,WAEpC,EA4DEC,gBAjEoB,WACpB,OAAO,CACT,EAgEElV,UAAW,WACTuc,eAAex0D,MACjB,EACAk4C,QAvDY,WACRsc,gBACFA,eAAetc,UA/BjBhS,eAAex0B,YAAY2vB,WAAWoD,iBAkCtCgwB,sBAAwBA,qBAAqBhnJ,SAR7Cy4H,eAAe5oC,IAAIv2F,OAAO+W,SAASqB,qBAAsB01I,mBACzD3uB,eAAe5oC,IAAIv2F,OAAO+W,SAASmB,oBAAqB21I,iBAS1D,GAiDG,CAODvH,aAAc,CACZ1nJ,IAAK,WACH,OAAO6uJ,cACT,GAQFtZ,aAAc,CACZv1I,IAAK,WACH,OAAO6uJ,cACT,GAQFlH,yBAA0B,CACxB3nJ,IAAK,WACH,OAAO,CACT,GAQF8nJ,0BAA2B,CACzB9nJ,IAAK,WACH,IAAIu1I,aAAe/1I,KAAK+1I,aACpBwS,qBAAuBxS,aAAaztC,YAAcytC,aAAa/mG,SAAW+mG,aAAa/mG,SAAW+mG,aAAaztC,YACnH,OAAOigD,qBAA8C,IAAvBA,qBAA8B,CAC9D,GAQFrD,WAAY,CACV1kJ,IAAK,WACH,OAAO6uJ,eAAelwJ,KACxB,GAQFgmJ,YAAa,CACX3kJ,IAAK,WACH,OAAO6uJ,eAAejwJ,MACxB,GAQFopJ,sBAAuB,CACrBhoJ,IAAK,WACH,OAAO,CACT,GAQFioJ,kBAAmB,CACjBjoJ,IAAK,WACH,OAAO8kJ,mBAAmBC,KAC5B,GAQF/hJ,KAAM,CACJhD,IAAK,WACH,OAAOilJ,cAAcxhI,OACvB,GAQFykI,4BAA6B,CAC3BloJ,IAAK,WACH,OAAO,CACT,GAQFmoJ,cAAe,CACbnoJ,IAAK,WACH,OAAO,CACT,GAQFooJ,uBAAwB,CACtBpoJ,IAAK,WACH,OAAO,IACT,GAQFozI,WAAY,CACVpzI,IAAK,WACH,OAAO6uJ,eAAezb,UACxB,GAQFtrC,YAAa,CACX9nG,IAAK,WACH,OAAO6uJ,eAAe/mD,WACxB,GAQFt5D,SAAU,CACRxuC,IAAK,WACH,OAAO6uJ,eAAergH,QACxB,GAQFilG,MAAO,CACLzzI,IAAK,WACH,OAAO6uJ,eAAepb,KACxB,GAQFJ,OAAQ,CACNrzI,IAAK,WACH,OAAO6uJ,eAAexb,MACxB,GAQFK,QAAS,CACP1zI,IAAK,WACH,OAAO,CACT,GAQFszI,OAAQ,CACNtzI,IAAK,WACH,OAAO6uJ,eAAevb,MACxB,GAQFC,MAAO,CACLvzI,IAAK,WACH,OAAO6uJ,eAAetb,KACxB,GAQFC,aAAc,CACZxzI,IAAK,WACH,OAAO6uJ,eAAerb,YACxB,GAQFG,SAAU,CACR3zI,IAAK,WACH,OAAO6uJ,eAAelb,QACxB,GAQFC,OAAQ,CACN5zI,IAAK,WACH,OAAO6uJ,eAAejb,MACxB,GAQFC,SAAU,CACR7zI,IAAK,WACH,OAAO6uJ,eAAehb,QACxB,KAIJ,OADAiX,iBACO,IAAI71B,WAAU,SAAUhnG,QAAS8Z,QACtC,IACE,IAAImjH,kBAAoB3qB,eAAeoU,YAAY0a,sBAC/C3yJ,OAAOwxJ,wBAAwBzhE,OACjCoiE,eAAiB,IAAI/D,eAAetyB,aAAa,GAAGP,IAAK22B,yBAA0BI,0BAA2BhE,QAAS5F,gBAAgBzmJ,QAASymJ,gBAAgBxmJ,SAAUyvC,UAAW68G,mBACrLiE,eACA5uB,eAAepoC,QAAQ/2F,OAAO+W,SAASiC,eACvC6T,QAAQmhI,2BAER1yJ,OAAOwxJ,wBAAwBO,OAAOntJ,MAAK,WACzCutJ,eAAiB,IAAI/D,eAAetyB,aAAa,GAAGP,IAAK22B,yBAA0BI,0BAA2BhE,QAAS5F,gBAAgBzmJ,QAASymJ,gBAAgBxmJ,SAAUyvC,UAAW68G,mBACrLiE,eACA5uB,eAAepoC,QAAQ/2F,OAAO+W,SAASiC,eACvC6T,QAAQmhI,yBACV,GAEJ,CAAE,MAAOjhE,GACPpmD,OAAO,IAAIl0B,MAAM,iDACnB,CACF,GACF,EAMIy7I,gBAAkB,CAAC,CACrB9gH,SAAU,IACV+gH,cAAe,KACd,CACD/gH,SAAU,KACV+gH,cAAe,MAIbC,eAAiB,EACjBC,eAXyB,IAYzBC,gBAAkB,EAClBC,eAAiB,GACjBC,2BAA6B,EAC7BC,iBAAmB,EACnBC,UAAW,EACXC,qCACqB,SAA+B9mF,MACpD2jE,oBAAsB3jE,IACxB,EAHE8mF,mCAImB,SAA6B9mF,MAChD4jE,kBAAoB5jE,IACtB,EANE8mF,gCAOgB,WAChB,IAAIC,SAAW,EAIf,OAHIpjB,qBAAuBC,oBACzBmjB,SAAWnjB,kBAAoBD,qBAE1BojB,QACT,EAbED,kCAoBkB,WAClB,OAAOF,gBACT,EAtBEE,2CA0B2B,WAC3B,OAAOP,eAAiB,CAC1B,EA5BEO,mCA6BmB,WACnBL,gBAAkB,EAClBC,eAAiB,GACjBC,2BAA6B,EAC7BC,iBAAmB,EACnBL,eAAiB,CACnB,EAnCEO,kCAoCkB,SAA4BE,6BAC9C,KAAIA,6BAA+B,GAAnC,CAGAT,eAAiBS,4BAGjBR,eA5DyB,IA6DzB,IAAK,IAAItxJ,EAAI,EAAGA,EAAImxJ,gBAAgBlxJ,OAAQD,IAC1C,GAAI8xJ,6BAA+BX,gBAAgBnxJ,GAAGqwC,SAAU,CAC9DihH,eAAiBH,gBAAgBnxJ,GAAGoxJ,cACpC,KACF,CAIFI,eAAiB,GACjBD,gBAAkBzjJ,KAAKg3F,KAAKgtD,4BAA8BR,gBAC1D,IAAK,IAAI5xE,EAAI,EAAGA,EAAI6xE,gBAAiB7xE,IACnC8xE,eAAeruJ,MAAK,GAEtBsuJ,2BAA6B,CAlB7B,CAmBF,EA1DEG,+BA2De,SAAyBG,yBACxCA,wBAA0BjkJ,KAAKglC,IAAIi/G,wBAAyBV,gBAC5DK,iBAAmBK,wBAA0B,IAC7C,IAAIjsI,MAAQhY,KAAKqiC,MAAM4hH,wBAA0BT,gBAC7CxrI,MAAQ,GAAKA,OAASyrI,iBAGrBC,eAAe1rI,SAClB2rI,6BACAD,eAAe1rI,QAAS,EAE5B,EAtEE8rI,oCAuEoB,WACpB,OAAIL,iBAAmBA,gBAAkB,EAChCE,2BAA6BF,gBAE/B,CACT,EA5EEK,mDA6EmC,SAA6CI,wBAAyBC,uBACzG,IAAIC,kBAAoB,EACxB,GAAIb,eAAiB,GAAKW,yBAA2BC,sBAAuB,CAK1E,IAJA,IAAIE,kBAAoBrkJ,KAAKqiC,MAAM6hH,wBAA0BV,gBACzDc,gBAAkBtkJ,KAAKqiC,MAAM8hH,sBAAwBX,gBACrDe,sBAAwB,EACxBC,qBAAuBF,gBAAkBD,kBAAoB,EACxDnyJ,EAAImyJ,kBAAmBnyJ,GAAKoyJ,gBAAiBpyJ,IAChDwxJ,eAAexxJ,IACjBqyJ,wBAGJH,kBAAoBG,sBAAwBC,oBAC9C,CACA,OAAOJ,iBACT,EA5FEN,0BA6FU,SAAoB9nE,SAC9B6nE,SAAW7nE,OACb,EA/FE8nE,yBAgGS,WACT,OAAOD,QACT,EAlGEC,uCAmGuB,WACvB,OAAOJ,eAAe7oJ,KAAI,SAAU4pJ,cAClC,OAAwB,IAAjBA,aAAwB,IAAM,GACvC,IAAGzzH,KAAK,IACV,EAvGE8yH,0CAwG0B,SAAoCY,sBAC9D,IAAIC,yBAA2BD,qBAAqBh2H,MAAM,KACtDg1H,eAAevxJ,SAAWwyJ,yBAAyBxyJ,QAGvDwyJ,yBAAyBtxJ,SAAQ,SAAUoxJ,aAAczsI,OAClC,MAAjBysI,eACFd,6BACAD,eAAe1rI,QAAS,EAE5B,GACF,EAoVE4sI,6BApUsB,SAA6BtwB,eAAgB6kB,gBAAiB/rB,UAAWgsB,gBAAiBC,oBAAqBC,kBAAmBC,0BAC1J,IAAIsL,kBAAoB3L,0BAA0B5kB,eAAgB6kB,gBAAiB/rB,UAAUA,UAAWgsB,gBAAiBC,oBAAqBC,kBAAmBC,0BAC7JuL,iBAAmB,WACrBD,kBAAkBvb,aAAaj5D,IAAM+8C,UAAUkB,aAAavC,MACxD+3B,4BACFA,qCAEF3K,gBAAgBjtD,QAAQ/2F,OAAOwZ,MAAMY,kBAAmB,CACtDw1I,sBAAuB33B,UAAUsB,aACjCs2B,kBAAmB53B,UAAUuB,aAEjC,EACIs2B,iBAAmB,WAChB73B,UAAUsB,eACbtB,UAAUmB,kBAAoB,WAC9Bu2B,mBAEJ,EACII,iBAAmB,WAChB93B,UAAUuB,cACbvB,UAAUmB,kBAAoB,OAC9Bu2B,mBAEJ,EAwBA,OAHAxwB,eAAejkC,GAAGl7F,OAAO+W,SAASE,UAAW84I,kBAC7C5wB,eAAejkC,GAAGl7F,OAAO+W,SAASC,UAAW84I,kBAC7C3wB,eAAejkC,GAAGl7F,OAAOwZ,MAAMa,cAAes1I,kBACvC/zJ,OAAOsX,iBAAiB,CAC7B2yI,yBAN6B,SAAkCC,eAAgB,EAO/EC,iBAAkB2J,kBAAkB3J,iBACpCE,iBAAkByJ,kBAAkBzJ,iBACpC7jJ,iBAAkBstJ,kBAAkBttJ,iBACpCE,oBAAqBotJ,kBAAkBptJ,oBACvC6jJ,8BArB+B,WAC/BluB,UAAUmB,kBAAoB,EAC9Bu2B,kBACF,EAmBEvJ,gBA9BoB,WACpB,IAAI4J,yBAA2B/3B,UAAUuB,YAKzC,OAJKw2B,2BACH/3B,UAAUmB,kBAAoB,OAC9Bu2B,oBAEKK,wBACT,EAwBE9e,UAAWwe,kBAAkBxe,UAC7BC,QApBY,WACZhS,eAAe5oC,IAAIv2F,OAAO+W,SAASC,UAAW84I,kBAC9C3wB,eAAe5oC,IAAIv2F,OAAO+W,SAASE,UAAW84I,kBAC9C5wB,eAAe5oC,IAAIv2F,OAAOwZ,MAAMa,cAAes1I,kBAC/CD,kBAAkBve,SACpB,GAgBG,CAODmV,aAAc,CACZ1nJ,IAAK,WACH,OAAO8wJ,kBAAkBpJ,YAC3B,GAQFnS,aAAc,CACZv1I,IAAK,WACH,OAAO8wJ,kBAAkBvb,YAC3B,GAQFoS,yBAA0B,CACxB3nJ,IAAK,WACH,OAAO8wJ,kBAAkBnJ,wBAC3B,GAQFG,0BAA2B,CACzB9nJ,IAAK,WACH,OAAO8wJ,kBAAkBhJ,yBAC3B,GAQFpD,WAAY,CACV1kJ,IAAK,WACH,OAAO8wJ,kBAAkBpM,UAC3B,GAQFC,YAAa,CACX3kJ,IAAK,WACH,OAAO8wJ,kBAAkBnM,WAC3B,GAQFqD,sBAAuB,CACrBhoJ,IAAK,WACH,OAAO,CACT,GAQFioJ,kBAAmB,CACjBjoJ,IAAK,WACH,OAAO8kJ,mBAAmBE,aAC5B,GAQFhiJ,KAAM,CACJhD,IAAK,WACH,OAAOilJ,cAAcC,QACvB,GAQFgD,4BAA6B,CAC3BloJ,IAAK,WACH,OAAO,CACT,GAQFmoJ,cAAe,CACbnoJ,IAAK,WACH,OAAO,CACT,GAQFooJ,uBAAwB,CACtBpoJ,IAAK,WACH,OAAO8wJ,kBAAkB1I,sBAC3B,GAQFhV,WAAY,CACVpzI,IAAK,WACH,OAAO8wJ,kBAAkB1d,UAC3B,GAQFtrC,YAAa,CACX9nG,IAAK,WACH,OAAO8wJ,kBAAkBhpD,WAC3B,GAQFt5D,SAAU,CACRxuC,IAAK,WACH,OAAO8wJ,kBAAkBtiH,QAC3B,GAQFilG,MAAO,CACLzzI,IAAK,WACH,OAAO8wJ,kBAAkBrd,KAC3B,GAQFJ,OAAQ,CACNrzI,IAAK,WACH,OAAO8wJ,kBAAkBzd,MAC3B,GAQFK,QAAS,CACP1zI,IAAK,WACH,OAAO8wJ,kBAAkBpd,OAC3B,GAQFJ,OAAQ,CACNtzI,IAAK,WACH,OAAO8wJ,kBAAkBxd,MAC3B,GAQFC,MAAO,CACLvzI,IAAK,WACH,OAAO8wJ,kBAAkBvd,KAC3B,GAQFC,aAAc,CACZxzI,IAAK,WACH,OAAO8wJ,kBAAkBtd,YAC3B,GAQFG,SAAU,CACR3zI,IAAK,WACH,OAAO8wJ,kBAAkBnd,QAC3B,GAQFC,OAAQ,CACN5zI,IAAK,WACH,OAAO8wJ,kBAAkBld,MAC3B,GAQFC,SAAU,CACR7zI,IAAK,WACH,OAAO8wJ,kBAAkBjd,QAC3B,IAGN,EAyBIwd,wCApByB,SAAgCC,qBACvDA,oBAAoBC,kBACtBD,oBAAoBC,oBACXD,oBAAoBE,wBAC7BF,oBAAoBE,0BACXF,oBAAoBG,uBAE7BH,oBAAoBG,uBAExB,EAWIJ,oCAVqB,SAA4BK,mBAC/Ch1J,OAAOmB,SAAS8zJ,eAClBj1J,OAAOmB,SAAS8zJ,iBACPj1J,OAAOmB,SAAS+zJ,qBACzBl1J,OAAOmB,SAAS+zJ,uBACPF,mBAAqBA,kBAAkBE,sBAEhDF,kBAAkBE,sBAEtB,EAkXIC,mBAlWY,SAAmBtxB,eAAgB6kB,gBAAiBwJ,yBAA0BkD,UAC5F,IAAIC,UA2BEC,gBA1BFC,iBAAkB,EAClBC,WAAar5C,2BAA0B,GACvCs5C,aAAe,SAAsBv0J,GACvCA,EAAEiG,iBACFuhJ,gBAAgBjtD,QAAQ/2F,OAAOwZ,MAAM/G,MAAO,CAC1CuyI,YAAarsE,oBAAoBF,gBAAgB5J,kBAAkBiD,iBAErE6+E,UAAU18D,MACZ,EAII+8D,uBAAyB,WAC3Bf,wCAAwC9wB,eAAe,GACzD,EACI8xB,mBAAqB,WACvBhB,qCACF,EACIiB,mBAAqB,WACnBJ,WAAW,GAAGK,kBAChBhyB,eAAe50B,SAAS,mBAExB40B,eAAex0B,YAAY,kBAE/B,EAwBIymD,mBAAqB,YACvBP,iBAAmBA,iBAEjB1xB,eAAepoC,QAAQ/2F,OAAOsgB,OAAOC,aAErC4+G,eAAepoC,QAAQ/2F,OAAOsgB,OAAOE,aAEzC,EA7BMowI,gBAAkB1Z,sCAAsCsW,0BAC5DxJ,gBAAgB9nD,KAAK00D,iBACrBD,UAAY3M,gBAAgB1wH,KAAK,6BA6B7B2lF,WAAWD,oBACb23C,UAAUz1D,GAAG,YAAak2D,oBAE5BT,UAAUz1D,GAAG,QAAS81D,wBACtBL,UAAUz1D,GAAG,QAAS61D,cACtBD,WAAW51D,GAAG,mBAAoBg2D,oBAClC/xB,eAAejkC,GAAGl7F,OAAOwT,SAASmB,mBAAoBq8I,wBACtD7xB,eAAejkC,GAAGl7F,OAAOwT,SAASoB,eAAgBq8I,oBAIpD,IAAIhgB,KAAO,WAAiB,EAG5B,OAAOr1I,OAAOsX,iBAAiB,CAC7B2yI,yBAH6B,SAAkCC,eAAgB,EAK/EmL,mBACAD,uBAEAjL,iBAAkB9U,KAClBgV,iBAAkBhV,KAClB7uI,iBAAkB6uI,KAClB3uI,oBAAqB2uI,KACrBkV,8BAA+BlV,KAC/BmV,gBAAiBnV,KACjBC,UAlDc,WAvBdyf,UAAUvsE,KAAK,MAAOssE,UA2BtBC,UAAU,GAAGhuJ,cAAc,IAAIm2F,MAAM94F,OAAOyV,cAAcE,sBAC1Dg7I,UAAU,GAAGhuJ,cAAc,IAAIm2F,MAAM94F,OAAOyV,cAAcG,iBAC5D,EA6CEu7H,QA5CY,WACZwf,UAAUp6D,IAAI,YAAa66D,oBAC3BT,UAAUp6D,IAAI,QAASy6D,wBACvBL,UAAUp6D,IAAI,QAASw6D,cACvBD,WAAWv6D,IAAI,mBAAoB26D,oBACnC/xB,eAAe5oC,IAAIv2F,OAAOwT,SAASmB,mBAAoBq8I,wBACvD7xB,eAAe5oC,IAAIv2F,OAAOwT,SAASoB,eAAgBq8I,mBACrD,GAsCG,CAOD3K,aAAc,CACZ1nJ,IAAK,WACH,OAAO+xJ,SACT,GAQFxc,aAAc,CACZv1I,IAAK,WACH,OAAO+xJ,UAAU,EACnB,GAQFpK,yBAA0B,CACxB3nJ,IAAK,WACH,OAAO,CACT,GAQF8nJ,0BAA2B,CACzB9nJ,IAAK,WACH,OAAO,CACT,GAQF0kJ,WAAY,CACV1kJ,IAAK,WACH,OAAOR,KAAK+1I,aAAakd,YAC3B,GAQF9N,YAAa,CACX3kJ,IAAK,WACH,OAAOR,KAAK+1I,aAAamd,aAC3B,GAQF1K,sBAAuB,CACrBhoJ,IAAK,WACH,OAAO,CACT,GAQFioJ,kBAAmB,CACjBjoJ,IAAK,WACH,OAAO8kJ,mBAAmBlnC,IAC5B,GAQF56G,KAAM,CACJhD,IAAK,WACH,OAAOilJ,cAAcv1G,KACvB,GAQFw4G,4BAA6B,CAC3BloJ,IAAK,WACH,OAAO,CACT,GAQFmoJ,cAAe,CACbnoJ,IAAK,WACH,OAAO,CACT,GAQFooJ,uBAAwB,CACtBpoJ,IAAK,WACH,OAAO,IACT,GAQFozI,WAAY,CACVpzI,IAAK,WACH,OAAO8xJ,QACT,GAQFhqD,YAAa,CACX9nG,IAAK,WACH,OAAO,CACT,GAQFwuC,SAAU,CACRxuC,IAAK,WACH,OAAO,CACT,GAQFyzI,MAAO,CACLzzI,IAAK,WACH,OAAO,CACT,GAQFqzI,OAAQ,CACNrzI,IAAK,WACH,OAAO,CACT,GAQF0zI,QAAS,CACP1zI,IAAK,WACH,OAAO,CACT,GAQFszI,OAAQ,CACNtzI,IAAK,WACH,OAAO,CACT,GAQFuzI,MAAO,CACLvzI,IAAK,WACH,OAAO,CACT,GAQFwzI,aAAc,CACZxzI,IAAK,WACH,OAAO,CACT,GAQF2zI,SAAU,CACR3zI,IAAK,WACH,MAAO,EACT,GAQF4zI,OAAQ,CACN5zI,IAAK,WACH,MAAO,EACT,GAQF6zI,SAAU,CACR7zI,IAAK,WACH,MAAO,EACT,IAGN,EA+EI2yJ,8BAtBmB,SAA0BpyB,eAAgB6kB,gBAAiBwJ,yBAA0Bv1B,UAAWksB,kBAAmBD,qBACxI,IAGMsN,aAFFp3B,oBAAsBnC,UAAUiB,qBAAqB7C,UAAUC,SAQnE,OAHK2B,UAAUwB,WAHT+3B,aAAeta,0CAA0CsW,0BAC7DxJ,gBAAgB9nD,KAAKs1D,eAKnBp3B,qBACF4pB,gBAAgBz5C,SAAS+vB,WAAW0D,kBAC7BuvB,4BAA4BpuB,eAAgB6kB,gBAAiBwJ,yBAA0Bv1B,UAAUA,UAAWksB,oBAEjHlsB,UAAUyB,WACL7F,UAAUhnG,QAAQ4iI,6BAA6BtwB,eAAgB6kB,gBAAiB/rB,UAdnE,MAc+FisB,oBAAqBC,oBAEtIlsB,UAAUwB,SACL5F,UAAUhnG,QAAQ4jI,mBAAmBtxB,eAAgB6kB,gBAAiBwJ,yBAA0Bv1B,UAAUkB,aAAavC,QAEzH/C,UAAUhnG,QAAQk3H,0BAA0B5kB,eAAgB6kB,gBAAiB/rB,UAAUA,UAnBxE,MAmBoGisB,oBAAqBC,mBACjJ,EAkBIsN,kBAAoB,SAA2BC,UACjDA,SAASv+D,IAFa,gBAEU,QAAQ+H,GAAG,QAAQ,WACjDw2D,SAASn7D,IAAI,QAAQpD,IAHD,gBAGwB,GAC9C,GACF,EAUIw+D,oCACiBF,kBADjBE,gDATgC,SAAuCD,SAAUl1J,IAC/EA,EAAE09F,SAAW19F,EAAE29F,UACjBs3D,kBAAkBC,SAEtB,EAKIC,8CAJ8B,SAAqCD,UACrE,IAAIE,eAAiBF,SAASv+D,IAZR,iBAatB,MAA0B,SAAnBy+D,gBAAgD,KAAnBA,cACtC,EAOIC,UAAYj2J,OAAO2X,OAAO,CAC5BytE,OAAQ,EACR8wE,MAAO,EACPC,UAAW,EACXC,QAAS,EACTC,WAAY,EACZC,UAAW,EACXC,IAAK,EACLlxJ,MAAO,EACPmxJ,gBAAiB,IAEfC,sBAAwB,SAA+BtiJ,IAAKnO,MAC9D,OAAQmO,IAAIynB,eACV,IAAK,MACL,IAAK,SACH,OAAO51B,OAASiwJ,UAAU7wE,OAC5B,IAAK,WACL,IAAK,IACH,OAAOp/E,OAASiwJ,UAAUC,MAC5B,IAAK,OACL,IAAK,YACH,OAAOlwJ,OAASiwJ,UAAUE,UAC5B,IAAK,KACL,IAAK,UACH,OAAOnwJ,OAASiwJ,UAAUG,QAC5B,IAAK,QACL,IAAK,aACH,OAAOpwJ,OAASiwJ,UAAUI,WAC5B,IAAK,OACL,IAAK,YACH,OAAOrwJ,OAASiwJ,UAAUK,UAC5B,IAAK,MACH,OAAOtwJ,OAASiwJ,UAAUM,IAC5B,IAAK,QACH,OAAOvwJ,OAASiwJ,UAAU5wJ,MAC5B,QACE,OAAOqxJ,4BAA4BviJ,IAAIynB,cAAe51B,MAE5D,EACI0wJ,4BAA8B,SAAqCviJ,IAAKnO,MAC1E,OAAQ+2E,oBAAoBC,eAC1B,KAAK73D,cAAcC,QACjB,OAAOuxI,2BAA2BxiJ,IAAKnO,MACzC,KAAKmf,cAAcE,OACjB,OAAOuxI,0BAA0BziJ,IAAKnO,MACxC,KAAKmf,cAAcG,SACjB,OAAOuxI,4BAA4B1iJ,IAAKnO,MAC1C,QACE,OAAO,EAEb,EACI2wJ,2BAA6B,SAAoCxiJ,IAAKnO,MACxE,MACO,MADCmO,KAEGnO,OAASiwJ,UAAUO,eAIhC,EACII,0BAA4B,SAAmCziJ,IAAKnO,MACtE,MACO,MADCmO,KAEGnO,OAASiwJ,UAAUO,eAIhC,EACIK,4BAA8B,SAAqC1iJ,IAAKnO,MAC1E,MACO,MADCmO,KAEGnO,OAASiwJ,UAAUO,eAIhC,EASIrtI,KAAOnpB,OAAOsX,iBAAiB,CACjCw/I,YATgB,SAAqB3iJ,KACrC,IAAK,IAAIhT,EAAI,EAAGA,EAAIysB,UAAUxsB,SAAUD,EACtC,GAAIs1J,sBAAsBtiJ,IAAKyZ,UAAUzsB,IACvC,OAAO,EAGX,OAAO,CACT,GAGG,CACD41J,SAAU,CACR/zJ,IAAK,WACH,OAAOizJ,SACT,KAMAe,mBAAqB,KACrBC,kBAAoB,KACpBC,iBAAmB,KACnBC,WAAar8C,EAAEp7G,QAWf03J,eAAiB,SAAwBx2J,GAC3CqR,YAAW,WACT,IAAIzN,QAAU5D,EAAE8S,cAAgB9S,EAAE8S,cAAgB9S,EAC9CiE,UAAYi2G,EAAEt2G,SAAS6yJ,eAC3B,GAAK7yJ,SAAYK,WAAcL,QAAQ8yJ,uBAAvC,CAKA,IAAIC,2BAA6B/yJ,QAAQggG,cAAgB3/F,UAAU2yJ,eAAiBhzJ,QAAQggG,aAAe9kG,OAAO83J,YAClHhzJ,QAAQ8yJ,uBAAuBC,2BAJ/B,CAKF,GAAG,IACL,EACIE,kBAAoB,WACtB,IACE3nB,uBAAyBjvI,SAAS+pF,cAClCmlD,qCAAuCgmB,8CAA8Cj7C,EAAEj6G,SAAS+pF,eAClG,CAAE,MAAOhqF,GAET,CACF,EACI82J,yCAA2C,WAC7C,GAAI5nB,uBAAwB,CAC1B,IAAI6nB,uBAAyB78C,EAAEg1B,wBAC1BC,sCACHgmB,oCAAoC4B,uBAExC,CACF,EA8BIC,eAAiB,SAAwBh3J,GACxBuoB,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASR,OAIrD31J,EAAEuS,UAAYtS,SAAS+pF,gBAAkBqsE,mBAC3CC,iBAAiBvsE,QACjB/pF,EAAEiG,kBACQjG,EAAEuS,UAAYtS,SAAS+pF,gBAAkBssE,mBACnDD,kBAAkBtsE,QAClB/pF,EAAEiG,kBAEN,EACIgxJ,gBAAkB,WACfb,qBAGLA,mBAAmBr8D,IAAI,UAAWi9D,gBAClCX,kBAAoB,KACpBC,iBAAmB,KACrB,EAYEC,WAAWz4D,KAAK+4D,mBAAmB9sE,MAAM+sE,0CAG3C,IAAII,WAAa,CACfC,UAfc,SAAmBjC,UAC7BkB,oBACFa,kBAEFb,mBAAqBlB,SACrB,IAAIkC,aAAelC,SAASp+H,KAAK,2PACjCu/H,kBAAoBe,aAAa,GACjCd,iBAAmBc,aAAaA,aAAa52J,OAAS,GACtD41J,mBAAmB13D,GAAG,UAAWs4D,eACnC,EAOEC,gBACAI,4BA1GgC,WAChC,IACE,IAAIrtE,cAAgB/pF,SAAS+pF,cACzBA,eACFwsE,eAAexsE,cAEnB,CAAE,MAAOhqF,GAET,CACF,EAkGEw2J,eACAK,kBACAS,qBAtEyB,WACrBpoB,yBAC2Bh1B,EAAEg1B,wBACRnlD,QACvB+sE,2CAEJ,EAiEES,uBAhE2B,SAAgCrC,UAC3D,IACE,OAAOA,SAASxwH,GAAG,WAAawwH,SAAS/yJ,IAAIlC,SAAS+pF,eAAexpF,OAAS,CAChF,CAAE,MAAOR,GACP,OAAO,CACT,CACF,EA2DEw3J,iBA1DqB,SAASA,iBAAiBv3J,UAE/C,IADAA,SAAWA,UAAYnB,OAAOmB,UACjB+tE,OAAS/tE,SAAS+pF,eAAkE,WAAjD/pF,SAAS+pF,cAAcntD,QAAQ7B,cAS7E,OAAO/6B,SAAS+pF,cAPhB,IADA,IAAIytE,QAAUx3J,SAASw7B,qBAAqB,UACnCl7B,EAAI,EAAGA,EAAIk3J,QAAQj3J,OAAQD,IAAK,CACvC,IAAIm3J,QAAUF,iBAAiBC,QAAQl3J,GAAGo3J,cAAc13J,UACxD,IAAgB,IAAZy3J,QACF,OAAOA,OAEX,CAIF,OAAO,CACT,GA+CIE,kBAAoB,OACpBC,iBAAmB,OACnBC,wBAA0B14J,OAAO2X,OAAO,CAC1CipG,KAAM,OACN+3C,mBAAoB,YACpBC,qBAAsB,gBA6IpBC,qCAnI8B,SAAqCpS,WAAYvzB,qBACjF,IAAI4lC,QACAC,uBACAC,yBACAC,0BACAC,4BACAC,kBACAC,WAAaV,wBAAwB93C,KACrCy4C,cAAgB,SAAuBz4J,GACzCA,EAAEiG,iBACFjG,EAAEq6F,kBACEi4B,oBAAoBtM,sBAGxB0yC,2BACA7S,WAAWtrD,QAAQ/2F,OAAO+W,SAAS2B,wBACrC,EAMIw8I,yBAA2B,WAC7BF,WAAaV,wBAAwB93C,KACrCm4C,uBAAuB1gE,OACvBouD,WAAWtrD,QAAQ/2F,OAAO+W,SAAS6B,sBACrC,EAQIu8I,2BAA6B,WAC3BH,aAAeV,wBAAwBE,uBACzCQ,WAAaV,wBAAwB93C,KACrCo4C,yBAAyB3gE,OACzBouD,WAAWtrD,QAAQ/2F,OAAO+W,SAAS+B,qBAEvC,EAiBIs8I,cAAgB,SAAuB54J,GACzCA,EAAEq6F,kBACFs+D,6BACA9S,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMK,OAClC,EACI6sG,gBAAkB,WACpBouC,6BAA+BA,4BAA4B1wE,KAAK,WAAYwC,SAASsvD,SACvF,EACImf,eAAiB,WACnBP,6BAA+BA,4BAA4B1wE,KAAK,WAAYwC,SAASuvD,SACvF,EACImf,iBAAmB,WACrBjT,WAAWtrD,QAAQ/2F,OAAO+W,SAASI,iBACrC,EAeIo+I,YAAc,SAAqBh0J,MAAO+hB,MAC5C,IAAI0nG,iBAAmB8D,oBAAoBhE,sBACvCE,kBAAoB1nG,KAAKkyI,kBAAoB/0I,4BAA4BG,4BAC3EoqG,iBAAiByqC,gCAAgCh1I,4BAA4BG,2BAA4Bm0I,kBAE7G,EAwBA,OA1CEL,QAAUxd,0DACVmL,WAAW/uH,KAAK,+BAA+B4oE,KAAKw4D,SACpDC,uBAAyBtS,WAAW/uH,KAAK,6BACzCshI,yBAA2BvS,WAAW/uH,KAAK,+BAC3CuhI,0BAA4BxS,WAAW/uH,KAAK,wBAC5CwhI,4BAA8BzS,WAAW/uH,KAAK,0BAC9CyhI,kBAAoB1S,WAAW/uH,KAAK,kCACpCshI,yBAAyB3gE,OACrBy/D,WAAWK,uBAAuB1R,cACpCwS,0BAA0BtuE,QAC1BorE,oCAAoCkD,4BAUtCxS,WAAWnnD,GAAGl7F,OAAOwZ,MAAMc,cAAe46I,0BAC1C7S,WAAWnnD,GAAGl7F,OAAO2f,OAAOC,KAAM8mG,iBAClC27B,WAAWnnD,GAAGl7F,OAAO2f,OAAOE,OAAQw1I,gBACpChT,WAAWnnD,GAAGl7F,OAAOif,OAAOC,MAAOq2I,aACnCX,yBAAyB15D,GAAG,WAAYo6D,kBACxCR,4BAA4B55D,GAAG,QAASk6D,eACxCT,uBAAuBz5D,GAAG,QAAS+5D,eAgB9Br5J,OAAOsX,iBAAiB,CAC7BwiJ,yBAlG6B,WAC7BV,WAAaV,wBAAwBC,mBACrCI,uBAAuB3gE,OACvBquD,WAAWtrD,QAAQ/2F,OAAO+W,SAAS4B,uBACrC,EA+FEu8I,yBACAS,8BA1FkC,SAAuCxnE,OACrEA,MACFwmE,uBAAuBpqD,SAAS,6BAEhCoqD,uBAAuBhqD,YAAY,4BAEvC,EAqFEwqD,2BACAS,2BA9E+B,WAC/BZ,WAAaV,wBAAwBE,qBACrCI,yBAAyB5gE,OACzBquD,WAAWtrD,QAAQ/2F,OAAO+W,SAAS8B,sBAC/B66I,WAAWK,uBAAuB1R,cACpCyS,4BAA4BvuE,QAC5BorE,oCAAoCmD,6BAExC,EAuEEe,8BAtEkC,SAAuCC,WAGzE,IAAI3nD,IAAM,QADV2nD,WADAA,UAAYA,UAAUnwI,QAAQyuI,kBAAmB,QAC3BzuI,QAAQ0uI,iBAAkB,QACjB,IAC/BM,uBAAuBxhE,IAAI,mBAAoBgb,KAC/CymD,yBAAyBzhE,IAAI,mBAAoBgb,IACnD,EAiEE4nD,yBArB6B,WAC7BpB,uBAAuBpqD,SAAS,sBAClC,EAoBE4mC,QAnBY,WACZkR,WAAW9rD,IAAIv2F,OAAOwZ,MAAMc,cAAe46I,0BAC3C7S,WAAW9rD,IAAIv2F,OAAO2f,OAAOC,KAAM8mG,iBACnC27B,WAAW9rD,IAAIv2F,OAAO2f,OAAOE,OAAQw1I,gBACrChT,WAAW9rD,IAAIv2F,OAAOif,OAAOC,MAAOq2I,aACpCX,yBAAyBr+D,IAAI,WAAY++D,kBACzCR,4BAA4Bv+D,IAAI,QAAS6+D,eACzCT,uBAAuBp+D,IAAI,QAAS0+D,cACtC,GAYG,CACDe,UAAW,CACTp3J,IAAK,WACH,OAAOo2J,UACT,IAGN,EAcIiB,aAAer6J,OAAO2X,OAAO,CAC/B2iJ,WAAY,EACZC,gBAAiB,EACjBC,gBAAiB,IA+EfC,8BAhEuB,SAA8BxzI,MAAOjjB,KAAMqtC,UAAWqpH,eAAgBC,aAAcC,kBAAmBC,iBAChI,IAAIC,OAAS7zI,MACT0rC,MAAQ3uD,KACRysC,WAAaY,UACb0pH,gBAAkBL,eAClBM,cAAgBL,aAChBM,mBAAqBL,kBACrBM,iBAAmBL,gBACnBM,sBAAwBN,gBAAgBnjI,KAAK,kBAC7C0jI,0BAA4BP,gBAAgBnjI,KAAK,uBACjD2jI,sBAAwBR,gBAAgBnjI,KAAK,kBACjD,OAAO13B,OAAOsX,iBAAiB,CAAC,EAAG,CACjC2P,MAAO,CACLjkB,IAAK,WACH,OAAO83J,MACT,GAEF92J,KAAM,CACJhB,IAAK,WACH,OAAO2vD,KACT,GAEFthB,UAAW,CACTruC,IAAK,WACH,OAAOytC,UACT,GAEFiqH,eAAgB,CACd13J,IAAK,WACH,OAAO+3J,eACT,GAEFJ,aAAc,CACZ33J,IAAK,WACH,OAAOg4J,aACT,GAEFJ,kBAAmB,CACjB53J,IAAK,WACH,OAAOi4J,kBACT,GAEFnF,SAAU,CACR9yJ,IAAK,WACH,OAAOk4J,gBACT,GAEFI,qBAAsB,CACpBt4J,IAAK,WACH,OAAOm4J,qBACT,GAEFI,yBAA0B,CACxBv4J,IAAK,WACH,OAAOo4J,yBACT,GAEFI,qBAAsB,CACpBx4J,IAAK,WACH,OAAOq4J,qBACT,IAGN,EA6BII,4BAA8B,SAAqC9gB,cAAe5oB,uBAAwBG,sBAAuBT,oBAAqBG,sBACxJ,IAAI8pC,UAAYzsJ,KAAKqiC,MAAMqpG,cAAgB5oB,wBACvC4pC,IAAM1sJ,KAAKqiC,MAAMoqH,UAAYxpC,uBAEjC,MAAO,CACLpyH,GAFW47J,UAAYxpC,sBAAwBypC,KAEnClqC,oBACZjwH,EAAGm6J,IAAM/pC,qBACTjwH,MAAO8vH,oBACP7vH,OAAQgwH,qBAEZ,EAwqBIgqC,gCAtpByB,SAAgCnV,WAAYlO,aAAc6O,WACrF,IAAInsH,OAASqgH,8CACbmL,WAAW/uH,KAAK,yBAAyB4oE,KAAKrlE,QAC9C,IAcI4gI,qBAWAC,mBACAC,kBA1BA7G,WAAar5C,2BAA0B,GACvCmgD,aAAe9G,WAAW,GAC1B+G,WAAapgD,0BACbqgD,oBAAsB,KACtBC,YAAa,EACbC,eAAiB,EACjBC,uBAAwB,EACxBC,sBAAuB,EACvBC,WAAanV,UACboV,kBAAoB/V,WAAW/uH,KAAK,cACpC+kI,WAAahW,WAAW/uH,KAAK,4BAC7BglI,gBAAkBjW,WAAW/uH,KAAK,mBAClCilI,cAAgBlW,WAAW/uH,KAAK,YAChCklI,eAAiBnW,WAAW/uH,KAAK,kBAEjCmlI,sBAAwBD,eAAellI,KAAK,oBAC5ColI,uBAAyBF,eAAellI,KAAK,2BAC7CqlI,8BAAgC,KAChCC,0BAA4BJ,eAAellI,KAAK,iBAChDulI,wBAA0BL,eAAellI,KAAK,eAC9CyhI,kBAAoB1S,WAAW/uH,KAAK,qBACpCmiC,SAAW,GACXqjG,cAAe,EACfC,6BAA8B,EAC9BC,iBAAkB,EAGlBC,gCAAkC,EAClCC,uBAAyB,EACzBC,kBAAmB,EACnBC,2BAA6B,EAC7BC,wBAA0B,CAC5BC,eAAe,EACfC,mBAAoB,EACpBC,uBAAwB,EACxBC,YAAa,KACbC,mBAAoB,MAElBC,eAAiB,GACjBC,2BAA4B,EAC5BC,wBAA0B,EAC1BC,2BAA6B,EAC7BC,yBAA2B,EAI3BC,yBAA2B,WAC7B,OAAOJ,yBACT,EACIK,UAAY,SAAmB14J,OACjC,OAAIA,MAAM64F,eAAiB74F,MAAM64F,cAAc,IAAM74F,MAAM64F,cAAc,GAAGT,MACnEp4F,MAAM64F,cAAc,GAAGT,MAEzBp4F,MAAMo4F,KACf,EAaIugE,sCAAwC,SAA+C3jB,eACzF,GAAKyjB,2BAAL,CAGA,IAAIjX,mBAAqC,IAAhBxM,cACzB4hB,WAAW9uB,uBAAuBnrI,SAAQ,SAAU4kJ,mBAClDA,kBAAkB9f,YAAc8f,kBAAkB71G,UAAY81G,kBAChE,GAJA,CAKF,EAoBIoX,wCAA0C,SAAiDC,aAAcC,SAC3G,OAAID,cAAgBC,QAAQ/D,gBAAkB8D,cAAgBC,QAAQ9D,cAC5D6D,aAAeC,QAAQ/D,gBAAkB+D,QAAQ7D,kBAAoB,IACpE4D,aAAeC,QAAQ9D,aACzB,IAEF,CACT,EACI+D,0BAA4B,SAAmCC,MACjE,IACIC,aAAeD,KAAOlC,WAAWjwI,SAAS+7E,KAC1Cs2D,cAAgBpC,WAAW96J,QAC3Bm9J,uBAAyB7vJ,KAAKsoB,IAAItoB,KAAKglC,IAAI2qH,aAAeC,cAAe,GAAI,GAC7EE,iBAAmBxmB,aAAa/mG,SAAWstH,uBAE/C,MAAO,CACLE,UAAWD,iBACXE,0BAzDkD,SAAyDtkB,eAC7G,IAAKyjB,2BACH,OAAO,KAGT,IADA,IAAIjX,mBAAqC,IAAhBxM,cAChBx5I,EAAI,EAAGA,EAAIo7J,WAAW9uB,uBAAuBrsI,OAAQD,IAC5D,GAAIo7J,WAAW9uB,uBAAuBtsI,GAAGkwC,WAAa81G,qBAAuBoV,WAAW9uB,uBAAuBtsI,GAAGimI,YAChH,OAAOm1B,WAAW9uB,uBAAuBtsI,GAAGkwC,UAAY,IAG5D,OAAO,IACT,CA2C8B6tH,CAAgDH,kBAK9E,EACII,mBAAqB,SAA4BrsE,UACnDirE,eAAez7J,SAAQ,SAAUm8J,SAC/BA,QAAQnD,qBAAqB/jE,IAAI,CAC/B51F,MAAO48J,wCAAwCzrE,SAAU2rE,SAAW,KAExE,GACF,EACIW,WAAa,SAAoBx+J,GACnCA,EAAEiG,iBACEs1J,aAGJjH,WAAW51D,GAAG,wBAAyB+/D,YAGvCnK,WAAW51D,GAAG,wCAAyCggE,UAClD/mB,aAAalC,OAIhBgmB,uBAAwB,GAHxBA,uBAAwB,EACxB9jB,aAAa5jF,SAIf2nG,qBAAuBD,sBACvBtmB,cAAa,GACbunB,uBAAyB,EACzBiC,gBAAgBlB,UAAUz9J,EAAEu8F,gBAC9B,EA+BIqiE,6BAA+B,SAAsCC,gBACvE,IAAIC,yBAA2BD,eAAeT,UAAYzmB,aAAa/mG,SACnEmuH,uBAAsE,OAA7CF,eAAeR,0BAAqCQ,eAAeR,0BAA4B1mB,aAAa/mG,SAAWkuH,yBACpJjC,wBAAwBE,mBAAqB8B,eAAeT,UAC5DvB,wBAAwBC,cAAgBgC,2BAA6BC,uBACrElC,wBAAwBI,YA1FM,SAAmC3K,yBACjE,IAAK,IAAI/xJ,EAAI48J,eAAe38J,OAAS,EAAGD,GAAK,EAAGA,IAC9C,GAAI+xJ,yBAA2B6K,eAAe58J,GAAGkwC,UAC/C,OAAO0sH,eAAe58J,GAAG6C,KAG7B,OAAO,IACT,CAmFwC47J,CAAqD,IAA3BH,eAAeT,WAC/EvB,wBAAwBK,mBAAqBjjB,yBAAyB4kB,eAAeT,WACrFvB,wBAAwBG,sBAAwB8B,yBAChDlC,0BAA4BmC,sBAC9B,EACIE,qBAAuB,SAA8Bj/J,GACvD,IAAI6+J,eAAiBf,0BAA0BL,UAAUz9J,EAAEu8F,gBAC3DqiE,6BAA6BC,eAC/B,EACIK,2BAA6B,YACA,IAA/B5B,2BAAoChsJ,aAAagsJ,2BACjDA,2BAA6B,CAC/B,EACI6B,iBAAmB,SAA0Bn/J,GAC/Ck/J,6BACAvC,kBAAmB,EACnBsC,qBAAqBj/J,GACrBo/J,iBACApD,eAAexkE,OACf88D,WAAW51D,GAAG,wBAAyBugE,qBACzC,EACII,iBAAmB,WACrB/B,2BAA6B,EAC7BX,kBAAmB,EACnBX,eAAevkE,OACf0lE,eAAez7J,SAAQ,SAAUm8J,SAC/BA,QAAQlD,yBAAyBhkE,IAAI,CACnC51F,MAAO,KAEX,IACAuzJ,WAAWv6D,IAAI,wBAAyBklE,qBAC1C,EACIK,mBAAqB,WACvBJ,6BACA5B,0BAA4BjsJ,WAAWguJ,iBAhOZ,IAiO7B,EACIZ,WAAa,SAAoBz+J,GAC9Bu7J,aAGA5jB,aAAalC,QAChBkC,aAAa5jF,QAEf4qG,gBAAgBlB,UAAUz9J,EAAEu8F,gBAC9B,EACImiE,SAAW,SAASA,WACtB,GAAKnD,WAAL,CAGAjH,WAAWv6D,IAAI,wBAAyB0kE,YACxCnK,WAAWv6D,IAAI,wCAAyC2kE,UACxD,IAAIa,eAAiB7zH,OAAOisG,aAAaztC,YAAYv9B,QAAQ,KAAOjhC,OAAOisG,aAAa/mG,SAAS+7B,QAAQ,IACrG+uF,uBAAyB6D,gBAC3B5nB,aAAa/C,OAEfO,cAAa,EAPb,CAQF,EACIwpB,gBAAkB,SAAyBZ,MAC7C,IAAIyB,WAAa1B,0BAA0BC,MAEzCrC,sBADE8D,WAAWnB,2BAGU5C,sBAEzBD,eAAiBgE,WAAWnB,2BAA6BmB,WAAWpB,SACtE,EA0CIgB,eAAiB,WA1HQ,IAAgCnC,YAAaC,mBACpEuC,mBArB2CC,aAC3CzB,cACA0B,eACAC,kBA4ICjD,oBAfoB,WACzB,GAAKR,8BAGL,GAAIU,wBAAwBC,cAC1BZ,uBAAuBnuD,SAAS+vB,WAAWqD,6BAC3C86B,sBAAsBxkE,WACjB,CACLykE,uBAAuB/tD,YAAY2vB,WAAWqD,6BAC9C86B,sBAAsBzkE,OACtB,IAAIqoE,cAAgBhF,4BAA4BgC,wBAAwBE,mBAAoBzqC,oBAAoBnB,uBAAwBmB,oBAAoBhB,sBAAuBgB,oBAAoBzB,oBAAqByB,oBAAoBtB,sBAChPmrC,8BAA8B2D,UAAU7E,qBAAsB4E,cAAc3gK,EAAG2gK,cAAcj/J,EAAGi/J,cAAc9+J,MAAO8+J,cAAc7+J,OAAQ,EAAG,EAAGsxH,oBAAoBzB,oBAAqByB,oBAAoBtB,qBAChN,CACF,CAKE+uC,GA9H2D9C,YA+HpCJ,wBAAwBI,YA/HyBC,mBA+HZL,wBAAwBK,mBA9HhFuC,mBAAqB,GACrB5C,wBAAwBC,cAC1B2C,mBAAqBtjF,oBAAoBF,gBAAgB5J,kBAAkB2H,wBAClEijF,cACTwC,mBAAqBxC,aAEvBb,0BAA0Bv9H,KAAK4gI,oBAC/BpD,wBAAwBx9H,KAAKq+H,oBA5BkBwC,aAoJ9B7C,wBAAwBG,sBAnJrCiB,cAAgBpC,WAAW96J,QAC3B4+J,eAAiB1B,cAAgByB,aACjCE,kBAAoB5D,eAAej7J,SACvC4+J,gBAAkBC,kBAAoB,GApKf,GAsKrBD,eAtKqB,GAuKZA,eAAiBC,kBAAoB3B,cAvKzB,KAwKrB0B,eAAiB1B,eAxKI,GAwKoC2B,oBAE3D5D,eAAerlE,IAAI,OAAQgpE,eAAiB,MAE3B,SAAsBD,cACvC,IAAIM,uBAAwC,IAAfN,aAC7BvC,eAAez7J,SAAQ,SAAUm8J,SAC/BA,QAAQlD,yBAAyBhkE,IAAI,CACnC51F,MAAO48J,wCAAwCqC,uBAAwBnC,SAAW,KAEtF,GACF,CAkIEoC,CAAarD,2BACf,EACIsD,SAAW,SAAkBh2D,aAC/B,IAAIi2D,cAAgBj2D,YAAcytC,aAAa/mG,SAAW,IAC1DusH,eAAez7J,SAAQ,SAAUm8J,SAC/BA,QAAQjD,qBAAqBjkE,IAAI,CAC/B51F,MAAO48J,wCAAwCwC,cAAetC,SAAW,KAE7E,IACAuC,kBAAkBl2D,YACpB,EACIk2D,kBAAoB,SAA2Bl2D,aACjD,IAAIm2D,qBAAuBpmB,yBAAyB/vC,aACpD,GAAIm2D,uBAAyB5D,iCAAkCF,4BAA/D,CAGAE,+BAAiC4D,qBACjC,IAAIC,oBAAsBD,qBAO1B,IANK9D,6BAA+B5kB,aAAa/mG,WAC/C2rH,6BAA8B,EAC9BrB,mBAAqBjhB,yBAAyBtC,aAAa/mG,UAC3DuqH,kBAAoBlhB,uCAAuCtC,aAAa/mG,UACxEirH,WAAWj0E,KAAK,gBAAiB+vD,aAAa/mG,WAE5C2rH,4BAA6B,CAC/B+D,qBAAuB,MAAQpF,mBAC/BU,kBAAkBl8D,KAAK4gE,qBACvB,IAAIC,cAAgBtmB,uCAAuC/vC,aAAe/tB,oBAAoBF,gBAAgB5J,kBAAkB2C,kCAAoCmmF,kBACpKU,WAAWj0E,KAAK,gBAAiBsiB,aACjC2xD,WAAWj0E,KAAK,iBAAkB24E,cACpC,CAfA,CAgBF,EAcIC,sBAAwB,WAC1BjD,yBAA2B1B,WAAW96J,OACxC,EACI0/J,eAAiB,WACnBC,oBACAF,uBACF,EACIE,kBAAoB,WACjBlD,6BAGAhB,iBACHmE,oBAEFC,yBACF,EACIA,uBAAyB,WA7BR,IAEfC,4BACA9C,KACA+C,YACAC,yBAyBJpF,WAAW9uB,uBAAuBnrI,SAAQ,SAAU4kJ,kBAAmB/lJ,GACrE,GAAI+lJ,kBAAkB5yD,UAAW,CAC/B,IAAIstE,OAAS/nG,SAAS14D,GACtBygK,QAAUA,OAAOvpE,MACnB,CACF,IAjCIopE,4BAAsD,IAAxBlpB,aAAa/mG,SAC3CmtH,KAAO,EACP+C,YAAc,EACdC,yBAA2BhF,cAAch7J,QAC7C46J,WAAW9uB,uBAAuBnrI,SAAQ,SAAU4kJ,kBAAmB/lJ,GACrEugK,YAAcxa,kBAAkB71G,UAAYowH,4BAC5C9C,KAAO1vJ,KAAK8kC,MAAM4tH,yBAA2BD,YAAcG,GAC3D,IAAID,OAAS/nG,SAAS14D,GACtBygK,QAAUA,OAAOrqE,IAAI,OAAQonE,KAAO,KACtC,GA0BF,EACI4C,kBAAoB,WACjBnD,6BAGLhB,iBAAkB,EAClBb,WAAW9uB,uBAAuBnrI,SAAQ,WACxCu3D,SAASv1D,KAAKw2G,EAAE,eAAenM,SAAS,eAC1C,IACAguD,cAAc17D,OAAOpnC,UACvB,EAYIk8E,aAAe,SAAsB7hI,QACvCioJ,WAAajoJ,QAXb8nJ,aAAaptF,KAAK+b,QAClBqxE,aAAa8F,cAAgB,WAC3B,OAAO,CACT,EAWErb,WAAWtrD,QAAQ/2F,OAAOmb,UAAUC,WARtCw8I,aAAa8F,cAAgB,WAC3B,OAAO,CACT,EASErb,WAAWtrD,QAAQ/2F,OAAOmb,UAAUE,OAExC,EAOIsiJ,WAAa,SAAoBnhK,GACnC,GAAKs8J,aAAL,CAGA,IATI8E,wBACAC,wBACAC,mBAOAC,WAAavhK,EAAEuS,SAragB,EAqa8B+/G,oBAAoB/C,kBAAoB+C,oBAAoB/C,kBACzHhnG,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASV,YACpCnjC,oBAAoB5C,iBACtBioB,aAAaztC,YAAcm8C,8BAA8B1O,aAAcA,aAAaztC,YAAcq3D,aAZlGH,wBAA0BjlF,oBAAoBF,gBAAgB5J,kBAAkBwG,qCAChFwoF,wBAA0B3mB,kDAAkD0mB,yBAC5EE,mBAAqBpnD,EAAEmnD,yBAC3Bxb,WAAWxlD,OAAOihE,qBAaP/4I,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASZ,WAC/C5d,aAAaztC,YAAcm8C,8BAA8B1O,aAAcA,aAAaztC,YAAcq3D,YACzFh5I,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASb,QAAU8F,aAAapxE,gBAAkB6xE,WAAW,KACnG77J,EAAEiG,iBACE0xI,aAAalC,OACfkC,aAAa/C,OAEb+C,aAAa5jF,QAfjB,CAkBF,EACIytG,YAAc,SAAqBxhK,GACjCA,EAAE6O,SAAW4qJ,aAAaC,WAC5B8E,WAAWx+J,GAEXm1J,oCAAoCj7C,EAAEt4G,MAE1C,EACI6/J,oBAAsB,WACxB5F,WAAWj0E,KAAK,WAAYwC,SAASsvD,UACrC4iB,cAAe,CACjB,EACIoF,mBAAqB,WACvB7F,WAAWj0E,KAAK,WAAYwC,SAASuvD,UACrC2iB,cAAe,CACjB,EAoBIqF,0BAA4B,WAC9BjE,sCAAsC/lB,aAAaztC,YACrD,EACI03D,mBAAqB,YA7XqB,SAAiD7nB,eAC7F,GAAKyjB,2BAAL,CAGA,IAAIjX,mBAAqC,IAAhBxM,cACzB4hB,WAAW9uB,uBAAuBnrI,SAAQ,SAAU4kJ,mBAC9CC,oBAAsBD,kBAAkB71G,YAC1C61G,kBAAkB9f,aAAc,EAEpC,GANA,CAOF,CAoXEq7B,CAAwClqB,aAAaztC,YACvD,EACI43D,iBAAmB,WACrBjG,WAAWrkE,OACXkpE,oBACAF,uBACF,EAQIuB,uBAAyB,WAC3B5F,8BAAgCF,sBAAsB,GAAG+F,WAAW,MACpE/G,qBAAqBzkD,YAASt0G,EAC9B+4J,qBAAqBxkD,aAAUv0G,CACjC,EAWI62J,YAAc,WAChB,IAAIvqC,iBAAmB8D,oBAAoBhE,sBACtCE,kBAGLA,iBAAiByqC,gCAAgCh1I,4BAA4BC,aAAcq0I,kBAC7F,EACI0J,YAAc,WAChBlJ,aACF,EAiFImJ,gBAAkB,WACpB,IAAIC,kBAAoB,EACpBxqB,eACEA,aAAa5B,UAAY4B,aAAa5B,SAASv1I,SACjD2hK,kBAAoB9zJ,KAAKglC,IAplBZ,IAolBgChlC,KAAKg3F,KAplBrC,IAolB0CsyC,aAAa5B,SAAS1+G,IAAIsgH,aAAa5B,SAASv1I,OAAS,GAAsBm3I,aAAa/mG,YAErJ2tH,mBAAmB4D,mBAtlBJ,MAulBXA,oBAAoE,IAA5B9E,wBAC1ChC,WAAW9K,cAAc8M,wBAG/B,EACI9jB,sBAAwB,WAG1B2oB,mBACgC,IAA5B7E,wBACFhC,WAAW9K,cAAc8M,wBAE3BqD,oBACArD,uBAAyBhC,WAAW7K,YAAY0R,gBAnmBX,IAomBvC,EA4BA,OAjIY,WACVrG,WAAWj0E,KAAK,gBAAiB,GAC7B0qC,oBAAoB5C,kBACtBmsC,WAAWn9D,GAAG,aAAc8/D,YAC5B3C,WAAWn9D,GAAG,YAAa8iE,aAC3B3F,WAAWn9D,GAAG,uBAAwBygE,kBACtCtD,WAAWn9D,GAAG,oBAAqB4gE,qBAEnCzD,WAAW9tD,SAAS+vB,WAAWmD,gCAEjC4kB,WAAWnnD,GAAG,UAAWyiE,YACzBtb,WAAWnnD,GAAGl7F,OAAO2f,OAAOC,KAAMq+I,qBAClC5b,WAAWnnD,GAAGl7F,OAAO2f,OAAOE,OAAQq+I,oBACpC7b,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASymJ,qBACvC5b,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQymJ,oBACtC7b,WAAWnnD,GAAGl7F,OAAOsb,SAASE,SAAU2iJ,2BACxC9b,WAAWnnD,GAAGl7F,OAAO+W,SAAS9B,aAAcgoJ,gBAC5C5a,WAAWnnD,GAAGl7F,OAAOif,OAAOC,MAAOu/I,aACnCtqB,aAAa/xI,iBAAiBpC,OAAOyV,cAAcS,YAAakoJ,oBAChEjqB,aAAa/xI,iBAAiBpC,OAAOyV,cAAcE,oBAAqB2oJ,kBACxEnqB,aAAa/xI,iBAAiBpC,OAAOyV,cAAce,oBAAqBu/H,uBACxE5B,aAAa/xI,iBAAiBpC,OAAOyV,cAAckB,cAAe+nJ,iBAClE,IArDIE,gCACAnI,gBAyDJqB,oBAAsBD,WAAWh0J,uBALH,SAASg7J,2BApRhB,WACvB,GAA8B,IAA1B1qB,aAAa/mG,SAGjB,GAAI2qH,WAAY,CACd,GAAIC,iBAAmBkB,uBAAyBlB,eAAiB,EAC/D,OAEFkB,sBAAwBlB,eACpB7jB,aAAa9B,MACfgQ,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMK,OAAQ,CACtCguD,KAAMmwF,eACN8G,eAAe,IAGjBzc,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMI,WAAY,CAC1CiuD,KAAMmwF,iBAGV0E,SAAS1E,eACX,KAAO,CACL,GAAI7jB,aAAa7B,QACf,OAEFoqB,SAASvoB,aAAaztC,YACxB,CACF,CA2PIq4D,GACAnD,iBACA9D,oBAAsBD,WAAWh0J,sBAAsBg7J,wBACzD,IAIA7B,wBACA3E,WAAWpkE,OACN66B,oBAAoByE,oBAGvBilC,eAAejuD,SAAS+vB,WAAWsD,0BACnC46B,eAAerlE,IAAI,CACjB51F,MAAO,GAAG8K,OAAOymH,oBAAoBzB,oBAviBb,EAuiB8D,QAExFqrC,uBAAuBvlE,IAAI,CACzB51F,MAAO,GAAG8K,OAAOymH,oBAAoBzB,oBAAqB,MAC1D7vH,OAAQ,GAAG6K,OAAOymH,oBAAoBtB,qBAAsB,QAE9DirC,sBAAsBr0E,KAAK,QAAS,GAAG/7E,OAAOymH,oBAAoBzB,oBAAqB,OACvForC,sBAAsBr0E,KAAK,SAAU,GAAG/7E,OAAOymH,oBAAoBtB,qBAAsB,QA/D3FiqC,qBAAuB,IAAIuH,OACNhsD,OAASurD,uBAC9B9G,qBAAqBxkD,QAAU,WAC7BwkD,qBAAqBzkD,YAASt0G,EAC9B+4J,qBAAqBxkD,aAAUv0G,EAC/B+4J,qBAAuB,IACzB,EACAA,qBAAqBv8E,IAAM4zC,oBAAoByE,oBA6C7CklC,sBAAsBxkE,OAhEpB2qE,gCAAkC1nB,0DAA0D,IAC5Fuf,gBAAkB//C,EAAEkoD,kCACRzrE,IAAI,QAAS,QAC7BmlE,gBAAgBz7D,OAAO45D,iBACvBkD,eAAiB,CAACtD,8BAA8B,EAAG,KAAM,EAAG,EAAG,IAAK,IAAKI,kBA2EzElB,aACF,CA+EA19D,GACOj8F,OAAOsX,iBAAiB,CAC7B+rJ,iCAhMqC,SAA0CC,qBAC/E,GAAKlF,2BAUL,IAPA,IAAIlX,kBAAoB,KACpBua,4BAAsD,IAAxBlpB,aAAa/mG,SAC3C+xH,uBAAyB9c,WAAW9kJ,QACpC6hK,wBAA0B7G,cAAch7J,QAExC8hK,iBAAmBx0J,KAAKsoB,IAAIgsI,uBAAwBC,yBACpDE,mBAAqBjH,WAAWjwI,SAAS+7E,KACpCpnG,EAAI,EAAGA,EAAIo7J,WAAW9uB,uBAAuBrsI,OAAQD,IAE5D,IADA+lJ,kBAAoBE,UAAU3Z,uBAAuBtsI,IAC/BwlI,mBAAqB28B,oBAAqB,CAC9D,IAAI5B,YAAcxa,kBAAkB71G,UAAYowH,4BAChD,OAAOxyJ,KAAK8kC,MAAM0vH,iBAAmB/B,aAAegC,kBACtD,CAEJ,EA+KEpC,kBACAnC,mBACAb,sCACAqF,mBATuB,WACvBxG,6BAA8B,CAChC,EAQEyG,kBArFsB,SAA2BC,aACjD,GAAKtrB,aAAa/mG,SAIlB,GAAIqyH,YAAYziK,OAxjBiB,IAyjB/BmqC,QAAQggH,KAAK,oFADf,CAIAmR,gBAAgBrxE,QAChB0yE,eAAiB,GAIjB,IAHA,IAAI0D,4BAAsD,IAAxBlpB,aAAa/mG,SAC3CsyH,cAAgB,EAChBC,oBAAsB,EACjB5iK,EAAI,EAAGA,EAAI0iK,YAAYziK,OAAQD,IACtC,KAAI0iK,YAAY1iK,GAAGkwC,WAAaowH,6BAAhC,CAGA,IAAIuC,0BAA4B7iK,EAAI0iK,YAAYziK,OAAS,EAAIyiK,YAAY1iK,EAAI,GAAGkwC,UAAYowH,4BAExFwC,mBADgCD,0BAA4BF,eACRrC,4BAA8B,IAClFuB,gCAAkC1nB,0DAA0Dn6I,GAC5F05J,gBAAkB//C,EAAEkoD,iCACxBnI,gBAAgBtjE,IAAI,QAAS0sE,kBAAoB,KACjDvH,gBAAgBz7D,OAAO45D,iBACvBkD,eAAez5J,KAAKm2J,8BAA8Bt5J,EAAG0iK,YAAY1iK,GAAG6C,KAAM6/J,YAAY1iK,GAAGkwC,UAAW0yH,oBAAqBA,oBAAsBE,kBAAmBA,kBAAmBpJ,kBACrLkJ,qBAAuBE,kBACvBH,cAAgBE,yBAVhB,CATF,CAqBF,EAyDEzuB,QAlCY,YACoB,IAA5B0oB,wBACFhC,WAAW9K,cAAc8M,wBAE3BxB,WAAW9hE,IAAI,aAAcykE,YAC7B3C,WAAW9hE,IAAI,YAAaynE,aAC5B3F,WAAW9hE,IAAI,uBAAwBolE,kBACvCtD,WAAW9hE,IAAI,oBAAqBulE,oBACpCzZ,WAAW9rD,IAAI,UAAWonE,YAC1Btb,WAAW9rD,IAAIv2F,OAAO2f,OAAOC,KAAMq+I,qBACnC5b,WAAW9rD,IAAIv2F,OAAO2f,OAAOE,OAAQq+I,oBACrC7b,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASymJ,qBACxC5b,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQymJ,oBACvC7b,WAAW9rD,IAAIv2F,OAAOsb,SAASE,SAAU2iJ,2BACzC9b,WAAW9rD,IAAIv2F,OAAO+W,SAAS9B,aAAcgoJ,gBAC7C5a,WAAW9rD,IAAIv2F,OAAOif,OAAOC,MAAOu/I,aACpCtqB,aAAa7xI,oBAAoBtC,OAAOyV,cAAcS,YAAakoJ,oBACnEjqB,aAAa7xI,oBAAoBtC,OAAOyV,cAAce,oBAAqBu/H,uBAC3E5B,aAAa7xI,oBAAoBtC,OAAOyV,cAAckB,cAAe+nJ,iBACzC,OAAxB5G,qBACFD,WAAWiI,qBAAqBhI,oBAEpC,EAaEiI,4BA/kBgC,SAAqCC,6BACrEpG,0BAA4BoG,2BAC9B,GA8kBG,CACDC,UAAW,CACTrhK,IAAK,WACH,OAAOm5J,UACT,EACAx5J,IAAKozI,cAEPuuB,cAAe,CACbthK,IAAK,WACH,OAAOo5J,cACT,GAEFmI,eAAgB,CACdvhK,IAAK,WACH,OAAOy5J,UACT,GAEF+H,aAAc,CACZxhK,IAAK,WACH,OAAOm7J,wBACT,IAGN,EAkHIsG,gCAnGyB,SAAgChe,WAAYlO,cACvE,IAAIyG,aAAe9rB,oBAAoB/C,kBACnC2oC,QAAUxd,mDAAmD0D,cACjEyH,WAAW/uH,KAAK,yBAAyB4oE,KAAKw4D,SAC9C,IAAI4L,WAAY,EACZC,cAAgBle,WAAW/uH,KAAK,iBAChCktI,gBAAkBne,WAAW/uH,KAAK,mBAClCmtI,iBAAmBpe,WAAW/uH,KAAK,oBACnCotI,kBAAoBH,cAAcjtI,KAAK,sBACvCqtI,mBAAqBJ,cAAcjtI,KAAK,uBAaxCstI,WAAa,WACfzsB,aAAa5jF,OACf,EACA8xF,WAAWnnD,GAAGl7F,OAAO+W,SAASS,SAfJ,WACxB+oJ,cAAcn8E,KAAK,WAAYwC,SAASsvD,UACxCsqB,gBAAgBp8E,KAAK,WAAYwC,SAASsvD,UAC1CuqB,iBAAiBr8E,KAAK,WAAYwC,SAASsvD,UAC3CoqB,WAAY,CACd,IAWAje,WAAWnnD,GAAGl7F,OAAO+W,SAASU,QAVL,WACvB8oJ,cAAcn8E,KAAK,WAAYwC,SAASuvD,UACxCqqB,gBAAgBp8E,KAAK,WAAYwC,SAASuvD,UAC1CsqB,iBAAiBr8E,KAAK,WAAYwC,SAASuvD,UAC3CmqB,WAAY,CACd,IAMAje,WAAWnnD,GAAGl7F,OAAOggB,MAAMC,YAAa2gJ,YACxCzsB,aAAa/xI,iBAAiBpC,OAAOwZ,MAAMC,MAAM,WAC/CinJ,kBAAkBzsE,OAClB0sE,mBAAmB3sE,OACnBusE,cAAcn8E,KAAK,gBAAgB,EACrC,IACA+vD,aAAa/xI,iBAAiBpC,OAAOwZ,MAAMG,OAAO,WAChDgnJ,mBAAmB1sE,OACnBysE,kBAAkB1sE,OAClBusE,cAAcn8E,KAAK,gBAAgB,EACrC,IACA,IAAI6wE,cAAgB,SAAuBz4J,GACzCA,EAAEiG,iBACFo+J,YACF,EACIA,WAAa,WACXP,YAGAnsB,aAAalC,OACXkC,aAAa9B,MACfgQ,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMK,QAEhCs6H,aAAa/C,OAGfwvB,aAEJ,EACIE,UAAY,SAAmBvqB,eACjC8L,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMI,WAAY,CAC1CiuD,KAAMg7E,8BAA8B1O,aAAcoC,gBAEtD,EACIwqB,YAAc,SAAqBvkK,GACrCA,EAAEiG,iBACFq+J,UAAU3sB,aAAaztC,YAAcooB,oBAAoB/C,kBAC3D,EACIi1C,iBAAmB,SAA0BxkK,GAC/CA,EAAEiG,iBACFq+J,UAAU3sB,aAAaztC,YAAcooB,oBAAoB/C,kBAC3D,EAyBA,OAbI+C,oBAAoBlD,0BACtB40C,gBAAgBtlE,GAAG,QAAS6lE,aACxBjyC,oBAAoB5C,iBACtBu0C,iBAAiBvlE,GAAG,QAAS8lE,kBAE7BP,iBAAiBl2D,SAAS+vB,WAAWrmC,QAGvCusE,gBAAgBj2D,SAAS+vB,WAAWrmC,MACpCwsE,iBAAiBl2D,SAAS+vB,WAAWrmC,OAEvCssE,cAAcrlE,GAAG,QAAS+5D,eAC1B0L,mBAAmB1sE,OACZr4F,OAAOsX,iBAAiB,CAC7B2tJ,WACAI,gBA1BoB,WAChBvN,WAAWK,uBAAuB1R,cACpCke,cAAch6E,QACdorE,oCAAoC4O,eAExC,EAsBEpvB,QArBY,WACZovB,cAAchqE,IAAI,QAAS0+D,eAC3BuL,gBAAgBjqE,IAAI,QAASwqE,aAC7BN,iBAAiBlqE,IAAI,QAASyqE,iBAChC,GAkBG,CAAC,EACN,EA6DIE,8BAxDuB,SAA8B7e,YACvD,IAAIqS,QAAUxd,mDACdmL,WAAW/uH,KAAK,uBAAuB4oE,KAAKw4D,SAC5C,IAAIyM,kBAAoB9e,WAAW/uH,KAAK,qBACpC8tI,cAAgB/e,WAAW/uH,KAAK,iBAChC2qI,oBAAsB,WACxBkD,kBAAkB/8E,KAAK,WAAYwC,SAASsvD,UAC5CkrB,cAAch9E,KAAK,WAAYwC,SAASsvD,SAC1C,EACIgoB,mBAAqB,WACvBiD,kBAAkB/8E,KAAK,WAAYwC,SAASuvD,UAC5CirB,cAAch9E,KAAK,WAAYwC,SAASuvD,SAC1C,EACAkM,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASymJ,qBACvC5b,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQymJ,oBACtCiD,kBAAkBhoE,OAAM,WACtBkpD,WAAWtrD,QAAQ/2F,OAAO+W,SAASC,UACrC,IACAoqJ,cAAcjoE,OAAM,WAClBkpD,WAAWtrD,QAAQ/2F,OAAO+W,SAASE,UACrC,IA0BA,MAAO,CACL+8E,KAtBS,WACTmtE,kBAAkBx2D,YAAY2vB,WAAWrmC,MACzCmtE,cAAcz2D,YAAY2vB,WAAWrmC,KACvC,EAoBEA,KA3BS,WACTktE,kBAAkB52D,SAAS+vB,WAAWrmC,MACtCmtE,cAAc72D,SAAS+vB,WAAWrmC,KACpC,EAyBEotE,sBApB0B,WAC1BF,kBAAkB52D,SAAS+vB,WAAWh5C,UAAU8C,KAAK,iBAAiB,EACxE,EAmBEwrE,qBAlByB,WACzBuR,kBAAkBx2D,YAAY2vB,WAAWh5C,UAAU8C,KAAK,iBAAiB,EAC3E,EAiBEk9E,kBAhBsB,WACtBF,cAAc72D,SAAS+vB,WAAWh5C,UAAU8C,KAAK,iBAAiB,EACpE,EAeEyrE,iBAdqB,WACrBuR,cAAcz2D,YAAY2vB,WAAWh5C,UAAU8C,KAAK,iBAAiB,EACvE,EAaE+sD,QAZY,WACZkR,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASymJ,qBACxC5b,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQymJ,oBACvC7b,WAAW/uH,KAAK,uBAAuB4oE,KAAK,GAC9C,EAUF,EAmBIqlE,4BAdY,SAAiBxxJ,IAAKD,OACpC,IACExU,OAAOkmK,aAAaC,QAAQ1xJ,IAAKD,MACnC,CAAE,MAAOtT,GAET,CACF,EAQI+kK,4BAPY,SAAiBxxJ,KAC/B,IACE,OAAOzU,OAAOkmK,aAAaE,QAAQ3xJ,IACrC,CAAE,MAAOvT,GACP,OAAO,IACT,CACF,EA+BImlK,cAAgBhpF,oBAAoBF,gBAAgB5J,kBAAkBuC,iBA2StEwwF,2BAxRoB,SAA2Bvf,WAAYlO,cAC7D,IAbI0tB,kBAaAC,mBAAoB,EACpBC,0BAA2B,EAC3BC,cAdAH,OADAA,kBAAoBN,4BAhBH,aAiBiDM,kBAXtC,EAJP,GAkBjBA,kBAYJI,aAAeV,4BA/BC,SAgChBW,sBAAwB,EACxBxN,QAAUxd,8CAA8C8qB,eACxDG,oBAAsB9f,WAAW/uH,KAAK,oBACtC8uI,2BAA6B/f,WAAW/uH,KAAK,qBAC7C+uI,6BAA+BhgB,WAAW/uH,KAAK,uBAC/CgvI,kBAAoBjgB,WAAW/uH,KAAK,mBACxCgvI,kBAAkBpmE,KAAKw4D,SACvB,IAAI6N,wBAA0BD,kBAAkBhvI,KAAK,4BACjDkvI,eAAiBF,kBAAkBhvI,KAAK,kBACxCmvI,oBAAsBH,kBAAkBhvI,KAAK,wBAC7CovI,gBAAkBJ,kBAAkBhvI,KAAK,WACzCqvI,eAAiBX,cACjBY,cAAiC,SAAjBX,aAChBY,mBAAqBF,eACrBG,eAAgB,GAChB7pD,WAAWK,SAAWL,WAAWa,eACnC4oD,gBAAgBh8J,SAChB67J,wBAAwB77J,UAE1B,IAAIq8J,iBAAmB,SAA0BvmK,IAC3CuoB,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASX,UAAYjtI,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAAST,aAC1F11J,EAAEiG,gBAEN,EACIugK,aAAe,SAAsBxmK,GACvCA,EAAEiG,iBACEsiB,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASX,UACxCiR,eAAeJ,mBAhDU,IAiDzBK,mCAAmCL,oBACnCrW,UAAUqW,qBACD99I,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAAST,aAC/C+Q,eAAeJ,mBApDU,IAqDzBK,mCAAmCL,oBACnCrW,UAAUqW,oBAEd,EACIM,sBAAwB,SAA+BC,iBAGzD,OADAA,iBADAA,gBAAkBA,gBAjEY,IAiEkEA,iBAhElE,IAiEkEA,eAElG,EACIH,eAAiB,SAAwBI,wBAC3CA,sBAAwBF,sBAAsBE,wBAtEhB,IA0E5BR,mBAAqBQ,sBAEzB,EACIC,yBAA2B,SAAkC9mK,GAC/DA,EAAEiG,iBACFkvJ,oCAAoC4Q,yBACpC,IAAIgB,uBAAyBd,oBAAoBr6I,SAAS+7E,KACtDq/D,mBAAqBX,mBAQrBY,kBAAoB,SAA2B9pE,OAEjD6pE,mBAAqBL,uBADFxpE,MAAQ4pE,wBArFR,GAuFrB,EACIG,YAAc,SAAqB9vD,KACrCA,IAAInxG,iBACJghK,kBAAkB7vD,IAAIja,MACxB,EAQAr+F,OAAOmB,SAAS2F,iBAAiB,YAAashK,aAAa,GAC3DpoK,OAAOmB,SAAS2F,iBAAiB,WARjB,SAASuhK,UAAU/vD,KACjCA,IAAInxG,iBACJqgK,eAAgB,EAChBG,eAAeO,oBACfloK,OAAOmB,SAAS6F,oBAAoB,YAAaohK,aAAa,GAC9DpoK,OAAOmB,SAAS6F,oBAAoB,UAAWqhK,WAAW,EAC5D,IAEuD,GACvDF,kBAAkBjnK,EAAEm9F,OACpBmpE,eAAgB,EAChBxnK,OAAOuI,uBA1B4B,SAAS+/J,+BAC1CV,mCAAmCM,oBACnChX,UAAUgX,oBACNV,eACFxnK,OAAOuI,sBAAsB+/J,6BAEjC,GAqBF,EACIV,mCAAqC,SAA4CW,iBACnF,IAAIC,gBAhHgB,IAgHED,gBAClBE,yBAA2B,QAAUD,gBAAV,WAC3BE,yBAA2BF,gBAAkB,IACjDtB,eAAervE,IAAI,OAAQ4wE,0BAC3BtB,oBAAoBtvE,IAAI,QAAS6wE,yBACnC,EACIC,iBAAmB,WACrB1B,wBAAwB53D,YAAY2vB,WAAWQ,oBAC/CgnC,mBAAoB,EACpBoC,yBACF,EACIA,wBAA0B,WAC5B,IAEIC,4BAFgB/B,2BAA2B7kK,QAAU8kK,6BAA6B9kK,SAClB,IAApCglK,wBAAwBhlK,QAvHnC,GAuHwE,IACd4kK,oBAAoB5kK,QAC/FwkK,2BAA6BoC,4BAC/BC,gCAA+B,IACrBrC,0BAA4BoC,6BACtCC,gCAA+B,EAEnC,EACIA,+BAAiC,SAAwCC,UACvEA,UACFhC,6BAA6B93D,SAAS+vB,WAAWS,uBACjDgnC,0BAA2B,IAE3BM,6BAA6B13D,YAAY2vB,WAAWS,uBACpDgnC,0BAA2B,EAE/B,EAMIuC,iBAAmB,WACrBxC,mBAAoB,GACU,IAA1BI,uBACFp0J,aAAao0J,sBACbA,sBAAwB,GAE1BkC,gCAA+B,GAC/B7B,wBAAwBh4D,SAAS+vB,WAAWQ,mBAC9C,EACIypC,SAAW,WACb,IAAIC,YAAcrwB,aAAahC,MAAQ,EAAItnI,KAAK8kC,MA7J5B,IA6JkCwkG,aAAajC,QACnEswB,eAAep+E,KAAK,gBAAiBogF,aACrChC,eAAep+E,KAAK,iBAAkBogF,YAAc,KAAO7C,eAC3De,gBAAgBt+E,KAAK,iBAAkB+vD,aAAahC,OACpDqwB,eAAep+E,KAAK,CAClBt0E,MAAO00J,cAET9B,gBAAgB/3D,YAAY2vB,WAAWc,uBACvCsnC,gBAAgB/3D,YAAY2vB,WAAWa,yBACvCunC,gBAAgB/3D,YAAY2vB,WAAWY,sBACvCwnC,gBAAgB/3D,YAAY2vB,WAAWW,wBAtKT,IAuK1BupC,YACF9B,gBAAgBn4D,SAAS+vB,WAAWW,wBAC3BkZ,aAAajC,OAjKe,GAkKrCwwB,gBAAgBn4D,SAAS+vB,WAAWc,uBAC3B+Y,aAAajC,OAlKiB,GAmKvCwwB,gBAAgBn4D,SAAS+vB,WAAWa,yBAEpCunC,gBAAgBn4D,SAAS+vB,WAAWY,qBAExC,EACIupC,SAAW,SAAkBtyB,OAC/BgC,aAAahC,MAAQA,MACrBovB,4BAvLkB,QAuL2BpvB,MAC/C,EACIqa,UAAY,SAAmBkY,oBArLH,KAsL9BA,mBAAqBvB,sBAAsBuB,qBAEzCD,UAAS,IAETA,UAAS,GACTlD,4BAhMiB,SAgM6BmD,oBAC9CvwB,aAAajC,OAASwyB,mBAE1B,EACIC,uBAAyB,SAAgCv7D,UAC7B,IAA1B84D,sBACFp0J,aAAao0J,sBAEfA,qBAAuBr0J,YAAW,WAChCy2J,mBACApC,sBAAwB,CAC1B,GAAG94D,QACL,EACIw7D,qBAAuB,YACK,IAA1B1C,uBACFp0J,aAAao0J,sBACbA,sBAAwB,GAE1B+B,kBACF,EACIY,sBAAwB,SAA+BroK,GACvC,IAAdA,EAAES,SACJ0nK,uBA/M6B,IAiNjC,EACIG,2BAA6B,WAC/BH,uBAlN+B,IAmNjC,EACII,oBAAsB,WACxBN,UAAUtwB,aAAahC,OACnBgC,aAAahC,MACf+wB,mCAAmC,IAEnCA,mCAAmCL,oBACnCrW,UAAUqW,oBAEd,EACIn8C,gBAAkB,WACpBg8C,gBAAgBt+E,KAAK,WAAYwC,SAASsvD,UAC1CssB,eAAep+E,KAAK,WAAYwC,SAASsvD,SAC3C,EACImf,eAAiB,WACnBqN,gBAAgBt+E,KAAK,WAAYwC,SAASuvD,UAC1CqsB,eAAep+E,KAAK,WAAYwC,SAASuvD,SAC3C,EAOI6uB,SAAW,WACTlD,mBACFoC,yBAEJ,EACIe,oBAAsB,WACnBnC,gBACHG,eAAe9uB,aAAajC,QAvPV,IAwPdiC,aAAajC,QAAiCiC,aAAahC,OAC7DsyB,UAAS,IAGbF,UACF,EAkCA,OAhCEjC,kBAAkBpnE,GAAG,YAAa0pE,sBAClCtC,kBAAkBpnE,GAAG,WAAY2pE,uBACjCtC,wBAAwBrnE,GAAG,YAAaooE,0BACxCZ,gBAAgBxnE,GAAG,QAAS6pE,qBAC5BvC,eAAetnE,GAAG,QAAS+oE,kBAC3BzB,eAAetnE,GAAG,WAAY4pE,4BAC9BtC,eAAetnE,GAAG,UAAW6nE,kBAC7BP,eAAetnE,GAAG,QAAS8nE,cAC3BR,eAAep+E,KAAK,WAAYwC,SAASuvD,UACzCqsB,eAAep+E,KAAK,gBAxQA,GAyQpBo+E,eAAep+E,KAAK,gBAxQA,KAyQpBo+E,eAAep+E,KAAK,OAAQ,UAC5B+vD,aAAa/xI,iBAAiB,eAAgB6iK,qBAC9C5iB,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASkvG,iBACvC27B,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQ49I,gBACtChT,WAAWnnD,GAAGl7F,OAAO+W,SAAS9B,aAAc+vJ,UAnC5CxY,UAAUmW,gBACV8B,SAAS7B,eACT2B,WACArB,mCAAmC/uB,aAAahC,MA5OlB,EA4OwDwwB,gBAiDjF/mK,OAAOsX,iBAAiB,CAC7BgyJ,aAjJiB,YACa,IAA1BhD,sBACFoC,kBAEJ,EA8IEnzB,QAjBY,WACZmxB,kBAAkB/rE,IAAI,YAAaquE,sBACnCtC,kBAAkB/rE,IAAI,WAAYsuE,uBAClCtC,wBAAwBhsE,IAAI,YAAa+sE,0BACzCZ,gBAAgBnsE,IAAI,QAASwuE,qBAC7BvC,eAAejsE,IAAI,QAAS0tE,kBAC5BzB,eAAejsE,IAAI,WAAYuuE,4BAC/BtC,eAAejsE,IAAI,UAAWwsE,kBAC9BP,eAAejsE,IAAI,QAASysE,cAC5B7uB,aAAa7xI,oBAAoB,eAAgB2iK,qBACjD5iB,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASkvG,iBACxC27B,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQ49I,eACzC,GAMG,CACDnjB,OAAQ,CACNtzI,IAAK,WACH,OAAOu1I,aAAajC,MACtB,EACA3zI,IAAKiuJ,WAEPra,MAAO,CACLvzI,IAAK,WACH,OAAOu1I,aAAahC,KACtB,EACA5zI,IAAKkmK,WAGX,EAgFIU,qCA5D8B,SAAqC9iB,YACrE,IACI+iB,yBACAC,wBAEE3Q,QAJF4Q,0BAA2B,EAqB3BC,cAAgB,SAAuB/oK,GACzCA,EAAEiG,iBACF4/I,WAAWtrD,QAAQ/2F,OAAO6d,iBAAiBP,QAAS,CAClDkoJ,yBAA0BF,0BAE9B,EACIG,yBAA2B,SAAkCjpK,EAAGkpK,WAlBrC,IAAkCF,gDAmBtCE,UAAUF,yBAlBnCF,yBAA2BE,0BAEzBJ,yBAAyBhhF,KAAK,gBAAgB,GAC9CihF,wBAAwB16D,YAAY2vB,WAAWsB,6BAA6BrxB,SAAS+vB,WAAWuB,mCAChGupC,yBAAyBz6D,YAAY2vB,WAAWgC,gBAAgB/xB,SAAS+vB,WAAWiC,wBAEpF6oC,yBAAyBhhF,KAAK,gBAAgB,GAC9CihF,wBAAwB16D,YAAY2vB,WAAWuB,mCAAmCtxB,SAAS+vB,WAAWsB,6BACtGwpC,yBAAyBz6D,YAAY2vB,WAAWiC,sBAAsBhyB,SAAS+vB,WAAWgC,gBAW9F,EACIqpC,6BAA+B,WACjCP,yBAAyBhhF,KAAK,YAAY,EAC5C,EACIwhF,eAAiB,WACnBR,yBAAyBhhF,KAAK,WAAYwC,SAASsvD,SACrD,EACI2vB,cAAgB,WAClBT,yBAAyBhhF,KAAK,WAAYwC,SAASuvD,SACrD,EAiBA,OAnDMue,QAAUxd,yDACdmL,WAAW/uH,KAAK,sCAAsC4oE,KAAKw4D,SAC3D0Q,yBAA2B/iB,WAAW/uH,KAAK,6BAC3C+xI,wBAA0BhjB,WAAW/uH,KAAK,mCAiC1C8xI,yBAAyBlqE,GAAG,QAASqqE,eACrCljB,WAAWnnD,GAAGl7F,OAAO6d,iBAAiBC,OAAQ6nJ,8BAC9CtjB,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASouJ,gBACvCvjB,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQouJ,eACtCxjB,WAAWnnD,GAAGl7F,OAAO6d,iBAAiBP,QAASmoJ,0BAW1C7pK,OAAOsX,iBAAiB,CAC7Bi+H,QAVY,WACZkR,WAAW9rD,IAAIv2F,OAAO6d,iBAAiBC,OAAQ6nJ,8BAC/CtjB,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASouJ,gBACxCvjB,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQouJ,eACvCxjB,WAAW9rD,IAAIv2F,OAAO6d,iBAAiBP,QAASmoJ,0BAChDL,yBAAyB7uE,IAAI,QAASgvE,cACxC,GAKG,CAAC,EACN,EAiGIO,6BA9EsB,SAA6BzjB,YACrD,IACI0jB,sBACAC,qBAFAvoD,kBAAmB,EAGnBwoD,mBAAqB3rC,WAAWwB,yBAChCoqC,mBAAqB5rC,WAAW0B,+BAChCrjD,oBAAoBC,gBAAkB73D,cAAcC,UACtDilJ,mBAAqB3rC,WAAWyB,mCAChCmqC,mBAAqB5rC,WAAW2B,0CAElC,IACMy4B,QAiBF6Q,cAAgB,SAAuB/oK,GACzCA,EAAEiG,iBACF4/I,WAAWtrD,QAAQ/2F,OAAOmd,SAASC,QAAS,CAC1C4nG,iBAAkBvH,iBAClB0oD,gBAAgB,GAEpB,EACIC,iBAAmB,SAA0B5pK,EAAGkpK,WAnB9B,IAAyB1gD,gCAoB7B0gD,UAAU1gD,iBAnB1BvH,iBAAmBuH,kBAEjB+gD,sBAAsB3hF,KAAK,gBAAgB,GAC3C4hF,qBAAqBr7D,YAAYs7D,oBAAoB17D,SAAS27D,oBAC9DH,sBAAsBp7D,YAAY2vB,WAAWgC,gBAAgB/xB,SAAS+vB,WAAWiC,wBAEjFwpC,sBAAsB3hF,KAAK,gBAAgB,GAC3C4hF,qBAAqBr7D,YAAYu7D,oBAAoB37D,SAAS07D,oBAC9DF,sBAAsBp7D,YAAY2vB,WAAWiC,sBAAsBhyB,SAAS+vB,WAAWgC,gBAY3F,EACIspC,eAAiB,WACnBG,sBAAsB3hF,KAAK,WAAYwC,SAASsvD,SAClD,EACI2vB,cAAgB,WAClBE,sBAAsB3hF,KAAK,WAAYwC,SAASuvD,SAClD,EACIkwB,iBAAmB,SAA0B7pK,EAAGkpK,WAClDrjB,WAAWtrD,QAAQ/2F,OAAOmd,SAASC,QAAS,CAC1C4nG,gBAAiB0gD,UAAU1gD,gBAC3BmhD,gBAAgB,GAEpB,EAwBA,OA9DMzR,QAAUxd,iDACdmL,WAAW/uH,KAAK,oBAAoB4oE,KAAKw4D,SACzCqR,sBAAwB1jB,WAAW/uH,KAAK,0BACxC0yI,qBAAuB3jB,WAAW/uH,KAAK,gCAqCvCyyI,sBAAsB7qE,GAAG,QAASqqE,eAClCljB,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASouJ,gBACvCvjB,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQouJ,eACtCxjB,WAAWnnD,GAAGl7F,OAAOmd,SAASE,YAAagpJ,kBAC3ChkB,WAAWnnD,GAAGl7F,OAAOmd,SAASC,QAASgpJ,kBAkBlCxqK,OAAOsX,iBAAiB,CAC7BozJ,wBAjB4B,SAAiCC,sBACzDA,qBACFR,sBAAsBp7D,YAAY2vB,WAAWrmC,MAE7C8xE,sBAAsBx7D,SAAS+vB,WAAWrmC,KAE9C,EAYEk9C,QAXY,WACZkR,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASouJ,gBACxCvjB,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQouJ,eACvCxjB,WAAW9rD,IAAIv2F,OAAOmd,SAASE,YAAagpJ,kBAC5CN,sBAAsBxvE,IAAI,QAASgvE,eACnCljB,WAAW9rD,IAAIv2F,OAAOmd,SAASC,QAASgpJ,iBAC1C,GAMG,CAAC,EACN,EAaII,iBAAkB,EAUlBC,gCAToB,WACtB,OAAOD,eACT,EAOIC,6BANiB,WACnBD,iBAAkB,CACpB,EAIIC,4BAHgB,WAClBD,iBAAkB,CACpB,EAuHIE,wBAvGiB,SAAwBrkB,WAAYvzB,qBACvD,IACI63C,YACAC,WAGEC,gBALFC,eAAgB,EAGhBjP,WAAapgD,0BAebsvD,mBAAqB,SAA4BC,aACnDF,cAAgBE,aAEdL,YAAYviF,KAAK,iBAAiB,GAClCuiF,YAAYh8D,YAAY2vB,WAAWgC,gBAAgB/xB,SAAS+vB,WAAWiC,sBAEjEtjB,WAAWM,QAAUuV,oBAAoB1J,qBAC7CwhD,WAAWr8D,SAAS+vB,WAAW6B,wBAGjCyqC,WAAWj8D,YAAY2vB,WAAW6B,sBAClCwqC,YAAYviF,KAAK,iBAAiB,GAClCuiF,YAAYh8D,YAAY2vB,WAAWiC,sBAAsBhyB,SAAS+vB,WAAWgC,iBAE/E+lB,WAAWtrD,QAAQ/2F,OAAO+W,SAASyB,kBAAmB,CACpDwuJ,WAAYF,eAEhB,EAIIvB,cAAgB,SAAuB/oK,GACzCA,EAAEiG,iBACFskK,oBAAoBD,cACtB,EACI/D,iBAAmB,SAA0BvmK,GAI/C,IArCiDu/I,UAC7C8hB,wBACAC,mBAgCC2I,oCAGqBjqK,EAAEuF,QAAUvF,EAAEuF,OAAOklK,WAAazqK,EAAEuF,OAAOklK,UAAUzmK,SAAS,qBAIpFukB,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASP,kBACpCuU,YAAYviF,KAAK,cAAgBwC,SAASsvD,WACxCywB,YAAYzlI,GAAG,WA3C0B66G,UA4CzB+qB,cAAgBnuF,oBAAoBF,gBAAgB5J,kBAAkByH,uBAAyBqC,oBAAoBF,gBAAgB5J,kBAAkBwH,0BA3CzKwnF,wBAA0B3mB,kDAAkD6E,WAC5E+hB,mBAAqBpnD,EAAEmnD,yBAC3Bxb,WAAWxlD,OAAOihE,oBAClBjG,WAAWhqJ,YAAW,WACpBiwJ,mBAAmBp3J,QACrB,GA1BkC,MAkE5BigK,YAAYpgF,QAEdwgF,oBAAoBD,gBAG1B,EACIlB,eAAiB,WACnBe,YAAYviF,KAAK,WAAYwC,SAASsvD,SACxC,EACI2vB,cAAgB,WAClBc,YAAYviF,KAAK,WAAYwC,SAASuvD,SACxC,EACI+wB,UAAY,WACdH,oBAAmB,EACrB,EACII,UAAY,WACdJ,oBAAmB,EACrB,EACIK,eAAiB,WACnBT,YAAYpgF,OACd,EAsBA,OA7FMsgF,gBAAkB3vB,4CACtBmL,WAAW/uH,KAAK,uBAAuB4oE,KAAK2qE,iBAC5CF,YAActkB,WAAW/uH,KAAK,eAC9BszI,WAAavkB,WAAW/uH,KAAK,qBAsE7BqzI,YAAYzrE,GAAG,QAASqqE,eACxBljB,WAAWnnD,GAAG,UAAW6nE,kBACzB1gB,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASouJ,gBACvCvjB,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQouJ,eACtCxjB,WAAWnnD,GAAGl7F,OAAO+W,SAAS0B,eAAgB2uJ,gBAC9C/kB,WAAWnnD,GAAGl7F,OAAO+W,SAASO,QAAS4vJ,WACvC7kB,WAAWnnD,GAAGl7F,OAAO+W,SAASM,QAAS8vJ,WA/CvCJ,mBAAmBD,eA6DdlrK,OAAOsX,iBAAiB,CAC7Bi+H,QAbY,WACZw1B,YAAYpwE,IAAI,QAASgvE,eACzBljB,WAAW9rD,IAAI,UAAWwsE,kBAC1B1gB,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASouJ,gBACxCvjB,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQouJ,eACvCxjB,WAAW9rD,IAAIv2F,OAAO+W,SAAS0B,eAAgB2uJ,gBAC/C/kB,WAAW9rD,IAAIv2F,OAAO+W,SAASO,QAAS4vJ,WACxC7kB,WAAW9rD,IAAIv2F,OAAO+W,SAASM,QAAS8vJ,UAC1C,GAMG,CAAC,EACN,EAgBIE,+BAAiC,CAAC,IAAM,GAAK,IAAM,EAAG,KAAM,IAAK,KAAM,GAkVvEC,4BAxUqB,SAA4BjlB,WAAYlO,aAAcn+G,IAAKqpH,cAAe5zB,0BACjG,IAAI87C,SAAU,EACVC,qBAbqB,EAcrBC,wBAA0BpoB,eAAiBgoB,+BAC3CK,iBAAmBD,wBAAwB,GAC3CE,iBAAmBF,wBAAwBA,wBAAwBzqK,OAAS,GAChFm3I,aAAa/B,aAAeo1B,qBAC5BrzB,aAAayzB,oBAAsBJ,qBACnC,IAwCIK,yBAA2B3wB,2CAAyClhH,KAAMA,IAAIs6G,6BAxC3D,WAGrB,IAFA,IAAIw3B,kCAAoCnvF,oBAAoBF,gBAAgB5J,kBAAkBmD,uBAC1FgtE,kBAAoB,GACfviE,EAAIgrF,wBAAwBzqK,OAAS,EAAGy/E,GAAK,EAAGA,IAAK,CAC5D,IAAIsrF,KAAON,wBAAwBhrF,GACnCuiE,kBAAkB9+I,KAAK,CACrB0/I,UAAWmoB,KACXloB,UAAWioB,kCAAkCC,MAC7ChhF,SA3BmB,IA2BTghF,MAEd,CACA,OAAO/oB,iBACT,CA4BwHgpB,GAAoBhyI,IA3B5G,WAC9B,IAAIipH,eAAiB,GACjBgpB,2BAA6BjyI,IAAIykC,kBAAkBxQ,8BACnDg+G,2BAA2Bh7J,aAAe63B,oBAAoBG,YAAqB,UACrFgjI,2BAA6B1sI,4BAA4Bo9C,oBAAoBC,gBAE/E,IAAIsvF,sCAAuC,EAmB3C,OAlBAlyI,IAAIykC,kBAAkBvrB,wBAAwBhxC,SAAQ,SAAU8mC,0BAC9D,IAAIxJ,mBAAqBD,4BAA4ByJ,0BACjD06G,cAAgB/mE,oBAAoBE,oCAAoC7zC,0BACxEmjI,yBAA2B3sI,mBAAmBzZ,WAAakmJ,2BAA2BlmJ,SACtFomJ,2BACFD,sCAAuC,GAEzCjpB,eAAe/+I,KAAK,CAClBu/I,cAAez6G,yBACf06G,cACA34D,SAAUohF,0BAEd,IACID,qCACFlyI,IAAIykC,kBAAkB1Q,4BAA4Bk+G,2BAA2Bh7J,YAE7E+oB,IAAIykC,kBAAkB1Q,4BAA4BjlB,oBAAoBG,YAAqB,SAEtFg6G,cACT,CACkJmpB,GAA8B,GAAIpyI,KAAOA,IAAIo5G,gBAAiB3jB,0BAC5M48C,wBAA0BhmB,WAAW/uH,KAAK,4BAC9C+0I,wBAAwBnsE,KAAK2rE,0BAC7B,IAAIS,uBAAyBjmB,WAAW/uH,KAAK,8BACzCi1I,uBAAyBD,uBAAuBh1I,KAAK,wBACrDk1I,qBAAuBF,uBAAuBh1I,KAAK,uBACnDm1I,uBAAyBpmB,WAAW/uH,KAAK,oBACzCo1I,4BAA8BrmB,WAAW/uH,KAAK,0BAC9Cq1I,+BAAiCtmB,WAAW/uH,KAAK,2BACjDs1I,sBAAwBN,uBAAuBh1I,KAAK,cACpDu1I,6BAA+BD,sBAAsB,GACrDE,yBAA2BR,uBAAuBh1I,KAAK,cACvDy1I,gCAAkCD,yBAAyB,GAC3DE,sBAAwBV,uBAAuBh1I,KAAK,0BACpD21I,0BAA4BX,uBAAuBh1I,KAAK,6BACvDw7F,oBAAoBF,yBACvBy5C,wBAAwB/0I,KAAK,iCAAiC2gE,OAEhE,IAoLMi1E,mCApLFxmB,SAAW,WACb6kB,SAAU,EACVllB,WAAWtrD,QAAQ/2F,OAAO+W,SAASjC,qBACnCwzJ,uBAAuBr0E,OACvBw0E,uBAAuBrkF,KAAK,iBAAiB,GAC7CqkF,uBAAuB99D,YAAY2vB,WAAWiC,sBAAsBhyB,SAAS+vB,WAAWgC,gBACxFosC,4BAA4B/9D,YAAY2vB,WAAW+B,2BAA2B9xB,SAAS+vB,WAAW8B,qBAClG+sC,qBACAzV,WAAWD,iBACb,EACI9Q,SAAW,WACb4kB,SAAU,EACVllB,WAAWtrD,QAAQ/2F,OAAO+W,SAASlC,oBACnCyzJ,uBAAuBt0E,OACvBy0E,uBAAuBrkF,KAAK,iBAAiB,GAC7CqkF,uBAAuB99D,YAAY2vB,WAAWgC,gBAAgB/xB,SAAS+vB,WAAWiC,sBAClFmsC,4BAA4B/9D,YAAY2vB,WAAW8B,qBAAqB7xB,SAAS+vB,WAAW+B,2BAC5F+sC,kBACAC,sBACF,EAIIA,qBAAuB,WAF2B,SAA7CJ,0BAA0B91E,IAAI,YAInCugE,WAAWC,UAAU2U,uBAEzB,EACIc,gBAAkB,WACpB/mB,WAAW92I,QAAQ+9J,+BACrB,EACIH,mBAAqB,WACvB9mB,WAAW9rD,IAAI,UAAW+yE,+BAC5B,EACIA,+BAAiC,SAAwC9sK,GACtE+qK,UAGAe,uBAAuBpnI,GAAG1kC,EAAEuF,SAA2D,IAAhDumK,uBAAuB3pK,IAAInC,EAAEuF,QAAQ/E,QAE/E6Q,YAAW,WACT60I,UACF,GAAG,IAEP,EAaI4J,gBAAkB,SAAyBid,eACxCA,cAEMA,cAAgB7B,iBACzB6B,cAAgB7B,iBACP6B,cAAgB5B,mBACzB4B,cAAgB5B,kBAJhB4B,cAxIqB,EA8IvB/B,qBAAuB+B,cACvBp1B,aAAa/B,aAAem3B,cAC5Bp1B,aAAayzB,oBAAsB2B,cACnChI,4BAlJmC,8BAkJ2BgI,cAAcxlJ,YAGxEk1F,WAAWK,UAAY66B,aAAalC,SACtCkC,aAAa5jF,QACb4jF,aAAa/C,OAEjB,EACIo4B,4BAA8B,WAChC,IAAID,cAAgBrhI,OAAOqgI,uBAAuBj1I,KAAK,aAAayT,OACpEulH,gBAAgBid,cAClB,EACIE,0BAA4B,WAC9B,IAAIC,eAAiBlB,qBAAqBl1I,KAAK,aAAayT,MAC5D/Q,IAAIykC,kBAAkB1Q,4BAA4B2/G,gBAClDrnB,WAAWtrD,QAAQ/2F,OAAOmd,SAASI,gBACrC,EACIosJ,+BAAiC,WACnC,IAAI7iF,QAAUiiF,gCAAgCjiF,QAC9Cu7D,WAAWtrD,QAAQ/2F,OAAO6d,iBAAiBP,QAAS,CAClDkoJ,wBAAyB1+E,SAE7B,EACI2+E,yBAA2B,SAAkCjpK,EAAGkpK,WAC9DA,UAAUF,wBACZuD,gCAAgCjiF,SAAU,EAE1CiiF,gCAAgCjiF,SAAU,CAE9C,EACI8iF,4BAA8B,WAChC,IAAI9iF,QAAU+hF,6BAA6B/hF,QAC3Cu7D,WAAWtrD,QAAQ/2F,OAAOmd,SAASC,QAAS,CAC1C4nG,gBAAiBl+B,QACjBq/E,gBAAgB,GAEpB,EACI0D,kBAAoB,SAA2BrtK,EAAGkpK,WAChDmD,+BACEnD,UAAU1gD,gBACZ6jD,6BAA6B/hF,SAAU,EAEvC+hF,6BAA6B/hF,SAAU,EAG7C,EACIgjF,0BAA4B,WArEoB,IAC9CC,mCAAmB51B,aAAa/B,gBACXlqG,OAAOqgI,uBAAuBj1I,KAAK,aAAayT,SACnEgjI,iBAAmBpC,iBACrBrb,gBAAgBqb,kBACPoC,iBAAmBrC,iBAC5Bpb,gBAAgBob,kBAEhBa,uBAAuBj1I,KAAK,+BAAiC6gH,aAAa/B,aAAe,MAAM/gD,KAAK,YAAY,GA+DtH,EAmBI24E,mBAAqB,SAA4BxtK,GAlBzB,IACtBytK,mBAkBCxD,oCAGD1hJ,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASX,UAAYx1J,EAAEuS,UACtDvS,EAAEiG,kBArBwB,KADxBwnK,mBAAqBxC,wBAAwB32J,QAAQ02J,wBAIrDyC,mBAAqB,EAAIxC,wBAAwBzqK,QACnDsvJ,gBAAgBmb,wBAAwBwC,mBAAqB,KAmBpDllJ,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAAST,YAAc11J,EAAEuS,UAC/DvS,EAAEiG,iBAjBsB,WAC1B,IAAIwnK,mBAAqBxC,wBAAwB32J,QAAQ02J,uBAC7B,IAAxByC,oBAGAA,mBAAqB,GACvB3d,gBAAgBmb,wBAAwBwC,mBAAqB,GAEjE,CAUIC,IACSnlJ,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAAS3xE,SAC3CumF,WACEgB,uBAAuBrnI,GAAG,WAAasnI,qBAAqBtnI,GAAG,YACjEunI,uBAAuBliF,QAEzBm8D,YAGN,EACI7rD,gBAAkB,SAAyBr6F,GAC7CA,EAAEq6F,iBACJ,EACI+uE,eAAiB,WACnB6C,uBAAuBrkF,KAAK,WAAYwC,SAASsvD,SACnD,EACI2vB,cAAgB,WAClB4C,uBAAuBrkF,KAAK,WAAYwC,SAASuvD,SACnD,EACIg0B,4BAA8B,SAAqC3tK,GACrEA,EAAEiG,iBACE8kK,QACF7kB,YAEAC,WACAgP,gDAAgD4W,uBAAwB/rK,GAE5E,EACI4tK,wBAA0B,SAAiC5tK,EAAGkpK,WAC5DA,UAAU2E,sBACZ1B,+BAA+Bh+D,YAAY2vB,WAAWrmC,MAEtD00E,+BAA+Bp+D,SAAS+vB,WAAWrmC,KAEvD,EA0DIpiB,MAAQ,WACN01F,SACF7kB,UAEJ,EAIA,OAhEMwmB,mCAAqC3H,4BAlQN,iCAoQjCjV,iBAAiB4c,oCAInBX,uBAAuBrtE,GAAG,QAASrE,iBACnC0xE,uBAAuBrtE,GAAG,UAAWrE,iBACrC0xE,uBAAuBrtE,GAAG,SAAUsuE,6BACpChB,qBAAqBttE,GAAG,QAASrE,iBACjC2xE,qBAAqBttE,GAAG,UAAWrE,iBACnC2xE,qBAAqBttE,GAAG,SAAUuuE,2BAClChB,uBAAuBvtE,GAAG,QAASivE,6BACnCnB,sBAAsB9tE,GAAG,QAASrpB,OAClCi3F,yBAAyB5tE,GAAG,SAAUyuE,gCACtCf,sBAAsB1tE,GAAG,SAAU0uE,6BAC/Bz1B,aAAa/xI,iBACf+xI,aAAa/xI,iBAAiB,aAAc0nK,2BAA2B,GAC9D31B,aAAaj5C,IACtBi5C,aAAaj5C,GAAG,aAAc4uE,2BAEhCznB,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASouJ,gBACvCvjB,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQouJ,eACtCxjB,WAAWnnD,GAAG,UAAW8uE,oBACzB3nB,WAAWnnD,GAAGl7F,OAAO6d,iBAAiBP,QAASmoJ,0BAC/CpjB,WAAWnnD,GAAGl7F,OAAOmd,SAASC,QAASysJ,mBACvCxnB,WAAWnnD,GAAGl7F,OAAO+W,SAASuB,sBAAuB8xJ,yBAqCvD1nB,WACO9mJ,OAAOsX,iBAAiB,CAC7B2/F,KAdS,WACJ00D,SACH5kB,UAEJ,EAWE9wE,MACAs/D,QAvCY,WACZo3B,uBAAuBhyE,IAAI,QAASM,iBACpC0xE,uBAAuBhyE,IAAI,UAAWM,iBACtC0xE,uBAAuBhyE,IAAI,SAAUizE,6BACrChB,qBAAqBjyE,IAAI,QAASM,iBAClC2xE,qBAAqBjyE,IAAI,UAAWM,iBACpC2xE,qBAAqBjyE,IAAI,SAAUkzE,2BACnChB,uBAAuBlyE,IAAI,QAAS4zE,6BACpCnB,sBAAsBzyE,IAAI,QAAS1kB,OACnCi3F,yBAAyBvyE,IAAI,SAAUozE,gCACvCf,sBAAsBryE,IAAI,SAAUqzE,6BAChCz1B,aAAa7xI,oBACf6xI,aAAa7xI,oBAAoB,aAAcwnK,2BACtC31B,aAAa59C,KACtB49C,aAAa59C,IAAI,aAAcuzE,2BAEjCznB,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASouJ,gBACxCvjB,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQouJ,eACvCxjB,WAAW9rD,IAAI,UAAWyzE,oBAC1B3nB,WAAW9rD,IAAIv2F,OAAO6d,iBAAiBP,QAASmoJ,0BAChDpjB,WAAW9rD,IAAIv2F,OAAOmd,SAASC,QAASysJ,mBACxCxnB,WAAW9rD,IAAIv2F,OAAO+W,SAASuB,sBAAuB8xJ,wBACxD,GAkBG,CACDE,OAAQ,CACN1rK,IAAK,WACH,OAAO2oK,OACT,GAEFn1B,aAAc,CACZxzI,IAAK,WACH,OAAO4oK,oBACT,EACAjpK,IAAK+tJ,kBAGX,EA8BIrvE,KAAO,WAAiB,EAExBstF,kBAAoB3uK,OAAOsX,iBAAiB,CAC9CjS,MAAOg8E,KACPutF,KAAMvtF,KACNwtF,gBAAiBxtF,KACjBytF,kBAAmBztF,MAClB,CACD0tF,MAAO,CACL/rK,IAAK,WACH,OAAO,CACT,GAEFgsK,YAAa,CACXhsK,IAAK,WACH,OAAO,CACT,KAmDAisK,gCAtCyB,SAAgC12B,cAC3D,IAAI/5B,YAAcxC,8BAelB,OAAOh8G,OAAOsX,iBAAiB,CAC7BjS,MAfU,WACVkzI,aAAa22B,yBACf,EAcEN,KAbS,WACTpwD,YAAY2wD,sBACd,EAYEN,gBAXoB,SAAyBO,iBAC7C72B,aAAa/xI,iBAlBK,wBAkB6B4oK,iBAC/C72B,aAAa/xI,iBAlBK,wBAkB6B4oK,gBACjD,EASEN,kBARsB,SAA2BM,iBACjD72B,aAAa7xI,oBAtBK,wBAsBgC0oK,iBAClD72B,aAAa7xI,oBAtBK,wBAsBgC0oK,gBACpD,GAMG,CACDL,MAAO,CACL/rK,IAAK,WACH,OAAOu1I,eAAiB/5B,YAAY6wD,uBACtC,GAEFL,YAAa,CACXhsK,IAAK,WACH,OAAO,CACT,IAGN,EAKIisK,+CAJ0B,WAC5B,IAAIzwD,YAAcxC,8BAClB,MAAO,4BAA6BwC,aAAeA,YAAY8wD,uBACjE,EAiEIC,mCAlC4B,SAAmCh3B,cAajE,OAAOv4I,OAAOsX,iBAAiB,CAC7BjS,MAbU,WACVkzI,aAAai3B,0BAVK,qBAWpB,EAYEZ,KAXS,WACTr2B,aAAai3B,0BAdQ,SAevB,EAUEX,gBAToB,SAAyBO,iBAC7C72B,aAAa/xI,iBAlBmB,gCAkB6B4oK,gBAC/D,EAQEN,kBAPsB,SAA2BM,iBACjD72B,aAAa7xI,oBArBmB,gCAqBgC0oK,gBAClE,GAMG,CACDL,MAAO,CACL/rK,IAAK,WACH,MA7Bc,uBA6BPu1I,aAAak3B,sBACtB,GAEFT,YAAa,CACXhsK,IAAK,WACH,OAAO,CACT,IAGN,EAIIusK,kDAHwB,SAA+Bh3B,cACzD,OAAOA,cAAkE,mBAA3CA,aAAai3B,2BAAmG,mBAAhDj3B,aAAam3B,gCAAiDn3B,aAAam3B,+BAxCrJ,qBAyCtB,EA8BIC,sCARmB,SAA0Bp3B,cAC/C,OAAKrlB,oBAAoB9H,yBAA2B6jD,iDAC3CA,gCAAgC12B,eAC7BrlB,oBAAoB9H,yBAA2BmkD,kDAAkDh3B,cACpGg3B,mCAAmCh3B,cAErCo2B,iBACT,EAyEIiB,wBA7DiB,SAAwBnpB,WAAYlO,cACvD,IAAIs3B,YAAc,KACdC,kBAAoB,KACpBC,yBAA2B,WAC7BtpB,WAAWtrD,QAAQ/2F,OAAO+W,SAASa,WAAY,CAC7Cg0J,cAAeF,kBAAkBf,OAErC,EACIkB,kBAAoB,SAA2BrvK,GACjDA,EAAEiG,iBACFipK,kBAAkBzqK,OACpB,EACI6qK,8BAAgC,WAC9BJ,mBAAqBA,kBAAkBf,OACzCe,kBAAkBlB,MAEtB,EACI5E,eAAiB,WACnB6F,YAAYrnF,KAAK,WAAYwC,SAASsvD,SACxC,EACI2vB,cAAgB,WAClB4F,YAAYrnF,KAAK,WAAYwC,SAASuvD,SACxC,EAkCA,OAAOv6I,OAAOsX,iBAAiB,CAC7B64J,WAnBe,WAfA,IACXpzB,YACA+b,SAcJgX,kBAAoBH,sCAAsCp3B,eACpCy2B,cAhBlBjyB,YAAchgE,oBAAoBF,gBAAgB5J,kBAAkBmB,cACpE0kF,QAAUxd,2CAA2CyB,aACzD0J,WAAW/uH,KAAK,gBAAgB4oE,KAAKw4D,SACrC+W,YAAcppB,WAAW/uH,KAAK,eAG9Bo4I,kBAAkBjB,gBAAgBkB,0BAClCF,YAAYvwE,GAAG,QAAS2wE,mBACxBxpB,WAAWnnD,GAAGl7F,OAAOmZ,SAASC,OAAQ0yJ,+BACtCzpB,WAAWnnD,GAAGl7F,OAAOsb,SAASlC,OAAQ0yJ,+BACtCzpB,WAAWnnD,GAAGl7F,OAAOwZ,MAAMM,IAAKgyJ,+BAChCzpB,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASouJ,gBACvCvjB,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQouJ,eAQxC,EAcE10B,QAbY,WACRu6B,mBAAqBA,kBAAkBd,cACzCc,kBAAkBhB,kBAAkBiB,0BACpCF,YAAYl1E,IAAI,QAASs1E,mBACzBxpB,WAAW9rD,IAAIv2F,OAAOmZ,SAASC,OAAQ0yJ,+BACvCzpB,WAAW9rD,IAAIv2F,OAAOsb,SAASlC,OAAQ0yJ,+BACvCzpB,WAAW9rD,IAAIv2F,OAAOwZ,MAAMM,IAAKgyJ,+BACjCzpB,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASouJ,gBACxCvjB,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQouJ,eAE3C,GAIG,CAAC,EACN,EAcImG,aAAe,CACjBC,OAAQ,SACRC,QAAS,UACTC,WAAY,aACZC,iBAAkB,sBAyFhBC,gCA9EyB,SAAgChqB,YAC3D,IACIiqB,oBACAC,mBAkDE11I,OApDF21I,qBAAsB,EAGtB5G,eAAiB,WACnB0G,oBAAoBloF,KAAK,WAAYwC,SAASsvD,SAChD,EACI2vB,cAAgB,WAClByG,oBAAoBloF,KAAK,WAAYwC,SAASuvD,SAChD,EACIs2B,4BAA8B,WAChCpqB,WAAWtrD,QAAQ/2F,OAAO+W,SAASc,mBAAoB,CACrD60J,YAAaF,oBAAsBR,aAAaE,QAAUF,aAAaC,QAE3E,EACIU,eAAiB,SAAwB9lF,SAC3C2lF,oBAAsB3lF,QACtBw7D,WAAW9O,YAAYm5B,YAAcF,oBAAsBR,aAAaE,QAAUF,aAAaC,OAC/F1K,4BA1BiC,4BA0B2Blf,WAAW9O,YAAYm5B,aAC/EF,qBACFF,oBAAoBloF,KAAK,QAASzL,oBAAoBF,gBAAgB5J,kBAAkB8C,2BACxF26F,oBAAoBloF,KAAK,gBAAgB,GACzCmoF,mBAAmB5hE,YAAY2vB,WAAW2D,wBAAwB1zB,SAAS+vB,WAAW4D,8BACtFouC,oBAAoB3hE,YAAY2vB,WAAWgC,gBAAgB/xB,SAAS+vB,WAAWiC,wBAE/E+vC,oBAAoBloF,KAAK,QAASzL,oBAAoBF,gBAAgB5J,kBAAkB6C,uBACxF46F,oBAAoBloF,KAAK,gBAAgB,GACzCmoF,mBAAmB5hE,YAAY2vB,WAAW4D,8BAA8B3zB,SAAS+vB,WAAW2D,wBAC5FquC,oBAAoB3hE,YAAY2vB,WAAWiC,sBAAsBhyB,SAAS+vB,WAAWgC,gBAEzF,EACIswC,kBAAoB,WACtB,IAAIC,yBAA2BtL,4BAxCE,6BAyC7BsL,0BACFF,eAAeE,2BAA6Bb,aAAaE,SACzDO,+BAEAE,eAAeH,oBAEnB,EACItb,mBAAqB,SAA4B10J,EAAGkpK,WAClDA,UAAUoH,aACZR,oBAAoBr4E,OAEpBq4E,oBAAoBt4E,MAExB,EACIuxE,cAAgB,SAAuB/oK,GACzCA,EAAEiG,iBACFkqK,gBAAgBH,qBAChBC,6BACF,EAuBA,OArBM51I,OAASqgH,oDACbmL,WAAW/uH,KAAK,yBAAyB4oE,KAAKrlE,QAC9Cy1I,oBAAsBjqB,WAAW/uH,KAAK,wBACtCi5I,mBAAqBlqB,WAAW/uH,KAAK,8BAGrCg5I,oBAAoBpxE,GAAG,QAASqqE,eAChCljB,WAAWnnD,GAAGl7F,OAAO+W,SAASgB,kBAAmB60J,mBACjDvqB,WAAWnnD,GAAGl7F,OAAO+W,SAASG,iBAAkBg6I,oBAChD7O,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASouJ,gBACvCvjB,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQouJ,eAWjCjqK,OAAOsX,iBAAiB,CAC7Bi+H,QAVY,WACZm7B,oBAAoB/1E,IAAI,QAASgvE,eACjCljB,WAAW9rD,IAAIv2F,OAAO+W,SAASgB,kBAAmB60J,mBAClDvqB,WAAW9rD,IAAIv2F,OAAO+W,SAASG,iBAAkBg6I,oBACjD7O,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASouJ,gBACxCvjB,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQouJ,cACzC,GAKG,CAAC,EACN,EA4OIkH,+BA3NwB,SAA+B1qB,WAAYznC,cACrE,IAGIoyD,mBACAC,kBAEAC,qBANAC,eAAgB,EAChBC,cAAe,EACftc,WAAap6C,EAAEp7G,OAAOmB,UAGtB4wK,sBAAwBv+C,oBAAoBP,2BAA6BO,oBAAoBP,2BAA6B8zB,WAAWzjJ,IAAI,GAEzI0uK,YAAc,KACdC,0BAA2B,EAC3BC,eAAiB,SAAwBC,2BACvCx0D,WAAWuB,sBACb+yD,0BAA2B,EAC3BL,qBAAuBG,sBACvBC,YA1BwB,kBA2Bfr0D,WAAW0B,4BAA4BC,eAChD2yD,0BAA2B,EAC3BL,qBAAuBtyD,aACvB0yD,YA9BwB,kBAgCxBA,YADS13C,2BAA6B63C,0BACxB3+C,oBAAoBzI,0BA9Bf,aADI,gBAEJ,YAiCvB,EAQIqnD,iBAAmB,WAzCA,eA0CjBJ,YACFN,mBAAmB/4E,OAEnB+4E,mBAAmBh5E,MAEvB,EAWI25E,mBAAqB,YACvBR,eAAiBA,gBAEfF,kBAAkBtiE,YAAY2vB,WAAWiB,uBACzC0xC,kBAAkB1iE,SAAS+vB,WAAWkB,6BACtCwxC,mBAAmB5oF,KAAK,gBAAgB,GACxC4oF,mBAAmBzmF,QACnB87D,WAAW93C,SAAS+vB,WAAWU,kBAE/BiyC,kBAAkBtiE,YAAY2vB,WAAWkB,6BACzCyxC,kBAAkB1iE,SAAS+vB,WAAWiB,uBACtCyxC,mBAAmB5oF,KAAK,gBAAgB,GACxCi+D,WAAW13C,YAAY2vB,WAAWU,iBAEpCqnB,WAAWtrD,QAAQ/2F,OAAO+W,SAASG,iBAAkB,CACnD41J,aAAcK,eAElB,EAOIS,iBAAmB,WACrBZ,mBAAmB5oF,KAAK,gBAAgB,GACxC6rE,oCAAoCr1C,aACtC,EAKIizD,yBAA2B,WAC7BD,kBACF,EACIE,qBAAuB,WACpBX,cAGHU,4BAVFb,mBAAmB5oF,KAAK,gBAAgB,GACxC6rE,wCAAwCid,sBAW1C,EACIa,oBAAsB,YACxBX,cAAgBA,eAEdH,kBAAkBtiE,YAAY2vB,WAAWmB,sBACzCwxC,kBAAkB1iE,SAAS+vB,WAAWoB,4BACtCsxC,mBAAmB5oF,KAAK,gBAAgB,GACxCwxC,yBAAyB51H,OAAO2a,OAAOC,eAAgB,OAEvDqyJ,kBAAkBtiE,YAAY2vB,WAAWoB,4BACzCuxC,kBAAkB1iE,SAAS+vB,WAAWmB,sBACtC7F,yBAAyB51H,OAAO2a,OAAOE,cAAe,KACtDmyJ,mBAAmB5oF,KAAK,gBAAgB,GAE5C,EAKI4pF,kBAAoB,WACtB,OAAQV,aACN,IA3HwB,iBA4HtBQ,uBACA,MACF,IA7HuB,gBA8HrBC,sBACA,MACF,IA/HmB,aAoHrB1rB,WAAWtrD,QAAQ/2F,OAAO+W,SAASK,aACnCsyH,mBAAmBA,iDAAiD,QAAS5a,oBAAoBtE,YAAa,UAchH,EAWIo7C,eAAiB,WACnBoH,mBAAmB5oF,KAAK,WAAYwC,SAASsvD,SAC/C,EACI2vB,cAAgB,WAClBmH,mBAAmB5oF,KAAK,WAAYwC,SAASuvD,SAC/C,EACI83B,sBAAwB,WACtBV,0BACFM,0BAEJ,EACIK,kBAAoB,SAA2B1xK,GACjDwxK,oBACAxxK,EAAEiG,gBACJ,EACI0rK,mBAAqB,WAQvB,OAPAnB,mBAAmB9xE,GAAG,QAASgzE,mBAC/B7rB,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASouJ,gBACvCvjB,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQouJ,eACtCxjB,WAAWnnD,GAAGl7F,OAAOsb,SAASlC,OAAQ60J,uBACtC5rB,WAAWnnD,GAAGl7F,OAAOmZ,SAASC,OAAQ60J,uBACtC5rB,WAAWnnD,GAAGl7F,OAAOwZ,MAAMM,IAAKm0J,uBAChC5rB,WAAWnnD,GAAGl7F,OAAO+W,SAASI,iBAAkB22J,sBACxCR,aACN,IAxKwB,iBAyKtB,GAAIC,yBACF3yD,aAAax4G,iBAAiB,wBAAyBurK,oBACvD/yD,aAAax4G,iBAAiB,sBAAuBurK,wBAChD,CACL,IAAIS,qBAAuBn1D,WAAWkB,gCACtC22C,WAAWv6D,IAAI63E,qBAAsBT,oBACrC7c,WAAW51D,GAAGkzE,qBAAsBT,mBACtC,CACA,MACF,IAjLuB,gBAkLrBV,kBAAkBtiE,YAAY2vB,WAAWiB,uBACzC0xC,kBAAkB1iE,SAAS+vB,WAAWmB,sBACtC,MACF,IApLmB,aAqLjBwxC,kBAAkBtiE,YAAY2vB,WAAWiB,uBACzC0xC,kBAAkB1iE,SAAS+vB,WAAWqB,mBAG5C,EAqBA,OAHA6xC,gBAAe,GA1JE,WACf,IAAI70B,YAAchgE,oBAAoBF,gBAAgB5J,kBAAkBW,qBAlDnD,eAmDjB89F,cACF30B,YAAchgE,oBAAoBF,gBAAgB5J,kBAAkBY,4BAEtE,IAAIilF,QAAUxd,kDAAkDyB,aAChE0J,WAAW/uH,KAAK,uBAAuB4oE,KAAKw4D,SAC5CsY,mBAAqB3qB,WAAW/uH,KAAK,sBACrC25I,kBAAoB5qB,WAAW/uH,KAAK,2BACtC,CAkJAiyH,GACAmoB,mBACO9xK,OAAOsX,iBAAiB,CAC7Bm7J,4BAlIgC,SAAqCZ,2BA1C/C,IAClB90B,YA0CJ60B,eAAeC,2BA1CX90B,YAAchgE,oBAAoBF,gBAAgB5J,kBAAkBW,qBApCnD,eAqCjB89F,cACF30B,YAAchgE,oBAAoBF,gBAAgB5J,kBAAkBY,4BAEtEu9F,mBAAmB5oF,KAAK,QAASu0D,aAwCjC+0B,mBACAS,oBACF,EA8HEG,WAtBe,WAEXnB,eACFS,kBAEJ,EAkBEW,cA7EkB,WAClB,OAAQjB,aACN,IAxIwB,iBAyItBQ,uBACA,MACF,IA1IuB,gBA2IrBC,sBAGN,EAqEE58B,QAlBY,WACZ67B,mBAAmBz2E,IAAI,QAAS23E,mBAChCtzD,aAAat4G,oBAAoB,wBAAyBqrK,oBAC1D/yD,aAAat4G,oBAAoB,sBAAuBqrK,oBACxDtrB,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASouJ,gBACxCvjB,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQouJ,eACvCxjB,WAAW9rD,IAAIv2F,OAAOsb,SAASlC,OAAQ60J,uBACvC5rB,WAAW9rD,IAAIv2F,OAAOmZ,SAASC,OAAQ60J,uBACvC5rB,WAAW9rD,IAAIv2F,OAAOwZ,MAAMM,IAAKm0J,uBACjC5rB,WAAW9rD,IAAIv2F,OAAO+W,SAASI,iBAAkB22J,qBACnD,GASG,CACDU,aAAc,CACZ5vK,IAAK,WACH,OAAOuuK,aACT,GAEFsB,YAAa,CACX7vK,IAAK,WACH,OAAOwuK,YACT,GAEFjN,eAAgB,CACdvhK,IAAK,WACH,OAAOouK,kBACT,IAGN,EAgII0B,2BAnGoB,SAA2BrsB,WAAYlO,aAAcw6B,sBAAuBC,uBAAwB9/C,oBAAqB+/C,kBAC/I,IAAIC,gBAAkBzsB,WAAW/uH,KAAK,mBAClCy7I,0BAA4B1sB,WAAW/uH,KAAK,qBAC5C07I,0BAA4B3sB,WAAW/uH,KAAK,+BAC5C27I,QAAU,EACVC,kBAAoB,KACpBxgB,UAAW,EACXygB,kBAAmB,EACnBC,+BAAgC,EAChCC,kBAAoBR,kBAxBO,IAyC3BS,2BAA6B,SAAoC9yK,EAAGkpK,WAClElpK,EAAEoF,OAAS5B,OAAOmZ,SAASC,QAAUssJ,WAAaA,UAAU6J,oBAC9D5hF,UACSnxF,EAAEoF,OAAS5B,OAAOmZ,SAASE,QACpCm2J,QAEJ,EACIC,eAAiB,SAAwBjzK,GAC3C,GAAI4yK,gCAAkC1gB,UAAYygB,kBAAoB3yK,EAAE6O,SAAW4qJ,aAAaC,WAC9FkZ,+BAAgC,OAKlC,GAFAH,UACAnhK,aAAaohK,mBArDQ,IAsDjBD,QAAgC,CAClC,IAAIS,YAAcv7B,aAAalC,OAC/Bi9B,kBAAoBrhK,YAAW,WAC7BohK,QAAU,EACLngD,oBAAoBpE,gCAGrBypB,aAAalC,SAAWy9B,aAAgBd,uBAAuB3O,YACjE9rB,aAAalC,QArCfkC,aAAa9B,MACfgQ,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMK,QAEhCs6H,aAAa/C,OAEf49B,0BAA0BrkE,YAAY,iCAAiCJ,SAAS,gCAChFwkE,0BAA0B/6E,OAAO+U,QAAQ,SAGrCorC,aAAaztC,cAAgBytC,aAAa/mG,WAC5C+mG,aAAa5jF,QACby+G,0BAA0BrkE,YAAY,gCAAgCJ,SAAS,iCAC/EwkE,0BAA0B/6E,OAAO+U,QAAQ,UA2BzC,GAAGsmE,kBACL,MAAO,GAhEc,IAgEVJ,QAAgC,CAEzC,GADAA,QAAU,GACLngD,oBAAoBlE,8BACvB,OAEF+jD,sBAAsBJ,eACxB,CACF,EACIoB,mBAAqB,WACvBR,kBAAmB,CACrB,EACIS,iBAAmB,WACrBT,kBAAmB,CACrB,EACIU,yCAA2C,WAC7CT,+BAAgC,CAClC,EAUII,OAAS,WACX9gB,UAAW,CACb,EACI/gE,QAAU,WACZ+gE,UAAW,CACb,EAWA,OAxBErM,WAAWnnD,GAAGl7F,OAAOmd,SAASK,UAAWmyJ,oBACzCttB,WAAWnnD,GAAGl7F,OAAOmd,SAASM,QAASmyJ,kBACvCvtB,WAAWnnD,GAAGl7F,OAAOmZ,SAASC,OAAQk2J,4BACtCjtB,WAAWnnD,GAAGl7F,OAAOmZ,SAASE,OAAQi2J,4BACtCjtB,WAAWnnD,GAAGl7F,OAAOif,OAAOE,yBAA0B0wJ,0CACtDxtB,WAAWnnD,GAAGl7F,OAAOif,OAAOI,uBAAwBwwJ,0CACpDf,gBAAgB5zE,GAAG,QAASu0E,gBAkBvB7zK,OAAOsX,iBAAiB,CAC7Bs8J,OACA7hF,QACAwjD,QAbY,WACZkR,WAAW9rD,IAAIv2F,OAAOmd,SAASK,UAAWmyJ,oBAC1CttB,WAAW9rD,IAAIv2F,OAAOmd,SAASM,QAASmyJ,kBACxCvtB,WAAW9rD,IAAIv2F,OAAOmZ,SAASC,OAAQk2J,4BACvCjtB,WAAW9rD,IAAIv2F,OAAOmZ,SAASE,OAAQi2J,4BACvCjtB,WAAW9rD,IAAIv2F,OAAOif,OAAOE,yBAA0B0wJ,0CACvDxtB,WAAW9rD,IAAIv2F,OAAOif,OAAOI,uBAAwBwwJ,0CACrDf,gBAAgBv4E,IAAI,QAASk5E,eAC/B,GAMG,CAAC,EACN,EA6gBIK,iCA5e0B,SAAiCC,wBAAyB5sB,UAAWzc,SAAUsc,UAAWl0B,qBAEtH,IAEIkhD,yBACAC,6BACAC,wBACAC,wBACAC,sBACAC,mBACAC,6BACAC,qBACAC,gBACAC,oBACAC,gBACAC,wBACAC,uBACAC,mBAMAC,eArBAjZ,WAAapgD,0BACbs5D,oCAAqC,EAerCC,iBAAkB,EAClBC,sCAAwC,EACxCC,aAAehvJ,wBAAwBC,SAASC,SAChD+uJ,sBAAuB,EACvBC,iCAAkC,EAElCC,iBAAkB,EAClBC,4BAA8B,EAC9BC,qBAAuB,CACzB71K,EAAG,EACH0B,EAAG,GAiBD8nK,aAAe,SAAsBsM,UAAWC,yBAClD,GAAIP,eAAiBhvJ,wBAAwBC,SAAe,KAA5D,CAGA,IAAIuvJ,kBANGxB,yBAA0BA,wBAAwBjQ,WAMbwQ,qBAAuBA,oBAAoBnG,QAClFkH,WAAaE,kBAGlBL,iBAAkB,EAClBrB,yBAAyB19E,MAAK,GAAM,GACpC09E,yBAAyB9nE,OAtEP,IAsE+B,GAAG,WAC9CupE,yBACFzB,yBAAyB/7E,MAE7B,IACAo8E,mBAAmBnL,eACnB6K,wBAAwBplE,YAAY2vB,WAAWK,uBAC/Co1C,wBAAwBh5E,QAAQ/2F,OAAO+W,SAASmB,qBAdhD,CAeF,EACIy5J,sBAAwB,SAA+BH,WACzDtM,aAAasM,WAAW,GACpBH,iBACFR,oBAAsBA,mBAAmBljF,SAE7C,EACIikF,yBAA2B,WAC7B/Z,WAAW/pJ,aAAawjK,2BAC1B,EACIO,yBAA2B,WAC7BD,2BACI9iD,oBAAoBlJ,wBACtB0rD,2BAA6BzZ,WAAWhqJ,WAAW8jK,sBA1FhB,KA4FvC,EACIG,yCAA2C,YACxC/B,wBAAwBx8B,YAAYw+B,0CAA4ClB,qBAC/E53D,WAAWD,mBACbnrG,WAAWgjK,mBAAmBrB,OAjGhB,KAmGdqB,mBAAmBrB,SAGzB,EACIwC,aAAe,SAAsBlsD,kBACnCurD,kBACFA,iBAAkB,EAClBrB,yBAAyBrlE,YAAY2vB,WAAWrmC,MAChD+7E,yBAAyB19E,MAAK,GAAM,GACpC09E,yBAAyBh8E,OACzBg8E,yBAAyB9nE,OA7GT,IA6GiC,GACjD4pE,2CACA/B,wBAAwBxlE,SAAS+vB,WAAWK,uBAC5Co1C,wBAAwBh5E,QAAQ/2F,OAAO+W,SAASqB,uBAE9C0tG,kBACF+rD,0BAEJ,EACII,yBAA2B,WAC7BD,cAAa,EACf,EACIE,iBAAmB,WACrBpB,gBAAiB,IAAI78I,MAAOk+I,UAC5BF,0BACF,EACIG,iBAAmB,aAEhBtB,iBAAkB,IAAI78I,MAAOk+I,UAAYrB,eA5HlB,MA6H1Ba,uBAEJ,EACIU,qBAAuB,SAA8B71K,GACvD,IAAId,EAAIc,EAAEm9F,MACNv8F,EAAIZ,EAAEo9F,OACLl+F,GAAW,IAANA,IAAY0B,GAAW,IAANA,EAEzB60K,2BAGWpnK,KAAKC,IAAIpP,EAAI61K,qBAAqB71K,GAClCmP,KAAKC,IAAI1N,EAAIm0K,qBAAqBn0K,GA1IxB,IA4IrBm0K,qBAAqB71K,EAAIA,EACzB61K,qBAAqBn0K,EAAIA,EACzB60K,2BAEJ,EACIK,uBAAyB,WAC3BvC,wBAAwB70E,GAAG,YAAam3E,sBACxCtC,wBAAwB70E,GAAG,UAAW+2E,0BACtClC,wBAAwB70E,GAAG,QAASg3E,kBACpCnC,wBAAwB70E,GAAG,aAAck3E,kBACzCP,0BACF,EACIU,wBAA0B,WAC5BX,2BACA7B,wBAAwBx5E,IAAI,YAAa87E,sBACzCtC,wBAAwBx5E,IAAI,UAAW07E,0BACvClC,wBAAwBx5E,IAAI,QAAS27E,kBACrCnC,wBAAwBx5E,IAAI,aAAc67E,iBAC5C,EACItR,UAAY,SAAmBvqB,gBAC5B4M,UAAUhP,cAAgBtxF,MAAMsgG,UAAUhP,aAAaztC,cAAuD,OAAvCy8C,UAAUhP,aAAaztC,aAAwB7jD,MAAM0zF,gBAAoC,OAAlBA,gBAG/Iy6B,gBACFC,qCAAuC16B,eAGzC06B,sCAAwC,EACpC9tB,UAAUhP,aAAaztC,YAAYv9B,QAAQ,KAAOotE,cAAcptE,QAAQ,KAG5Eg6E,UAAUhP,aAAaztC,YAAc6vC,gBACvC,EACIoZ,iBAAmB,SAA0BnzJ,EAAGkpK,WAC9CA,UAAU9V,qBACZwgB,sBAAsBxgB,uBAEtBwgB,sBAAsB/O,wBAEpBqE,UAAU7V,iBACZugB,sBAAsBvgB,mBAEtBugB,sBAAsB9O,oBAEpB4O,yBACFA,wBAAwB3Q,qBAE1BwR,oCAAqC,EAGjC93D,WAAWU,cACbwpC,UAAUhP,aAAaztC,YAAc,GAEvCy8C,UAAUhP,cAAgB/C,OAItBn4B,WAAWY,aAAeZ,WAAWK,SAAiD,IAAtC6pC,UAAUhP,aAAa3sI,YACzE27I,UAAUhP,aAAa/xI,iBAAiB,WAAW,SAASowK,YAC1DrvB,UAAUhP,aAAaztC,YAAc,EACrCy8C,UAAUhP,aAAa7xI,oBAAoB,UAAWkwK,UACxD,GAEJ,EACIC,sBAAwB,WACrBtB,uBACHA,sBAAuB,EACvBpB,wBAAwBh5E,QAAQ/2F,OAAO+W,SAASgC,iBAEpD,EACIq4H,KAAO,WACT,IAAIshC,YAAcvvB,UAAUhP,aAAa/C,YACrB1yI,IAAhBg0K,aACFA,YAAYvsI,MAAK,WACfssI,uBACF,IAAU,OAAE,SAAUjgK,QAzKpBlX,OAAOmB,SAASopG,QAAWkrE,qCAI/BI,sBAAuB,EACvBJ,oCAAqC,EACrC4B,uBAAuBzwJ,wBAAwBC,SAAgB,OAC/D8tJ,6BAA6Bva,2BAoK3B,GAEJ,EACIkd,aAAe,SAAsBp2K,EAAGkpK,WAC1C,IAAI79F,KAAO69F,UAAU79F,KACrBi5F,UAAUj5F,MACV8qG,uBAAuBzB,cACnBxL,UAAU5G,eACZ3b,UAAUhP,cAAgB/C,MAE9B,EACIyhC,YAAc,SAAqBr2K,EAAG8mB,MACpC+sJ,qBACFA,mBAAmBn+B,OAAS5uH,KAAKkhJ,YAErC,EACIsO,WAAa,SAAoBt2K,EAAG8mB,MAClC+sJ,qBACFA,mBAAmBl+B,MAAQ7uH,KAAKyvJ,QAEpC,EACIC,kBAAoB,SAA2Bx2K,EAAG8mB,MAChDmtJ,sBACFA,oBAAoBr+B,aAAe9uH,KAAK8uH,aAE5C,EACI6gC,eAAiB,WACnBjC,iBAAkB,CACpB,EACIkC,cAAgB,WAClBlC,iBAAkB,EACdC,sCAAwC,GAC1CnQ,UAAUmQ,qCAEd,EACIkC,sBAAwB,SAASA,wBACnChwB,UAAUhP,aAAa7xI,oBAAoBtC,OAAOyV,cAAcE,oBAAqBw9J,uBACrF,IAAI1F,2BAA6B3+C,oBAAoBuE,cACrDu9C,uBAAuBvC,4BAA4BZ,2BACnDiD,iBAAmBA,gBAAgB3E,aACnCgE,wBAAwBh5E,QAAQ/2F,OAAO+W,SAASmC,oBAChDk6J,wBACF,EACIC,yBAA2B,WACzBnC,eAAiBhvJ,wBAAwBC,SAASC,UACpDmwJ,yBAEJ,EACII,uBAAyB,SAAgCjG,aAC3D2G,4BACAnC,aAAexE,eACMxqJ,wBAAwBC,SAAgB,OAC3DowJ,0BACArN,cAAa,GAAM,IACVgM,eAAiBhvJ,wBAAwBC,SAASC,UAC3DkwJ,yBACAN,cAAa,IAEbA,cAAa,EAEjB,EACI5H,wBAA0B,SAAiC5tK,EAAGkpK,WAC5DA,UAAU2E,wBACZkG,qBAAuBzK,6BAA6BiK,0BAElDQ,sBACFA,qBAAqBjK,wBAAwBZ,UAAU2E,sBAE3D,EACIiJ,oBAAsB,WACxB9C,gBAAkB9J,wBAAwBqJ,wBAAyBjhD,oBACrE,EACIykD,YAAc,WAChB1B,0BACF,EACIuB,uBAAyB,WAC3B,IAAKtkD,oBAAoBuE,eAAiBvE,oBAAoBj9D,WAAY,CACxE,IAAI2hH,WAAa9pC,0BAA0B5a,oBAAoBj9D,YAC3D2hH,WAAarwB,UAAU/1G,UACzB0zH,UAAU0S,WAEd,CACF,EACIC,mBAAqB,SAA4B9mB,WAC/CA,UACFvb,OAEAqhC,uBAEJ,EACI9oB,YAAc,WACXwnB,sBACHsC,oBAAmB,EAEvB,EACIC,oBAAsB,SAASA,sBACjC3D,wBAAwBx5E,IAAIv2F,OAAOsb,SAASC,kBAAmBm4J,qBAC/DD,oBAAmB,EACrB,EACIE,uBAAyB,SAASA,yBACpC5D,wBAAwBx5E,IAAIv2F,OAAO+W,SAAS2B,uBAAwBi7J,wBACpE5D,wBAAwBh5E,QAAQ/2F,OAAO4W,OAAOC,oBAG1CmsI,WAAaA,UAAU9Z,QAAU8Z,UAAU/uF,gBAAkB66D,oBAAoBnN,sBACnFouD,wBAAwB70E,GAAGl7F,OAAOsb,SAASC,kBAAmBm4J,qBAE9DD,oBAAmB,EAEvB,EACIG,aAAe,WACjB3D,6BAA6B/a,2BAC7B+a,6BAA6Bta,+BAA8B,GAC3DuP,cAAa,GAAM,EACrB,EACI2O,kBAAoB,WACtB/B,0CACF,EACIgC,gBAAkB,WACpB/C,oCAAqC,EACrC0C,oBAAmB,EACrB,EA+FA,OA7FEzD,yBAA2BD,wBAAwBz8I,KAAK,6BACxD6vH,UAAU0C,yBAAyBmqB,0BACnCC,6BAA+Bxb,qCAAqCsb,wBAAyBjhD,qBACxFq0B,UAAU2D,6BACbmpB,6BAA6B/a,2BAE/Bgb,wBAA0B1Y,gCAAgCuY,wBAAyB5sB,UAAUhP,aAAc6O,WAC3GmtB,wBAA0B9P,gCAAgC0P,wBAAyB5sB,UAAUhP,cACzFgP,UAAU0D,oBAAsBnD,mBAAmBE,gBACrDwsB,sBAAwBlP,8BAA8B6O,0BAExDM,mBAAqBzO,2BAA2BmO,wBAAyB5sB,UAAUhP,cAC/ErlB,oBAAoBrD,2BACtB6kD,6BAA+BnL,qCAAqC4K,0BAEtEU,oBAAsBnJ,4BAA4ByI,wBAAyB5sB,UAAUhP,aAAczN,SAAU,KAAM5X,oBAAoBrD,0BACnI03B,UAAU0D,oBAAsBnD,mBAAmBE,gBACrD8sB,gBAAkBlF,wBAAwBuE,wBAAyB5sB,UAAUhP,eAE3ErlB,oBAAoBN,yBACtBmiD,wBAA0BtE,gCAAgC0D,0BAE5Da,uBAAyB7D,+BAA+BgD,wBAAyB5sB,UAAUhP,cACvFgP,UAAU2D,8BACZ+pB,mBAAqBnC,2BAA2BqB,wBAAyB5sB,UAAUhP,aAAcy8B,uBAAwBV,wBAAyBphD,sBAiBpJihD,wBAAwB70E,GAAGl7F,OAAO+W,SAASuB,sBAAuB8xJ,yBAClE2F,wBAAwB70E,GAAGl7F,OAAO+W,SAASwB,kBAAmB+6J,qBAC9DvD,wBAAwB70E,GAAGl7F,OAAO+W,SAASQ,UAAWg8J,aACtDxD,wBAAwB70E,GAAGl7F,OAAOwZ,MAAMI,WAAYg5J,cACpD7C,wBAAwB70E,GAAGl7F,OAAOwZ,MAAMe,UAAWs4J,aACnD9C,wBAAwB70E,GAAGl7F,OAAOwZ,MAAMgB,cAAes4J,YACvD/C,wBAAwB70E,GAAGl7F,OAAOwZ,MAAMiB,gBAAiBu4J,mBACzDjD,wBAAwB70E,GAAGl7F,OAAOwZ,MAAMY,kBAAmBu1I,kBAC3DogB,wBAAwB70E,GAAGl7F,OAAOwZ,MAAMc,cAAew5J,iBACvD/D,wBAAwB70E,GAAGl7F,OAAOwZ,MAAMkB,UAAWivI,aACnDomB,wBAAwB70E,GAAGl7F,OAAOwZ,MAAM/G,MAAOmhK,cAC/C7D,wBAAwB70E,GAAGl7F,OAAOmZ,SAASI,aAAcs6J,mBACzD1wB,UAAUhP,aAAa/xI,iBAAiBpC,OAAOyV,cAAcE,oBAAqBw9J,uBAClFhwB,UAAUhP,aAAa/xI,iBAAiBpC,OAAOyV,cAAcQ,aAAcg9J,gBAC3E9vB,UAAUhP,aAAa/xI,iBAAiBpC,OAAOyV,cAAcS,YAAag9J,eA3BtEpkD,oBAAoB9E,eAAiBzN,eAAeE,UAAY0mC,UAAUvhJ,OAASiiJ,cAAcxhI,SACnG+uJ,iCAAkC,EAC9BtiD,oBAAoBrM,qBACtBwtD,6BAA6Bpa,8BAA8B/mC,oBAAoBrM,qBAEjFstD,wBAAwB70E,GAAGl7F,OAAO+W,SAAS2B,uBAAwBi7J,0BAEnE1D,6BAA6B/a,2BAC7B+a,6BAA6B9a,6BAC7Bic,iCAAkC,GAwD/Bx1K,OAAOsX,iBAAiB,CAO7By5J,eAAgBgG,uBAMhBxhC,QAjDY,WACZkiC,2BACAlwB,UAAUhP,aAAa7xI,oBAAoBtC,OAAOyV,cAAcE,oBAAqBw9J,uBACrFhwB,UAAUhP,aAAa7xI,oBAAoBtC,OAAOyV,cAAcQ,aAAcg9J,gBAC9E9vB,UAAUhP,aAAa7xI,oBAAoBtC,OAAOyV,cAAcS,YAAag9J,eAC7EnD,wBAAwBx5E,IAAIv2F,OAAO+W,SAASuB,sBAAuB8xJ,yBACnE2F,wBAAwBx5E,IAAIv2F,OAAO+W,SAASwB,kBAAmB+6J,qBAC/DvD,wBAAwBx5E,IAAIv2F,OAAO+W,SAASQ,UAAWg8J,aACvDxD,wBAAwBx5E,IAAIv2F,OAAOwZ,MAAMI,WAAYg5J,cACrD7C,wBAAwBx5E,IAAIv2F,OAAOwZ,MAAMe,UAAWs4J,aACpD9C,wBAAwBx5E,IAAIv2F,OAAOwZ,MAAMgB,cAAes4J,YACxD/C,wBAAwBx5E,IAAIv2F,OAAOwZ,MAAMiB,gBAAiBu4J,mBAC1DjD,wBAAwBx5E,IAAIv2F,OAAO+W,SAASM,QAASk7J,yBACrDxC,wBAAwBx5E,IAAIv2F,OAAO+W,SAASO,QAASg7J,wBACrDvC,wBAAwBx5E,IAAIv2F,OAAOwZ,MAAMY,kBAAmBu1I,kBAC5DogB,wBAAwBx5E,IAAIv2F,OAAOwZ,MAAMc,cAAew5J,iBACxD/D,wBAAwBx5E,IAAIv2F,OAAOwZ,MAAMkB,UAAWivI,aACpDomB,wBAAwBx5E,IAAIv2F,OAAOwZ,MAAM/G,MAAOmhK,cAChD7D,wBAAwBx5E,IAAIv2F,OAAOmZ,SAASI,aAAcs6J,mBAC1D5D,8BAAgCA,6BAA6B9+B,UAC7D++B,yBAA2BA,wBAAwB/+B,UACnDg/B,yBAA2BA,wBAAwBh/B,UACnDi/B,uBAAyBA,sBAAsBj/B,UAC/Ck/B,oBAAsBA,mBAAmBl/B,UACzCm/B,8BAAgCA,6BAA6Bn/B,UAC7Do/B,sBAAwBA,qBAAqBp/B,UAC7Cq/B,iBAAmBA,gBAAgBr/B,UACnCs/B,qBAAuBA,oBAAoBt/B,UAC3Cu/B,iBAAmBA,gBAAgBv/B,UACnCw/B,yBAA2BA,wBAAwBx/B,UACnDy/B,wBAA0BA,uBAAuBz/B,UACjD0/B,oBAAsBA,mBAAmB1/B,SAC3C,GAkBG,CAOD4iC,+BAAgC,CAC9Bn1K,IAAK,WACH,OAAOwyK,+BACT,GAQF4C,oBAAqB,CACnBp1K,IAAK,WACH,OAAOuyK,oBACT,GAQFvC,uBAAwB,CACtBhwK,IAAK,WACH,OAAOsxK,uBACT,GAQFvB,sBAAuB,CACrB/vK,IAAK,WACH,OAAOgyK,sBACT,GAQFqD,4BAA6B,CAC3Br1K,IAAK,WACH,OAAOqxK,4BACT,IAGN,EAiBIiE,uBACK,QAELC,sBACG,MADHA,uBAEI,OAFJA,wBAGK,QAqJLC,4CA1IqC,SAA4CrE,wBAAyBsE,wBAAyBvlD,qBACrI,IAAIwlD,gBAAiB,EACjBC,kBAAmB,EACnBC,gBAAiB,EACjBC,qBAAuB,KACvBC,kBAAmB,EACnBC,cAAe,EACfC,uBAAwB,EACxBC,aAAc,EACdC,eAAiB,WACnB,OAAKT,wBAAwBL,qBAAuBllD,oBAAoB9E,eAAiBzN,eAAeE,SAE7Fo4D,aAEAD,uBAEAJ,eAHFtyJ,wBAAwBC,SAAgB,MAKtCmyJ,eACFC,iBAAmBryJ,wBAAwBC,SAAgB,MAAID,wBAAwBC,SAAe,KACpGkyJ,wBAAwBJ,4BAA4Bje,YAAc1B,wBAAwB93C,MAAQsS,oBAAoBtI,sBAAwBsI,oBAAoBxM,yBACpKpgG,wBAAwBC,SAAgB,MACtCwyJ,cAAgBD,mBAAqB5lD,oBAAoBlJ,uBAAyB6uD,uBAAyBP,uBAC7GhyJ,wBAAwBC,SAAe,KAEzCD,wBAAwBC,SAASC,SAd/BF,wBAAwBC,SAAgB,KAenD,EACI4yJ,+BAAiC,WACnCV,wBAAwB1H,eAAemI,iBACzC,EACI1K,wBAA0B,SAAiC5tK,EAAGkpK,WAChE+O,qBAAuB/O,WAAaA,UAAUsP,qBAAuB,KACrED,gCACF,EACIE,aAAe,SAAsBz4K,EAAGkpK,WAC1C8O,eAAiB9O,UAAUkG,cAC3BmJ,gCACF,EACIG,gBAAkB,WACpBZ,gBAAiB,EACjBS,gCACF,EACII,eAAiB,WACnBb,gBAAiB,EACjBS,gCACF,EACIK,iBAAmB,WACrBb,kBAAmB,EACnBQ,gCACF,EACIM,iBAAmB,WACrBd,kBAAmB,EACnBQ,gCACF,EACIO,gBAAkB,WACpBF,mBACAF,iBACF,EACIxB,oBAAsB,WACxByB,gBACF,EACII,sBAAwB,WAC1BlB,wBAAwB1H,eAAemI,iBACzC,EACIU,oBAAsB,SAA6Bh5K,EAAGkpK,WACxDgP,iBAAmBhP,UAAU+P,gBAC7BV,gCACF,EACIW,mBAAqB,WACvBf,cAAe,EACfI,gCACF,EACIY,iBAAmB,WACrBhB,cAAe,EACfI,gCACF,EACIa,uBAAyB,WAC3BhB,uBAAwB,EACxBG,gCACF,EACIc,yBAA2B,WAC7BjB,uBAAwB,EACxBG,gCACF,EACInB,aAAe,WACjBiB,aAAc,EACdE,gCACF,EA+CA,OA7CEhF,wBAAwB70E,GAAGl7F,OAAO+W,SAASgC,gBAAiBg8J,gCAC5DhF,wBAAwB70E,GAAGl7F,OAAO+W,SAAS4B,uBAAwBo8J,gCACnEhF,wBAAwB70E,GAAGl7F,OAAO+W,SAAS6B,sBAAuBm8J,gCAClEhF,wBAAwB70E,GAAGl7F,OAAO+W,SAAS8B,qBAAsBk8J,gCACjEhF,wBAAwB70E,GAAGl7F,OAAO+W,SAAS+B,oBAAqBi8J,gCAChEhF,wBAAwB70E,GAAGl7F,OAAO+W,SAASuB,sBAAuB8xJ,yBAClE2F,wBAAwB70E,GAAGl7F,OAAO+W,SAASa,WAAYq9J,cACvDlF,wBAAwB70E,GAAGl7F,OAAOsb,SAAS2B,UAAWi4J,iBACtDnF,wBAAwB70E,GAAGl7F,OAAOsb,SAAS4B,SAAUi4J,gBACrDpF,wBAAwB70E,GAAGl7F,OAAOsb,SAASiB,cAAe+4J,iBAC1DvF,wBAAwB70E,GAAGl7F,OAAOsb,SAASC,kBAAmBm4J,qBAC9D3D,wBAAwB70E,GAAGl7F,OAAOsb,SAASyB,WAAYq4J,kBACvDrF,wBAAwB70E,GAAGl7F,OAAOsb,SAAS0B,WAAYq4J,kBACvDtF,wBAAwB70E,GAAGl7F,OAAO+W,SAASW,QAAS69J,uBACpDxF,wBAAwB70E,GAAGl7F,OAAO+W,SAASkC,kBAAmBu8J,qBAC9DzF,wBAAwB70E,GAAGl7F,OAAOmb,UAAUC,QAASs6J,oBACrD3F,wBAAwB70E,GAAGl7F,OAAOmb,UAAUE,MAAOs6J,kBACnD5F,wBAAwB70E,GAAGl7F,OAAO8f,iBAAiBF,KAAMg2J,wBACzD7F,wBAAwB70E,GAAGl7F,OAAO8f,iBAAiBD,OAAQg2J,0BAC3D9F,wBAAwB70E,GAAGl7F,OAAOwZ,MAAM/G,MAAOmhK,cAyBjDmB,iCACOn5K,OAAOsX,iBAAiB,CAC7Bi+H,QAzBY,WACZ4+B,wBAAwBx5E,IAAIv2F,OAAO+W,SAASgC,gBAAiBg8J,gCAC7DhF,wBAAwBx5E,IAAIv2F,OAAO+W,SAAS4B,uBAAwBo8J,gCACpEhF,wBAAwBx5E,IAAIv2F,OAAO+W,SAAS6B,sBAAuBm8J,gCACnEhF,wBAAwBx5E,IAAIv2F,OAAO+W,SAAS8B,qBAAsBk8J,gCAClEhF,wBAAwBx5E,IAAIv2F,OAAO+W,SAAS+B,oBAAqBi8J,gCACjEhF,wBAAwBx5E,IAAIv2F,OAAO+W,SAASuB,sBAAuB8xJ,yBACnE2F,wBAAwBx5E,IAAIv2F,OAAO+W,SAASa,WAAYq9J,cACxDlF,wBAAwBx5E,IAAIv2F,OAAOsb,SAAS2B,UAAWi4J,iBACvDnF,wBAAwBx5E,IAAIv2F,OAAOsb,SAAS4B,SAAUi4J,gBACtDpF,wBAAwBx5E,IAAIv2F,OAAOsb,SAASiB,cAAe+4J,iBAC3DvF,wBAAwBx5E,IAAIv2F,OAAOsb,SAASC,kBAAmBm4J,qBAC/D3D,wBAAwBx5E,IAAIv2F,OAAOsb,SAASyB,WAAYq4J,kBACxDrF,wBAAwBx5E,IAAIv2F,OAAOsb,SAAS0B,WAAYq4J,kBACxDtF,wBAAwBx5E,IAAIv2F,OAAO+W,SAASW,QAAS69J,uBACrDxF,wBAAwBx5E,IAAIv2F,OAAO+W,SAASkC,kBAAmBu8J,qBAC/DzF,wBAAwBx5E,IAAIv2F,OAAOmb,UAAUC,QAASs6J,oBACtD3F,wBAAwBx5E,IAAIv2F,OAAOmb,UAAUE,MAAOs6J,kBACpD5F,wBAAwBx5E,IAAIv2F,OAAO8f,iBAAiBF,KAAMg2J,wBAC1D7F,wBAAwBx5E,IAAIv2F,OAAO8f,iBAAiBD,OAAQg2J,0BAC5D9F,wBAAwBx5E,IAAIv2F,OAAOwZ,MAAM/G,MAAOmhK,aAClD,GAKG,CAAC,EACN,EAeIkC,iBAAmBl6K,OAAO2X,OAAO,CACnCsyF,OAAQ,SACRkwE,aAAc,eACd1jE,QAAS,YA8GP2jE,0BAnEmB,SAA0BC,gBAAiBpzJ,MAAOqzJ,iBAAkBC,mBACzF,IAAIC,iBAAmBH,gBACnBI,cAAgBxzJ,MAChByzJ,WAAY,EACZC,iBAAkB,EAClBC,YA5BqB,SAA8BP,gBAAiBC,iBAAkBC,mBAC1F,IAAIM,WAAa,GAUjB,OATAR,gBAAgB5lH,aAAab,YAAYtxD,SAAQ,SAAUw4K,YACzD,IAAIC,WAAa,CACfC,MAAO/rK,KAAK8kC,MAAM+mI,WAAWh7K,GAC7Bm7K,MAAOhsK,KAAK8kC,MAAM+mI,WAAWt5K,GAC7B05K,OAAQjsK,KAAK8kC,MAAM+mI,WAAWh7K,GAAKw6K,iBACnCa,OAAQlsK,KAAK8kC,MAAM+mI,WAAWt5K,GAAK+4K,mBAErCM,WAAWv2K,KAAKy2K,WAClB,IACOF,UACT,CAgBoBO,CAAqBf,gBAAiBC,iBAAkBC,mBACtE/6G,aA5CyB,SAAkC66G,iBAC/D,IAAIgB,YAAct+F,oBAAoBF,gBAAgB5J,kBAAkBmE,YACpEkkG,cAAgBv+F,oBAAoBF,gBAAgB5J,kBAAkByE,gBACtE6jG,aAAex+F,oBAAoBF,gBAAgB5J,kBAAkB0E,eACrE6jG,aAAez+F,oBAAoBF,gBAAgB5J,kBAAkB8E,aACrE0jG,SAAW1+F,oBAAoBF,gBAAgB5J,kBAAkBoB,eACrE,YAAiCvxE,IAA7Bu3K,gBAAgBtlH,SACXsmH,YAAc,KAAOC,cAAgB,KAAOjB,gBAAgBtlH,cAC7BjyD,IAA7Bu3K,gBAAgBzlH,UAAuD,KAA7BylH,gBAAgBzlH,SAC5DymH,YAAc,KAAOE,aAAe,KAAO1gC,uCAAuCvuG,OAAO+tI,gBAAgBzlH,UAAY,UACtF9xD,IAA7Bu3K,gBAAgBxlH,UAAuD,KAA7BwlH,gBAAgBxlH,SAC5DwmH,YAAc,KAAOG,aAAe,KAAOnB,gBAAgBxlH,SAE7DwmH,YAAc,KAAOI,QAC9B,CA8BqBC,CAAyBrB,iBAYxCsB,uBAAyB,SAAgCx0B,oBAC3D,OAAOy0B,oBAAoBz0B,qBA1DU,GA2DvC,EAIIy0B,oBAAsB,SAA6Bz0B,oBACrD,OAAOqzB,iBAAiBrnI,QAAUg0G,kBACpC,EACA,OAAOnnJ,OAAOsX,iBAAiB,CAC7BukK,eArBmB,SAAwBC,iBAAkBC,mBAC7D,IAAInoH,YAAc,GAKlB,OAJAgnH,YAAYt4K,SAAQ,SAAU05K,WAC5BpoH,YAAYtvD,KAAK03K,UAAUhB,OAAS,EAAI/rK,KAAK8kC,MAAMioI,UAAUd,OAASY,kBAAoB,GAC1FloH,YAAYtvD,KAAK03K,UAAUf,OAAS,EAAIhsK,KAAK8kC,MAAMioI,UAAUb,OAASY,mBAAqB,EAC7F,IACOnoH,YAAY3zB,KAAK,IAC1B,EAeEg8I,oBAdiB,SAAsB90B,oBACvC,OAAOqzB,iBAAiBnpI,UAAY81G,oBAAsBA,oBAAsBqzB,iBAAiBrnI,OACnG,EAaEwoI,uBACAO,oBAVwB,SAA6B/0B,oBACrD,OAAkC,IAA3BqzB,iBAAiB7lH,QAAmBgmH,iBAAmBgB,uBAAuBx0B,mBACvF,EASEy0B,qBACC,CACD30J,MAAO,CACLjkB,IAAK,WACH,OAAOy3K,aACT,GAEF14G,YAAa,CACX/+D,IAAK,WACH,OAAOw8D,YACT,GAEF28G,SAAU,CACRn5K,IAAK,WACH,OAAO03K,SACT,EACA/3K,IAAK,SAAaw5K,UAChBzB,UAAYyB,QACd,GAEFC,eAAgB,CACdp5K,IAAK,WACH,OAAO23K,eACT,EACAh4K,IAAK,SAAay5K,gBAChBzB,gBAAkByB,cACpB,GAEFtxC,SAAU,CACR9nI,IAAK,WACH,OAAOw3K,gBACT,IAGN,EA6KI6B,qBAlJc,SAAqBC,YAAa/jC,aAAcgkC,0BAA2BC,iBAAkBx/B,sBAAuBC,wBACpI,IAAIw/B,oBACAC,qBACAC,SAqDEr/B,oCACAH,cACAI,qBACAq/B,cACAC,SAxDFC,cAAgB,WAClBJ,qBAAqBl0F,KAAK,WAAYwC,SAASuvD,UAC/CmiC,qBAAqBl0F,KAAK,aAAa,EACzC,EACIu0F,eAAiB,WACnBL,qBAAqBl0F,KAAK,WAAYwC,SAASsvD,UAC/CoiC,qBAAqBl0F,KAAK,aAAa,EACzC,EACIw0F,mBAAqB,SAA4Bp8K,GACnD,OAAQA,EAAEoF,MACR,KAAK5B,OAAOsb,SAASE,SACrB,KAAKxb,OAAOsb,SAASG,OACnBi9J,gBACA,MACF,KAAK14K,OAAOsb,SAASlC,OACnBu/J,iBAGN,EACIE,yBAA2B,WACzB/pD,oBAAoBtM,oBACtBs2D,cACSV,iBAAiBP,oBAAoBkB,iCAC9CC,gBAEJ,EACID,6BAA+B,WACjC,OAAO5kC,aAAaztC,YAAcytC,aAAa/mG,SAAW+mG,aAAa/mG,SAAsC,IAA3B+mG,aAAaztC,WACjG,EAYIuyE,oBAAsB,SAA6BR,UACrD,IAAIS,0BAZ4B,SAAqCpgC,cACrE,IAAIogC,0BAA4B,KAQhC,OAPkBf,0BAA0B7kJ,KAAK,OACrC6oD,MAAK,SAAUt5D,MAAOziB,SAChC,IAAI+4K,KAAOziE,EAAEt2G,SACT04I,aAAe5wG,OAAOixI,KAAK/0F,KAAK,yBAClC80F,0BAA4BC,KAEhC,IACOD,yBACT,CAEkCE,CAA4BhB,iBAAiBv1J,OAC3C,OAA9Bq2J,0BACFA,0BAA0Bj8E,MAAMw7E,UAEhCN,0BAA0Br7E,QAAQ27E,UAEpCJ,oBAAsBF,0BAA0B7kJ,KAAK,2BAA6B8kJ,iBAAiBv1J,MAAQ,MAC3Gy1J,qBAAuBD,oBAAoB/kJ,KAAK,IAClD,EAgBI0lJ,eAAiB,WACflqD,oBAAoBtM,sBAGxB61D,oBAAoB9tE,SAAS+vB,WAAWoC,gBACxCg8C,gBACF,EACII,YAAc,WAChBT,oBAAoB1tE,YAAY2vB,WAAWoC,gBAC3Ci8C,gBACF,EAKIU,eAAiB,WACnBd,SAAW,KACXH,iBAAiBJ,gBAAiB,EAClC7jC,aAAa5jF,QACb,IAAIm1G,UAAY,CACd6J,qBAAsB6I,iBAAiB1xC,SAASj2E,UAElDynH,YAAYnhF,QAAQ/2F,OAAOmZ,SAASC,OAAQssJ,UAC9C,EACI4T,mBAAqB,SAA4Bv2B,oBACnDznJ,OAAOwS,aAAayqK,UAChBj9K,OAAOmB,SAASopG,OAElBwzE,iBAEAd,SAAW1qK,WAAWwrK,eAnBA,SAA6Bt2B,mBAAoBw2B,mBACzE,IAAIC,YAAc,IAA0B,GAApBD,mBAA0B,IAClD,OAAOnB,iBAAiBZ,oBAAoBz0B,oBAAsBw2B,kBAAoBC,WACxF,CAgB0CC,CAAoB12B,mBAAoB5O,aAAa/B,cAE/F,EAuBIsnC,eAAiB,WACnBtB,iBAAiBJ,gBAAiB,CACpC,EAIA,OA1EM9+B,oCADqBk/B,iBAAiBX,eAAe7+B,sBAAuBC,wBACnBlzH,QAAQ,KAAM,KACvEozH,cAAgB,uBAAyBq/B,iBAAiBv1J,MAC1Ds2H,qBAAuB,gBAAkBi/B,iBAAiBv1J,MAC1D21J,cAAgBthC,wCAAwC0B,sBAAuBC,uBAAwBu/B,iBAAiBv1J,MAAOk2H,cAAeq/B,iBAAiBz6G,YAAamxD,oBAAoBxD,qBAAsB4tB,oCAAqCC,sBAC3Ps/B,SAAW/hE,EAAE8hE,eACjBS,oBAAoBR,UAGpBP,YAAYh9E,GAAGl7F,OAAOsb,SAASE,SAAUo9J,oBACzCV,YAAYh9E,GAAGl7F,OAAOsb,SAASG,OAAQm9J,oBACvCV,YAAYh9E,GAAGl7F,OAAOsb,SAASlC,OAAQw/J,oBACvCV,YAAYh9E,GAAGl7F,OAAO+W,SAASW,QAASmhK,0BA8D1CC,cACOl9K,OAAOsX,iBAAiB,CAC7BymK,OA7BW,SAAgB52B,oBAC3B,IAAI62B,aAAe9D,iBAAiBjwE,OAmBpC,OAlBIuyE,iBAAiBP,oBAAoB90B,qBAClCq1B,iBAAiBL,SAKpB6B,aAAe9D,iBAAiBzjE,SAJhCunE,aAAe9D,iBAAiBC,aAChCqC,iBAAiBL,UAAW,EAC5BiB,kBAIEZ,iBAAiBN,oBAAoB/0B,sBAAwB5O,aAAalC,QAC5EqnC,mBAAmBv2B,qBAEZq1B,iBAAiBL,WAC1BK,iBAAiBL,UAAW,EAC5Be,cACKP,UAAapkC,aAAalC,QAC7BynC,kBAGGE,YACT,EASEF,gBACC,CACDtB,iBAAkB,CAChBx5K,IAAK,WACH,OAAOw5K,gBACT,GAEFjY,eAAgB,CACdvhK,IAAK,WACH,OAAO05K,oBACT,IAGN,EA6KIuB,sBA/Je,SAAsB3B,YAAaliJ,IAAKm+G,aAAc2lC,eACvE,IAMIC,WAIAC,aAEEC,eAZFC,KAAOlkJ,IACPmkJ,gBAAkBjC,YAElBkC,qBAAuB,CADNlC,YAAY9zF,KAAK,MACM,YAAYvoD,KAAK,KACzDw+I,kBAAoB,GACpBC,cAAgB,GAEhBC,kBAAoB,KACpBC,mBAAqB,KACrBC,yBAA0B,EAM1BC,aAAe,SAAsBl+K,GACvCA,EAAEiG,iBACFjG,EAAEq6F,iBACJ,EAsDI8jF,sBAAwB,SAA+BC,uBAAwBC,6BAEjF,GADA3C,YAAY3kC,YAAYw+B,yCAA2C+I,gCAC/DL,0BAA4BG,uBAAwB,CAEtD,IAAIz4K,WADJs4K,wBAA0BG,wBACgB56K,OAAOmZ,SAASG,WAAatZ,OAAOmZ,SAASI,aACvF4gK,gBAAgBpjF,QAAQ50F,UAC1B,CACA,GAAIs4K,wBAAyB,CAC3B,IAAIM,sBAhBuB,WAC7B,IAAK,IAAIh+K,EAAIu9K,cAAct9K,OAAS,EAAGD,GAAK,EAAGA,IAC7C,GAAIu9K,cAAcv9K,GAAGq7K,iBAAiBL,SACpC,OAAOuC,cAAcv9K,GAGzB,OAAO,IACT,CASgCi+K,GACxBD,wBACFjB,cAAcmB,sBAAwBF,sBAAsB5a,gBAE1D0a,4BAA8B,GA/BX,SAA8BA,6BACvD,IACIK,iBAAmBviG,oBAAoBF,gBAAgB5J,kBAAkBoE,6BACzE4nG,4BAA8B,IAChCK,iBAAmBviG,oBAAoBF,gBAAgB5J,kBAAkBqE,oCAE3EgoG,iBAAmBA,iBAAiBv1J,QALN,uBAKuCk1J,6BACrE,IAAIhd,wBAA0B3mB,kDAAkDgkC,kBAC5Epd,mBAAqBpnD,EAAEmnD,yBAC3Bkc,WAAWl9E,OAAOihE,mBACpB,CAsBMqd,CAAqBN,4BAEzB,MACEf,cAAcmB,sBAAwB,KArCxClB,WAAWzmJ,KAAK,IAAMgnG,WAAWqC,mBAAmBj2H,QAwCtD,EAeI00K,eAAiB,SAAwB75K,OAC3CA,MAAMkB,iBACNlB,MAAMs1F,kBACN,IAAIiiD,aAAe5wG,OAAOwuE,EAAEn1G,MAAMQ,QAAQqiF,KAAK,uBAC3Ci3F,sBAAwBhB,kBAAkBvhC,cAC1CwiC,uBAAyBhB,cAAcxhC,cAAcs/B,iBACrD1S,UAAY,CACd/0G,SAAU0qH,sBAAsB1qH,SAChCH,SAAU6qH,sBAAsB7qH,SAChCC,SAAU4qH,sBAAsB5qH,SAChCC,UAAW2qH,sBAAsB3qH,YAE9Bg1G,UAAUj1G,UAAY6qH,uBAAuBtD,gBAChDmC,gBAAgBpjF,QAAQ/2F,OAAOmZ,SAASE,QAE1C8gK,gBAAgBpjF,QAAQ/2F,OAAO+W,SAASY,eAAgB+tJ,UAC1D,EAMIoV,8BAAgC,WAClC,IAAK,IAAI/9K,EAAI,EAAGA,EAAIu9K,cAAct9K,OAAQD,IACxC,GAAIu9K,cAAcv9K,GAAGq7K,iBAAiBJ,iBAAmBsC,cAAcv9K,GAAGq7K,iBAAiB1xC,SAASj2E,SAClG,OAAO,EAGX,OAAO,CACT,EAGA,OA9HMwpH,eAAiB/iC,yCAAyCkjC,uBAC9DL,WAAarjE,EAAEA,EAAEtrB,UAAU6uF,kBAOhB/+E,GAAG,QAAS,MAAOkgF,gBAC9BrB,WAAW7+E,GAAG,YAAaw/E,cAC3BX,WAAW7+E,GAAG,WAAY,MAAOkgF,gBACjCrB,WAAW7+E,GAAG,UAAW,OAAO,SAAU1+F,GACpCuoB,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASb,QACxCspB,eAAe5+K,EAEnB,IA+GKZ,OAAOsX,iBAAiB,CAC7B2oE,KA9GS,SAAcq6F,iBAAkBC,kBAAmBoF,aAC5DvB,aAAeuB,YACfhB,kBAAoBrE,iBACpBsE,mBAAqBrE,kBACrBsE,yBAA0B,EAG1BV,WAAW9yF,QACXqzF,cAAgB,GAChBD,kBAAoB,GACpBH,KAAK7pC,iBAAiBxqI,QAAO,SAAUowK,iBAGrC,aAD0Dv3K,IAAzBu3K,gBAAgB7nI,MAAsB6nI,gBAAgB7nI,OAAS4rI,aAElG,IAAG97K,SAAQ,SAAU+3K,gBAAiBpzJ,OACpC,IAAIu1J,iBAAmBpC,0BAA0BC,gBAAiBpzJ,MAAO03J,kBAAmBC,oBACxFgB,YAAcvD,qBAAqBC,YAAa/jC,aAAc4lC,WAAY3B,iBAAkBmC,kBAAmBC,oBACnHF,cAAcp6K,KAAKs7K,aACnBnB,kBAAkBn6K,KAAK+1K,gBACzB,GACF,EA2FE0D,OAhDW,SAAgB8B,gCAC3B,IAAIb,wBAAyB,EACzBC,4BAA8B,EAClCP,cAAcp8K,SAAQ,SAAUs9K,aAC9B,IAAI5B,aAAe4B,YAAY7B,OAAO8B,gCAClC7B,eAAiB9D,iBAAiBC,cACpC8E,8BAEEjB,eAAiB9D,iBAAiBC,cAAgB6D,eAAiB9D,iBAAiBzjE,UACtFuoE,wBAAyB,EAE7B,IACAD,sBAAsBC,uBAAwBC,4BAChD,EAoCEnB,eAlBmB,WACnBY,cAAcp8K,SAAQ,SAAUs9K,aAC9BA,YAAY9B,gBACd,GACF,GAeG,CACDgC,UAAW,CACT98K,IAAK,WACH,OAAOm7K,UACT,GAEFa,uBAAwB,CACtBh8K,IAAK,WACH,OAAO67K,uBACT,GAEF1I,yCAA0C,CACxCnzK,IAAKk8K,gCAGX,EAmGIa,2BAnFoB,SAA2Bt5B,WAAYc,UAAWzc,SAAUzO,UAAW6hD,eAC7F,IAAI8B,cACAC,oBAAsBx5B,WAAW/uH,KAAK,uBAKtCgrI,iBAAmB,WACrB,IAAIid,YAActjD,UAAUyB,WAAazB,UAAUkB,aAAavC,WAAQl4H,EACxEk9K,cAAc//F,KAAKsnE,UAAUG,WAAYH,UAAUI,YAAag4B,YAClE,EACIO,kBAAoB,WACtBF,cAAcjC,OAAOx2B,UAAUuD,0BACjC,EACIq1B,uBAAyB,WAC3BH,cAAcjC,OAAOx2B,UAAUuD,0BACjC,EACIs1B,oBAAsB,SAA6Bx/K,EAAGkpK,WACxD,QAA2BhnK,IAAvBgnK,UAAU/0G,SACZsnE,UAAUmB,kBAAoBnB,UAAUe,mBAAmB0sC,UAAU/0G,UACrE0xF,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMa,oBAC3B,QAA2B3b,IAAvBgnK,UAAUl1G,UAAiD,KAAvBk1G,UAAUl1G,SAAiB,CACxE,IAAI+lF,cAAgBruG,OAAOw9H,UAAUl1G,UAAY,IACjD6xF,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMI,WAAY,CAC1CiuD,KAAMg7E,8BAA8BM,UAAUhP,aAAcoC,eAC5DuoB,eAAe,GAEnB,MAAO,QAA2BpgK,IAAvBgnK,UAAUj1G,UAAiD,KAAvBi1G,UAAUj1G,SAAiB,CACpEq+D,oBAAoBa,mBACtBkjB,2BAA2B7yI,OAAO+e,UAAUH,cAAe8mJ,UAAUj1G,UACrEoiF,8BAA8B7yI,OAAOme,IAAIS,cAAe,CACtDq9J,WAAYvW,UAAUj1G,YAG1B,IAAIyrH,aAAe,eACSx9K,IAAxBgnK,UAAUh1G,YAAmD,IAAxBg1G,UAAUh1G,YACjDwrH,aAAe,UAEjB/4B,UAAUhP,aAAa5jF,QACvBm5E,mBAAmBg8B,UAAUj1G,SAAUyrH,aACzC,MACE/4B,UAAUhP,aAAa/C,MAE3B,EACI+qC,SAAW,WACbP,cAAclC,iBACdkC,cAAcjC,OAAOx2B,UAAUuD,0BACjC,EA2BA,KADkBhgB,UAAYA,SAAS2I,iBAErC,MAAM,IAAI58H,MAAM,kEAIlB,OA3EEmpK,cAAgB/B,sBAAsBx3B,WAAY3b,SAAUyc,UAAUhP,aAAc2lC,eACpF+B,oBAAoB3+E,YAAY0+E,cAAcF,WA2C7B,WACjBr5B,WAAWnnD,GAAGl7F,OAAO+W,SAASY,eAAgBqkK,qBAC9C74B,UAAUmD,aAAaprD,GAAG,aAAc6gF,wBAAwB,GAChE54B,UAAUmD,aAAaprD,GAAG,OAAQ6gF,wBAAwB,GAC1D,IAAIK,aAAe,CACjBC,eAAgB/d,iBAChBge,WAAYR,kBACZS,OAAQJ,UAEVh5B,UAAUmD,aAAaprD,GAAGkhF,aAC5B,CAoBAruB,GACOnyJ,OAAOsX,iBAAiB,CAC7Bi+H,QAVY,YAXO,WACnBkR,WAAW9rD,IAAIv2F,OAAO+W,SAASY,eAAgBqkK,qBAC/C74B,UAAUmD,aAAa/vD,IAAI,aAAcwlF,wBAAwB,GACjE54B,UAAUmD,aAAa/vD,IAAI,OAAQwlF,wBAAwB,GAC3D,IAAIK,aAAe,CACjBC,eAAgB/d,iBAChBge,WAAYR,kBACZS,OAAQJ,UAEVh5B,UAAUmD,aAAa/vD,IAAI6lF,aAC7B,CAEEI,EACF,GASG,CAAC,EACN,EAoBIC,kBAAoB,GACpBC,uBAAyB,EAsCzBC,eAAiB/gL,OAAOsX,iBAAiB,CAC3C0pK,SAtCe,SAAkBC,gBAAiBC,mBAAoBC,gBACtEA,eAAe5pF,IAAI,CACjB,cAAe0pF,gBAAgBrvC,uBAC/Bt9F,MAAO2sI,gBAAgBjvC,UAAU7pH,aAEnCg5J,eAAezpJ,KAAK,QAAQ6/D,IAAI,CAC9B6pF,WAAYH,gBAAgB9xG,gBAAgBhnD,aAE9Cg5J,eAAexyE,SAAS+vB,WAAWiD,gBAC/Bs/C,gBAAgBxxH,WAAa6oH,yBAE/B4I,mBAAmB3pF,IAAI,aAAc0pF,gBAAgB9xG,gBAAgBl1B,eACrEinI,mBAAmBvyE,SAAS+vB,WAAWwC,oBACvCggD,mBAAmBnyE,YAAY2vB,WAAWrmC,MAE9C,EAwBEgpF,SAvBe,SAAkBC,iBAAkBH,eAAgBI,2BAC/DA,0BACFJ,eAAe5pF,IAAI,QAAS,GAAG9qF,OAAO60K,iBAAkB,QAExDR,uBAAyB7xK,KAAKg3F,KAzBK,IAyBAq7E,kBACnCH,eAAe5pF,IAAI,QAASupF,uBAAyB,MAEzD,EAiBEU,SAhBe,SAAkBP,gBAAiBQ,YAAaP,oBAC/D,IAAInyH,SAAW9/C,KAAK8kC,MAAMktI,gBAAgBlyH,SAAW0yH,aAGrD,GAFA1yH,SAAW9/C,KAAKglC,IAAIhlC,KAAKsoB,IAAI0pJ,gBAAgBnvC,YAAa/iF,UAAWkyH,gBAAgBlvC,aACrF8uC,kBAAoB9xH,SAChBkyH,gBAAgBxxH,WAAa6oH,uBAAwB,CACvD,IAAIoJ,kBAAoBzyK,KAAKg3F,KAhCL,EAgCU46E,kBAjCE,IAkCpCK,mBAAmB3pF,IAAI,SAAU,GAAG9qF,OAAOi1K,kBAAmB,MAChE,CACAR,mBAAmB3pF,IAAI,YAAa,GAAG9qF,OAAOo0K,kBAAmB,MACnE,EAQEhxI,QAPc,SAAiBge,QAASszH,gBACxCA,eAAe7gF,KAAK,SAAWzyC,QAAQ9d,WAAWhmB,QAAQ,QAAS,aAAe,UACpF,GAMG,CACD43J,eAAgB,CACd3+K,IAAK,WACH,OAAO69K,iBACT,GAEFe,aAAc,CACZ5+K,IAAK,WACH,OAAO89K,sBACT,KAOAe,gBAAkB,GAClBC,qBAAuB,EAoCvBC,eAAiB/hL,OAAOsX,iBAAiB,CAC3C0pK,SApCa,SAAkBC,gBAAiBC,mBAAoBC,gBACpEA,eAAe5pF,IAAI,CACjB,cAAe86C,4BAA4BlC,kBAC3C77F,MAAO+9F,4BAA4B9B,mBAErC4wC,eAAezpJ,KAAK,QAAQ6/D,IAAI,CAC9B6pF,WAAY/uC,4BAA4B7B,iBAE1C2wC,eAAexyE,SAAS+vB,WAAWkD,gBAC/Bq/C,gBAAgBxxH,WAAa6oH,yBAE/B4I,mBAAmB3pF,IAAI,aAAc86C,4BAA4B7B,eAAev2F,eAChFinI,mBAAmBvyE,SAAS+vB,WAAWwC,oBACvCggD,mBAAmBnyE,YAAY2vB,WAAWrmC,MAE9C,EAsBEgpF,SArBa,SAAkBC,iBAAkBH,eAAgBI,2BAC7DA,0BACFJ,eAAe5pF,IAAI,QAAS,GAAG9qF,OAAO60K,iBAAkB,QAExDQ,qBAAuB7yK,KAAKg3F,KAzBK,GAyBAq7E,kBACjCH,eAAe5pF,IAAI,QAASuqF,qBAAuB,MAEvD,EAeEN,SAda,SAAkBP,gBAAiBQ,YAAaP,oBAE7D,GADAW,gBAAkBZ,gBAAgBpvC,4BAC9BovC,gBAAgBxxH,WAAa6oH,uBAAwB,CACvD,IAAIoJ,kBAAoBzyK,KAAKg3F,KA9BP,EA8BY47E,gBA/BA,IAgClCX,mBAAmB3pF,IAAI,SAAU,GAAG9qF,OAAOi1K,kBAAmB,MAChE,CACAR,mBAAmB3pF,IAAI,YAAa,GAAG9qF,OAAOo1K,gBAAiB,MACjE,EAQEhyI,QAPY,SAAiBge,QAASszH,gBACtCA,eAAe7gF,KAAK,SAAWzyC,QAAQ9d,WAAa,UACtD,GAMG,CACD4xI,eAAgB,CACd3+K,IAAK,WACH,OAAO6+K,eACT,GAEFD,aAAc,CACZ5+K,IAAK,WACH,OAAO8+K,oBACT,KAUAE,kCANiB,WACnB,OAAI9uD,oBAAoBzC,yBACfsxD,eAEFhB,cACT,EAqTIkB,sBAlSe,SAAsBx7B,WAAYw6B,gBAAiBzpC,iBAAkB0qC,iBACtF,IASIC,uBATAC,QAAUvmE,0BACVq5C,WAAap6C,EAAEsnE,QAAQvhL,UACvBwhL,oBAAsB57B,WAAW/uH,KAAK,YACtC4qJ,gBAAkB77B,WAAW/uH,KAAK,gBAClC6qJ,aAAe,EAEfC,SAAWvB,gBAAgBxxH,WAAa6oH,wBAAgCplD,oBAAoBhK,qBAC5Fu5D,sBAAwB,EACxBC,uBAAyB,EAEzBnP,kBAAmB,EACnBoP,wBAA0B,CAC5B7iL,EAAG,EACH0B,EAAG,GAEDohL,iCAAmC,CACrCjhL,MAAO,EACPC,OAAQ,GAENihL,yBAA2B,CAC7Bj7F,IAAK,EACL2gB,KAAM,GAEJu6E,uBAAyB,CAC3Bl7F,IAAK,EACL2gB,KAAM,GAEJw6E,yBAA2B,WAC7BN,sBAAwB,EACxBO,cAAcN,uBAAwBP,uBACxC,EACIc,qBAAuB,SAASA,uBAClCX,gBAAgB/qF,IAAI,CAClB3P,IAAKk7F,uBAAuBl7F,IAAM,IAClC2gB,KAAMu6E,uBAAuBv6E,KAAO,MAElCgrE,kBACF6O,QAAQn6K,sBAAsBg7K,qBAElC,EACIC,6BAA+B,SAAsCv9K,OACvE,OAAIA,MAAM64F,eAAgD,IAA/B74F,MAAM64F,cAAcp9F,OACtC,CACLtB,EAAG6F,MAAM64F,cAAc,GAAGT,MAC1Bv8F,EAAGmE,MAAM64F,cAAc,GAAGR,OAGvB,CACLl+F,EAAG6F,MAAMpE,QACTC,EAAGmE,MAAMlE,QAEb,EACIuyK,iBAAmB,SAASA,iBAAiBpzK,GAC/CA,EAAEiG,iBACFjG,EAAEs6F,2BACFq4E,kBAAmB,EACnB+O,gBAAgBvzE,YAAY2vB,WAAW+C,yBACvCyzB,WAAWv6D,IAAI,wBAAyBwoF,eACxCjuB,WAAWv6D,IAAI,wCAAyCq5E,kBACxD/hK,YAAW,WACTw0I,WAAWtrD,QAAQ/2F,OAAOmd,SAASM,QACrC,GA1E+B,IA2EjC,EACIshK,cAAgB,SAAuBviL,GACzCA,EAAEiG,iBACF,IAAIu8K,MAAQF,6BAA6BtiL,EAAEu8F,eACvCkmF,YAAcD,MAAMtjL,EAAI6iL,wBAAwB7iL,EAChDwjL,YAAcF,MAAM5hL,EAAImhL,wBAAwBnhL,EAChD+hL,eAAiBF,YAAcT,iCAAiCjhL,MAlF5B,IAmFpC6hL,eAAiBF,YAAcV,iCAAiChhL,OAnF5B,IAoFxCkhL,uBAAuBl7F,IAAMi7F,yBAAyBj7F,IAAM47F,eAC5DV,uBAAuBv6E,KAAOs6E,yBAAyBt6E,KAAOg7E,eAC9D,IACIE,mBAvFoC,IAsFZzB,oCAAoCJ,aAAegB,iCAAiCjhL,MAtFxE,IAwFxCmhL,uBAAuBl7F,IAAMk7F,uBAAuBl7F,IAAM,EAAI,EAAIk7F,uBAAuBl7F,IACzFk7F,uBAAuBl7F,IAAMk7F,uBAAuBl7F,IA1FvB,MA0FuFk7F,uBAAuBl7F,IAC3Ik7F,uBAAuBv6E,KAAOu6E,uBAAuBv6E,KAAO,EAAI,EAAIu6E,uBAAuBv6E,KAC3Fu6E,uBAAuBv6E,KAAOu6E,uBAAuBv6E,KAAOk7E,mBAAqBA,mBAAqBX,uBAAuBv6E,IAC/H,EACIwrE,mBAAqB,SAA4BnzK,GACnDA,EAAEiG,iBACFjG,EAAEs6F,2BACFurD,WAAWtrD,QAAQ/2F,OAAOmd,SAASK,WACnC0gK,gBAAgB3zE,SAAS+vB,WAAW+C,yBACpC4gD,oBAAoB1zE,SAAS+vB,WAAW8C,wBACxC,IAAIkiD,oBAAsBrB,oBAAoBsB,aAC1CC,qBAAuBvB,oBAAoB7qB,cAC3CqsB,qBAAuBxB,oBAAoB71J,SAC3Cs3J,kBAAoBxB,gBAAgB91J,SACpC42J,MAAQF,6BAA6BtiL,EAAEu8F,eAC3CwlF,wBAAwB7iL,EAAIsjL,MAAMtjL,EAClC6iL,wBAAwBnhL,EAAI4hL,MAAM5hL,EAClCohL,iCAAiCjhL,MAAQ+hL,oBACzCd,iCAAiChhL,OAASgiL,qBAC1C,IAAIG,YAAcD,kBAAkBl8F,IAAMi8F,qBAAqBj8F,KAAOg8F,qBA5G9B,IA6GpCI,aAAeF,kBAAkBv7E,KAAOs7E,qBAAqBt7E,MAAQm7E,oBA7GjC,IA8GxCb,yBAAyBj7F,IAAMm8F,WAC/BlB,yBAAyBt6E,KAAOy7E,YAChClB,uBAAuBl7F,IAAMm8F,WAC7BjB,uBAAuBv6E,KAAOy7E,YAC9B9uB,WAAW51D,GAAG,wBAAyB6jF,eAGvCjuB,WAAW51D,GAAG,wCAAyC00E,kBACvDT,kBAAmB,EACnB0P,sBACF,EACIzY,iBAAmB,SAA0B5pK,EAAGkpK,WAClDlpK,EAAEiG,iBACFo9K,WAAWna,UAAU1gD,iBACrB86D,uBACF,EACIC,wBAA0B,WAIxBlD,gBAAgBxxH,WAAa6oH,wBAC/B7xB,WAAW,GAAGv3E,MAAMi5B,YAAYo6B,aAAaY,qBAAsB,GAAG12H,OAAOwC,KAAK8kC,MAAMsuI,oBAAoBzgL,UAAW,MAE3H,EAgCIqiL,WAAa,SAAoB/vK,QACrB,IAAVA,OAAkB+sK,gBAAgB7uC,aACpCgyC,aAZFzB,wBAAwB7iL,EAAI6iL,wBAAwBnhL,EAAI,EACxDohL,iCAAiCjhL,MAAQihL,iCAAiChhL,OAAS,EACnFihL,yBAAyBj7F,IAAMi7F,yBAAyBt6E,KAAO,EAC/Du6E,uBAAuBl7F,IAAMk7F,uBAAuBv6E,KAAO,EAC3D85E,oBAAoBtzE,YAAY2vB,WAAW8C,wBAC3C8gD,gBAAgB/qF,IAAI,CAClB3P,IAAK,GACL2gB,KAAM,KAON85E,oBAAoBtzE,YAAY2vB,WAAWrmC,OAE3CgqF,oBAAoB1zE,SAAS+vB,WAAWrmC,MAE1CmqF,SAAWtuK,KACb,EAcIgwK,sBAAwB,SAA+BG,0BACrDpD,gBAAgB7uC,eACe,IAA7BiyC,0BACFD,aAGEnD,gBAAgBxxH,WAAa6oH,wBAC/BgK,gBAAgB3nF,MAGtB,EACIypF,WAAa,WACf9B,gBAAgBvzE,YAAY,CAAC2vB,WAAWiD,eAAgBjD,WAAWkD,iBACnEogD,oCAAoChB,SAASC,gBAAiBoB,oBAAqBC,gBACrF,EACIgC,aAAe,WACQ,OAArB9sC,mBAGJwqC,oCAAoCR,SAASP,gBAAiBsB,aAAcF,qBAC5EL,oCAAoCX,SAAS7pC,iBAAiBkQ,WAAa66B,aAAcD,gBAAiBrB,gBAAgBxxH,WAAa6oH,wBACvI7xB,WAAWtrD,QAAQ/2F,OAAOmd,SAASO,SACrC,EACIkhK,cAAgB,SAAuBl4E,YAAa60E,YAAa4E,0BACnE,GAAKtD,gBAAgB7uC,YAArB,CAIAswC,uBAAyB53E,YACzBq3E,uBAAyBxC,YACzB,IAAI6E,iBAAmB,EAUvB,GATA1pE,EAAEv6B,KAAK0gG,gBAAgBpiH,kBAAkBhN,mBAAmBxB,kBAAkBnC,UAAU,SAAU/sD,EAAG0sD,cAE9E/qD,IAAjB+qD,QAAQrb,MAAsBqb,QAAQrb,OAASmtI,aAG/C9xH,QAAQxc,WAAay5D,aAAeA,aAAej9C,QAAQ1a,UAC7DqxI,gBAAkBrjL,EAEtB,KACyB,IAArBqjL,gBAIF,OAHAlC,gBAAgB3zE,SAAS+vB,WAAWrmC,MACpCiqF,gBAAgBhiF,KAAK,SACrBmiF,sBAAwB,GAG1B,GAAI8B,0BAA4BC,kBAAoB/B,qBAAsB,CACxEA,qBAAuB+B,gBACvB,IAAIjyH,WAAa0uH,gBAAgBpiH,kBAAkBhN,mBAAmBxB,kBAAkBnC,SAASs2H,iBACjG,IAAMjyH,aAAcA,WAAWxiB,WAG7B,OAFAuyI,gBAAgB3zE,SAAS+vB,WAAWrmC,WACpCiqF,gBAAgBhiF,KAAK,IAGvBgiF,gBAAgBvzE,YAAY2vB,WAAWrmC,MACvCgqF,oBAAoBtzE,YAAY2vB,WAAW2C,4BAA8B,IAAM3C,WAAW4C,8BAAgC,IAAM5C,WAAW6C,8BAC3I8gD,oBAAoB1zE,SAlEU,SAAqCv8D,qBACrE,OAAQA,qBACN,KAAKmmI,uBACH,OAAO75C,WAAW2C,4BACpB,KAAKk3C,wBACH,OAAO75C,WAAW6C,6BACpB,QACE,OAAO7C,WAAW4C,8BAExB,CAyDiCmjD,CAA4BlyH,WAAWngB,sBAChE6uI,gBAAgBxxH,WAAa6oH,yBAC/B+J,oBAAoBtzE,YAAY2vB,WAAWyC,yBAA2B,IAAMzC,WAAW0C,6BACvFihD,oBAAoB1zE,SAAmCp8C,WAAWjgB,oBAvEzCimI,sBAAwB75C,WAAWyC,yBAA2BzC,WAAW0C,8BAyEpG4gD,oCAAoCnyI,QAAQ0iB,WAAY+vH,iBACxD8B,aACAE,eACA79B,WAAWtrD,QAAQ/2F,OAAOmd,SAASG,QAAS6wC,WAC9C,CAtCA,MAFE+vH,gBAAgBhiF,KAAK,GAyCzB,EAyBA,OAjJwB,WACtB,GAAI2gF,gBAAgBxxH,WAAa6oH,uBAAwB,CACvD,IAAI5tB,aAAejE,WAAW/uH,KAAK,kBAAkB8oD,QACrD6hG,oBAAoB5gF,YAAYipD,aAClC,CACF,CAsIAg6B,GApIEj+B,WAAWnnD,GAAGl7F,OAAOmd,SAASC,QAASgpJ,kBACvC/jB,WAAWnnD,GAAGl7F,OAAOmd,SAASI,gBAAiBohK,0BAC/Ct8B,WAAWnnD,GAAGl7F,OAAOmd,SAASO,QAASqiK,yBACnCjC,iBAAmBjB,gBAAgBxxH,WAAa6oH,wBAClDgK,gBAAgBhjF,GAAG,uBAAwBy0E,oBAkI/CqQ,aACKlC,iBACHG,oBAAoB1zE,SAAS+vB,WAAWgD,4BAEnC1hI,OAAOsX,iBAAiB,CAC7B0rK,cACAkB,sBACAS,uBA3B2B,WACF,OAArBntC,kBAGAA,iBAAiBmT,2BACnB03B,oBAAoB1zE,SAAS+vB,WAAWrmC,MACxCm/C,iBAAiB2S,iBAAiB82B,gBAAgBpiH,kBAAkBxQ,+BAExE,EAoBEu2H,uBAnB2B,WACF,OAArBptC,kBAGAA,iBAAiBmT,2BACnB03B,oBAAoBtzE,YAAY2vB,WAAWrmC,MAC3Cm/C,iBAAiB6S,iBAAiB42B,gBAAgBpiH,kBAAkBxQ,+BAExE,EAYEknF,QAxIY,WACZkR,WAAW9rD,IAAIv2F,OAAOmd,SAASC,QAASgpJ,kBACxC/jB,WAAW9rD,IAAIv2F,OAAOmd,SAASI,gBAAiBohK,0BAChDt8B,WAAW9rD,IAAIv2F,OAAOmd,SAASO,QAASqiK,yBACxC7B,gBAAgB3nF,KAClB,GAoIG,CACD8b,QAAS,CACPzzG,IAAK,WACH,OAAOw/K,QACT,EACA7/K,IAAKshL,YAEPxiH,MAAO,CACLz+D,IAAK,WACH,OAAOu/K,YACT,EACA5/K,IAAK,SAAa8+K,aAChBc,aAAed,YACf6C,cACF,IAGN,EA+MIO,2BAlLoB,SAA2Bp+B,WAAYc,UAAWzc,SAAUzO,UAAWyoD,gBAE7F,KADkBh6C,UAAYA,SAAS0I,iBAAmBsxC,eAAen0H,cAEvE,MAAM,IAAI95C,MAAM,kEAElB,IACIkuK,cACAC,WAAav+B,WAAW/uH,KAAK,6BAC7ButJ,iBAAmB,SAA0Bx0C,kBAC/Cs0C,cAAgB9C,sBAAsBx7B,WAAYq+B,eAAgBv9B,UAAWA,UAAUyD,wBACzEk5B,uBAAsB,GAChCzzC,kBAAoB6nC,wBACtB0M,WAAWr2E,SAAS+vB,WAAWwC,oBAEjCulB,WAAWtrD,QAAQ/2F,OAAO+W,SAASuB,sBAAuB,CACxD+xJ,sBAAuBh+B,kBAAoB6nC,uBAC3Cc,oBAAqB3oC,iBAEzB,EASIy0C,qBAAuB,SAA8B15H,OACvD,OAAOA,WACT,EAmBIg/G,iBAAmB,SAA0B5pK,EAAGkpK,WAClDlpK,EAAEiG,iBACFijK,UAAUS,gBAAkB5E,4BA7CS,iBA6CqDmE,UAAU1gD,gBACtG,EACI+7D,eAAiB,WACnB,GAAK59B,gBAAwCzkJ,IAA3BykJ,UAAUmD,gBAA8BnD,UAAUI,aAAe,KAGnFm9B,eAAevzC,+BAA+BkV,WAAW9kJ,QAAS8kJ,WAAW7kJ,UACzEmjL,eAAe,CAEjB,IAAIK,eAAiBN,eAAer0C,kBAAoB6nC,uBAAyB7xB,WAAac,UAAUmD,aACxGq6B,cAActjH,MAAQwlF,mCAAmCM,UAAW69B,eAAezjL,QAASyjL,eAAexjL,SAC7G,CACF,EACIyjL,eAAiB,SAAwBv6B,0BAA2By5B,0BACtE,IAAI5E,YAActjD,UAAUyB,WAAazB,UAAUkB,aAAavC,MAAQ,KACxE+pD,cAAc/B,cAAcl4B,0BAA2B60B,YAAa4E,yBACtE,EACIljB,eAAiB,WACnB8jB,gBACF,EACIpT,mBAAqB,WACvBoT,gBACF,EACIziB,iBAAmB,WACrByiB,gBACF,EACIjF,kBAAoB,WACtBmF,eAAe99B,UAAUuD,2BAA2B,EACtD,EACIy1B,SAAW,WACb8E,eAAe99B,UAAUuD,2BAA2B,EACtD,EACIuuB,aAAe,SAAsB1zK,MAAOmkK,WAC1Cib,eAAiBA,cAActuE,UAC7BqzD,UAAUkG,cACZ+U,cAAcJ,yBAEdI,cAAcH,yBAGpB,EACIU,kBAAoB,WAClBP,eACFA,cAAcb,uBAElB,EA0EA,OAPIp5C,UA1IFg6C,eAAe5zC,YAAYpG,UAC3Bm6C,iBAAiBn6C,SAAS2F,mBAL1Bq0C,eAAexzC,eACf2zC,iBAAiBH,eAAer1H,WA2Ef,WACjBq1H,eAAet+K,iBAAiBpC,OAAO2d,eAAeC,gBAAiBsjK,mBACvE7+B,WAAWnnD,GAAGl7F,OAAO+W,SAASG,iBAAkBy2J,oBAChDtrB,WAAWnnD,GAAGl7F,OAAO+W,SAASe,YAAamlJ,gBAC3C5a,WAAWnnD,GAAGl7F,OAAO+W,SAASa,WAAYq9J,cAC1C5yB,WAAWnnD,GAAGl7F,OAAOmd,SAASC,QAASgpJ,kBACvCjjB,UAAUmD,aAAaprD,GAAG,aAAc4gF,mBAAmB,GAC3D34B,UAAUmD,aAAaprD,GAAG,OAAQ4gF,mBAAmB,GACrD,IAAIM,aAAe,CACjBC,eAAgB/d,iBAChBge,WAAYR,kBACZS,OAAQJ,UAEVh5B,UAAUmD,aAAaprD,GAAGkhF,aAC5B,CAyDAruB,GAzIuB,WACrB,IAAIozB,mCAAqC5f,4BA1BJ,kBA2BrC4f,mCAAqCA,mCAA4E,SAAvCA,wCAAgDziL,EAC1H,IACI0iL,aADAC,qBAAuBvyD,oBAAoBhK,qBAG7Cs8D,aADEtyD,oBAAoB7J,yCACP67D,qBAAqBO,uBAAwBA,qBACnDP,qBAAqBK,oCACfA,qCACNL,qBAAqBO,uBACfA,qBAIjBh/B,WAAWtrD,QAAQ/2F,OAAOmd,SAASE,YAAa,CAC9C2nG,gBAAiBo8D,cAErB,CAyHAE,GACO1lL,OAAOsX,iBAAiB,CAC7Bi+H,QAZY,YA/CO,WACnBuvC,eAAep+K,oBAAoBtC,OAAO2d,eAAeC,gBAAiBsjK,mBAC1E7+B,WAAW9rD,IAAIv2F,OAAO+W,SAASG,iBAAkBy2J,oBACjDtrB,WAAW9rD,IAAIv2F,OAAO+W,SAASe,YAAamlJ,gBAC5C5a,WAAW9rD,IAAIv2F,OAAO+W,SAASa,WAAYq9J,cAC3C5yB,WAAW9rD,IAAIv2F,OAAOmd,SAASC,QAASgpJ,kBACxCjjB,UAAUmD,aAAa/vD,IAAI,aAAculF,mBAAmB,GAC5D34B,UAAUmD,aAAa/vD,IAAI,OAAQulF,mBAAmB,GACtD,IAAIM,aAAe,CACjBC,eAAgB/d,iBAChBge,WAAYR,kBACZS,OAAQJ,UAEVh5B,UAAUmD,aAAa/vD,IAAI6lF,aAC7B,CAkCEI,GACAmE,eAAiBA,cAAcxvC,SACjC,EAUEowC,qBA7CyB,WACzB,OAAOb,eAAen0H,aAAaN,iBACrC,EA4CEu1H,gBA3CoB,WACpB,OAAOd,eAAen0H,YACxB,EA0CEk1H,gBAzCoB,SAAyB3xK,OAC7C4wK,eAAen0H,aAAez8C,MAC1B6wK,eACFA,cAAcb,uBAElB,EAqCEtuC,mBApCuB,WACvB,OAAOmvC,cAAgBA,cAActuE,QAAUyc,oBAAoBhK,oBACrE,EAmCE2sB,mBAlCuB,SAA4B3hI,OAC/C6wK,eACFA,cAActuE,QAAUviG,MACxB6wK,cAAcb,wBACdmB,eAAe99B,UAAUuD,2BAA2B,IAEpD53B,oBAAoB/J,mBAAmBj1G,OAEzC,IAAI4xK,oBAAsB5xK,OAAS4wK,eAAe1yC,YAClDqU,WAAWtrD,QAAQ/2F,OAAO+W,SAASuB,sBAAuB,CACxD+xJ,sBAAuBqX,qBAAuBhB,eAAer0C,kBAAoB6nC,uBACjFc,oBAAqB0L,eAAer0C,kBAEtCgW,WAAWtrD,QAAQ/2F,OAAOmd,SAASE,YAAa,CAC9C2nG,gBAAiB08D,qBAErB,GAmBG,CAAC,EACN,EAiBIC,YAAc,4JAUdC,yBATa,SAAoBvmJ,MACnC,MAAoB,iBAATA,KACFA,KAAK1V,QAAQ,KAAM,SAASA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,UAAUA,QAAQ,KAAM,UAEhH0V,IACT,EAIIumJ,2BAHe,SAAsBC,OACvC,OAAOF,YAAY97J,KAAKg8J,MAC1B,EAMIC,WAAY,IAAI7tJ,MAAO8tJ,kBACvBC,eAAiB,gBAAkBF,UACnCG,eAAiB,gBAAkBH,UACnCI,yBAA2BF,eAAiB,KAAOC,eACnDE,cAAgB,IAAIz8J,OAAOs8J,eAAgB,KAC3CI,cAAgB,IAAI18J,OAAOu8J,eAAgB,KAC3CI,aAAe,sBACfC,sBAAwB,SAA+BjnJ,KAAMknJ,aAC/D,IAAIC,gCAAkCnnJ,KAAK1V,QAAQ48J,YAAaL,0BAEhE,OADoBN,yBAAyBY,iCACxB78J,QAAQw8J,cAAe,oCAAoCx8J,QAAQy8J,cAAe,UACzG,EAgCIK,8BAVqB,SAA4BzsJ,IAAK0sJ,cACxDA,aAAeA,aAAalrJ,cAC5B,IAAImrJ,cAAgB3sJ,IAAI65G,aAAaxnI,OAAO2tB,IAAIu6G,cAAcloI,OAAO2tB,IAAI+5G,qBAMzE,OAHI/5G,IAAIu6G,aAAavzI,OAAS,GAAKg5B,IAAI85G,oBAAoB9yI,OAAS,IAClE2lL,cAAgBA,cAAct6K,OAAO2tB,IAAI85G,sBA3B1B,SAAsBlhF,MAAO8zH,cAC9C,IAAI7kG,QAAU,GACd,IAAK6kG,aACH,OAAO7kG,QAET,IAAI0kG,YAAc,IAAI78J,OAAO,IAAMg9J,aAAa/8J,QAAQ08J,aAAc,QAAU,IAAK,MAcrF,OAbAzzH,MAAM1wD,SAAQ,SAAU04D,MACtB,IAAIgsH,SAAWhsH,KAAKlrB,WAAakrB,KAAKv7B,MAAQu7B,KAAKh3D,MAAQ,IACL,IAAlDgjL,SAASprJ,cAAc1mB,QAAQ4xK,eACjC7kG,QAAQ39E,KAAK,CACX2iL,QAASD,SACTvnJ,KAAMinJ,sBAAsBM,SAAUL,aACtCt1I,UAAW2pB,KAAK3pB,UAChBmB,KAAMwoB,KAAKxoB,KACX00I,SAAUlsH,KAAKtoB,MACfy0I,UAAWnsH,KAAKhoB,gBAGtB,IACOivC,OACT,CASSmlG,CAAaL,cAAeD,aACrC,EAgeIO,iBAhdU,SAAiB5gC,WAAY3b,UACzC,IAyI2DroE,qBAzIvD6kH,cAAe,EACfC,aAAc,EACdC,cAAe,EACfC,cAAe,EACfz2C,eAAiB,CAAC,EAClBksB,cAAe,EAEfwqB,mBAAqB,KACrBC,kBAAoB,KACpBC,cAAgB,KAChBC,cAAgB,KAChBC,oBAAsB,KACtBC,uBAAyB,KACzBC,sBAAwB,KACxBC,4BAA8B,KAC9BC,aAAe,KACfC,8BAAgC,KAChCC,iBAAmB,KACnBC,eAAiB,KACjBC,uBAAyB,KACzBhK,KAAOxzC,SACPy9C,gBAAkB,KAClBC,aAAe,KACfC,wBAA0B,CAC5B3oL,EAAG,EACH0B,EAAG,GAsBDulJ,SAAW,SAAkB2hC,gBAC3BA,eACFL,eAAe3xF,MAAK,GAAM,GAAMwW,OAAOw7E,gBAEvCL,eAAejwF,OAEjBkvF,cAAe,CACjB,EACIxgC,SAAW,SAAkB4hC,gBAC3BA,eACFL,eAAe3xF,MAAK,GAAM,GAAMyW,QAAQu7E,gBAExCL,eAAehwF,OAEjBivF,cAAe,CACjB,EACIqB,SAAW,WACbpB,aAAc,EACdxgC,WACA6hC,YACF,EAQIA,WAAa,WACf,IAAIC,aAAenB,mBAAmB9lL,SAGlCknL,eAFkBriC,WAAW7kJ,SACP6kJ,WAAW/uH,KAAK,6BAA6B91B,SAEvE6kJ,WAAW,GAAGv3E,MAAMi5B,YAAYo6B,aAAac,aAAc,IAAI52H,OAAOwC,KAAK8kC,MAAM+0I,gBAAiB,OAClGb,4BAA4B1wF,IAAI,MAAOsxF,aAAe,KACxD,EAsBIE,mBAAqB,WACvB,IAGIC,YACAC,aAJAC,WAAaV,aAAa7mL,MAC1BwnL,YAAcX,aAAa5mL,OAM3BunL,aAAeD,WACbA,WAAaE,KAEfJ,YAAcI,IACdH,aAAeE,aAFP,IAAwBD,cAIhCF,YAAcE,WACdD,aAAeE,aAERA,YAAcC,KAEvBH,aAAeG,IACfJ,YAAcE,aAdM,GAYXA,WAXG,IAWuCC,eAInDF,aAAeE,YACfH,YAAcE,YAEhB,IAAIG,wBAA0B,mBAAqB/K,KAAKvqC,YAA1B,sBAAqEi1C,YAArE,cAAwGC,aAAxG,oBA7IlB,IA6IgLD,aAAe,EAA7K,oBA7IlB,IA6I0OA,aAAe,EAAI,MACrQM,mBAAqBxuE,EAAE,UAAW,CACpC,MAAS,2BACT5rC,MAAOm6G,0BAETtB,uBAAuB9mF,OAAOqoF,oBAC9BvB,uBAAuB3vF,MACzB,EA4BImxF,eAAiB,WACfjL,KAAKvqC,aAxEF,IAAI9b,WAAU,SAAUhnG,QAAS8Z,SACtCy9I,aAAe,IAAIplB,OACN/rD,QAAU,WACrBtsE,QACF,EACAy9I,aAAapxE,OAAS,WACpBnmF,SACF,EACAu3J,aAAalpG,IAAMg/F,KAAKvqC,WAC1B,IAgEoBxpG,KAAKw+I,oBAA2B,OAAE,WAClDx9I,QAAQC,KAAK,gCAAiC8yI,KAAKvqC,YACrD,IAEF8zC,cAAcpoJ,KAAKyzF,oBAAoB1L,UAAYzqC,oBAAoBF,gBAAgB5J,kBAAkBmC,2BAC3G,EACIo0G,gBAAkB,WACpBtB,aAAa78F,OACf,EA4BIo+F,cAAgB,SAAuB/kC,QAASC,WAAY+kC,QAASC,QAASC,yBAA0BC,eAAgBplC,SAAUF,eACpI,IAGIulC,cAAgBxuC,wCAHF,aAAeouC,QACdC,QAAU,aAAeA,QAAU,GAEiCplC,eADlEE,SACgGA,SAAUC,QAASC,YACpIolC,SAAWjvE,EAAEA,EAAEtrB,UAAUs6F,gBAM7B,OALIvlC,iBAjCyB,SAAkCqlC,yBAA0BC,gBACzF,IAEIlrB,KAAOryH,OAAOu9I,eAAe/pL,GAC7BkqL,KAAO19I,OAAOu9I,eAAeroL,GAC7B0nL,WAAa58I,OAAOu9I,eAAeloL,OACnCwnL,YAAc78I,OAAOu9I,eAAejoL,QACpCqoL,WAAa,EAKjB,GAJIf,WAAaE,MACfa,WAAa,IAAmCf,WAChDA,WAAaE,KAEXD,YAAce,GAAiC,CACjD,IAAIC,mBAAqB,GAAoChB,YAC7Dc,WAAah7K,KAAKglC,IAAIg2I,WAAYE,mBACpC,CACA,IAAIC,IAAMR,yBAAyBhnB,WAAW,MAC9CgnB,yBAAyBjoL,MAAQunL,WAAae,WAC9CL,yBAAyBhoL,OAASunL,YAAcc,WAChDG,IAAI3oH,MAAMwoH,WAAYA,YAClB1B,gBACF6B,IAAI1pB,UAAU6nB,gBAAiB5pB,KAAMqrB,KAAMd,WAAYC,YAAa,EAAG,EAAGD,WAAYC,cAEtFiB,IAAIC,UAtBe,OAuBnBD,IAAIE,SAAS,EAAG,EAAGpB,WAAYC,aAEnC,CAQIoB,CAAyBX,yBAA0BC,gBACnDD,yBAAyBve,UAAUxgK,IAAI,sBACvCk/K,SAASryJ,KAAK,0BAA0B4pE,YAAYsoF,2BAE/CG,QACT,EAWIS,gBAAkB,WACpBhB,kBACyB,OAArBpB,mBAXJA,iBAAmB,GACJ9J,KAAKrqC,aACX3xI,SAAQ,SAAUmoL,SACzB,IAAIC,kBAAoBD,QAAQz3I,eAAiBnyC,SAASqN,cAAc,eAAYpL,EAChFyhJ,gBAAkBmmC,kBAClBjmC,SAAsC,cAA3B65B,KAAKtqC,oBAAsCuQ,cAC1D6jC,iBAAiB9jL,KAAKmlL,cAAczD,yBAAyByE,QAAQzmL,MAAOymL,QAAQzmL,KAAMymL,QAAQp5I,UAAWo5I,QAAQj4I,KAAMk4I,kBAAmBD,QAAQz3I,eAAgByxG,SAAUF,eAClL,KAOA4jC,8BAA8B7nF,KAAKvjB,oBAAoBF,gBAAgB5J,kBAAkBmC,4BACzF8yG,aAAajnF,OAAOmnF,iBACtB,EAaIuC,oBAAsB,SAA6B/pL,GACrDA,EAAEs6F,2BACFt6F,EAAEiG,iBACEw2G,WAAWD,oBAAsBqqE,cAGrCmD,cAAchqL,EAAE8S,cAClB,EACIk3K,cAAgB,SAAuBzkL,QACzC,GAAI6qI,eAAe65C,aAAc,CAC/B,IAAIC,eAAiBhwE,EAAE30G,QACnB4kL,aAAez+I,OAAOw+I,eAAetiG,KAAK,cAAgB,IAC1DwiG,aAAeF,eAAetiG,KAAK,aACvCwoD,eAAe65C,aAAaE,aAAcC,aAC5C,CACF,EACIC,qBAAuB,SAA8BrqL,GACvD6nL,wBAAwB3oL,EAAIc,EAAEu8F,cAAc57F,QAC5CknL,wBAAwBjnL,EAAIZ,EAAEu8F,cAAc17F,QAC5CgmL,cAAe,CACjB,EACIyD,qBAAuB,SAA8BtqL,GAEnDqO,KAAKC,IAAItO,EAAEu8F,cAAc57F,QAAUknL,wBAAwB3oL,IAtR3B,GAsRsEmP,KAAKC,IAAItO,EAAEu8F,cAAc17F,QAAUgnL,wBAAwBjnL,IAtRjI,GAyR/B67G,WAAWF,uBACdsqE,cAAe,EAEnB,EACI0D,kBAAoB,SAA2BvqL,GAEjD,GADAwqL,sBACIjiK,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAAS1xJ,OAAQ,CAChD,IAAIgmL,YAAcnD,aAAaxwJ,KAAK,UAChC2zJ,YAAYjqL,OAAS,EACvBiqL,YAAY7qG,QAAQmK,QAEpBu9F,aAAa7mF,MAAMinF,uBAEvB,CACF,EACI8C,oBAAsB,WACxB,GAA4B,KAAxBxD,cAAcz8I,MAAc,CAC9Bq+I,kBACA,IAAI8B,cAAgBzE,8BAA8BvI,KAAMsJ,cAAcz8I,OAClEogJ,sBAAwB,GAC5BD,cAAchpL,SAAQ,SAAU4kB,QAC9B,IAAIwjK,kBAAoBxjK,OAAOigK,UAAYtmL,SAASqN,cAAc,eAAYpL,EAC1EyhJ,gBAAkBmmC,kBAEtBa,sBAAsBjnL,KAAKmlL,cAAcviK,OAAOuY,KAAMvY,OAAO+/J,QAAS//J,OAAOmqB,UAAWnqB,OAAOsrB,KAAMk4I,kBAAmBxjK,OAAOigK,WADhH,EACqI5iC,eACtJ,IACA4jC,8BAA8B7nF,KAAKvjB,oBAAoBF,gBAAgB5J,kBAAkBkC,0BACzF+yG,aAAajnF,OAAOsqF,uBACpB,IACIC,uBAAyBzuG,oBAAoBF,gBAAgB5J,kBAAkBuH,sBACnFgxG,uBAAyBA,uBAAuBzhK,QAFb,aAEmDwhK,sBAAsBnqL,QAC5GqqL,kBAAkBD,uBACpB,MACElD,uBAAuBx9K,SACvB0/K,iBAEJ,EACIiB,kBAAoB,SAA2BtrC,WACjD,IAAI8hB,wBAA0B3mB,kDAAkD6E,WAC5E+hB,mBAAqBpnD,EAAEmnD,yBAC3Bxb,WAAWxlD,OAAOihE,oBAClBjwJ,YAAW,WACTiwJ,mBAAmBp3J,QACrB,GAAG,IACL,EACI4gL,YAAc,WAChB9D,cAAcz8I,IAAI,IAClBm9I,uBAAuBx9K,SACvB0/K,kBACA,IAAImB,qBAAuB5uG,oBAAoBF,gBAAgB5J,kBAAkBsH,mBACjFkxG,kBAAkBE,qBACpB,EAWIC,mBAAqB,WACvBpE,cAAe,EACf/gC,WAAWtrD,QAAQ/2F,OAAO+W,SAASS,SACnC6qI,WAAWtrD,QAAQ/2F,OAAO+W,SAASkC,kBAAmB,CACpDw8J,iBAAiB,GAErB,EACIgS,kBAAoB,WACtBrE,cAAe,EACf/gC,WAAWtrD,QAAQ/2F,OAAO+W,SAASU,QACnC4qI,WAAWtrD,QAAQ/2F,OAAO+W,SAASkC,kBAAmB,CACpDw8J,iBAAiB,GAErB,EACIiS,eAAiB,SAAwBlrL,GACtCs8J,cAGD/zI,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASb,MAAO/sI,KAAK4tI,SAAS1xJ,SAC7DzE,EAAEs6F,2BACFt6F,EAAEiG,iBACF+jL,cAAchqL,EAAE8S,eAEpB,EACIq4K,iBAAmB,SAA0BnrL,GAC1Cs8J,cAGD/zI,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASb,SACxCt1J,EAAEs6F,2BACFt6F,EAAEiG,iBAEN,EACImlL,0BAA4B,WAC9BvlC,WAAWtrD,QAAQ/2F,OAAO+W,SAASQ,UACrC,EACIwrJ,iBAAmB,SAA0BvmK,GAC1CiqK,mCAGD1hJ,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAAS3xE,SACpCmiG,eACEc,eAAe/iJ,GAAG,WAAa+iJ,eAAetlL,IAAInC,EAAEuF,QAAQ/E,OAAS,IACvEqlJ,WAAWtrD,QAAQ/2F,OAAO+W,SAAS0B,gBAErC4uK,kBAAkB1uG,oBAAoBF,gBAAgB5J,kBAAkByH,wBACxE+rE,WAAWtrD,QAAQ/2F,OAAO+W,SAASO,SAGzC,EACI2mJ,oBAAsB,WACxBgmB,eAAe7/F,KAAK,WAAYwC,SAASsvD,UACzC4iB,cAAe,CACjB,EACIoF,mBAAqB,WACvB+lB,eAAe7/F,KAAK,WAAYwC,SAASuvD,UACzC2iB,cAAe,CACjB,EAwCA,OAnZiB,WACfmrB,eAAiB5hC,WAAW/uH,KAAK,kBACjC,IAAIu0J,UAAY3wC,sCAChB+sC,eAAe/nF,KAAK2rF,WACpBvE,mBAAqBW,eAAe3wJ,KAAK,uBACzCkwJ,cAAgBS,eAAe3wJ,KA1BL,qBA2B1BmwJ,cAAgBQ,eAAe3wJ,KAAK,oBACpCiwJ,kBAAoBU,eAAe3wJ,KAAK,yBACxCowJ,oBAAsBO,eAAe3wJ,KAAK,wBAC1CqwJ,uBAAyBM,eAAe3wJ,KAAK,4BAC7CswJ,sBAAwBK,eAAe3wJ,KAAK,iCAC5CuwJ,4BAA8BI,eAAe3wJ,KAAK,iCAClDwwJ,aAAeG,eAAe3wJ,KAAK,0BACnCywJ,8BAAgCE,eAAe3wJ,KAAK,gCACpD4wJ,uBAAyBxtE,EAAE,gDAAkD/9B,oBAAoBF,gBAAgB5J,kBAAkBiC,2BAA6B,SAClK,CAiYAy0E,GA9QE0+B,eAAer5E,YAAY,QAAsD,UAA7CkkB,oBAAoBvJ,sBAGnDuJ,oBAAoBzK,mBACvBk/D,kBAAkBtvF,OA2EpBkxF,kBAnGyD9mH,qBAoGnC67G,KAAKxpC,iBAnGpB,IAAI7c,WAAU,SAAUhnG,SACzBqtJ,KAAKzpC,oBACP0zC,gBAAkB,IAAInlB,OACNhsD,OAAS,WACvBnmF,SACF,EACAs3J,gBAAgBlxE,QAAU,WACxBkxE,gBAAgBnxE,YAASt0G,EACzBylL,gBAAgBlxE,aAAUv0G,EAC1BylL,gBAAkB,KAClBt3J,SACF,EACAs3J,gBAAgBjpG,IAAM7c,sBAEtBxxC,SAEJ,KAmF6CsZ,KAAKigJ,iBAC9Ct3D,oBAAoB1J,qBACtBm/D,WAEFN,eAAe9qF,OAAM,SAAU38F,GAC7BA,EAAEq6F,iBACJ,IAqJAitF,aAAa5oF,GAAG,YAAa,YAAaqrF,qBAC1CzC,aAAa5oF,GAAG,QAAS,YAAawsF,gBACtC5D,aAAa5oF,GAAG,UAAW,YAAaysF,kBACxC7D,aAAa5oF,GAAG,cAAe,YAAa2rF,sBAC5C/C,aAAa5oF,GAAG,cAAe,YAAa4rF,sBAC5CjD,4BAA4B3oF,GAAG,SAAU0sF,2BACzCvlC,WAAWnnD,GAAG,UAAW6nE,kBACzB1gB,WAAWnnD,GAAGl7F,OAAO+W,SAASS,QAASymJ,qBACvC5b,WAAWnnD,GAAGl7F,OAAO+W,SAASU,OAAQymJ,oBAClCpvC,oBAAoBzK,oBACtBm/D,cAActoF,GAAG,QAAS6rF,mBAC1BvD,cAActoF,GAAG,QAASssF,oBAC1B9D,oBAAoBxoF,GAAG,QAASosF,aAChCjlC,WAAWnnD,GAAG,OA/YU,oBA+YqBusF,mBAC7CplC,WAAWnnD,GAAGl7F,OAAOmd,SAASI,gBAAiBypK,sBAwB5CprL,OAAOsX,iBAAiB,CAC7B2/F,KAAM0xE,SACN1yG,MA5Wc,WACdsxG,aAAc,EACdzgC,UACF,EA0WE1uD,KAAM2uD,SACN1uD,KAAMyuD,SACNolC,gBA3WoB,WACpBtE,cAAclpF,MAChB,EA0WEytF,cAjHkB,WAClBxE,kBAAkBtvF,OAClB2vF,sBAAsB5vF,MACxB,EA+GEg0F,aA9GiB,WACbl5D,oBAAoBzK,oBACtBk/D,kBAAkBvvF,OAClB4vF,sBAAsB3vF,OAE1B,EA0GEg0F,OAAQzD,WACRpiL,iBApWqB,SAA0BD,UAAW4rI,eAC1D,GAA6B,mBAAlBA,cACT,MAAMt7H,MAAM,uEAEdm6H,eAAezqI,WAAa4rI,aAC9B,EAgWEzrI,oBA/VwB,SAA6BH,kBAC9CyqI,eAAezqI,UACxB,EA8VEgvI,QAhCY,WACZ2yC,aAAavtF,IAAI,YAAa,YAAagwF,qBAC3CzC,aAAavtF,IAAI,QAAS,YAAamxF,gBACvC5D,aAAavtF,IAAI,UAAW,YAAaoxF,kBACzC7D,aAAavtF,IAAI,cAAe,YAAaswF,sBAC7C/C,aAAavtF,IAAI,cAAe,YAAauwF,sBAC7CjD,4BAA4BttF,IAAI,SAAUqxF,2BAC1CvlC,WAAW9rD,IAAI,UAAWwsE,kBAC1B1gB,WAAW9rD,IAAIv2F,OAAO+W,SAASS,QAASymJ,qBACxC5b,WAAW9rD,IAAIv2F,OAAO+W,SAASU,OAAQymJ,oBACnCpvC,oBAAoBzK,oBACtBm/D,cAAcjtF,IAAI,QAASwwF,mBAC3BvD,cAAcjtF,IAAI,QAASixF,oBAC3BnlC,WAAW9rD,IAAI,OAhaS,oBAgasBkxF,mBAC9C/D,oBAAoBntF,IAAI,QAAS+wF,aACjCjlC,WAAW9rD,IAAIv2F,OAAOmd,SAASI,gBAAiBypK,qBAEpD,GAgBG,CACD1c,OAAQ,CACN1rK,IAAK,WACH,OAAOukL,WACT,GAEF9wE,QAAS,CACPzzG,IAAK,WACH,OAAOskL,YACT,GAEFzN,gBAAiB,CACf72K,IAAK,WACH,OAAOwkL,YACT,GAEF8E,yBAA0B,CACxBtpL,IAha2B,WAC7B,IAAI4nF,cAAgBktE,WAAWM,mBAC/B,OAAOxtE,gBAAkBy9F,eAAe,KAAOz9F,eAAiBkwB,EAAEl2G,SAASyjL,eAAe,GAAIz9F,eAChG,IAgaF,EA2LI2hG,mCAjK4B,SAAmC9lC,WAAYc,UAAWzc,SAAUzO,UAAW22C,uBAAwB9/C,qBAErI,KADyB4X,UAAYA,SAAS+I,oBAE5C,MAAM,IAAIh9H,MAAM,yGAElB,IACI21K,SACAjb,cACAkE,gBAKAgX,sBAAwB,WACtBD,SAAS9d,QACX8d,SAASH,QAEb,EACIhrB,eAAiB,WACnBorB,uBACF,EACI1a,mBAAqB,SAA4BnxK,EAAGkpK,WACtDyH,cAAgBzH,UAAUoH,aAC1Bub,uBACF,EACI/pB,iBAAmB,SAASA,mBAC9Bnb,UAAUmD,aAAa/vD,IAAI,iBAAkB+nE,kBACzC53B,SAASyI,aAAegU,UAAUvhJ,OAASiiJ,cAAcC,UAC3D8qB,uBAAuBpP,kBAAkB94B,SAASmJ,cAEpDw4C,wBACID,SAAS9d,QACXjoB,WAAWtrD,QAAQ/2F,OAAO+W,SAASM,QAEvC,EACIixK,iBAAmB,SAA0B3B,aAAcC,cAC7D,QAAqBloL,IAAjBkoL,aAA4B,CAC9B,IAAI2B,WAAatwD,UAAUe,mBAAmB4tD,cAC1C2B,aAAetwD,UAAUmB,kBAC3BipB,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMI,WAAY,CAC1CiuD,KAAM8+G,gBAGR1uD,UAAUmB,kBAAoBmvD,WAC9BlmC,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMa,eAEpC,MAAWy0G,oBAAoB5C,kBAAoBy6D,aAAexjC,UAAUz8C,cAC1E27C,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMI,WAAY,CAC1CiuD,KAAM8+G,cAGZ,EACI3f,WAAa,WACfohB,SAASv1E,MACX,EACI21E,QAAU,WACZJ,SAASv2G,OACX,EACI42G,wBAA0B,WACxBtb,gBAGEib,SAAS3S,iBACX2S,SAASN,kBACTj6K,WAAWw6K,sBAAuB,MAElCA,wBAGN,EAkBIK,iBAAmB,WACjBN,SAAS9d,QACX8d,SAASv2G,QAlBPu2G,SAASF,2BAGb7W,iBAAkB,EACd+W,SAAS9d,QACX8d,SAASn0F,KAvES,KAuFtB,EACI00F,iBAAmB,WAbjBtX,kBACFA,iBAAkB,EACd+W,SAAS9d,QACX8d,SAASp0F,KA9EO,KA0FtB,EACI40F,aAAe,WACbR,SAAS9d,QACX8d,SAASp0F,KA7FS,IA+FtB,EACI60F,aAAe,WACbT,SAAS9d,QACX8d,SAASn0F,KAlGS,IAoGtB,EACI60F,oBAAsB,SAA6BtsL,EAAG8mB,MACpDA,KAAK0jJ,WACPA,aAEAwhB,SAEJ,EA6CA,OAnJEJ,SAAWnF,iBAAiB5gC,WAAY3b,UACxC2b,WAAWtrD,QAAQ/2F,OAAO+W,SAASwB,mBAsGlB,WACjB6vK,SAAShmL,iBAAiB,eAAgBkmL,kBAC1CjmC,WAAWnnD,GAAGl7F,OAAO+W,SAASM,QAAS2vJ,YACvC3kB,WAAWnnD,GAAGl7F,OAAO+W,SAASO,QAASkxK,SACvCnmC,WAAWnnD,GAAGl7F,OAAO+W,SAASyB,kBAAmBswK,sBAC7C7vE,WAAWK,SAAWL,WAAWa,cACnCx+G,OAAO8G,iBAAiB,oBAAqBqmL,yBAE/CpmC,WAAWnnD,GAAGl7F,OAAOsb,SAASyB,WAAY2rK,kBAC1CrmC,WAAWnnD,GAAGl7F,OAAOsb,SAAS0B,WAAY2rK,kBAC1CtmC,WAAWnnD,GAAGl7F,OAAOsb,SAASG,OAAQmtK,cACtCvmC,WAAWnnD,GAAGl7F,OAAOsb,SAASlC,OAAQyvK,cACtCxmC,WAAWnnD,GAAGl7F,OAAO+W,SAASG,iBAAkBy2J,oBAChDtrB,WAAWnnD,GAAGl7F,OAAO+W,SAAS9B,aAAcgoJ,gBAC5C,IAAImf,aAAe,CACjBC,eAAgB/d,kBAElBnb,UAAUmD,aAAaprD,GAAGkhF,aAC5B,CAyBAruB,GACOnyJ,OAAOsX,iBAAiB,CAC7Bi+H,QAPY,YAnBO,WACnBi3C,SAAS9lL,oBAAoB,eAAgBgmL,kBAC7CjmC,WAAW9rD,IAAIv2F,OAAO+W,SAASM,QAAS2vJ,YACxC3kB,WAAW9rD,IAAIv2F,OAAO+W,SAASO,QAASkxK,SACxCnmC,WAAW9rD,IAAIv2F,OAAO+W,SAASyB,kBAAmBswK,sBAC9C7vE,WAAWK,SAAWL,WAAWa,cACnCx+G,OAAOgH,oBAAoB,oBAAqBmmL,yBAElDpmC,WAAW9rD,IAAIv2F,OAAOsb,SAASyB,WAAY2rK,kBAC3CrmC,WAAW9rD,IAAIv2F,OAAOsb,SAAS0B,WAAY2rK,kBAC3CtmC,WAAW9rD,IAAIv2F,OAAOsb,SAASG,OAAQmtK,cACvCvmC,WAAWnnD,GAAGl7F,OAAOsb,SAASlC,OAAQyvK,cACtCxmC,WAAW9rD,IAAIv2F,OAAO+W,SAASG,iBAAkBy2J,oBACjDtrB,WAAW9rD,IAAIv2F,OAAO+W,SAAS9B,aAAcgoJ,gBAC7C,IAAImf,aAAe,CACjBC,eAAgB/d,kBAElBnb,UAAUmD,aAAa/vD,IAAI6lF,aAC7B,CAEEI,GACA4L,UAAYA,SAASj3C,SACvB,GAKG,CAAC,EACN,EAiKI43C,mCApI4B,SAAmC1mC,WAAYlO,aAAc1oB,0BAC3F,IAUMipC,QAVFs0B,yBAA2B,KAC3BC,oBAAqB,EACrBC,iBAAkB,EAClBC,mBAAoB,EACpBC,uBAAyB,EACzBC,aAAe,WACjBl4C,UACAkR,WAAWtrD,QAAQ/2F,OAAO6d,iBAAiBC,OAC7C,EAMIwrK,2BAA6B,WAC1BzmI,MAAMmmI,yBAAyB57I,YAClC47I,yBAAyBtiF,YAAcytC,aAAaztC,YAExD,EACI6iF,+BAAiC,WACnCP,yBAAyB92C,OAASiC,aAAahC,MAAQ,EAAIgC,aAAajC,MAC1E,EAKIs3C,sBAAwB,WAC1BR,yBAAyBz4H,OAC3B,EACIk5H,eAAiB,WACnBH,4BACF,EACII,oBAAsB,WACxBR,iBAAkB,EAIlBS,YACAX,yBAAyB92C,OAAS,EAClCs3C,uBACF,EACItW,cAAgB,WAClBgW,iBAAkB,EAClBI,4BACF,EACIM,qCAAuC,WACzC,IAAIz1C,aAAalC,SAAUk3C,kBAA3B,CAGA,IAAInjJ,QAAUgjJ,yBAAyB53C,YACvB1yI,IAAZsnC,SACFA,QAAe,OAAE,WAAa,GAHhC,CAKF,EACI6jJ,aAAe,WA/BjBb,yBAAyB52C,aAAe+B,aAAa/B,aACrD42C,yBAAyBphB,oBAAsBzzB,aAAa/B,aAgC5Dk3C,4BACF,EACIQ,mBAAqB,WACnBZ,kBAGiBr+K,KAAKC,IAAIqpI,aAAaztC,YAAcsiF,yBAAyBtiF,cA1EjD,GA4E/B4iF,8BAEAC,iCACAK,wCAEJ,EACIG,gCAAkC,SAAyCvtL,EAAGkpK,WAChFlpK,EAAEiG,iBACFwmL,mBAAqBvjB,UAAUF,wBAC/BwjB,yBAAyB72C,OAAS82C,mBAClCK,6BACAM,sCACF,EACID,UAAY,WACdR,mBAAoB,EACfH,yBAAyB/2C,QAC5Bu3C,uBAEJ,EACIQ,aAAe,WACbb,kBACat+K,KAAKC,IAAIqpI,aAAaztC,YAAc0iF,wBAhGrB,IAkG5BD,mBAAoB,EACpBG,8BAGFF,uBAAyBj1C,aAAaztC,WAE1C,EAgBIyqC,QAAU,WACZ63C,yBAAyB1mL,oBAAoB,QAAS+mL,cACtDL,yBAAyB1mL,oBAAoB,SAAUwnL,oBACvDd,yBAAyB1mL,oBAAoB,QAASgnL,4BACtDjnC,WAAW9rD,IAAIv2F,OAAO6d,iBAAiBP,QAASysK,iCAChD51C,aAAa7xI,oBAAoB,UAAWmnL,gBAC5Ct1C,aAAa7xI,oBAAoB,UAAWonL,qBAC5Cv1C,aAAa7xI,oBAAoB,SAAUgnL,4BAC3Cn1C,aAAa7xI,oBAAoB,QAASknL,uBAC1Cr1C,aAAa7xI,oBAAoB,eAAgBinL,gCACjDp1C,aAAa7xI,oBAAoB,aAAcunL,cAC/C11C,aAAa7xI,oBAAoB,QAASknL,uBAC1Cr1C,aAAa7xI,oBAAoB,UAAWqnL,WAC5Cx1C,aAAa7xI,oBAAoB,aAAc0nL,aACjD,EAIA,OArHMt1B,QAAUxd,sDAAsDzrB,0BACpE42B,WAAW/uH,KAAK,oCAAoC4oE,KAAKw4D,UACzDs0B,yBAA2B3mC,WAAW/uH,KAAK,4BAA4B,IAmF9ClxB,iBAAiB,QAASinL,cACnDL,yBAAyB5mL,iBAAiB,SAAU0nL,oBACpDd,yBAAyB5mL,iBAAiB,QAASknL,4BACnDjnC,WAAWnnD,GAAGl7F,OAAO6d,iBAAiBP,QAASysK,iCAC/C51C,aAAa/xI,iBAAiB,UAAWqnL,gBACzCt1C,aAAa/xI,iBAAiB,UAAWsnL,qBACzCv1C,aAAa/xI,iBAAiB,SAAU8wK,eACxC/+B,aAAa/xI,iBAAiB,QAASonL,uBACvCr1C,aAAa/xI,iBAAiB,eAAgBmnL,gCAC9Cp1C,aAAa/xI,iBAAiB,aAAcynL,cAC5C11C,aAAa/xI,iBAAiB,QAASonL,uBACvCr1C,aAAa/xI,iBAAiB,UAAWunL,WACzCx1C,aAAa/xI,iBAAiB,aAAc4nL,cAmB9CT,iCACO3tL,OAAOsX,iBAAiB,CAC7Bi+H,SACC,CAAC,EACN,EA4CI84C,oCApB6B,SAAoC5nC,WAAYc,UAAW13B,0BAC1F,IAII6kD,6BACA4Z,2BAJJ,MAD4Bz+D,yBAE1B,MAAM,IAAIh5G,MAAM,8EAalB,OARE69J,6BAA+BnL,qCAAqC9iB,YACpE6nC,2BAA6BnB,mCAAmC1mC,WAAYc,UAAUhP,aAAc1oB,0BAO/F7vH,OAAOsX,iBAAiB,CAC7Bi+H,QANY,WACZm/B,8BAAgCA,6BAA6Bn/B,UAC7D+4C,4BAA8BA,2BAA2B/4C,SAC3D,GAIG,CAAC,EACN,EA+DIg5C,4BAhDqB,SAA4B9nC,WAAYl0C,IAAKz9C,WACpE,IAAI05H,OACAC,2BACAC,0BACAC,iBAAmB,WACrBloC,WAAWtrD,QAAQ/2F,OAAO8f,iBAAiBC,SAE3C03F,mBAAmBtJ,KADc,IAAdz9C,UAAqB,SAAW,OAErD,EACI85H,SAAW,WACbnoC,WAAWtrD,QAAQ/2F,OAAO8f,iBAAiBD,QAC3CwiI,WAAWtrD,QAAQ/2F,OAAO2f,OAAOE,QACjCwiI,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMK,QAChCs3H,SACF,EAWIs5C,WAAa,WACfJ,2BAA2BnvF,GAAG,QAASsvF,UACvCF,0BAA0BpvF,GAAG,QAASqvF,iBACxC,EACIp5C,QAAU,WACZk5C,2BAA2B9zF,IAAI,QAASi0F,UACxCF,0BAA0B/zF,IAAI,QAASg0F,kBACvCH,OAAOnjG,QACPmjG,OAAOn2F,MACT,GAlBEm2F,OAAS/nC,WAAW/uH,KAAK,wBAClB4oE,KAAKg7C,iDAAiD/oC,MAC7Dk8E,2BAA6BD,OAAO92J,KAAK,8BACzCg3J,0BAA4BF,OAAO92J,KAAK,4BACxCm3J,aACApoC,WAAWtrD,QAAQ/2F,OAAO2f,OAAOC,MACjCyiI,WAAWtrD,QAAQ/2F,OAAO8f,iBAAiBF,MAC3CwqK,OAAOp2F,MAaX,EAgBI0vB,cAAgB9nH,OAAO2X,OAAO,CAChCm3K,aAAc,eACd5/B,KAAM,OACN6/B,kBAAmB,aACnBC,kBAAmB,oBACnBC,mBAAoB,qBACpBC,mBAAoB,qBACpBC,QAAS,UACTC,mBAAoB,uBA2FlB56D,iBAAmB,WACrB,IAAI66D,iBAAmBn8D,oBAAoBsB,mBAC3C,QAAyB1xH,IAArBusL,iBAAgC,CAClC,IAAIC,0BAA4BD,iBAAiBzzJ,cAC7CqsF,eAAiBiL,oBAAoBnL,oBACzC,OAAQunE,2BACN,IAAK,OAED,OAAOxnE,cAAconC,KAEzB,IAAK,OAED,MAAuB,UAAnBjnC,gBAAiD,MAAnBA,eACzBH,cAAconE,mBAEhBpnE,cAAcmnE,mBAEzB,IAAK,aAED,OAAOnnE,cAAcinE,kBAEzB,IAAK,oBAED,OAAOjnE,cAAcknE,kBAEzB,IAAK,YAED,OAAOlnE,cAAcqnE,QAEzB,IAAK,eAED,OAAOrnE,cAAcsnE,mBAEzB,QAEI,OAAOtnE,cAAcgnE,aAG7B,CACA,OAAOhnE,cAAcgnE,YACvB,EACIS,kBAAoB,SAA2BC,gBAAiBtsB,eAClE,IAAIusB,SAAWzoI,WAAWksE,oBAAoBnL,qBAE9CynE,gBADyBC,SAAeA,SAAW,IAAf,EACDvsB,cACrC,EACIwsB,0BAA4B,SAAmCC,gBAAiBC,aAClF,IAAIC,UAAY,GAAK38D,oBAAoBnL,oBACzCwmE,4BAA4BoB,gBAAiBE,UAAWD,YAC1D,EACIE,iBAAmB,SAA0BH,gBAAiBI,mBAAoBC,2BACpF,IAAIhqL,KAAOwuH,mBACX,GAAIxuH,OAAS8hH,cAAcgnE,aAG3B,OAAQ9oL,MACN,KAAK8hH,cAAconC,KAKnB,KAAKpnC,cAAcinE,kBAEfQ,kBAAkBQ,oBAAoB,GACtC,MAEJ,KAAKjoE,cAAcknE,kBAEfO,kBAAkBQ,oBAAoB,GACtC,MAEJ,KAAKjoE,cAAcmnE,mBAEfe,4BACA,MAEJ,KAAKloE,cAAcqnE,QAEfO,0BAA0BC,iBAAiB,GAC3C,MAEJ,KAAK7nE,cAAcsnE,mBAEfM,0BAA0BC,iBAAiB,GAInD,EACIM,8BAtKuB,SAA8BxpC,WAAYc,UAAWyrB,uBAAwBqF,6BACtG,IAAI6X,uBAAwB,EAIxBv7H,MAAQ,WACV4yF,UAAUhP,cAAgBgP,UAAUhP,aAAa5jF,OACnD,EACIw7H,YAAc,SAAqBlkH,KAAMi3F,eACvC3b,UAAUvhJ,OAASiiJ,cAAcC,SACnCX,UAAUgD,gCAEV9D,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMI,WAAY,CAC1CiuD,KACAi3F,eAGN,EACIktB,kBAAoB,WACtB/X,4BAA4Bre,4BAC9B,EACIq2B,qBAAuB,SAA8BzvL,EAAGkpK,WAC1D,IAAIwmB,WAAaxmB,WAAaA,UAAU79F,MAAQ,EAC5Ci3F,eAAgB4G,gBAAyChnK,IAA5BgnK,UAAU5G,eAA8B4G,UAAU5G,cACnFitB,YAAYG,WAAYptB,cAC1B,EAWIqtB,kBAAoB,WAVP,IACXC,gBAUJN,uBAAwB,EACxBld,uBAAuB1R,oBACvB3sG,QAZI67H,iBAAmBjpC,WAAaA,UAAUiD,kBAC9C/D,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMM,IAAK,CACnCsyK,kBAEEA,kBACF77H,QACAm7H,iBAAiBrpC,WAAY0pC,YAAaC,oBAQ5CF,uBAAwB,CAC1B,EACIhQ,kBAAoB,WAEtB,GAAwC,IAApC34B,UAAUhP,aAAa/mG,SAA3B,CAGA,IAAI2uH,eAAiB7zH,OAAOi7G,UAAUhP,aAAaztC,YAAYv9B,QAAQ,KAAOjhC,OAAOi7G,UAAUhP,aAAa/mG,SAAS+7B,QAAQ,IA7CtHylG,wBAAyBA,uBAAuB3O,YA8ChClE,gBAAmB+vB,uBACxCK,mBAHF,CAKF,EAsBA,OArBmB,WACjB9pC,WAAWnnD,GAAGl7F,OAAOmb,UAAUE,MAAOygK,mBACtCz5B,WAAWnnD,GAAGl7F,OAAOwZ,MAAMK,OAAQoyK,sBACnC,IAAI7P,aAAe,CACjBE,WAAYR,mBAEd34B,UAAUmD,aAAaprD,GAAGkhF,aAC5B,CAYAruB,GACA+tB,oBACOlgL,OAAOsX,iBAAiB,CAC7Bi+H,QANY,YARO,WACnBkR,WAAW9rD,IAAIv2F,OAAOmb,UAAUE,MAAOygK,mBACvCz5B,WAAW9rD,IAAIv2F,OAAOwZ,MAAMK,OAAQoyK,sBACpC,IAAI7P,aAAe,CACjBE,WAAYR,mBAEd34B,UAAUmD,aAAa/vD,IAAI6lF,aAC7B,CAEEI,EACF,GAKG,CAAC,EACN,EA8OI6P,oBA5Ha,SAAoBC,aACnC,IAAIC,kBAAmB,EAEnBC,YAAc,GAEdC,oBAAqB,EACrBC,aAAeJ,YAIfK,cAAgB,KAChBC,YAAc,KACdC,UAAY,KACZC,cAAgB,KAChBC,aAAe,SAAsBxrL,OACvCA,MAAMs1F,iBACR,EACIm2F,oBAAsB,WACxB,OAAOL,cAAc5hF,SAAS,wBAA0B4hF,cAAc5hF,SAAS,uBACjF,EACIkiF,cAAgB,WAClBN,cAAgBA,eAAiBj2E,EAAEg2E,cAAc3gG,QAAQ,IAAMuuC,WAAWC,sBAC1EqyD,YAAcA,aAAel2E,EAAEg2E,cAC/BG,UAAYA,WAAan2E,EAhBV,gBAiBfo2E,cAAgBA,eAAiBp2E,EAhBX,qBAiBxB,EAiFA,OAAO96G,OAAOsX,iBAAiB,CAC7ByvI,SAzEa,SAAkBuqC,mBAC/BT,wBAA2C/tL,IAAtBwuL,mBAA0CA,kBAC/DD,gBACAL,YAAYz5F,IAAI,UAAW,GAC3B05F,UAAU15F,IAAI,UA9CS,IA+CvBy5F,YAAY1xF,GAAG,QAAS6xF,aAC1B,EAoEErqC,SAnEa,WACbkqC,YAAYz5F,IAAI,UAAW,GAC3B05F,UAAU15F,IAAI,UAAW,GACzBy5F,YAAYr2F,IAAI,QAASw2F,aAC3B,EAgEEI,aA/EiB,WACjBZ,kBAAmB,EACnBM,UAAU15F,IAAI,UAxCS,GAyCzB,EA6EEi6F,aApFiB,WACjBb,kBAAmB,EACnBM,UAAU15F,IAAI,UAAW,EAC3B,EAkFEk6F,mBAjEuB,WACvBJ,gBACIR,oBAAsBO,sBACxBJ,YAAYz5F,IAAI,SAAUq5F,YAAc,MAExCI,YAAYz5F,IAAI,SAAU,MAE9B,EA2DEm6F,WA1De,SAAoBC,gBAC/BA,gBACFV,UAAUnmL,SAEZkmL,YAAYlmL,SACZimL,cAAgB,KAChBC,YAAc,KACdC,UAAY,KACZC,cAAgB,IAClB,EAkDEU,iBAjDqB,WACrB,MAxDmB,iCAyDrB,EAgDEC,gBA/CoB,SAAyBC,QAC7ClB,YAAckB,MAChB,EA8CEC,QA7CY,SAAiBpzB,MAC7B,GAAoB,OAAhBqyB,YAAJ,CAGA,IAKIgB,SACAC,SANAzvD,YAAcuuD,cAAcmB,YAAW,GACvCC,UAAYnB,YAAYkB,YAAW,GACnCE,cAAgBD,UAAY,EAC5BE,YAAcnB,cAAc35F,IAAI,qBAAqBxtE,QAAQ,KAAM,IACnEuoK,WAA2B,EAAdD,YAKZxB,oBAAuBO,sBAGjBzyB,MAAQyzB,cApFA,GAoFkC,GACnDJ,SArFiB,EAsFjBC,SAAWtzB,KAtFM,EAsFkB0zB,aAE1B1zB,KAAOyzB,cAxFC,EAwFgC5vD,YAEjDyvD,SAAWtzB,MADXqzB,SAAWxvD,aAAe2vD,UAzFT,IA0FYE,aAG7BL,SAAWrzB,KAAOyzB,cAClBH,SAAWG,cAAgBC,cAZ3BL,SAAW,EACXC,SAAW,GAabjB,YAAYz5F,IAAI,OAAQy6F,UACxBd,cAAc35F,IAAI,OAAQ06F,UACtBA,SAhG0B,GAgGcE,UAAYF,SAAWK,WAhGrC,EAiG5BpB,cAAc74F,OAEd64F,cAAc94F,MA9BhB,CAgCF,GAWG,CACDm6F,gBAAiB,CACfvvL,IAAK,WACH,OAAO2tL,gBACT,IAGN,EAkBI6B,oBAAsBxyL,OAAOsX,iBAAiB,CAAC,EAAG,CAQpDm7K,SAAU,CACRv+K,MAAO,YASTw+K,SAAU,CACRx+K,MAAO,YASTy+K,aAAc,CACZz+K,MAAO,gBAMP0+K,uBAAyB,sBAAwBlzL,OAAOgxG,mBAF5C,wmBAGZmiF,yBAA2B,sBAAwBnzL,OAAOgxG,mBAF1C,sqBAKhBoiF,oBAAsB/1G,oBAAoBF,gBAAgB5J,kBAAkB8D,kBAC5Eg8G,iBAAmBh2G,oBAAoBF,gBAAgB5J,kBAAkBiG,eAgOzE85G,qBAzNc,SAAqBvsC,WAAY1c,SAAUkpD,aAC3D,IAoMMC,cApMFC,SAAWr4E,EAAEp7G,QACb0zL,YAAc,KAuBdC,sBAAwB,WAG1B,IAFA,IAAIC,cAAgBvpD,SAASnzE,QAAQx1D,OACjCmyL,wBAA0BxpD,SAASpzE,cAC9Bx1D,EAAI,EAAGA,EAAImyL,cAAenyL,IAEjC,GAAI,GAAKA,IAAMmrC,OAAOinJ,yBACpB,OAAOpyL,EAGX,OAAQ,CACV,EA8DIqyL,eAAiB,WACnB,OAAQzpD,SAAS/jI,MACf,KAAKqhI,aAAaE,OAxDhB8U,YAActS,SAASX,cACvBqqD,UAAYhtC,WAAW/uH,KAAK,UACtBq3E,YAvDc,wBAwDxB0kF,UAAU9kF,SAvDc,wBAwDpBskF,aAAelpD,SAASZ,WAC1BuqD,mBAAqBL,wBACrBM,mBAAqBltC,WAAW/uH,KAAK,aACrCk8J,0BAA4BntC,WAAW/uH,KAAK,YAAc2kH,YAAc,SACxEw3C,6BAA+BptC,WAAW/uH,KAAK,YAAcg8J,mBAAqB,SAClFI,cAAgBh5E,EAAE,aAAgB83E,uBAAyB,iCAAuC71G,oBAAoBF,gBAAgB5J,kBAAkB+D,kBAAoB,QAC5K+8G,gBAAkBj5E,EAAE,aAAgB+3E,yBAA2B,iCAAuC91G,oBAAoBF,gBAAgB5J,kBAAkBwE,oBAAsB,QAClLk8G,mBAAmB5kF,YAAY,wBAC3BstC,cAAgBq3C,oBAClBE,0BAA0BtyF,YAAYwyF,eACtCA,cAAcv8F,IAAI,UAAW,GAC7Bu8F,cAActnF,QAAQ,CACpB/F,QAAS,GACR,OAEHotF,6BAA6BvyF,YAAYwyF,eACzCA,cAAcv8F,IAAI,UAAW,GAC7Bu8F,cAActnF,QAAQ,CACpB/F,QAAS,GACR,KACHmtF,0BAA0BtyF,YAAYyyF,iBACtCA,gBAAgBx8F,IAAI,UAAW,GAC/Bw8F,gBAAgBvnF,QAAQ,CACtB/F,QAAS,GACR,OAGPggD,WAAW/uH,KAAK,SAAS2gE,YACLv1F,IAAhBu5I,aACFoK,WAAW/uH,KAAK,YAAc2kH,YAAc,KAAK1tC,SAAS,oBAyBxD,MACF,KAAK04B,aAAaC,SAzFa,WACjC,GAAKyC,SAASZ,SAAd,CAGA,IAAI2qD,cAAgBh5E,EAAE,aAAgB83E,uBAAyB,mDAAyD71G,oBAAoBF,gBAAgB5J,kBAAkB+D,kBAAoB,QAC9L+8G,gBAAkBj5E,EAAE,aAAgB+3E,yBAA2B,mDAAyD91G,oBAAoBF,gBAAgB5J,kBAAkBwE,oBAAsB,QACpMsyD,SAASV,kBACXod,WAAW/uH,KAAK,4BAA4B4pE,YAAYwyF,eAExDrtC,WAAW/uH,KAAK,4BAA4B4pE,YAAYyyF,gBAN1D,CAQF,CA+EMC,GAnEqB,IACrBN,mBACAC,mBACAC,0BACAC,6BACAC,cACAC,gBACA13C,YACAo3C,WAmCa,WACjB,IAAIQ,UAAY,KAChB,OAAQlqD,SAAS/jI,MACf,KAAKqhI,aAAaE,OAClB,KAAKF,aAAaC,QAChB2sD,UAAYxtC,WAAW/uH,KAAK,SAC5B,MACF,KAAK2vG,aAAaG,MAChBysD,UAAYxtC,WAAW/uH,KAAK,YAG5Bu8J,WACFA,UAAUzrG,KAAK,YAAY,EAE/B,CAaE0rG,EACF,EAuGA,OAbMhB,cAzFiB,SAA0Bz2C,WAI/C,QAHIp/B,WAAWK,SAAWL,WAAWa,eACnCu+B,WAAY,GAEN1S,SAAS/jI,MACf,KAAKqhI,aAAaE,OAChB,OAAO+T,8CAA8CvR,SAAStqG,KAAMsqG,SAASnzE,QAASmzE,SAASX,cACjG,KAAK/B,aAAaC,QAChB,OAAOgU,qDAAqDvR,SAAStqG,KAAMsqG,SAASX,aAAcqT,WACpG,KAAKpV,aAAaG,MAChB,OAAO8T,4CAA4CvR,SAAStqG,KAAMsqG,SAASX,aAAcqT,WAC3F,QACE9pE,IAAIC,aAAa,4CAA8Cm3D,SAAS/jI,KAAO,KAErF,CA2EsBmuL,KAElB1tC,WAAWnmD,KAAK4yF,eAElBzsC,WAAW/uH,KAAK,4BAA4BizD,OAAM,WAChDmwB,EAAEt4G,MAAMwU,SAAS23F,SAAS,uBAC5B,IAAGjQ,MAAK,WACNoc,EAAEt4G,MAAMwU,SAAS+3F,YAAY,uBAC/B,IA/BIkkF,YACFO,mBAEIn2E,WAAWI,kBAAoBJ,WAAWa,cAC5Ci1E,SAAS7zF,GAAG,SAAUw4D,WAAWG,6BAI/BluB,SAAS/jI,OAASqhI,aAAaE,QAAUlqB,WAAWD,oBACtDqpC,WAAW/uH,KAAK,oBAAoBq3E,YAjMhB,0BAmMtBqkF,YAAc3sC,WAAW/uH,KAAK,gCACVqyG,SAAS/jI,OAASqhI,aAAaC,SAAWyC,SAAS/jI,OAASqhI,aAAaG,QACvFnqB,WAAWI,kBAAoBJ,WAAWa,cAC5Ck1E,YAAY9zF,GAAG,gBAAiBw4D,WAAWV,iBA7FjD3Q,WAAW/uH,KAAK,IAAIjrB,OAAOiyH,WAAWuD,uBAAuBt3C,QAmHxD,CACLypG,gBAhNoB,WACpB,OAAQrqD,SAAS/jI,MACf,KAAKqhI,aAAaE,OAChB,OAAOkf,WAAW/uH,KAAK,uCAAuCyT,MAChE,KAAKk8F,aAAaC,QAChB,OAAOmf,WAAW/uH,KAAK,SAASyT,MAClC,KAAKk8F,aAAaG,MAChB,OAAOif,WAAW/uH,KAAK,YAAYyT,MAAMphB,QAAQ,kBAAmB,IAE1E,EAwMEwrH,QAzFY,aACP09C,aAAe51E,WAAWI,kBAAoBJ,WAAWa,cAC5Di1E,SAASx4F,IAAI,SAAUm9D,WAAWG,8BAEhCm7B,aAAgBrpD,SAAS/jI,OAASqhI,aAAaC,SAAWyC,SAAS/jI,OAASqhI,aAAaG,QAAWnqB,WAAWI,mBAAoBJ,WAAWa,aAChJk1E,YAAYz4F,IAAI,gBAAiBm9D,WAAWV,eAEhD,EAmFEi9B,qBAzDyB,WACzB,IAAIC,uBAAmD,OAA1BvqD,SAASX,mBAA0D,IAA1BW,SAASX,cAC3EmrD,eA3BsB,SAA+BD,sBACzD,OAAIvqD,SAASZ,SACNmrD,qBAEMvqD,SAASV,kBACXtsD,oBAAoBF,gBAAgB5J,kBAAkBO,iCAExDuJ,oBAAoBF,gBAAgB5J,kBAAkBQ,mCAJpDsJ,oBAAoBF,gBAAgB5J,kBAAkBU,0CAKrD2gH,qBAGL,GAFEv3G,oBAAoBF,gBAAgB5J,kBAAkBS,mCAGjE,CAeuB8gH,CAAsBF,sBACvCG,YAfe,SAAwBH,sBAC3C,OAAIvqD,SAAS/jI,OAASqhI,aAAaE,OAC1B+sD,sBAAwBvqD,SAASnzE,QAAQmzE,SAASX,cAAc3pG,KAElEsqG,SAASX,YAClB,CAUoBsrD,CAAeJ,sBAC7B39H,cATAozE,SAASZ,UAAYY,SAAS/jI,OAASqhI,aAAaE,OAC/CwC,SAASnzE,QAAQy8H,yBAAyB5zJ,KAE5C,GAOHk1J,eAAiB,GAUrB,OATIh+H,gBACFg+H,eAAiB7B,oBAAsBn8H,eAErC29H,uBACFK,gBAAkBh+H,cAAgB,MAAQ,GAC1Cg+H,gBAAkB5B,iBAAmB0B,aAEvCE,gBAAkBA,gBAAkBJ,eAAiB,MAAQ,GAC7DI,gBAAkBJ,cAEpB,EA0CEK,yBArB6B,WAC7B,OAAOxB,aAAeA,YAAYhyL,OAAS,GAAKgyL,YAAY9tJ,GAAG,SACjE,EAqBF,EAsEIuvJ,sBA5Ce,SAAsBC,uBAAwBC,+BAAgCC,mBAAoBC,kBAAmBlrD,SAAUkpD,aAChJ,IAAIiC,aAYEC,eAXFC,uBAAyB95C,wDAAwDv+D,oBAAoBF,gBAAgB5J,kBAAkBsC,gCAoC3I,OAnCiB,WACf2/G,aAAelC,qBAAqBiC,kBAAmBlrD,SAAUkpD,aACjE+B,mBAAmBrmF,SAAS,gBAC5B,IAAI33C,kBAAoBi8H,YAAciC,aAAab,uBAAyB,GACxEgB,mBAAqB/5C,6CAA6CvR,SAAStqG,KAAMu3B,mBACrF89H,uBAAuBx0F,KAAK+0F,oBAC5B,IAAIC,2BAA6Bh6C,uDACjCy5C,+BAA+Bz0F,KAAKg1F,2BACtC,CAyBA3rC,GATMspC,aAAelpD,SAASZ,WAdxBgsD,eAAiB,KACrBprD,SAASlzE,SAASv0D,SAAQ,SAAUu0D,UAC9BkzE,SAASV,mBAAyC,YAApBxyE,SAAShsB,OACzCsqJ,eAAiBt+H,SAAS9mB,WAChBg6F,SAASV,mBAAyC,cAApBxyE,SAAShsB,SACjDsqJ,eAAiBt+H,SAAS9mB,WAE9B,IACIolJ,iBACFH,mBAAmB10F,KAAK80F,uBAAyBD,gBACjDH,mBAAmBjmF,YAAY,iBAM3Bg7B,SAASV,kBACX0rD,+BAA+Br9J,KA5CL,0BA4CuCq3E,YAAY,gBAE7EgmF,+BAA+Br9J,KA7CH,4BA6CuCq3E,YAAY,iBAM9E,CACL6lF,yBAA0BM,aAAaN,yBACvCr/C,QAAS2/C,aAAa3/C,QACtB6+C,gBAAiBc,aAAad,gBAElC,EA2aImB,yBAnYkB,SAAyB9uC,WAAY7f,YAAa4uD,eAAgBC,aAAcC,uBAAwBl1C,UAC5H,IAwBIm1C,oBAqREC,sBA7SF1gC,WAAar5C,2BAA0B,GACvCg6E,sBAAwB,EACxB7E,YAAcvqC,WACdqvC,sBAAwB,EAExBC,qBAAuB,KACvBC,eAAiB,KACjBC,4BAA8B,KAC9BC,uBAAyB,KACzBC,qBAAuB,KACvBC,wBAA0B,KAC1BC,mBAAqB,KACrBC,oBAAsB,KACtBC,yBAA2B,KAC3BC,gCAAkC,KAClCC,cAAgB,KAChBC,cAAgB,KAChBC,cAAgB,KAChBnxB,cAAgB,KAChBoxB,kBAAoB,KACpBC,gBAAkB,KAClBC,qBAAuB,KACvBC,8BAA+B,EAC/BC,WAAavG,oBAjDG,2BAmDhBwG,YAAc,IAAIh/D,WAAU,SAAUhnG,SACxC0kK,oBAAsB1kK,OACxB,IACIw6J,kBAAoB,SAA2Bz5J,SACjD,IAAIiwI,wBAA0B3mB,kDAAkDtpH,SAC5EkwI,mBAAqBpnD,EAAEmnD,yBAC3B+uB,YAAY/vF,OAAOihE,oBACnB+zB,4BAA8BhkL,YAAW,WACvCiwJ,mBAAmBp3J,QACrB,GA/DsC,IAgExC,EACIosL,gBAAkB,WACpB1F,cACF,EACI2F,kBAAoB,WACtB5F,cACF,EACIpqB,iBAAmB,SAA0BvmK,IAC3CA,GAtE8B,KAsEzBA,EAAEu9F,SAAgD43F,qBAAqBnB,4BAA+BoC,WAAWzE,kBACxHwE,8BAA+B,EAC/B7hC,WAAW51D,GAAG,QAAS83F,gBACvB5F,eAEJ,EACI4F,eAAiB,SAASA,iBAC5BL,8BAA+B,EAC/B7hC,WAAWv6D,IAAI,QAASy8F,gBACxB7F,cACF,EACIC,aAAe,WACZwF,WAAWzE,kBACd9rC,WAAWtrD,QAAQ/2F,OAAOsb,SAASyB,YACnCg1K,qBAAqBxnF,SAAS+vB,WAAWO,aACpC83D,8BACHD,qBAAqB/nF,YAAY2vB,WAAWO,aAE9C64B,WAAWD,kBACX4zB,kBAAkB1uG,oBAAoBF,gBAAgB5J,kBAAkByC,mBACxEshH,WAAWxF,eAEf,EACID,aAAe,WACbyF,WAAWzE,kBACb9rC,WAAWtrD,QAAQ/2F,OAAOsb,SAAS0B,YACnC+0K,qBAAqBpnF,YAAY2vB,WAAWO,aAC5C63D,qBAAqBnoF,SAAS+vB,WAAWO,aACzC+3D,WAAWzF,eACX9F,kBAAkB1uG,oBAAoBF,gBAAgB5J,kBAAkB0C,kBACxE8wE,WAAW97D,QACXmtE,WAAWC,UAAUo+B,sBAEzB,EAIIkB,iBAAmB,WACrB,OAAOxB,wBAA0BjvD,YAAYxvE,UAAUh2D,OAAS,CAClE,EAuBIk2L,sBAAwB,WANJ,IAClBluD,aAJAmuD,YAUA7B,8BALiB5yL,KADjBsmI,aAAe2sD,qBAAqB3B,oBACW,KAAjBhrD,eAChCxC,YAAYxvE,UAAUy+H,uBAAuBzsD,aAAeA,cAN1DmuD,aADkB,IAAIl/J,MAAOk+I,UACOuf,sBACxClvD,YAAYxvE,UAAUy+H,uBAAuBvsD,iBAAmBiuD,YAclE,EA6BIC,sBAAwB,WACtBH,mBACF5wC,WAAWtrD,QAAQ/2F,OAAOsb,SAASmB,sBAEnC42K,qBAEJ,EACIC,uBAAyB,WAC3B,IAAIC,aASJ,OARI/wD,YAAYxvE,UAAUy+H,uBAAuBrsD,uBAC/CmuD,aAAe,CACbC,WAAYpF,oBAAoBC,WAGlCkF,aAjCoC,WACtC,IACI9gI,SADA+gI,WAAapF,oBAAoBC,SAErC,GAAI7rD,YAAYxvE,UAAUy+H,uBAAuB1sD,SAAU,CACzD,IAAI0uD,eAAiBjxD,YAAYxvE,UAAUy+H,uBAAuBxsD,kBAAoB,UAAY,YAEjF,QADjBxyE,SAAW+vE,YAAYxvE,UAAUy+H,uBAAuB5sD,qBAAqB4uD,wBAEjD/0L,IAAtB+zD,SAAShC,SACX+iI,WAAapF,oBAAoBE,cACA5vL,IAAxB+zD,SAASZ,aAClB2hI,WAAapF,oBAAoBG,cAGvC,CACA,MAAO,CACL97H,SACA+gI,WAEJ,CAemBE,GACflxD,YAAYxvE,UAAUy+H,uBAAuBrsD,wBAAyB,GAEhEmuD,aAAaC,YACnB,KAAKpF,oBAAoBC,SACvB+E,wBACA,MACF,KAAKhF,oBAAoBE,SACvBjsC,WAAWtrD,QAAQ/2F,OAAOsb,SAASqB,wBAAyB,CAC1D8zC,SAAU8iI,aAAa9gI,SAAShC,WAElC2iI,wBACA,MACF,KAAKhF,oBAAoBG,aACnB/rD,YAAYv1F,YAAcsmJ,aAAa9gI,SAASZ,WAClDwwF,WAAWtrD,QAAQ/2F,OAAOsb,SAASsB,0BAA2B,CAC5Di1C,WAAY0hI,aAAa9gI,SAASZ,aAGpCuhI,wBAIR,EACIC,oBAAsB,WACxBH,wBACAzB,wBACAkC,iBACF,EACIC,mBAAqB,SAA4Bp3L,GACnDA,EAAEiG,iBACFywL,wBACAzB,wBACAkC,iBACF,EACIE,eAAiB,SAAwBr3L,GAC3CA,EAAEiG,iBACF4wL,qBACF,EACIS,WAAa,SAAoBt3L,GACnCA,EAAEiG,iBACE+/H,YAAYgE,gBAAkB8qD,uBAChCgC,yBAEAjxC,WAAWtrD,QAAQ/2F,OAAOsb,SAASmB,qBAEvC,EACIs3K,SAAW,SAAkBv3L,GAC/BA,EAAEiG,iBACFgwL,gBAAgBruG,KAAK,WAAY,YACjC8uG,wBA3FI1wD,YAAYgE,cACdhE,YAAYxvE,UAAUy+H,uBAAuBtsD,gBAAiB,EAE9D3C,YAAYxvE,UAAU90D,SAAQ,SAAUynI,UACtCA,SAASR,gBAAiB,CAC5B,IAwFFkd,WAAWtrD,QAAQ/2F,OAAOsb,SAASoB,kBACrC,EAGIs3K,mBAAqB,WACvBlC,uBAAuBx+J,KAAK,4BAA4BgnE,MAC1D,EACI25F,kBAAoB,WACtB,IAAIC,gBAAkB1xD,YAAYxvE,UAAUy+H,uBACxC0C,gBAzI6B,IAA1B1C,sBA0IH2C,eAAiBnB,mBACjBoB,eAAiBF,iBAAmBC,eACpCE,eAAiB,CACnBC,eAAe,EACfC,iBAAiB,EACjBC,aAAa,EACbC,aAAa,EACbC,cAAc,EACdC,cAAc,GAqBhB,OAnBIpyD,YAAYgE,gBAAkB8qD,wBAC5B4C,gBAAgB/uD,eACd+uD,gBAAgB9uD,yBAA2BgvD,eAC7CE,eAAeI,aAAc,EAE7BJ,eAAeE,iBAAkB,EAGnCF,eAAeC,eAAgB,EAEjCD,eAAeG,aAAeJ,iBAAmBF,kBAEjDG,eAAeC,eAAiBjD,wBAA0B8C,eAC1DE,eAAeE,gBAAkBlD,wBAA0B8C,iBAAmB/C,aAC9EiD,eAAeG,aAAeJ,eAC9BC,eAAeI,aAAeL,iBAAmBC,eAAeC,gBAAkBD,eAAeE,gBACjGF,eAAeK,aAAyC,IAA1BlD,sBAC9B6C,eAAeM,aAAeR,gBAEzBE,cACT,EACIO,eAAiB,WACnB,IAAIP,eAAiBL,oBACrB1B,cAAcp/F,IAAI,UAAW,QAC7BiuE,cAAcjuE,IAAI,UAAW,QAC7Bs/F,gBAAgBt/F,IAAI,UAAW,QAC/Bq/F,kBAAkBr/F,IAAI,UAAW,QAC7BmhG,eAAeG,cACjBlC,cAAcp/F,IAAI,UAAW,UACzBmhG,eAAeK,aACjBpC,cAAcnuG,KAAK,WAAY,YAE/BmuG,cAAc9oF,WAAW,aAGzB6qF,eAAeI,cACjBtzB,cAAcjuE,IAAI,UAAW,UACzBmhG,eAAeM,aACjBxzB,cAAch9E,KAAK,WAAY,YAE/Bg9E,cAAc33D,WAAW,aAGzB6qF,eAAeC,gBACjB9B,gBAAgBhpF,WAAW,YAC3BgpF,gBAAgBt/F,IAAI,UAAW,WAE7BmhG,eAAeE,kBACjBhC,kBAAkB/oF,WAAW,YAC7B+oF,kBAAkBr/F,IAAI,UAAW,UAErC,EACIwgG,gBAAkB,WACpB,IAAI9E,YAAcyC,uBACd9uD,YAAYgE,eAAiBhE,YAAYxvE,UAAUy+H,uBAAuBtsD,iBAC5E0pD,aAAc,GAEa,OAAzB8C,sBACFA,qBAAqBxgD,UAEvBwgD,qBAAuBlB,sBAAsBuB,wBAAyBI,gCAAiCF,oBAAqBD,mBAAoBzvD,YAAYxvE,UAAUy+H,uBAAwB5C,aAC9LiG,sBACAD,iBApMAnD,uBAAwB,IAAIz9J,MAAOk+I,UAsMnCze,WAAWC,UAAUo+B,qBACvB,EACI+C,oBAAsB,WACxB,IAAIC,oBAAsB79C,yDAAyDu6C,sBAAwB,EAAGjvD,YAAYxvE,UAAUh2D,QACpIm1L,yBAAyBj2F,KAAK64F,oBAChC,EA8EA,OAxEMvD,sBAAwBt6C,4CAA4CkF,UACpEg1C,iBACFI,uBAAyBoB,WAAWpF,oBAEtCZ,YAAY/vF,OAAO20F,uBACnBM,uBAAyBlF,YAAYt5J,KA5UnB,2BA6UlBy+J,qBAAuBnF,YAAYt5J,KA5UN,yBA6U7B0+J,wBAA0BpF,YAAYt5J,KApUrB,kBAqUjB2+J,mBAAqBrF,YAAYt5J,KApUjB,qBAqUhB4+J,oBAAsBtF,YAAYt5J,KApUjB,sBAqUjB6+J,yBAA2BvF,YAAYt5J,KAzUhB,mBA0UvB8+J,gCAAkCxF,YAAYt5J,KAzUf,2BA0U/B++J,cAAgBzF,YAAYt5J,KAjVP,qBAkVrBg/J,cAAgB1F,YAAYt5J,KAjVP,qBAkVrBi/J,cAAgB3F,YAAYt5J,KAjVP,oBAkVrB8tI,cAAgBwrB,YAAYt5J,KAjVP,gBAkVrBk/J,kBAAoB5F,YAAYt5J,KAhVP,oBAiVzBm/J,gBAAkB7F,YAAYt5J,KAlVP,kBAmVvBo/J,qBAAuB9F,YAAYt5J,KA5UZ,qCAuWM,WAC7B,IAAIg+J,uBAGJ,IAAK,IAAIv0L,EAAI,EAAGA,EAAIylI,YAAYxvE,UAAUh2D,OAAQD,IAChD,IAAKylI,YAAYxvE,UAAUj2D,GAAGooI,eAAgB,CAC5CssD,sBAAwB10L,EACxB,KACF,CAEJ,CASAi4L,GA9BE3C,cAAcn3F,GAAG,QAAS43F,iBAC1BR,cAAcp3F,GAAG,QAAS63F,mBAC1BR,cAAcr3F,GAAG,QAAS04F,oBAC1BxyB,cAAclmE,GAAG,QAAS24F,gBAC1BpB,gBAAgBv3F,GAAG,QAAS64F,UAC5BvB,kBAAkBt3F,GAAG,QAAS44F,YAC9BzxC,WAAWnnD,GAAG,UAAW6nE,kBACrB9pD,WAAWI,kBACby4E,uBAAuB52F,GAAG,aAAc84F,oBA0B5CpC,eAAiB/jL,YAAW,WAC1B8lL,kBACApC,qBACF,GAhZ8B,IAiZvB31L,OAAOsX,iBAAiB,CAC7ByvI,SAnSa,WACbmvC,uBAAuBnnF,YAAY,aACnCioF,WAAWjwC,UACb,EAiSED,SAhSa,WACbovC,uBAAuBvnF,SAAS,aAChCqoF,WAAWlwC,UACb,EA8RE4qC,WAnBe,SAAoB2H,iBAAkB1H,gBACrDqE,gBAAkB9jL,aAAa8jL,gBAC/BC,6BAA+B/jL,aAAa+jL,6BArC5CQ,cAAc97F,IAAI,QAASu8F,iBAC3BR,cAAc/7F,IAAI,QAASw8F,mBAC3BR,cAAch8F,IAAI,QAASq9F,oBAC3BxyB,cAAc7qE,IAAI,QAASs9F,gBAC3BpB,gBAAgBl8F,IAAI,QAASw9F,UAC7BvB,kBAAkBj8F,IAAI,QAASu9F,YAC/BzxC,WAAW9rD,IAAI,UAAWwsE,kBAC1BrP,WAAWD,kBACPx6C,WAAWI,kBACby4E,uBAAuBv7F,IAAI,aAAcy9F,oBA8B3CrC,qBAAqBxgD,UACrByhD,WAAWtF,WAAW2H,iBAAkB1H,eAC1C,EAcE2H,+BAjFmC,WACnCvB,kBACAkB,gBACF,GA+EG,CACDM,uBAAwB,CACtBv2L,IAAK,WACH,OAAOi0L,WACT,IAGN,EAMIuC,aAAe/I,oBADE,8CAIjBgJ,4BAA8B,CAChCC,cAAe,SAAuBz5C,WAAYC,kBAChD,OAAO5E,wDAAwD2E,WAAYC,kBAAoBs5C,aAAa5H,kBAC9G,EACA+H,oBAAqB,WACnB,MAPmB,gBAQrB,EACAC,qBAAsB,WACpB,MAToB,iBAUtB,EACA9yC,SAAU,WACR0yC,aAAa1yC,UACf,EACAC,SAAU,WACRyyC,aAAazyC,UAAS,GACtB,IAAI8yC,gBAAkB/+E,EAnBL,8CAmBuBpjF,KAhBpB,mBAiBpBmiK,gBAAgBlvG,QAChBorE,oCAAoC8jC,gBACtC,EACAnI,WAAY8H,aAAa9H,WACzBD,mBAAoB+H,aAAa/H,mBACjCI,gBAAiB2H,aAAa3H,gBAC9BE,QAASyH,aAAazH,SAiBpB+H,8BAdU,SAAiB3lL,IAAKD,OAClC,IACExU,OAAOq6L,eAAel0B,QAAQ1xJ,IAAKD,MACrC,CAAE,MAAOtT,GAET,CACF,EAQIk5L,8BAPU,SAAiB3lL,KAC7B,IACE,OAAOzU,OAAOq6L,eAAej0B,QAAQ3xJ,IACvC,CAAE,MAAOvT,GACP,OAAO,IACT,CACF,EAsBIuyL,SAAWr4E,EAAEp7G,QAGbs6L,gBAAkB,OAClBC,eAAiB,OAgKjBC,uBAxJgB,SAAuB32D,gBACzC,IAQM42D,gBAwCAjpE,SAQ+DgpC,UAG/D3nD,IA3DFixB,gBAAkBD,eAClB62D,gBAAkB,KAClBC,iBAAmB,KACnBC,gBAAkB,KAClBC,aAAe,KACfC,cAAgB,KAChBC,aAAe,KAWfC,QAAU,WACZ,IAAInsD,SAAW1yB,4BAA4B0yB,SAC3C,MAAO,CACL/tD,MAAO+tD,SAAW,SAClBz2G,KAAMy2G,SAAW,QACjB03C,MAAO13C,SAAW,SAEtB,EAsCIosD,cAAgB,WAClB,IAAIC,UAAYP,iBAAiBlvJ,MAAMphB,QAAQ,KAAM,IACjD8wK,SAAWP,gBAAgBnvJ,MAAMphB,QAAQ,KAAM,IAC/Ck8J,MAAQsU,aAAapvJ,MAAMphB,QAAQ,KAAM,IAC3B,KAAd6wK,WAAiC,KAAbC,UAA6B,KAAV5U,OAAgBD,2BAA2BC,QACpFuU,cAAc3sF,WAAW,YACzBiqD,WAAWC,UAAUqiC,kBAErBI,cAAchyG,KAAK,WAAY,WAEnC,EAyBIsyG,UAAY,SAAmBn1L,OACjCA,MAAMkB,iBACN,IAAIijK,UAAY,CACd8wB,UAAWP,iBAAiBlvJ,MAAMphB,QAAQ,KAAM,IAChD8wK,SAAUP,gBAAgBnvJ,MAAMphB,QAAQ,KAAM,IAC9Ck8J,MAAOsU,aAAapvJ,MAAMphB,QAAQ,KAAM,KAEtCmpG,oBAAoBtC,kBA/DF,SAA2Bk5C,WACjD,IAAI3gJ,KAAOuxK,UACXZ,8BAA8B3wK,KAAKq3D,MAAOspF,UAAU8wB,WACpDd,8BAA8B3wK,KAAK2O,KAAMgyI,UAAU+wB,UACnDf,8BAA8B3wK,KAAK88J,MAAOnc,UAAUmc,MACtD,CA2DI8U,CAAkBjxB,WAEpBtmC,gBAAgBroC,QAAQ/2F,OAAOsb,SAASK,aAAc+pJ,UACxD,EACIkxB,SAAW,SAAkBr1L,OAC/BA,MAAMkB,iBACN28H,gBAAgBroC,QAAQ/2F,OAAOsb,SAASO,YAAa,CAAC,EACxD,EA4BA,OApIMk6K,gBAAkB7+C,4CACtB8+C,gBAAkBt/E,EAAEA,EAAEtrB,UAAU2qG,kBAChCE,iBAAmBD,gBAAgB1iK,KAAK,eACxC4iK,gBAAkBF,gBAAgB1iK,KAAK,cACvC6iK,aAAeH,gBAAgB1iK,KAAK,kBACpC8iK,cAAgBJ,gBAAgB1iK,KAAK,qBACrC+iK,aAAeL,gBAAgB1iK,KAAK,iBACpC8rG,gBAAgBroC,QAAQ/2F,OAAO2f,OAAOC,MAiClCktG,SAvBY,WAChB,IAAI/nG,KAAOuxK,UACPE,UAAY1nE,oBAAoBhC,UAAYgC,oBAAoBhC,SAAS0pE,UACzEC,SAAW3nE,oBAAoBhC,UAAYgC,oBAAoBhC,SAAS2pE,SACxE5U,MAAQ/yD,oBAAoBhC,UAAYgC,oBAAoBhC,SAAS+0D,MAMzE,OALI/yD,oBAAoBtC,mBACtBgqE,UAAYA,WAAad,8BAA8B3wK,KAAKq3D,OAC5Dq6G,SAAWA,UAAYf,8BAA8B3wK,KAAK2O,MAC1DmuJ,MAAQA,OAAS6T,8BAA8B3wK,KAAK88J,QAE/C,CACL2U,UACAC,SACA5U,MAEJ,CAQiBj1D,GACfqpE,iBAAiBlvJ,IAAI+lF,SAAS0pE,WAC9BN,gBAAgBnvJ,IAAI+lF,SAAS2pE,UAC7BN,aAAapvJ,IAAI+lF,SAAS+0D,OACtB/0D,SAAS0pE,WAAa1pE,SAAS2pE,UAAY3pE,SAAS+0D,OACtD0U,iBA6DEt9E,WAAWI,kBAAoBJ,WAAWa,eAC5Ci1E,SAAS7zF,GAAG,SAAUw4D,WAAWG,6BACjCoiC,iBAAiB/6F,GAAG,gBAAiBw4D,WAAWV,gBAChDkjC,gBAAgBh7F,GAAG,gBAAiBw4D,WAAWV,gBAC/CmjC,aAAaj7F,GAAG,gBAAiBw4D,WAAWV,iBAE9CijC,iBAAiB/6F,GAAG,QAASq7F,eAC7BN,iBAAiB/6F,GAAG,SAAUq7F,eAC9BL,gBAAgBh7F,GAAG,QAASq7F,eAC5BL,gBAAgBh7F,GAAG,SAAUq7F,eAC7BJ,aAAaj7F,GAAG,QAASq7F,eACzBJ,aAAaj7F,GAAG,SAAUq7F,eAC1BH,cAAcl7F,GAAG,QAASw7F,WAC1BL,aAAan7F,GAAG,QAAS07F,UACzBx3D,gBAAgBviC,OAAOm5F,iBACvBtiC,WAAWC,UAAUqiC,iBACjBtiC,WAAWK,uBAAuB50B,iBACpC82D,iBAAiB1vG,QAMjBuoC,oBAAoBrM,sBAjF6CqzC,UAkFxChnC,oBAAoBrM,oBA/E3CtU,IAAM,QADV2nD,WADAA,UAAYA,UAAUnwI,QAAQiwK,gBAAiB,QACzBjwK,QAAQkwK,eAAgB,QACf,IAC/BG,gBAAgB7iG,IAAI,mBAAoBgb,MAgFnCvyG,OAAOsX,iBAAiB,CAC7B2jL,eAjDmB,WACnBR,aAAajyG,KAAK,WAAY,YAC9BiyG,aAAapiG,OACby/D,WAAWC,UAAUqiC,gBACvB,EA8CE7kD,QArEY,YACRl4B,WAAWI,kBAAoBJ,WAAWa,eAC5Ci1E,SAASx4F,IAAI,SAAUm9D,WAAWG,6BAClCoiC,iBAAiB1/F,IAAI,gBAAiBm9D,WAAWV,gBACjDkjC,gBAAgB3/F,IAAI,gBAAiBm9D,WAAWV,gBAChDmjC,aAAa5/F,IAAI,gBAAiBm9D,WAAWV,iBAE/CgjC,gBAAgB7iG,IAAI,mBAAoB,IACxC8iG,iBAAiB1/F,IAAI,QAASggG,eAC9BN,iBAAiB1/F,IAAI,SAAUggG,eAC/BL,gBAAgB3/F,IAAI,QAASggG,eAC7BL,gBAAgB3/F,IAAI,SAAUggG,eAC9BJ,aAAa5/F,IAAI,QAASggG,eAC1BJ,aAAa5/F,IAAI,SAAUggG,eAC3BH,cAAc7/F,IAAI,QAASmgG,WAC3BL,aAAa9/F,IAAI,QAASqgG,UAC1Bx3D,gBAAgBroC,QAAQ/2F,OAAO2f,OAAOE,QACtC6zI,WAAWD,iBACb,GAoDG,CACDqjC,MAAO,CACLl4L,IAAK,WACH,OAAOo3L,eACT,IAGN,EAaIe,aAAe1K,oBAAoB,kCAInC2K,8BAAgC,CAClC1B,cAAe,SAAuBp4C,kBAAmBC,mBAAoBC,oBAAqBC,qBAAsBC,aAAczB,YACpI,OAAO3E,8DAA8DgG,kBAAmBC,mBAAoBC,oBAAqBC,qBAAsBC,aAAczB,WACvK,EACAo7C,sBAAuB,WACrB,MAPqB,wBAQvB,EACA1B,oBAAqB,WACnB,MAT0B,wBAU5B,EACA7yC,SAAU,WACRq0C,aAAar0C,UACf,EACAC,SAAU,WACRo0C,aAAap0C,UAAS,GACtB,IAAIu0C,eAAiBxgF,EAlBJ,uBAkBsBpjF,KAhBb,0BAiB1B4jK,eAAe3wG,QACforE,oCAAoCulC,eACtC,EACA5J,WAAYyJ,aAAazJ,WACzBD,mBAAoB0J,aAAa1J,mBACjCI,gBAAiBsJ,aAAatJ,gBAC9BE,QAASoJ,aAAapJ,SA4DpBwJ,8BAtDkB,SAAyBC,WAAYC,YAAaC,eAC5C,IAAfF,aACTA,WALsB,QAOG,IAAhBC,cACTA,YAPkB,UASI,IAAbC,WACTA,SAToC,KA2BtC,MAAO,CACL/6L,OAjBW,WACX,IAAIg7L,MAAQ,EAWZ,MAAO,CACLC,QAXY,WAEZ,KADAD,MACYH,WACV,OAAOvjE,UAAUltF,SAEnB,IAAIwiE,MAAQt+F,KAAKglC,IAAIwnJ,YAAcE,MAAOD,UAC1C,OAAO,IAAIzjE,WAAU,SAAUhnG,SAC7BvxB,OAAOuS,WAAWgf,QAASs8E,MAC7B,GACF,EAIF,EAIF,EAyBIguF,kDAxBsC,SAA6CE,YAAaC,eACvE,IAAhBD,cACTA,YAlCkB,UAoCI,IAAbC,WACTA,SApCoC,KAmDtC,MAAO,CACL/6L,OAdW,WACX,IAAIg7L,MAAQ,EAQZ,MAAO,CACLC,QARY,WACZD,QACA,IAAIpuF,MAAQt+F,KAAKglC,IAAIwnJ,YAAcE,MAAOD,UAC1C,OAAO,IAAIzjE,WAAU,SAAUhnG,SAC7BvxB,OAAOuS,WAAWgf,QAASs8E,MAC7B,GACF,EAIF,EAIF,EAMIsuF,YAAc77L,OAAO2X,OAAO,CAC9BmkL,aAAc,IACdC,oBAAqB,MAGvBjhF,EAAE57B,QAAQ43B,MAAO,EACjB,IA2OIklF,gCACAC,+BA4YAC,kBACAC,oBA8gHAC,0BACAC,aAvoIAC,sBAAwB,CAACT,YAAYE,qBA+IrCQ,qBA9Ic,SAAqBC,qBAAsBC,aAC3DD,qBAAuBA,sBAAwBjB,qCACpB,IAAhBkB,cACTA,aAAc,GAEhB,IAAIzrD,eAAiB,CAAC,EAClB0rD,wBAA0B,CAAC,EAC3BC,4BAA8B,SAAqCC,gBACjEA,eAAeC,aACVH,wBAAwBE,eAAeC,KAElD,EACIC,wBAA0B,SAAiCF,gBAC7D,IAAIG,YAAcjmD,0BAClB8lD,eAAeC,KAAOE,YACtBL,wBAAwBK,aAAeH,cACzC,EA0CII,YAAc,SAAqBzqF,IAAK7qF,KAAMqU,YAAakhK,UAC7D,IAAIC,cAAgBV,qBAAqB77L,SACrCw8L,QAAU,CACZ5qF,IACAvsG,KAAMi3L,SACNv1K,KACAqU,YACA84E,aAAa,EACbrH,QApEgB,KA4GlB,OAtCW,SAAS4H,KAAKgoF,SACvB,OAAO,IAAInlE,WAAU,SAAUhnG,QAAS8Z,QACtC,IAAI6xJ,eAAiB9hF,EAAE3H,KAAKgqF,SAC5BL,wBAAwBF,gBACxB3kE,UAAUhnG,QAAQ2rK,gBAAgBryJ,MAAK,SAAU8yJ,cAC/CV,4BAA4BC,gBAC5B3rK,QAAQosK,aACV,IAAU,OAAE,SAAU7nF,UAEpB,GADAmnF,4BAA4BC,gBACxBH,aAAejnF,UAAoC,YAAxBA,SAASb,WAA0B,CAChE,IAAIy0C,YAAc,GAClB,IACEA,YAAc,UAAY1pJ,OAAOq+E,KAAKq8C,UAAU5kB,SAAU,KAAM,GAAK,SAAWjD,IAAM,UAAY7yG,OAAOq+E,KAAKq8C,UAAU1yG,KAAM,KAAM,EACtI,CAAE,MAAO9Q,OACPwyI,YAAc,kDAChB,CACAz2E,IAAIC,aAAaw2E,YACnB,EAtCqB,SAAgC5zC,UAC3D,IAAKA,SACH,OAAO,EAET,IAAK,IAAIr0G,EAAI,EAAGA,EAAIm7L,sBAAsBl7L,OAAQD,IAChD,GAAIq0G,SAASf,SAAW6nF,sBAAsBn7L,GAC5C,OAAO,EAGX,OAAO,CACT,CA6BYm8L,CAAuB9nF,WAczB7iC,IAAIC,aAAa,QAAU2/B,IAAM,mCAAqCiD,SAASf,OAAS,KACxF1pE,OAAOyqE,WAdP0nF,cAActB,UAAUrxJ,MAAK,WAC3B6yJ,UACIpsD,eAAe5sI,OAAOuf,QAAQC,WAChCotH,eAAe5sI,OAAOuf,QAAQC,UAAUthB,SAAQ,SAAU6vI,eACxDA,cAAcirD,QAChB,IAEFhoF,KAAKgoF,SAAS7yJ,KAAKtZ,SAAgB,MAAE8Z,OACvC,IAAU,OAAE,SAAUwyJ,eACpB5qH,IAAIC,aAAa,WAAa2/B,IAAM,iBAAmB6qF,QAAU,aACjEryJ,OAAOwyJ,cACT,GAKJ,GACF,GACF,CACOnoF,CAAK,EACd,EA2BA,MAAO,CACLpyG,IAtHQ,SAAauvG,KACrB,IAAI4qF,QAAU,CACZ5qF,IACAvsG,KAAM,MACN+1B,YAAa,mBACb84E,aAAa,EACbrH,QAzBgB,KA2BdovF,eAAiB9hF,EAAE3H,KAAKgqF,SAE5B,OADAL,wBAAwBF,gBACjB3kE,UAAUhnG,QAAQ2rK,gBAAgBryJ,MAAK,SAAU7iB,MAEtD,OADAi1K,4BAA4BC,gBACrBl1K,IACT,IAAU,OAAE,SAAU8tF,UAEpB,GADAmnF,4BAA4BC,gBACxBH,aAAejnF,UAAoC,YAAxBA,SAASb,WAA0B,CAChE,IAAIy0C,YAAc,GAClB,IACEA,YAAc,UAAY1pJ,OAAOq+E,KAAKq8C,UAAU5kB,SAAU,KAAM,GAAK,SAAWjD,GAClF,CAAE,MAAO37F,OACPwyI,YAAc,kDAChB,CAEA,OADAz2E,IAAIC,aAAaw2E,aACVnxB,UAAUltF,OAAOq+G,YAC1B,CACF,GACF,EA6FEo0C,iBA5FqB,SAA0BjrF,IAAK7qF,MACpD,OAAOs1K,YAAYzqF,IAAKuI,EAAEhiD,MAAMpxC,MAAO,mDAAoD,OAC7F,EA2FE2rH,qBA7ByB,WACzBrzI,OAAOmpB,KAAKuzK,yBAAyBp6L,SAAQ,SAAUs6L,gBACrDA,gBAAkBA,eAAeloF,OAASkoF,eAAeloF,OAC3D,IACAgoF,wBAA0B,CAAC,CAC7B,EAyBEl2L,iBAxBqB,SAA0BD,UAAW4rI,eACrDnB,eAAezqI,aAClByqI,eAAezqI,WAAa,IAE9ByqI,eAAezqI,WAAWjC,KAAK6tI,cACjC,EAoBEzrI,oBAnBwB,SAA6BH,UAAW4rI,eAChE,GAAKnB,eAAezqI,WAApB,CAGA,IAAK,IAAIpF,EAAI6vI,eAAezqI,WAAWnF,OAAS,EAAGD,GAAK,EAAGA,IACzD,GAAI6vI,eAAezqI,WAAWpF,KAAOgxI,cAAe,CAClDnB,eAAezqI,WAAW4O,OAAOhU,EAAG,GACpC,KACF,CAEuC,IAArC6vI,eAAezqI,WAAWnF,eACrB4vI,eAAezqI,UARxB,CAUF,EAQF,EA8DIk3L,sCAxDmB,SAA0B72D,YAAa4G,gBAC5D,IAAI1xG,OAAS,0CAab,OAZAA,QAAU,2BAA6B0xG,eAAiB,WAAa5G,YAAYyD,OAAS,YAAczD,YAAYp/B,MAA1G,iBACVo/B,YAAYxvE,UAAU90D,SAAQ,SAAUynI,UACtCjuG,QAAU,mBAAqBiuG,SAAS/jI,KAAO,SAAW+jI,SAASv3H,GAAK,KACxEspB,QAAU,aAAeiuG,SAASv4F,SAAW,cAC7C1V,QAAU,aAAekqJ,yBAAyBj8C,SAASv0B,UAAY,cACnEu0B,SAAS/jI,OAASqhI,aAAaG,YAA8B1kI,IAArBinI,SAAShB,UACnDjtG,QAAU,aAAeiuG,SAAShB,QAAU,OAAS,SAAW,cAElEjtG,QAAU,mBAAqBiuG,SAASf,eAAiB,oBACzDltG,QAAU,aACZ,IACAA,QAAU,iBAEZ,EAyCI2hK,yCAxCsB,SAA6B3wD,gBACrD,IAAIhxG,OAAS,0CAqCb,OApCAA,QAAU,sCAAsDgxG,eAAezC,OAAS,aAAeyC,eAAe3xE,KAAO,KAC7Hr/B,QAAU,gBAAkBkqJ,yBAAyBl5C,eAAeE,aAAe,iBACnFlxG,QAAU,mBAAqBgxG,eAAeG,eAAiB,oBAC/DnxG,QAAU,aAAegxG,eAAezqE,SAAW,cACnDvmC,QAAU,kBAAoBgxG,eAAelB,cAAgB,mBAC7D9vG,QAAU,qBACVgxG,eAAeI,iBAAiB5qI,SAAQ,SAAUo7L,WAChD5hK,QAAU,UAAY4hK,UAAY,UACpC,IACA5hK,QAAU,sBACVA,QAAU,iBACVgxG,eAAej0E,aAAav2D,SAAQ,SAAUskI,aAC5C9qG,QAAU,sBAAwBkqJ,yBAAyBp/C,YAAY5iI,MAAQ,wBAA0B4iI,YAAYqD,kBAAoB,YAAcrD,YAAYp/B,MAAQ,KAC3Ko/B,YAAYxvE,UAAU90D,SAAQ,SAAUynI,UACtCjuG,QAAU,mBAAqBiuG,SAAS/jI,KAAO,SAAW+jI,SAASv3H,GAAK,KACxEspB,QAAU,iBAAmBkqJ,yBAAyBj8C,SAAS7B,cAAc,GAAQ,kBACjF6B,SAAS/jI,OAASqhI,aAAaE,QACjCzrG,QAAU,YACViuG,SAAS5B,QAAQ7lI,SAAQ,SAAUq7L,QACjC7hK,QAAU,WAAakqJ,yBAAyB2X,QAAQ,GAAQ,WAClE,IACA7hK,QAAU,aACVA,QAAU,kBAAoBiuG,SAASpzE,cAAgB,oBAC9CozE,SAAS/jI,OAASqhI,aAAaC,UACxCxrG,QAAU,YACViuG,SAAS5B,QAAQ7lI,SAAQ,SAAUq7L,QACjC7hK,QAAU,WAAakqJ,yBAAyB2X,QAAQ,GAAQ,WAClE,IACA7hK,QAAU,cAEZA,QAAU,aACZ,IACAA,QAAU,gBACZ,IACAA,QAAU,kBACVA,QAAU,mBAEZ,EAMI8hK,cAAgBrB,uBAahBsB,qCAZ0B,SAAiC3qE,qBAC7D,IAAIvG,oBAAsBuG,oBAAoBzG,kCAC9C,OAAIE,oBACKixE,cAAc56L,IAAI2pH,qBAAqBpiF,MAAK,SAAU7iB,MAC3D,OAAOA,KAAKo2K,WACd,IAEK7lE,UAAUhnG,SACnB,EAII4sK,kCAHyB,WAC3BD,cAAcvqD,sBAChB,EAYI0qD,uBAAyB,KAGzBC,yBAA2B,IAAI/lE,WAAU,SAAUhnG,QAAS8Z,QAC9DixJ,gCAAkC/qK,QAClCgrK,+BAAiClxJ,MACnC,IACIkzJ,YAAc1B,uBACd2B,gCAAkC3B,qBAAqBhB,qDACvD4C,yBAA2B5B,qBAAqBhB,iCAAiC,GACjF6C,WAAa,WACf,OAAIlrE,oBAAoB8B,wBACf9B,oBAAoB8B,wBAbhB,mCAgBf,EA8GIqe,qBAAuB,WACzB4qD,YAAY5qD,uBACZ6qD,gCAAgC7qD,uBAChC8qD,yBAAyB9qD,uBACzBwqD,mCACF,EAWIQ,YAAc,CAChBC,yBAjD+B,SAAkCC,uBACjER,uBAAyBQ,qBAC3B,EAgDEC,yBA/C+B,WAC/B,OAAOT,sBACT,EA8CEU,kBApFsB,SAA2Br3C,UAAWwzC,UAAWC,SAAU5U,MAAOyY,cACxF,IAAInsF,IAAMwrF,wBAA0BK,aAjEd,2BAkFtB,OAlCwB,SAA6Bh3C,UAAWwzC,UAAWC,SAAU5U,MAAOyY,cAC5F,IAAIh3K,KAAO,CACTi3K,OAAQv3C,UAAU9Z,OAClBsxD,4BAAuD97L,IAA/B47L,aAAa3xE,eAEvC,OAAI2xE,aAAajyE,kCACRoxE,qCAAqCa,cAAcn0J,MAAK,SAAUkkD,OAEvE,OADA/mE,KAAKo2K,YAAcrvG,MACZ/mE,IACT,KAEFA,KAAKm3K,UAAajE,WAAY,GAC9BlzK,KAAKo3K,SAAYjE,UAAW,GAC5BnzK,KAAKq3K,MAAS9Y,OAAQ,GACfhuD,UAAUhnG,QAAQvJ,MAC3B,CAGEs3K,CAAoB53C,UAAWwzC,UAAWC,SAAU5U,MAAOyY,cAAcn0J,MAAK,SAAU7iB,MACtFu2K,YAAYT,iBAAiBjrF,IAAK7qF,MAAM6iB,MAAK,SAAUirE,UACrD,OAAIA,SAASypF,mBApCQ,SAA8BC,aAAcx0G,KAAMlyB,UAC3E,IAAK0mI,aACH,OAAOjnE,UAAUhnG,UAES,iBAAjBiuK,eACTA,aAAenhH,KAAKiY,MAAMkpG,eAE5B,IAAIC,kBAAoB1B,yCAAyCyB,cAC7D3sF,IAAM6rF,kDAAyD1zG,KAAO,kBAAoBlyB,SAAW,UACrG9wC,KAAO,CACT03K,eAAgBD,mBAElB,OAAOlB,YAAYT,iBAAiBjrF,IAAK7qF,MAAM6iB,MAAK,WAClD,OAAO40J,iBACT,GACF,CAsBeE,CAAqBj4C,UAAUta,eAAgBsa,UAAU3uF,SAAU2uF,UAAU5uF,UAAUjuB,MAAK,WACjG,OAAOirE,QACT,IAEKA,QACT,IAAGjrE,MAAK,SAAUirE,UAChBwmF,gCAAgC,CAC9BsD,oBAAqB9pF,SAAS+pF,WAC9BC,cAAehqF,SAASiqF,eA/EkB,IAgF1CjyD,eAAgBh4B,SAASkqF,IAE7B,IAAU,MAAEzD,+BACd,IACO+B,wBACT,EAkEE2B,kBA9CsB,SAA2Br1D,iBACjD,OAAO0zD,yBAAyBzzJ,MAAK,SAAUq1J,kBAC7C,IAAKA,iBAAiBpyD,eACpB,OAAOvV,UAAUltF,OAAO,6BAEK,iBAApBu/F,kBACTA,gBAAkBvsD,KAAKiY,MAAMs0C,kBAE/B,IAAIu1D,eAAiBpC,sCAAsCnzD,gBAAiBs1D,iBAAiBpyD,gBACzFj7B,IAAM6rF,aA/GU,2BAgHhB12K,KAAO,CACTo4K,aAAcD,gBAEhB,OAAO3B,gCAAgCV,iBAAiBjrF,IAAK7qF,MAAM6iB,MAAK,SAAUirE,UAChF,OAAOA,SAAS58D,OAClB,GACF,GACF,EA8BEmnJ,aAlEiB,SAAsBC,yBAA0BC,kBACjE,GAAIA,kBAAoBA,iBAAiB7+L,OAAS,EAChD,OAAO48L,yBAAyBzzJ,MAAK,SAAUq1J,kBAC7C,IAAIrtF,IAAM6rF,aArFQ,2BAsFd12K,KAAO,CACTw4K,WAAYN,iBAAiBpyD,eAC7B2yD,SAAUH,yBACVI,eAAgBH,kBAElB,OAAO9B,yBAAyBX,iBAAiBjrF,IAAK7qF,KAAM,EAC9D,GAEJ,EAuDE24K,iBA9BqB,WACrB,OAAOrC,yBAAyBzzJ,MAAK,SAAUirE,UAC7C,MAAO,CACL8pF,oBAAqB9pF,SAAS8pF,oBAC9BE,cAAehqF,SAASgqF,cAE5B,GACF,EAwBE3hH,MAlIU,WACVw1D,uBACA6qD,gCAAkC3B,qBAAqBhB,qDACvD0C,YAAc1B,uBACd4B,yBAA2B5B,qBAAqBhB,iCAAiC,GACjFyC,yBAA2B,IAAI/lE,WAAU,SAAUhnG,QAAS8Z,QAC1DixJ,gCAAkC/qK,QAClCgrK,+BAAiClxJ,MACnC,GACF,EA0HEsoG,qBACA7sI,iBAnBuB,SAA0BD,UAAW4rI,eAC5D8rD,YAAYz3L,iBAAiBD,UAAW4rI,eACxC+rD,gCAAgC13L,iBAAiBD,UAAW4rI,eAC5DgsD,yBAAyB33L,iBAAiBD,UAAW4rI,cACvD,EAgBEzrI,oBAf0B,SAA6BH,UAAW4rI,eAClE8rD,YAAYv3L,oBAAoBH,UAAW4rI,eAC3C+rD,gCAAgCx3L,oBAAoBH,UAAW4rI,eAC/DgsD,yBAAyBz3L,oBAAoBH,UAAW4rI,cAC1D,GAuJImuD,6BAhIsB,SAA6BC,aAAcP,yBAA0BQ,6BAC7F,IAEIC,YACAC,sBAHAC,wBAAyB,EACzBC,uBAAwB,EAuExBC,mBAAqB,SAA4B94C,OAKnDA,MAAMvhJ,iBAAiB,SAJK,WAC1Bu5L,aAAah4C,OACb+4C,cACF,IACuD,GACvDH,wBAAyB,CAC3B,EAWIZ,aAAe,SAAsBh4C,OAClCA,OAA4B,IAAnBA,MAAMv2G,WAGfmvJ,wBACHE,mBAAmB94C,OAEhB64C,uBAjBiB,SAA2B74C,OACjD24C,sBAAwB,YACD,IAAjBD,aAGJM,sBAAsBh5C,MACxB,EACAA,MAAMvhJ,iBAAiB,OAAQk6L,uBAAuB,GACtDE,uBAAwB,CAC1B,CASII,CAAkBj5C,OApEQ,SAAiCA,OAC7D,IACI5mJ,EACA0/E,EACAogH,uBACAC,qBACAC,aACAC,YACAC,WAEAC,2BATArB,iBAAmB,GAUnBhtC,4BAA+C,IAAjBlL,MAAMv2G,SAExC,IADA8vJ,2BApC0B,SAA+B1qD,QACzD,IAAI0V,qBAAuB1V,OAAOx1I,OAClC,GAAIkrJ,qBAAuB,EACzB,MAAO,GAET,IAKInrJ,EALAmgM,2BAA6B,CAAC,CAChCtpK,MAAyB,IAAlB4+G,OAAO5+G,MAAM,GACpBC,IAAqB,IAAhB2+G,OAAO3+G,IAAI,KAEdspK,kBAAoB,EAExB,IAAKpgM,EAAI,EAAGA,EAAImrJ,qBAAsBnrJ,IAChCmgM,2BAA2BC,mBAAmBtpK,KAAyB,IAAlB2+G,OAAO5+G,MAAM72B,GAdtC,IAe9BmgM,2BAA2BC,mBAAmBtpK,IAAsB,IAAhB2+G,OAAO3+G,IAAI92B,IAE/DmgM,2BAA2Bh9L,KAAK,CAC9B0zB,MAAyB,IAAlB4+G,OAAO5+G,MAAM72B,GACpB82B,IAAqB,IAAhB2+G,OAAO3+G,IAAI92B,KAElBogM,qBAGJ,OAAOD,0BACT,CAa+BE,CAAsBz5C,MAAMnR,QACpDz1I,EAAI,EAAGA,EAAImgM,2BAA2BlgM,OAAQD,IAIjD,GAHA8/L,uBAAyBK,2BAA2BngM,GAAG62B,MACvDkpK,qBAAuBI,2BAA2BngM,GAAG82B,QACrDkpK,aAAeluC,4BAAkD,IAApBlL,MAAMj9C,YAzChB,MA0Cdo2F,qBAAuBD,uBAAyBjB,2BAGrEoB,YAAcnyL,KAAKqiC,MAAM2vJ,uBAAyBjB,0BAC9CiB,uBAAyBjB,0BAA6B,IACxDoB,aAAe,GAEjBC,WAAapyL,KAAKqiC,MAAM4vJ,qBAAuBlB,0BAC1CmB,eACHE,YAAc,GAEZA,WAAaD,cAGjB,IAAKvgH,EAAIugH,YAAavgH,GAAKwgH,WAAYxgH,IACrCo/G,iBAAiB37L,KAAKu8E,GAG1Bw9G,YAAY0B,aAAaC,yBAA0BC,kBAC3BA,iBAAiB7+L,SAAW6N,KAAKg3F,KAAKgtD,4BAA8B+sC,4BAE1Fc,eACA/4C,MAAMrhJ,oBAAoB,OAAQg6L,uBAAuB,GAE7D,CA6BEe,CAAwB15C,OAC1B,EACI+4C,aAAe,YACI,IAAjBL,cACF/gM,OAAOyxJ,cAAcsvC,aACrBA,aAAe,EAEnB,EAIIM,sBAAwB,SAA+Bh5C,OAQzD04C,YAAc/gM,OAAO0xJ,aAPE,WACrB2uC,aAAah4C,OACTA,MAAM1R,SACR32I,OAAOyxJ,cAAcsvC,aACrBA,aAAe,EAEnB,GACmDD,4BACrD,EAGA,OAFAM,eACAC,sBAAsBR,cACfvgM,OAAOsX,iBAAiB,CAC7Bi+H,QAhBY,WACZurD,cACF,GAeG,CAAC,EACN,EAeIY,eAAiB1hM,OAAO2X,OAAO,CACjCgqL,OAAQ,SACRC,IAAK,QAwBHC,aAAe7hM,OAAOsX,iBAAiB,CACzCwqL,0BAP8B,SAAmCl7D,YAAahuF,SAC9EguF,YAAYxvE,UAAU90D,SAAQ,SAAUynI,WAVb,SAAgCA,SAAUnxF,SACrE,IACImpJ,eAAiBnpJ,QADDmxF,SAASv3H,SAEN1P,IAAnBi/L,iBACFh4D,SAASV,kBAAoB04D,eAAeC,UAC5Cj4D,SAASpzE,cAAgBorI,eAAeprI,cACxCozE,SAASZ,SAAW44D,eAAe54D,SAEvC,CAGI84D,CAAuBl4D,SAAUnxF,QACnC,IACAguF,YAAYkD,sBACd,GAGG,CACDo4D,iBAAkB,CAChBhuL,OAAO,KAqCPiuL,cAAgB,SAAuBp4D,UACrCA,SAAS/jI,OAASqhI,aAAaE,OA7BX,SAA6BwC,SAAUv0B,UAC/D,IACIwsF,UADArrI,cAAgBozE,SAASpzE,cAEzByrI,eAAiBprK,SAASw+E,SAAU,IAEtCwsF,WADE/6I,MAAMm7I,iBAII,GAAKA,iBAAmBzrI,cAEtCozE,SAASV,kBAAoB24D,UAC7Bj4D,SAASZ,cAA6BrmI,IAAlB6zD,eAA+BA,cAAgB,CACrE,CAkBI0rI,CAAoBt4D,SAAUA,SAASX,cAC9BW,SAAS/jI,OAASqhI,aAAaC,SAlBV,SAAqCyC,SAAUv0B,UAC/E,IAAI8sF,uBAAiCx/L,IAAb0yG,SAAyBA,SAAS55E,cAAgB,GACtE2mK,gBAAkBx4D,SAASnzE,QAC3B4rI,sBAAwBD,gBAAkBA,gBAAgBnhM,OAAS,EAEvE,GADA2oI,SAASZ,SAAWq5D,sBAAwB,EACxCz4D,SAASZ,SAAU,CACrBY,SAASV,mBAAoB,EAC7B,IAAK,IAAIloI,EAAI,EAAGA,EAAIqhM,sBAAuBrhM,IACzC,GAAImhM,oBAAsBC,gBAAgBphM,GAAGs+B,KAAK7D,cAAe,CAC/DmuG,SAASV,mBAAoB,EAC7B,KACF,CAEJ,CACF,CAKIo5D,CAA4B14D,SAAUA,SAASX,aAEnD,EAQIs5D,UAAY1iM,OAAOsX,iBAAiB,CACtCqrL,iBARqB,SAA0B/7D,aAC/CA,YAAYxvE,UAAU90D,SAAQ,SAAUynI,UAClCA,SAASR,gBACX44D,cAAcp4D,SAElB,GACF,GAGG,CACDm4D,iBAAkB,CAChBhuL,OAAO,KAKP8iL,WAAavG,oBADE,2BAOfmS,4BAA8B,CAChCC,oBAAqB,SAA6BpjK,MAChDy8J,kBAAoBz8J,IACtB,EACAqjK,sBAAuB,SAA+BrjK,MACpD08J,oBAAsB18J,IACxB,EACAi6J,cAAe,WACb,OAAOp+C,wDAAwD4gD,kBAAmBC,qBAAuBnF,WAAWpF,kBACtH,EACAmR,yBAA0B,WACxB,MAfiB,sBAgBnB,EACAC,yBAA0B,WACxB,MAnBiB,sBAoBnB,EACAj8C,SAAU,WACR,IAAIN,WAAa3rC,EAxBF,2BAyBf2rC,WAAW13C,YAAY,aACvBioF,WAAWjwC,WACX,IAAIk8C,iBAAmBx8C,WAAW/uH,KArBf,yBAsBnBurK,iBAAiBt4G,QACjBorE,oCAAoCktC,iBACtC,EACAn8C,SAAU,WACRhsC,EAhCe,2BAgCCnM,SAAS,aACzBqoF,WAAWlwC,UACb,EACA4qC,WAAYsF,WAAWtF,WACvBD,mBAAoBuF,WAAWvF,mBAC/BI,gBAAiBmF,WAAWnF,gBAC5BE,QAASiF,WAAWjF,SAGlBmR,eAAiBljM,OAAO2X,OAAO,CACjC1R,GAAI,CACFkqK,WAAY,aACZgzB,UAAW,YACX/4K,SAAU,WACVg5K,SAAU,WACVC,OAAQ,UAEVC,YAAa,CACXC,QAAS,UACTC,YAAa,cACbC,eAAgB,iBAChBC,mBAAoB,qBACpBC,sBAAuB,wBACvBC,YAAa,cACbC,YAAa,cACbC,YAAa,cACbC,eAAgB,iBAChBC,iBAAkB,mBAClBC,oBAAqB,sBACrBC,eAAgB,iBAChBC,cAAe,iBAEjBC,oBAAqB,CACnBb,QAAS,gBACTC,YAAa,2BACbC,eAAgB,mBAChBC,mBAAoB,KACpBC,sBAAuB,iCACvBC,YAAa,qBACbC,YAAa,qBACbC,YAAa,qBACbC,eAAgB,KAChBC,iBAAkB,KAClBC,oBAAqB,yBACrBC,eAAgB,wBAChBC,cAAe,MAEjBE,mBAAoB,CAClBd,QAAS,WACTC,YAAa,eACbC,eAAgB,mBAChBC,mBAAoB,uBACpBC,sBAAuB,2BACvBC,YAAa,gBACbC,YAAa,gBACbC,YAAa,gBACbC,eAAgB,mBAChBC,iBAAkB,qBAClBC,oBAAqB,wBACrBC,eAAgB,mBAChBC,cAAe,mBAEjB1vF,OAAQ,CACNngB,UAAW,YACXgwG,WAAY,aACZC,aAAc,gBACdC,QAAS,UACTC,OAAQ,SACRC,OAAQ,SACRC,QAAS,WAEXC,WAAY,CACVC,QAAS,UACTC,OAAQ,SACRz5F,SAAU,IAEZ05F,iBAAkB,CAChBC,QAAS,UACTC,WAAY,cAEdC,SAAU,CACRC,cAAe,EACfC,UAAW,EACXC,WAAY,GAEdC,WAAY,CACVC,SAAU,EACVC,SAAU,IACVC,0BAA2B,OA+I3BC,wBAnIiB,WACnB,IAAIC,oBAAsB,EACtBC,uBAAyB,EACzBC,sBAAwB3C,eAAezuF,OAAO+vF,QAC9CsB,mBAAqB,GACrBC,wBAA0B,GAC1BC,4BAA8B,EAC9BC,oBAAsB,EACtBC,kBAAoBhD,eAAezuF,OAAO8vF,aAC1C4B,eAAiBjD,eAAezuF,OAAO+vF,QA0C3C,OAAOxkM,OAAOsX,iBAAiB,CAC7B8uL,yBApC6B,SAAkCC,qBAC/D,GAAKA,oBAGL,IACE,IAAIC,cAAgB5mM,OAAOq+E,KAAKiY,MAAMqwG,qBAClCC,cAAmC,QACrCX,oBAAsB3+I,WAAWs/I,cAAmC,OAAEC,IACtER,wBAA0BO,cAAmC,OAAEE,IAC/DR,4BAA8Bh/I,WAAWs/I,cAAmC,OAAEG,MACrEH,cAAmC,SAC5CX,oBAAsB3+I,WAAWs/I,cAAmC,OAAEC,IACtER,wBAA0BO,cAAmC,OAAEE,IAC/DR,4BAA8Bh/I,WAAWs/I,cAAmC,OAAEG,KAC9EX,mBAAqBQ,cAAmC,OAAE55D,GAE9D,CAAE,MAAO9rI,GAAI,CACf,EAoBE8lM,uBAZ2B,WAC3B,IAAIJ,cAAgB,CAAC,EAOrB,OANAA,cAAmC,OAAI,CACrCC,GAAIZ,oBACJa,IAAKT,wBACLU,IAAKR,oBACLv5D,GAAIo5D,oBAECpmM,OAAOq+E,KAAKq8C,UAAUksE,cAC/B,GAIG,CACDK,mBAAoB,CAClB3jM,IAAK,WACH,OAAO2iM,mBACT,EACAhjM,IAAK,SAAagkM,oBAChBhB,oBAAsBgB,kBACxB,GAEFC,sBAAuB,CACrB5jM,IAAK,WACH,OAAO4iM,sBACT,EACAjjM,IAAK,SAAaikM,uBAChBhB,uBAAyBgB,qBAC3B,GAEFC,8BAA+B,CAC7B7jM,IAAK,WACH,OAAO4iM,uBAAuBz9K,UAChC,GAEF2+K,qBAAsB,CACpB9jM,IAAK,WACH,OAAO6iM,qBACT,EACAljM,IAAK,SAAamkM,sBAChBjB,sBAAwBiB,oBAC1B,GAEFl6D,kBAAmB,CACjB5pI,IAAK,WACH,OAAO8iM,kBACT,EACAnjM,IAAK,SAAaiqI,mBAChBk5D,mBAAqBl5D,iBACvB,GAEFm6D,uBAAwB,CACtB/jM,IAAK,WACH,OAAO+iM,uBACT,EACApjM,IAAK,SAAaqkM,UAChBjB,wBAA0BiB,QAC5B,GAEFC,2BAA4B,CAC1BjkM,IAAK,WACH,OAAOgjM,2BACT,GAEFroC,mBAAoB,CAClB36J,IAAK,WACH,OAAOijM,mBACT,EACAtjM,IAAK,SAAag4I,eAChBsrD,oBAAsBtrD,aACxB,GAEFusD,iBAAkB,CAChBlkM,IAAK,WACH,OAAOkjM,iBACT,EACAvjM,IAAK,SAAaukM,kBAChBhB,kBAAoBgB,gBACtB,GAEFC,cAAe,CACbnkM,IAAK,WACH,OAAOmjM,cACT,EACAxjM,IAAK,SAAawkM,eAChBhB,eAAiBgB,aACnB,IAGN,EAkTIC,yBAnSkB,WACpB,IAAIC,SAAW,KACXC,YAAa,EACbC,WAAarE,eAAegC,SAASC,aACrCqC,uBAAyB,KAmCzBC,QAAU,SAAiBC,kBAAmBC,YAAaC,UAC7D,IAAIC,UACA3gL,OACJ,GAAImgL,SAAU,CACZ,OAAQK,mBACN,KAAKxE,eAAej9L,GAAGkqK,WAOK,UALtBo3B,YAAcrE,eAAegC,SAASG,WACpBgC,SAASS,WAAW,IAEpBT,SAASU,cAAc,OAIzC7gL,OADEqgL,YAAcrE,eAAegC,SAASG,WAC/BgC,SAASW,SAAS9E,eAAemB,mBAAmBJ,qBAEpDoD,SAASY,YAAY/E,eAAekB,oBAAoBH,sBAGrE,MACF,KAAKf,eAAej9L,GAAGk9L,UAEnBj8K,OADEqgL,YAAcrE,eAAegC,SAASG,WAC/BgC,SAASa,UAAU,IAEnBb,SAASc,UAAU,IAE9B,MACF,KAAKjF,eAAej9L,GAAGmkB,SACjBm9K,YAAcrE,eAAegC,SAASG,YACxCwC,UAAY3E,eAAemB,mBAAmBsD,gBAE5CzgL,OAASmgL,SAASW,SAASH,aAG7BA,UAAY3E,eAAekB,oBAAoBuD,gBAE7CzgL,OAASmgL,SAASY,YAAYJ,YAGlC,MACF,KAAK3E,eAAej9L,GAAGm9L,SACrB,GAAImE,YAAcrE,eAAegC,SAASG,YACxCwC,UAAY3E,eAAemB,mBAAmBsD,gBAE5CzgL,OAASmgL,SAASe,SAASP,UAAWD,eAEnC,CAKL,IAAIS,eADJR,UAAY3E,eAAekB,oBAAoBuD,cAE/C,GAAIA,cAAgBzE,eAAeI,YAAYW,oBAAqB,CAClE,IAAIqE,aAAejB,SAASY,YAAY/E,eAAekB,oBAAoBH,qBACvE2D,WAAa1E,eAAezuF,OAAOgwF,QAAUmD,WAAa1E,eAAezuF,OAAOiwF,SAClF2D,YAAcC,eAAiBpF,eAAezuF,OAAOiwF,QAAU4D,eAAiBpF,eAAezuF,OAAOgwF,OAE1G,CACI4D,cACFnhL,OAASmgL,SAASkB,YAAYV,UAAWD,UAE7C,CACA,MACF,KAAK1E,eAAej9L,GAAGo9L,OAEnBn8K,OADEqgL,YAAcrE,eAAegC,SAASG,WAC/BgC,SAASmB,OAAO,IAEhBnB,SAASoB,UAAU,IAOlC,OAHIv1E,oBAAoBnC,kBACtBxlF,QAAQggH,KAAK,mBAAoBm8C,kBAAmBC,YAAaC,SAAU,aAAc1gL,QAEpFA,MACT,CACF,EAQIwhL,oBAAsB,WACxB,OAA+B,OAA3BlB,uBACK,IAAIvvE,WAAU,SAAUhnG,QAAS8Z,QARnC+vE,EAAE3H,KAAK,CACZntG,KAAM,MACNusG,IA/HyB,kBAgIzBf,SAAU,SAMY5mE,MAAK,SAAUljB,MAEjCuJ,QADAu2K,uBAAyB9/K,KAE3B,IAAGupE,MAAK,WACNlmD,QACF,GACF,IAEKktF,UAAUhnG,QAAQu2K,uBAC3B,EAUImB,oBAAsB,SAA6BC,WAErD,OAAIA,UAAUpiE,KAAOoiE,UAAUC,YAVxBH,sBAAsBn+J,MAAK,SAAUu+J,qBAE1C,OAAyE,IAArEA,oBAAoB5zL,QAlJW,kDAmJ1BguL,eAAegC,SAASE,UAE1BlC,eAAegC,SAASG,UACjC,IAK0C96J,MAAK,SAAUw+J,iBAErD,OADAxB,WAAawB,gBACTA,kBAAoB7F,eAAegC,SAASE,UACvCwD,UAAUpiE,IAEZoiE,UAAUC,WACnB,IAESD,UAAUpiE,KACnB+gE,WAAarE,eAAegC,SAASE,UAC9BntE,UAAUhnG,QAAQ23K,UAAUpiE,MAE1BoiE,UAAUC,aACnBtB,WAAarE,eAAegC,SAASG,WAC9BptE,UAAUhnG,QAAQ23K,UAAUC,cAE9B5wE,UAAUltF,QACnB,EASIi+J,QAAU,SAAiBzvF,KAK7B,IAJA,IAAI0vF,aAAe,GAIX1vF,IAAIitB,MAAQjtB,IAAIsvF,aAAetvF,IAAIviG,SAAWuiG,KAAO0vF,cA5LrC,KA6LtBA,eACA1vF,IAAMA,IAAIviG,OAEZ,OAAO2xL,oBAAoBpvF,IAC7B,EAWI2vF,4BAA8B,WAChC,OAA0B,OAAtBxpM,OAAOkoF,IAAIoa,OACNgnG,QAAQtpM,OAAOkoF,IAAIoa,QAErBi2B,UAAUltF,QACnB,EASIo+J,OAAS,WACX,OAzB6B,WAC7B,IACE,OAAIzpM,OAAOsX,SAAWtX,OACbspM,QAAQtpM,OAAOsX,QAEjBihH,UAAUltF,QACnB,CAAE,MAAOnqC,GACP,OAAOq3H,UAAUltF,OAAOnqC,EAC1B,CACF,CAgBSwoM,GAAkC,MAAEF,4BAC7C,EAgBIG,wBAA0B,WAC5B,IACE,IAAIC,YAAcxuF,EAAEtL,SAASg4F,wBAI7B,OAHmB1sF,EAAEwuF,aACI5xK,KAAK,QACXA,KAAK,SACV+H,MAChB,CAAE,MAAO7+B,GACP,MArPmB,EAsPrB,CACF,EAiCA,OAAOZ,OAAOsX,iBAAiB,CAC7B2oE,KAbS,WACT,OAxCIqnH,WACKrvE,UAAUltF,SAEds8J,SAGEpvE,UAAUhnG,QAAQo2K,UAFhB8B,UAoCa5+J,MAAK,SAAUg/J,KAKnC,OAJAlC,SAAWkC,IACPr2E,oBAAoBnC,kBACtBxlF,QAAQggH,KAAK,mCAAoCg8C,YAE5CE,QAAQvE,eAAej9L,GAAGkqK,WACnC,IAAU,OAAE,WAEV,OADAm3B,YAAa,EACN,OACT,GACF,EAGEG,QACA+B,SA7Ba,WACb,OAAKhC,uBAKEvvE,UAAUhnG,QAAQo4K,2BAJhBX,sBAAsBn+J,KAAK8+J,yBAAgC,OAAE,WAClE,MAjQiB,EAkQnB,GAGJ,EAuBEI,aAvQiB,WACjB,IAAIC,YACAtgD,YACAugD,WACJ,OAAKtC,UAGDE,YAAcrE,eAAegC,SAASG,YACxCqE,YAAcrC,SAASuC,eACvBxgD,YAAci+C,SAASwC,eAAeH,aACtCC,WAAatC,SAASyC,cAAcJ,eAEpCA,YAAcrC,SAAS0C,kBACvB3gD,YAAci+C,SAAS2C,kBAAkBN,aACzCC,WAAatC,SAAS4C,iBAAiBP,cAElC,WAAaA,YAAc,kBAAoBtgD,YAAc,iBAAmBugD,YAX9E,qBAYX,GAuPG,CACDpC,WAAY,CACVvkM,IAAK,WACH,OAAOukM,UACT,IAGN,EAyEI2C,gCA5DyB,SAAgCzjD,YAC3D,IAAI0jD,8BAAgC1jD,WAAW/uH,KAAK,sCAChD0yK,qBAAuB,KACvBC,6BAA+B,KAC/BC,+BAAgC,EAChCC,yBAA2B,SAAkC3pM,GAC/DA,EAAEiG,iBACF4/I,WAAWtrD,QAAQ/2F,OAAOggB,MAAMC,YAClC,EAOIslI,WAAa,WACf,IAAIhE,YANA2kD,8BACKp3E,oBAAoBV,oCAAsCz1C,oBAAoBF,gBAAgB5J,kBAAkB2G,gBAAkBmD,oBAAoBF,gBAAgB5J,kBAAkB0G,oBAE1LoD,oBAAoBF,gBAAgB5J,kBAAkByG,yBAKzD8wH,yBAA2BlvD,mDAAmDqK,YAD5D2kD,+BAEtBH,8BAA8B7pG,KAAKkqG,0BACnCJ,qBAAuBD,8BAA8BzyK,KAAK,uBAC1D2yK,6BAA+BF,8BAA8BzyK,KAAK,iCACpE,EACIozF,gBAAkB,WACpBu/E,8BAAgCA,6BAA6B7hH,KAAK,WAAYwC,SAASsvD,SACzF,EACImf,eAAiB,WACnB4wC,8BAAgCA,6BAA6B7hH,KAAK,WAAYwC,SAASuvD,SACzF,EAkBIt6D,KAAO,WACT0pE,aAjBAlD,WAAWnnD,GAAGl7F,OAAO2f,OAAOC,KAAM8mG,iBAClC27B,WAAWnnD,GAAGl7F,OAAO2f,OAAOE,OAAQw1I,gBACpC4wC,6BAA6B/qG,GAAG,QAASirG,yBAiB3C,EAMA,OAAOvqM,OAAOsX,iBAAiB,CAC7BmzL,SAtBa,SAAkBC,YAC3BN,sBACFA,qBAAqB9pG,KAAKoqG,WAE9B,EAmBEtmB,WAPe,SAAoBumB,8BACnCL,8BAAgCK,6BAX5BN,8BACFA,6BAA6B1vG,MAE/B8rD,WAAW9rD,IAAIv2F,OAAO2f,OAAOC,KAAM8mG,iBACnC27B,WAAW9rD,IAAIv2F,OAAO2f,OAAOE,OAAQw1I,gBASrCx5E,MACF,GAIG,CAAC,EACN,EAuEI2qH,uCApDgC,SAAuCnkD,WAAY55E,SACrF,IACIg+H,gBACAC,gBAFAC,mCAAqCtkD,WAAW/uH,KAAK,yCAsBrDszK,sBAAwB,SAA+BpqM,GACzDA,EAAEiG,iBACF0uI,SACF,EACI01D,uBAAyB,SAAgCrqM,GAC3DA,EAAEiG,iBACEgmE,QAAQq+H,0BACVzkD,WAAWtrD,QAAQ/2F,OAAOggB,MAAMG,qCAEhCkiI,WAAWtrD,QAAQ/2F,OAAOggB,MAAME,qBAEpC,EAKIixH,QAAU,WACZkR,WAAWtrD,QAAQ/2F,OAAO2f,OAAOE,QACjC4mL,iBAAmBA,gBAAgBlwG,MACnCmwG,iBAAmBA,gBAAgBnwG,MACnCowG,mCAAmCzqG,KAAK,GAC1C,EAIA,OA5CiB,WACf,IAAI6qG,iBACAt+H,QAAQq+H,0BACVC,iBAAmBpuH,oBAAoBF,gBAAgB5J,kBAAkB+G,mDAIzEmxH,iBAFkBpuH,oBAAoBF,gBAAgB5J,kBAAkB4G,+BAEvC,KADRhN,QAAQu+H,eAAiBruH,oBAAoBF,gBAAgB5J,kBAAkB8G,0CAA4CgD,oBAAoBF,gBAAgB5J,kBAAkB6G,4CAG5M,IAAI4jE,sBAAwBytD,iBACxBnlD,kBAAoBjpE,oBAAoBF,gBAAgB5J,kBAAkBgH,4CAC1EgsE,8BAAgClpE,oBAAoBF,gBAAgB5J,kBAAkBiH,wDACtFgsE,kBAAoBnpE,oBAAoBF,gBAAgB5J,kBAAkBkH,4CAC1EgsE,8BAAgCppE,oBAAoBF,gBAAgB5J,kBAAkBmH,wDACtFixH,gCAAkC/vD,0DAA0DoC,sBAAuBytD,iBAAkBnlD,kBAAmBC,8BAA+BC,kBAAmBC,8BAA+Bt5E,QAAQq+H,2BACrPH,mCAAmCzqG,KAAK+qG,iCACxCP,gBAAkBC,mCAAmCrzK,KAAK,4BAC1DmzK,gBAAkBE,mCAAmCrzK,KAAK,2BAC5D,CAuBAiyH,GATEkhD,gBAAgBvrG,GAAG,QAAS2rG,wBAC5BH,gBAAgBxrG,GAAG,QAAS0rG,uBAU9BvkD,WAAWtrD,QAAQ/2F,OAAO2f,OAAOC,MAC1BhkB,OAAOsX,iBAAiB,CAC7Bi+H,SACC,CAAC,EACN,EAWI+1D,+BANwB,SAA+B7kD,YACzD,IAAI8kD,2BAA6B9kD,WAAW/uH,KAAK,gCAC7C8zK,wBAA0BlwD,kDAAkDv+D,oBAAoBF,gBAAgB5J,kBAAkBoH,wBACtIkxH,2BAA2BjrG,KAAKkrG,yBAChC/kD,WAAWtrD,QAAQ/2F,OAAO2f,OAAOC,KACnC,EA8ZIynL,kBA/YkB,WACpB,IAKIC,iBACAC,YACAC,aACAC,YARA7a,YAAc,KACd8a,wBAA0B,KAC1BC,+BAAiC,KACjCC,oBAdsB,GAetBC,uCAdyC,EAmBzC1vC,WAAa,KACb2vC,gCAAkC,EAClCC,qBAAsB,EACtBC,6BAA8B,EAC9BC,qBAAuB,KACvBC,qBAAsB,EAetBC,WAAa,WACf,OAAsB,OAAfhwC,UACT,EACIiwC,8BAAgC,WAClC,OAAOD,cAAgBV,YAAY1E,gBAAkBjE,eAAezuF,OAAO+vF,OAC7E,EACIiI,uBAAyB,WAC3B,OAAQF,cAAgBhwC,WAAWhkG,eAAiB+tE,WAAWC,MAAQg2B,WAAWhkG,eAAiB+tE,WAAWliH,KAChH,EAuCIumL,6BAA+B,WACjC,OAAOkB,YAAYlF,oBAAsBsF,yCAA2CO,+BACtF,EAIIE,gBAAkB,WACpB,IAAKJ,oBAAqB,CAExBA,qBAAsB,EAClBT,YAAYlF,oBAAsBsF,yCACpCJ,YAAY3E,iBAAmBhE,eAAezuF,OAAOngB,WAEvD,IAAIq4G,sBAAwB55C,oCAAoC5qI,WAChEkkL,qBAAuBnJ,eAAe0B,WAAWv5F,SACjD,IACIuhG,sBADAC,yBAA2BhB,YAAY3E,iBAKvCwE,iBAAiBnE,aAAerE,eAAegC,SAASE,WAAaoH,kCACvEK,yBAA2B3J,eAAezuF,OAAO6vF,YAI/CmI,2BAA6BZ,YAAY3E,mBAAqBhE,eAAezuF,OAAOngB,WAAak4G,mCACnGH,qBAAuBnJ,eAAe0B,WAAWC,SAI/CwH,uBAAyBnJ,eAAe0B,WAAWv5F,WACjDkhG,aACFO,YAAYjB,YAAYjF,uBAAuB,GAE/CiF,YAAY1E,cAAgBjE,eAAezuF,OAAOgwF,QAMlDiH,iBAAiBnE,aAAerE,eAAegC,SAASE,WAAamH,cAAgBV,YAAY1E,gBAAkBjE,eAAezuF,OAAO+vF,SAAWqI,2BAA6B3J,eAAezuF,OAAOngB,WACzMu4G,yBAA2BhB,YAAY1E,cACvCyF,sBAAwB,IAExBA,sBAAwBf,YAAY1E,cAEtC,IAAIb,cAAgB+F,uBAAyBnJ,eAAe0B,WAAWC,SA5DrEtoC,aACFsvC,YAAYj/D,kBAAoB2vB,WAAWl0B,eAE7CwjE,YAAY9E,uBAAyBh0C,yCAC9B84C,YAAYnF,0BAwDmF,GAChGqG,eAAiBrB,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYG,eAAgB6C,eAGrH,IAA8B,iBAAnByG,gBAAgE,UAAjCA,eAAenxK,gBAAgD,IAAnBmxK,kBACpFV,qBAAuBnJ,eAAe0B,WAAWv5F,UAC5C+gG,6BAMH,OALAL,+BAAiCnB,uCAAuC5Z,YAAa,CACnFoa,gBAAgB,EAChBF,2BAA2B,IAE7BoB,qBAAsB,GACf,EAGXZ,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYY,gBApE9E8I,0BAA4BttM,OAAOi5H,YAAYrgG,MAAQ4zK,gCACvDe,qBAAuBh+L,KAAK8kC,MAAMi5J,0BAA4B,KAC9DtB,iBAAiBnE,aAAerE,eAAegC,SAASE,UACnDvqD,uCAAuCoyD,sBAEzCpyD,uCAAuCoyD,wBAgE5CvB,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYI,mBAAoBmI,YAAYlF,oBAChH+E,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYE,YAAamJ,uBA3DxFpwC,YAAcsvC,YAAY3E,mBAAqBhE,eAAezuF,OAAOngB,WAAau3G,YAAY/E,uBAAyB5D,eAAezuF,OAAOngB,WAAaioE,WAAW3uB,gCAAkC,IA/B1M89D,iBAAiBnE,aAAerE,eAAegC,SAASE,UAC1DsG,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYQ,YAAa+H,YAAYhF,+BAEzG6E,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYQ,YAAa+H,YAAYjF,uBAE3G8E,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYS,eAAgB8H,YAAYjF,sBAAwB1D,eAAeoC,WAAWG,2BAC9JiG,iBAAiBjE,QAAQvE,eAAej9L,GAAGo9L,SAwFrCwI,YAAY1E,gBAAkBjE,eAAezuF,OAAOngB,WACtDo3G,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYU,iBAAkB4I,uBAEpGlB,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYW,oBAAqB4I,0BACrGnB,iBAAiBjE,QAAQvE,eAAej9L,GAAGo9L,OAC7C,CAhFoC,IAChC2J,0BACAC,qBA+EJ,OAAO,CACT,EAiBIC,qBAAuB,WACpBvC,+BAMHwC,mBALApB,+BAAiCnB,uCAAuC5Z,YAAa,CACnFoa,eAAgBqB,yBAChBvB,2BAA2B,GAKjC,EACIkC,8BAAgC,WAClCrB,gCAAkCA,+BAA+Bx2D,UACjEw2D,+BAAiC,KACjCoB,kBACF,EACIE,sCAAwC,WAC1CjB,6BAA8B,EAC9BgB,+BACF,EAaID,iBAAmB,YACIT,mBACCN,+BAhD1BR,cAAe,EACfD,aAAc,EACdD,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYC,QAAS8I,sBACzFX,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYa,cAAejB,eAAe6B,iBAAiBC,SAC/H0G,iBAAiBjE,QAAQvE,eAAej9L,GAAGk9L,WAC3CmI,+BAA+Bta,aA6C7Bmb,qBAAsB,EAE1B,EA0BImB,2CAA6C,WAC1C3B,aACHwB,kBAEJ,EAyDIL,YAAc,SAAqBS,aAAcC,sBACnD,GAAK5B,aAAL,CAGA,IAAI6B,kBAAoBzB,oBACxB,IAAK/kJ,MAAMsmJ,cAAe,CACxB,IAAIG,sBAAwB,KACxBC,qBAAuB,KACvBjC,iBAAiBnE,aAAerE,eAAegC,SAASG,YAC1DqI,sBAAwB,IACxBC,qBAAuB,GACdjC,iBAAiBnE,aAAerE,eAAegC,SAASE,YACjEsI,sBAAwB,EACxBC,qBAAuB,KAIzB,IAAIC,gBAAkBlC,iBAAiBjE,QAAQvE,eAAej9L,GAAGmkB,SAAU84K,eAAeI,YAAYK,uBAC9E,OAApBiK,iBAAgD,KAApBA,iBAA0BA,iBAAmB,GAAKA,iBAAmBD,uBACnGF,kBAAoBG,gBAAkBF,uBAExC7B,YAAYjF,sBAAwB2G,aACpC1B,YAAY/E,qBAAuB0G,qBAAuBtK,eAAezuF,OAAOngB,UAAY4uG,eAAezuF,OAAO6vF,WAC9GkJ,qBACiD,IAA/CjxC,WAAW3uB,gCACbi+D,YAAY1E,cAAgBjE,eAAezuF,OAAOngB,UAElDu3G,YAAY1E,cADHoG,cAAgBE,kBACGvK,eAAezuF,OAAOgwF,OAEtBvB,eAAezuF,OAAOiwF,OAGpDmH,YAAY1E,cAAgBjE,eAAezuF,OAAO+vF,QAEhDmG,iCACEmB,yBACFA,wBAAwB1nB,YAAW,GAEjClxD,oBAAoBV,qCACtBk6E,kBAGN,CAvCA,CAwCF,EACA,OAAO1sM,OAAOsX,iBAAiB,CAC7B2oE,KArGS,WAGT,OA9NA+wG,YAAc,KACd8a,wBAA0B,KAC1BC,+BAAiC,KACjCL,iBAAmBtE,2BACnBuE,aAAc,EACdC,cAAe,EACfC,YAAcnG,0BACdwG,gCAAkC,EAClCC,qBAAsB,EACtBC,6BAA8B,EAC9BC,qBAAuB,KACvBC,qBAAsB,EAkNtBJ,gCAAkCxsM,OAAOi5H,YAAYrgG,MAC9CozK,iBAAiBzrH,OAAO11C,MAAK,SAAUsjK,WArLlB,IACxBvH,cAiKAY,iBAoBgB,UAAd2G,YAlCsB,WAC5B,IACMnuM,OAAOkoF,KAAOloF,OAAOkoF,IAAIoa,SAC3BtiG,OAAOkoF,IAAIkmH,eAAiB,WAC1B,GAAI3B,oBACF,MAAO,EAEX,EAEJ,CAAE,MAAOvrM,GAET,CACF,CA0BImtM,GAzLEzH,cAAgBoF,iBAAiBjE,QAAQvE,eAAej9L,GAAGmkB,SAAU84K,eAAeI,YAAYG,gBACpGoI,YAAYzF,yBAAyBE,gBAgKjCY,iBAAmBwE,iBAAiBjE,QAAQvE,eAAej9L,GAAGmkB,SAAU84K,eAAeI,YAAYW,qBAAqB,MACnGf,eAAezuF,OAAO+vF,SAAW0C,mBAAqBhE,eAAezuF,OAAO8vF,cACnGsH,YAAY3E,iBAAmBhE,eAAezuF,OAAO6vF,WACrDoH,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYW,oBAAqBf,eAAezuF,OAAO6vF,aAE3HuH,YAAY3E,iBAAmBA,iBAsBZ,OAAf3qC,aA/MFmvC,iBAAiBnE,aAAerE,eAAegC,SAASE,WAC1DsG,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYM,YAAaV,eAAeoC,WAAWC,SAASp9K,YAChIujL,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYO,YAAaX,eAAeoC,WAAWE,SAASr9K,cAEhIujL,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYM,YAAaV,eAAeoC,WAAWC,UACvHmG,iBAAiBjE,QAAQvE,eAAej9L,GAAGm9L,SAAUF,eAAeI,YAAYO,YAAaX,eAAeoC,WAAWE,WAEzHkG,iBAAiBjE,QAAQvE,eAAej9L,GAAGo9L,SA2MzC3jM,OAAO8G,iBAAiB,SAAU8mM,4CAClC1B,cAAe,GAVbrgK,QAAQ30B,MAAM80L,iBAAiBjC,eAWnC,GACF,EAqFEuE,SAvJa,SAAkBvnD,YAC/BuqC,YAAcvqC,WACVilD,iBAAiBnE,aAAerE,eAAegC,SAASC,cAI5DnU,YAAYriF,SAAS+vB,WAAWG,aAChCmyD,YAAY1xF,GAAGl7F,OAAOggB,MAAMC,YAAa6oL,sBACzClc,YAAY1xF,GAAGl7F,OAAOggB,MAAME,qBAAsB8oL,+BAClDpc,YAAY1xF,GAAGl7F,OAAOggB,MAAMG,oCAAqC8oL,wCAnCjEvB,wBAA0B5B,gCAAgClZ,cAClC5M,WAAWumB,gCACnCe,iBAAiBlC,WAAWj/J,MAAK,SAAUmgK,YACzCoB,wBAAwBrB,SAASC,WACnC,IACA1Z,YAAY,GAAG9hH,MAAMi5B,YAAYo6B,aAAaW,kBA9KjB,SAsM3B8tD,YAAY71F,QAAQ/2F,OAAOggB,MAAMK,gBAQrC,EA6IEwpL,6BA7EiC,SAAsC56C,kBAAmB1Y,eACrFixD,eAOLC,YAAYlF,mBAAqB13L,KAAKsoB,IAAI,EAAGtoB,KAAKglC,IAAI,EAAGo/G,oBACzDw4C,YAAYluC,mBAAqBhjB,cAC7BkxD,YAAYlF,oBAAsBsF,yCACpCJ,YAAY3E,iBAAmBhE,eAAezuF,OAAOngB,WAEnDq2G,iCACEmB,yBACFA,wBAAwB1nB,YAAW,GAEjClxD,oBAAoBV,qCACtBk6E,mBAGN,EAyDEI,aACC,CACDoB,YAAa,CACXlrM,IAAK,WACH,OAAO4oM,YACT,GAEFuC,0BAA2B,CACzBnrM,IAAK,WACH,OAAO6oM,YAAYlF,kBACrB,GAEFyH,8BAA+B,CAC7BprM,IAAK,WACH,OAAO6oM,YAAY9E,sBACrB,GAEFsH,yBAA0B,CACxBrrM,IAAK,WACH,OAAO6oM,YAAYj/D,iBACrB,GAEF0hE,0BAA2B,CACzBtrM,IAAK,WACH,OAAO6oM,YAAY5E,0BACrB,GAEFsH,qBAAsB,CACpBvrM,IAAK,WACH,OAAOgpM,mBACT,EACArpM,IAAK,SAAa6rM,oBAChBxC,oBAAsBwC,kBACxB,GAEFC,kCAAmC,CACjCzrM,IAAK,WACH,OAAOipM,sCACT,EACAtpM,IAAK,SAAa+rM,uCAChBzC,uCAAyCyC,qCAC3C,GAEFtnD,UAAW,CACTpkJ,IAAK,WACH,OAAOu5J,UACT,EACA55J,IAAK,SAAaykJ,WAChBmV,WAAanV,SACf,GAEFujD,6BAA8B,CAC5B3nM,IAAK2nM,8BAEPgE,sBAAuB,CACrB3rM,IAAKypM,yBAGX,CACwBmC,GAEpBC,oBAAsB7uM,OAAO2X,OAAO,CACtCm3L,cAAe,wBAkqBbC,wBAjpBiB,SAAwBtoD,WAAYc,UAAWH,UAAWixB,4BAA6B7tD,yBAE1G,MADgB48B,UAEd,MAAM,IAAIvwI,MAAM,0DAElB,IAeIm4L,gBACAC,iBAEAC,kBACAC,kBAnBAC,eAAiB,KACjBC,aAAe,KACf9yC,WAAa,KACb+yC,kCAAoC,KACpCC,0BAA4B,KAC5BC,8BAAgC,KAChCC,iBAAmB,KACnBC,oBAAsB,EACtBC,yBAA2B,EAC3BC,cAAgB,EAChBC,SAAW,KACXC,cAAe,EACfC,YAAa,EACbC,cAAgBzoD,UAAUvhJ,OAASiiJ,cAAcv1G,MACjDu9J,mBAAqB,GAGrBC,8BAAgC3oD,UAAUvhJ,OAASiiJ,cAAcv1G,MAMjEy9J,6BAA+B,WAC7B5zC,WAAWnvB,WAETq+D,kBAAkByC,YACpBzC,kBAAkBqB,YAAYvwC,WAAWrwB,gBAAiBqwB,WAAWjwB,+BAE1B,IAA3B5sI,OAAO0wM,iBACvB1wM,OAAO0wM,gBAAgB7zC,WAAWrwB,iBAGxC,EACImkE,oBAAsB,WACxB5pD,WAAWtrD,QAAQ/2F,OAAOsb,SAASY,2BACrC,EACIgwL,iCAAmC,WACrC7pD,WAAWtrD,QAAQ/2F,OAAOsb,SAASE,UACnCirJ,6BACF,EACI0lC,2BAA6B,WAC/BZ,0BAA4B,EAC5BN,aAAa3d,YAAW,GACxB2d,aAAe,KACfiB,kCACF,EAOIE,kBAAoB,SAASA,oBAC/B/pD,WAAW9rD,IAAIv2F,OAAOsb,SAASmB,qBAAsB2vL,mBACrDD,4BACF,EACIE,8BAAgC,SAAuCC,aACzE,IAAIC,gBAAkBpb,yBAAyB9uC,WAAY8V,WAAW1jG,aAAa82I,0BAA2Be,YAAaV,eAAe,EAAMzoD,UAAUz8C,aAC1J27C,WAAWnnD,GAAGl7F,OAAOsb,SAASmB,qBAAsB2vL,oBACpDnB,aAAesB,iBACF5pD,UACf,EACI6pD,qBAAuB,SAASA,uBAClC91F,EAAEsgF,8BAA8BC,yBAAyB1gG,IAAI,QAASi2G,sBACtE91F,EAAEsgF,8BAA8BzB,uBAAuBh/F,IAAI,QAASk2G,yBACpEzV,8BAA8B1J,YAAW,GACzC2d,aAAe,KACfiB,kCACF,EACIO,wBAA0B,SAASA,0BACrC/1F,EAAEsgF,8BAA8BC,yBAAyB1gG,IAAI,QAASi2G,sBACtE91F,EAAEsgF,8BAA8BzB,uBAAuBh/F,IAAI,QAASk2G,yBACpEzV,8BAA8B1J,YAAW,GACzC2d,aAAe,KACfoB,+BACF,EAyDIK,iCAAmC,SAASA,mCAC9Ch2F,EAAE8nF,4BAA4BG,4BAA4BpoG,IAAI,QAASo2G,gBACvEj2F,EAAE8nF,4BAA4BI,4BAA4BroG,IAAI,QAASm2G,kCACvElO,4BAA4BlR,YAAW,GACvC2d,aAAe,KACfoB,+BACF,EACIM,eAAiB,WACnBtqD,WAAWtrD,QAAQ/2F,OAAOsb,SAASe,UACnC4uL,aAAavoD,UACf,EACIkqD,yBAA2B,SAASA,yBAAyBpwM,EAAG8mB,MAC9D9mB,EAAEoF,OAAS5B,OAAOsb,SAASqB,wBAC7B+sH,mBAAmBpmH,KAAKmtC,SAAU,UACzBj0D,EAAEoF,OAAS5B,OAAOsb,SAASsB,4BACpCylI,WAAW9rD,IAAIv2F,OAAOsb,SAASmB,qBAAsBowL,wBACrDxqD,WAAW9rD,IAAIv2F,OAAOsb,SAASoB,kBAAmBq3K,UAClD1xC,WAAW9rD,IAAIv2F,OAAOsb,SAASqB,wBAAyBiwL,0BACxDvqD,WAAW9rD,IAAIv2F,OAAOsb,SAASsB,0BAA2BgwL,0BAC1DT,6BAEJ,EACIU,uBAAyB,SAASA,yBACpCxqD,WAAW9rD,IAAIv2F,OAAOsb,SAASmB,qBAAsBowL,wBACrDxqD,WAAW9rD,IAAIv2F,OAAOsb,SAASoB,kBAAmBq3K,UAClD1xC,WAAW9rD,IAAIv2F,OAAOsb,SAASqB,wBAAyBiwL,0BACxDvqD,WAAW9rD,IAAIv2F,OAAOsb,SAASsB,0BAA2BgwL,0BAC1DvqD,WAAWtrD,QAAQ/2F,OAAOsb,SAASW,WAC/Bk8I,WAAW1jG,aAAa82I,0BAA0BplE,gBAChDylE,eACFvpD,WAAWtrD,QAAQ/2F,OAAOsb,SAASc,8BACnC6uL,aAAa3d,YAAW,GAjDU,WACtC,IAAI/vC,cAAgB4a,WAAW1jG,aAAa82I,0BAA0BhlE,uBAClEumE,gBAAkB30C,WAAW1jG,aAAa82I,0BAA0BllE,sBACpE0mE,iBAAmB50C,WAAW1jG,aAAa82I,0BAA0BjlE,wBACzEk4D,4BAA4BC,oBAAoBlhD,cAAgB5kE,oBAAoBF,gBAAgB5J,kBAAkBM,uBAAyB29H,gBAAkBn0H,oBAAoBF,gBAAgB5J,kBAAkBa,2BAC9L,IAArBq9H,iBACFvO,4BAA4BE,sBAAsBqO,iBAAmBp0H,oBAAoBF,gBAAgB5J,kBAAkB+B,wBAE3H4tH,4BAA4BE,sBAAsBqO,iBAAmBp0H,oBAAoBF,gBAAgB5J,kBAAkBgC,yBAE7H,IAAIh6C,OAAS2nK,4BAA4BlJ,gBACzCjzC,WAAWxlD,OAAOhmE,QAClBo0K,aAAezM,4BACf9nF,EAAE8nF,4BAA4BG,4BAA4BzjG,GAAG,QAASyxG,gBACtEj2F,EAAE8nF,4BAA4BI,4BAA4B1jG,GAAG,QAASwxG,kCACtElO,4BAA4B77C,WAC5BsoD,aAAa5d,oBACf,CAiCM2f,KAEA/B,aAAa3d,YAAW,GA1FY,WACxC,IAAIpwC,kBAAoB,KACpBC,mBAAqB,KACrB8vD,oBAAsB,KACtBC,qBAAuB,KACvB3vD,cAAgB,EAChB4vD,gBAAkB,EAClBJ,iBAAmB,EACnBD,gBAAkB30C,WAAW1jG,aAAa82I,0BAA0BllE,sBACpEymE,gBAAkB,IAEpBK,gBAAkBL,iBADlBvvD,cAAgB4a,WAAW1jG,aAAa82I,0BAA0BhlE,wBAElEwmE,iBAAmB50C,WAAW1jG,aAAa82I,0BAA0BjlE,wBACrE4W,kBAAoBvkE,oBAAoBF,gBAAgB5J,kBAAkB6D,YAAY/sD,QAAQ,oBAAqB43H,eACnHJ,mBAAqBtyI,KAAK8kC,MAAa4tG,cAAgBuvD,gBAAvB,KAA2C,IAC3EG,oBAAsBt0H,oBAAoBF,gBAAgB5J,kBAAkBuE,cAAcztD,QAAQ,sBAAuBwnL,iBACzHD,qBAAuBriM,KAAK8kC,MAAaw9J,gBAAkBL,gBAAzB,KAA6C,KAExD,IAArBC,iBACFvO,4BAA4BE,sBAAsBqO,iBAAmBp0H,oBAAoBF,gBAAgB5J,kBAAkB+B,wBAE3H4tH,4BAA4BE,sBAAsBqO,iBAAmBp0H,oBAAoBF,gBAAgB5J,kBAAkBgC,yBAE7H,IAAIh6C,OAASmgK,8BAA8B1B,cAAcp4C,kBAAmBC,mBAAoB8vD,oBAAqBC,qBAAsBv0H,oBAAoBF,gBAAgB5J,kBAAkB4D,aAAckG,oBAAoBF,gBAAgB5J,kBAAkB2F,kBAGrQ6tE,WAAWxlD,OAAOhmE,QAElB6/E,GADAu0F,aAAejU,+BACAC,yBAAyB/7F,GAAG,QAASsxG,sBACpD91F,EAAEu0F,aAAa1V,uBAAuBr6F,GAAG,QAASuxG,yBAGlDxB,aAAatoD,WACbyqD,mBACiB,OAAb3B,UACFR,aAAatd,QAAQ8d,SAEzB,CAsDM4B,IAGFlB,4BAEJ,EACImB,cAAgB,WA/HM,IAA6BC,UAkIrD,GAlIqDA,UAgIjC50H,oBAAoBF,gBAAgB5J,kBAAkB8F,sBA/H1Ek3H,mBAAqB0B,UACrBlrD,WAAWtrD,QAAQ/2F,OAAOsb,SAASQ,OAAQ,CACzC8R,QAAS2/K,YA8HXtT,YAAY73L,iBAAiBpC,OAAOuf,QAAQC,SAAUysL,qBAClD9zC,WAAWpvB,WAAY,CACzB,IAAIzlH,KAAO60I,WAAWtwB,yBAAyB0jE,0BAC/C,OAAOtR,YAAYsB,kBAAkBj4K,MAAM6iB,MAAK,SAAUqO,SAGxD,OAFAylJ,YAAY33L,oBAAoBtC,OAAOuf,QAAQC,SAAUysL,qBACzD5pD,WAAWtrD,QAAQ/2F,OAAOsb,SAASa,4BAC9ByuL,gBAAgB9M,uBAAgCp/L,IAAZ81C,QAGlCA,QAFEq/E,UAAUltF,OAAO,oDAG5B,GACF,CACA,OAAOktF,UAAUhnG,SACnB,EACI2gL,aAAe,SAAsBh5J,SAMvC,OALKo2J,gBAAgB9M,kBAAoBtpJ,QACvCo2J,gBAAgBlN,0BAA0BvlC,WAAW1jG,aAAa82I,0BAA2B/2J,SAE7Fo2J,gBAAgBrM,iBAAiBpmC,WAAW1jG,aAAa82I,2BAEpD13E,UAAUhnG,SACnB,EACI4gL,kBAAoB,WAClBt1C,WAAWnvB,UACb+iE,+BAEE5zC,WAAW1jG,aAAa82I,0BAA0B/kE,eACpD6b,WAAWtrD,QAAQ/2F,OAAOsb,SAASpC,oBACnC+xL,aAAa/V,kCAEb2X,wBAEJ,EACI9Y,SAAW,WACbuZ,gBAAgBnnK,KAAKqnK,cAAcrnK,KAAKsnK,mBAA0B,MAAEC,qBACtE,EACIC,sBAAwB,SAA+BrB,aACzD,IAAIC,gBAAkBpb,yBAAyB9uC,WAAY8V,WAAW1jG,aAAa82I,0BAA2Be,YAAaV,eAAe,EAAOzoD,UAAUz8C,aAY3J,OAXIyxD,WAAW1jG,aAAa82I,0BAA0B/kE,eACpD6b,WAAWnnD,GAAGl7F,OAAOsb,SAASoB,kBAAmBq3K,UACjD1xC,WAAWnnD,GAAGl7F,OAAOsb,SAASmB,qBAAsBowL,wBACpDxqD,WAAWnnD,GAAGl7F,OAAOsb,SAASqB,wBAAyBiwL,0BACvDvqD,WAAWnnD,GAAGl7F,OAAOsb,SAASsB,0BAA2BgwL,2BAEzDvqD,WAAWnnD,GAAGl7F,OAAOsb,SAASoB,kBAAmBq3K,WAEnDkX,aAAesB,iBACF5pD,WACbN,WAAWtrD,QAAQ/2F,OAAOsb,SAASkB,qBAC5B+vL,eACT,EACIqB,cAAgB,WAClB3C,aAAa3d,YAAW,GACxB2d,aAAe,KACf5oD,WAAWtrD,QAAQ/2F,OAAOsb,SAASG,QACnCgrJ,6BACF,EAMIonC,eAAiB,WACnB5C,aAAa3d,aACb2d,aAAe,KANXM,yBAA2BD,qBAC7BqC,uBAAsB,EAO1B,EAqBIG,qBAAuB,WACrB9C,iBACF3oD,WAAW9rD,IAAIv2F,OAAOsb,SAASK,aAAcoyL,kBAC7C1rD,WAAW9rD,IAAIv2F,OAAOsb,SAASO,YAAamyL,iBAC5ChD,eAAe75D,UACX65D,eAAelU,OACjBkU,eAAelU,MAAMpwL,SAEvBskM,eAAiB,KAErB,EACI+C,iBAAmB,SAA0BvxM,EAAGkpK,WAClDlpK,EAAEiG,iBACFqrM,uBACArnC,8BACIf,WAAaA,UAAU8wB,YACzBqU,iBAAmB,CACjBrU,UAAW9wB,UAAU8wB,UACrBC,SAAU/wB,UAAU+wB,SACpB5U,MAAOnc,UAAUmc,QAGrBkpB,oBACIe,8BACFjwH,OAEAwmE,WAAWtrD,QAAQ/2F,OAAOsb,SAASI,MAEvC,EACIsyL,gBAAkB,SAAyBxxM,GAC7CA,EAAEiG,iBACFipM,cAAe,EACfoC,uBACA/C,oBACKe,+BACHzpD,WAAWtrD,QAAQ/2F,OAAOsb,SAASM,KAEvC,EACIqyL,gBAAkB,WACpBh6B,6BAA+BA,4BAA4B/e,2BAG3DuR,+BACAukC,eAAiBlV,uBAAuBzzC,YACxCA,WAAWnnD,GAAGl7F,OAAOsb,SAASK,aAAcoyL,kBACxC51C,WAAW5jG,gBAAkBu6D,oBAAoB7H,qCACnDo7B,WAAWnnD,GAAGl7F,OAAOsb,SAASO,YAAamyL,iBAE3ChD,eAAenU,iBAEjBx0C,WAAWtrD,QAAQ/2F,OAAOsb,SAASiB,cACrC,EACI6wL,iBAAmB,WACjBnC,cAAgBA,aAAaxd,kBAC/Bwd,aAAaxd,gBAAgB+d,eAC7BP,aAAa5d,qBAEjB,EACI6gB,qBAAuB,SAA8B1X,UAAWC,SAAU5U,OAC5E,OAAI1pB,YACF9V,WAAWtrD,QAAQ/2F,OAAOsb,SAASgB,aAC5B29K,YAAYI,kBAAkBliC,WAAYq+B,UAAWC,SAAU5U,MAAO/yD,qBAAqB3oF,MAAK,SAAU8yJ,cAC/G9gC,WAAWhvB,eAAiB8vD,aAAa7vD,eACzCiZ,WAAWtrD,QAAQ/2F,OAAOsb,SAASU,gBACrC,IAAU,OAAE,SAAUsH,MAEpB,OADAoqL,uBACO75E,UAAUltF,OAAOrjB,KAC1B,KAEKuwG,UAAUhnG,SACnB,EACI6gL,qBAAuB,SAA8Bt8F,UAGvD,GAFAs6F,cAAe,EACfrpD,WAAWtrD,QAAQ/2F,OAAOsb,SAASpC,oBAC/Bk4F,UAAYA,SAASf,SAAWonF,YAAYE,oBAAqB,CACnE,IAAIwW,QAAU/8F,SAASg9F,cAAgBh9F,SAASg9F,aAAaC,QAAUj9F,SAASg9F,aAAaC,QAAU,KACnGF,SAAWA,UAAY1D,oBAAoBC,cAC7CroD,WAAWtrD,QAAQ/2F,OAAOsb,SAASwB,mBAEnCulI,WAAWtrD,QAAQ/2F,OAAOsb,SAASuB,gBAEvC,MACEwlI,WAAWtrD,QAAQ/2F,OAAOsb,SAAS7I,MAEvC,EACI67L,iBAAmB,WACrB,OAAOn2C,YAAcA,WAAWjvB,SAAW0iE,eAAiBF,cAAgBvzC,WAAWlkG,gBAAkB66D,oBAAoBnN,qBAC/H,EASI4sF,6BAA+B,WACS,OAAtCrD,oCAGJA,kCAAkCxkM,SAClCwkM,kCAAoC,KACtC,EACIsD,2BAA6B,WACW,OAAtCtD,oCAGJA,kCAAoC7jD,wBAAwBhF,WAAY6E,eAAeC,KAAMxuE,oBAAoBF,gBAAgB5J,kBAAkBoF,sBACrJ,EACIw6H,2BAA6B,WAC/BtD,0BAA4B9jD,wBAAwBhF,WAAY6E,eAAeE,QAASzuE,oBAAoBF,gBAAgB5J,kBAAkBqF,yBAA0ByE,oBAAoBF,gBAAgB5J,kBAAkBsF,oCAAoC,WAChQ74E,OAAOm1D,SAASi+I,QAClB,GACF,EACIC,6BAA+B,WACjCvD,8BAAgC/jD,wBAAwBhF,WAAY6E,eAAeE,QAASzuE,oBAAoBF,gBAAgB5J,kBAAkBmF,6BACpJ,EAyEI46H,kBAAoB,SAA2BC,QACjD,OAAQA,QACN,KAAKvR,eAAeC,OAEhBqN,gBAAkBnN,aAClB,MAEJ,KAAKH,eAAeE,IAEhBoN,gBAAkBtM,UAClB,MAEJ,QACE,MAAM,IAAI7rL,MAAM,8BAEtB,EAUIq8L,oBAAsB,SAA6BlT,yBAA0BmT,mBAC/E,OAAO9U,YAAY0B,aAAaC,yBAA0BmT,kBAC5D,EACIC,0BAA4B,WAC9BnzH,MACF,EACIozH,qBAAuB,SAASA,uBAElC5sD,WAAW9rD,IAAIv2F,OAAO4W,OAAOC,mBAAoBo4L,sBApCjDzD,cApdqB,GACJ,GAodjB4B,mBAqCKtB,+BAAkCF,gBAAiBzzC,WAAWpvB,aAAcovB,WAAWlkG,eAAkB66D,oBAAoBnN,uBAA0BmN,oBAAoB1K,oBAG9K2mF,oBAFAkD,iBAIJ,EA4CIpyH,KAAO,WACLs8E,WAAWpvB,YAET8hE,iBACqBqD,qBAAqBrD,iBAAiBrU,UAAWqU,iBAAiBpU,SAAUoU,iBAAiBhpB,OAE7FqsB,wBAEG,OAAE,SAAU1xM,GACtC+xE,IAAIC,aAAa,+BAAiChyE,EACpD,IAEA6lJ,WAAWtrD,QAAQ/2F,OAAOsb,SAASU,iBAErC2vL,YAAa,CACf,EAYIuD,aAAe,SAAsBC,cAEvC7D,qBADAnzC,WAAag3C,cACoB7lE,mBACjC+9D,kBAAkBrkD,UAAYmV,UAChC,EAsBA,OAnBA2yC,kBAAoB,IAAIj3E,WAAU,SAAUu7E,kBAC1CrE,kBAAoBqE,gBACtB,IACAF,aAAalsD,WA/EXX,WAAWnnD,GAAGl7F,OAAOwZ,MAAMkB,UAAWs0L,2BACtC3sD,WAAWnnD,GAAGl7F,OAAO4W,OAAOC,mBAAoBo4L,sBAChD5sD,WAAWnnD,GAAGl7F,OAAOsb,SAASY,2BAA4BsyL,4BAC1DnsD,WAAWnnD,GAAGl7F,OAAOsb,SAASa,2BAA4BoyL,8BAC1DlsD,WAAWnnD,GAAGl7F,OAAOsb,SAASuB,gBAAiB4xL,4BAC/CpsD,WAAWnnD,GAAGl7F,OAAOsb,SAASwB,kBAAmB6xL,8BA4E/C7/E,oBAAoBnG,cACtBimF,kBAAkBtR,eAAeC,QAEjCqR,kBAAkBtR,eAAeE,KAE/BsO,gCApOEwC,oBACFL,kBAwMGK,oBACHJ,uBAA8B,OAAE,SAAU1xM,GACxC+xE,IAAIC,aAAa,+BAAiChyE,EACpD,IA2BFsyM,oBAAoB,IAAK,CAAC,KAEShgF,oBAAoB9E,eAAiBzN,eAAeE,UAAY0mC,UAAUvhJ,OAASiiJ,cAAcxhI,SAEpI4sL,uBAEKrzM,OAAOsX,iBAAiB,CAC7Bi+H,QAzFY,WACZ28D,uBACI7C,eACFA,aAAa3d,YAAW,GACxB2d,aAAe,MAEjBhR,YAAYhrD,uBACRoT,aACFA,WAAW9rD,IAAIv2F,OAAOwZ,MAAMkB,UAAWs0L,2BACvC3sD,WAAW9rD,IAAIv2F,OAAO4W,OAAOC,mBAAoBo4L,sBACjD5sD,WAAW9rD,IAAIv2F,OAAOsb,SAASY,2BAA4BsyL,4BAC3DnsD,WAAW9rD,IAAIv2F,OAAOsb,SAASa,2BAA4BoyL,8BAC3DlsD,WAAW9rD,IAAIv2F,OAAOsb,SAASuB,gBAAiB4xL,4BAChDpsD,WAAW9rD,IAAIv2F,OAAOsb,SAASwB,kBAAmB6xL,8BAClDtsD,WAAW9rD,IAAIv2F,OAAOsb,SAASoB,kBAAmBq3K,UAClD1xC,WAAW9rD,IAAIv2F,OAAOsb,SAASmB,qBAAsBowL,wBACrDxqD,WAAW9rD,IAAIv2F,OAAOsb,SAASqB,wBAAyBiwL,0BACxDvqD,WAAW9rD,IAAIv2F,OAAOsb,SAASsB,0BAA2BgwL,2BAE5DvB,kBAAoBA,iBAAiBl6D,UACrCo9D,+BACApD,2BAA6BA,0BAA0BzkM,SACvD0kM,+BAAiCA,8BAA8B1kM,SAC/DyxJ,WAAa,KACbmzC,oBAAsB,EACtBC,yBAA2B,EAC3BC,cAAgB,EAChBC,SAAW,KACXC,cAAe,EACfC,YAAa,EACbC,eAAgB,EAChBC,mBAAqB,GACrBjB,gBAAkB,KAClBE,kBAAoB,IACtB,EAwDEuE,wBA9M4B,WAC5B,OAAO/D,oBAAsB,CAC/B,EA6MEgE,qBA5OyB,WACzB,OAAOzD,kBACT,EA2OE0D,uBArN2B,WAC3B,GAAIhE,yBAA2BD,oBAC7B,OAAOqC,uBAAsB,EAEjC,EAkNE6B,gBA3MoB,SAAyB3nI,MAC7C,IAAI4nI,qBAAuB,EACvBpnE,YAAc,EAClB,IAAKvZ,oBAAoB1K,oBAGvB,IAFA,IAAI1uD,QAAUyiG,WAAW9uB,uBACrBqmE,cAAgBh6I,QAAQ14D,OACnBD,EAAI,EAAGA,EAAI2yM,cAAe3yM,IACjC,IAAK24D,QAAQ34D,GAAGmzF,YAAck2B,yBAA2B1wD,QAAQ34D,GAAGkwC,WAAa46B,OAASnS,QAAQ34D,GAAGimI,aAAettE,QAAQ34D,GAAG+lI,YAAcj7D,MAAQA,MAAQnS,QAAQ34D,GAAGgmI,UAAW,CACjL0sE,oBAAsB/5I,QAAQ34D,GAAGwlI,iBACjC8F,WAAa3yE,QAAQ34D,GAAGkwC,UACxB,KACF,CAGJ,MAAO,CACL7+B,GAAIqhM,oBACJpnE,WAEJ,EA0LEsnE,4BAzLgC,SAAqCptE,kBACrE,OAAO41B,WAAW/vB,+BAA+B7F,iBACnD,EAwLEqtE,mCAvLuC,SAA4C/sE,cAAegtE,gBAClG13C,WAAW1jG,aAAaouE,eAAe4B,6BAA+BorE,cACxE,EAsLEC,eArLmB,SAAwBvtE,kBACtC0oE,eACHM,yBAA2BhpE,iBAC3BkkC,+BAGIrgD,yBAA2B+xC,WAAW1jG,aAAa8tE,kBAAkBt1F,WAAakrH,WAAW5uB,mBAAqB4uB,WAAW1jG,aAAa8tE,kBAAkB98B,WAC9JkoG,uBAAsB,GApLJ,WACtB,IAAI9xD,WAEFA,WADEz1B,wBACWztC,oBAAoBF,gBAAgB5J,kBAAkB0F,WAEtDoE,oBAAoBF,gBAAgB5J,kBAAkB4D,aAErE,IAAI57C,OAASw+J,4BAA4BC,cAAcz5C,WAAYljE,oBAAoBF,gBAAgB5J,kBAAkByD,oBACzH+vE,WAAWxlD,OAAOhmE,QAClBo0K,aAAe5V,4BACf+X,oBAC8B,IAA1Bj1C,WAAW7jG,YACboiD,EAAE2+E,4BAA4BE,uBAAuBthG,OAEvDyiB,EAAE2+E,4BAA4BE,uBAAuBr6F,GAAG,QAAS0yG,eACjEl3F,EAAE2+E,4BAA4BG,wBAAwBt6F,GAAG,QAAS2yG,gBAClExY,4BAA4B1yC,WAC5B0yC,4BAA4BhI,qBAC5BhrC,WAAWtrD,QAAQ/2F,OAAOsb,SAAS7G,oBACrC,CAmKMs7L,GAGN,EA0KEC,SAzKa,WACQ,OAAjB/E,aACF0C,uBAAsB,GAEtB1C,aAAatoD,UAEjB,EAoKEstD,SAnKa,WACbhF,aAAavoD,UACf,EAkKEwtD,YAjKgB,SAAqB31C,MACrCkxC,SAAWlxC,KACP0wC,eACEA,aAAatd,SACfsd,aAAatd,QAAQ8d,UAEvB2B,mBAEJ,EA0JE+C,sBArI0B,WAC1B,OAAIrE,8BACKj4E,UAAUhnG,UAEZotK,YAAYgC,mBAAmB91J,MAAK,SAAUqO,SAEnD,OADA62J,iBAAmBnP,6BApcd/4C,UAAUhP,aAocoD3/F,QAAQ0mJ,oBAAqB1mJ,QAAQ4mJ,eACjGvnE,UAAUhnG,SACnB,GACF,EA8HEiiL,oBACAsB,kBA5CsB,SAA2BC,mBACjDl4C,WAAW5vB,aAAa8nE,mBACxBtE,8BACF,GA0CG,CACDuE,mBAAoB,CAClB1xM,IAAK,WACH,OAAOksM,iBACT,GAEF7nD,YAAa,CACXrkJ,IAAK,WACH,OAAO8sM,YACT,EACAntM,IAAK,SAAauR,OAChB47L,aAAe57L,KACjB,GAEFygM,UAAW,CACT3xM,IAAK,WACH,OAAO+sM,UACT,GAEFr8D,QAAS,CACP1wI,IAAK,WACH,OAAOu5J,YAAcA,WAAWjvB,MAClC,GAEFsnE,WAAY,CACV5xM,IAAK,WACH,OAAwB,OAAjBqsM,YACT,GAEF5Z,aAAc,CACZ9yL,IAAK,SAAa8yL,cAChBua,cAAgBva,YAClB,EACAzyL,IAAK,WACH,OAAOgtM,aACT,GAEF5oD,UAAW,CACTpkJ,IAAK,WACH,OAAOu5J,UACT,EACA55J,IAAK2wM,cAEPuB,iBAAkB,CAChB7xM,IApQmB,WACrB,OAAO0sM,oBAAsB,CAC/B,IAqQF,EA+PIoF,6BAhOsB,SAA6BruD,WAAYc,UAAWP,eAAgBgsB,uBAAwBxoD,wBAAyBuqF,eAC7I,IAAK/tD,eACH,MAAM,IAAInwI,MAAM,qEAElB,IAAIm+L,mBACAC,2BACAC,6BACAn8B,cAAe,EACfo8B,0BAA4B,WAC9B,GAAKniC,uBAAL,CAGA,IAAIoiC,cAAgB3uD,WAAWj6H,SAAS+7E,KAEpC8sG,iBADkBriC,uBAAuB3P,iCAAiC2xC,oBACrCI,cACzCpuD,eAAestD,YAAYe,iBAJ3B,CAKF,EACIC,WAAa,SAAoB7lB,SAAUvsB,eAC7C,IAAIqyC,aAAetuD,8BAA8BM,UAAUhP,aAAck3C,UACzEhpC,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMI,WAAY,CAC1CiuD,KAAMspI,aACNryC,eAEJ,EACIsyC,eAAiB,SAAwB1qD,2BAC3C,GAAK9D,eAAeK,cAAe0xB,aAAnC,CAGA,IACIrsC,GAAKsa,eAAe4sD,gBAAgB9oD,2BACxC,GAAIpe,GAAGl6H,GAAK,EACVwiM,oBAAsB,OAGxB,GAAIA,qBAAuBtoE,GAAGl6H,GAAI,CAahC,GAZAslJ,WAAWL,oBAEXhR,WAAWtrD,QAAQ/2F,OAAO+W,SAASS,SACnC6qI,WAAWtrD,QAAQ/2F,OAAO+W,SAASO,SACnCs5L,mBAAqBtoE,GAAGl6H,GACxByiM,2BAA6BvoE,GAAGD,WAZD,IAa/Bga,WAAW9O,YAAYyB,eAAgB,EACvCmO,UAAUhP,aAAa5jF,QACvB8xF,WAAWtrD,QAAQ/2F,OAAOsb,SAASlC,QAI/B+pI,UAAUvhJ,OAASiiJ,cAAcxhI,QACnC,IAAIgvL,WAAarkD,aAAY,WAC3B7J,UAAUhP,aAAa5jF,QACvB2gJ,WAAWL,4BAA4B,GACnC1tD,UAAUhP,aAAaztC,YAAYv9B,QAAQ,KAAO0nI,2BAA2B1nI,QAAQ,IAAMg6E,UAAUhP,aAAalC,QACpH8a,cAAcskD,WAElB,GApEyB,UAsEzBxjM,YAAW,WACTqjM,WAAWL,4BAA4B,EACzC,GAxEyB,KA4E3B,GAFAjuD,eAAektD,eAAexnE,GAAGl6H,IACjC2iM,4BACIpiD,2BAA4B,EACzB9rG,MAAMylF,GAAGD,aAAesmB,6CAC3BA,+BAA+BrmB,GAAGD,YAElC95D,IAAIE,WAAW,4FAA8F65D,GAAGD,WAAa,KAE/H,IAAIwnE,eAAiBlhD,mDAAmD/L,eAAe+sD,4BAA4BrnE,GAAGl6H,IAAKk6H,GAAGD,YAC9Hua,eAAegtD,mCAAmCgB,mBAAoBf,eACxE,CACF,CA5CA,CA6CF,EACIyB,iBAAmB,SAA0B/vM,MAAO+hB,MACtD,OAAQ/hB,MAAMK,MACZ,KAAK5B,OAAOsb,SAAS7G,oBACrB,KAAKzU,OAAOsb,SAASkB,oBACnB6lI,WAAWtrD,QAAQ/2F,OAAOsb,SAAS0B,YACnCqlI,WAAWtrD,QAAQ/2F,OAAOsb,SAAS2B,WACnC,MACF,KAAKjd,OAAOsb,SAASE,SACrB,KAAKxb,OAAOsb,SAASG,OAMnB,GALA4mI,WAAWtrD,QAAQ/2F,OAAOsb,SAAS4B,UACnCmlI,WAAWtrD,QAAQ/2F,OAAO+W,SAASU,QACnCi8I,WAAWI,uBACX8a,uBAAuB1R,oBACvB7a,WAAW9O,YAAYyB,eAAgB,EACnCzzI,MAAMK,OAAS5B,OAAOsb,SAASG,QAAU2qG,wBAAyB,CACpE,IAAImrF,wBAA0B3uD,eAAe+sD,4BAA4BiB,oBAAsB,IAC/FA,oBAAsB,EACtBM,WAAWK,yBAAyB,EACtC,MACEpuD,UAAUhP,aAAa/C,OAEzB,MACF,KAAKpxI,OAAOsb,SAASI,MACnBkzJ,uBAAuB1R,oBACvB7a,WAAWtrD,QAAQ/2F,OAAOsb,SAASC,mBACnC,MACF,KAAKvb,OAAOsb,SAASM,KACnBgzJ,uBAAuB7O,6BAA4B,GACnD1d,WAAWtrD,QAAQ/2F,OAAOsb,SAASC,mBACnC,MACF,KAAKvb,OAAOsb,SAAS7I,MACnBq+L,6BAA+BzpD,wBAAwBhF,WAAY6E,eAAeC,KAAMxuE,oBAAoBF,gBAAgB5J,kBAAkB+F,iCAAkC+D,oBAAoBF,gBAAgB5J,kBAAkBgD,QACtO,MACF,KAAK7xE,OAAOsb,SAASQ,OACnB60L,cAAca,eAAeluL,KAAKsK,SAClC,MACF,KAAK5tB,OAAOsb,SAASpC,mBACrB,KAAKlZ,OAAOsb,SAASW,UACnB00L,cAAcjuD,WACd,MACF,KAAK1iJ,OAAOsb,SAASU,gBAEnB,GADA4yJ,wBAA0BA,uBAAuB1R,oBAC7Cta,eAAetT,SAAWsT,eAAeI,UAAU7Z,eAAgB,CACrEyZ,eAAeutD,wBACf,IAAIl7D,WAAa,QAAU2N,eAAeI,UAAU7Z,eACpDga,UAAU6D,wBAA0B7D,UAAU6D,uBAAuB/Q,cAAchB,WACrF,CACAoN,WAAWtrD,QAAQ/2F,OAAOsb,SAAS4B,UACnC,MACF,KAAKld,OAAOsb,SAASsB,0BACnB,IAAI60L,oBAAsBnuL,KAAKuuC,WAAa,IAC5C+8G,uBAAuB1U,sCAAsCu3C,qBAC7DP,WAAWO,qBAGjB,EACInzC,iBAAmB,WAErB,IAAK1b,eAAetT,SAAWsT,eAAetT,WAAasT,eAAeK,aAAeL,eAAe2tD,WACtGI,cAAcjuD,eACT,CAEL,IAAIgvD,kBAAoB9uD,eAAe0sD,uBACnCoC,oBACFvuD,UAAUhP,aAAa5jF,QACvBogJ,cAAca,eAAeE,mBAEjC,CACF,EACI51B,kBAAoB,WACtBs1B,eAAejuD,UAAUuD,0BAC3B,EACIy1B,SAAW,WACbi1B,eAAejuD,UAAUuD,0BAC3B,EACIirD,uBAAyB,WAC3B/iC,uBAAuB1R,mBACzB,EACIwY,mBAAqB,WACvBf,cAAe,CACjB,EACIgB,iBAAmB,WACrBhB,cAAe,EACfmH,mBACF,EA+DA,OAJAj5B,gCAAgCD,gBAChCgsB,wBAA0BA,uBAAuB7O,4BAA4Bnd,eAAeI,WAAaJ,eAAeK,cAAgBn0B,oBAAoB1K,qBAC5Jw+B,eAAeyuC,aAAeluC,UAAUvhJ,OAASiiJ,cAAcv1G,MA5D5C,WACjB60G,UAAUmD,aAAaprD,GAAG,aAAc4gF,mBAAmB,GAC3D34B,UAAUmD,aAAaprD,GAAG,OAAQ4gF,mBAAmB,GACrD,IAAIM,aAAe,CACjBC,eAAgB/d,iBAChBge,WAAYR,kBACZS,OAAQJ,UAEVh5B,UAAUmD,aAAaprD,GAAGkhF,cAC1B/5B,WAAWnnD,GAAGl7F,OAAO+W,SAASqB,qBAAsBu5L,wBACpDtvD,WAAWnnD,GAAGl7F,OAAO+W,SAAS9B,aAAc87L,2BAC5C1uD,WAAWnnD,GAAGl7F,OAAOsb,SAASE,SAAU81L,kBACxCjvD,WAAWnnD,GAAGl7F,OAAOsb,SAASG,OAAQ61L,kBACtCjvD,WAAWnnD,GAAGl7F,OAAOsb,SAASI,MAAO41L,kBACrCjvD,WAAWnnD,GAAGl7F,OAAOsb,SAASM,KAAM01L,kBACpCjvD,WAAWnnD,GAAGl7F,OAAOsb,SAAS7I,MAAO6+L,kBACrCjvD,WAAWnnD,GAAGl7F,OAAOsb,SAASQ,OAAQw1L,kBACtCjvD,WAAWnnD,GAAGl7F,OAAOsb,SAASS,mBAAoBu1L,kBAClDjvD,WAAWnnD,GAAGl7F,OAAOsb,SAASW,UAAWq1L,kBACzCjvD,WAAWnnD,GAAGl7F,OAAOsb,SAASU,gBAAiBs1L,kBAC/CjvD,WAAWnnD,GAAGl7F,OAAOsb,SAASsB,0BAA2B00L,kBACzDjvD,WAAWnnD,GAAGl7F,OAAOsb,SAASpC,mBAAoBo4L,kBAClDjvD,WAAWnnD,GAAGl7F,OAAOsb,SAAS7G,oBAAqB68L,kBACnDjvD,WAAWnnD,GAAGl7F,OAAOsb,SAASkB,oBAAqB80L,kBACnDjvD,WAAWnnD,GAAGl7F,OAAOmb,UAAUC,QAASs6J,oBACxCrzB,WAAWnnD,GAAGl7F,OAAOmb,UAAUE,MAAOs6J,iBACxC,CAmCA5nB,GACOnyJ,OAAOsX,iBAAiB,CAC7Bi+H,QATY,YA3BO,WACnBgS,UAAUmD,aAAa/vD,IAAI,aAAculF,mBAAmB,GAC5D34B,UAAUmD,aAAa/vD,IAAI,OAAQulF,mBAAmB,GACtD,IAAIM,aAAe,CACjBC,eAAgB/d,iBAChBge,WAAYR,kBACZS,OAAQJ,UAEVh5B,UAAUmD,aAAa/vD,IAAI6lF,cAC3B/5B,WAAW9rD,IAAIv2F,OAAO+W,SAASqB,qBAAsBu5L,wBACrDtvD,WAAW9rD,IAAIv2F,OAAO+W,SAAS9B,aAAc87L,2BAC7C1uD,WAAW9rD,IAAIv2F,OAAOsb,SAASE,SAAU81L,kBACzCjvD,WAAW9rD,IAAIv2F,OAAOsb,SAASG,OAAQ61L,kBACvCjvD,WAAW9rD,IAAIv2F,OAAOsb,SAASI,MAAO41L,kBACtCjvD,WAAW9rD,IAAIv2F,OAAOsb,SAASM,KAAM01L,kBACrCjvD,WAAW9rD,IAAIv2F,OAAOsb,SAAS7I,MAAO6+L,kBACtCjvD,WAAW9rD,IAAIv2F,OAAOsb,SAASQ,OAAQw1L,kBACvCjvD,WAAW9rD,IAAIv2F,OAAOsb,SAASS,mBAAoBu1L,kBACnDjvD,WAAW9rD,IAAIv2F,OAAOsb,SAASW,UAAWq1L,kBAC1CjvD,WAAW9rD,IAAIv2F,OAAOsb,SAASU,gBAAiBs1L,kBAChDjvD,WAAW9rD,IAAIv2F,OAAOsb,SAASsB,0BAA2B00L,kBAC1DjvD,WAAW9rD,IAAIv2F,OAAOsb,SAASpC,mBAAoBo4L,kBACnDjvD,WAAW9rD,IAAIv2F,OAAOsb,SAAS7G,oBAAqB68L,kBACpDjvD,WAAW9rD,IAAIv2F,OAAOsb,SAASkB,oBAAqB80L,kBACpDjvD,WAAW9rD,IAAIv2F,OAAOmb,UAAUC,QAASs6J,oBACzCrzB,WAAW9rD,IAAIv2F,OAAOmb,UAAUE,MAAOs6J,iBACzC,CAEE6G,GACAs0B,8BAAgCA,6BAA6BpqM,QAC/D,GAOG,CAAC,EACN,EAoOIkrM,kCArM2B,SAAkCvvD,WAAYc,UAAWlrB,UAAW2qB,eAAgB9zB,qBACjH,IAAI+iF,oBAAqB,EACrBC,0BAA4B,EAI5BC,mBAAqB,WACvBpjD,kCAAoE,IAAlCxL,UAAUhP,aAAa/mG,UAHlD+1G,UAAU4D,eAAiBj4B,oBAAoBuE,eAAiBg0E,kBAAkBkD,uBAAyBlD,kBAAkB6C,0BAA4B,IAK9J8H,mBAAmB3K,kBAAkB6C,0BAA2B7C,kBAAkB2C,+BAClF3nD,WAAWtrD,QAAQ/2F,OAAOwZ,MAAMI,WAAY,CAC1CiuD,KAAMw/H,kBAAkB6C,0BACxBprC,eAAe,IAGrB,EAmCImzC,iBAAmB,SAA0BvrD,2BAC3CiI,4BAnCgB,SAAyBjI,2BAC7C,GAAKvD,UAAUhP,aAAa/mG,UAGvBuhH,2BAAL,CAGKA,8CACHojD,qBAEGlvJ,MAAM6jG,2BAGTn4E,IAAIE,WAAW,oCAAsCi4E,0BAA4B,KAFjFiI,+BAA+BjI,2BAIjC,IAAImpD,eAAiBhlM,KAAK8kC,MAA8C,IAAxCg/G,uCAIhC,GAHI04C,kBAAkByC,aACpBzC,kBAAkBwC,6BAA6B,IAAOgG,eAAgBlhD,qCAEpE7/B,oBAAoBa,kBAClBkgF,gBAAkBiC,0BAjDE,GAkDtB,KAAOA,0BAlDe,IAkDwCjC,iBAC5DiC,2BAnDoB,IACZ,MAoDNA,0BApDM,KAsDRj/D,2BAA2B7yI,OAAO+e,UAAUR,mBAAoB,WAAauzL,0BAA4B,YACzGj/D,8BAA8B7yI,OAAOme,IAAII,mBAAoB,CAC3D2zL,eAAgBJ,2BAtBxB,CA2BF,CAGIK,CAAgBzrD,0BAEpB,EACIo1B,kBAAoB,WACtBm2B,iBAAiB9uD,UAAUuD,0BAC7B,EACIy1B,SAAW,WACb81B,iBAAiB9uD,UAAUuD,0BAC7B,EACI0rD,eAAiB,SAASA,iBAC5B,GAAIzjD,6BACFA,oCAAmC,IAAI16H,MAAOk+I,WAC1CrjD,oBAAoBa,kBAAkB,CACxC,IAAI0iF,YAAcvjF,oBAAoB/G,gCAAkC8qB,+BAAiC5a,UAAUkB,aAAatC,IAC5H/H,oBAAoB5G,2BACtB2qB,2BAA2B7yI,OAAO+e,UAAUV,0BAA2Bg0L,YAAa1jD,kCAAoC,KACxH9b,8BAA8B7yI,OAAOme,IAAIE,0BAA2B,CAClEi0L,iBAAkB3jD,kCAAoC,QAGxD9b,2BAA2B7yI,OAAO+e,UAAUT,iBAAkB+zL,YAAa1jD,mCAC3E9b,8BAA8B7yI,OAAOme,IAAIG,iBAAkB,CACzDg0L,iBAAkB3jD,oCAGxB,CAEFxL,UAAUmD,aAAa/vD,IAAI,UAAW67G,eACxC,EACIG,wBAA0B,WAI5B,GAHI5jD,4BACFA,sCAAqC,IAAI16H,MAAOk+I,WAE9CrjD,oBAAoBa,kBAAoBkiF,mBAAoB,CAC9DA,oBAAqB,EACrB,IAAIW,wBAA0B1jF,oBAAoB/G,gCAAkC8qB,+BAAiC5a,UAAUkB,aAAatC,IAC5Igc,2BAA2B7yI,OAAO+e,UAAUX,aAAco0L,yBAC1D3/D,2BAA2B7yI,OAAO+e,UAAUR,mBAAoB,qBAChEs0H,8BAA8B7yI,OAAOme,IAAIC,aAAc,MACvDy0H,8BAA8B7yI,OAAOme,IAAII,mBAAoB,CAC3D2zL,eAAgB,GAEpB,CACF,EACIO,WAAa,SAAoBj2M,EAAGkpK,WAClCA,UAAU0mB,iBAAmBt9D,oBAAoBa,mBACnDkjB,2BAA2B7yI,OAAO+e,UAAUP,oBAAqBswG,oBAAoBnL,qBACrFkvB,8BAA8B7yI,OAAOme,IAAIK,oBAAqB,CAC5Dk0L,gBAAiB5jF,oBAAoBnL,sBAG3C,EACIsoE,qBAAuB,WACzB,GAAIn9D,oBAAoBa,iBAAkB,CACxC,IAAI0iF,YAAcvjF,oBAAoB/G,gCAAkC8qB,+BAAiC5a,UAAUkB,aAAatC,IAChIgc,2BAA2B7yI,OAAO+e,UAAUnL,YAAay+L,aACzDx/D,8BAA8B7yI,OAAOme,IAAIvK,YAAa,KACxD,CACF,EACI++L,uBAAyB,WAC3B,GAAI7jF,oBAAoBa,iBAAkB,CACxC,IAAI0iF,YAAcvjF,oBAAoB/G,gCAAkC8qB,+BAAiC5a,UAAUkB,aAAatC,IAChIgc,2BAA2B7yI,OAAO+e,UAAUN,cAAe4zL,aAC3Dx/D,8BAA8B7yI,OAAOme,IAAIM,cAAe,KAC1D,CACF,EACIm0L,mBAAqB,WACvB,IAAIP,YAAcvjF,oBAAoB/G,gCAAkC8qB,+BAAiC5a,UAAUkB,aAAatC,IAChIgc,2BAA2B7yI,OAAO+e,UAAUL,qBAAsB2zL,aAClEx/D,8BAA8B7yI,OAAOme,IAAIO,qBAAsB,KACjE,EACIm0L,oBAAsB,WACxB,IAAIR,YAAcvjF,oBAAoB/G,gCAAkC8qB,+BAAiC5a,UAAUkB,aAAatC,IAChIgc,2BAA2B7yI,OAAO+e,UAAUJ,sBAAuB0zL,aACnEx/D,8BAA8B7yI,OAAOme,IAAIQ,sBAAuB,KAClE,EACIqzL,mBAAqB,SAA4B9H,0BAA2BF,+BAC9Er7C,0CAA0Cq7C,+BAC1Cr7C,+BAA2D,IAA5Bu7C,0BACjC,EACI4I,kBAAoB,WACtB,IAAIC,sBAAwBnwD,gBAAkBA,eAAetT,SAAWsT,eAAeK,YACnF+vD,qCAAuClkF,oBAAoBa,kBAAoBb,oBAAoBuE,eAAiBvE,oBAAoBwB,0BAA4ByiF,uBACvI96E,UAAUyB,YAAcs5E,sCAEvDrkD,2BAA0B,EAE9B,EACIskD,oBAAsB,WACxBv+E,iCAAiC10H,OAAO+d,OAAOC,aAAche,OAAO+d,OAAOC,cAC3E02G,iCAAiC10H,OAAO+d,OAAOhG,kBAAmB/X,OAAO+d,OAAOhG,mBAChF86H,2BAA2B7yI,OAAO+e,UAAUC,cAAei5G,UAAUkB,aAAatC,KAClFgc,8BAA8B7yI,OAAOme,IAAIpG,kBAAmB,KAC9D,EAgDA,OA/CmB,WACjBsqI,WAAWnnD,GAAGl7F,OAAO+W,SAASgC,gBAAiB+5L,mBAC/CzwD,WAAWnnD,GAAGl7F,OAAO+W,SAASgB,kBAAmBk7L,qBACjD5wD,WAAWnnD,GAAGl7F,OAAOwZ,MAAMM,IAAK24L,YAChCpwD,WAAWnnD,GAAGl7F,OAAOwZ,MAAMK,OAAQoyK,sBACnC5pC,WAAWnnD,GAAGl7F,OAAO8f,iBAAiBF,KAAMgzL,oBAC5CvwD,WAAWnnD,GAAGl7F,OAAO8f,iBAAiBC,QAAS8yL,qBAC/C1vD,UAAUmD,aAAaprD,GAAG,aAAc4gF,mBAAmB,GAC3D34B,UAAUmD,aAAaprD,GAAG,OAAQ4gF,mBAAmB,GACrD,IAAIM,aAAe,CACjBE,WAAYR,kBACZo3B,QAASd,eACT71B,OAAQJ,SACR9pC,MAAOsgE,wBAETxvD,UAAUmD,aAAaprD,GAAGkhF,cAC1Bj5B,UAAUhP,aAAa/xI,iBAAiBpC,OAAOwZ,MAAMC,KAAM84L,wBAC7D,CAsBAxkD,GACI5K,UAAUmD,aAAa6sD,eACzBhwD,UAAUmD,aAAa6sD,cAAchtK,MAAK,WACxC,OAAOg9G,UAAUmD,aAAa8sD,aAAajtK,MAAK,WAC9CisK,gBACF,GACF,IAEKx2M,OAAOsX,iBAAiB,CAC7Bi+H,QAZY,YAlBO,WACnBkR,WAAW9rD,IAAIv2F,OAAO+W,SAASgC,gBAAiB+5L,mBAChDzwD,WAAW9rD,IAAIv2F,OAAO+W,SAASgB,kBAAmBk7L,qBAClD5wD,WAAW9rD,IAAIv2F,OAAOwZ,MAAMM,IAAK24L,YACjCpwD,WAAWnnD,GAAGl7F,OAAOwZ,MAAMK,OAAQoyK,sBACnC5pC,WAAWnnD,GAAGl7F,OAAO8f,iBAAiBF,KAAMgzL,oBAC5CvwD,WAAWnnD,GAAGl7F,OAAO8f,iBAAiBC,QAAS8yL,qBAC/C1vD,UAAUmD,aAAa/vD,IAAI,aAAculF,mBAAmB,GAC5D34B,UAAUmD,aAAa/vD,IAAI,OAAQulF,mBAAmB,GACtD,IAAIM,aAAe,CACjBE,WAAYR,kBACZo3B,QAASd,eACT71B,OAAQJ,SACR9pC,MAAOsgE,wBAETxvD,UAAUmD,aAAa/vD,IAAI6lF,cAC3Bj5B,UAAUhP,aAAa7xI,oBAAoBtC,OAAOwZ,MAAMC,KAAM84L,wBAChE,CAEE/1B,EACF,GAWG,CAAC,EACN,EAgFI62B,gCArDyB,SAAgChxD,YAC3D,IAAIixD,uBAAyBjxD,WAAW/uH,KAAK,2BAC7CggL,uBAAuBr/G,OACvB,IAAIs/G,iCAAmC,SAA0C/2M,GAChE,YAAXA,EAAEoF,MAdS,KAccpF,EAAEu9F,SAbb,KAayCv9F,EAAEu9F,QAEvC,UAAXv9F,EAAEoF,MAhBE,KAgBmBpF,EAAEu9F,SAflB,KAe8Cv9F,EAAEu9F,SAChEsoD,WAAWtrD,QAAQ/2F,OAAOif,OAAOK,sBAFjC+iI,WAAWtrD,QAAQ/2F,OAAOif,OAAOI,uBAIrC,EACIm0L,mCAAqC,SAA4Ch3M,GACpE,cAAXA,EAAEoF,KACJygJ,WAAWtrD,QAAQ/2F,OAAOif,OAAOE,0BACb,YAAX3iB,EAAEoF,MACXygJ,WAAWtrD,QAAQ/2F,OAAOif,OAAOG,uBAErC,EACIq0L,iBAAmB,WACrB,IAAIzoF,iBAAmB8D,oBAAoBhE,sBACtCE,mBAGLsoF,uBAAuBt/G,OACvBg3B,iBAAiByqC,gCAAgCh1I,4BAA4BE,MAAO2yL,wBACtF,EACII,cAAgB,SAAuBvxM,UAAWmhB,MAChDA,KAAKkyI,kBAAoB/0I,4BAA4BE,OACvD8yL,kBAEJ,EAoBA,OAlBEpxD,WAAWnnD,GAAGl7F,OAAOif,OAAOC,MAAOw0L,eACnCJ,uBAAuBp4G,GAAG,YAAas4G,oCACvCF,uBAAuBp4G,GAAG,UAAWs4G,oCACrCF,uBAAuBp4G,GAAG,UAAWq4G,kCACrCD,uBAAuBp4G,GAAG,QAASq4G,kCAarCE,mBACO73M,OAAOsX,iBAAiB,CAC7Bi+H,QANY,WANZkR,WAAW9rD,IAAIv2F,OAAOif,OAAOC,MAAOw0L,eACpCJ,uBAAuB/8G,IAAI,YAAai9G,oCACxCF,uBAAuB/8G,IAAI,UAAWi9G,oCACtCF,uBAAuB/8G,IAAI,UAAWg9G,kCACtCD,uBAAuB/8G,IAAI,QAASg9G,iCAItC,GAKG,CAAC,EACN,EAmGII,gCA7EyB,SAAgC5jC,wBAAyB57B,aAAclxB,WAAY2wF,qBAC9G,IAAI/7C,WAAapgD,0BACbo8F,cAAgBp8F,6BAEhBq8F,iBAAmBD,cAAcE,cAAgB,CAAC,EACtDD,iBAAiBE,iBAAmBH,cAAcE,aAAaC,kBAAoB,WAAa,EAChGn8C,WAAWo8C,cAAgBp8C,WAAWo8C,eAAiB,WAAa,EAEpE,IAAIC,cAAe,EACfC,YAAc,WAChBL,iBAAiBr3F,SAAW,IAAIo7C,WAAWo8C,cAAc,CACvD12I,MAAO0lD,WACPmxF,QAAS,CAAC,CACRl5H,IAAK04H,wBAGTM,cAAe,EACfG,yBACF,EACIA,wBAA0B,WACvBH,eAGLJ,iBAAiBQ,cAAgBngE,aAAalC,OAAS,SAAW,UAClE6hE,iBAAiBS,iBAAiB,CAChCnnK,SAAU+mG,aAAa/mG,SACvBglG,aAAc+B,aAAa/B,aAC3B/mF,SAAU8oF,aAAaztC,cAE3B,EACI8tG,aAAe,WACbzkC,wBAAwBx8B,YAAYyB,eAGxCb,aAAa/C,MACf,EACIqjE,cAAgB,WACd1kC,wBAAwBx8B,YAAYyB,eAGxCb,aAAa5jF,OACf,EACImkJ,eAAiB,SAAwBhwI,SACvCqrG,wBAAwBx8B,YAAYyB,eAGxC+6B,wBAAwBh5E,QAAQ/2F,OAAOwZ,MAAMI,WAAY,CACvDiuD,KAAMnD,QAAQ2mH,UAElB,EAqBA,OAnBEl3C,aAAa/xI,iBAAiB,iBAAkB+xM,aAChDhgE,aAAa/xI,iBAAiB,UAAWiyM,yBACzClgE,aAAa/xI,iBAAiB,QAASiyM,yBACvClgE,aAAa/xI,iBAAiB,iBAAkBiyM,yBAChDlgE,aAAa/xI,iBAAiB,aAAciyM,yBAC5ClgE,aAAa/xI,iBAAiB,aAAciyM,yBAC5CP,iBAAiBE,iBAAiB,OAAQQ,cAC1CV,iBAAiBE,iBAAiB,QAASS,eAC3CX,iBAAiBE,iBAAiB,SAAUU,gBAWvC94M,OAAOsX,iBAAiB,CAC7Bi+H,QAVY,WACZgD,aAAa7xI,oBAAoB,iBAAkB6xM,aACnDhgE,aAAa7xI,oBAAoB,UAAW+xM,yBAC5ClgE,aAAa7xI,oBAAoB,QAAS+xM,yBAC1ClgE,aAAa7xI,oBAAoB,iBAAkB+xM,yBACnDlgE,aAAa7xI,oBAAoB,aAAc+xM,yBAC/ClgE,aAAa7xI,oBAAoB,aAAc+xM,wBACjD,GAIG,CAAC,EACN,EAIIV,qCAHc,WAChB,QAASl8F,6BAA6Bs8F,YACxC,EAiMIY,mCAvJ4B,SAAmCtyD,WAAYc,UAAWzc,SAAUsc,UAAW/qB,UAAWyoD,eAAgB5xD,oBAAqB8lF,qBAAsB96B,cAAelL,uBAAwBqF,4BAA6B08B,eACvP,IAAIkE,mBACA54I,mBACA64I,2BACAC,4BACAC,sBACAC,gBACAC,qBACAC,0BACAC,wBACAC,wBAIEC,iBAyBFC,sBAAwB,WAC1BP,sBAAwBnpB,8BAA8BxpC,WAAYc,UAAWyrB,uBAAwBqF,6BACjGnlD,oBAAoBrD,2BACtBspF,4BAA8B9qB,oCAAoC5nC,WAAYc,UAAWr0B,oBAAoBrD,2BAE3Gu3B,YACFiyD,gBAAkBtK,wBAAwBtoD,WAAYc,UAAWH,UAAWixB,4BAA6BnlD,oBAAoB1I,yBAC7H8uF,qBAAuBxE,6BAA6BruD,WAAYc,UAAW8xD,gBAAiBrmC,uBAAwB9/C,oBAAoB1I,wBAAyBuqF,gBAEnKwE,0BAA4BvD,kCAAkCvvD,WAAYc,UAAWlrB,UAAWg9E,gBAAiBnmF,qBAC7G6kF,yCACF0B,wBAA0B1B,gCAAgCtxD,WAAYc,UAAUhP,aAvB9ErlB,oBAAoB7L,WACf6L,oBAAoB7L,WAClB6L,oBAAoB1L,SACtB0L,oBAAoB1L,SAClBsjB,UAAYA,SAASnpE,MACvBmpE,SAASnpE,MAEXob,oBAAoBF,gBAAgB5J,kBAAkB0H,mBAGtDu4C,oBAAoBrM,qBAAuB,KAe9C0gC,UAAU4D,eAAiBj4B,oBAAoBuE,iBAC7C4hF,iBAAiD,OAA9BA,gBAAgBjyD,WAAuBiyD,gBAAgBjyD,UAAU7uF,eAAiB+tE,WAAWliH,OAASi1L,gBAAgBjyD,UAAU7uF,eAAiB+tE,WAAWG,aACjLglE,kBAAkBqB,YAAY,GAAG,GAI/BuM,iBAAmBA,gBAAgBjyD,WAAaiyD,gBAAgBjyD,UAAU7uF,eAAiB+tE,WAAWliH,OAASqnL,kBAAkB4C,2BACnIgL,gBAAgB7E,kBAAkB/I,kBAAkB4C,0BACpDr7B,uBAAuB1R,qBAEzBmqC,kBAAkBuC,SAASvnD,cAEP3b,UAAYA,SAAS0I,iBAAmBsxC,eAAen0H,gBAE3E0P,mBAAqBwkH,2BAA2Bp+B,WAAYc,UAAWzc,SAAUzO,UAAWyoD,iBAExEh6C,UAAYA,SAAS2I,kBAEzCwlE,mBAAqBl5B,2BAA2Bt5B,WAAYc,UAAWzc,SAAUzO,UAAW6hD,gBAErEpzC,UAAYA,SAAS+I,qBAE5CqlE,2BAA6B3sB,mCAAmC9lC,WAAYc,UAAWzc,SAAUzO,UAAW22C,uBAAwB9/C,qBAExI,EASI4rD,aAAe,SAAsBl+K,GAGvC,OAFAA,EAAEs6F,2BACFt6F,EAAEiG,kBACK,CACT,EACI+yM,4BAA8B,WAChC7jD,oCAAoCj7C,EAAEt4G,MACxC,EA2CA,OAzDEg3M,wBAA0B/B,gCAAgChxD,YACtDc,UAAUvhJ,OAASiiJ,cAAcv1G,OA3DjC00G,YACFiyD,gBAAkBtK,wBAAwBtoD,WAAYc,UAAWH,UAAWixB,4BAA6BnlD,oBAAoB1I,yBAC7H8uF,qBAAuBxE,6BAA6BruD,WAAYc,UAAW8xD,gBAAiBrmC,uBAAwB9/C,oBAAoB1I,wBAAyBuqF,gBAEnKwE,0BAA4BvD,kCAAkCvvD,WAAYc,UAAWlrB,UAAWg9E,gBAAiBnmF,sBA0D/GymF,wBApEED,iBAAmBL,iBAAmBA,gBAAgB3lE,SAAW2lE,gBAAgBhyD,aAChFhqC,WAAWK,SAAWL,WAAWa,aAAew7F,oBAAsBxmF,oBAAoB1H,+BAC7F0H,oBAAoBrK,kBAAiB,GA8EvC49B,WAAWnnD,GAAG,YAAa,IAAKs6G,6BAGhCnzD,WAAWlvD,IAAI,mBAAoB27B,oBAAoBpJ,sBAGnDoJ,oBAAoB2B,iCACtB4xB,WAAWnnD,GAAG,cAAew/E,cAQ/Bk6B,qBAAqB5zE,uBAChBi0E,gBAGHA,gBAAgB3E,mBAAmBnqK,MAAK,WACtCk8G,WAAWtrD,QAAQ/2F,OAAO4W,OAAOE,qBACnC,IAJAurI,WAAWtrD,QAAQ/2F,OAAO4W,OAAOE,sBAwB9Blb,OAAOsX,iBAAiB,CAC7Bi+H,QAlBY,WACZ0jE,oBAAsBA,mBAAmB1jE,UACzCl1E,oBAAsBA,mBAAmBk1E,UACzC2jE,4BAA8BA,2BAA2B3jE,UACzD4jE,6BAA+BA,4BAA4B5jE,UAC3D6jE,uBAAyBA,sBAAsB7jE,UAC/C8jE,iBAAmBA,gBAAgB9jE,UACnC+jE,sBAAwBA,qBAAqB/jE,UAC7CgkE,2BAA6BA,0BAA0BhkE,UACvDikE,yBAA2BA,wBAAwBjkE,UACnDkkE,yBAA2BA,wBAAwBlkE,UACnDkR,WAAW9rD,IAAI,YAAa,IAAKi/G,6BACjCnzD,WAAW9rD,IAAI,cAAemkF,cAC9Bk6B,qBAAqBrzE,wBACvB,GAKG,CAOD9mE,kBAAmB,CACjB77D,IAAK,WACH,OAAOq9D,kBACT,IAGN,EA8GIw5I,uBA7EgB,SAAuBpzD,WAAYqzD,+BAAgCC,+BACrF,IAAIC,+BAAiCF,+BACjCG,8BAAgCF,8BAChCG,wBAA0B,KAC1BC,uBAAyB,KACzBC,yBAA0B,EAC1BroC,mBAAqB,SAA4BpsK,MAAOmkK,WAC1DswC,wBAA0BtwC,UAAUoH,YACtC,EACImpC,gCAAkC,SAAyC71M,SACzEA,SACFA,QAAQm2F,IAAI,UAEhB,EACI2/G,0BAA4B,SAAmCC,wBAC7DL,yBACFG,gCAAgCH,0BAGhCA,wBAD6B,OAA3BK,uBACwBP,+BAEAO,wBAEJj7G,GAAG,WAAW,SAAU1+F,GAC1Cw5M,yBAA2BjxL,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASR,OAAuB,IAAf31J,EAAEuS,WAC7EvS,EAAEiG,iBACFszM,uBAAuBxvH,QAE3B,GACF,EACI6vH,yBAA2B,SAAkCn7B,uBAC3D86B,wBACFE,gCAAgCF,yBAGhCA,uBAD4B,OAA1B96B,sBACuB46B,8BAEA56B,uBAEJ//E,GAAG,WAAW,SAAU1+F,GACzCw5M,yBAA2BjxL,KAAK2tI,YAAYl2J,EAAEuT,IAAKgV,KAAK4tI,SAASR,OAAuB,IAAf31J,EAAEuS,WAC7EvS,EAAEiG,iBACFqzM,wBAAwBvvH,QAE5B,GACF,EAeA,OAdqB,WACnB,IAAKqvH,iCAAmCC,8BACtC,MAAM,IAAIpjM,MAAM,2DAElByjM,0BAA0BN,gCAC1BQ,yBAAyBP,+BACzBxzD,WAAWnnD,GAAGl7F,OAAO+W,SAASG,iBAAkBy2J,mBAClD,CAMA0oC,GACOz6M,OAAOsX,iBAAiB,CAC7Bi+H,QAPY,WACZ8kE,gCAAgCH,yBAChCG,gCAAgCF,wBAChC1zD,WAAW9rD,IAAIv2F,OAAO+W,SAASG,iBAAkBy2J,mBACnD,GAIG,CACDwoC,uBAAwB,CACtBv3M,IAAK,WACH,OAAOk3M,uBACT,EACAv3M,IAAK23M,2BAEPj7B,sBAAuB,CACrBr8K,IAAK,WACH,OAAOm3M,sBACT,EACAx3M,IAAK63M,2BAGX,EA4NIE,kCA7M2B,SAAkCj0D,WAAYc,UAAWlrB,UAAWs+E,0BACjG,IAAIj4C,iBAAmB,WACrBi4C,yBAAyBv2M,OAAOwT,SAASM,YAAY5V,SAAQ,SAAUY,UACrEA,UACF,GACF,EACI6uK,mBAAqB,WACvB4oC,yBAAyBv2M,OAAOwT,SAASU,6BAA6BhW,SAAQ,SAAUY,UACtFA,UACF,GACF,EACI03M,qBAAuB,SAA8Bh6M,EAAGkpK,WAC1D,IAAI+wC,eAAiB/wC,WAAaA,UAAUgH,YAC5C6pC,yBAAyBv2M,OAAOwT,SAAS6B,oBAAoBnX,SAAQ,SAAUY,UAC7EA,SAAS23M,eACX,GACF,EACIrE,eAAiB,SAASA,iBAC5BmE,yBAAyBv2M,OAAOwT,SAASE,YAAYxV,SAAQ,SAAUY,UACrEA,UACF,IACAqkJ,UAAUmD,aAAa/vD,IAAI,UAAW67G,eACxC,EACIK,WAAa,SAAoBj2M,EAAGkpK,WAClCA,UAAU0mB,iBACZmqB,yBAAyBv2M,OAAOwT,SAASG,UAAUzV,SAAQ,SAAUY,UACnEA,UACF,GAEJ,EACImtL,qBAAuB,WACzBsqB,yBAAyBv2M,OAAOwT,SAASI,aAAa1V,SAAQ,SAAUY,UACtEA,UACF,GACF,EACI43M,aAAe,WACjBH,yBAAyBv2M,OAAOwT,SAASK,YAAY3V,SAAQ,SAAUY,UACrEA,UACF,GACF,EACI63M,eAAiB,SAASA,iBAC5BxzD,UAAUmD,aAAa/vD,IAAI,UAAWogH,gBAGtCJ,yBAAyBv2M,OAAOwT,SAASS,WAAW/V,SAAQ,SAAUY,UACpEA,UACF,GACF,EACI83M,yBAA2B,WAC7BL,yBAAyBv2M,OAAOwT,SAASC,qBAAqBvV,SAAQ,SAAUY,UAC9EA,UACF,GACF,EACI+3M,mBAAqB,WACvBN,yBAAyBv2M,OAAOwT,SAASe,aAAarW,SAAQ,SAAUY,UACtEA,UACF,GACF,EACIg4M,kBAAoB,WACtBP,yBAAyBv2M,OAAOwT,SAASgB,YAAYtW,SAAQ,SAAUY,UACrEA,UACF,GACF,EACIi4M,yBAA2B,WAC7BR,yBAAyBv2M,OAAOwT,SAASiB,qBAAqBvW,SAAQ,SAAUY,UAC9EA,UACF,GACF,EACIk4M,wBAA0B,WAC5BT,yBAAyBv2M,OAAOwT,SAASkB,qBAAqBxW,SAAQ,SAAUY,UAC9EA,UACF,GACF,EACIm4M,sBAAwB,SAA+Bz6M,EAAGkpK,WACxDA,WACF6wC,yBAAyBv2M,OAAOwT,SAASO,eAAe7V,SAAQ,SAAUY,UACxEA,SAAS4mK,UAAUh6H,UACrB,GAEJ,EACIwrK,sBAAwB,SAA+B16M,EAAGkpK,WAC5D,GAAIA,UAAW,CACb,IAAIyxC,qBAAuBzxC,UAAU1gD,gBAAkBhlH,OAAOwT,SAAS+B,gBAAkBvV,OAAOwT,SAAS8B,eACzGihM,yBAAyBY,sBAAsBj5M,SAAQ,SAAUY,UAC/DA,UACF,GACF,CACF,EACIs4M,uBAAyB,WAC3Bb,yBAAyBv2M,OAAOwT,SAASgC,eAAetX,SAAQ,SAAUY,UACxEA,UACF,GACF,EACIu4M,0BAA4B,WAC9Bd,yBAAyBv2M,OAAOwT,SAASqB,oBAAoB3W,SAAQ,SAAUY,UAC7EA,UACF,GACF,EACIw4M,2BAA6B,WAC/Bf,yBAAyBv2M,OAAOwT,SAASsB,qBAAqB5W,SAAQ,SAAUY,UAC9EA,UACF,GACF,EACIy4M,2BAA6B,WAC/BhB,yBAAyBv2M,OAAOwT,SAASuB,sBAAsB7W,SAAQ,SAAUY,UAC/EA,UACF,GACF,EACI04M,4BAA8B,WAChCjB,yBAAyBv2M,OAAOwT,SAASwB,uBAAuB9W,SAAQ,SAAUY,UAChFA,UACF,GACF,EACI24M,4BAA8B,WAChClB,yBAAyBv2M,OAAOwT,SAASyB,cAAc/W,SAAQ,SAAUY,UACvEA,UACF,GACF,EACI44M,yBAA2B,WAC7BnB,yBAAyBv2M,OAAOwT,SAAS0B,mBAAmBhX,SAAQ,SAAUY,UAC5EA,UACF,GACF,EACI64M,wBAA0B,WAC5BpB,yBAAyBv2M,OAAOwT,SAAS2B,kBAAkBjX,SAAQ,SAAUY,UAC3EA,UACF,GACF,EACI84M,yBAA2B,WAC7BrB,yBAAyBv2M,OAAOwT,SAAS4B,mBAAmBlX,SAAQ,SAAUY,UAC5EA,UACF,GACF,EAqEA,OApEmB,WACjBujJ,WAAWnnD,GAAGl7F,OAAO+W,SAASgC,gBAAiB69L,0BAC/Cv0D,WAAWnnD,GAAGl7F,OAAO+W,SAASG,iBAAkBy2J,oBAChDtrB,WAAWnnD,GAAGl7F,OAAO+W,SAASc,mBAAoB2+L,sBAClDn0D,WAAWnnD,GAAGl7F,OAAOwZ,MAAMM,IAAK24L,YAChCpwD,WAAWnnD,GAAGl7F,OAAOwZ,MAAMK,OAAQoyK,sBACnC5pC,WAAWnnD,GAAGl7F,OAAOwZ,MAAM/G,MAAOikM,cAClCr0D,WAAWnnD,GAAGl7F,OAAOsb,SAAS7G,oBAAqBoiM,oBACnDx0D,WAAWnnD,GAAGl7F,OAAOsb,SAASG,OAAQq7L,mBACtCz0D,WAAWnnD,GAAGl7F,OAAOsb,SAASkB,oBAAqBq6L,oBACnDx0D,WAAWnnD,GAAGl7F,OAAOsb,SAASE,SAAUs7L,mBACxCz0D,WAAWnnD,GAAGl7F,OAAOsb,SAASiB,cAAew6L,0BAC7C10D,WAAWnnD,GAAGl7F,OAAOsb,SAASK,aAAcq7L,yBAC5C30D,WAAWnnD,GAAGl7F,OAAOsb,SAASO,YAAam7L,yBAC3C30D,WAAWnnD,GAAGl7F,OAAOmd,SAASG,QAAS25L,uBACvC50D,WAAWnnD,GAAGl7F,OAAOmd,SAASC,QAAS85L,uBACvC70D,WAAWnnD,GAAGl7F,OAAOmd,SAASE,YAAa+5L,wBAC3C/0D,WAAWnnD,GAAGl7F,OAAO+W,SAASlC,mBAAoBwiM,2BAClDh1D,WAAWnnD,GAAGl7F,OAAO+W,SAASjC,oBAAqBwiM,4BACnDj1D,WAAWnnD,GAAGl7F,OAAO+W,SAASmB,oBAAqBq/L,4BACnDl1D,WAAWnnD,GAAGl7F,OAAO+W,SAASqB,qBAAsBo/L,6BACpDn1D,WAAWnnD,GAAGl7F,OAAO+W,SAAS9B,aAAcwiM,6BAC5Cp1D,WAAWnnD,GAAGl7F,OAAO+W,SAAS2B,uBAAwBg/L,0BACtDr1D,WAAWnnD,GAAGl7F,OAAOsgB,OAAOC,YAAao3L,yBACzCt1D,WAAWnnD,GAAGl7F,OAAOsgB,OAAOE,aAAco3L,0BAC1C,IAAIx7B,aAAe,CACjBC,eAAgB/d,iBAChB40C,QAASd,eACTyF,QAASlB,gBAEXxzD,UAAUmD,aAAaprD,GAAGkhF,aAC5B,CAoCAruB,GACOnyJ,OAAOsX,iBAAiB,CAC7Bi+H,QALY,YAhCO,WACnBkR,WAAW9rD,IAAIv2F,OAAO+W,SAASgC,gBAAiB69L,0BAChDv0D,WAAW9rD,IAAIv2F,OAAO+W,SAASG,iBAAkBy2J,oBACjDtrB,WAAW9rD,IAAIv2F,OAAO+W,SAASc,mBAAoB2+L,sBACnDn0D,WAAW9rD,IAAIv2F,OAAOwZ,MAAMM,IAAK24L,YACjCpwD,WAAW9rD,IAAIv2F,OAAOwZ,MAAMK,OAAQoyK,sBACpC5pC,WAAW9rD,IAAIv2F,OAAOwZ,MAAM/G,MAAOikM,cACnCr0D,WAAW9rD,IAAIv2F,OAAOsb,SAAS7G,oBAAqBoiM,oBACpDx0D,WAAW9rD,IAAIv2F,OAAOsb,SAASG,OAAQq7L,mBACvCz0D,WAAW9rD,IAAIv2F,OAAOsb,SAASkB,oBAAqBq6L,oBACpDx0D,WAAW9rD,IAAIv2F,OAAOsb,SAASE,SAAUs7L,mBACzCz0D,WAAW9rD,IAAIv2F,OAAOsb,SAASiB,cAAew6L,0BAC9C10D,WAAW9rD,IAAIv2F,OAAOsb,SAASK,aAAcq7L,yBAC7C30D,WAAW9rD,IAAIv2F,OAAOsb,SAASO,YAAam7L,yBAC5C30D,WAAW9rD,IAAIv2F,OAAOmd,SAASG,QAAS25L,uBACxC50D,WAAW9rD,IAAIv2F,OAAOmd,SAASC,QAAS85L,uBACxC70D,WAAW9rD,IAAIv2F,OAAOmd,SAASE,YAAa+5L,wBAC5C/0D,WAAW9rD,IAAIv2F,OAAO+W,SAASlC,mBAAoBwiM,2BACnDh1D,WAAW9rD,IAAIv2F,OAAO+W,SAASjC,oBAAqBwiM,4BACpDj1D,WAAW9rD,IAAIv2F,OAAO+W,SAASmB,oBAAqBq/L,4BACpDl1D,WAAW9rD,IAAIv2F,OAAO+W,SAASqB,qBAAsBo/L,6BACrDn1D,WAAW9rD,IAAIv2F,OAAO+W,SAAS9B,aAAcwiM,6BAC7Cp1D,WAAW9rD,IAAIv2F,OAAO+W,SAAS2B,uBAAwBg/L,0BACvDr1D,WAAW9rD,IAAIv2F,OAAOsgB,OAAOC,YAAao3L,yBAC1Ct1D,WAAW9rD,IAAIv2F,OAAOsgB,OAAOE,aAAco3L,0BAC3C,IAAIx7B,aAAe,CACjBC,eAAgB/d,iBAChB40C,QAASd,eACTyF,QAASlB,gBAEXxzD,UAAUmD,aAAa/vD,IAAI6lF,aAC7B,CAEEI,EACF,GAIG,CAAC,EACN,EA6DIs7B,qBAxCc,WAChB,IAAIC,2CAA4C,EAC5CC,wBAAyB,EACzBC,gBAAiB,EACjB/mC,aAAelF,aAAaC,OAChC,OAAOrwK,OAAOsX,iBAAiB,CAAC,EAAG,CACjC6+J,yCAA0C,CACxCnzK,IAAK,WACH,OAAOm5M,yCACT,EACAx5M,IAAK,SAAawzK,0CAChBgmC,0CAA4ChmC,wCAC9C,GAEF9jB,sBAAuB,CACrBrvJ,IAAK,WACH,OAAOo5M,sBACT,EACAz5M,IAAK,SAAa25M,uBAChBF,uBAAyBE,qBAC3B,GAEFljE,cAAe,CACbp2I,IAAK,WACH,OAAOq5M,cACT,EACA15M,IAAK,SAAay2I,eAChBijE,eAAiBjjE,aACnB,GAEF03B,YAAa,CACX9tK,IAAK,WACH,OAAOsyK,YACT,EACA3yK,IAAK,SAAamuK,aAChBwE,aAAexE,WACjB,IAGN,EA4EIyrC,uBA3DgB,SAAuB91D,YACzC,IAAIC,WAAY,EACZzrH,OAASqgH,4CACbmL,WAAWxlD,OAAOhmE,QAClB,IAAIuhL,cAAgB/1D,WAAW/uH,KAAK,qBAChC+kL,YAAcD,cAAc9kL,KAAK,QACjCglL,QAAUF,cAAc9kL,KAAK,OAgB7BovH,SAAW,SAAkBuyC,kBAC3B3yC,YACFA,WAAY,EACZ81D,cAAc9lH,OAAO8V,QAAQ,CAC3B/F,QAAS,GACR,KAAK,WACF4yF,kBACFA,iBAAiBl5L,OAEnBq8M,cAAcnkH,MAChB,IAEJ,EAmBA,OAHEouD,WAAWnnD,GAAGl7F,OAAO+W,SAASiC,cAAe0pI,UAGxC9mJ,OAAOsX,iBAAiB,CAC7BwvI,SACA8uD,eApBmB,SAAwB5jL,QAAS2qL,2BA5BjC,SAAwB3qL,SAC3CyqL,YAAYn8G,KAAKtuE,QACnB,CA2BE4qL,CAAe5qL,SACX2qL,yBA1BJD,QAAQrkH,OAGRqkH,QAAQtkH,OA4BHsuD,YAzBL81D,cAAc9lH,OAAOa,IAAI,UAAW,GAAGa,OAAOoU,QAAQ,CACpD/F,QAAS,GACR,KACHigD,WAAY,EAyBd,EAWEnR,QAVY,WACZkR,WAAW9rD,IAAIv2F,OAAO+W,SAASiC,cAAe0pI,SAChD,GASG,CAAC,EACN,EAycI+1D,yBA5akB,SAAyBC,mBAAoBv5E,eAAgBlH,UAAWyO,SAAUsc,UAAW09B,eAAgB5xD,oBAAqB8lF,qBAAsB+D,iBAE5K,IAEIC,wBACAC,2BACAC,eACAC,0BACAC,0BACAC,wBAPAC,sBAAwB,CAAC/5E,eAAe/6C,KAAK,MAAMz+D,QAAQ,OAAQ,IAAK+yL,oBAAoB78K,KAAK,KAQjGs9K,wBAA0B,IAAItlF,WAAU,SAAUhnG,QAAS8Z,QAC7DiyK,wBAA0B/rL,OAC5B,IACIusL,0BAA4B,CAAC,EAC7BC,kBAAoB,CAAC,EACrBC,WAAa,KACbC,eAAiB,KACjBC,yBAA2B,KAC3BC,oCAAsC,KACtCC,gBAAiB,EACjBC,uBAAwB,EACxBC,qBAAsB,EACtBC,aAAe/B,uBACnB+B,aAAa5rD,sBAAwBjL,WAAaA,UAAUvuF,aAAaz3D,OAAS,EAClFmiI,eAAeoU,YAAcsmE,aAC7B,IAAIx6E,yBAA2B,KAC3By6E,iBAAmB,KACnBC,gCAAkC,KAQlC90D,mBAAqB,WACvB9lB,eAAepoC,QAAQ/2F,OAAOwZ,MAAMkB,UACtC,EACIwpI,oBAAsB,SAA6B+C,kBAAmB+yD,qBACxE,IAAIt0C,UAAY,CACdu0C,eAAgBD,oBAChBE,IAAKxlF,mCAAmCuyB,oBAE1CmyD,0BAA0Bp5M,OAAOwT,SAASW,eAAejW,SAAQ,SAAUY,UACzEA,SAAS4mK,UACX,GACF,EACIy0C,yBAA2B,SAAkCh4M,WAC/D,OAAOvG,OAAOmpB,KAAK/kB,OAAOwT,UAAUwO,MAAK,SAAUo4L,UACjD,OAAOp6M,OAAOwT,SAAS4mM,YAAcj4M,SACvC,GACF,EA4EIyxK,aAAe,SAAsBp3K,EAAG8mB,MAC1Ci2L,eAAe72D,WACf62D,eAAe/H,eAAeluL,KAAK0hI,aAAa,EAClD,EAMIq1D,qBAAuB,WACzBd,eAAe72D,UACjB,EACI43D,gCAAkC,WAChCZ,gBAAkBC,wBAA0BC,sBAR5CN,WAAW13M,OAASiiJ,cAAcxhI,SAAWi3L,WAAW13M,OAASiiJ,cAAcv1G,OACjFirK,eAAe/H,eAAe74H,oBAAoBF,gBAAgB5J,kBAAkBkG,eASpFm8D,YAEJ,EACI4c,kBAAoB,WAClBisD,gCAAgC/8M,OAAS,GAAK0jL,eAAer1H,WAAa6oH,wBAC5E/0C,eAAe,GAAGr0D,MAAMi5B,YAAYo6B,aAAaa,qBAAsB,GAAG32H,OAAOwC,KAAK8kC,MAAMoqK,gCAAgCv8M,UAAW,MAE3I,EACI+8M,gBAAkB,WACpBb,gBAAiB,EACjBY,iCACF,EACIE,uBAAyB,WAC3Bb,uBAAwB,EACxBW,iCACF,EACIG,uBAAyB,WAC3BlB,eAAe72D,WACfs2D,0BAA4B3xD,wBAAwBloB,eAAgB+nB,eAAeC,KAAMxuE,oBAAoBF,gBAAgB5J,kBAAkBqD,yBAA0ByG,oBAAoBF,gBAAgB5J,kBAAkBgD,OACjO,EACIyjG,gBAAkB,WACpBn2C,eAAe7rG,KAAK,kBAAkBq3E,YAAY2vB,WAAWrmC,KAC/D,EACIymH,sBAAwB,SAASA,wBACnCpB,WAAWhzD,aAAa/vD,IAAIv2F,OAAOyV,cAAcE,oBAAqB+kM,uBAEtEZ,iBAAmB36E,eAAe7rG,KAAK,oBACvCshL,qBAAqB3zE,yBAAyB5B,yBAA0By6E,iBAAkBR,WAAWh2D,WAAYg2D,WAAW/1D,YAC9H,EACIo3D,mBAAqB,WACvBx7E,eAAepoC,QAAQ/2F,OAAOsgB,OAAOC,YACvC,EACIq6L,oBAAsB,WACxBz7E,eAAepoC,QAAQ/2F,OAAOsgB,OAAOE,aACvC,EAgGI0wH,UAAY,WACV0oE,sBAGJA,qBAAsB,EACtBz6E,eAAe7rG,KAAK,kBAAkBq3E,YAAY2vB,WAAWrmC,MAC7DqlH,WAAWpoE,aACPpiB,oBAAoBtK,oBAAsBsK,oBAAoBnK,0BAChEwa,eAAepoC,QAAQ/2F,OAAOwZ,MAAMc,eAExC,EAiBIi7I,YAAc,SAAqBh0J,MAAO+hB,MAC5C,IAAI0nG,iBAAmB8D,oBAAoBhE,sBACvCE,kBAAoB1nG,KAAKkyI,kBAAoB/0I,4BAA4BI,QAC3EmqG,iBAAiByqC,gCAAgCh1I,4BAA4BI,OAAQo4L,wBAEzF,EAUA,OArQEr9M,OAAOmpB,KAAK/kB,OAAOwT,UAAUtV,SAAQ,SAAUk8M,UAC7C,IAAIj4M,UAAYnC,OAAOwT,SAAS4mM,UAChChB,0BAA0Bj3M,WAAa,EACzC,IA+DAg9H,eAAejjC,KAAKg7C,gDACpB7X,yBAA2BF,eAAe7rG,KAAK,kBAAkB8oD,QACjE29H,gCAAkC56E,eAAe7rG,KAAK,6BAA6B8oD,QACnF68H,wBAA0B95E,eAAe7rG,KAAK,4BAA4B8oD,QAyLxEu8H,kBAtRE1/F,WAAW7K,UACbi5C,wBAAwBloB,eAAgB+nB,eAAeC,KAAMxuE,oBAAoBF,gBAAgB5J,kBAAkBoG,aAAc0D,oBAAoBF,gBAAgB5J,kBAAkBgD,QAEvLw1E,wBAAwBloB,eAAgB+nB,eAAeC,KAAMxuE,oBAAoBF,gBAAgB5J,kBAAkBqG,YA6F9Gq8E,8BAA8BpyB,eAAgBE,yBAA0B65E,sBAAuBjhF,UAAWgtB,mBAAoBf,qBA0LvH/9G,MAtIa,SAAgCg9G,WAC3Dm2D,WAAan2D,UACbo2D,eAAiBpB,uBAAuBh5E,gBACxCA,eAAejkC,GAAGl7F,OAAOwZ,MAAM/G,MAAOmhK,cACtCz0C,eAAejkC,GAAGl7F,OAAO4W,OAAOC,mBAAoB0jM,iBACpDp7E,eAAejkC,GAAGl7F,OAAO+W,SAASqB,qBAAsB01I,mBACxD3uB,eAAejkC,GAAGl7F,OAAO4W,OAAOE,qBAAsB0jM,wBACtDr7E,eAAejkC,GAAGl7F,OAAO+W,SAASmC,mBAAoBmhM,sBACtDl7E,eAAejkC,GAAGl7F,OAAOggB,MAAMK,gBAAiBo6L,wBAChDt7E,eAAejkC,GAAGl7F,OAAOsb,SAASiB,cAAe+4J,iBACjDn2C,eAAejkC,GAAGl7F,OAAOif,OAAOC,MAAOq2I,aACvC+jD,WAAWhzD,aAAaprD,GAAGl7F,OAAOyV,cAAcE,oBAAqB+kM,uBACjEpB,WAAWzyD,oBAAsBnD,mBAAmBC,OAAS21D,WAAWzyD,oBAAsBnD,mBAAmBE,eACnH41D,yBAA2B1pC,iCAAiC3wC,eAAgBm6E,WAAY5yE,SAAUsc,UAAWl0B,qBAC7G2qF,oCAAsCrlC,4CAA4Cj1C,eAAgBq6E,yBAA0B1qF,qBAC5HgqF,eAAiBrD,uBAAuBt2E,eAAgBq6E,yBAAyB5qC,uBAAuBzO,eAAgBq5C,yBAAyB7qC,sBAAsBxO,kBAGvKhhC,eAAe7rG,KAAK,6BAA6B5sB,SAC7C4yM,WAAW13M,OAASiiJ,cAAcv1G,OAAU2qE,WAAWD,qBACzDmmB,eAAejkC,GAAG,cAAey/G,oBACjCx7E,eAAejkC,GAAG,eAAgB0/G,uBAGtC,IAAIhsC,uBAAyB4qC,yBAA2BA,yBAAyB5qC,uBAAyB,KACtGqF,4BAA8BulC,yBAA2BA,yBAAyBvlC,4BAA8B,KACpH8kC,0BAA4BzC,kCAAkCn3E,eAAgBgkB,UAAWlrB,UAAWmhF,2BApGpGx9M,OAAOmpB,KAAKs0L,mBAAmBn7M,SAAQ,SAAUqD,OACH,WAAxC+gB,UAAU+2L,kBAAkB93M,SAC9B83M,kBAAkB93M,OAAOrD,SAAQ,SAAUY,UACzCw6M,WAAWhzD,aAAaprD,GAAG35F,MAAOzC,SACpC,GAEJ,IACAu6M,kBAAoB,CAAC,EA+FrBR,2BAA6BlE,mCAAmCx1E,eAAgBgkB,UAAWzc,SAAUsc,UAAW/qB,UAAWyoD,eAAgB5xD,oBAAqB8lF,qBAAsBkE,eAAgBlqC,uBAAwBqF,4BAA6BslC,gBACtPC,0BAA6BA,yBAAyBzlC,gCACzD50C,eAAepoC,QAAQ/2F,OAAO4W,OAAOC,oBAEvCsoH,eAAepoC,QAAQ/2F,OAAO+W,SAASgB,mBACvCmsI,oBAAoB,CAAClkJ,OAAO+d,OAAOC,aAAche,OAAO+d,OAAOhG,mBApkb7B,IAqkblC6gM,yBACF,IAmGoD,OAAE,SAAUpmM,OAC9D+7D,IAAIC,aAAah8D,MACnB,IACO5W,OAAOsX,iBAAiB,CAC7Bg+H,UACAC,QAvGY,WACZhS,eAAe5oC,IAAIv2F,OAAOwZ,MAAM/G,MAAOmhK,cACvCz0C,eAAe5oC,IAAIv2F,OAAO4W,OAAOC,mBAAoB0jM,iBACrDp7E,eAAe5oC,IAAIv2F,OAAO+W,SAASqB,qBAAsB01I,mBACzD3uB,eAAe5oC,IAAIv2F,OAAO4W,OAAOE,qBAAsB0jM,wBACvDr7E,eAAe5oC,IAAIv2F,OAAO+W,SAASmC,mBAAoBmhM,sBACvDl7E,eAAe5oC,IAAIv2F,OAAOggB,MAAMK,gBAAiBo6L,wBACjDt7E,eAAe5oC,IAAIv2F,OAAOsb,SAASiB,cAAe+4J,iBAClDn2C,eAAe5oC,IAAIv2F,OAAOif,OAAOC,MAAOq2I,aACxCp2B,eAAe5oC,IAAI,cAAeokH,oBAClCx7E,eAAe5oC,IAAI,eAAgBqkH,qBACnCtB,WAAWhzD,aAAa/vD,IAAIv2F,OAAOyV,cAAcE,oBAAqB+kM,uBACtElB,0BAA4BA,yBAAyBroE,UACrDsoE,qCAAuCA,oCAAoCtoE,UAC3EmoE,YAAcA,WAAWnoE,UACzBooE,gBAAkBA,eAAepoE,UACjC0nE,4BAA8BA,2BAA2B1nE,UACzD2nE,gBAAkBA,eAAe3nE,UACjC4nE,2BAA6BA,0BAA0B5nE,UACvD6nE,2BAA6BA,0BAA0BtyM,QACzD,EAoFE0qI,KAnFc,WAQd,OAPIkoE,YAAcA,WAAWnlE,cAAgBmlE,WAAW13M,OAASiiJ,cAAcv1G,QACzEgrK,WAAWnlE,aAAa9B,MAC1BlT,eAAepoC,QAAQ/2F,OAAOwZ,MAAMK,QAEpCy/L,WAAWnlE,aAAa/C,QAGrBvd,UAAUltF,OAAO,oCAC1B,EA2EE4pB,MA1Ee,WACX+oJ,YAAcA,WAAWnlE,cAAgBmlE,WAAW13M,OAASiiJ,cAAcv1G,OAC7EgrK,WAAWnlE,aAAa5jF,OAE5B,EAwEE8gF,mBAvEuB,WACvB,SAAImoE,2BAA4BA,yBAAyB7qC,wBAChD6qC,yBAAyB7qC,sBAAsBH,YAG1D,EAmEEpsK,iBA/PqB,SAA0BR,KAAM8sE,UACjDyrI,yBAAyBv4M,OAC3Bw3M,0BAA0Bx3M,MAAM1B,KAAKwuE,SAEzC,EA4PEpsE,oBA3PwB,SAA6BV,KAAM8sE,UAC3D,GAAIyrI,yBAAyBv4M,MAE3B,MAA8D,IAAvDw3M,0BAA0Bx3M,MAAMkP,QAAQ49D,WAC7C0qI,0BAA0Bx3M,MAAMmP,OAAOqoM,0BAA0Bx3M,MAAMkP,QAAQ49D,UAAW,EAGhG,EAqPE4iE,sBApP0B,SAA+B/vI,MAAOutF,SAC5DwqH,YAAcA,WAAWhzD,aAC3BgzD,WAAWhzD,aAAaprD,GAAG35F,MAAOutF,UAEU,WAAxCxsE,UAAU+2L,kBAAkB93M,UAC9B83M,kBAAkB93M,OAAS,IAE7B83M,kBAAkB93M,OAAOrB,KAAK4uF,SAElC,EA4OEyiD,yBA3O6B,SAAkChwI,MAAOutF,SACtE,GAAIwqH,WAAWhzD,aACbgzD,WAAWhzD,aAAa/vD,IAAIh1F,MAAOutF,aAC9B,CACL,GAA4C,WAAxCxsE,UAAU+2L,kBAAkB93M,QAC9B,OAGF,MAAsD,IAA/C83M,kBAAkB93M,OAAOuP,QAAQg+E,UACtCuqH,kBAAkB93M,OAAOwP,OAAOsoM,kBAAkB93M,OAAOuP,QAAQg+E,SAAU,EAE/E,CACF,EAiOE0iD,mBA5QuB,WACvB,QAAOqnE,2BAA2Bp+I,mBAAoBo+I,2BAA2Bp+I,kBAAkB+2E,oBACrG,EA2QEC,mBA1QuB,SAA4B3hI,OAC/C+oM,2BAA2Bp+I,mBAC7Bo+I,2BAA2Bp+I,kBAAkBg3E,mBAAmB3hI,MAEpE,EAuQE4hI,aAzEmB,WACnB,SAAI8nE,2BAA4BA,yBAAyB5qC,yBAChD4qC,yBAAyB5qC,uBAAuB3O,SAG3D,EAqEEtuB,aApEmB,SAAwBkpE,kBACvCrB,0BAA4BA,yBAAyB5qC,yBACvD4qC,yBAAyB5qC,uBAAuB3O,UAAY46C,iBAEhE,EAkEEjpE,gCA3NoC,WAEpCwnE,0BAA0Bp5M,OAAOwT,SAASE,YAAYxV,SAAQ,SAAUY,UACtEA,UACF,GACF,EAwNE+yI,gBAnEoB,SAAyBhqE,MAC7C,OAAKyxI,YAAcA,WAAW13M,OAASiiJ,cAAcv1G,OAAUgrK,WAAWnlE,aAGnE0O,8BAA8By2D,WAAWnlE,aAActsE,MAFrD,CAGX,GA+DG,CACDiqE,mBAAoB,CAClBlzI,IAAK,WACH,OAAOu6M,uBACT,GAEFnnE,WAAY,CACVpzI,IAAK,WACH,OAAO06M,WAAaA,WAAWtnE,WAAa,EAC9C,GAEFtrC,YAAa,CACX9nG,IAAK,WACH,OAAO06M,WAAaA,WAAW5yG,YAAc,CAC/C,EACAnoG,IAlEyB,SAAgCg4I,eAC3D,IAAI46D,aAAetuD,8BAA8By2D,WAAWnlE,aAAcoC,eACtEijE,0BAA4BF,WAAWnlE,aAAaztC,YAAYv9B,QA7SrC,KA6S+EgoI,aAAahoI,QA7S5F,IA8S7BqwI,yBAAyBvlC,4BAA4B9e,6BAEnDmkD,WAAWnlE,aAAa9B,MAC1BlT,eAAepoC,QAAQ/2F,OAAOwZ,MAAMK,OAAQ,CAC1CguD,KAAMspI,aACNryC,eAAe,IAGjB3/B,eAAepoC,QAAQ/2F,OAAOwZ,MAAMI,WAAY,CAC9CiuD,KAAMspI,cAGZ,GAqDE/jK,SAAU,CACRxuC,IAAK,WACH,OAAO06M,WAAaA,WAAWlsK,SAAW,CAC5C,GAEF6kG,OAAQ,CACNrzI,IAAK,WACH,QAAO06M,YAAaA,WAAWrnE,MACjC,GAEFI,MAAO,CACLzzI,IAAK,WACH,QAAO06M,YAAaA,WAAWjnE,KACjC,GAEFC,QAAS,CACP1zI,IAAK,WACH,QAAO06M,YAAaA,WAAWhnE,OACjC,GAEFC,SAAU,CACR3zI,IAAK,WACH,OAAO06M,WAAaA,WAAW/mE,SAAW,EAC5C,GAEFC,OAAQ,CACN5zI,IAAK,WACH,OAAO06M,WAAaA,WAAW9mE,OAAS,EAC1C,GAEFC,SAAU,CACR7zI,IAAK,WACH,OAAO06M,WAAaA,WAAW7mE,SAAW,EAC5C,GAEFP,OAAQ,CACNtzI,IAAK,WACH,OAAO06M,WAAaA,WAAWpnE,OAAS,CAC1C,EACA3zI,IAAK,SAAaimK,aAChBrlC,eAAepoC,QAAQ/2F,OAAOwZ,MAAMe,UAAW,CAC7CiqJ,aAEJ,GAEFryB,MAAO,CACLvzI,IAAK,WACH,QAAO06M,YAAaA,WAAWnnE,KACjC,EACA5zI,IAAK,SAAaw0K,SAChB5zC,eAAepoC,QAAQ/2F,OAAOwZ,MAAMgB,cAAe,CACjDu4J,SAEJ,GAEF3gC,aAAc,CACZxzI,IAAK,WACH,OAAO06M,WAAaA,WAAWlnE,aAAe,CAChD,EACA7zI,IAAK,SAAa6zI,cAChBjT,eAAepoC,QAAQ/2F,OAAOwZ,MAAMiB,gBAAiB,CACnD23H,cAEJ,GAEF0oE,wBAAyB,CACvBl8M,IAAK,WACH,OAAO46M,yBAA2BA,yBAAyB5qC,uBAAuBxO,aAAe,CACnG,GAEF26C,mBAAoB,CAClBn8M,IAAK,WACH,OAAOi7M,aAAantC,WACtB,IAGN,EAmBIsuC,iCAAmCp/M,OAAO2X,OAAO,CACnD0nM,iBAAkB,iBAClBC,kBAAmB,kBACnBC,0BAA2B,CACzBC,WAAY,eAIZC,mBACM,SAAgB1xF,YACtB,OAAOutB,wCAAwCvtB,WACjD,EAKE2xF,QAAU5kG,EAAEp7G,QACZigN,eAAiB,SAAwB/+M,GAG3C,IAFAA,EAAIA,EAAEu8F,eAECz1E,MAAkC,mBAAnB9mB,EAAE8mB,KAAKxS,UAAsE,IAA5CtU,EAAE8mB,KAAKxS,QAAQ,wBAAtE,CAGA,IAAI8c,QAAUtyB,OAAOq+E,KAAKiY,MAAMp1F,EAAE8mB,MAClC,OAAQsK,QAAQ2nG,sBACd,KAAKylF,iCAAiCC,iBAE9BjjB,2BACFA,4BAEF,MAEJ,KAAKgjB,iCAAiCE,kBAElC,GAAQttL,QAAQtK,KAAKyvH,SACdioE,iCAAiCG,0BAA0BC,WAE5DI,cAfZ,CAsBF,EACIC,sBAAwB,WAC1BxjB,aAAattF,YAAY,gBAC3B,EACI6wG,YAAc,WACZvjB,eACFqjB,QAAQ/kH,IAAI,UAAWglH,gBACvBtjB,aAAa1hG,IAAI,OAAQklH,uBACzBxjB,aAAavxL,SACbuxL,kBAAev5L,EACfs5L,+BAA4Bt5L,EAEhC,EACIg9M,kBAAoB,CACtBn2D,WAAY,SAAoB57B,WAAYgyF,2BAC1C1jB,aAAevhF,EAAE2kG,mBAAmB1xF,aAAaxsB,SAAS,SAC7CjC,GAAG,OAAQugH,uBACxBzjB,0BAA4B2jB,yBAC5BL,QAAQpgH,GAAG,UAAWqgH,eACxB,EACAK,WAAY,WACV,YAAwBl9M,IAAjBu5L,YACT,EACAujB,aAGEK,YAAc,KACdC,WAAa,SAAkB56F,WACjC4N,oBAAoB4B,SAASxP,WAC7B66F,YACF,EAQIC,qBAAuB,SAA8B9oF,OACvD,MAAO,eAAiBA,MAAQ,QAClC,EACI6oF,WAAa,WACf,GAAIF,YAAa,CACf,IAAII,uBAAyBrgN,OAAOmpB,KAAKq3F,YAAYxzG,QAAO,SAAUu4D,YAAasyB,cACjF,OAAOtyB,YAAc66I,qBAAqB5/F,WAAW3oB,eAAiB,GACxE,GAAG,IACCyoH,sBAAwBF,qBAAqBltF,oBAAoBtE,YACrEqxF,YAAYlxG,YAAYsxG,wBACxBJ,YAAYtxG,SAAS2xG,sBACvB,CACF,EAlBEzmF,sCAAsC,YAAaqmF,YAoBrD,IAAIK,yBACQL,WADRK,+CAlBiC,SAAwCzqD,UAC3EmqD,YAAcnqD,SACdqqD,YACF,EAoBIK,8BAAgC,SAAuCj6M,WACzE,OAAOvG,OAAOmpB,KAAK/kB,OAAOyV,eAAeuM,MAAK,SAAUo4L,UACtD,OAAOp6M,OAAOyV,cAAc2kM,YAAcj4M,SAC5C,GACF,EAMIk6M,yBAA2B,KAC3BC,sBAAwB,KACxBC,mBAAqB,KACrBjlF,WAAa,KACb4iD,KAAO,KACP/hB,WAAa,KACbqkD,gBAAkB,KAClBC,iBAAmBzrE,+BACnB0rE,cAAe,EACfC,kBAAmB,EACnBtoE,cAAgB,CAAC,EACjBuoE,6BAA+B,CAAC,EAChCC,oBAAsB,KACtBC,kBAAmB,EACnBC,eAAiB,WACnB11D,wBAAwBg1D,yBAA0Bn1D,eAAeE,QAASzuE,oBAAoBF,gBAAgB5J,kBAAkBiD,eAClI,EACIkrI,eAAiB,WACnBC,cACF,EAYIA,aAAe,SAAsBC,qBACvC,IAAI9lF,aAAetI,oBAAoBG,mBACvCqI,WAAaoB,mBAAmBtB,eACrB/rC,MAAMllD,MAAK,WAChB02K,sBAAwBK,qBAC1BC,eAAeD,oBAEnB,GAAGH,eACL,EACIK,yBAA2B,SAASA,2BACtCX,iBAAiBn6M,oBAAoBtC,OAAOwT,SAASC,oBAAqB2pM,0BACtE1B,mBAAqBA,kBAAkBE,cACzCF,kBAAkBF,aAEtB,EACI2B,eAAiB,SAAwBD,qBAG3C,OAFAX,mBAAqBxiF,oCAAoCzC,YACzDglF,sBAAwBp9E,8BAA8Bm9E,0BAC9CE,oBACN,KAAK5iF,WAAWrD,QAEZozB,iBACA7W,6BAt9b4B,iBAw9b5BypE,sBAAsBh7E,0BAzDL,KACC,MAyDlB+7E,mBAAmBH,qBACnB,MAEJ,KAAKvjF,WAAWC,YAEZiZ,6BA/9b0B,eAg+btB/jB,oBAAoBrM,oBAEtB66F,gCAAgCxuF,oBAAoBrM,qBAEpD65F,sBAAsBh7E,0BApEP,KACC,MAqElB+7E,mBAAmBH,qBACnB,MAEJ,KAAKvjF,WAAWE,MAEZgZ,6BAz+b0B,SA0+b1ByqE,gCAAgChmF,WAAW6B,aAAatC,KACxDwmF,mBAAmBH,qBACnB,MAEJ,KAAKvjF,WAAWG,cAERxC,WAAWgC,mBAAqBjD,UAAUv8C,KAC5CutE,wBAAwBg1D,yBAA0Bn1D,eAAeE,QAASzuE,oBAAoBF,gBAAgB5J,kBAAkBkD,gBAEhIs1E,wBAAwBg1D,yBAA0Bn1D,eAAeE,QAASzuE,oBAAoBF,gBAAgB5J,kBAAkBmG,oBAK1I,EAMIsoI,gCAAkC,SAAyCC,QAC7E,IAAIC,IAAM,IAAIx+C,MACdw+C,IAAIxqG,OAAS,WACXspG,sBAAsBh7E,0BAA0Bk8E,IAAInsD,aAAcmsD,IAAIlsD,cACxE,EACAksD,IAAIvqG,QAAU,WACZqpG,sBAAsBh7E,0BAtGD,KACC,KAsGxB,EACAk8E,IAAItiI,IAAMqiI,MACZ,EAiDIF,mBAAqB,SAA4BH,qBAC/CpuF,oBAAoBvH,wBACtBsrB,uCAxBK,IAAIhf,WAAU,SAAUhnG,SACzBiiG,oBAAoBzM,QACtB63D,KAAOhsC,aACH5yI,OAAOmiN,KAAiD,iBAAnCniN,OAAOmiN,IAAIC,oBAClCxjC,KAAKtoF,MAAMt2F,OAAOmiN,IAAIC,qBAEtBxjC,KAAKjhF,KAAK61B,oBAAoBzM,QAAQ,GAExC63D,KAAK7uF,MAAMllD,KAAKtZ,SAAgB,OAAE,WAChCiwL,kBAAmB,EACnB5iC,KAAKjrC,uBACLirC,KAAO,KACPrtJ,SACF,MAEIiiG,oBAAoBf,+BACtBmsD,KAAOhsC,cAETrhH,UAEJ,IAMasZ,MAAK,WACZ02K,sBAAwBK,sBACtBhjC,OACFprD,oBAAoBh2C,iBAAiBohG,MACrCvhG,oBAAoBG,iBAAiBohG,QAvCvCprD,oBAAoBwE,eAAet2H,OAAS,GACjC,OAATk9K,OACFA,KAAOhsC,cAEFgsC,KAAK55G,uBAAuBwuD,oBAAoBwE,iBAElDO,UAAUhnG,WAmCOsZ,MAAK,WACnB02K,sBAAwBK,qBA1D3B,IAAIrpF,WAAU,SAAUhnG,SACzBiiG,oBAAoBjG,UACtBioB,cAAc1uI,iBAAiBpC,OAAOyf,OAAOC,aAAa,SAAUgnH,UAClE75G,QAAQ65G,SACV,IACAoK,cAAc1uI,iBAAiBpC,OAAOyf,OAAOhN,OAAO,WAClDqqM,kBAAmB,EACnBjwL,SACF,IACAikH,cAAcC,UAAUjiB,oBAAoBjG,WAE5Ch8F,QAAQqtJ,KAEZ,IA8C0B/zI,MAAK,SAAUugG,UAC3Bm2E,sBAAwBK,sBACtBx2E,UA7EC,SAAsBA,UACnCA,UAAYA,SAAS4I,UACvB6oB,WAAa1xB,cAAcC,UAE/B,CA0EgBwoE,CAAaxoE,UAEfi3E,YAAYT,qBAEhB,GAEJ,IAEJ,GACF,EACIU,qBAAuB,SAA8BviL,MACnDu6F,2BACFA,yBAAyB,kBAAmB,IAAKv6F,KAErD,EA0CIwiL,eAAiB,SAAwBX,oBAAqBY,qBAChErB,iBAAmBhE,yBAAyByE,oBAAqBb,yBAA0B/kF,WAAY4iD,KAAM/hB,WAAYqkD,gBAAiB1tF,oBAAqBwtF,sBAAuBQ,kBACtLJ,cAAe,EAnBf9gN,OAAOmpB,KAAKsvH,eAAen2I,SAAQ,SAAUiE,WAC3CkyI,cAAclyI,WAAWjE,SAAQ,SAAU6vI,eACzCgwE,mBAAmB57M,UAAW4rI,cAChC,GACF,IAiBA0uE,iBAAiB3qE,mBAAmB3rG,MAAK,WACnC02K,sBAAwBK,sBAC1BP,kBAAmB,OAhBqBj+M,IAAxCk+M,6BAA6B1qE,SAC/BuqE,iBAAiBvqE,OAAS0qE,6BAA6B1qE,aAEdxzI,IAAvCk+M,6BAA6BzqE,QAC/BsqE,iBAAiBtqE,MAAQyqE,6BAA6BzqE,YAENzzI,IAA9Ck+M,6BAA6BxqE,eAC/BqqE,iBAAiBrqE,aAAewqE,6BAA6BxqE,cAW3DqqE,iBAAiBr6M,iBAAiBpC,OAAOwT,SAASC,oBAAqB2pM,0BACvEX,iBAAiBr6M,iBAAiBpC,OAAOwT,SAASO,cAAe6pM,uBAC7D9uF,oBAAoBtK,oBAAsBsK,oBAAoBnK,0BAChE83F,iBAAiBvrE,YAEf4sE,qBACFz2D,wBAAwBg1D,yBAA0Bn1D,eAAeC,KAAMxuE,oBAAoBF,gBAAgB5J,kBAAkBoG,aAAc0D,oBAAoBF,gBAAgB5J,kBAAkBgD,QAGvM,GACF,EACI8rI,YAAc,SAAqBT,qBACrC,IAAIY,qBAAsB,EACtBvB,qBAAuB5iF,WAAWE,MACpCwiF,yBAAyB9xG,SAAS,cAElC8xG,yBAAyB9xG,SAAS,cAEhC2vE,MACEA,KAAK9qC,iBACHxZ,2BACFA,yBAAyB,eAAgB,KAI3CuiC,YAAcA,WAAW7oB,UACvBr2B,WAAW7K,WAAa+pD,WAAWhkG,eAAiB+tE,WAAWC,MACjE27E,qBAAsB,EACtB3lD,WAAWhkG,aAAe+tE,WAAWC,MAC5Bg2B,WAAWnvB,UAA2D,IAA/CmvB,WAAW3uB,kCAC3C1a,oBAAoBuE,eAAgB,IAGpCvE,oBAAoBuE,cACtBg0E,kBAAkBxrH,OAAO11C,MAAK,WAC5B03K,eAAeX,oBAAqBY,oBACtC,IAEAD,eAAeX,oBAAqBY,oBAExC,EA2CIE,UAAY,WACdvB,iBAAiBrrE,MACnB,EAwBI2sE,mBAAqB,SAA0B57M,UAAWrD,UACvD49M,aAEMN,8BAA8Bj6M,WACvCs6M,iBAAiBnrE,sBAAsBnvI,UAAWrD,UAElD29M,iBAAiBr6M,iBAAiBD,UAAWrD,UA1BzB,SAA2BqD,UAAWrD,UACvDu1I,cAAclyI,aACjBkyI,cAAclyI,WAAa,IAE7BkyI,cAAclyI,WAAWjC,KAAKpB,SAChC,CAiBIm/M,CAAkB97M,UAAWrD,SAMjC,EAgBIo/M,eAAiB,SAAwB3nE,eAC3CkmE,iBAAiB/1G,YAAc6vC,aACjC,EA8FI4nE,YAAcviN,OAAOsX,iBAAiB,CACxC2oE,KAxLS,SAAcuiI,eAjQR,IAAoBlB,oBAkQnCL,oBAAsBnqE,0BACtBhe,gCAAgC10H,OAAO+d,OAAOhG,oBAC9CskM,yBAA2B3lG,EAAE0nG,gBAjGJ7zG,SAAS+vB,WAAWC,sBAC7C8hF,yBAAyB9xG,SAAS+vB,WAAWK,uBACzC7L,oBAAoB7D,2BACtBoxF,yBAAyB9xG,SAAS+vB,WAAWM,mBAI3C9L,oBAAoB1E,mBACtBiyF,yBAAyBtwH,UAAU5P,MAAK,SAAUt5D,MAAO1f,YACvD,IAAIk7M,YAAc3nG,EAAEvzG,YACpBk7M,YAAY7gN,OAAO,QAC+B,SAA9C6gN,YAAYhtH,KAAK,WAAW75D,eAC9B6mL,YAAYlrH,IAAI,CACdiR,OAAQ,EACRC,QAAS,EACTC,OAAQ,EACRqD,SAAU,UAGhB,IAtLiCu1G,oBAsQxBL,oBArQXL,gBAAkBvuE,0BAClBh1B,WAAWmC,eACXgb,4BACA+lF,+CAA+CE,0BAC3CvtF,oBAAoBrF,gBACtBiyF,kBAAkBn2D,WAAWz2B,oBAAoBrF,gBAAiBuzF,gBAElEC,aAAaC,oBA+PjB,EAmLE/rE,QA/Kc,WACd0rE,oBAAsB,KACtBN,mBAAqB,KACrBjlF,WAAa,KACb4iD,MAAQA,KAAKjrC,uBACbirC,KAAO,KACP/hB,WAAa,KACbukD,cAAe,EACfC,kBAAmB,EACnBH,gBAAkB,KAClBnoE,cAAgB,CAAC,EACjBuoE,6BAA+B,CAAC,EAChCE,kBAAmB,EACnBhsE,cAAc7B,uBACdt2D,oBAAoBc,QAChB4iI,2BACFI,iBAAiBn6M,oBAAoBtC,OAAOwT,SAASC,oBAAqB2pM,0BAC1EX,iBAAiBn6M,oBAAoBtC,OAAOwT,SAASO,cAAe6pM,sBACpEnB,iBAAiBtrE,UACjBsrE,iBAAmBzrE,+BACnBqrE,yBAAyB1xG,YAAY2vB,WAAWC,qBAAuB,IAAMD,WAAWM,kBAAoB,0BAC5GyhF,yBAA2B,KAE/B,EAyJEiC,0BAnL8B,WAC9B,OAAOjC,wBACT,EAkLEkC,WAzJe,WACf,MA3TmB,OA4TrB,EAwJEC,WAAYN,eACZO,OAAQT,UACR5sE,KAAM4sE,UACNztJ,MAvJe,WACfksJ,iBAAiBlsJ,OACnB,EAsJEmuJ,cA/GkB,WAClB,OAAO/B,iBAAmBF,iBAAiBzqE,WAAaljB,oBAAoB9M,aAC9E,EA8GEoqC,eA7GmB,WACnB,OAAOqwD,iBAAiB/1G,WAC1B,EA4GEw3G,eACAxzD,YAzGgB,WAChB,OAAO+xD,iBAAiBrvK,QAC1B,EAwGEuxK,SAvGa,WACb,OAAOlC,iBAAiBpqE,KAC1B,EAsGEusE,UArGc,WACd,OAAOnC,iBAAiBxqE,MAC1B,EAoGE4sE,gBAnGoB,WACpB,OAAOpC,iBAAiBrqE,YAC1B,EAkGEka,gBAjGoB,SAAyBla,cACzCuqE,iBACFF,iBAAiBrqE,aAAeA,aAEhCwqE,6BAA6BxqE,aAAeA,YAEhD,EA4FE0sE,YA3FgB,WAChB,OAAOrC,iBAAiBlqE,QAC1B,EA0FEwsE,UAzFc,WACd,OAAOtC,iBAAiBjqE,MAC1B,EAwFEwsE,YAvFgB,WAChB,OAAOvC,iBAAiBhqE,QAC1B,EAsFEwsE,WArFe,WACf,OAAOxC,iBAAiBnqE,OAC1B,EAoFE4sE,UAnFc,WACd,OAAOzC,iBAAiBvqE,MAC1B,EAkFEsa,UAjFc,SAAmBgY,aAC7Bm4C,iBACFF,iBAAiBvqE,OAASsyB,YAE1Bo4C,6BAA6B1qE,OAASsyB,WAE1C,EA4EE26C,SA3Ea,WACb,OAAOxC,iBAAmBF,iBAAiBtqE,MAAQyqE,6BAA6BzqE,KAClF,EA0EEsyB,SAzEe,SAAkBsO,SAC7B4pC,iBACFF,iBAAiBtqE,MAAQ4gC,QAEzB6pC,6BAA6BzqE,MAAQ4gC,OAEzC,EAoEE1hC,mBAnEuB,WACvB,OAAOorE,iBAAiBprE,oBAC1B,EAkEEK,aAjEiB,WACjB,OAAO+qE,iBAAiB/qE,cAC1B,EAgEEC,aA/DiB,SAAsBytE,aACvC3C,iBAAiB9qE,aAAaytE,YAChC,EA8DEvtE,gBA7DoB,SAAyBhqE,MAC7C,OAAO40I,iBAAiB5qE,gBAAgBhqE,KAC1C,EA4DEzlE,iBAAkB27M,mBAClBz7M,oBA7I0B,SAA6BH,UAAWrD,UAC7D69M,iBAEMP,8BAA8Bj6M,WACvCs6M,iBAAiBlrE,yBAAyBpvI,UAAWrD,UAErD29M,iBAAiBn6M,oBAAoBH,UAAWrD,UA7B1B,SAA6BqD,UAAWrD,UAChE,IAAIwuI,WAAa+G,cAAclyI,WAC/B,GAAImrI,WAAY,CACd,IAAK,IAAIvwI,EAAI,EAAGA,EAAIuwI,WAAWtwI,OAAQD,IACrC,GAAIuwI,WAAWvwI,KAAO+B,SAAU,CAC9BwuI,WAAWv8H,OAAOhU,EAAG,GACrB,KACF,CAEwB,IAAtBuwI,WAAWtwI,SACbq3I,cAAclyI,gBAAazD,EAE/B,CACF,CAYI2gN,CAAoBl9M,UAAWrD,SAMnC,EAsIEwgN,aA3NiB,SAAsBn9M,UAAWmhB,MAC9C+4L,0BACFA,yBAAyBtlH,QAAQ50F,UAAWmhB,KAEhD,EAwNEkuH,mBA9DuB,WACvB,OAAOirE,iBAAiBjrE,oBAC1B,EA6DEC,mBA5DuB,SAA4B8tE,WACnD9C,iBAAiBhrE,mBAAmB8tE,UACtC,EA2DEC,aA1DiB,WACjB,QAAOloF,YAAayC,oCAAoCzC,cAAgBqC,WAAWrD,OACrF,EAyDEirD,qBAxDyB,WACzB,OAAOi7B,iBAAmBA,gBAAgBjwJ,cAAgBiwJ,gBAAgBjwJ,aAAaN,kBAAoBuwJ,gBAAgBjwJ,aAAaN,kBAAoB,IAC9J,EAuDEu1H,gBAtDoB,WACpB,OAAOg7B,gBAAgBjwJ,YACzB,EAqDEk1H,gBApDoB,SAAyB3xK,OAC7C0sM,gBAAgBjwJ,aAAez8C,KACjC,EAmDE2vM,eAlDmB,WACnB,OAAKvlC,MAASA,KAAK/qC,YAGZ+qC,KAAKrqC,aAFH,EAGX,EA8CE6vE,2BA7C+B,WAC/B,OAAOjD,iBAAmBA,iBAAiB3B,wBAA0B,CACvE,EA4CE6E,sBA3C0B,WAC1B,OAAOlD,kBAAoBA,iBAAiB1B,kBAC9C,GA0CG,CAAC,GA0DA6E,gBAjDS,SAAgBC,WAAYrqD,iBACvC,IACIsqD,2BADAtY,cAAe,EAEfuY,oBAAsB,IAAIlsF,WAAU,SAAUhnG,SAChDizL,2BAA6BjzL,OAC/B,IACImzL,YAAcH,WACdI,iBAAmBzqD,gBAiBvB,OAAO55J,OAAOsX,iBAAiB,CAC7B2oE,KAVS,SAAcqkI,wBACnB1Y,eAGJA,cAAe,EACfsY,2BAA2B,CACzBI,yBAEJ,GAGG,CACDpW,YAAa,CACXlrM,IAAK,WACH,OAAO4oM,YACT,GAEF11D,mBAAoB,CAClBlzI,IAAK,WACH,OAAOmhN,mBACT,GAEFF,WAAY,CACVjhN,IAAK,WACH,OAAOohN,WACT,GAEFxqD,gBAAiB,CACf52J,IAAK,WACH,OAAOqhN,gBACT,IAGN,EAYIE,oBAAsB,OA0GtBC,0BAnGmB,WACrB,IAAIC,SAAW,CAAC,EAQZC,2BAA6B,SAAoC9qD,iBACnE,OAAO55J,OAAOmpB,KAAKtE,6BAA6BuB,MAAK,SAAUjS,KAC7D,OAAO0Q,4BAA4B1Q,OAASylJ,eAC9C,GACF,EAiFA,OAAO55J,OAAOsX,iBAAiB,CAC7BqtM,eA5CmB,SAAwBV,WAAYrqD,iBACvD,GAAI6qD,SAASR,YAAa,CACxB,IAAIW,sBAAwB,qBAAuBX,WAAa,2CAEhE,OADAtxI,IAAIE,WAAW+xI,uBACR3sF,UAAUltF,OAAO65K,sBAC1B,CACA,IAAKF,2BAA2B9qD,iBAAkB,CAChD,IAAIirD,oCAAsC,qBAAuBZ,WAAa,sDAAwDrqD,gBAAkB,KAExJ,OADAjnF,IAAIE,WAAWgyI,qCACR5sF,UAAUltF,OAAO85K,oCAC1B,CACA,IAAIC,OAASd,gBAAgBC,WAAYrqD,iBAEzC,OADA6qD,SAASR,YAAca,OAChBA,OAAO5uE,kBAChB,EA+BE2jB,gCAtBoC,SAAyCD,gBAAiBmrD,6BAC9F,GAAKL,2BAA2B9qD,iBAAhC,CAIA,IAAIorD,mBA1D6B,SAAsCprD,iBACvE,OAAO55J,OAAOmpB,KAAKs7L,UAAUx6M,QAAO,SAAUkK,KAC5C,OAAOswM,SAAStwM,KAAKylJ,kBAAoBA,eAC3C,IAAG9vJ,KAAI,SAAUqK,KACf,OAAOswM,SAAStwM,IAClB,GACF,CAoD2B8wM,CAA6BrrD,iBACtDorD,mBAAmB1iN,SAAQ,SAAUwiN,QACnC,IAAIA,OAAO5W,YAAX,CAGA,IAAIoW,uBAjDwB,SAAmCL,YACjE,IAAIiB,mBAAqBjB,WAAWl6L,QAAQw6L,oBAAqB,IAC7DY,8BAAgCzmF,WAAWmC,2BAA6BqkF,mBACxEZ,uBAAyBzjN,SAASqN,cAAc,OAGpD,OAFAo2M,uBAAuBj5C,UAAUxgK,IAAI6zH,WAAWkC,0BAChD0jF,uBAAuBj5C,UAAUxgK,IAAIs6M,+BAC9Bb,sBACT,CA0CiCc,CAA0BN,OAAOb,YAC9Dc,4BAA4B9jH,OAAOqjH,wBACnCQ,OAAO7kI,KAAKqkI,uBAHZ,CAIF,IACkC,IAA9BU,mBAAmB5jN,OACrB2jN,4BAA4B1sH,OAE5B0sH,4BAA4B3sH,MAb9B,MAFEzlB,IAAIE,WAAW,kEAAoE+mF,gBAAkB,IAiBzG,GAIG,CAAC,EACN,EAoCIyrD,iCAxB0B,SAAiC5+D,WAAY6+D,WACzE,IAAIx6E,SAAWwH,aAEf,OADAxH,SAAS90C,MAAMsvH,WACRx6E,SAASr7C,MAAMllD,MAAK,WACzB2oF,oBAAoBh2C,iBAAiB4tD,UACrC/tD,oBAAoBG,iBAAiB4tD,UACrC,IAAIutC,4BAA8Bxf,qCAAqCpS,WAAYvzB,qBAC/EmiB,KAAO,WAAiB,EACxBugB,aAAeta,0CAA0C,iBAAkB,IAAIjjH,MAAOk+I,WAC1F9vB,WAAWnmD,KAAKs1D,cAChB,IAAIm/C,cAAgBwH,uBAAuB91D,YACvCc,UAAYY,0BAA0B1B,WAAYA,WAAW/uH,KAAK,oBAAqB,CAAC,cAAc,EAAM29G,KAAMA,KAAM0/D,eAGxHwQ,eAAiB1kN,SAASwlF,uBAAuB,cACjDk/H,eAAenkN,OAAS,IAC1BmkN,eAAe,GAAGr2I,MAAMttE,OAAS,QAEnC2lJ,UAAUhP,aAAarpE,MAAMooB,QAAU,OACvC,IAAI8vD,UAAYvc,cAAcC,UACTikE,wBAAwBtoD,WAAYc,UAAWH,UAAWixB,6BAA6B,GAC7Fs7B,wBACjB,GACF,EAkGI6R,oBADU,UAcVC,cAAgB,0CAChBC,aAAe,SAGfC,mBAAqB5oI,oBAAoBF,gBAAgB5J,kBAAkB4H,yBAI3E4uG,cAAgB,SAAuB5rB,YAAaxsH,WACtD,IAAIu0K,cAAgB,CAClB5hN,KAAM65J,YACNxsH,WAEF,GAAI6hF,oBAAoByE,mBAAoB,CAC1CiuF,cAAclzK,MAAQwgF,oBAAoByE,mBAC1C,IAAIre,KAAOmiD,4BAA4BpqH,UAbxB,IAakD6hF,oBAAoBnB,uBAAwBmB,oBAAoBhB,sBAAuBgB,oBAAoBzB,oBAAqByB,oBAAoBtB,sBACrNg0F,cAAc5yK,eAAiBhH,wBAAwB,CACrDlsC,EAAGw5G,KAAKx5G,EACR0B,EAAG83G,KAAK93G,EACRG,MAAO23G,KAAK33G,MACZC,OAAQ03G,KAAK13G,QAEjB,CACA,OAAOgxD,6BAA6BgzJ,cACtC,EACIC,mCAAqC,SAA4CC,YACnF,IAAIC,UAAYD,WAAWrxL,MAAMgxL,eACjC,GAAIM,UAAW,CACb,IAAIloD,YAvB2B,SAAsCioD,YACvE,OAAoC,IAA7BA,WAAW5wM,QAAQ,KAAcywM,mBAAqBG,WAAWz4K,UAAUy4K,WAAW5wM,QAAQ,KAAM4wM,WAAW1kN,QAAQ4jE,MAChI,CAqBsBghJ,CAA6BF,YAC3CG,iBAAmBprE,4CAA4CkrE,UAAU,IAC7E,OAAOt8B,cAAc5rB,YAAaooD,iBACpC,CACF,EA0CIC,UAAW,EACXC,UAAY7/L,wBAAwBC,SAASC,SAC7C4/L,UAAY,CAAC,EACbC,WAAa,KACbC,kBAAoB,KACpB9/M,iBAAmB,SAA0BD,UAAWrD,UACtDqD,YAAcnC,OAAOwT,SAASa,gBAAkBlS,YAAcnC,OAAOwT,SAASY,2BAChF06G,oBAAoBU,wBAAuB,EAAM1wH,UACxCqD,YAAcnC,OAAOwT,SAASc,sBACvCw6G,oBAAoBrN,oBAAoB3iH,UAExCq/M,YAAY/7M,iBAAiBD,UAAWrD,SAE5C,EACIwD,oBAAsB,SAA6BH,UAAWrD,UAC5DqD,YAAcnC,OAAOwT,SAASa,gBAAkBlS,YAAcnC,OAAOwT,SAASY,2BAChF06G,oBAAoBU,wBAAuB,EAAO1wH,UACzCqD,YAAcnC,OAAOwT,SAASc,sBACvCw6G,oBAAoBrN,oBAAoB,MAExC08F,YAAY77M,oBAAoBH,UAAWrD,SAE/C,EA+EIqjN,oBAAsB,SAA6B5gN,OACrD0gN,WAAa1gN,MAAM+hB,IACrB,EAoEI8+L,yBAA2BxmN,OAAOsX,iBAAiB,CACrDk+H,KAAM+sE,YAAY/sE,KAClB7gF,MAAO4tJ,YAAY5tJ,MACnBnuD,iBACAE,oBACA+/M,OA9EgB,SAAqBnnI,KACrC4zC,oBAAoBE,YAAY9zC,IAClC,EA6EEg0C,cAAeJ,oBAAoBI,cACnCtqB,IA1EQ,SAAa0nF,aACjBw1B,WAGJ7oG,WAAWmC,eACP4mG,UAAUz5F,qBACZuG,oBAAoBxG,gCAAgC05F,UAAUz5F,qBAEhEuG,oBAAoBxI,yBAAwB,GAC5CwI,oBAAoBzE,iBAAgB,GACpC8zF,YAAYtiI,KAAK,IAAMywG,aACvBlqL,iBAAiB,QAAS+/M,qBAC1BL,UAAW,EACb,EA8DE3wE,QA7DY,WACZ,GAAK2wE,SAAL,CAGA,IAAIQ,WAAanE,YAAYG,4BAC7Bh8M,oBAAoB,QAAS6/M,qBAC7BhE,YAAYhtE,UACRmxE,aACFA,WAAW33G,cACX23G,WAAWr7H,SAEb6nC,oBAAoBC,qBACpB+yF,UAAW,EACXC,UAAY7/L,wBAAwBC,SAASC,SAC7C4/L,UAAY,CAAC,EACbC,WAAa,KACbC,kBAAoB,IAbpB,CAcF,EA6CExxF,SA5Ca,SAAkBxP,WAC/Bi7F,yBAAyBj7F,UAC3B,EA2CEq/F,eAtCmB,SAAwBV,WAAYrqD,iBAClD0sD,oBAJLA,kBAAoB9B,4BACpBtxF,oBAAoB/D,oBAAoBm3F,oBAMxC,IAAIK,kBAAoBL,kBAAkB3B,eAAeV,WAAYrqD,iBAIrE,OAHA2oD,YAAYmB,aAAat/M,OAAOif,OAAOC,MAAO,CAC5Cs2I,kBAEK+sD,iBACT,EA8BEC,mBA7BuB,SAA4BC,iBAAkBvB,WACrE,IAAI7+D,WAAa3rC,EAAE+rG,kBACnBxB,iCAAiC5+D,WAAY6+D,UAC/C,EA2BEwB,uBA1B2B,WAC3BvE,YAAYmB,aAAat/M,OAAOwT,SAASmB,mBAC3C,EAyBEguM,oBAxBwB,WACxBxE,YAAYmB,aAAat/M,OAAOwT,SAASoB,eAC3C,EAuBEi9H,gBAAiBssE,YAAYtsE,gBAC7B+wE,yBAvB6B,SAAkCC,iBAC/D,GAAIA,iBAA8C,iBAApBA,gBAA8B,CAC1D,IAAIC,SAvMa,SAAwBC,YAC3C,IAAKA,YAAoC,iBAAfA,WACxB,OAAO,KAET,IAAIC,kBAAoBD,WAAWxpL,MAAM+nL,cACrC2B,aAAe,GACfC,0BAA4B,EAehC,OAdAF,kBAAkB9kN,SAAQ,SAAUilN,UAClC,GAAI9B,cAAcx7L,KAAKs9L,UAAW,CAChC,IAAI98B,QAAUo7B,mCAAmC0B,UAC7C98B,SAAWA,QAAQp5I,UAAYi2K,2BACjCA,yBAA2B78B,QAAQp5I,UACnCg2K,aAAa/iN,KAAKmmL,SAEtB,CACF,IAGI48B,aAAajmN,QAAwC,IAA9BimN,aAAa,GAAGh2K,WACzCg2K,aAAa5wH,QAAQgzF,cAAck8B,mBAxDhB,IA0Dd0B,aAAajmN,OAAS8xD,8BAA8B,CACzDF,MAAOq0J,eACJ,IACP,CA+KmBG,CAAeC,mBAAmBR,kBAC7CC,WACFh0F,oBAAoBb,wBAA0B60F,SAElD,CACF,GAiBG,CACDxlJ,QAAS,CACP1+D,IAAK,WACH,OAAOwiN,mBACT,GAEFr2D,SAAU,CACRnsJ,IAAKkwH,oBAAoBtK,iBACzBjmH,IA5Kc,SAAqBuR,OACrCg/G,oBAAoBrK,iBAAiD,SAAhC56G,OAAOiG,OAAO0nB,cACrD,GA4KErV,SAAU,CACRvjB,IA5Kc,WAChB,OAAOmjN,SACT,EA2KIxjN,IA1Kc,SAAqBuR,OACrC,IAAIwzM,eAAiBz5M,OAAOiG,OAAO0nB,cAC/B8rL,iBAAmBphM,wBAAwBC,SAAgB,OAC7D4/L,UAAY7/L,wBAAwBC,SAAgB,MACpD2sG,oBAAoBrI,oBAAmB,GACvCqI,oBAAoBjJ,qBAAoB,GACxCiJ,oBAAoBlI,2BAA0B,IACrC08F,iBAAmBphM,wBAAwBC,SAAe,MACnE4/L,UAAY7/L,wBAAwBC,SAAe,KACnD2sG,oBAAoBrI,oBAAmB,GACvCqI,oBAAoBjJ,qBAAoB,GACxCiJ,oBAAoBlI,2BAA0B,IACrC08F,iBAAmBphM,wBAAwBC,SAASE,SAC7D0/L,UAAY7/L,wBAAwBC,SAASE,QAC7CysG,oBAAoBrI,oBAAmB,GACvCqI,oBAAoBjJ,qBAAoB,GACxCiJ,oBAAoBlI,2BAA0B,KAG9Cm7F,UAAY7/L,wBAAwBC,SAASC,SAC7C0sG,oBAAoBrI,oBAAmB,GACvCqI,oBAAoBjJ,qBAAoB,GACxCiJ,oBAAoBlI,2BAA0B,IAEhDu3F,YAAYmB,aAAat/M,OAAO+W,SAASW,QAC3C,GAmJE8qG,oBAAqB,CACnB5jH,IAAKkwH,oBAAoBxM,uBACzB/jH,IApJyB,SAAgCikH,qBAC3DsM,oBAAoBuB,uBAAuB7N,qBAC3C27F,YAAYmB,aAAat/M,OAAO+W,SAASW,QAC3C,GAmJEs6H,WAAY,CACVpzI,IAAKu/M,YAAYO,eAEnBh4G,YAAa,CACX9nG,IAAKu/M,YAAY/xD,eACjB7tJ,IAAK4/M,YAAYD,gBAEnB9wK,SAAU,CACRxuC,IAAKu/M,YAAYzzD,aAEnBl4I,MAAO,CACL5T,IAhJW,WACb,OAAOqjN,UACT,GAgJE5vE,MAAO,CACLzzI,IAAKu/M,YAAYQ,UAEnB7zD,KAAM,CACJlsJ,IAnKU,WACZ,IAAIilH,eAAiBiL,oBAAoBnL,oBACzC,MAAgE,SAAzDmL,oBAAoBsB,mBAAmB54F,gBAAgD,SAAnBqsF,gBAAgD,MAAnBA,eAC1G,EAiKItlH,IAhKU,SAAiBuR,OACO,SAAhCjG,OAAOiG,OAAO0nB,eAChBs3F,oBAAoBrL,iBAAiB,QACrCqL,oBAAoBlL,kBAAkB,UAEtCkL,oBAAoBrL,iBAAiB,QACrCqL,oBAAoBlL,kBAAkB,QAE1C,GA0JEuuB,MAAO,CACLvzI,IAAKu/M,YAAYgB,SACjB5gN,IAxJW,SAAkBuR,OAC/BquM,YAAY15C,SAAyC,SAAhC56J,OAAOiG,OAAO0nB,cACrC,GAwJEy6G,OAAQ,CACNrzI,IAAKu/M,YAAYS,WAEnBxsE,aAAc,CACZxzI,IAAKu/M,YAAYU,gBACjBtgN,IAAK4/M,YAAY7xD,iBAEnB/Z,SAAU,CACR3zI,IAAKu/M,YAAYW,aAEnBtsE,OAAQ,CACN5zI,IAAKu/M,YAAYY,WAEnBtsE,SAAU,CACR7zI,IAAKu/M,YAAYa,aAEnBjsF,QAAS,CACPn0H,IAAKkwH,oBAAoB9E,WACzBzrH,IAAKuwH,oBAAoB7E,YAE3BqoB,QAAS,CACP1zI,IAAKu/M,YAAYc,YAEnB/sE,OAAQ,CACNtzI,IAAKu/M,YAAYe,UACjB3gN,IAAK4/M,YAAY3xD,WAEnBtxE,IAAK,CACHt8E,IAAKkwH,oBAAoB9M,YACzBzjH,IAAKuwH,oBAAoB7M,aAG3B6zC,UAAW,CACTl3J,IAAKkwH,oBAAoBrM,kBACzBlkH,IAAKuwH,oBAAoBpM,mBAE3BL,OAAQ,CACNzjH,IAAKkwH,oBAAoB3M,UACzB5jH,IAAKuwH,oBAAoB1M,WAE3BmhG,OAAQ,CACN3kN,IAAKkwH,oBAAoBlM,gBACzBrkH,IAAKuwH,oBAAoBjM,iBAE3BI,WAAY,CACVrkH,IAAKkwH,oBAAoB/L,cACzBxkH,IAAKuwH,oBAAoB9L,eAE3BI,SAAU,CACRxkH,IAAKkwH,oBAAoB5L,YACzB3kH,IAAKuwH,oBAAoB3L,aAE3BqgG,YAAa,CACX5kN,IAAKu/M,YAAYsB,gBAEnBgE,WAAY,CACV7kN,IAAKkwH,oBAAoBrF,cACzBlrH,IAAKuwH,oBAAoBpF,eAE3B+B,yBAA0B,CACxB7sH,IAAKkwH,oBAAoBvD,4BACzBhtH,IAAKuwH,oBAAoBtD,6BAE3Bya,OAAQ,CACNrnI,IAAKkwH,oBAAoBnG,YACzBpqH,IAAKuwH,oBAAoBlG,aAE3BuxE,sBAAuB,CACrBv7L,IArN2B,WAC7B,OAAOq7L,YAAYG,0BACrB,EAoNI77L,IAnN2B,SAAkCuR,OAC/DmqL,YAAYC,yBAAyBpqL,MACvC,GAmNEktK,WAAY,CACVp+K,IAAKkwH,oBAAoBpJ,mBACzBnnH,IAAKuwH,oBAAoBnJ,oBAE3B77D,SAAU,CACRlrD,IAAKu/M,YAAY58B,sBAEnBh1H,aAAc,CACZ3tD,IAAKu/M,YAAY38B,gBACjBjjL,IAAK4/M,YAAY18B,iBAEnBiiC,gBAAiB,CACf9kN,IAAKu/M,YAAY3sE,mBACjBjzI,IAAK4/M,YAAY1sE,oBAEnBkyE,2BAA4B,CAC1B/kN,IAAKkwH,oBAAoB7J,qCACzB1mH,IAAKuwH,oBAAoB5J,sCAE3B3B,SAAU,CACR3kH,IAAKkwH,oBAAoBzL,iBACzB9kH,IAAKuwH,oBAAoBxL,kBAE3B28C,UAAW,CACTrhK,IAAKu/M,YAAYzsE,aACjBnzI,IAAK4/M,YAAYxsE,cAEnBiyE,UAAW,CACThlN,IAAKu/M,YAAYqB,cAEnBnuE,mBAAoB,CAClBzyI,IAAKu/M,YAAY9sE,oBAEnBwyE,SAAU,CACRjlN,IApPc,WAChB,OAAOojN,SACT,EAmPIzjN,IAlPc,SAAqBuR,OACZ,WAArBwS,UAAUxS,SACZkyM,UAAYtrG,EAAEh6B,OAAOslI,UAAWlyM,OAEpC,GAiPEg0M,YAAa,CACXllN,IArQwB,WAC1B,OAAQkwH,oBAAoB2B,+BAC9B,EAoQIlyH,IAnQwB,SAA+BuR,OACzDg/G,oBAAoB1F,+BAA+Bt5G,MACrD,GAmQEi0M,eAAgB,CACdnlN,IAAKq6G,WAAWI,gBAElBqK,cAAe,CACb9kH,IAAKkwH,oBAAoBsB,iBACzB7xH,IAAKuwH,oBAAoBrL,kBAE3BI,eAAgB,CACdjlH,IAAKkwH,oBAAoBnL,kBACzBplH,IAAKuwH,oBAAoBlL,mBAE3BI,8BAA+B,CAC7BplH,IAAKkwH,oBAAoBhL,iCACzBvlH,IAAKuwH,oBAAoB/K,kCAE3BK,oBAAqB,CACnBxlH,IAAKkwH,oBAAoB5K,uBACzB3lH,IAAKuwH,oBAAoB3K,wBAE3B6/F,0BAA2B,CACzBplN,IAAKkwH,oBAAoBpE,4BACzBnsH,IAAKuwH,oBAAoBnE,6BAE3Bs5F,0BAA2B,CACzBrlN,IAAKkwH,oBAAoBlE,4BACzBrsH,IAAKuwH,oBAAoBjE,6BAE3BM,qBAAsB,CACpBvsH,IAAKkwH,oBAAoB7D,wBACzB1sH,IAAKuwH,oBAAoB5D,yBAE3BI,qBAAsB,CACpB1sH,IAAKkwH,oBAAoB1D,wBACzB7sH,IAAKuwH,oBAAoBzD,yBAE3BrE,wBAAyB,CACvBpoH,IAAKkwH,oBAAoBhI,2BACzBvoH,IAAKuwH,oBAAoB/H,4BAE3B+L,YAAa,CACXl0H,IAAKkwH,oBAAoBlF,eACzBrrH,IAAKuwH,oBAAoBjF,gBAE3B+B,yBAA0B,CACxBhtH,IAAKkwH,oBAAoBpD,4BACzBntH,IAAKuwH,oBAAoBnD,6BAE3BI,kBAAmB,CACjBntH,IAAKkwH,oBAAoBjD,qBACzBttH,IAAKuwH,oBAAoBhD,sBAE3BI,iBAAkB,CAChBttH,IAAKkwH,oBAAoB9C,oBACzBztH,IAAKuwH,oBAAoB7C,qBAE3BI,yBAA0B,CACxBztH,IAAKkwH,oBAAoB3C,4BACzB5tH,IAAKuwH,oBAAoB1C,6BAE3BI,iBAAkB,CAChB5tH,IAAKkwH,oBAAoBxC,oBACzB/tH,IAAKuwH,oBAAoBvC,qBAE3BO,SAAU,CACRluH,IAAKkwH,oBAAoBlC,YACzBruH,IAAKuwH,oBAAoBjC,aAE3BE,aAAc,CACZnuH,IAAKkwH,oBAAoB6B,gBACzBpyH,IAAKuwH,oBAAoBtG,iBAE3BrB,gCAAiC,CAC/BvoH,IAAKkwH,oBAAoB7H,mCACzB1oH,IAAKuwH,oBAAoB5H,oCAE3ByF,iBAAkB,CAChB/tH,IAAKkwH,oBAAoBrC,oBACzBluH,IAAKuwH,oBAAoBpC,qBAE3B6G,mBAAoB,CAClB30H,IAAKkwH,oBAAoB9B,qBACzBzuH,IAAKuwH,oBAAoB7B,sBAE3BI,oBAAqB,CACnBzuH,IAAKkwH,oBAAoB3B,uBACzB5uH,IAAKuwH,oBAAoB1B,wBAE3BI,qBAAsB,CACpB5uH,IAAKkwH,oBAAoBxB,wBACzB/uH,IAAKuwH,oBAAoBvB,yBAE3BI,uBAAwB,CACtB/uH,IAAKkwH,oBAAoBrB,0BACzBlvH,IAAKuwH,oBAAoBpB,2BAE3BI,sBAAuB,CACrBlvH,IAAKkwH,oBAAoBlB,yBACzBrvH,IAAKuwH,oBAAoBjB,0BAE3BO,oCAAqC,CACnCxvH,IAAKkwH,oBAAoBZ,uCACzB3vH,IAAKuwH,oBAAoBX,wCAE3B+1F,iBAAkB,CAChBtlN,IAAKu/M,YAAYuB,4BAEnB5uF,mBAAoB,CAClBlyH,IAAKkwH,oBAAoB8B,sBACzBryH,IAAKuwH,oBAAoB+B,uBAE3BI,sBAAuB,CACrBryH,IAAKkwH,oBAAoBiC,yBACzBxyH,IAAKuwH,oBAAoBkC,0BAE3BzC,2BAA4B,CAC1B3vH,IAAKkwH,oBAAoBT,8BACzB9vH,IAAKuwH,oBAAoBR,+BAE3BkF,kBAAmB,CACjB50H,IAAKkwH,oBAAoBN,qBACzBjwH,IAAKuwH,oBAAoBL,sBAE3BssF,mBAAoB,CAClBn8M,IAAK,WACH,OAAOu/M,YAAYwB,yBAA2B3zC,aAAaC,MAC7D,GAEFvqD,iBAAkB,CAChB9iH,IAAKkwH,oBAAoBtN,oBACzBjjH,IAAKuwH,oBAAoBrN,qBAE3BmN,wBAAyB,CACvBhwH,IAAKkwH,oBAAoBJ,2BACzBnwH,IAAKuwH,oBAAoBH,4BAG3Bw1F,YAAa,CACXvlN,IAAK,WACH,OAreuDwlN,eAqezB,6BAreyC/qH,YAqeX,EApehElyD,QAAQggH,KAAK,iBAAiB9+I,OAAO+7M,eAAgB,2BAC9C/qH,YAFoB,IAAgC+qH,eAAgB/qH,WAsezE,EACA96F,IAAK,WA1eoB,IAAgC6lN,8BA2ehC,6BA1e3Bj9K,QAAQggH,KAAK,iBAAiB9+I,OAAO+7M,eAAgB,0BA2enD","sources":["../node_modules/@techsmith/techsmith-smartplayer/dist/techsmith-smart-player.esm.js"],"sourcesContent":["/**\n * TechSmith Smart Player v5.121.0\n */\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nvar pep = {exports: {}};\n\n/*!\n * PEP v0.4.3 | https://github.com/jquery/PEP\n * Copyright jQuery Foundation and other contributors | http://jquery.org/license\n */\n(function (module, exports) {\n (function (global, factory) {\n module.exports = factory() ;\n })(commonjsGlobal, function () {\n\n /**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType`, initialized with properties from `inDict`.\n */\n var MOUSE_PROPS = ['bubbles', 'cancelable', 'view', 'detail', 'screenX', 'screenY', 'clientX', 'clientY', 'ctrlKey', 'altKey', 'shiftKey', 'metaKey', 'button', 'relatedTarget', 'pageX', 'pageY'];\n var MOUSE_DEFAULTS = [false, false, null, null, 0, 0, 0, 0, false, false, false, false, 0, null, 0, 0];\n function PointerEvent(inType, inDict) {\n inDict = inDict || Object.create(null);\n var e = document.createEvent('Event');\n e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n\n // define inherited MouseEvent properties\n // skip bubbles and cancelable since they're set above in initEvent()\n for (var i = 2, p; i < MOUSE_PROPS.length; i++) {\n p = MOUSE_PROPS[i];\n e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n }\n e.buttons = inDict.buttons || 0;\n\n // Spec requires that pointers without pressure specified use 0.5 for down\n // state and 0 for up state.\n var pressure = 0;\n if (inDict.pressure && e.buttons) {\n pressure = inDict.pressure;\n } else {\n pressure = e.buttons ? 0.5 : 0;\n }\n\n // add x/y properties aliased to clientX/Y\n e.x = e.clientX;\n e.y = e.clientY;\n\n // define the properties of the PointerEvent interface\n e.pointerId = inDict.pointerId || 0;\n e.width = inDict.width || 0;\n e.height = inDict.height || 0;\n e.pressure = pressure;\n e.tiltX = inDict.tiltX || 0;\n e.tiltY = inDict.tiltY || 0;\n e.twist = inDict.twist || 0;\n e.tangentialPressure = inDict.tangentialPressure || 0;\n e.pointerType = inDict.pointerType || '';\n e.hwTimestamp = inDict.hwTimestamp || 0;\n e.isPrimary = inDict.isPrimary || false;\n return e;\n }\n\n /**\n * This module implements a map of pointer states\n */\n var USE_MAP = window.Map && window.Map.prototype.forEach;\n var PointerMap = USE_MAP ? Map : SparseArrayMap;\n function SparseArrayMap() {\n this.array = [];\n this.size = 0;\n }\n SparseArrayMap.prototype = {\n set: function set(k, v) {\n if (v === undefined) {\n return this[\"delete\"](k);\n }\n if (!this.has(k)) {\n this.size++;\n }\n this.array[k] = v;\n },\n has: function has(k) {\n return this.array[k] !== undefined;\n },\n \"delete\": function _delete(k) {\n if (this.has(k)) {\n delete this.array[k];\n this.size--;\n }\n },\n get: function get(k) {\n return this.array[k];\n },\n clear: function clear() {\n this.array.length = 0;\n this.size = 0;\n },\n // return value, key, map\n forEach: function forEach(callback, thisArg) {\n return this.array.forEach(function (v, k) {\n callback.call(thisArg, v, k, this);\n }, this);\n }\n };\n var CLONE_PROPS = [\n // MouseEvent\n 'bubbles', 'cancelable', 'view', 'detail', 'screenX', 'screenY', 'clientX', 'clientY', 'ctrlKey', 'altKey', 'shiftKey', 'metaKey', 'button', 'relatedTarget',\n // DOM Level 3\n 'buttons',\n // PointerEvent\n 'pointerId', 'width', 'height', 'pressure', 'tiltX', 'tiltY', 'pointerType', 'hwTimestamp', 'isPrimary',\n // event instance\n 'type', 'target', 'currentTarget', 'which', 'pageX', 'pageY', 'timeStamp'];\n var CLONE_DEFAULTS = [\n // MouseEvent\n false, false, null, null, 0, 0, 0, 0, false, false, false, false, 0, null,\n // DOM Level 3\n 0,\n // PointerEvent\n 0, 0, 0, 0, 0, 0, '', 0, false,\n // event instance\n '', null, null, 0, 0, 0, 0];\n var BOUNDARY_EVENTS = {\n 'pointerover': 1,\n 'pointerout': 1,\n 'pointerenter': 1,\n 'pointerleave': 1\n };\n var HAS_SVG_INSTANCE = typeof SVGElementInstance !== 'undefined';\n\n /**\n * This module is for normalizing events. Mouse and Touch events will be\n * collected here, and fire PointerEvents that have the same semantics, no\n * matter the source.\n * Events fired:\n * - pointerdown: a pointing is added\n * - pointerup: a pointer is removed\n * - pointermove: a pointer is moved\n * - pointerover: a pointer crosses into an element\n * - pointerout: a pointer leaves an element\n * - pointercancel: a pointer will no longer generate events\n */\n var dispatcher = {\n pointermap: new PointerMap(),\n eventMap: Object.create(null),\n captureInfo: Object.create(null),\n // Scope objects for native events.\n // This exists for ease of testing.\n eventSources: Object.create(null),\n eventSourceList: [],\n /**\n * Add a new event source that will generate pointer events.\n *\n * `inSource` must contain an array of event names named `events`, and\n * functions with the names specified in the `events` array.\n * @param {string} name A name for the event source\n * @param {Object} source A new source of platform events.\n */\n registerSource: function registerSource(name, source) {\n var s = source;\n var newEvents = s.events;\n if (newEvents) {\n newEvents.forEach(function (e) {\n if (s[e]) {\n this.eventMap[e] = s[e].bind(s);\n }\n }, this);\n this.eventSources[name] = s;\n this.eventSourceList.push(s);\n }\n },\n register: function register(element) {\n var l = this.eventSourceList.length;\n for (var i = 0, es; i < l && (es = this.eventSourceList[i]); i++) {\n // call eventsource register\n es.register.call(es, element);\n }\n },\n unregister: function unregister(element) {\n var l = this.eventSourceList.length;\n for (var i = 0, es; i < l && (es = this.eventSourceList[i]); i++) {\n // call eventsource register\n es.unregister.call(es, element);\n }\n },\n contains: /*scope.external.contains || */function contains(container, contained) {\n try {\n return container.contains(contained);\n } catch (ex) {\n // most likely: https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n return false;\n }\n },\n // EVENTS\n down: function down(inEvent) {\n inEvent.bubbles = true;\n this.fireEvent('pointerdown', inEvent);\n },\n move: function move(inEvent) {\n inEvent.bubbles = true;\n this.fireEvent('pointermove', inEvent);\n },\n up: function up(inEvent) {\n inEvent.bubbles = true;\n this.fireEvent('pointerup', inEvent);\n },\n enter: function enter(inEvent) {\n inEvent.bubbles = false;\n this.fireEvent('pointerenter', inEvent);\n },\n leave: function leave(inEvent) {\n inEvent.bubbles = false;\n this.fireEvent('pointerleave', inEvent);\n },\n over: function over(inEvent) {\n inEvent.bubbles = true;\n this.fireEvent('pointerover', inEvent);\n },\n out: function out(inEvent) {\n inEvent.bubbles = true;\n this.fireEvent('pointerout', inEvent);\n },\n cancel: function cancel(inEvent) {\n inEvent.bubbles = true;\n this.fireEvent('pointercancel', inEvent);\n },\n leaveOut: function leaveOut(event) {\n this.out(event);\n this.propagate(event, this.leave, false);\n },\n enterOver: function enterOver(event) {\n this.over(event);\n this.propagate(event, this.enter, true);\n },\n // LISTENER LOGIC\n eventHandler: function eventHandler(inEvent) {\n // This is used to prevent multiple dispatch of pointerevents from\n // platform events. This can happen when two elements in different scopes\n // are set up to create pointer events, which is relevant to Shadow DOM.\n if (inEvent._handledByPE) {\n return;\n }\n var type = inEvent.type;\n var fn = this.eventMap && this.eventMap[type];\n if (fn) {\n fn(inEvent);\n }\n inEvent._handledByPE = true;\n },\n // set up event listeners\n listen: function listen(target, events) {\n events.forEach(function (e) {\n this.addEvent(target, e);\n }, this);\n },\n // remove event listeners\n unlisten: function unlisten(target, events) {\n events.forEach(function (e) {\n this.removeEvent(target, e);\n }, this);\n },\n addEvent: /*scope.external.addEvent || */function addEvent(target, eventName) {\n target.addEventListener(eventName, this.boundHandler);\n },\n removeEvent: /*scope.external.removeEvent || */function removeEvent(target, eventName) {\n target.removeEventListener(eventName, this.boundHandler);\n },\n // EVENT CREATION AND TRACKING\n /**\n * Creates a new Event of type `inType`, based on the information in\n * `inEvent`.\n *\n * @param {string} inType A string representing the type of event to create\n * @param {Event} inEvent A platform event with a target\n * @return {Event} A PointerEvent of type `inType`\n */\n makeEvent: function makeEvent(inType, inEvent) {\n // relatedTarget must be null if pointer is captured\n if (this.captureInfo[inEvent.pointerId]) {\n inEvent.relatedTarget = null;\n }\n var e = new PointerEvent(inType, inEvent);\n if (inEvent.preventDefault) {\n e.preventDefault = inEvent.preventDefault;\n }\n e._target = e._target || inEvent.target;\n return e;\n },\n // make and dispatch an event in one call\n fireEvent: function fireEvent(inType, inEvent) {\n var e = this.makeEvent(inType, inEvent);\n return this.dispatchEvent(e);\n },\n /**\n * Returns a snapshot of inEvent, with writable properties.\n *\n * @param {Event} inEvent An event that contains properties to copy.\n * @return {Object} An object containing shallow copies of `inEvent`'s\n * properties.\n */\n cloneEvent: function cloneEvent(inEvent) {\n var eventCopy = Object.create(null);\n var p;\n for (var i = 0; i < CLONE_PROPS.length; i++) {\n p = CLONE_PROPS[i];\n eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n\n // Work around SVGInstanceElement shadow tree\n // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n // This is the behavior implemented by Firefox.\n if (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {\n if (eventCopy[p] instanceof SVGElementInstance) {\n eventCopy[p] = eventCopy[p].correspondingUseElement;\n }\n }\n }\n\n // keep the semantics of preventDefault\n if (inEvent.preventDefault) {\n eventCopy.preventDefault = function () {\n inEvent.preventDefault();\n };\n }\n return eventCopy;\n },\n getTarget: function getTarget(inEvent) {\n var capture = this.captureInfo[inEvent.pointerId];\n if (!capture) {\n return inEvent._target;\n }\n if (inEvent._target === capture || !(inEvent.type in BOUNDARY_EVENTS)) {\n return capture;\n }\n },\n propagate: function propagate(event, fn, propagateDown) {\n var target = event.target;\n var targets = [];\n\n // Order of conditions due to document.contains() missing in IE.\n while (target !== document && !target.contains(event.relatedTarget)) {\n targets.push(target);\n target = target.parentNode;\n\n // Touch: Do not propagate if node is detached.\n if (!target) {\n return;\n }\n }\n if (propagateDown) {\n targets.reverse();\n }\n targets.forEach(function (target) {\n event.target = target;\n fn.call(this, event);\n }, this);\n },\n setCapture: function setCapture(inPointerId, inTarget, skipDispatch) {\n if (this.captureInfo[inPointerId]) {\n this.releaseCapture(inPointerId, skipDispatch);\n }\n this.captureInfo[inPointerId] = inTarget;\n this.implicitRelease = this.releaseCapture.bind(this, inPointerId, skipDispatch);\n document.addEventListener('pointerup', this.implicitRelease);\n document.addEventListener('pointercancel', this.implicitRelease);\n var e = new PointerEvent('gotpointercapture');\n e.pointerId = inPointerId;\n e._target = inTarget;\n if (!skipDispatch) {\n this.asyncDispatchEvent(e);\n }\n },\n releaseCapture: function releaseCapture(inPointerId, skipDispatch) {\n var t = this.captureInfo[inPointerId];\n if (!t) {\n return;\n }\n this.captureInfo[inPointerId] = undefined;\n document.removeEventListener('pointerup', this.implicitRelease);\n document.removeEventListener('pointercancel', this.implicitRelease);\n var e = new PointerEvent('lostpointercapture');\n e.pointerId = inPointerId;\n e._target = t;\n if (!skipDispatch) {\n this.asyncDispatchEvent(e);\n }\n },\n /**\n * Dispatches the event to its target.\n *\n * @param {Event} inEvent The event to be dispatched.\n * @return {Boolean} True if an event handler returns true, false otherwise.\n */\n dispatchEvent: /*scope.external.dispatchEvent || */function dispatchEvent(inEvent) {\n var t = this.getTarget(inEvent);\n if (t) {\n return t.dispatchEvent(inEvent);\n }\n },\n asyncDispatchEvent: function asyncDispatchEvent(inEvent) {\n requestAnimationFrame(this.dispatchEvent.bind(this, inEvent));\n }\n };\n dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n var targeting = {\n shadow: function shadow(inEl) {\n if (inEl) {\n return inEl.shadowRoot || inEl.webkitShadowRoot;\n }\n },\n canTarget: function canTarget(shadow) {\n return shadow && Boolean(shadow.elementFromPoint);\n },\n targetingShadow: function targetingShadow(inEl) {\n var s = this.shadow(inEl);\n if (this.canTarget(s)) {\n return s;\n }\n },\n olderShadow: function olderShadow(shadow) {\n var os = shadow.olderShadowRoot;\n if (!os) {\n var se = shadow.querySelector('shadow');\n if (se) {\n os = se.olderShadowRoot;\n }\n }\n return os;\n },\n allShadows: function allShadows(element) {\n var shadows = [];\n var s = this.shadow(element);\n while (s) {\n shadows.push(s);\n s = this.olderShadow(s);\n }\n return shadows;\n },\n searchRoot: function searchRoot(inRoot, x, y) {\n if (inRoot) {\n var t = inRoot.elementFromPoint(x, y);\n var st, sr;\n\n // is element a shadow host?\n sr = this.targetingShadow(t);\n while (sr) {\n // find the the element inside the shadow root\n st = sr.elementFromPoint(x, y);\n if (!st) {\n // check for older shadows\n sr = this.olderShadow(sr);\n } else {\n // shadowed element may contain a shadow root\n var ssr = this.targetingShadow(st);\n return this.searchRoot(ssr, x, y) || st;\n }\n }\n\n // light dom element is the target\n return t;\n }\n },\n owner: function owner(element) {\n var s = element;\n\n // walk up until you hit the shadow root or document\n while (s.parentNode) {\n s = s.parentNode;\n }\n\n // the owner element is expected to be a Document or ShadowRoot\n if (s.nodeType !== Node.DOCUMENT_NODE && s.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n s = document;\n }\n return s;\n },\n findTarget: function findTarget(inEvent) {\n var x = inEvent.clientX;\n var y = inEvent.clientY;\n\n // if the listener is in the shadow root, it is much faster to start there\n var s = this.owner(inEvent.target);\n\n // if x, y is not in this root, fall back to document search\n if (!s.elementFromPoint(x, y)) {\n s = document;\n }\n return this.searchRoot(s, x, y);\n }\n };\n var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n var map = Array.prototype.map.call.bind(Array.prototype.map);\n var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n var MO = window.MutationObserver || window.WebKitMutationObserver;\n var SELECTOR = '[touch-action]';\n var OBSERVER_INIT = {\n subtree: true,\n childList: true,\n attributes: true,\n attributeOldValue: true,\n attributeFilter: ['touch-action']\n };\n function Installer(add, remove, changed, binder) {\n this.addCallback = add.bind(binder);\n this.removeCallback = remove.bind(binder);\n this.changedCallback = changed.bind(binder);\n if (MO) {\n this.observer = new MO(this.mutationWatcher.bind(this));\n }\n }\n Installer.prototype = {\n watchSubtree: function watchSubtree(target) {\n // Only watch scopes that can target find, as these are top-level.\n // Otherwise we can see duplicate additions and removals that add noise.\n //\n // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n // a removal without an insertion when a node is redistributed among\n // shadows. Since it all ends up correct in the document, watching only\n // the document will yield the correct mutations to watch.\n if (this.observer && targeting.canTarget(target)) {\n this.observer.observe(target, OBSERVER_INIT);\n }\n },\n enableOnSubtree: function enableOnSubtree(target) {\n this.watchSubtree(target);\n if (target === document && document.readyState !== 'complete') {\n this.installOnLoad();\n } else {\n this.installNewSubtree(target);\n }\n },\n installNewSubtree: function installNewSubtree(target) {\n forEach(this.findElements(target), this.addElement, this);\n },\n findElements: function findElements(target) {\n if (target.querySelectorAll) {\n return target.querySelectorAll(SELECTOR);\n }\n return [];\n },\n removeElement: function removeElement(el) {\n this.removeCallback(el);\n },\n addElement: function addElement(el) {\n this.addCallback(el);\n },\n elementChanged: function elementChanged(el, oldValue) {\n this.changedCallback(el, oldValue);\n },\n concatLists: function concatLists(accum, list) {\n return accum.concat(toArray(list));\n },\n // register all touch-action = none nodes on document load\n installOnLoad: function installOnLoad() {\n document.addEventListener('readystatechange', function () {\n if (document.readyState === 'complete') {\n this.installNewSubtree(document);\n }\n }.bind(this));\n },\n isElement: function isElement(n) {\n return n.nodeType === Node.ELEMENT_NODE;\n },\n flattenMutationTree: function flattenMutationTree(inNodes) {\n // find children with touch-action\n var tree = map(inNodes, this.findElements, this);\n\n // make sure the added nodes are accounted for\n tree.push(filter(inNodes, this.isElement));\n\n // flatten the list\n return tree.reduce(this.concatLists, []);\n },\n mutationWatcher: function mutationWatcher(mutations) {\n mutations.forEach(this.mutationHandler, this);\n },\n mutationHandler: function mutationHandler(m) {\n if (m.type === 'childList') {\n var added = this.flattenMutationTree(m.addedNodes);\n added.forEach(this.addElement, this);\n var removed = this.flattenMutationTree(m.removedNodes);\n removed.forEach(this.removeElement, this);\n } else if (m.type === 'attributes') {\n this.elementChanged(m.target, m.oldValue);\n }\n }\n };\n function shadowSelector(v) {\n return 'body /shadow-deep/ ' + selector(v);\n }\n function selector(v) {\n return '[touch-action=\"' + v + '\"]';\n }\n function rule(v) {\n return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + '; }';\n }\n var attrib2css = ['none', 'auto', 'pan-x', 'pan-y', {\n rule: 'pan-x pan-y',\n selectors: ['pan-x pan-y', 'pan-y pan-x']\n }];\n var styles = '';\n\n // only install stylesheet if the browser has touch action support\n var hasNativePE = window.PointerEvent || window.MSPointerEvent;\n\n // only add shadow selectors if shadowdom is supported\n var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n function applyAttributeStyles() {\n if (hasNativePE) {\n attrib2css.forEach(function (r) {\n if (String(r) === r) {\n styles += selector(r) + rule(r) + '\\n';\n if (hasShadowRoot) {\n styles += shadowSelector(r) + rule(r) + '\\n';\n }\n } else {\n styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n if (hasShadowRoot) {\n styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n }\n }\n });\n var el = document.createElement('style');\n el.textContent = styles;\n document.head.appendChild(el);\n }\n }\n var pointermap = dispatcher.pointermap;\n\n // radius around touchend that swallows mouse events\n var DEDUP_DIST = 25;\n\n // left, middle, right, back, forward\n var BUTTON_TO_BUTTONS = [1, 4, 2, 8, 16];\n var HAS_BUTTONS = false;\n try {\n HAS_BUTTONS = new MouseEvent('test', {\n buttons: 1\n }).buttons === 1;\n } catch (e) {}\n\n // handler block for native mouse events\n var mouseEvents = {\n POINTER_ID: 1,\n POINTER_TYPE: 'mouse',\n events: ['mousedown', 'mousemove', 'mouseup', 'mouseover', 'mouseout'],\n register: function register(target) {\n dispatcher.listen(target, this.events);\n },\n unregister: function unregister(target) {\n dispatcher.unlisten(target, this.events);\n },\n lastTouches: [],\n // collide with the global mouse listener\n isEventSimulatedFromTouch: function isEventSimulatedFromTouch(inEvent) {\n var lts = this.lastTouches;\n var x = inEvent.clientX;\n var y = inEvent.clientY;\n for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n // simulated mouse events will be swallowed near a primary touchend\n var dx = Math.abs(x - t.x);\n var dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n return true;\n }\n }\n },\n prepareEvent: function prepareEvent(inEvent) {\n var e = dispatcher.cloneEvent(inEvent);\n\n // forward mouse preventDefault\n var pd = e.preventDefault;\n e.preventDefault = function () {\n inEvent.preventDefault();\n pd();\n };\n e.pointerId = this.POINTER_ID;\n e.isPrimary = true;\n e.pointerType = this.POINTER_TYPE;\n return e;\n },\n prepareButtonsForMove: function prepareButtonsForMove(e, inEvent) {\n var p = pointermap.get(this.POINTER_ID);\n\n // Update buttons state after possible out-of-document mouseup.\n if (inEvent.which === 0 || !p) {\n e.buttons = 0;\n } else {\n e.buttons = p.buttons;\n }\n inEvent.buttons = e.buttons;\n },\n mousedown: function mousedown(inEvent) {\n if (!this.isEventSimulatedFromTouch(inEvent)) {\n var p = pointermap.get(this.POINTER_ID);\n var e = this.prepareEvent(inEvent);\n if (!HAS_BUTTONS) {\n e.buttons = BUTTON_TO_BUTTONS[e.button];\n if (p) {\n e.buttons |= p.buttons;\n }\n inEvent.buttons = e.buttons;\n }\n pointermap.set(this.POINTER_ID, inEvent);\n if (!p || p.buttons === 0) {\n dispatcher.down(e);\n } else {\n dispatcher.move(e);\n }\n }\n },\n mousemove: function mousemove(inEvent) {\n if (!this.isEventSimulatedFromTouch(inEvent)) {\n var e = this.prepareEvent(inEvent);\n if (!HAS_BUTTONS) {\n this.prepareButtonsForMove(e, inEvent);\n }\n e.button = -1;\n pointermap.set(this.POINTER_ID, inEvent);\n dispatcher.move(e);\n }\n },\n mouseup: function mouseup(inEvent) {\n if (!this.isEventSimulatedFromTouch(inEvent)) {\n var p = pointermap.get(this.POINTER_ID);\n var e = this.prepareEvent(inEvent);\n if (!HAS_BUTTONS) {\n var up = BUTTON_TO_BUTTONS[e.button];\n\n // Produces wrong state of buttons in Browsers without `buttons` support\n // when a mouse button that was pressed outside the document is released\n // inside and other buttons are still pressed down.\n e.buttons = p ? p.buttons & ~up : 0;\n inEvent.buttons = e.buttons;\n }\n pointermap.set(this.POINTER_ID, inEvent);\n\n // Support: Firefox <=44 only\n // FF Ubuntu includes the lifted button in the `buttons` property on\n // mouseup.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1223366\n e.buttons &= ~BUTTON_TO_BUTTONS[e.button];\n if (e.buttons === 0) {\n dispatcher.up(e);\n } else {\n dispatcher.move(e);\n }\n }\n },\n mouseover: function mouseover(inEvent) {\n if (!this.isEventSimulatedFromTouch(inEvent)) {\n var e = this.prepareEvent(inEvent);\n if (!HAS_BUTTONS) {\n this.prepareButtonsForMove(e, inEvent);\n }\n e.button = -1;\n pointermap.set(this.POINTER_ID, inEvent);\n dispatcher.enterOver(e);\n }\n },\n mouseout: function mouseout(inEvent) {\n if (!this.isEventSimulatedFromTouch(inEvent)) {\n var e = this.prepareEvent(inEvent);\n if (!HAS_BUTTONS) {\n this.prepareButtonsForMove(e, inEvent);\n }\n e.button = -1;\n dispatcher.leaveOut(e);\n }\n },\n cancel: function cancel(inEvent) {\n var e = this.prepareEvent(inEvent);\n dispatcher.cancel(e);\n this.deactivateMouse();\n },\n deactivateMouse: function deactivateMouse() {\n pointermap[\"delete\"](this.POINTER_ID);\n }\n };\n var captureInfo = dispatcher.captureInfo;\n var findTarget = targeting.findTarget.bind(targeting);\n var allShadows = targeting.allShadows.bind(targeting);\n var pointermap$1 = dispatcher.pointermap;\n\n // This should be long enough to ignore compat mouse events made by touch\n var DEDUP_TIMEOUT = 2500;\n var CLICK_COUNT_TIMEOUT = 200;\n var ATTRIB = 'touch-action';\n var INSTALLER;\n\n // handler block for native touch events\n var touchEvents = {\n events: ['touchstart', 'touchmove', 'touchend', 'touchcancel'],\n register: function register(target) {\n INSTALLER.enableOnSubtree(target);\n },\n unregister: function unregister() {\n\n // TODO(dfreedman): is it worth it to disconnect the MO?\n },\n elementAdded: function elementAdded(el) {\n var a = el.getAttribute(ATTRIB);\n var st = this.touchActionToScrollType(a);\n if (st) {\n el._scrollType = st;\n dispatcher.listen(el, this.events);\n\n // set touch-action on shadows as well\n allShadows(el).forEach(function (s) {\n s._scrollType = st;\n dispatcher.listen(s, this.events);\n }, this);\n }\n },\n elementRemoved: function elementRemoved(el) {\n el._scrollType = undefined;\n dispatcher.unlisten(el, this.events);\n\n // remove touch-action from shadow\n allShadows(el).forEach(function (s) {\n s._scrollType = undefined;\n dispatcher.unlisten(s, this.events);\n }, this);\n },\n elementChanged: function elementChanged(el, oldValue) {\n var a = el.getAttribute(ATTRIB);\n var st = this.touchActionToScrollType(a);\n var oldSt = this.touchActionToScrollType(oldValue);\n\n // simply update scrollType if listeners are already established\n if (st && oldSt) {\n el._scrollType = st;\n allShadows(el).forEach(function (s) {\n s._scrollType = st;\n }, this);\n } else if (oldSt) {\n this.elementRemoved(el);\n } else if (st) {\n this.elementAdded(el);\n }\n },\n scrollTypes: {\n EMITTER: 'none',\n XSCROLLER: 'pan-x',\n YSCROLLER: 'pan-y',\n SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/\n },\n touchActionToScrollType: function touchActionToScrollType(touchAction) {\n var t = touchAction;\n var st = this.scrollTypes;\n if (t === 'none') {\n return 'none';\n } else if (t === st.XSCROLLER) {\n return 'X';\n } else if (t === st.YSCROLLER) {\n return 'Y';\n } else if (st.SCROLLER.exec(t)) {\n return 'XY';\n }\n },\n POINTER_TYPE: 'touch',\n firstTouch: null,\n isPrimaryTouch: function isPrimaryTouch(inTouch) {\n return this.firstTouch === inTouch.identifier;\n },\n setPrimaryTouch: function setPrimaryTouch(inTouch) {\n // set primary touch if there no pointers, or the only pointer is the mouse\n if (pointermap$1.size === 0 || pointermap$1.size === 1 && pointermap$1.has(1)) {\n this.firstTouch = inTouch.identifier;\n this.firstXY = {\n X: inTouch.clientX,\n Y: inTouch.clientY\n };\n this.scrolling = false;\n this.cancelResetClickCount();\n }\n },\n removePrimaryPointer: function removePrimaryPointer(inPointer) {\n if (inPointer.isPrimary) {\n this.firstTouch = null;\n this.firstXY = null;\n this.resetClickCount();\n }\n },\n clickCount: 0,\n resetId: null,\n resetClickCount: function resetClickCount() {\n var fn = function () {\n this.clickCount = 0;\n this.resetId = null;\n }.bind(this);\n this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n },\n cancelResetClickCount: function cancelResetClickCount() {\n if (this.resetId) {\n clearTimeout(this.resetId);\n }\n },\n typeToButtons: function typeToButtons(type) {\n var ret = 0;\n if (type === 'touchstart' || type === 'touchmove') {\n ret = 1;\n }\n return ret;\n },\n touchToPointer: function touchToPointer(inTouch) {\n var cte = this.currentTouchEvent;\n var e = dispatcher.cloneEvent(inTouch);\n\n // We reserve pointerId 1 for Mouse.\n // Touch identifiers can start at 0.\n // Add 2 to the touch identifier for compatibility.\n var id = e.pointerId = inTouch.identifier + 2;\n e.target = captureInfo[id] || findTarget(e);\n e.bubbles = true;\n e.cancelable = true;\n e.detail = this.clickCount;\n e.button = 0;\n e.buttons = this.typeToButtons(cte.type);\n e.width = (inTouch.radiusX || inTouch.webkitRadiusX || 0) * 2;\n e.height = (inTouch.radiusY || inTouch.webkitRadiusY || 0) * 2;\n e.pressure = inTouch.force || inTouch.webkitForce || 0.5;\n e.isPrimary = this.isPrimaryTouch(inTouch);\n e.pointerType = this.POINTER_TYPE;\n\n // forward modifier keys\n e.altKey = cte.altKey;\n e.ctrlKey = cte.ctrlKey;\n e.metaKey = cte.metaKey;\n e.shiftKey = cte.shiftKey;\n\n // forward touch preventDefaults\n var self = this;\n e.preventDefault = function () {\n self.scrolling = false;\n self.firstXY = null;\n cte.preventDefault();\n };\n return e;\n },\n processTouches: function processTouches(inEvent, inFunction) {\n var tl = inEvent.changedTouches;\n this.currentTouchEvent = inEvent;\n for (var i = 0, t; i < tl.length; i++) {\n t = tl[i];\n inFunction.call(this, this.touchToPointer(t));\n }\n },\n // For single axis scrollers, determines whether the element should emit\n // pointer events or behave as a scroller\n shouldScroll: function shouldScroll(inEvent) {\n if (this.firstXY) {\n var ret;\n var scrollAxis = inEvent.currentTarget._scrollType;\n if (scrollAxis === 'none') {\n // this element is a touch-action: none, should never scroll\n ret = false;\n } else if (scrollAxis === 'XY') {\n // this element should always scroll\n ret = true;\n } else {\n var t = inEvent.changedTouches[0];\n\n // check the intended scroll axis, and other axis\n var a = scrollAxis;\n var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n var da = Math.abs(t['client' + a] - this.firstXY[a]);\n var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n\n // if delta in the scroll axis > delta other axis, scroll instead of\n // making events\n ret = da >= doa;\n }\n this.firstXY = null;\n return ret;\n }\n },\n findTouch: function findTouch(inTL, inId) {\n for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n if (t.identifier === inId) {\n return true;\n }\n }\n },\n // In some instances, a touchstart can happen without a touchend. This\n // leaves the pointermap in a broken state.\n // Therefore, on every touchstart, we remove the touches that did not fire a\n // touchend event.\n // To keep state globally consistent, we fire a\n // pointercancel for this \"abandoned\" touch\n vacuumTouches: function vacuumTouches(inEvent) {\n var tl = inEvent.touches;\n\n // pointermap.size should be < tl.length here, as the touchstart has not\n // been processed yet.\n if (pointermap$1.size >= tl.length) {\n var d = [];\n pointermap$1.forEach(function (value, key) {\n // Never remove pointerId == 1, which is mouse.\n // Touch identifiers are 2 smaller than their pointerId, which is the\n // index in pointermap.\n if (key !== 1 && !this.findTouch(tl, key - 2)) {\n var p = value.out;\n d.push(p);\n }\n }, this);\n d.forEach(this.cancelOut, this);\n }\n },\n touchstart: function touchstart(inEvent) {\n this.vacuumTouches(inEvent);\n this.setPrimaryTouch(inEvent.changedTouches[0]);\n this.dedupSynthMouse(inEvent);\n if (!this.scrolling) {\n this.clickCount++;\n this.processTouches(inEvent, this.overDown);\n }\n },\n overDown: function overDown(inPointer) {\n pointermap$1.set(inPointer.pointerId, {\n target: inPointer.target,\n out: inPointer,\n outTarget: inPointer.target\n });\n dispatcher.enterOver(inPointer);\n dispatcher.down(inPointer);\n },\n touchmove: function touchmove(inEvent) {\n if (!this.scrolling) {\n if (this.shouldScroll(inEvent)) {\n this.scrolling = true;\n this.touchcancel(inEvent);\n } else {\n inEvent.preventDefault();\n this.processTouches(inEvent, this.moveOverOut);\n }\n }\n },\n moveOverOut: function moveOverOut(inPointer) {\n var event = inPointer;\n var pointer = pointermap$1.get(event.pointerId);\n\n // a finger drifted off the screen, ignore it\n if (!pointer) {\n return;\n }\n var outEvent = pointer.out;\n var outTarget = pointer.outTarget;\n dispatcher.move(event);\n if (outEvent && outTarget !== event.target) {\n outEvent.relatedTarget = event.target;\n event.relatedTarget = outTarget;\n\n // recover from retargeting by shadow\n outEvent.target = outTarget;\n if (event.target) {\n dispatcher.leaveOut(outEvent);\n dispatcher.enterOver(event);\n } else {\n // clean up case when finger leaves the screen\n event.target = outTarget;\n event.relatedTarget = null;\n this.cancelOut(event);\n }\n }\n pointer.out = event;\n pointer.outTarget = event.target;\n },\n touchend: function touchend(inEvent) {\n this.dedupSynthMouse(inEvent);\n this.processTouches(inEvent, this.upOut);\n },\n upOut: function upOut(inPointer) {\n if (!this.scrolling) {\n dispatcher.up(inPointer);\n dispatcher.leaveOut(inPointer);\n }\n this.cleanUpPointer(inPointer);\n },\n touchcancel: function touchcancel(inEvent) {\n this.processTouches(inEvent, this.cancelOut);\n },\n cancelOut: function cancelOut(inPointer) {\n dispatcher.cancel(inPointer);\n dispatcher.leaveOut(inPointer);\n this.cleanUpPointer(inPointer);\n },\n cleanUpPointer: function cleanUpPointer(inPointer) {\n pointermap$1[\"delete\"](inPointer.pointerId);\n this.removePrimaryPointer(inPointer);\n },\n // prevent synth mouse events from creating pointer events\n dedupSynthMouse: function dedupSynthMouse(inEvent) {\n var lts = mouseEvents.lastTouches;\n var t = inEvent.changedTouches[0];\n\n // only the primary finger will synth mouse events\n if (this.isPrimaryTouch(t)) {\n // remember x/y of last touch\n var lt = {\n x: t.clientX,\n y: t.clientY\n };\n lts.push(lt);\n var fn = function (lts, lt) {\n var i = lts.indexOf(lt);\n if (i > -1) {\n lts.splice(i, 1);\n }\n }.bind(null, lts, lt);\n setTimeout(fn, DEDUP_TIMEOUT);\n }\n }\n };\n INSTALLER = new Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n var pointermap$2 = dispatcher.pointermap;\n var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n var msEvents = {\n events: ['MSPointerDown', 'MSPointerMove', 'MSPointerUp', 'MSPointerOut', 'MSPointerOver', 'MSPointerCancel', 'MSGotPointerCapture', 'MSLostPointerCapture'],\n register: function register(target) {\n dispatcher.listen(target, this.events);\n },\n unregister: function unregister(target) {\n dispatcher.unlisten(target, this.events);\n },\n POINTER_TYPES: ['', 'unavailable', 'touch', 'pen', 'mouse'],\n prepareEvent: function prepareEvent(inEvent) {\n var e = inEvent;\n if (HAS_BITMAP_TYPE) {\n e = dispatcher.cloneEvent(inEvent);\n e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n }\n return e;\n },\n cleanup: function cleanup(id) {\n pointermap$2[\"delete\"](id);\n },\n MSPointerDown: function MSPointerDown(inEvent) {\n pointermap$2.set(inEvent.pointerId, inEvent);\n var e = this.prepareEvent(inEvent);\n dispatcher.down(e);\n },\n MSPointerMove: function MSPointerMove(inEvent) {\n var e = this.prepareEvent(inEvent);\n dispatcher.move(e);\n },\n MSPointerUp: function MSPointerUp(inEvent) {\n var e = this.prepareEvent(inEvent);\n dispatcher.up(e);\n this.cleanup(inEvent.pointerId);\n },\n MSPointerOut: function MSPointerOut(inEvent) {\n var e = this.prepareEvent(inEvent);\n dispatcher.leaveOut(e);\n },\n MSPointerOver: function MSPointerOver(inEvent) {\n var e = this.prepareEvent(inEvent);\n dispatcher.enterOver(e);\n },\n MSPointerCancel: function MSPointerCancel(inEvent) {\n var e = this.prepareEvent(inEvent);\n dispatcher.cancel(e);\n this.cleanup(inEvent.pointerId);\n },\n MSLostPointerCapture: function MSLostPointerCapture(inEvent) {\n var e = dispatcher.makeEvent('lostpointercapture', inEvent);\n dispatcher.dispatchEvent(e);\n },\n MSGotPointerCapture: function MSGotPointerCapture(inEvent) {\n var e = dispatcher.makeEvent('gotpointercapture', inEvent);\n dispatcher.dispatchEvent(e);\n }\n };\n function applyPolyfill() {\n // only activate if this platform does not have pointer events\n if (!window.PointerEvent) {\n window.PointerEvent = PointerEvent;\n if (window.navigator.msPointerEnabled) {\n var tp = window.navigator.msMaxTouchPoints;\n Object.defineProperty(window.navigator, 'maxTouchPoints', {\n value: tp,\n enumerable: true\n });\n dispatcher.registerSource('ms', msEvents);\n } else {\n Object.defineProperty(window.navigator, 'maxTouchPoints', {\n value: 0,\n enumerable: true\n });\n dispatcher.registerSource('mouse', mouseEvents);\n if (window.ontouchstart !== undefined) {\n dispatcher.registerSource('touch', touchEvents);\n }\n }\n dispatcher.register(document);\n }\n }\n var n = window.navigator;\n var s;\n var r;\n var h;\n function assertActive(id) {\n if (!dispatcher.pointermap.has(id)) {\n var error = new Error('InvalidPointerId');\n error.name = 'InvalidPointerId';\n throw error;\n }\n }\n function assertConnected(elem) {\n var parent = elem.parentNode;\n while (parent && parent !== elem.ownerDocument) {\n parent = parent.parentNode;\n }\n if (!parent) {\n var error = new Error('InvalidStateError');\n error.name = 'InvalidStateError';\n throw error;\n }\n }\n function inActiveButtonState(id) {\n var p = dispatcher.pointermap.get(id);\n return p.buttons !== 0;\n }\n if (n.msPointerEnabled) {\n s = function s(pointerId) {\n assertActive(pointerId);\n assertConnected(this);\n if (inActiveButtonState(pointerId)) {\n dispatcher.setCapture(pointerId, this, true);\n this.msSetPointerCapture(pointerId);\n }\n };\n r = function r(pointerId) {\n assertActive(pointerId);\n dispatcher.releaseCapture(pointerId, true);\n this.msReleasePointerCapture(pointerId);\n };\n } else {\n s = function setPointerCapture(pointerId) {\n assertActive(pointerId);\n assertConnected(this);\n if (inActiveButtonState(pointerId)) {\n dispatcher.setCapture(pointerId, this);\n }\n };\n r = function releasePointerCapture(pointerId) {\n assertActive(pointerId);\n dispatcher.releaseCapture(pointerId);\n };\n }\n h = function hasPointerCapture(pointerId) {\n return !!dispatcher.captureInfo[pointerId];\n };\n function applyPolyfill$1() {\n if (window.Element && !Element.prototype.setPointerCapture) {\n Object.defineProperties(Element.prototype, {\n 'setPointerCapture': {\n value: s\n },\n 'releasePointerCapture': {\n value: r\n },\n 'hasPointerCapture': {\n value: h\n }\n });\n }\n }\n applyAttributeStyles();\n applyPolyfill();\n applyPolyfill$1();\n var pointerevents = {\n dispatcher: dispatcher,\n Installer: Installer,\n PointerEvent: PointerEvent,\n PointerMap: PointerMap,\n targetFinding: targeting\n };\n return pointerevents;\n });\n})(pep);\n\n// external smart player events (value casing matters to maintain backward capability)\nvar _videoStartInitiated = 'VIDEO_START_INITIATED';\nvar _videoStart = 'VIDEO_START';\nvar _mediaReady = 'MEDIA_READY';\nvar _captionChange = 'CAPTION_CHANGE';\nvar _ready = 'READY';\nvar _videoPlayEvent = 'VIDEO_PLAY';\nvar _playerFullScreenModeChanged = 'PLAYER_FULL_SCREEN_MODE_CHANGED';\nvar _playerRumData = 'PLAYER_RUM_DATA';\nvar _videoEnd = 'tscspVideoEnd';\nvar _videoReplay = 'tscspVideoReplay';\nvar _externalMediaError = 'tscspMediaError';\nvar _playerSettingsOpenEvent = 'tscspPlayerSettingsOpen';\nvar _playerSettingsCloseEvent = 'tscspPlayerSettingsClose';\nvar _playerControlsHiddenEvent = 'tscspPlayerControlsHiddenEvent';\nvar _playerControlsVisibleEvent = 'tscspPlayerControlsVisibleEvent';\nvar _externalPlayerResize = 'tscspPlayerResize';\nvar _heroControlHidden = 'tscspHeroControlHidden';\nvar _imagePointerOver = 'tscspImagePointerOver';\nvar _imagePointerLeave = 'tscspImagePointerLeave';\nvar _displayModeChanged = 'tscspDisplayModeChanged';\nvar _captionsHidden = 'tscspCaptionsHidden';\nvar _captionsVisible = 'tscspCaptionsVisible';\nvar _captionsReady = 'tscspCaptionsReady';\n// this is the overload to set up a listener for the playerConfiguration.useCustomEventTracking related to analytics. this event will fire the handler for several\n// when they would normally trigger internally (i.e. 'Video_Started', 'Video_Replay', 'Video_Loading_Time', 'Video_Finished', others?)\n// the event will trigger with the related event name and data formatted for older version google-analytics events\nvar _googleAnalyticsCustomEvent = 'gacustomevents'; // deprecated\nvar _analyticsEvent = 'analyticsEvent';\nvar _googleAnalytics4Event = 'ga4event';\n\n// external smart player html5 events\n// these events are bubbled up from the html5 video element and _most_ are simulated by the youtube player in our code\nvar _videoLoadStart = 'loadstart';\nvar _videoLoadedMetadata = 'loadedmetadata';\nvar _videoLoadedData = 'loadeddata';\nvar _externalVideoCanPlay = 'canplay';\nvar _videoCanPlayThrough = 'canplaythrough';\nvar _videoPlaying = 'playing';\nvar _videoWaiting = 'waiting';\nvar _videoSeeking = 'seeking';\nvar _videoSeeked = 'seeked';\nvar _videoEnded = 'ended';\nvar _videoPlay = 'play';\nvar _videoPause = 'pause';\nvar _videoResize = 'resize';\nvar _videoError = 'error';\nvar _videoVolumeChange = 'volumechange';\nvar _videoDurationChange = 'durationchange';\nvar _videoRateChange = 'ratechange';\nvar _videoTimeUpdate = 'timeupdate';\nvar _videoProgress = 'progress';\nvar _initializeCurrent = 'initializecurrent';\nvar _sourceChanged = 'sourcechanged';\nvar _tryToAutoPlay = 'tscspTryToAutoPlay';\nvar _firstPlay = 'tscspFirstPlayer';\nvar _videoSuspend = 'suspend';\nvar _videoAbort = 'abort';\nvar _videoEmptied = 'emptied';\nvar _videoStalled = 'stalled';\n\n// Player Events\nvar _mediaControlsReady = 'tscspMediaControlsReady';\nvar _mediaExtensionsReady = 'tscspMediaExtensionsReady';\n\n// Control Events\nvar _clickPrevControl = 'tscspClickPrevControl';\nvar _clickNextControl = 'tscspClickNextControl';\nvar _toggleFullScreen = 'tscspToggleFullScreen';\nvar _fullScreenChange = 'tscspFullScreenChange';\nvar _expandVideo = 'tscspExpandVideo';\nvar _showToc = 'tscspShowToc';\nvar _hideToc = 'tscspHideToc';\nvar _tocScroll = 'tscspTocScroll';\nvar _disableControls$1 = 'tscspDisableControls';\nvar _enableControls = 'tscspEnableControls';\nvar _controlsUpdated = 'tscspControlsUpdated';\nvar _pipChanged = 'tscspPipChange';\nvar _theaterModeChanged = 'tscspTheaterModeChange';\nvar _playerResize = 'tscspPlayerResize';\nvar _mediaResize = 'tscspMediaResize';\nvar _controlsPlayerInitialized = 'tscspPlayerInitialized';\nvar _showVideoBufferingView = 'tscspShowVideoBufferingView';\nvar _hideVideoBufferingView = 'tscspHideVideoBufferingView';\nvar _switchToFullscreen = 'tscspSwitchToFullscreen';\nvar _exitFullscreen = 'tscspExitFullscreen';\nvar _videoControlsHidden = 'tscspVideoControlsHidden';\nvar _hideVideoControls = 'tscspHideVideoControls';\nvar _videoControlsVisible = 'tscspVideoControlsHVisible';\nvar _showVideoControls = 'tscspShowVideoControls';\nvar _displayCaptionControl = 'tscspDisplayCaptionControl';\nvar _displayTocControl = 'tscspDisplayTocControl';\nvar _tocDisplayToggled = 'tscspTocDisplayToggled';\nvar _focusTocButton = 'tscspFocusTocButton';\nvar _heroPlayControlClicked = 'tscspHeroPlayControlClicked';\nvar _heroPlayControlVisible = 'tscspHeroPlayControlVisible';\nvar _heroPlayControlHidden = 'tscspHeroPlayControlHidden';\nvar _replayControlVisible = 'tscspReplayControlVisible';\nvar _replayControlHidden = 'tscspReplayControlHidden';\nvar _startedPlayback = 'tscspStartedPlayback';\nvar _hideIOOverlay = 'tscspHideIOOverlay';\nvar _searchFocusChange = 'tscspSearchFocusChange';\nvar _hideLoadingMessage = 'tscspHideLoadingMessage';\nvar _playerSettingsOpen = 'tscspPlayerSettingsOpen';\nvar _playerSettingsClose = 'tscspPlayerSettingsClose';\n\n// Media Element Events\nvar _seekMediaToTime = 'tscspSeekMediaToTime';\nvar _replayMedia = 'tscspReplayMedia';\nvar _endMedia = 'tscspEndMedia';\nvar _setVolume = 'tscspSetVolume';\nvar _setMutedState = 'tscspSetMutedState';\nvar _setPlaybackRate = 'tscspSetPlaybackRate';\nvar _mediaError = 'tscspMediaError';\n\n// IFrame Events\nvar _enterFullFrame = 'ENTER-FULLFRAME';\nvar _exitFullFrame = 'EXIT-FULLFRAME';\n\n// Update Events\nvar _updateQuizMarkers = 'tscspUpdateQuizMarkers';\nvar _updatePlayProgress = 'tscspUpdatePlayProgress';\nvar _updateLoadProgress = 'tscspUpdateLoadProgress';\nvar _updateNextQuestionPos = 'tscspUpdateNextQuestionXPos';\n\n// Scrubbing Events\nvar _startedScrubbing = 'tscspStartedScrubbing';\nvar _endedScrubbing = 'tscspEndedScrubbing';\n\n// Quiz Events\nvar _quizSetupComplete = 'tscspQuizSetupComplete';\nvar _quizPaused = 'tscspMediaPaused';\nvar _quizComplete = 'tscspQuizComplete';\nvar _quizReview = 'tscspQuizReview';\nvar _quizBegin = 'tscspQuizBegin';\nvar _quizBeginClicked = 'tscspQuizBeginClicked';\nvar _quizSkip = 'tscspQuizSkip';\nvar _quizSkipClicked = 'tscspSkipQuizClicked';\nvar _quizError = 'tscspQuizError';\nvar _quizStatus = 'tscspQuizStatus';\nvar _quizSubmittingInstance = 'tscspSubmittingInstance';\nvar _quizCreatedInstance = 'tscspCreatedInstance';\nvar _quizSubmitted = 'tscspQuizSubmitted';\nvar _quizShowSubmissionRetryMessage = 'tscspQuizShowSubmissionRetryMessage';\nvar _quizHideSubmissionRetryMessage = 'tscspQuizHideSubmissionRetryMessage';\nvar _quizHideLoadingMessage = 'tscspQuizHideLoadingMessage';\nvar _transitionImageQuizToAnswers = 'tscspTransitionImageQuizToAnswers';\nvar _hideQuiz = 'tscspHideQuiz';\nvar _showQuizBar = 'tscspShowQuizBar';\nvar _showStartQuizPrompt = 'tscspShowStartQuizPrompt';\nvar _showQuizSetup = 'tscspShowQuizSetup';\nvar _hideStartQuizPrompt = 'tscspHideStartQuizPrompt';\nvar _showQuestionSetView = 'tscspShowQuestionSetView';\nvar _closeQuestionSetView = 'tscspCloseQuestionSetView';\nvar _submitQuestionSet = 'tscspSubmitQuestionSet';\nvar _rationaleActionLocation = 'tscspRationaleActionLocation';\nvar _rationaleActionJumpToTime = 'tscspRationaleActionJumpToTime';\nvar _quizIsOutOfDate = 'tscspQuizIsOutOfDate';\nvar _quizBadDefinition = 'tscspQuizBadDefinition';\nvar _quizVisible = 'tscspQuizVisible';\nvar _quizHidden = 'tscspQuizHidden';\nvar _minimizeQuizUI = 'tscspMinimizeQuizUI';\nvar _maximizeQuizUI = 'tscspMaximizeQuizUI';\nvar _quizUIVisible = 'tscspQuizUIVisible';\nvar _quizUIHidden = 'tscspQuizUIHidden';\n\n// Captions\nvar _captionsToggled = 'tscpCaptionsToggled';\nvar _stateLoaded = 'tscpCaptionsStateLoaded';\nvar _captionsChanged = 'tscspCaptionChanged';\nvar _captionsLanguageChanged = 'tscspLanguageChanged';\nvar _captionsDragStart = 'tscspCaptionsDragStart';\nvar _captionsDragEnd = 'tscspCaptionsDragEnd';\nvar _captionsResized = 'tscspCaptionsResized';\n\n// Caption Service\nvar _newCaptionTrack = 'tscspNewCaptionTrack';\n\n// Audio Description\nvar _audioDescriptionChanged = 'tscspAudioDescriptionChanged';\nvar _audioDescriptionFailed = 'tscspAudioDescriptionFailed';\n\n// Hotspots\nvar _hotspotPaused = 'tscspHotspotPaused';\nvar _hotspotResume = 'tscspHotspotResume';\nvar _hotspotClicked = 'tscspHotspotClicked';\nvar _hotspotAreaActive = 'tscspHotspotAreaActive';\nvar _hotspotAreaInactive = 'tscspHotspotAreaInactive';\n\n// Modals\nvar _modalOpen = 'tscspModalOpen';\nvar _modalClosed = 'tscspModalClosed';\n\n//Timing\nvar _smartPlayerInitialized = 'smart_player_initialized';\nvar _smartPlayerLoaded = 'smart_player_loaded';\nvar _videoMetadataLoaded = 'video_metadata_loaded';\nvar _videoLoadedDataTiming = 'video_loaded_data';\nvar _videoCanPlay = 'video_can_play';\nvar _videoHasEnoughData = 'video_has_enough_data';\n\n// Analytics\nvar _analyticsVideoStarted = 'Video_Started';\nvar _analyticsContentLoaded = 'Content_Loaded';\nvar _analyticsVideoPercentViewed = 'Video_Percent_Viewed';\nvar _analyticsVideoFinishedAction = 'Video_Finished_Action';\nvar _analyticsVideoFinished = 'Video_Finished';\nvar _analyticsVideoReplay = 'Video_Replay';\nvar _analyticsVideoLoadingTimeInSeconds = 'Video_Loading_Time_In_Seconds';\nvar _analyticsVideoLoadingTime = 'Video_Loading_Time';\nvar _analyticsOpenExternalLinkView = 'Open_External_Link_View';\nvar _analyticsOpenExternalLinkClick = 'Open_External_Link_Click';\nvar _analyticsHotspotAction = 'Hotspot_Action';\nvar _analyticsVideoCouldNotPlaySmoothlyIn20Secs = 'Could_Not_Play_Smoothly_In_20_Secs';\nvar _analyticsVideoPlaybackWasStoppedToBuffer = 'Video_Stopped_To_Buffer';\n\n// GA4 Analytics\nvar _ga4VideoStarted = 'video_started';\nvar _ga4PlayerInitialized = 'player_initialized';\nvar _ga4VideoLoadingTimeInSeconds = 'video_loading_time_secs';\nvar _ga4VideoLoadingTime = 'video_loading_time';\nvar _ga4VideoPercentViewed = 'video_percent_viewed';\nvar _ga4VideoFinishedAction = 'video_finished_action';\nvar _ga4VideoFinished = 'video_finished';\nvar _ga4VideoReplay = 'video_replayed';\nvar _ga4OpenExternalLinkView = 'open_external_link_view';\nvar _ga4OpenExternalLinkClick = 'open_external_link_click';\nvar _ga4HotspotAction = 'hotspot_open_url_action';\nvar _ga4VideoCouldNotPlaySmoothlyIn20Secs = 'bad_playback_twenty_secs';\nvar _ga4VideoPlaybackWasStoppedToBuffer = 'video_stopped_to_buffer';\n\n// Plugins\nvar _pluginAdded = 'pluginAdded';\nvar _mediaAreaPluginMouseDown = 'mediaAreaPluginMouseDown';\nvar _mediaAreaPluginMouseUp = 'mediaAreaPluginMouseUp';\nvar _mediaAreaPluginKeyDown = 'mediaAreaPluginKeyDown';\nvar _mediaAreaPluginKeyUp = 'mediaAreaPluginKeyUp';\n\n// Network\nvar _retryingRequest = 'retryingRequest';\n\n// Fathom\nvar _fathomGetComplete = 'GET_COMPLETE';\nvar _fathomError = 'ERROR';\n\n// External link view\nvar _openUrlViewOpened = 'tscspExternalUrlViewOpen';\nvar _openUrlViewClosed = 'tscspExternalUrlViewClosed';\nvar _openUrlViewClicked = 'tscspExternalUrlViewClick';\n\n// SCORM\nvar _exitScormSession = 'tscspExitScormSession';\nvar _exitScormSessionConfirmed = 'tscspExitScormSessionConfirmed';\nvar _exitScormSessionWithOutProgressConfirmed = 'tscspExitScormSessionWithOutProgressConfirmed';\nvar _resumeScormSession = 'tscspScormSession';\nvar _failedToFindApi = 'tscspScormFailedToFindApi';\n\n// Images\nvar _imagesPointerOver = 'tscspImagesPointerOver';\nvar _imagesPointerLeave = 'tscspImagesPointerLeave';\nvar events = Object.freeze({\n External: {\n VideoStartInitiated: _videoStartInitiated,\n VideoStart: _videoStart,\n VideoEnd: _videoEnd,\n VideoReplay: _videoReplay,\n MediaError: _externalMediaError,\n MediaReady: _mediaReady,\n CaptionChange: _captionChange,\n Ready: _ready,\n VideoPlay: _videoPlayEvent,\n PlayerFullScreenModeChanged: _playerFullScreenModeChanged,\n PlayerRumData: _playerRumData,\n GoogleAnalyticsCustomEvent: _googleAnalyticsCustomEvent,\n AnalyticsEvent: _analyticsEvent,\n GoogleAnalytics4Event: _googleAnalytics4Event,\n QuizVisible: _quizVisible,\n QuizHidden: _quizHidden,\n ShowStartQuizPrompt: _showStartQuizPrompt,\n HideStartQuizPrompt: _hideStartQuizPrompt,\n SwitchToFullscreen: _switchToFullscreen,\n ExitFullscreen: _exitFullscreen,\n PlayerSettingsOpen: _playerSettingsOpenEvent,\n PlayerSettingsClose: _playerSettingsCloseEvent,\n PlayerControlsHidden: _playerControlsHiddenEvent,\n PlayerControlsVisible: _playerControlsVisibleEvent,\n PlayerResize: _externalPlayerResize,\n HeroControlHidden: _heroControlHidden,\n ImagePointerOver: _imagePointerOver,\n ImagePointerLeave: _imagePointerLeave,\n DisplayModeChanged: _displayModeChanged,\n CaptionsHidden: _captionsHidden,\n CaptionsVisible: _captionsVisible,\n CaptionsReady: _captionsReady\n },\n ExternalVideo: {\n VideoLoadStart: _videoLoadStart,\n VideoLoadedMetadata: _videoLoadedMetadata,\n VideoLoadedData: _videoLoadedData,\n VideoCanPlay: _externalVideoCanPlay,\n VideoCanPlayThrough: _videoCanPlayThrough,\n VideoPlaying: _videoPlaying,\n VideoWaiting: _videoWaiting,\n VideoSeeking: _videoSeeking,\n VideoSeeked: _videoSeeked,\n VideoEnded: _videoEnded,\n VideoPlay: _videoPlay,\n VideoPause: _videoPause,\n VideoResize: _videoResize,\n VideoError: _videoError,\n VideoVolumeChange: _videoVolumeChange,\n VideoDurationChange: _videoDurationChange,\n VideoRateChange: _videoRateChange,\n VideoTimeUpdate: _videoTimeUpdate,\n VideoProgress: _videoProgress\n },\n Player: {\n MediaControlsReady: _mediaControlsReady,\n MediaExtensionsReady: _mediaExtensionsReady\n },\n Controls: {\n ClickPrev: _clickPrevControl,\n ClickNext: _clickNextControl,\n FullScreenChange: _fullScreenChange,\n ToggleFullScreen: _toggleFullScreen,\n ExpandVideo: _expandVideo,\n ShowToc: _showToc,\n HideToc: _hideToc,\n TocScroll: _tocScroll,\n Disable: _disableControls$1,\n Enable: _enableControls,\n Updated: _controlsUpdated,\n HotspotClicked: _hotspotClicked,\n PipChanged: _pipChanged,\n TheaterModeChanged: _theaterModeChanged,\n PlayerResize: _playerResize,\n MediaResize: _mediaResize,\n PlayerInitialized: _controlsPlayerInitialized,\n ShowVideoBufferingView: _showVideoBufferingView,\n HideVideoBufferingView: _hideVideoBufferingView,\n VideoControlsHidden: _videoControlsHidden,\n HideVideoControls: _hideVideoControls,\n VideoControlsVisible: _videoControlsVisible,\n ShowVideoControls: _showVideoControls,\n DisplayCaptionControl: _displayCaptionControl,\n DisplayTocControl: _displayTocControl,\n TocDisplayToggled: _tocDisplayToggled,\n FocusTocButton: _focusTocButton,\n HeroPlayControlClicked: _heroPlayControlClicked,\n HeroPlayControlVisible: _heroPlayControlVisible,\n HeroPlayControlHidden: _heroPlayControlHidden,\n ReplayControlVisible: _replayControlVisible,\n ReplayControlHidden: _replayControlHidden,\n StartedPlayback: _startedPlayback,\n HideIOOverlay: _hideIOOverlay,\n SearchFocusChange: _searchFocusChange,\n HideLoadingMessage: _hideLoadingMessage,\n PlayerSettingsOpen: _playerSettingsOpen,\n PlayerSettingsClose: _playerSettingsClose\n },\n Hotspots: {\n Paused: _hotspotPaused,\n Resume: _hotspotResume,\n AreaActive: _hotspotAreaActive,\n AreaInactive: _hotspotAreaInactive\n },\n Media: {\n Play: _videoPlay,\n Playing: _videoPlaying,\n Pause: _videoPause,\n SeekToTime: _seekMediaToTime,\n Replay: _replayMedia,\n End: _endMedia,\n Abort: _videoAbort,\n Suspend: _videoSuspend,\n Emptied: _videoEmptied,\n Stalled: _videoStalled,\n Progress: _videoProgress,\n InitializeCurrent: _initializeCurrent,\n SourceChanged: _sourceChanged,\n TryToAutoPlay: _tryToAutoPlay,\n SetVolume: _setVolume,\n SetMutedState: _setMutedState,\n SetPlaybackRate: _setPlaybackRate,\n FirstPlay: _firstPlay,\n Error: _mediaError\n },\n IFrame: {\n EnterFullFrame: _enterFullFrame,\n ExitFullFrame: _exitFullFrame\n },\n Update: {\n QuizMarkers: _updateQuizMarkers,\n PlayProgress: _updatePlayProgress,\n LoadProgress: _updateLoadProgress,\n NextQuestionPosition: _updateNextQuestionPos\n },\n Scrubbing: {\n Started: _startedScrubbing,\n Ended: _endedScrubbing\n },\n Quizzing: {\n QuizSetupComplete: _quizSetupComplete,\n Paused: _quizPaused,\n Complete: _quizComplete,\n Review: _quizReview,\n Begin: _quizBegin,\n BeginClicked: _quizBeginClicked,\n Skip: _quizSkip,\n SkipClicked: _quizSkipClicked,\n Error: _quizError,\n Status: _quizStatus,\n SubmittingInstance: _quizSubmittingInstance,\n CreatedInstance: _quizCreatedInstance,\n Submitted: _quizSubmitted,\n ShowSubmissionRetryMessage: _quizShowSubmissionRetryMessage,\n HideSubmissionRetryMessage: _quizHideSubmissionRetryMessage,\n HideLoadingMessage: _quizHideLoadingMessage,\n TransitionImageQuizToAnswers: _transitionImageQuizToAnswers,\n HideQuiz: _hideQuiz,\n ShowQuizBar: _showQuizBar,\n ShowStartQuizPrompt: _showStartQuizPrompt,\n ShowQuizSetup: _showQuizSetup,\n ShowQuestionSetView: _showQuestionSetView,\n CloseQuestionSetView: _closeQuestionSetView,\n SubmitQuestionSet: _submitQuestionSet,\n RationaleActionLocation: _rationaleActionLocation,\n RationaleActionJumpToTime: _rationaleActionJumpToTime,\n QuizIsOutOfDate: _quizIsOutOfDate,\n QuizBadDefinition: _quizBadDefinition,\n MinimizeUI: _minimizeQuizUI,\n MaximizeUI: _maximizeQuizUI,\n UIVisible: _quizUIVisible,\n UIHidden: _quizUIHidden\n },\n Captions: {\n Toggled: _captionsToggled,\n StateLoaded: _stateLoaded,\n Changed: _captionsChanged,\n LanguageChanged: _captionsLanguageChanged,\n DragStart: _captionsDragStart,\n DragEnd: _captionsDragEnd,\n Resized: _captionsResized\n },\n CaptionService: {\n NewCaptionTrack: _newCaptionTrack\n },\n AudioDescription: {\n Changed: _audioDescriptionChanged,\n Failed: _audioDescriptionFailed\n },\n Timing: {\n PlayerInitialized: _smartPlayerInitialized,\n PlayerLoaded: _smartPlayerLoaded,\n VideoMetadataLoaded: _videoMetadataLoaded,\n VideoLoadedData: _videoLoadedDataTiming,\n VideoCanPlay: _videoCanPlay,\n VideoHasEnoughData: _videoHasEnoughData\n },\n GA4: {\n PlayerInitialized: _ga4PlayerInitialized,\n VideoStarted: _ga4VideoStarted,\n VideoLoadingTimeInSeconds: _ga4VideoLoadingTimeInSeconds,\n VideoLoadingTime: _ga4VideoLoadingTime,\n VideoPercentViewed: _ga4VideoPercentViewed,\n VideoFinishedAction: _ga4VideoFinishedAction,\n VideoFinished: _ga4VideoFinished,\n VideoReplay: _ga4VideoReplay,\n OpenExternalLinkView: _ga4OpenExternalLinkView,\n OpenExternalLinkClick: _ga4OpenExternalLinkClick,\n HotspotAction: _ga4HotspotAction,\n CouldNotPlaySmoothlyIn20Secs: _ga4VideoCouldNotPlaySmoothlyIn20Secs,\n PlaybackWasStoppedToBuffer: _ga4VideoPlaybackWasStoppedToBuffer\n },\n Analytics: {\n VideoStarted: _analyticsVideoStarted,\n ContentLoaded: _analyticsContentLoaded,\n VideoPercentViewed: _analyticsVideoPercentViewed,\n VideoFinishedAction: _analyticsVideoFinishedAction,\n VideoFinished: _analyticsVideoFinished,\n VideoReplay: _analyticsVideoReplay,\n VideoLoadingTimeInSeconds: _analyticsVideoLoadingTimeInSeconds,\n VideoLoadingTime: _analyticsVideoLoadingTime,\n OpenExternalLinkView: _analyticsOpenExternalLinkView,\n OpenExternalLinkClick: _analyticsOpenExternalLinkClick,\n HotspotAction: _analyticsHotspotAction,\n CouldNotPlaySmoothlyIn20Secs: _analyticsVideoCouldNotPlaySmoothlyIn20Secs,\n PlaybackWasStoppedToBuffer: _analyticsVideoPlaybackWasStoppedToBuffer\n },\n Plugin: {\n Added: _pluginAdded,\n MediaAreaPluginMouseDown: _mediaAreaPluginMouseDown,\n MediaAreaPluginMouseUp: _mediaAreaPluginMouseUp,\n MediaAreaPluginKeyDown: _mediaAreaPluginKeyDown,\n MediaAreaPluginKeyUp: _mediaAreaPluginKeyUp\n },\n Network: {\n Retrying: _retryingRequest\n },\n Fathom: {\n GetComplete: _fathomGetComplete,\n Error: _fathomError\n },\n Modals: {\n Open: _modalOpen,\n Closed: _modalClosed\n },\n ExternalLinkView: {\n Open: _openUrlViewOpened,\n Closed: _openUrlViewClosed,\n Clicked: _openUrlViewClicked\n },\n SCORM: {\n ExitSession: _exitScormSession,\n ExitSessionConfirmed: _exitScormSessionConfirmed,\n ExitSessionWithOutProgressConfirmed: _exitScormSessionWithOutProgressConfirmed,\n ResumeSession: _resumeScormSession,\n FailedToFindApi: _failedToFindApi\n },\n Images: {\n PointerOver: _imagesPointerOver,\n PointerLeave: _imagesPointerLeave\n }\n});\n\nvar supportedPluginViewElements = Object.freeze({\n PROGRESS_BAR: 'progressBar',\n MEDIA: 'media',\n BEFORE_AFTER_PLAY_CONTROLS: 'beforeAfterPlayControls',\n PLAYER: 'player'\n});\n\nvar _english = 'en-US';\nvar _german = 'de-DE';\nvar _japanese = 'ja-JP';\nvar _french = 'fr-FR';\nvar _spanish = 'es-ES';\nvar _chinese = 'zh-CN';\nvar _portuguese = 'pt-BR';\nvar _supportedLanguages = [_english, _german, _japanese, _french, _spanish, _chinese, _portuguese];\nvar languageCodes = Object.freeze({\n ENGLISH: _english,\n GERMAN: _german,\n JAPANESE: _japanese,\n FRENCH: _french,\n SPANISH: _spanish,\n CHINESE: _chinese,\n PORTUGUESE: _portuguese,\n ENU: _english,\n DEU: _german,\n JPN: _japanese,\n FRA: _french,\n SP: _spanish,\n ZH: _chinese,\n PT: _portuguese,\n isValid: function isValid(language) {\n return _supportedLanguages.some(function (supportedLanguage) {\n return supportedLanguage === language;\n });\n }\n});\n\nvar mediaInterfaceConstants = Object.freeze({\n controls: {\n \"true\": 'true',\n \"false\": 'false',\n autohide: 'autohide',\n youtube: 'youtube'\n }\n});\n\nfunction _typeof$1(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof$1 = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof$1(o);\n}\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || value !== value && other !== other;\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache();\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n this.size = data.size;\n return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = (typeof global === \"undefined\" ? \"undefined\" : _typeof$1(global)) == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = (typeof self === \"undefined\" ? \"undefined\" : _typeof$1(self)) == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Built-in value references. */\nvar _Symbol = root.Symbol;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto$1 = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString$1 = objectProto$1.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString$1.call(value);\n}\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return symToStringTag$1 && symToStringTag$1 in Object(value) ? getRawTag(value) : objectToString(value);\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = _typeof$1(value);\n return value != null && (type == 'object' || type == 'function');\n}\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = function () {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? 'Symbol(src)_1.' + uid : '';\n}();\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && maskSrcKey in func;\n}\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return func + '';\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto$1 = Function.prototype,\n objectProto$2 = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString$1 = funcProto$1.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$1 = objectProto$2.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' + funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\\\$&').replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$');\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/* Built-in method references that are verified to be native. */\nvar Map$1 = getNative(root, 'Map');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto$3 = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$2 = objectProto$3.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty$2.call(data, key) ? data[key] : undefined;\n}\n\n/** Used for built-in method references. */\nvar objectProto$4 = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$3 = objectProto$4.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty$3.call(data, key);\n}\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED$1 = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = nativeCreate && value === undefined ? HASH_UNDEFINED$1 : value;\n return this;\n}\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash(),\n 'map': new (Map$1 || ListCache)(),\n 'string': new Hash()\n };\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = _typeof$1(value);\n return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean' ? value !== '__proto__' : value === null;\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map;\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map$1 || pairs.length < LARGE_ARRAY_SIZE - 1) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED$2 = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED$2);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n this.__data__ = new MapCache();\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined;\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n if (customizer) {\n var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function (othValue, othIndex) {\n if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n map.forEach(function (value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n set.forEach(function (value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG$1 = 1,\n COMPARE_UNORDERED_FLAG$1 = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = _Symbol ? _Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n case arrayBufferTag:\n if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n case errorTag:\n return object.name == other.name && object.message == other.message;\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == other + '';\n case mapTag:\n var convert = mapToArray;\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;\n convert || (convert = setToArray);\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG$1;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray$1 = Array.isArray;\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray$1(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\n/** Used for built-in method references. */\nvar objectProto$5 = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto$5.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function (object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function (symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && _typeof$1(value) == 'object';\n}\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/** Used for built-in method references. */\nvar objectProto$6 = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$4 = objectProto$6.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable$1 = objectProto$6.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function () {\n return arguments;\n}()) ? baseIsArguments : function (value) {\n return isObjectLike(value) && hasOwnProperty$4.call(value, 'callee') && !propertyIsEnumerable$1.call(value, 'callee');\n};\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\n/** Detect free variable `exports`. */\nvar freeExports = (typeof exports === \"undefined\" ? \"undefined\" : _typeof$1(exports)) == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && (typeof module === \"undefined\" ? \"undefined\" : _typeof$1(module)) == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = _typeof$1(value);\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length && (type == 'number' || type != 'symbol' && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER$1 = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;\n}\n\n/** `Object#toString` result references. */\nvar argsTag$1 = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag$1 = '[object Boolean]',\n dateTag$1 = '[object Date]',\n errorTag$1 = '[object Error]',\n funcTag$1 = '[object Function]',\n mapTag$1 = '[object Map]',\n numberTag$1 = '[object Number]',\n objectTag = '[object Object]',\n regexpTag$1 = '[object RegExp]',\n setTag$1 = '[object Set]',\n stringTag$1 = '[object String]',\n weakMapTag = '[object WeakMap]';\nvar arrayBufferTag$1 = '[object ArrayBuffer]',\n dataViewTag$1 = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag$1] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag$1] = typedArrayTags[boolTag$1] = typedArrayTags[dataViewTag$1] = typedArrayTags[dateTag$1] = typedArrayTags[errorTag$1] = typedArrayTags[funcTag$1] = typedArrayTags[mapTag$1] = typedArrayTags[numberTag$1] = typedArrayTags[objectTag] = typedArrayTags[regexpTag$1] = typedArrayTags[setTag$1] = typedArrayTags[stringTag$1] = typedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function (value) {\n return func(value);\n };\n}\n\n/** Detect free variable `exports`. */\nvar freeExports$1 = (typeof exports === \"undefined\" ? \"undefined\" : _typeof$1(exports)) == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule$1 = freeExports$1 && (typeof module === \"undefined\" ? \"undefined\" : _typeof$1(module)) == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports$1 && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = function () {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}();\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/** Used for built-in method references. */\nvar objectProto$7 = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$5 = objectProto$7.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray$1(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n for (var key in value) {\n if ((inherited || hasOwnProperty$5.call(value, key)) && !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n isBuff && (key == 'offset' || key == 'parent') ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset') ||\n // Skip index properties.\n isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto$8 = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = typeof Ctor == 'function' && Ctor.prototype || objectProto$8;\n return value === proto;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function (arg) {\n return func(transform(arg));\n };\n}\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\n/** Used for built-in method references. */\nvar objectProto$9 = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$6 = objectProto$9.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty$6.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys$1(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys$1, getSymbols);\n}\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG$2 = 1;\n\n/** Used for built-in method references. */\nvar objectProto$a = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$7 = objectProto$a.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty$7.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n if (customizer) {\n var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\n/* Built-in method references that are verified to be native. */\nvar Promise$2 = getNative(root, 'Promise');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\n/** `Object#toString` result references. */\nvar mapTag$2 = '[object Map]',\n objectTag$1 = '[object Object]',\n promiseTag = '[object Promise]',\n setTag$2 = '[object Set]',\n weakMapTag$1 = '[object WeakMap]';\nvar dataViewTag$2 = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map$1),\n promiseCtorString = toSource(Promise$2),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$2 || Map$1 && getTag(new Map$1()) != mapTag$2 || Promise$2 && getTag(Promise$2.resolve()) != promiseTag || Set && getTag(new Set()) != setTag$2 || WeakMap && getTag(new WeakMap()) != weakMapTag$1) {\n getTag = function getTag(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag$1 ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString:\n return dataViewTag$2;\n case mapCtorString:\n return mapTag$2;\n case promiseCtorString:\n return promiseTag;\n case setCtorString:\n return setTag$2;\n case weakMapCtorString:\n return weakMapTag$1;\n }\n }\n return result;\n };\n}\nvar getTag$1 = getTag;\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG$3 = 1;\n\n/** `Object#toString` result references. */\nvar argsTag$2 = '[object Arguments]',\n arrayTag$1 = '[object Array]',\n objectTag$2 = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto$b = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$8 = objectProto$b.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray$1(object),\n othIsArr = isArray$1(other),\n objTag = objIsArr ? arrayTag$1 : getTag$1(object),\n othTag = othIsArr ? arrayTag$1 : getTag$1(other);\n objTag = objTag == argsTag$2 ? objectTag$2 : objTag;\n othTag = othTag == argsTag$2 ? objectTag$2 : othTag;\n var objIsObj = objTag == objectTag$2,\n othIsObj = othTag == objectTag$2,\n isSameTag = objTag == othTag;\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack());\n return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {\n var objIsWrapped = objIsObj && hasOwnProperty$8.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty$8.call(other, '__wrapped__');\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n stack || (stack = new Stack());\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack());\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG$4 = 1,\n COMPARE_UNORDERED_FLAG$2 = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack();\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack) : result)) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys$1(object),\n length = result.length;\n while (length--) {\n var key = result[length],\n value = object[key];\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\n/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function (object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue && (srcValue !== undefined || key in Object(object));\n };\n}\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function (object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\n/** `Object#toString` result references. */\nvar symbolTag$1 = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return _typeof$1(value) == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag$1;\n}\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray$1(value)) {\n return false;\n }\n var type = _typeof$1(value);\n if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object);\n}\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || resolver != null && typeof resolver != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function memoized() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache)();\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function (key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n var cache = result.cache;\n return result;\n}\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function (string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function (match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : number || match);\n });\n return result;\n});\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto$1 = _Symbol ? _Symbol.prototype : undefined,\n symbolToString = symbolProto$1 ? symbolProto$1.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray$1(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result;\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray$1(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\n/** Used as references for various `Number` constants. */\nvar INFINITY$1 = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = value + '';\n return result == '0' && 1 / value == -INFINITY$1 ? '-0' : result;\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n var index = 0,\n length = path.length;\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return index && index == length ? object : undefined;\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\n/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n var index = -1,\n length = path.length,\n result = false;\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) && (isArray$1(object) || isArguments(object));\n}\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG$5 = 1,\n COMPARE_UNORDERED_FLAG$3 = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function (object) {\n var objValue = get(object, path);\n return objValue === undefined && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);\n };\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function (object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function (object) {\n return baseGet(object, path);\n };\n}\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (_typeof$1(value) == 'object') {\n return isArray$1(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);\n }\n return property(value);\n}\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function (object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys$1);\n}\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function (collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n while (fromRight ? index-- : ++index < length) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n baseEach(collection, function (value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray$1(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee));\n}\n\n/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray$1(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function (collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate);\n collection = keys$1(collection);\n predicate = function predicate(key) {\n return iteratee(iterable[key], key, iterable);\n };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n while (fromRight ? index-- : ++index < length) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? other + '' : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;\n}\n\n/** Used as references for various `Number` constants. */\nvar INFINITY$2 = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY$2 || value === -INFINITY$2) {\n var sign = value < 0 ? -1 : 1;\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n return result === result ? remainder ? result - remainder : result : 0;\n}\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate), index);\n}\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\n/**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function (value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n}\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT$1 = 'Expected a function';\n\n/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\nfunction negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT$1);\n }\n return function () {\n var args = arguments;\n switch (args.length) {\n case 0:\n return !predicate.call(this);\n case 1:\n return !predicate.call(this, args[0]);\n case 2:\n return !predicate.call(this, args[0], args[1]);\n case 3:\n return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n}\n\n/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\nfunction reject$1(collection, predicate) {\n var func = isArray$1(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(baseIteratee(predicate)));\n}\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0:\n return func.call(thisArg);\n case 1:\n return func.call(thisArg, args[0]);\n case 2:\n return func.call(thisArg, args[0], args[1]);\n case 3:\n return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n if (start < 0) {\n start = -start > length ? 0 : length + start;\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : end - start >>> 0;\n start >>>= 0;\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\nfunction parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n}\n\n/**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\nfunction baseInvoke(object, path, args) {\n path = castPath(path, object);\n object = parent(object, path);\n var func = object == null ? object : object[toKey(last(path))];\n return func == null ? undefined : apply(func, object, args);\n}\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax$1 = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax$1(start === undefined ? func.length - 1 : start, 0);\n return function () {\n var args = arguments,\n index = -1,\n length = nativeMax$1(args.length - start, 0),\n array = Array(length);\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function () {\n return value;\n };\n}\nvar defineProperty = function () {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}();\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function (func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\n/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n return function () {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\n/**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\nvar invokeMap = baseRest(function (collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n result = isArrayLike(collection) ? Array(collection.length) : [];\n baseEach(collection, function (value) {\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n });\n return result;\n});\n\n/**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\nfunction baseUnset(object, path) {\n path = castPath(path, object);\n object = parent(object, path);\n return object == null || delete object[toKey(last(path))];\n}\n\n/** Used for built-in method references. */\nvar arrayProto$1 = Array.prototype;\n\n/** Built-in value references. */\nvar splice$1 = arrayProto$1.splice;\n\n/**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\nfunction basePullAt(array, indexes) {\n var length = array ? indexes.length : 0,\n lastIndex = length - 1;\n while (length--) {\n var index = indexes[length];\n if (length == lastIndex || index !== previous) {\n var previous = index;\n if (isIndex(index)) {\n splice$1.call(array, index, 1);\n } else {\n baseUnset(array, index);\n }\n }\n }\n return array;\n}\n\n/**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\nfunction remove(array, predicate) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n predicate = baseIteratee(predicate);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n basePullAt(array, indexes);\n return result;\n}\nvar wellKnownNamespaces = {\n x: 'adobe:ns:meta/',\n xml: 'http://www.w3.org/1999/xhtml',\n rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',\n dc: 'http://purl.org/dc/elements/1.1/',\n exif: 'http://ns.adobe.com/exif/1.0',\n stDim: 'http://ns.adobe.com/xap/1.0/sType/Dimensions#',\n stFnt: 'http://ns.adobe.com/xap/1.0/sType/Font#',\n tsc: 'http://www.techsmith.com/xmp/tsc/',\n tscDM: 'http://www.techsmith.com/xmp/tscDM/',\n tscHS: 'http://www.techsmith.com/xmp/tscHS/',\n tscIQ: 'http://www.techsmith.com/xmp/tscIQ/',\n xmp: 'http://ns.adobe.com/xap/1.0/',\n xmpDM: 'http://ns.adobe.com/xmp/1.0/DynamicMedia/',\n xmpG: 'http://ns.adobe.com/xap/1.0/g/',\n xmpMM: 'http://ns.adobe.com/xap/1.0/mm/'\n};\n\n/**\n * Namespace resolver for xmp namespaces.\n * @function namespaceResolver\n * @param {String} prefix - XML namespace prefix\n * @static\n * @return {String} The namespace corresponding to the prefix or null if not found\n */\nvar namespaceResolver = function namespaceResolver(prefix) {\n return wellKnownNamespaces[prefix] || null;\n};\n\n/** `Object#toString` result references. */\nvar stringTag$2 = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' || !isArray$1(value) && isObjectLike(value) && baseGetTag(value) == stringTag$2;\n}\n\n/**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\nfunction isNil(value) {\n return value == null;\n}\nvar parseXml;\n\n// Taken from http://stackoverflow.com/a/17604251\nif (typeof window.DOMParser !== 'undefined') {\n var DOMParserProto = DOMParser.prototype;\n var realParseFromString = DOMParserProto.parseFromString;\n\n // Firefox/Opera/IE throw errors on unsupported types\n var canParseHtmlNatively;\n try {\n // WebKit returns null on unsupported types\n if (new DOMParser().parseFromString('', 'text/html')) {\n // text/html parsing is natively supported\n canParseHtmlNatively = true;\n }\n } catch (ex) {\n // nothing to do\n }\n if (!canParseHtmlNatively) {\n DOMParserProto.parseFromString = function (markup, type) {\n if (/^\\s*text\\/html\\s*(?:;|$)/i.test(type)) {\n var doc = document.implementation.createHTMLDocument('');\n var docElement = doc.documentElement;\n var firstElement;\n docElement.innerHTML = markup;\n firstElement = docElement.firstElementChild;\n if (docElement.childElementCount === 1 && firstElement.localName.toLowerCase() === 'html') {\n doc.replaceChild(firstElement, docElement);\n }\n return doc;\n }\n return realParseFromString.apply(this, arguments);\n };\n }\n parseXml = function parseXml(xmlStr, contentType) {\n contentType = contentType || 'text/xml';\n return new window.DOMParser().parseFromString(xmlStr, contentType);\n };\n} else if (typeof window.ActiveXObject !== 'undefined' && new window.ActiveXObject('Microsoft.XMLDOM')) {\n parseXml = function parseXml(xmlStr) {\n var xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM');\n xmlDoc.async = 'false';\n xmlDoc.loadXML(xmlStr);\n return xmlDoc;\n };\n} else {\n throw new Error('No XML parser found');\n}\nvar xmlDocFragmentToString = function xmlDocFragmentToString(xmlDoc) {\n var xmlSerializer = new XMLSerializer();\n return xmlSerializer.serializeToString(xmlDoc);\n};\nvar xmlDocToString = function xmlDocToString(xmlDoc) {\n return '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' + this.xmlDocFragmentToString(xmlDoc);\n};\nvar getElementText = function getElementText(element) {\n return element.textContent;\n};\nvar hasAttribute = function hasAttribute(element, attributeName) {\n var attrValue = element.getAttribute(attributeName);\n return !isNil(attrValue);\n};\nvar hasAttributeWithValue = function hasAttributeWithValue(element, attributeName, value) {\n var attrValue = element.getAttribute(attributeName);\n return attrValue === value;\n};\nvar createDocument = function createDocument() {\n var xmlDocument = document.implementation.createDocument('', '', null);\n return xmlDocument;\n};\nvar createElement = function createElement(doc, name) {\n var element = doc.createElement(name);\n return element;\n};\nvar createElementWithValue = function createElementWithValue(doc, name, value) {\n var element = doc.createElement(name);\n element.appendChild(doc.createTextNode(value));\n return element;\n};\nvar getElementsByTagName = function getElementsByTagName(element, name) {\n var ns = '*';\n var childElements = element.getElementsByTagNameNS(ns, name);\n return childElements;\n};\nvar getFirstElementByTagName = function getFirstElementByTagName(element, name) {\n var childElements = getElementsByTagName(element, name);\n return childElements && childElements[0] ? childElements[0] : null;\n};\nvar getFirstChildElementTextByTagName = function getFirstChildElementTextByTagName(element, name) {\n var childElement = getFirstElementByTagName(element, name);\n return childElement ? getElementText(childElement) : null;\n};\nvar XmlUtility = function XmlUtility() {}; // eslint-disable-line no-empty-function\nXmlUtility.prototype.parseXml = parseXml;\nXmlUtility.prototype.xmlDocFragmentToString = xmlDocFragmentToString;\nXmlUtility.prototype.xmlDocToString = xmlDocToString;\nXmlUtility.prototype.getElementText = getElementText;\nXmlUtility.prototype.hasAttribute = hasAttribute;\nXmlUtility.prototype.hasAttributeWithValue = hasAttributeWithValue;\nXmlUtility.prototype.createDocument = createDocument;\nXmlUtility.prototype.createElement = createElement;\nXmlUtility.prototype.createElementWithValue = createElementWithValue;\nXmlUtility.prototype.getElementsByTagName = getElementsByTagName;\nXmlUtility.prototype.getFirstElementByTagName = getFirstElementByTagName;\nXmlUtility.prototype.getFirstChildElementTextByTagName = getFirstChildElementTextByTagName;\nvar isDocument = function isDocument(docOrElement) {\n return isFunction(docOrElement.evaluate);\n};\nvar getFirstElementByTagNameNSPrefix = function getFirstElementByTagNameNSPrefix(docOrElement, name) {\n if (isDocument(docOrElement)) {\n return docOrElement.evaluate('//' + name, docOrElement, this.namespaceResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n }\n var childElements = this.getElementsByTagNameNSPrefix(docOrElement, name);\n return childElements && childElements[0] ? childElements[0] : undefined;\n};\nvar getElementsByTagNameNSPrefix = function getElementsByTagNameNSPrefix(element, name) {\n if (!element) {\n return null;\n }\n if (name.indexOf(':') === -1) {\n throw new Error('getElementsByTagNameNSPrefix requires the name passed in to have a namespace prefix. getElementsByTagName can be used if you do not know the prefix.');\n }\n var tokens = name.split(':');\n var ns = this.namespaceResolver(tokens[0]);\n var tagName = name.split(':')[1];\n var childElements = element.getElementsByTagNameNS(ns, tagName);\n return childElements;\n};\nvar getFirstChildElementTextByTagNameNSPrefix = function getFirstChildElementTextByTagNameNSPrefix(element, name) {\n var childElement = this.getFirstElementByTagNameNSPrefix(element, name);\n return childElement ? this.getElementText(childElement) : undefined;\n};\nvar createDocumentNS = function createDocumentNS(ns, prefix, name) {\n var xmlDocument = document.implementation.createDocument(ns, prefix + ':' + name, null);\n return xmlDocument;\n};\nvar createElementNS = function createElementNS(doc, ns, prefix, name) {\n var element = doc.createElementNS(ns, prefix + ':' + name);\n return element;\n};\nvar createElementNSWithValue = function createElementNSWithValue(doc, ns, prefix, name, value) {\n var element = createElementNS(doc, ns, prefix, name);\n element.appendChild(doc.createTextNode(value));\n return element;\n};\nvar getNSInfo = function getNSInfo(tagName, namespaceResolver) {\n var nameParts = tagName.split(':', 2);\n if (nameParts.length !== 2) {\n throw new Error('invalid tag name [' + tagName + '] should contain \\':\\' to define namespace');\n } else if (!namespaceResolver(nameParts[0])) {\n throw new Error('invalid namespace prefix [' + nameParts[0] + '] was not able to be mapped to known namespace');\n }\n return {\n nsUrl: namespaceResolver(nameParts[0]),\n nsPrefix: nameParts[0],\n tagShortName: nameParts[1]\n };\n};\nvar createElementFromObject = function createElementFromObject(tagInfo, doc) {\n doc = doc || this.createDocument();\n var that = this;\n if (isString(tagInfo)) {\n return createElement(doc, tagInfo);\n } else if (_typeof$1(tagInfo) === 'object' && typeof tagInfo.toXmp === 'function') {\n return tagInfo.toXmp();\n } else if (_typeof$1(tagInfo) === 'object' && tagInfo.name) {\n var nsInfo = getNSInfo(tagInfo.name, this.namespaceResolver);\n var newElement = createElementNS(doc, nsInfo.nsUrl, nsInfo.nsPrefix, nsInfo.tagShortName);\n if (tagInfo.atts && _typeof$1(tagInfo.atts) === 'object') {\n forEach(tagInfo.atts, function (attrVal, attrName) {\n if (!isNil(attrVal)) {\n var attNsInfo = getNSInfo(attrName, that.namespaceResolver);\n if (attNsInfo.nsPrefix !== 'xml') {\n newElement.setAttributeNS(attNsInfo.nsUrl, attrName, attrVal);\n } else {\n newElement.setAttribute(attrName, attrVal);\n }\n }\n });\n }\n if (tagInfo.children && Array.isArray(tagInfo.children)) {\n forEach(tagInfo.children, function (child) {\n if (child) {\n newElement.appendChild(that.createElementFromObject(child, doc));\n }\n });\n }\n if (tagInfo.text !== undefined && tagInfo.text !== null) {\n newElement.textContent = tagInfo.text;\n }\n return newElement;\n }\n throw new Error('invalid tag info');\n};\nvar NamespaceXmlUtility = function NamespaceXmlUtility(namespaceResolver) {\n if (!namespaceResolver) {\n throw new Error('namespaceResolver is required');\n }\n this.namespaceResolver = namespaceResolver;\n};\nNamespaceXmlUtility.prototype = Object.create(XmlUtility.prototype);\nNamespaceXmlUtility.prototype.getFirstElementByTagNameNSPrefix = getFirstElementByTagNameNSPrefix;\nNamespaceXmlUtility.prototype.getElementsByTagNameNSPrefix = getElementsByTagNameNSPrefix;\nNamespaceXmlUtility.prototype.getFirstChildElementTextByTagNameNSPrefix = getFirstChildElementTextByTagNameNSPrefix;\nNamespaceXmlUtility.prototype.createDocumentNS = createDocumentNS;\nNamespaceXmlUtility.prototype.createElementFromObject = createElementFromObject;\nNamespaceXmlUtility.prototype.createElementNS = createElementNS;\nNamespaceXmlUtility.prototype.createElementNSWithValue = createElementNSWithValue;\nvar LanguageIdentifier = function LanguageIdentifier(languageIdentifier) {\n if (typeof languageIdentifier !== 'string') {\n throw new Error('Language Identifier is expecting a string, but got (' + languageIdentifier + ')');\n }\n var _identifier = languageIdentifier.toLowerCase();\n var _language = '';\n var _region = '';\n var parseLanguageIdentifier = function parseLanguageIdentifier() {\n var languageIdentifierParts = _identifier.split('-');\n if (languageIdentifierParts.length > 1) {\n _region = languageIdentifierParts.pop();\n }\n _language = languageIdentifierParts.join('-');\n };\n var toPOJO = function toPOJO() {\n return {\n identifier: _identifier,\n language: _language,\n region: _region\n };\n };\n parseLanguageIdentifier();\n return Object.defineProperties({\n toPOJO: toPOJO\n }, {\n identifier: {\n get: function get() {\n return _identifier;\n }\n },\n language: {\n get: function get() {\n return _language;\n }\n },\n region: {\n get: function get() {\n return _region;\n }\n }\n });\n};\n\n/** @module LanguageIdentifier */\nvar LanguageIdentifier$1 = {\n /**\n * Factory method that returns a new LanguageIdentifier object.\n * @function create\n * @param {string} languageIdentifier - RFC 3066 notation language string\n * @static\n * @return {module:LanguageIdentifier} new LanguageIdentifier instance\n */\n create: LanguageIdentifier\n};\nvar _identifiers = Object.freeze({\n \"default\": 'default',\n af: {\n name: 'Afrikaans',\n displayName: 'Afrikaans',\n regions: {\n za: 'South Africa'\n }\n },\n sq: {\n name: 'Albanian',\n displayName: 'Shqip',\n regions: {\n al: 'Albania'\n }\n },\n ar: {\n name: 'Arabic',\n displayName: 'العربية',\n regions: {\n dz: 'Algeria',\n bh: 'Bahrain',\n eg: 'Egypt',\n iq: 'Iraq',\n jo: 'Jordan',\n kw: 'Kuwait',\n lb: 'Lebanon',\n ly: 'Libya',\n ma: 'Morocco',\n om: 'Oman',\n qa: 'Qatar',\n sa: 'Saudi Arabia',\n sy: 'Syria',\n tn: 'Tunisia',\n ae: 'United Arab Emirates',\n ye: 'Yemen'\n }\n },\n hy: {\n name: 'Armenian',\n displayName: 'Ô±Ö€Ö‡Õ¥Õ¬Õ¡Õ°Õ¡ÕµÕ¥Ö€Õ¥Õ¶',\n regions: {\n am: 'Armenia'\n }\n },\n 'cy-az': {\n name: 'Azeri (Cyrillic)',\n displayName: 'Ðзәрбајҹан дили',\n regions: {\n az: 'Azerbaijan'\n }\n },\n 'lt-az': {\n name: 'Azeri (Latin)',\n displayName: 'AzÉ™rbaycanca',\n regions: {\n az: 'Azerbaijan'\n }\n },\n eu: {\n name: 'Basque',\n displayName: 'Euskara',\n regions: {\n es: 'Basque'\n }\n },\n be: {\n name: 'Belarusian',\n displayName: 'БеларуÑкаÑ',\n regions: {\n by: 'Belarus'\n }\n },\n bg: {\n name: 'Bulgarian',\n displayName: 'БългарÑки',\n regions: {\n bg: 'Bulgaria'\n }\n },\n ca: {\n name: 'Catalan',\n displayName: 'Català ',\n regions: {\n es: 'Catalan'\n }\n },\n zh: {\n name: 'Chinese',\n displayName: '简体ä¸æ–‡',\n regions: {\n cn: 'China',\n hk: 'Hong Kong SAR',\n mo: 'Macau SAR',\n sg: 'Singapore',\n tw: 'Taiwan',\n chs: '(Simplified)',\n cht: '(Traditional)'\n }\n },\n hr: {\n name: 'Croatian',\n displayName: 'hrvatski',\n regions: {\n hr: 'Croatia'\n }\n },\n cs: {\n name: 'Czech',\n displayName: 'ÄŒeÅ¡tina',\n regions: {\n cz: 'Czech Republic'\n }\n },\n da: {\n name: 'Danish',\n displayName: 'Dansk',\n regions: {\n dk: 'Denmark'\n }\n },\n div: {\n name: 'Dhivehi',\n displayName: 'Þ‹Þ¨ÞˆÞ¬Þ€Þ¨',\n regions: {\n mv: 'Maldives'\n }\n },\n nl: {\n name: 'Dutch',\n displayName: 'Nederlands',\n regions: {\n be: 'Belgium',\n nl: 'The Netherlands'\n }\n },\n en: {\n name: 'English',\n displayName: 'English',\n regions: {\n au: 'Australia',\n bz: 'Belize',\n ca: 'Canada',\n cb: 'Caribbean',\n ie: 'Ireland',\n jm: 'Jamaica',\n nz: 'New Zealand',\n ph: 'Philippines',\n za: 'South Africa',\n tt: 'Trinidad and Tobago',\n gb: 'United Kingdom',\n us: 'United States',\n zw: 'Zimbabwe'\n }\n },\n et: {\n name: 'Estonian',\n displayName: 'Eesti',\n regions: {\n ee: 'Estonia'\n }\n },\n fo: {\n name: 'Faroese',\n displayName: 'Føroyskt',\n regions: {\n fo: 'Faroe Islands'\n }\n },\n fa: {\n name: 'Farsi',\n displayName: 'Ùارسی',\n regions: {\n ir: 'Iran'\n }\n },\n fi: {\n name: 'Finnish',\n displayName: 'Suomi',\n regions: {\n fi: 'Finland'\n }\n },\n fr: {\n name: 'French',\n displayName: 'Français',\n regions: {\n be: 'Belgium',\n ca: 'Canada',\n fr: 'France',\n lu: 'Luxembourg',\n mc: 'Monaco',\n ch: 'Switzerland'\n }\n },\n gl: {\n name: 'Galician',\n displayName: 'galego',\n regions: {\n es: 'Galician'\n }\n },\n ka: {\n name: 'Georgian',\n displayName: 'ქáƒáƒ თული',\n regions: {\n ge: 'Georgia'\n }\n },\n de: {\n name: 'German',\n displayName: 'Deutsch',\n regions: {\n at: 'Austria',\n de: 'Germany',\n li: 'Liechtenstein',\n lu: 'Luxembourg',\n ch: 'Switzerland'\n }\n },\n el: {\n name: 'Greek',\n displayName: 'Ελληνικά',\n regions: {\n gr: 'Greece'\n }\n },\n gu: {\n name: 'Gujarati',\n displayName: 'ગà«àªœàª°àª¾àª¤à«€',\n regions: {\n \"in\": 'India'\n }\n },\n he: {\n name: 'Hebrew',\n displayName: 'עברית',\n regions: {\n il: 'Israel'\n }\n },\n hi: {\n name: 'Hindi',\n displayName: 'हिनà¥à¤¦à¥€',\n regions: {\n \"in\": 'India'\n }\n },\n hu: {\n name: 'Hungarian',\n displayName: 'Magyar',\n regions: {\n hu: 'Hungary'\n }\n },\n is: {\n name: 'Icelandic',\n displayName: 'Ãslenska',\n regions: {\n is: 'Iceland'\n }\n },\n id: {\n name: 'Indonesian',\n displayName: 'Bahasa Indonesia',\n regions: {\n id: 'Indonesia'\n }\n },\n it: {\n name: 'Italian',\n displayName: 'Italiano',\n regions: {\n it: 'Italy',\n ch: 'Switzerland'\n }\n },\n ja: {\n name: 'Japanese',\n displayName: '日本語',\n regions: {\n jp: 'Japan'\n }\n },\n kn: {\n name: 'Kannada',\n displayName: 'ಕನà³à²¨à²¡',\n regions: {\n \"in\": 'India'\n }\n },\n kk: {\n name: 'Kazakh',\n displayName: 'Қазақ Tілі',\n regions: {\n kz: 'Kazakhstan'\n }\n },\n kok: {\n name: 'Konkani',\n displayName: 'कोंकणी',\n regions: {\n \"in\": 'India'\n }\n },\n ko: {\n name: 'Korean',\n displayName: 'í•œêµì–´',\n regions: {\n kr: 'Korea'\n }\n },\n ky: {\n name: 'Kyrgyz',\n displayName: 'кыргызча',\n regions: {\n kz: 'Kazakhstan'\n }\n },\n lv: {\n name: 'Latvian',\n displayName: 'LatvieÅ¡u',\n regions: {\n lv: 'Latvia'\n }\n },\n lt: {\n name: 'Lithuanian',\n displayName: 'Lietuvių',\n regions: {\n lt: 'Lithuania'\n }\n },\n mk: {\n name: 'Macedonian',\n displayName: 'MакедонÑки',\n regions: {\n mk: '(FYROM)'\n }\n },\n ms: {\n name: 'Malay',\n displayName: 'Bahasa Melayu',\n regions: {\n bn: 'Brunei',\n my: 'Malaysia'\n }\n },\n mr: {\n name: 'Marathi',\n displayName: 'मराठी',\n regions: {\n \"in\": 'India'\n }\n },\n mn: {\n name: 'Mongolian',\n displayName: 'Монгол Ð¥Ñл',\n regions: {\n mn: 'Mongolia'\n }\n },\n nb: {\n name: 'Norwegian (BokmÃ¥l)',\n displayName: 'Norsk (BokmÃ¥l)',\n regions: {\n no: 'Norway'\n }\n },\n nn: {\n name: 'Norwegian (Nynorsk)',\n displayName: 'Norsk (Nynorsk)',\n regions: {\n no: 'Norway'\n }\n },\n pl: {\n name: 'Polish',\n displayName: 'Polsk',\n regions: {\n pl: 'Poland'\n }\n },\n pt: {\n name: 'Portuguese',\n displayName: 'Português',\n regions: {\n br: 'Brazil',\n pt: 'Portugal'\n }\n },\n pa: {\n name: 'Punjabi',\n displayName: 'ਪੰਜਾਬੀ',\n regions: {\n \"in\": 'India'\n }\n },\n ro: {\n name: 'Romanian',\n displayName: 'Română',\n regions: {\n ro: 'Romania'\n }\n },\n ru: {\n name: 'Russian',\n displayName: 'РуÑÑкий',\n regions: {\n ru: 'Russia'\n }\n },\n sa: {\n name: 'Sanskrit',\n displayName: 'संसà¥à¤•à¥ƒà¤¤à¤®à¥',\n regions: {\n \"in\": 'India'\n }\n },\n 'cy-sr': {\n name: 'Serbian (Cyrillic)',\n displayName: 'СрпÑки',\n regions: {\n sp: 'Serbia'\n }\n },\n 'lt-sr': {\n name: 'Serbian (Latin)',\n displayName: 'Srpski',\n regions: {\n sp: 'Serbia'\n }\n },\n sk: {\n name: 'Slovak',\n displayName: 'SlovenÄina',\n regions: {\n sk: 'Slovakia'\n }\n },\n sl: {\n name: 'Slovenian',\n displayName: 'SlovenÅ¡Äina',\n regions: {\n si: 'Slovenia'\n }\n },\n es: {\n name: 'Spanish',\n displayName: 'Español',\n regions: {\n ar: 'Argentina',\n bo: 'Bolivia',\n cl: 'Chile',\n co: 'Colombia',\n cr: 'Costa Rica',\n \"do\": 'Dominican Republic',\n ec: 'Ecuador',\n sv: 'El Salvador',\n gt: 'Guatemala',\n hn: 'Honduras',\n mx: 'Mexico',\n ni: 'Nicaragua',\n pa: 'Panama',\n py: 'Paraguay',\n pe: 'Peru',\n pr: 'Puerto Rico',\n es: 'Spain',\n uy: 'Uruguay',\n ve: 'Venezuela'\n }\n },\n sw: {\n name: 'Swahili',\n displayName: 'Kiswahili',\n regions: {\n ke: 'Kenya'\n }\n },\n sv: {\n name: 'Swedish',\n displayName: 'Svenska',\n regions: {\n fi: 'Finland',\n se: 'Sweden'\n }\n },\n syr: {\n name: 'Syriac',\n displayName: 'Ü Ü«Ü¢Ü Ü£Ü˜ÜªÜÜÜ‎',\n regions: {\n sy: 'Syria'\n }\n },\n ta: {\n name: 'Tamil',\n displayName: 'தமிழà¯â€Ž',\n regions: {\n \"in\": 'India'\n }\n },\n tt: {\n name: 'Tatar',\n displayName: 'татар теле',\n regions: {\n ru: 'Russia'\n }\n },\n te: {\n name: 'Telugu',\n displayName: 'తెలà±à°—à±',\n regions: {\n \"in\": 'India'\n }\n },\n th: {\n name: 'Thai',\n displayName: 'ไทย',\n regions: {\n th: 'Thailand'\n }\n },\n tr: {\n name: 'Turkish',\n displayName: 'Türkçe',\n regions: {\n tr: 'Turkey'\n }\n },\n uk: {\n name: 'Ukrainian',\n displayName: 'УкраїнÑька',\n regions: {\n ua: 'Ukraine'\n }\n },\n ur: {\n name: 'Urdu',\n displayName: 'اÙردÙÙˆ',\n regions: {\n pk: 'Pakistan'\n }\n },\n 'cy-uz': {\n name: 'Uzbek (Cyrillic)',\n displayName: 'Ўзбек',\n regions: {\n uz: 'Uzbekistan'\n }\n },\n 'lt-uz': {\n name: 'Uzbek (Latin)',\n displayName: 'oÊ»zbek tili',\n regions: {\n uz: 'Uzbekistan'\n }\n },\n vi: {\n name: 'Vietnamese',\n displayName: 'Tiếng Việt',\n regions: {\n vn: 'Vietnam'\n }\n }\n});\n\n/** @module LanguageIdentifiers */\n\n/**\n * Check if a language is supported.\n * @function isSupportedLanguage\n * @param {string} languageIdentifierString - RFC 3066 notation language string\n * @static\n * @return {boolean} is the language found in the languageIdentifier is found.\n */\nvar isSupportedLanguage = function isSupportedLanguage(languageIdentifierString) {\n var identifier = LanguageIdentifier$1.create(languageIdentifierString);\n return _identifiers[identifier.language] !== undefined;\n};\nvar languageIdentifiers = Object.defineProperties({\n isSupportedLanguage: isSupportedLanguage\n}, {\n identifiers: {\n get: function get() {\n return _identifiers;\n }\n }\n});\n\n/**\n * @this {Promise}\n */\nfunction finallyConstructor$1(callback) {\n var constructor = this.constructor;\n return this.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n return constructor.reject(reason);\n });\n });\n}\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\nvar setTimeoutFunc$1 = setTimeout;\nfunction noop$2() {}\n\n// Polyfill for Function.prototype.bind\nfunction bind$1(fn, thisArg) {\n return function () {\n fn.apply(thisArg, arguments);\n };\n}\n\n/**\n * @constructor\n * @param {Function} fn\n */\nfunction Promise$1$1(fn) {\n if (!(this instanceof Promise$1$1)) throw new TypeError('Promises must be constructed via new');\n if (typeof fn !== 'function') throw new TypeError('not a function');\n /** @type {!number} */\n this._state = 0;\n /** @type {!boolean} */\n this._handled = false;\n /** @type {Promise|undefined} */\n this._value = undefined;\n /** @type {!Array<!Function>} */\n this._deferreds = [];\n doResolve$1(fn, this);\n}\nfunction handle$1(self, deferred) {\n while (self._state === 3) {\n self = self._value;\n }\n if (self._state === 0) {\n self._deferreds.push(deferred);\n return;\n }\n self._handled = true;\n Promise$1$1._immediateFn(function () {\n var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n (self._state === 1 ? resolve$1 : reject$1$1)(deferred.promise, self._value);\n return;\n }\n var ret;\n try {\n ret = cb(self._value);\n } catch (e) {\n reject$1$1(deferred.promise, e);\n return;\n }\n resolve$1(deferred.promise, ret);\n });\n}\nfunction resolve$1(self, newValue) {\n try {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');\n if (newValue && (_typeof$1(newValue) === 'object' || typeof newValue === 'function')) {\n var then = newValue.then;\n if (newValue instanceof Promise$1$1) {\n self._state = 3;\n self._value = newValue;\n finale$1(self);\n return;\n } else if (typeof then === 'function') {\n doResolve$1(bind$1(then, newValue), self);\n return;\n }\n }\n self._state = 1;\n self._value = newValue;\n finale$1(self);\n } catch (e) {\n reject$1$1(self, e);\n }\n}\nfunction reject$1$1(self, newValue) {\n self._state = 2;\n self._value = newValue;\n finale$1(self);\n}\nfunction finale$1(self) {\n if (self._state === 2 && self._deferreds.length === 0) {\n Promise$1$1._immediateFn(function () {\n if (!self._handled) {\n Promise$1$1._unhandledRejectionFn(self._value);\n }\n });\n }\n for (var i = 0, len = self._deferreds.length; i < len; i++) {\n handle$1(self, self._deferreds[i]);\n }\n self._deferreds = null;\n}\n\n/**\n * @constructor\n */\nfunction Handler$1(onFulfilled, onRejected, promise) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve$1(fn, self) {\n var done = false;\n try {\n fn(function (value) {\n if (done) return;\n done = true;\n resolve$1(self, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject$1$1(self, reason);\n });\n } catch (ex) {\n if (done) return;\n done = true;\n reject$1$1(self, ex);\n }\n}\nPromise$1$1.prototype['catch'] = function (onRejected) {\n return this.then(null, onRejected);\n};\nPromise$1$1.prototype.then = function (onFulfilled, onRejected) {\n // @ts-ignore\n var prom = new this.constructor(noop$2);\n handle$1(this, new Handler$1(onFulfilled, onRejected, prom));\n return prom;\n};\nPromise$1$1.prototype['finally'] = finallyConstructor$1;\nPromise$1$1.all = function (arr) {\n return new Promise$1$1(function (resolve, reject) {\n if (!arr || typeof arr.length === 'undefined') throw new TypeError('Promise.all accepts an array');\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n function res(i, val) {\n try {\n if (val && (_typeof$1(val) === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(val, function (val) {\n res(i, val);\n }, reject);\n return;\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n } catch (ex) {\n reject(ex);\n }\n }\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\nPromise$1$1.resolve = function (value) {\n if (value && _typeof$1(value) === 'object' && value.constructor === Promise$1$1) {\n return value;\n }\n return new Promise$1$1(function (resolve) {\n resolve(value);\n });\n};\nPromise$1$1.reject = function (value) {\n return new Promise$1$1(function (resolve, reject) {\n reject(value);\n });\n};\nPromise$1$1.race = function (values) {\n return new Promise$1$1(function (resolve, reject) {\n for (var i = 0, len = values.length; i < len; i++) {\n values[i].then(resolve, reject);\n }\n });\n};\n\n// Use polyfill for setImmediate for performance gains\nPromise$1$1._immediateFn = typeof setImmediate === 'function' && function (fn) {\n setImmediate(fn);\n} || function (fn) {\n setTimeoutFunc$1(fn, 0);\n};\nPromise$1$1._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n if (typeof console !== 'undefined' && console) {\n console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n }\n};\nvar UndoAction = function UndoAction(undoFunc, undoParams, redoFunc, redoParams) {\n var execute = function execute() {\n return new Promise$1$1(function (resolve, reject) {\n try {\n undoFunc(undoParams);\n } catch (error) {\n reject(error);\n }\n var redo = UndoAction(redoFunc, redoParams, undoFunc, undoParams);\n resolve(redo);\n });\n };\n return {\n execute: execute\n };\n};\nvar NoOpAction = function NoOpAction() {\n return {\n execute: function execute() {\n return Promise$1$1.resolve();\n }\n };\n};\n\n/** @module UndoAction */\nvar UndoAction$1 = {\n /**\n * Factory method that returns a new UndoAction object.\n * @function create\n * @param {Function} undoFunc - The function that will be used to undo the action.\n * @param {Object} undoParams - Parameters that will be passed to undo function.\n * @param {Function} redoFunc - The function that will be use to redo the action.\n * @param {Object} redoParams - Parameters that will be passed to redo function.\n * @static\n * @return {module:UndoAction} new Command instance\n */\n create: function create(undoFunc, undoParams, redoFunc, redoParams) {\n return UndoAction(undoFunc, undoParams, redoFunc, redoParams);\n },\n noOp: function noOp() {\n return NoOpAction();\n }\n};\nvar ImageRectangle = function ImageRectangle(propertyInfo) {\n var _x;\n var _y;\n var _width;\n var _height;\n if (isString(propertyInfo)) {\n var tokens = propertyInfo.split(',');\n _x = Number(tokens[0]);\n _y = Number(tokens[1]);\n _width = Number(tokens[2]);\n _height = Number(tokens[3]);\n } else if (isObject(propertyInfo)) {\n _x = propertyInfo.x;\n _y = propertyInfo.y;\n _width = propertyInfo.width;\n _height = propertyInfo.height;\n } else {\n throw new Error('ImageRectangle is expecting a rectangle property string format: \"x, y, width, height\"');\n }\n var _public = Object.defineProperties({}, {\n x: {\n get: function get() {\n return _x;\n }\n },\n y: {\n get: function get() {\n return _y;\n }\n },\n width: {\n get: function get() {\n return _width;\n }\n },\n height: {\n get: function get() {\n return _height;\n }\n }\n });\n _public.toPOJO = function () {\n return {\n x: _x,\n y: _y,\n width: _width,\n height: _height\n };\n };\n _public.toXmpAtt = function () {\n return [_x, _y, _width, _height].join(', ');\n };\n return _public;\n};\n\n/** @module ImageRectangle */\nvar ImageRectangle$1 = {\n /**\n * Factory method that returns a new ImageRectangle object.\n * @function create\n * @param {String|Object} propertyInfo - Required property string of the rectangle. A Rectangle object\n * is an area defined by its position, as indicated by its top-left corner point (x, y) and by its width\n * and its height. The properties should be comma separated in the following format \"x, y, width, height\". Alternatively,\n * this can be an object containing x,y,width,height properties (i.e. the object that comes out from .toPOJO())\n * @static\n * @return {module:ImageRectangle} new ImageRectangle instance\n */\n create: function create(propertyInfo) {\n return ImageRectangle(propertyInfo);\n }\n};\nvar TAG_BEGIN_NOTATION = '\\\\';\nvar TAG_CLOSE_NOTATION = '0';\nvar TAG_END_NOTATION = ' ';\nvar TAG_SPACE = ' ';\nvar LOWER_CASE_A_CHAR_CODE = 97;\nvar LOWER_CASE_Z_CHAR_CODE = 122;\nvar isBlacklistedTag = function isBlacklistedTag(strTag) {\n var LINE_BREAK = 'par ';\n return strTag.toLowerCase() === LINE_BREAK;\n};\nvar findNextTag = function findNextTag(strTextToSearch, nStartPoint) {\n if (nStartPoint === undefined) {\n nStartPoint = 0;\n }\n var nPosition = -1;\n // Make sure we're not null\n if (strTextToSearch) {\n // Get the first tag-looking sequence\n nPosition = strTextToSearch.indexOf(TAG_BEGIN_NOTATION, nStartPoint);\n // While we've got a tag-looking sequence....\n while (nPosition !== -1) {\n // As long as this point is not the last character in the string\n if (nPosition + 1 < strTextToSearch.length) {\n var nCode = strTextToSearch.toLowerCase().charCodeAt(nPosition + 1);\n // If the lower-case character is a lower-case alpha character\n if (LOWER_CASE_A_CHAR_CODE <= nCode && nCode <= LOWER_CASE_Z_CHAR_CODE) {\n break;\n }\n }\n // Get the next location of a tag-looking sequence\n nPosition = strTextToSearch.indexOf(TAG_BEGIN_NOTATION, nPosition + 1);\n }\n }\n\n // Return -1 of the position of the first valid tag\n return nPosition;\n};\nvar getTagAt = function getTagAt(strText, nTagPosition) {\n var strTag;\n if (nTagPosition !== -1) {\n var nEnd = strText.indexOf(TAG_END_NOTATION, nTagPosition + 1);\n if (nEnd !== -1) {\n strTag = strText.substring(nTagPosition + 1, nEnd + 1);\n } else {\n strTag = strText.substring(nTagPosition + 1);\n }\n }\n return strTag;\n};\nvar findNextTagNotBlacklisted = function findNextTagNotBlacklisted(strTextToSearch, nStartPoint) {\n if (nStartPoint === undefined) {\n nStartPoint = 0;\n }\n var nPosition = findNextTag(strTextToSearch, nStartPoint);\n while (nPosition !== -1) {\n var strTag = getTagAt(strTextToSearch, nPosition);\n if (strTag && !isBlacklistedTag(strTag)) {\n break;\n }\n nPosition = findNextTag(strTextToSearch, nPosition + 1);\n }\n return nPosition;\n};\nvar getTextToCloseTag = function getTextToCloseTag(strTag, arrStack) {\n var strCloseTags = '';\n var arrOpenTags = [];\n var strCloseTagNeeded = arrStack.pop();\n while (strCloseTagNeeded && strCloseTagNeeded !== strTag && arrStack.length) {\n strCloseTags += TAG_BEGIN_NOTATION + strCloseTagNeeded;\n arrOpenTags.push(matchingTag(strCloseTagNeeded));\n if (arrStack.length) {\n strCloseTagNeeded = arrStack.pop();\n }\n }\n strCloseTags += TAG_BEGIN_NOTATION + strTag;\n while (arrOpenTags.length) {\n var strOpenTagNeeded = arrOpenTags.pop();\n if (strOpenTagNeeded) {\n strCloseTags += TAG_BEGIN_NOTATION + strOpenTagNeeded;\n arrStack.push(matchingTag(strOpenTagNeeded));\n }\n }\n return strCloseTags;\n};\nvar isClosingTag = function isClosingTag(strTag) {\n return strTag.indexOf(TAG_CLOSE_NOTATION) !== -1;\n};\nvar matchingTag = function matchingTag(strToMatch) {\n var strMatch = '';\n if (strToMatch !== '') {\n // An end tag\n if (isClosingTag(strToMatch)) {\n strMatch = strToMatch.substring(0, strToMatch.indexOf(TAG_CLOSE_NOTATION));\n } else {\n // Not an end tag\n // If we need to remove space (and we should)\n if (strToMatch.indexOf(TAG_SPACE) !== -1) {\n strMatch = strToMatch.substring(0, strToMatch.indexOf(TAG_SPACE));\n }\n strMatch += TAG_CLOSE_NOTATION;\n }\n strMatch += TAG_SPACE;\n }\n return strMatch;\n};\nvar removeTag = function removeTag(strToFix, nTagPosition) {\n if (nTagPosition !== -1 && strToFix && nTagPosition < strToFix.length) {\n // Get the end of the tag\n var nTagEnd = strToFix.indexOf(TAG_END_NOTATION, nTagPosition);\n // If end exists\n if (nTagEnd !== -1) {\n // Remove it\n strToFix = strToFix.substring(0, nTagPosition) + strToFix.substring(nTagEnd + 1);\n } else {\n strToFix = strToFix.substring(0, nTagPosition);\n }\n }\n return strToFix;\n};\nvar trimString = function trimString(strToFix) {\n while (strToFix.length > 1 && strToFix.charAt(0) === TAG_SPACE) {\n strToFix = strToFix.substring(1);\n }\n while (strToFix.length > 1 && strToFix.charAt(strToFix.length - 1) === TAG_SPACE) {\n strToFix = strToFix.substring(0, strToFix.length - 1);\n }\n if (strToFix === TAG_SPACE) {\n strToFix = '';\n }\n return strToFix;\n};\nvar nestTags = function nestTags(strToFix) {\n if (strToFix) {\n var arrTagStack = [];\n var nPosition = findNextTagNotBlacklisted(strToFix);\n while (nPosition !== -1) {\n // Please note: the \"tag\" is considered to be what follows the backslash that signals it's beginning.\n var strTag = getTagAt(strToFix, nPosition);\n if (strTag && isClosingTag(strTag)) {\n // Get the new tag set required to add it in to the string\n var strCloseTags = getTextToCloseTag(strTag, arrTagStack);\n\n // Insert the tags and don't forget the rest of the original, if there is any\n var nTagEnd = strToFix.indexOf(TAG_END_NOTATION, nPosition);\n if (nTagEnd !== -1) {\n strToFix = strToFix.substring(0, nPosition) + strCloseTags + strToFix.substring(nTagEnd + 1);\n } else {\n strToFix = strToFix.substring(0, nPosition) + strCloseTags;\n }\n\n // Increment this so that we're not going through the stuff we just inserted\n nPosition += strCloseTags.length;\n } else {\n if (strTag && !isBlacklistedTag(strTag)) {\n arrTagStack.push(matchingTag(strTag));\n }\n nPosition = Number(nPosition) + 1;\n }\n nPosition = findNextTag(strToFix, nPosition);\n }\n }\n return strToFix;\n};\nvar removeEmptyTags = function removeEmptyTags(strToFix) {\n var strFixed = strToFix;\n if (strFixed) {\n // Loop through the entire string as long as there were corrections made last time\n // (in case more can be made based on the previous ones)\n var nCountCorrectedThisLoop = 1;\n while (nCountCorrectedThisLoop > 0) {\n nCountCorrectedThisLoop = 0;\n // Get the first tag that isn't blacklisted\n var nPosition = findNextTagNotBlacklisted(strFixed);\n while (nPosition !== -1) {\n // Get the next tag that's not blacklisted\n var nNextPosition = findNextTagNotBlacklisted(strFixed, nPosition + 1);\n\n // Get the actual tag\n var strTag = getTagAt(strFixed, nPosition);\n // If the actual tag exists\n if (strTag) {\n // As long as that next tag is actually found\n if (nNextPosition !== -1) {\n // Set up the alternate tag that we're trying to match with\n var strAlternateTag = matchingTag(strTag);\n\n // Get the actual next tag\n var strNextTag = getTagAt(strFixed, nNextPosition);\n // If the actual next tag exists and is the same as what we're looking for\n if (strNextTag && strNextTag === strAlternateTag) {\n // Get the string between the two tags\n var nStringBetweenBegin = nPosition + 1 + strTag.length;\n var strBetween = strFixed.substring(nStringBetweenBegin, nNextPosition);\n // If the trimmed string is empty\n if (!trimString(strBetween).length) {\n // Remove the ending tag\n strFixed = removeTag(strFixed, nNextPosition);\n // Then remove the beginning tag that we're actually at\n strFixed = removeTag(strFixed, nPosition);\n\n // Adjust the position of that next tag by the amount of space we've reduced\n nNextPosition -= strTag.length + 1;\n // Note that we've made a correction\n nCountCorrectedThisLoop++;\n }\n }\n }\n }\n\n // Set the actual next position for the inner loop\n nPosition = nNextPosition;\n }\n }\n }\n return strFixed;\n};\nvar toText = function toText(str) {\n if (str.match(/{\\\\rtf1 /)) {\n str = str.replace(/{\\\\rtf1 /, '');\n if (str.charAt(str.length - 1) === '}') {\n str = str.substring(0, str.length - 1);\n }\n }\n str = str.replace(/\\\\i /g, '');\n str = str.replace(/\\\\i0 /g, '');\n str = str.replace(/\\\\b /g, '');\n str = str.replace(/\\\\b0 /g, '');\n str = str.replace(/\\\\ul /g, '');\n str = str.replace(/\\\\ul0 /g, '');\n str = str.replace(/\\\\par/g, '');\n str = str.replace(/\\\\{/g, '{');\n str = str.replace(/\\\\}/g, '}');\n str = str.replace(/\\\\\\\\/g, '\\\\');\n return str;\n};\nvar toHtml = function toHtml(str) {\n str = nestTags(str);\n str = removeEmptyTags(str);\n str = str.split('<').join('<');\n str = str.split('>').join('>');\n var removeLastBracket = false;\n\n // remove the RTF and Replace with HTML\n if (str.indexOf('{\\\\rtf1') !== -1) {\n str = str.split('{\\\\rtf1 ').join('');\n removeLastBracket = true;\n }\n str = str.split('\\\\i0 ').join('</i>');\n str = str.split('\\\\b0 ').join('</b>');\n str = str.split(\"\\\\ul0 \").join('</u>');\n str = str.split('\\\\i ').join('<i>');\n str = str.split('\\\\b ').join('<b>');\n str = str.split(\"\\\\ul \").join('<u>');\n str = str.split('\\\\par ').join('<br/>');\n str = str.split('\\\\{').join('{');\n str = str.split('\\\\}').join('}');\n str = str.split('\\\\\\\\').join('\\\\');\n if (removeLastBracket && str.charAt(str.length - 1) === '}') {\n str = str.substring(0, str.length - 1);\n }\n\n // convert these so they are displayed and not used as HTML Tags ( exception <br> )\n str = str.split('<br>').join('<br/>');\n str = str.split('<BR>').join('<br/>');\n return str;\n};\n\n/** @module Rtf */\nvar Rtf = {\n /**\n * Take a string with rtf markup and translate it to text\n * @function toText\n * @param {String} str - The rtf formatted input string to parse.\n * @static\n * @return {String} The string as text-only\n */\n toText: toText,\n /**\n * Take a string with rtf markup and translate it to html\n * @function toHtml\n * @param {String} str - The rtf formatted input string to parse.\n * @static\n * @return {String} The string with html markup aligning to the rtf markup\n */\n toHtml: toHtml\n};\nvar validateParams = function validateParams(params) {\n return params && typeof params.text === 'string' && (!params.languageIdentifierString || typeof params.languageIdentifierString === 'string');\n};\nvar CaptionText = function CaptionText(params) {\n var _languageIdentifier = LanguageIdentifier$1.create(languageIdentifiers.identifiers[\"default\"]);\n var _text;\n var _plainText;\n var _markupText;\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var setLanguageIdentifier = function setLanguageIdentifier(languageIdentifierString) {\n if (!languageIdentifiers.isSupportedLanguage(languageIdentifierString)) {\n languageIdentifierString = languageIdentifiers.identifiers[\"default\"];\n }\n var previousLanguageIdentifierString = _languageIdentifier.identifier;\n _languageIdentifier = LanguageIdentifier$1.create(languageIdentifierString);\n return UndoAction$1.create(setLanguageIdentifier, previousLanguageIdentifierString, setLanguageIdentifier, languageIdentifierString);\n };\n var setText = function setText(text) {\n if (typeof text !== 'string') {\n throw new Error('Caption text is expecting a string, but got (' + text + ')');\n }\n var previous = _text;\n _text = text;\n _plainText = Rtf.toText(_text);\n _markupText = Rtf.toHtml(_text);\n return UndoAction$1.create(setText, previous, setText, _text);\n };\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n atts: {\n 'xml:lang': _languageIdentifier.identifier\n },\n text: _text\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n languageIdentifier: {\n get: function get() {\n return _languageIdentifier;\n }\n },\n language: {\n get: function get() {\n return _languageIdentifier.language;\n }\n },\n text: {\n get: function get() {\n return _text;\n }\n },\n plainText: {\n get: function get() {\n return _plainText;\n }\n },\n markupText: {\n get: function get() {\n return _markupText;\n }\n }\n });\n _public.setLanguageIdentifier = setLanguageIdentifier;\n _public.setText = setText;\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n languageIdentifier: _languageIdentifier.toPOJO(),\n language: _languageIdentifier.language,\n text: _text,\n plainText: _plainText,\n markupText: _markupText\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n if (validateParams(params)) {\n forEach(keys$1(params), function (key) {\n if (key === 'languageIdentifierString') {\n setLanguageIdentifier(params.languageIdentifierString);\n } else if (key === 'text') {\n setText(params.text);\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n } else {\n throw new Error('CaptionText expects text and language parameters');\n }\n return _public;\n};\nvar createFromXmpElement = function createFromXmpElement(textElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var rtfText = _xmlUtility.getElementText(textElement);\n var params = {\n languageIdentifierString: textElement.getAttribute('xml:lang'),\n text: rtfText\n };\n return CaptionText(params);\n};\n\n/** @module CaptionText */\nvar CaptionText$1 = {\n /**\n * Factory method that returns a new CaptionText object.\n * @function create\n * @param {Object} params - Optional params for caption\n * @param {String} [params.languageIdentifierString] - RFC 3066 notation language string\n * @param {String} [params.text] - Text of caption item.\n * @static\n * @return {module:CaptionText} new CaptionText instance\n */\n create: function create(params) {\n return CaptionText(params);\n },\n /**\n * Factory method that returns a new CaptionText object from an XMP caption element.\n * @function createFromXmpElement\n * @param {Object} element - XMP caption item element.\n * @static\n * @return {module:CaptionText} new CaptionText instance\n */\n createFromXmpElement: createFromXmpElement\n};\nvar decoratorFunctions = [];\nvar nullCaptionText = {\n text: undefined,\n plainText: undefined,\n markupText: undefined\n};\nvar Caption = function Caption(params) {\n var _startTime;\n var _duration;\n var _captionTextList = [];\n var _horizontalAlignment;\n var _verticalAlignment;\n var _file;\n var _image;\n var _imageIndex;\n var _imageOffset;\n var _imageRectangle;\n var _activeLanguageIdentifier = LanguageIdentifier$1.create(languageIdentifiers.identifiers[\"default\"]);\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var getAvailableLanguages = function getAvailableLanguages() {\n return map(_captionTextList, function (captionText) {\n return captionText.languageIdentifier.identifier;\n });\n };\n var setStartTime = function setStartTime(startTime) {\n if (typeof startTime !== 'number') {\n throw new Error('Caption startTime is expecting a number, but got (' + startTime + ')');\n }\n var previous = _startTime;\n _startTime = Math.floor(startTime);\n return UndoAction$1.create(setStartTime, previous, setStartTime, _startTime);\n };\n var setDuration = function setDuration(duration) {\n if (typeof duration !== 'number') {\n throw new Error('Caption duration is expecting a number, but got (' + duration + ')');\n }\n var previous = _duration;\n _duration = Math.floor(duration);\n return UndoAction$1.create(setDuration, previous, setDuration, _duration);\n };\n var addOrReplaceCaptionText = function addOrReplaceCaptionText(newCaptionText) {\n var existingCaptionItemIndex = findIndex(_captionTextList, function (captionItem) {\n return captionItem.languageIdentifier.identifier === newCaptionText.languageIdentifier.identifier;\n });\n if (existingCaptionItemIndex !== -1) {\n var oldCaptionItem = _captionTextList[existingCaptionItemIndex];\n _captionTextList.splice(existingCaptionItemIndex, 1, newCaptionText);\n return UndoAction$1.create(addOrReplaceCaptionText, oldCaptionItem, addOrReplaceCaptionText, newCaptionText);\n }\n if (newCaptionText.toPOJO) {\n _captionTextList.push(newCaptionText);\n } else {\n _captionTextList.push(CaptionText$1.create(newCaptionText));\n }\n return UndoAction$1.create(removeCaptionText, newCaptionText, addOrReplaceCaptionText, newCaptionText);\n };\n var removeCaptionText = function removeCaptionText(captionText) {\n var removedCaptionItems = remove(_captionTextList, function (captionTextItem) {\n return captionTextItem.languageIdentifier.identifier === captionText.languageIdentifier.identifier && captionTextItem.text === captionText.text;\n });\n var removedCaptionItem = removedCaptionItems.length > 0 ? removedCaptionItems[0] : undefined;\n return UndoAction$1.create(addOrReplaceCaptionText, removedCaptionItem, removeCaptionText, captionText);\n };\n var setHorizontalAlignment = function setHorizontalAlignment(horizontalAlignment) {\n if (typeof horizontalAlignment !== 'string') {\n throw new Error('Caption horizontalAlignment is expecting a string, but got (' + horizontalAlignment + ')');\n }\n var previous = _horizontalAlignment;\n _horizontalAlignment = horizontalAlignment;\n return UndoAction$1.create(setHorizontalAlignment, previous, setHorizontalAlignment, _horizontalAlignment);\n };\n var setVerticalAlignment = function setVerticalAlignment(verticalAlignment) {\n if (typeof verticalAlignment !== 'string') {\n throw new Error('Caption verticalAlignment is expecting a string, but got (' + verticalAlignment + ')');\n }\n var previous = _verticalAlignment;\n _verticalAlignment = verticalAlignment;\n return UndoAction$1.create(setVerticalAlignment, previous, setVerticalAlignment, _verticalAlignment);\n };\n var setFile = function setFile(file) {\n if (typeof file !== 'string') {\n throw new Error('Caption file is expecting a string, but got (' + file + ')');\n }\n var previous = _file;\n _file = file;\n return UndoAction$1.create(setFile, previous, setFile, _file);\n };\n var setImage = function setImage(image) {\n if (typeof image !== 'string') {\n throw new Error('Caption image is expecting a string, but got (' + image + ')');\n }\n var previous = _image;\n _image = image;\n return UndoAction$1.create(setImage, previous, setImage, _image);\n };\n var setImageIndex = function setImageIndex(imageIndex) {\n if (typeof imageIndex !== 'number') {\n throw new Error('Caption imageIndex is expecting a number, but got (' + imageIndex + ')');\n }\n var previous = _imageIndex;\n _imageIndex = imageIndex;\n return UndoAction$1.create(setImageIndex, previous, setImageIndex, _imageIndex);\n };\n var setImageOffset = function setImageOffset(imageOffset) {\n if (typeof imageOffset !== 'number') {\n throw new Error('Caption imageOffset is expecting a number, but got (' + imageOffset + ')');\n }\n var previous = _imageOffset;\n _imageOffset = imageOffset;\n return UndoAction$1.create(setImageOffset, previous, setImageOffset, _imageOffset);\n };\n var setImageRectangle = function setImageRectangle(imageRectangle) {\n if (_typeof$1(imageRectangle) !== 'object') {\n throw new Error('Caption imageRectangle is expecting an object, but got (' + imageRectangle + ')');\n }\n var previous = _imageRectangle;\n _imageRectangle = imageRectangle;\n return UndoAction$1.create(setImageRectangle, previous, setImageRectangle, _imageRectangle);\n };\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:startTime': _startTime,\n 'xmpDM:duration': _duration,\n 'tscDM:halign': _horizontalAlignment,\n 'tscDM:valign': _verticalAlignment,\n 'tscDM:file': _file,\n 'tscDM:image': _image,\n 'tscDM:imageindex': _imageIndex,\n 'tscDM:imageoffset': _imageOffset,\n 'tscDM:imagerect': _imageRectangle ? [_imageRectangle.x, _imageRectangle.y, _imageRectangle.width, _imageRectangle.height].join(', ') : undefined\n },\n children: [{\n name: 'xmpDM:name',\n children: [{\n name: 'rdf:Alt',\n children: _captionTextList\n }]\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var getCaptionText = function getCaptionText() {\n if (_captionTextList.length === 0) {\n return nullCaptionText;\n }\n if (_activeLanguageIdentifier.identifier === languageIdentifiers.identifiers[\"default\"]) {\n return _captionTextList[0];\n }\n var preferredCaptionText = find(_captionTextList, function (captionText) {\n return captionText.languageIdentifier.identifier === _activeLanguageIdentifier.identifier;\n });\n if (!preferredCaptionText) {\n preferredCaptionText = find(_captionTextList, function (captionText) {\n return captionText.language === _activeLanguageIdentifier.language;\n });\n }\n return preferredCaptionText || nullCaptionText;\n };\n var _public = Object.defineProperties({}, {\n startTime: {\n get: function get() {\n return _startTime;\n }\n },\n duration: {\n get: function get() {\n return _duration;\n }\n },\n endTime: {\n get: function get() {\n return _startTime + _duration;\n }\n },\n captionTextList: {\n get: function get() {\n return _captionTextList;\n }\n },\n text: {\n get: function get() {\n return getCaptionText().text;\n }\n },\n plainText: {\n get: function get() {\n return getCaptionText().plainText;\n }\n },\n markupText: {\n get: function get() {\n return getCaptionText().markupText;\n }\n },\n horizontalAlignment: {\n get: function get() {\n return _horizontalAlignment;\n }\n },\n verticalAlignment: {\n get: function get() {\n return _verticalAlignment;\n }\n },\n file: {\n get: function get() {\n return _file;\n }\n },\n image: {\n get: function get() {\n return _image;\n }\n },\n imageIndex: {\n get: function get() {\n return _imageIndex;\n }\n },\n imageOffset: {\n get: function get() {\n return _imageOffset;\n }\n },\n imageRectangle: {\n get: function get() {\n return _imageRectangle;\n }\n },\n activeLanguageIdentifier: {\n get: function get() {\n return _activeLanguageIdentifier;\n },\n set: function set(languageIdentifier) {\n _activeLanguageIdentifier = languageIdentifier;\n }\n }\n });\n _public.getAvailableLanguages = getAvailableLanguages;\n _public.setStartTime = setStartTime;\n _public.setDuration = setDuration;\n _public.addOrReplaceCaptionText = addOrReplaceCaptionText;\n _public.removeCaptionText = removeCaptionText;\n _public.setHorizontalAlignment = setHorizontalAlignment;\n _public.setVerticalAlignment = setVerticalAlignment;\n _public.setFile = setFile;\n _public.setImage = setImage;\n _public.setImageIndex = setImageIndex;\n _public.setImageOffset = setImageOffset;\n _public.setImageRectangle = setImageRectangle;\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n startTime: _startTime,\n duration: _duration,\n captionTextList: invokeMap(_captionTextList, 'toPOJO'),\n horizontalAlignment: _horizontalAlignment,\n verticalAlignment: _verticalAlignment,\n file: _file,\n image: _image,\n imageIndex: _imageIndex,\n imageOffset: _imageOffset,\n imageRectangle: _imageRectangle ? _imageRectangle.toPOJO() : _imageRectangle\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'startTime' && typeof params.startTime === 'number') {\n setStartTime(params.startTime);\n } else if (key === 'duration' && typeof params.duration === 'number') {\n setDuration(params.duration);\n } else if (key === 'captionTextList' && params.captionTextList) {\n map(params.captionTextList, addOrReplaceCaptionText);\n } else if (key === 'horizontalAlignment' && params.horizontalAlignment) {\n setHorizontalAlignment(params.horizontalAlignment);\n } else if (key === 'verticalAlignment' && params.verticalAlignment) {\n setVerticalAlignment(params.verticalAlignment);\n } else if (key === 'file' && params.file) {\n setFile(params.file);\n } else if (key === 'image' && params.image) {\n setImage(params.image);\n } else if (key === 'imageIndex' && typeof params.imageIndex === 'number') {\n setImageIndex(params.imageIndex);\n } else if (key === 'imageOffset' && typeof params.imageOffset === 'number') {\n setImageOffset(params.imageOffset);\n } else if (key === 'imageRectangle' && params.imageRectangle) {\n if (!params.imageRectangle.toPOJO) {\n params.imageRectangle = ImageRectangle$1.create(params.imageRectangle);\n }\n setImageRectangle(params.imageRectangle);\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n forEach(decoratorFunctions, function (func) {\n func(_public);\n });\n return _public;\n};\nvar createFromXmpElement$1 = function createFromXmpElement$1(captionElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var captionTextElements = _xmlUtility.getElementsByTagNameNSPrefix(captionElement, 'rdf:li');\n var captionTextList = map(captionTextElements, CaptionText$1.createFromXmpElement);\n var params = {\n startTime: Number(captionElement.getAttribute('xmpDM:startTime')),\n duration: Number(captionElement.getAttribute('xmpDM:duration')),\n captionTextList: captionTextList,\n horizontalAlignment: captionElement.getAttribute('tscDM:halign'),\n verticalAlignment: captionElement.getAttribute('tscDM:valign')\n };\n if (captionElement.getAttribute('tscDM:file')) {\n params.file = captionElement.getAttribute('tscDM:file');\n }\n if (captionElement.getAttribute('tscDM:image')) {\n params.image = captionElement.getAttribute('tscDM:image');\n }\n if (captionElement.getAttribute('tscDM:imageindex')) {\n params.imageIndex = Number(captionElement.getAttribute('tscDM:imageindex'));\n }\n if (captionElement.getAttribute('tscDM:imageoffset')) {\n params.imageOffset = Number(captionElement.getAttribute('tscDM:imageoffset'));\n }\n if (captionElement.getAttribute('tscDM:imagerect')) {\n params.imageRectangle = ImageRectangle$1.create(captionElement.getAttribute('tscDM:imagerect'));\n }\n return Caption(params);\n};\nvar registerDecorator = function registerDecorator(decorator) {\n if (decorator && typeof decorator === 'function') {\n decoratorFunctions.push(decorator);\n } else {\n throw new Error('decorator must be a function');\n }\n};\nvar clearDecorators = function clearDecorators() {\n decoratorFunctions = [];\n};\n\n/** @module Caption */\nvar Caption$1 = {\n /**\n * Factory method that returns a new Caption object.\n * @function create\n * @param {Object} params - Optional params for caption\n * @param {Number} [params.startTime] - Start time of caption.\n * @param {Number} [params.duration] - Duration of caption.\n * @param {module:CaptionText[]} [params.captionTextList] - List of CaptionText objects.\n * @param {String} [params.horizontalAlignment] - Horizontal alignment of caption text.\n * @param {String} [params.verticalAlignment] - Vertical alignment of caption text.\n * @param {String} [params.file] - Reference to a specific file as String.\n * @param {String} [params.image] - Url for caption thumbnail.\n * @param {Number} [params.imageIndex] - Index of image within file consisting of one or more images.\n * @param {Number} [params.imageOffset] - Number of bytes this image begins at, relative to the beginning of the entire file\n * @param {module:ImageRectangle} [params.imageRectangle] - Image Rectangle for image sprite map\n * @static\n * @return {module:Caption} new Caption instance\n */\n create: function create(params) {\n return Caption(params);\n },\n /**\n * Factory method that returns a new Caption object from an XMP caption element.\n * @function createFromXmpElement\n * @param {Object} element - XMP caption element.\n * @static\n * @return {module:Caption} new Caption instance\n */\n createFromXmpElement: createFromXmpElement$1,\n /**\n * Method to allow registration of decorator function that can extend the caption\n * object before it is returned in the create functions.\n * @function registerDecorator\n * @param {Function} decorator - Function that will be used to decorate the caption.\n * The function should take a caption parameter.\n * @static\n */\n registerDecorator: registerDecorator,\n /**\n * Method to allow clearing decorator functions\n * @function clearDecorators\n * @static\n */\n clearDecorators: clearDecorators\n};\nfunction createCommonjsModule(fn, module) {\n return module = {\n exports: {}\n }, fn(module, module.exports), module.exports;\n}\nvar tinycolor$1 = createCommonjsModule(function (module) {\n // TinyColor v1.4.1\n // https://github.com/bgrins/TinyColor\n // Brian Grinstead, MIT License\n\n (function (Math) {\n var trimLeft = /^\\s+/,\n trimRight = /\\s+$/,\n tinyCounter = 0,\n mathRound = Math.round,\n mathMin = Math.min,\n mathMax = Math.max,\n mathRandom = Math.random;\n function tinycolor(color, opts) {\n color = color ? color : '';\n opts = opts || {};\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n var rgb = inputToRGB(color);\n this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = mathRound(100 * this._a) / 100, this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this._r < 1) {\n this._r = mathRound(this._r);\n }\n if (this._g < 1) {\n this._g = mathRound(this._g);\n }\n if (this._b < 1) {\n this._b = mathRound(this._b);\n }\n this._ok = rgb.ok;\n this._tc_id = tinyCounter++;\n }\n tinycolor.prototype = {\n isDark: function isDark() {\n return this.getBrightness() < 128;\n },\n isLight: function isLight() {\n return !this.isDark();\n },\n isValid: function isValid() {\n return this._ok;\n },\n getOriginalInput: function getOriginalInput() {\n return this._originalInput;\n },\n getFormat: function getFormat() {\n return this._format;\n },\n getAlpha: function getAlpha() {\n return this._a;\n },\n getBrightness: function getBrightness() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function getLuminance() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r / 255;\n GsRGB = rgb.g / 255;\n BsRGB = rgb.b / 255;\n if (RsRGB <= 0.03928) {\n R = RsRGB / 12.92;\n } else {\n R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n }\n if (GsRGB <= 0.03928) {\n G = GsRGB / 12.92;\n } else {\n G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n }\n if (BsRGB <= 0.03928) {\n B = BsRGB / 12.92;\n } else {\n B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n }\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n },\n setAlpha: function setAlpha(value) {\n this._a = boundAlpha(value);\n this._roundA = mathRound(100 * this._a) / 100;\n return this;\n },\n toHsv: function toHsv() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return {\n h: hsv.h * 360,\n s: hsv.s,\n v: hsv.v,\n a: this._a\n };\n },\n toHsvString: function toHsvString() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = mathRound(hsv.h * 360),\n s = mathRound(hsv.s * 100),\n v = mathRound(hsv.v * 100);\n return this._a == 1 ? \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" : \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \" + this._roundA + \")\";\n },\n toHsl: function toHsl() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return {\n h: hsl.h * 360,\n s: hsl.s,\n l: hsl.l,\n a: this._a\n };\n },\n toHslString: function toHslString() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = mathRound(hsl.h * 360),\n s = mathRound(hsl.s * 100),\n l = mathRound(hsl.l * 100);\n return this._a == 1 ? \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" : \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \" + this._roundA + \")\";\n },\n toHex: function toHex(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function toHexString(allow3Char) {\n return '#' + this.toHex(allow3Char);\n },\n toHex8: function toHex8(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function toHex8String(allow4Char) {\n return '#' + this.toHex8(allow4Char);\n },\n toRgb: function toRgb() {\n return {\n r: mathRound(this._r),\n g: mathRound(this._g),\n b: mathRound(this._b),\n a: this._a\n };\n },\n toRgbString: function toRgbString() {\n return this._a == 1 ? \"rgb(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \")\" : \"rgba(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \", \" + this._roundA + \")\";\n },\n toPercentageRgb: function toPercentageRgb() {\n return {\n r: mathRound(bound01(this._r, 255) * 100) + \"%\",\n g: mathRound(bound01(this._g, 255) * 100) + \"%\",\n b: mathRound(bound01(this._b, 255) * 100) + \"%\",\n a: this._a\n };\n },\n toPercentageRgbString: function toPercentageRgbString() {\n return this._a == 1 ? \"rgb(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%)\" : \"rgba(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n },\n toName: function toName() {\n if (this._a === 0) {\n return \"transparent\";\n }\n if (this._a < 1) {\n return false;\n }\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function toFilter(secondColor) {\n var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n return \"progid:DXImageTransform.Microsoft.gradient(\" + gradientType + \"startColorstr=\" + hex8String + \",endColorstr=\" + secondHex8String + \")\";\n },\n toString: function toString(format) {\n var formatSet = !!format;\n format = format || this._format;\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === \"name\" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === \"rgb\") {\n formattedString = this.toRgbString();\n }\n if (format === \"prgb\") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === \"hex\" || format === \"hex6\") {\n formattedString = this.toHexString();\n }\n if (format === \"hex3\") {\n formattedString = this.toHexString(true);\n }\n if (format === \"hex4\") {\n formattedString = this.toHex8String(true);\n }\n if (format === \"hex8\") {\n formattedString = this.toHex8String();\n }\n if (format === \"name\") {\n formattedString = this.toName();\n }\n if (format === \"hsl\") {\n formattedString = this.toHslString();\n }\n if (format === \"hsv\") {\n formattedString = this.toHsvString();\n }\n return formattedString || this.toHexString();\n },\n clone: function clone() {\n return tinycolor(this.toString());\n },\n _applyModification: function _applyModification(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function lighten() {\n return this._applyModification(_lighten, arguments);\n },\n brighten: function brighten() {\n return this._applyModification(_brighten, arguments);\n },\n darken: function darken() {\n return this._applyModification(_darken, arguments);\n },\n desaturate: function desaturate() {\n return this._applyModification(_desaturate, arguments);\n },\n saturate: function saturate() {\n return this._applyModification(_saturate, arguments);\n },\n greyscale: function greyscale() {\n return this._applyModification(_greyscale, arguments);\n },\n spin: function spin() {\n return this._applyModification(_spin, arguments);\n },\n _applyCombination: function _applyCombination(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function analogous() {\n return this._applyCombination(_analogous, arguments);\n },\n complement: function complement() {\n return this._applyCombination(_complement, arguments);\n },\n monochromatic: function monochromatic() {\n return this._applyCombination(_monochromatic, arguments);\n },\n splitcomplement: function splitcomplement() {\n return this._applyCombination(_splitcomplement, arguments);\n },\n triad: function triad() {\n return this._applyCombination(_triad, arguments);\n },\n tetrad: function tetrad() {\n return this._applyCombination(_tetrad, arguments);\n }\n };\n\n // If input is an object, force 1 into \"1.0\" to handle ratios properly\n // String input requires \"1.0\" as input, so 1 will be treated as 1\n tinycolor.fromRatio = function (color, opts) {\n if (_typeof$1(color) == \"object\") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === \"a\") {\n newColor[i] = color[i];\n } else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n return tinycolor(color, opts);\n };\n\n // Given a string or object, convert that input to RGB\n // Possible string inputs:\n //\n // \"red\"\n // \"#f00\" or \"f00\"\n // \"#ff0000\" or \"ff0000\"\n // \"#ff000000\" or \"ff000000\"\n // \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n // \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n // \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n // \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n // \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n // \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n // \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n //\n function inputToRGB(color) {\n var rgb = {\n r: 0,\n g: 0,\n b: 0\n };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color == \"string\") {\n color = stringInputToObject(color);\n }\n if (_typeof$1(color) == \"object\") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = \"hsv\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = \"hsl\";\n }\n if (color.hasOwnProperty(\"a\")) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: mathMin(255, mathMax(rgb.r, 0)),\n g: mathMin(255, mathMax(rgb.g, 0)),\n b: mathMin(255, mathMax(rgb.b, 0)),\n a: a\n };\n }\n\n // Conversion Functions\n // --------------------\n\n // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n // <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n\n // `rgbToRgb`\n // Handle bounds / percentage checking to conform to CSS color spec\n // <http://www.w3.org/TR/css3-color/>\n // *Assumes:* r, g, b in [0, 255] or [0, 1]\n // *Returns:* { r, g, b } in [0, 255]\n function rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n }\n\n // `rgbToHsl`\n // Converts an RGB color value to HSL.\n // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n // *Returns:* { h, s, l } in [0,1]\n function rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = mathMax(r, g, b),\n min = mathMin(r, g, b);\n var h,\n s,\n l = (max + min) / 2;\n if (max == min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n l: l\n };\n }\n\n // `hslToRgb`\n // Converts an HSL color value to RGB.\n // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n // *Returns:* { r, g, b } in the set [0, 255]\n function hslToRgb(h, s, l) {\n var r, g, b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n }\n\n // `rgbToHsv`\n // Converts an RGB color value to HSV\n // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n // *Returns:* { h, s, v } in [0,1]\n function rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = mathMax(r, g, b),\n min = mathMin(r, g, b);\n var h,\n s,\n v = max;\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n v: v\n };\n }\n\n // `hsvToRgb`\n // Converts an HSV color value to RGB.\n // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n // *Returns:* { r, g, b } in the set [0, 255]\n function hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n }\n\n // `rgbToHex`\n // Converts an RGB color to hex\n // Assumes r, g, and b are contained in the set [0, 255]\n // Returns a 3 or 6 character hex\n function rgbToHex(r, g, b, allow3Char) {\n var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join(\"\");\n }\n\n // `rgbaToHex`\n // Converts an RGBA color plus alpha transparency to hex\n // Assumes r, g, b are contained in the set [0, 255] and\n // a in [0, 1]. Returns a 4 or 8 character rgba hex\n function rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16)), pad2(convertDecimalToHex(a))];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join(\"\");\n }\n\n // `rgbaToArgbHex`\n // Converts an RGBA color to an ARGB Hex8 string\n // Rarely used, but required for \"toFilter()\"\n function rgbaToArgbHex(r, g, b, a) {\n var hex = [pad2(convertDecimalToHex(a)), pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];\n return hex.join(\"\");\n }\n\n // `equals`\n // Can be called with any tinycolor input\n tinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) {\n return false;\n }\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n };\n tinycolor.random = function () {\n return tinycolor.fromRatio({\n r: mathRandom(),\n g: mathRandom(),\n b: mathRandom()\n });\n };\n\n // Modification Functions\n // ----------------------\n // Thanks to less.js for some of the basics here\n // <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>\n\n function _desaturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n }\n function _saturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n }\n function _greyscale(color) {\n return tinycolor(color).desaturate(100);\n }\n function _lighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n }\n function _brighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var rgb = tinycolor(color).toRgb();\n rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * -(amount / 100))));\n rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * -(amount / 100))));\n rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * -(amount / 100))));\n return tinycolor(rgb);\n }\n function _darken(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n }\n\n // Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n // Values outside of this range will be wrapped into this range.\n function _spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n }\n\n // Combination Functions\n // ---------------------\n // Thanks to jQuery xColor for some of the ideas behind these\n // <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>\n\n function _complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n }\n function _triad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({\n h: (h + 120) % 360,\n s: hsl.s,\n l: hsl.l\n }), tinycolor({\n h: (h + 240) % 360,\n s: hsl.s,\n l: hsl.l\n })];\n }\n function _tetrad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({\n h: (h + 90) % 360,\n s: hsl.s,\n l: hsl.l\n }), tinycolor({\n h: (h + 180) % 360,\n s: hsl.s,\n l: hsl.l\n }), tinycolor({\n h: (h + 270) % 360,\n s: hsl.s,\n l: hsl.l\n })];\n }\n function _splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({\n h: (h + 72) % 360,\n s: hsl.s,\n l: hsl.l\n }), tinycolor({\n h: (h + 216) % 360,\n s: hsl.s,\n l: hsl.l\n })];\n }\n function _analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n }\n function _monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h,\n s = hsv.s,\n v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n while (results--) {\n ret.push(tinycolor({\n h: h,\n s: s,\n v: v\n }));\n v = (v + modification) % 1;\n }\n return ret;\n }\n\n // Utility Functions\n // ---------------------\n\n tinycolor.mix = function (color1, color2, amount) {\n amount = amount === 0 ? 0 : amount || 50;\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n var p = amount / 100;\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a\n };\n return tinycolor(rgba);\n };\n\n // Readability Functions\n // ---------------------\n // <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)\n\n // `contrast`\n // Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)\n tinycolor.readability = function (color1, color2) {\n var c1 = tinycolor(color1);\n var c2 = tinycolor(color2);\n return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);\n };\n\n // `isReadable`\n // Ensure that foreground and background color combinations meet WCAG2 guidelines.\n // The third argument is an optional Object.\n // the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';\n // the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.\n // If the entire object is absent, isReadable defaults to {level:\"AA\",size:\"small\"}.\n\n // *Example*\n // tinycolor.isReadable(\"#000\", \"#111\") => false\n // tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\n tinycolor.isReadable = function (color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n out = false;\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case \"AAsmall\":\n case \"AAAlarge\":\n out = readability >= 4.5;\n break;\n case \"AAlarge\":\n out = readability >= 3;\n break;\n case \"AAAsmall\":\n out = readability >= 7;\n break;\n }\n return out;\n };\n\n // `mostReadable`\n // Given a base color and a list of possible foreground or background\n // colors for that base, returns the most readable color.\n // Optionally returns Black or White if the most readable color is unreadable.\n // *Example*\n // tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n // tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString(); // \"#ffffff\"\n // tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n // tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\n tinycolor.mostReadable = function (baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors;\n level = args.level;\n size = args.size;\n for (var i = 0; i < colorList.length; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n if (tinycolor.isReadable(baseColor, bestColor, {\n \"level\": level,\n \"size\": size\n }) || !includeFallbackColors) {\n return bestColor;\n } else {\n args.includeFallbackColors = false;\n return tinycolor.mostReadable(baseColor, [\"#fff\", \"#000\"], args);\n }\n };\n\n // Big List of Colors\n // ------------------\n // <http://www.w3.org/TR/css3-color/#svg-color>\n var names = tinycolor.names = {\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"0ff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000\",\n blanchedalmond: \"ffebcd\",\n blue: \"00f\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n burntsienna: \"ea7e5d\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"0ff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"f0f\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"789\",\n lightslategrey: \"789\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"0f0\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"f0f\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"f00\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"fff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ff0\",\n yellowgreen: \"9acd32\"\n };\n\n // Make it easy to access colors via `hexNames[hex]`\n var hexNames = tinycolor.hexNames = flip(names);\n\n // Utilities\n // ---------\n\n // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\n function flip(o) {\n var flipped = {};\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n }\n\n // Return a valid alpha value [0,1] with all invalid values being set to 1\n function boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n }\n\n // Take input from [0, n] and return it as [0, 1]\n function bound01(n, max) {\n if (isOnePointZero(n)) {\n n = \"100%\";\n }\n var processPercent = isPercentage(n);\n n = mathMin(max, mathMax(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return n % max / parseFloat(max);\n }\n\n // Force a number between 0 and 1\n function clamp01(val) {\n return mathMin(1, mathMax(0, val));\n }\n\n // Parse a base-16 hex value into a base-10 integer\n function parseIntFromHex(val) {\n return parseInt(val, 16);\n }\n\n // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n // <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\n function isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf('.') != -1 && parseFloat(n) === 1;\n }\n\n // Check to see if string passed in is a percentage\n function isPercentage(n) {\n return typeof n === \"string\" && n.indexOf('%') != -1;\n }\n\n // Force a hex value to have 2 characters\n function pad2(c) {\n return c.length == 1 ? '0' + c : '' + c;\n }\n\n // Replace a decimal with it's percentage value\n function convertToPercentage(n) {\n if (n <= 1) {\n n = n * 100 + \"%\";\n }\n return n;\n }\n\n // Converts a decimal to a hex value\n function convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n }\n // Converts a hex value to a decimal\n function convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n }\n var matchers = function () {\n // <http://www.w3.org/TR/css3-values/#integers>\n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // <http://www.w3.org/TR/css3-values/#number-value>\n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n }();\n\n // `isValidCSSUnit`\n // Take in a single string / number and check to see if it looks like a CSS unit\n // (see `matchers` above for definition).\n function isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n }\n\n // `stringInputToObject`\n // Permissive string parsing. Take in a number of formats, and output an object\n // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\n function stringInputToObject(color) {\n color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n } else if (color == 'transparent') {\n return {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n format: \"name\"\n };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if (match = matchers.rgb.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3]\n };\n }\n if (match = matchers.rgba.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsl.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3]\n };\n }\n if (match = matchers.hsla.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsv.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3]\n };\n }\n if (match = matchers.hsva.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hex8.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex6.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n if (match = matchers.hex4.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + '' + match[1]),\n g: parseIntFromHex(match[2] + '' + match[2]),\n b: parseIntFromHex(match[3] + '' + match[3]),\n a: convertHexToDecimal(match[4] + '' + match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex3.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + '' + match[1]),\n g: parseIntFromHex(match[2] + '' + match[2]),\n b: parseIntFromHex(match[3] + '' + match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n return false;\n }\n function validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n var level, size;\n parms = parms || {\n \"level\": \"AA\",\n \"size\": \"small\"\n };\n level = (parms.level || \"AA\").toUpperCase();\n size = (parms.size || \"small\").toLowerCase();\n if (level !== \"AA\" && level !== \"AAA\") {\n level = \"AA\";\n }\n if (size !== \"small\" && size !== \"large\") {\n size = \"small\";\n }\n return {\n \"level\": level,\n \"size\": size\n };\n }\n\n // Node: Export function\n if (module.exports) {\n module.exports = tinycolor;\n }\n // AMD/requirejs: Define the module\n else {\n window.tinycolor = tinycolor;\n }\n })(Math);\n});\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeFloor = Math.floor,\n nativeMin = Math.min;\n\n/**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\nfunction baseSortedIndexBy(array, value, iteratee, retHighest) {\n value = iteratee(value);\n var low = 0,\n high = array == null ? 0 : array.length,\n valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? computed <= value : computed < value;\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n}\n\n/**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\nfunction sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, baseIteratee(iteratee));\n}\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\n/** Used for built-in method references. */\nvar objectProto$c = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$9 = objectProto$c.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty$9.call(object, key) && eq(objValue, value)) || value === undefined && !(key in object)) {\n baseAssignValue(object, key, value);\n }\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n var index = -1,\n length = props.length;\n while (++index < length) {\n var key = props[index];\n var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined;\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys$1(source), object);\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto$d = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$a = objectProto$d.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty$a.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn$1(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn$1(source), object);\n}\n\n/** Detect free variable `exports`. */\nvar freeExports$2 = (typeof exports === \"undefined\" ? \"undefined\" : _typeof$1(exports)) == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule$2 = freeExports$2 && (typeof module === \"undefined\" ? \"undefined\" : _typeof$1(module)) == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;\n\n/** Built-in value references. */\nvar Buffer$1 = moduleExports$2 ? root.Buffer : undefined,\n allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n buffer.copy(result);\n return result;\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols$1 = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function (object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn$1, getSymbolsIn);\n}\n\n/** Used for built-in method references. */\nvar objectProto$e = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$b = objectProto$e.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty$b.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto$2 = _Symbol ? _Symbol.prototype : undefined,\n symbolValueOf$1 = symbolProto$2 ? symbolProto$2.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol)) : {};\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/** `Object#toString` result references. */\nvar boolTag$2 = '[object Boolean]',\n dateTag$2 = '[object Date]',\n mapTag$3 = '[object Map]',\n numberTag$2 = '[object Number]',\n regexpTag$2 = '[object RegExp]',\n setTag$3 = '[object Set]',\n stringTag$3 = '[object String]',\n symbolTag$2 = '[object Symbol]';\nvar arrayBufferTag$2 = '[object ArrayBuffer]',\n dataViewTag$3 = '[object DataView]',\n float32Tag$1 = '[object Float32Array]',\n float64Tag$1 = '[object Float64Array]',\n int8Tag$1 = '[object Int8Array]',\n int16Tag$1 = '[object Int16Array]',\n int32Tag$1 = '[object Int32Array]',\n uint8Tag$1 = '[object Uint8Array]',\n uint8ClampedTag$1 = '[object Uint8ClampedArray]',\n uint16Tag$1 = '[object Uint16Array]',\n uint32Tag$1 = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag$2:\n return cloneArrayBuffer(object);\n case boolTag$2:\n case dateTag$2:\n return new Ctor(+object);\n case dataViewTag$3:\n return cloneDataView(object, isDeep);\n case float32Tag$1:\n case float64Tag$1:\n case int8Tag$1:\n case int16Tag$1:\n case int32Tag$1:\n case uint8Tag$1:\n case uint8ClampedTag$1:\n case uint16Tag$1:\n case uint32Tag$1:\n return cloneTypedArray(object, isDeep);\n case mapTag$3:\n return new Ctor();\n case numberTag$2:\n case stringTag$3:\n return new Ctor(object);\n case regexpTag$2:\n return cloneRegExp(object);\n case setTag$3:\n return new Ctor();\n case symbolTag$2:\n return cloneSymbol(object);\n }\n}\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = function () {\n function object() {}\n return function (proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object();\n object.prototype = undefined;\n return result;\n };\n}();\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return typeof object.constructor == 'function' && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};\n}\n\n/** `Object#toString` result references. */\nvar mapTag$4 = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag$1(value) == mapTag$4;\n}\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n/** `Object#toString` result references. */\nvar setTag$4 = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag$1(value) == setTag$4;\n}\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag$3 = '[object Arguments]',\n arrayTag$2 = '[object Array]',\n boolTag$3 = '[object Boolean]',\n dateTag$3 = '[object Date]',\n errorTag$2 = '[object Error]',\n funcTag$2 = '[object Function]',\n genTag$1 = '[object GeneratorFunction]',\n mapTag$5 = '[object Map]',\n numberTag$3 = '[object Number]',\n objectTag$3 = '[object Object]',\n regexpTag$3 = '[object RegExp]',\n setTag$5 = '[object Set]',\n stringTag$4 = '[object String]',\n symbolTag$3 = '[object Symbol]',\n weakMapTag$2 = '[object WeakMap]';\nvar arrayBufferTag$3 = '[object ArrayBuffer]',\n dataViewTag$4 = '[object DataView]',\n float32Tag$2 = '[object Float32Array]',\n float64Tag$2 = '[object Float64Array]',\n int8Tag$2 = '[object Int8Array]',\n int16Tag$2 = '[object Int16Array]',\n int32Tag$2 = '[object Int32Array]',\n uint8Tag$2 = '[object Uint8Array]',\n uint8ClampedTag$2 = '[object Uint8ClampedArray]',\n uint16Tag$2 = '[object Uint16Array]',\n uint32Tag$2 = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag$3] = cloneableTags[arrayTag$2] = cloneableTags[arrayBufferTag$3] = cloneableTags[dataViewTag$4] = cloneableTags[boolTag$3] = cloneableTags[dateTag$3] = cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] = cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] = cloneableTags[int32Tag$2] = cloneableTags[mapTag$5] = cloneableTags[numberTag$3] = cloneableTags[objectTag$3] = cloneableTags[regexpTag$3] = cloneableTags[setTag$5] = cloneableTags[stringTag$4] = cloneableTags[symbolTag$3] = cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] = cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;\ncloneableTags[errorTag$2] = cloneableTags[funcTag$2] = cloneableTags[weakMapTag$2] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray$1(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag$1(value),\n isFunc = tag == funcTag$2 || tag == genTag$1;\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag$3 || tag == argsTag$3 || isFunc && !object) {\n result = isFlat || isFunc ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack());\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n if (isSet(value)) {\n value.forEach(function (subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function (subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys$1;\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function (subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG$1 = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG$1);\n}\n\n/** Built-in value references. */\nvar spreadableSymbol = _Symbol ? _Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray$1(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n predicate || (predicate = isFlattenable);\n result || (result = []);\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) {\n return 1;\n }\n if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));\n var result = baseMap(collection, function (value, key, collection) {\n var criteria = arrayMap(iteratees, function (iteratee) {\n return iteratee(value);\n });\n return {\n 'criteria': criteria,\n 'index': ++index,\n 'value': value\n };\n });\n return baseSortBy(result, function (object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = _typeof$1(index);\n if (type == 'number' ? isArrayLike(object) && isIndex(index, object.length) : type == 'string' && index in object) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\nvar sortBy = baseRest(function (collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\nvar CaptionCollection = function CaptionCollection(params) {\n var _captions = [];\n var _activeLanguageIdentifier = LanguageIdentifier$1.create(languageIdentifiers.identifiers[\"default\"]);\n var _captionLanguages = {};\n var addCaptionFromLanguageCodeCache = function addCaptionFromLanguageCodeCache(caption) {\n caption.getAvailableLanguages().forEach(function (language) {\n if (!_captionLanguages[language]) {\n _captionLanguages[language] = 1;\n } else {\n _captionLanguages[language]++;\n }\n });\n };\n var removeCaptionFromLanguageCodeCache = function removeCaptionFromLanguageCodeCache(caption) {\n caption.getAvailableLanguages().forEach(function (language) {\n if (_captionLanguages[language]) {\n _captionLanguages[language]--;\n }\n if (_captionLanguages[language] === 0) {\n delete _captionLanguages[language];\n }\n });\n };\n var addCaption = function addCaption(caption) {\n addCaptionFromLanguageCodeCache(caption);\n caption.activeLanguageIdentifier = _activeLanguageIdentifier;\n var index = sortedIndexBy(_captions, caption, 'startTime');\n _captions.splice(index, 0, caption);\n return UndoAction$1.create(removeCaption, caption, addCaption, caption);\n };\n var removeCaption = function removeCaption(caption) {\n removeCaptionFromLanguageCodeCache(caption);\n var index = findIndex(_captions, caption);\n if (index !== -1) {\n _captions.splice(index, 1);\n return UndoAction$1.create(addCaption, caption, removeCaption, caption);\n }\n return UndoAction$1.noOp();\n };\n var setCaptions = function setCaptions(captions) {\n _captions = captions;\n _captionLanguages = [];\n _captions.forEach(function (caption) {\n addCaptionFromLanguageCodeCache(caption);\n });\n };\n var mergeCaptions = function mergeCaptions(captionsToMerge) {\n captionsToMerge.forEach(function (captionToMerge) {\n var matchingCaption = find(_captions, function (existingCaption) {\n return existingCaption.startTime === captionToMerge.startTime;\n });\n if (matchingCaption) {\n addCaptionFromLanguageCodeCache(captionToMerge);\n captionToMerge.captionTextList.forEach(function (captionText) {\n matchingCaption.addOrReplaceCaptionText(captionText);\n });\n }\n });\n };\n var clear = function clear() {\n var captionsClone = clone(_captions);\n _captions = [];\n _captionLanguages = [];\n return UndoAction$1.create(setCaptions, captionsClone, setCaptions, []);\n };\n var getAvailableLanguages = function getAvailableLanguages() {\n return Object.keys(_captionLanguages);\n };\n var setActiveLanguageIdentifier = function setActiveLanguageIdentifier(languageIdentifierString) {\n if (!languageIdentifiers.isSupportedLanguage(languageIdentifierString)) {\n languageIdentifierString = languageIdentifiers.identifiers[\"default\"];\n }\n var languageIdentifier = LanguageIdentifier$1.create(languageIdentifierString);\n var previousActiveLanguageIdentifierString = _activeLanguageIdentifier.identifier;\n _activeLanguageIdentifier = languageIdentifier;\n forEach(_captions, function (caption) {\n caption.activeLanguageIdentifier = languageIdentifier;\n });\n return UndoAction$1.create(setActiveLanguageIdentifier, previousActiveLanguageIdentifierString, setActiveLanguageIdentifier, languageIdentifierString);\n };\n var getActiveLanguageIdentifier = function getActiveLanguageIdentifier() {\n return _activeLanguageIdentifier;\n };\n if (params) {\n if (params.hasOwnProperty('captions') && isArray$1(params.captions)) {\n _captions = sortBy(params.captions, ['startTime']);\n _captions.forEach(function (caption) {\n addCaptionFromLanguageCodeCache(caption);\n });\n } else {\n throw new Error('CaptionCollection params is expecting an object eg. { captions: [caption1Object, ...] }');\n }\n }\n var _public = Object.defineProperties({}, {\n captions: {\n get: function get() {\n return _captions;\n }\n }\n });\n _public.setActiveLanguageIdentifier = setActiveLanguageIdentifier;\n _public.getActiveLanguageIdentifier = getActiveLanguageIdentifier;\n _public.getAvailableLanguages = getAvailableLanguages;\n _public.addCaption = addCaption;\n _public.removeCaption = removeCaption;\n _public.mergeCaptions = mergeCaptions;\n _public.clear = clear;\n _public.toPOJO = function () {\n return {\n captions: _captions\n };\n };\n return _public;\n};\n\n/** @module CaptionCollection */\nvar CaptionCollection$1 = {\n /**\n * Factory method that returns a new CaptionCollection object.\n * @function create\n * @param {Object} params - Optional params for caption\n * @param {Array} [params.captions] - array containing {module:Caption} objects.\n * @static\n * @return {module:CaptionCollection} new CaptionCollection instance\n */\n create: function create(params) {\n return CaptionCollection(params);\n }\n};\nvar _defaults$1 = Object.freeze({\n fontFamily: 'Arial, Helvetica, sans-serif;',\n fontSize: 24,\n fgColor: tinycolor$1({\n r: 255,\n g: 255,\n b: 255\n }),\n bgColor: tinycolor$1({\n r: 0,\n g: 0,\n b: 0,\n a: 0.9\n })\n});\nvar CaptionTrack = function CaptionTrack(params) {\n params = params || {};\n var _languageIdentifier = params.languageIdentifierString ? LanguageIdentifier$1.create(params.languageIdentifierString) : LanguageIdentifier$1.create(languageIdentifiers.identifiers[\"default\"]);\n var _fgColor = params.fgColor ? tinycolor$1(params.fgColor) : _defaults$1.fgColor.clone();\n var _bgColor = params.bgColor ? tinycolor$1(params.bgColor) : _defaults$1.bgColor.clone();\n var _fontFamily = params.fontFamily ? params.fontFamily : _defaults$1.fontFamily;\n var _fontSize = parseFontSize(params, _defaults$1.fontSize);\n var _position = params.position ? params.position : undefined;\n var _barHeight = params.barHeight ? params.barHeight : undefined;\n var _captionCollection = params.captions ? CaptionCollection$1.create({\n captions: params.captions\n }) : CaptionCollection$1.create();\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:trackType': 'Caption',\n 'xmpDM:frameRate': 'f1000',\n 'xmpDM:trackName': 'Captioning',\n 'stFnt:fontFamily': _fontFamily,\n 'tscDM:fontSize': _fontSize,\n 'tscDM:bgOpacity': _bgColor.getAlpha(),\n 'tscDM:position': _position,\n 'tscDM:captionbarheight': _barHeight\n },\n children: [{\n name: 'xmpDM:markers',\n children: [{\n name: 'rdf:Seq',\n children: _captionCollection.captions\n }]\n }, {\n name: 'tsc:fgColor',\n atts: attsFromColor(_fgColor.toRgb())\n }, {\n name: 'tsc:bgColor',\n atts: attsFromColor(_bgColor.toRgb())\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var attsFromColor = function attsFromColor(color) {\n return {\n 'xmpG:red': color.r,\n 'xmpG:green': color.g,\n 'xmpG:blue': color.b,\n 'xmpG:mode': 'RGB'\n };\n };\n var tinycolorToSimpleRgb = function tinycolorToSimpleRgb(tinycolorObj) {\n var rgbaColorObj = tinycolorObj.toRgb();\n return {\n r: rgbaColorObj.r,\n g: rgbaColorObj.g,\n b: rgbaColorObj.b\n };\n };\n var _public = Object.defineProperties({}, {\n languageIdentifier: {\n get: function get() {\n return _languageIdentifier;\n }\n },\n fgColor: {\n get: function get() {\n return tinycolorToSimpleRgb(_fgColor);\n }\n },\n fgHexColor: {\n get: function get() {\n return _fgColor.toHexString();\n }\n },\n bgColor: {\n get: function get() {\n return tinycolorToSimpleRgb(_bgColor);\n }\n },\n bgOpacity: {\n get: function get() {\n return _bgColor.getAlpha();\n }\n },\n bgHexColor: {\n get: function get() {\n return _bgColor.toHexString();\n }\n },\n bgRGBACssColor: {\n get: function get() {\n return _bgColor.toRgbString();\n }\n },\n fontFamily: {\n get: function get() {\n return _fontFamily;\n }\n },\n fontSize: {\n get: function get() {\n return _fontSize;\n }\n },\n position: {\n get: function get() {\n return _position;\n }\n },\n barHeight: {\n get: function get() {\n return _barHeight;\n }\n },\n captionCollection: {\n get: function get() {\n return _captionCollection;\n }\n }\n });\n _public.setActiveLanguageIdentifier = _captionCollection.setActiveLanguageIdentifier;\n _public.getActiveLanguageIdentifier = _captionCollection.getActiveLanguageIdentifier;\n _public.getAvailableLanguages = _captionCollection.getAvailableLanguages;\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n fgColor: _fgColor.toRgb(),\n bgColor: _bgColor.toRgb(),\n bgOpacity: _bgColor.getAlpha(),\n fontFamily: _fontFamily,\n fontSize: _fontSize,\n position: _position,\n barHeight: _barHeight,\n captions: invokeMap(_captionCollection.captions, 'toPOJO')\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n return pojo;\n };\n return _public;\n};\nvar getRGBColor = function getRGBColor(element) {\n return {\n r: Number(element.getAttribute('xmpG:red')),\n g: Number(element.getAttribute('xmpG:green')),\n b: Number(element.getAttribute('xmpG:blue'))\n };\n};\nvar parseFontSize = function parseFontSize(params, defaultFontSize) {\n if (!params.fontSize) {\n return defaultFontSize;\n }\n var parsedFontSize = +params.fontSize;\n if (isString(params.fontSize)) {\n parsedFontSize = +params.fontSize.replace('px', '').replace('pt', '');\n }\n return parsedFontSize ? parsedFontSize : defaultFontSize;\n};\nvar createFromXmpElement$2 = function createFromXmpElement$2(captionTrackElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var captionTrack = new CaptionTrack();\n if (captionTrackElement) {\n var fgColorElement = _xmlUtility.getFirstElementByTagNameNSPrefix(captionTrackElement, 'tsc:fgColor');\n var bgColorElement = _xmlUtility.getFirstElementByTagNameNSPrefix(captionTrackElement, 'tsc:bgColor');\n var captionElements = _xmlUtility.getElementsByTagNameNSPrefix(captionTrackElement, 'rdf:Description');\n var captions = map(captionElements, Caption$1.createFromXmpElement);\n var params = {\n fgColor: getRGBColor(fgColorElement),\n bgColor: getRGBColor(bgColorElement),\n fontFamily: captionTrackElement.getAttribute('stFnt:fontFamily'),\n fontSize: Number(captionTrackElement.getAttribute('tscDM:fontSize')),\n position: captionTrackElement.getAttribute('tscDM:position'),\n barHeight: Number(captionTrackElement.getAttribute('tscDM:captionbarheight')),\n captions: captions\n };\n params.bgColor.a = !isNil(captionTrackElement.getAttribute('tscDM:bgOpacity')) ? Number(captionTrackElement.getAttribute('tscDM:bgOpacity')) : _defaults$1.bgColor.getAlpha();\n captionTrack = new CaptionTrack(params);\n }\n return captionTrack;\n};\n\n/** @module CaptionTrack */\nvar CaptionTrack$1 = {\n /**\n * Factory method that returns a new CaptionTrack object.\n * @function create\n * @param {Object} params - Optional params for caption track\n * @param {String} [params.languageIdentifierString] - Local identifier string for caption track\n * @param {Object} [params.fgColor] - RGB values for foreground color.\n * @param {Number} [params.bgOpacity] - Opacity of background.\n * @param {String} [params.fontFamily] - Font family for caption track.\n * @param {String} [params.fontSize] - Font size for caption track.\n * @param {String} [params.position] - Position for caption track.\n * @param {String} [params.barHeight] - Bar height for caption track.\n * @static\n * @return {module:CaptionTrack} new CaptionTrack instance\n */\n create: function create(params) {\n return CaptionTrack(params);\n },\n /**\n * Factory method that returns a new CaptionTrack object from an XMP caption track element.\n * @function createFromXmpElement\n * @param {Object} element - XMP caption track element.\n * @static\n * @return {module:CaptionTrack} new CaptionTrack instance\n */\n createFromXmpElement: createFromXmpElement$2\n};\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray$1(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate));\n}\nvar CaptionController$2 = function CaptionController() {\n var _activeLanguageIdentifier = LanguageIdentifier$1.create(languageIdentifiers.identifiers[\"default\"]);\n var _activeCaptionTrack = null;\n var _captionTracks = [];\n var _captionLanguages = {};\n var storeCaptionLanguage = function storeCaptionLanguage(languageIdentifier) {\n _captionLanguages[languageIdentifier.identifier] = languageIdentifier.identifier;\n };\n var removeCaptionLanguage = function removeCaptionLanguage(languageIdentifier) {\n if (_captionLanguages[languageIdentifier.identifier]) {\n delete _captionLanguages[languageIdentifier.identifier];\n }\n };\n var getAvailableLanguages = function getAvailableLanguages() {\n return Object.keys(_captionLanguages);\n };\n var cacheActiveCaptionTrack = function cacheActiveCaptionTrack() {\n if (_captionTracks.length === 0) {\n _activeCaptionTrack = null;\n return;\n }\n if (_activeLanguageIdentifier.identifier === languageIdentifiers.identifiers[\"default\"]) {\n _activeCaptionTrack = _captionTracks[0];\n }\n var preferredCaptionTrack = find(_captionTracks, function (captionTrack) {\n return captionTrack.languageIdentifier.identifier === _activeLanguageIdentifier.identifier;\n });\n if (preferredCaptionTrack) {\n _activeCaptionTrack = preferredCaptionTrack;\n } else {\n _activeCaptionTrack = _captionTracks[0];\n }\n };\n var setActiveLanguageIdentifier = function setActiveLanguageIdentifier(languageIdentifierString) {\n if (!languageIdentifiers.isSupportedLanguage(languageIdentifierString)) {\n languageIdentifierString = languageIdentifiers.identifiers[\"default\"];\n }\n var previousLanguageIdentifierString = _activeLanguageIdentifier.identifier;\n _activeLanguageIdentifier = LanguageIdentifier$1.create(languageIdentifierString);\n cacheActiveCaptionTrack();\n return UndoAction$1.create(setActiveLanguageIdentifier, previousLanguageIdentifierString, setActiveLanguageIdentifier, languageIdentifierString);\n };\n var getActiveLanguageIdentifier = function getActiveLanguageIdentifier() {\n return _activeLanguageIdentifier;\n };\n var doesCaptionTrackExistForLanguageIdentifier = function doesCaptionTrackExistForLanguageIdentifier(languageIdentifier) {\n return _captionTracks.some(function (captionTrack) {\n return captionTrack.languageIdentifier.identifier === languageIdentifier.identifier;\n });\n };\n var addCaptionTrack = function addCaptionTrack(captionTrack) {\n if (doesCaptionTrackExistForLanguageIdentifier(captionTrack.languageIdentifier)) {\n throw new Error('CaptionController::addCaptionTrack - Caption track already exist for the ', captionTrack.languageIdentifier.identifier, ' langauge identifier.');\n }\n storeCaptionLanguage(captionTrack.languageIdentifier);\n _captionTracks.push(captionTrack);\n cacheActiveCaptionTrack();\n return UndoAction$1.create(removeCaptionTrack, captionTrack, addCaptionTrack, captionTrack);\n };\n var removeCaptionTrack = function removeCaptionTrack(captionTrackToRemove) {\n var removedCaptionTracks = remove(_captionTracks, function (captionTrack) {\n return captionTrack.languageIdentifier.identifier === captionTrackToRemove.languageIdentifier.identifier;\n });\n var removedCaptionTrack = removedCaptionTracks.length > 0 ? removedCaptionTracks[0] : undefined;\n if (removedCaptionTrack) {\n removeCaptionLanguage(removedCaptionTrack.languageIdentifier);\n cacheActiveCaptionTrack();\n }\n return UndoAction$1.create(addCaptionTrack, removedCaptionTrack, removeCaptionTrack, captionTrackToRemove);\n };\n var addCaptionTrackFromXmpElement = function addCaptionTrackFromXmpElement(captionTrackElement) {\n var parsedCaptionTrack = CaptionTrack$1.createFromXmpElement(captionTrackElement);\n var availableLanguages = parsedCaptionTrack.getAvailableLanguages();\n if (availableLanguages.length > 1) {\n availableLanguages.forEach(function (language) {\n var captionTrackParams = {\n languageIdentifierString: language,\n fgColor: parsedCaptionTrack.fgColor,\n bgColor: parsedCaptionTrack.bgColor,\n bgOpacity: parsedCaptionTrack.bgOpacity,\n fontFamily: parsedCaptionTrack.fontFamily,\n fontSize: parsedCaptionTrack.fontSize,\n position: parsedCaptionTrack.position,\n barHeight: parsedCaptionTrack.barHeight\n };\n var captionTrack = CaptionTrack$1.create(captionTrackParams);\n parsedCaptionTrack.captionCollection.captions.forEach(function (caption) {\n var filteredCaptionTextList = filter(caption.captionTextList, function (captionText) {\n return captionText.languageIdentifier.identifier === language;\n });\n var captionParams = {\n startTime: caption.startTime,\n duration: caption.duration,\n captionTextList: filteredCaptionTextList\n };\n if (caption.horizontalAlignment) {\n captionParams.horizontalAlignment = caption.horizontalAlignment;\n }\n if (caption.verticalAlignment) {\n captionParams.verticalAlignment = caption.verticalAlignment;\n }\n if (caption.file) {\n captionParams.file = caption.file;\n }\n if (caption.image) {\n captionParams.image = caption.image;\n }\n if (caption.imageIndex) {\n captionParams.imageIndex = caption.imageIndex;\n }\n if (caption.imageOffset) {\n captionParams.imageOffset = caption.imageOffset;\n }\n if (caption.imageRectangle) {\n captionParams.imageRectangle = caption.imageRectangle;\n }\n var newCaption = Caption$1.create(captionParams);\n captionTrack.captionCollection.addCaption(newCaption);\n });\n addCaptionTrack(captionTrack);\n });\n } else {\n addCaptionTrack(parsedCaptionTrack);\n }\n };\n var getMergedCaptionTrack = function getMergedCaptionTrack() {\n var captionTrackParams = {\n languageIdentifierString: _activeCaptionTrack ? _activeCaptionTrack.languageIdentifierString : undefined,\n fgColor: _activeCaptionTrack ? _activeCaptionTrack.fgColor : undefined,\n bgOpacity: _activeCaptionTrack ? _activeCaptionTrack.bgOpacity : undefined,\n fontFamily: _activeCaptionTrack ? _activeCaptionTrack.fontFamily : undefined,\n fontSize: _activeCaptionTrack ? _activeCaptionTrack.fontSize : undefined,\n position: _activeCaptionTrack ? _activeCaptionTrack.position : undefined,\n barHeight: _activeCaptionTrack ? _activeCaptionTrack.barHeight : undefined\n };\n var mergedCaptionTrack = CaptionTrack$1.create(captionTrackParams);\n _captionTracks.forEach(function (captionTrack) {\n mergedCaptionTrack.captionCollection.mergeCaptions(captionTrack.captionCollection.captions);\n });\n return mergedCaptionTrack;\n };\n var toXmp = function toXmp() {\n return getMergedCaptionTrack().toXmp();\n };\n var toPOJO = function toPOJO() {\n return getMergedCaptionTrack().toPOJO();\n };\n var getActiveCaptionTrack = function getActiveCaptionTrack() {\n return _activeCaptionTrack;\n };\n var clearCaptions = function clearCaptions() {\n _captionTracks = [];\n _captionLanguages = {};\n _activeLanguageIdentifier = LanguageIdentifier$1.create(languageIdentifiers.identifiers[\"default\"]);\n _activeCaptionTrack = null;\n };\n var activeCaptionTrackIsDefinedWithCaptions = function activeCaptionTrackIsDefinedWithCaptions() {\n return _activeCaptionTrack !== null && _activeCaptionTrack.captionCollection.captions.length > 0;\n };\n var getActiveCaptionsTocThumbnailImage = function getActiveCaptionsTocThumbnailImage() {\n return activeCaptionTrackIsDefinedWithCaptions() ? _activeCaptionTrack.captionCollection.captions[0].image : null;\n };\n var _public = Object.defineProperties({}, {\n activeCaptionTrack: {\n get: getActiveCaptionTrack\n },\n numberCaptionTracks: {\n get: function get() {\n return _captionTracks.length;\n }\n },\n containsCaptions: {\n get: activeCaptionTrackIsDefinedWithCaptions\n },\n captionsContainsTocThumbnails: {\n get: function get() {\n return activeCaptionTrackIsDefinedWithCaptions() && _activeCaptionTrack.captionCollection.captions[0].image !== undefined;\n }\n }\n });\n _public.setActiveLanguageIdentifier = setActiveLanguageIdentifier;\n _public.getActiveLanguageIdentifier = getActiveLanguageIdentifier;\n _public.clearCaptions = clearCaptions;\n _public.addCaptionTrackFromXmpElement = addCaptionTrackFromXmpElement;\n _public.addCaptionTrack = addCaptionTrack;\n _public.removeCaptionTrack = removeCaptionTrack;\n _public.getAvailableLanguages = getAvailableLanguages;\n _public.getActiveCaptionsTocThumbnailImage = getActiveCaptionsTocThumbnailImage;\n _public.toXmp = toXmp;\n _public.toPOJO = toPOJO;\n return _public;\n};\n\n/** @module CaptionController */\nvar CaptionController$1$1 = {\n /**\n * Factory method that returns a new CaptionController object.\n * @function create\n * @static\n * @return {module:CaptionController} new CaptionController instance\n */\n create: function create() {\n return CaptionController$2();\n }\n};\nvar TableOfContentsItem = function TableOfContentsItem(params) {\n var _name;\n var _startTime;\n var _image;\n var _imageIndex;\n var _imageOffset;\n var _imageRectangle;\n var _file;\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'name') {\n _name = params.name;\n } else if (key === 'startTime') {\n _startTime = params.startTime;\n } else if (key === 'image') {\n _image = params.image;\n } else if (key === 'imageIndex') {\n _imageIndex = params.imageIndex;\n } else if (key === 'imageOffset') {\n _imageOffset = params.imageOffset;\n } else if (key === 'imageRectangle') {\n _imageRectangle = params.imageRectangle;\n } else if (key === 'file') {\n _file = params.file;\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:name': _name,\n 'xmpDM:startTime': _startTime,\n 'tscDM:image': _image,\n 'tscDM:imageindex': _imageIndex,\n 'tscDM:imageoffset': _imageOffset,\n 'tscDM:imagerect': _imageRectangle ? _imageRectangle.toXmpAtt() : null,\n 'tscDM:file': _file\n }\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n name: {\n get: function get() {\n return _name;\n }\n },\n startTime: {\n get: function get() {\n return _startTime;\n }\n },\n image: {\n get: function get() {\n return _image;\n }\n },\n imageIndex: {\n get: function get() {\n return _imageIndex;\n }\n },\n imageOffset: {\n get: function get() {\n return _imageOffset;\n }\n },\n imageRectangle: {\n get: function get() {\n return _imageRectangle;\n }\n },\n file: {\n get: function get() {\n return _file;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n name: _name,\n startTime: _startTime,\n image: _image,\n imageIndex: _imageIndex,\n imageOffset: _imageOffset,\n imageRectangle: _imageRectangle ? _imageRectangle.toPOJO() : undefined,\n file: _file\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$3 = function createFromXmpElement$3(tableOfContentsItemElement) {\n var params = {\n name: tableOfContentsItemElement.getAttribute('xmpDM:name'),\n startTime: Number(tableOfContentsItemElement.getAttribute('xmpDM:startTime'))\n };\n\n // optional attributes below\n\n params.image = tableOfContentsItemElement.getAttribute('tscDM:image') || undefined;\n if (tableOfContentsItemElement.getAttribute('tscDM:imageindex')) {\n params.imageIndex = Number(tableOfContentsItemElement.getAttribute('tscDM:imageindex'));\n }\n if (tableOfContentsItemElement.getAttribute('tscDM:imageoffset')) {\n params.imageOffset = Number(tableOfContentsItemElement.getAttribute('tscDM:imageoffset'));\n }\n params.file = tableOfContentsItemElement.getAttribute('tscDM:file') || undefined;\n if (tableOfContentsItemElement.getAttribute('tscDM:imagerect')) {\n params.imageRectangle = ImageRectangle$1.create(tableOfContentsItemElement.getAttribute('tscDM:imagerect'));\n }\n return new TableOfContentsItem(params);\n};\n\n/** @module TableOfContentsItem */\nvar TableOfContentsItem$1 = {\n /**\n * Factory method that returns a new TableOfContentsItem object.\n * @function create\n * @param {Object} params - Required params for table of contents item\n * @param {String} [params.name] - Table of contents item name.\n * @param {Number} [params.startTime] - Start time of table of contents item (milliseconds).\n * @param {String} [params.image] - Table of contents item image.\n * @param {Number} [params.imageIndex] - Table of contents item image index.\n * @param {Number} [params.imageOffset] - Table of contents item image offset.\n * @param {module:ImageRectangle} [params.imageRectangle] - Table of contents item image rectangle.\n * @param {String} [params.file] - File string associated with toc item.\n * @static\n * @return {module:TableOfContentsItem} new TableOfContentsItem instance\n */\n create: function create(params) {\n return TableOfContentsItem(params);\n },\n /**\n * Factory method that returns a new TableOfContentsItem object from an XMP tableOfContentsItem element.\n * @function createFromXmpElement\n * @param {Object} element - XMP tableOfContentsItem element.\n * @static\n * @return {module:TableOfContentsItem} new TableOfContentsItem instance\n */\n createFromXmpElement: createFromXmpElement$3\n};\nvar TableOfContentsTrack = function TableOfContentsTrack(params) {\n var _items = [];\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n if (params.hasOwnProperty('items') && isArray$1(params.items)) {\n _items = params.items;\n } else {\n throw new Error('TableOfContentsTrack params is expecting an object eg. { items: [item1Object, ...] }');\n }\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:trackType': 'TableOfContents',\n 'xmpDM:trackName': 'Table of Contents',\n 'xmpDM:frameRate': 'f1000',\n 'tscDM:image': params ? params.image : undefined,\n 'tscDM:tocCellLayout': params ? params.cellLayout : undefined\n },\n children: [{\n name: 'xmpDM:markers',\n children: [{\n name: 'rdf:Seq',\n children: _items\n }]\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n image: {\n get: function get() {\n return params.image;\n }\n },\n cellLayout: {\n get: function get() {\n return params.cellLayout;\n }\n },\n items: {\n get: function get() {\n return _items;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n image: params.image,\n cellLayout: params.cellLayout,\n items: invokeMap(_items, 'toPOJO')\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$4 = function createFromXmpElement$4(tableOfContentsTrackElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var tableOfContentsTrack = new TableOfContentsTrack();\n if (tableOfContentsTrackElement) {\n var tableOfContentsItemElements = _xmlUtility.getElementsByTagNameNSPrefix(tableOfContentsTrackElement, 'rdf:Description');\n var image = tableOfContentsTrackElement.getAttribute('tscDM:image');\n var cellLayout = tableOfContentsTrackElement.getAttribute('tscDM:tocCellLayout');\n var items = map(tableOfContentsItemElements, TableOfContentsItem$1.createFromXmpElement);\n var params = {\n image: image,\n cellLayout: cellLayout,\n items: items\n };\n tableOfContentsTrack = new TableOfContentsTrack(params);\n }\n return tableOfContentsTrack;\n};\n\n/** @module TableOfContentsTrack */\nvar TableOfContentsTrack$1 = {\n /**\n * Factory method that returns a new TableOfContentsTrack object.\n * @function create\n * @param {Object} params - Optional params for table of contents track\n * @param {module:TableOfContentsItem[]} [params.items] - Array of table of content items.\n * @static\n * @return {module:TableOfContentsTrack} new TableOfContentsTrack instance\n */\n create: function create(params) {\n return TableOfContentsTrack(params);\n },\n /**\n * Factory method that returns a new TableOfContentsTrack object from an XMP table of contents track element.\n * @function createFromXmpElement\n * @param {Object} element - XMP table of contents track element.\n * @static\n * @return {module:TableOfContentsTrack} new TableOfContentsTrack instance\n */\n createFromXmpElement: createFromXmpElement$4\n};\n\n/**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\nfunction compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\nvar BoundingPoly = function BoundingPoly(coordinatesString) {\n var _coordinates = [];\n var createCoordinate = function createCoordinate(coordinateString) {\n var tokens = coordinateString.split(',');\n return {\n x: Number(tokens[0]),\n y: Number(tokens[1])\n };\n };\n if (coordinatesString && isString(coordinatesString)) {\n var coordinateTokens = compact(coordinatesString.split(';'));\n _coordinates = map(coordinateTokens, createCoordinate);\n } else {\n throw new Error('BoundingPoly is expecting a coordinate string eg. \"0,94;111,90;112,191;0,194;\"');\n }\n var _public = Object.defineProperties({}, {\n coordinates: {\n get: function get() {\n return _coordinates;\n }\n }\n });\n _public.toPOJO = function () {\n return {\n coordinates: _coordinates\n };\n };\n _public.toXmpAtt = function () {\n return map(_coordinates, function (coord) {\n return coord.x + ',' + coord.y;\n }).join(';') + ';';\n };\n return _public;\n};\n\n/** @module BoundingPoly */\nvar BoundingPoly$1 = {\n /**\n * Factory method that returns a new BoundingPoly object.\n * @function create\n * @param {String} coordinatesString - Required coordinate string of the bounding poly eg. \"0,94;111,90;112,191;0,194;\"\n * @static\n * @return {module:BoundingPoly} new BoundingPoly instance\n */\n create: function create(coordinatesString) {\n return BoundingPoly(coordinatesString);\n }\n};\nvar Hotspot = function Hotspot(params) {\n var _label;\n var _startTime;\n var _duration;\n var _boundingPoly;\n var _rotate;\n var _pause;\n var _jumpTime;\n var _location;\n var _newWindow;\n var _jumpFile;\n var _file;\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'label') {\n _label = params.label;\n } else if (key === 'startTime') {\n _startTime = params.startTime;\n } else if (key === 'duration') {\n _duration = params.duration;\n } else if (key === 'boundingPoly') {\n _boundingPoly = params.boundingPoly;\n } else if (key === 'rotate') {\n _rotate = params.rotate;\n } else if (key === 'pause') {\n _pause = params.pause;\n } else if (key === 'jumpTime') {\n _jumpTime = params.jumpTime;\n } else if (key === 'location') {\n _location = params.location;\n } else if (key === 'newWindow') {\n _newWindow = params.newWindow;\n } else if (key === 'jumpFile') {\n _jumpFile = params.jumpFile;\n } else if (key === 'file') {\n _file = params.file;\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:label': _label,\n 'xmpDM:duration': _duration,\n 'xmpDM:startTime': _startTime,\n 'tscDM:boundingPoly': _boundingPoly ? _boundingPoly.toXmpAtt() : undefined,\n 'tscDM:rotate': _rotate,\n 'tscHS:pause': _pause ? '1' : '0',\n 'tscHS:jumpTime': _jumpTime,\n 'tscHS:jumpFile': _jumpFile,\n 'xmpDM:location': _location,\n 'tscDM:file': _file,\n 'tscHS:newWindow': _newWindow ? '1' : '0'\n }\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n label: {\n get: function get() {\n return _label;\n }\n },\n startTime: {\n get: function get() {\n return _startTime;\n }\n },\n endTime: {\n get: function get() {\n return _startTime + _duration;\n }\n },\n duration: {\n get: function get() {\n return _duration;\n }\n },\n boundingPoly: {\n get: function get() {\n return _boundingPoly;\n }\n },\n rotate: {\n get: function get() {\n return _rotate;\n }\n },\n pause: {\n get: function get() {\n return _pause;\n }\n },\n jumpTime: {\n get: function get() {\n return _jumpTime;\n }\n },\n location: {\n get: function get() {\n return _location;\n }\n },\n newWindow: {\n get: function get() {\n return _newWindow;\n }\n },\n jumpFile: {\n get: function get() {\n return _jumpFile;\n }\n },\n file: {\n get: function get() {\n return _file;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n label: _label,\n startTime: _startTime,\n duration: _duration,\n boundingPoly: _boundingPoly,\n rotate: _rotate,\n pause: _pause,\n jumpTime: _jumpTime,\n location: _location,\n newWindow: _newWindow,\n jumpFile: _jumpFile,\n file: _file\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$5 = function createFromXmpElement$5(hotspotElement) {\n var params = {\n label: hotspotElement.getAttribute('xmp:label'),\n startTime: Number(hotspotElement.getAttribute('xmpDM:startTime')),\n duration: Number(hotspotElement.getAttribute('xmpDM:duration')),\n boundingPoly: BoundingPoly$1.create(hotspotElement.getAttribute('tscDM:boundingPoly')),\n rotate: Number(hotspotElement.getAttribute('tscDM:rotate')),\n pause: hotspotElement.getAttribute('tscHS:pause') === '1',\n newWindow: hotspotElement.getAttribute('tscHS:newWindow') === '1'\n };\n if (hotspotElement.getAttribute('tscHS:jumpTime')) {\n params.jumpTime = Number(hotspotElement.getAttribute('tscHS:jumpTime'));\n }\n params.jumpFile = hotspotElement.getAttribute('tscHS:jumpFile') || undefined;\n params.location = hotspotElement.getAttribute('xmpDM:location') || undefined;\n params.file = hotspotElement.getAttribute('tscDM:file') || undefined;\n return new Hotspot(params);\n};\n\n/** @module Hotspot */\nvar Hotspot$1 = {\n /**\n * Factory method that returns a new Hotspot object.\n * @function create\n * @param {Object} params - Required params for hotspot\n * @param {String} [params.label] - Hotspot label.\n * @param {Number} [params.startTime] - Start time of hotspot (milliseconds).\n * @param {Number} [params.duration] - Duration of hotspot (milliseconds).\n * @param {module:BoundingPoly} [params.boundingPoly] - Bounding polygon of hotspot.\n * @param {Number} [params.rotate] - Rotation value of polygon.\n * @param {Boolean} [params.pause] - Boolean if hotspot should pause at end.\n * @param {Number} [params.jumpTime] - Specific time within video that hotspot will jump to (milliseconds)\n * @param {Number} [params.jumpTime] - Specific time within video that hotspot will jump to (milliseconds)\n * @param {String} [params.location] - URL to launch for hotspot.\n * @param {Boolean} [params.newWindow] - True if the hotspot location should open in a new window.\n * @param {String} [params.jumpFile] - Url to file.\n * @param {String} [params.file] - Url to file.\n * @static\n * @return {module:Hotspot} new Hotspot instance\n */\n create: function create(params) {\n return Hotspot(params);\n },\n /**\n * Factory method that returns a new Hotspot object from an XMP hotspot element.\n * @function createFromXmpElement\n * @param {Object} element - XMP hotspot element.\n * @static\n * @return {module:Hotspot} new Hotspot instance\n */\n createFromXmpElement: createFromXmpElement$5\n};\nvar HotspotTrack = function HotspotTrack(params) {\n var _hotspots = [];\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n if (params.hasOwnProperty('hotspots') && isArray$1(params.hotspots)) {\n _hotspots = params.hotspots;\n } else {\n throw new Error('HotspotTrack params is expecting an object eg. { hotspots: [hotspot1Object, ...] }');\n }\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:trackType': 'Hotspot',\n 'xmpDM:trackName': 'Hotspots',\n 'xmpDM:frameRate': 'f1000'\n },\n children: [{\n name: 'xmpDM:markers',\n children: [{\n name: 'rdf:Seq',\n children: _hotspots\n }]\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n hotspots: {\n get: function get() {\n return _hotspots;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n hotspots: invokeMap(_hotspots, 'toPOJO')\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$6 = function createFromXmpElement$6(hotspotTrackElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var hotspotTrack = new HotspotTrack();\n if (hotspotTrackElement) {\n var hotspotElements = _xmlUtility.getElementsByTagNameNSPrefix(hotspotTrackElement, 'rdf:Description');\n var hotspots = map(hotspotElements, Hotspot$1.createFromXmpElement);\n var params = {\n hotspots: hotspots\n };\n hotspotTrack = new HotspotTrack(params);\n }\n return hotspotTrack;\n};\n\n/** @module HotspotTrack */\nvar HotspotTrack$1 = {\n /**\n * Factory method that returns a new HotspotTrack object.\n * @function create\n * @param {Object} params - Optional params for caption track\n * @param {module:Hotspot[]} [params.hotspots] - Array of hotspots.\n * @static\n * @return {module:HotspotTrack} new HotspotTrack instance\n */\n create: function create(params) {\n return HotspotTrack(params);\n },\n /**\n * Factory method that returns a new HotspotTrack object from an XMP hotspot track element.\n * @function create\n * @param {Object} element - XMP hotspot track element.\n * @static\n * @return {module:HotspotTrack} new HotspotTrack instance\n */\n createFromXmpElement: createFromXmpElement$6\n};\nvar Answer = function Answer(params) {\n var _orderId;\n var _text;\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'orderId') {\n _orderId = params.orderId;\n } else if (key === 'text') {\n _text = params.text;\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'tscIQ:orderId': _orderId\n },\n children: [{\n name: 'tscIQ:answer',\n text: _text\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n orderId: {\n get: function get() {\n return _orderId;\n }\n },\n text: {\n get: function get() {\n return _text;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n orderId: _orderId,\n text: _text\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$7 = function createFromXmpElement$7(answerElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var answerText = _xmlUtility.getFirstChildElementTextByTagNameNSPrefix(answerElement, 'tscIQ:answer');\n var params = {\n orderId: Number(answerElement.getAttribute('tscIQ:orderId')),\n text: answerText\n };\n return new Answer(params);\n};\n\n/** @module Answer */\nvar Answer$1 = {\n /**\n * Factory method that returns a new Answer object.\n * @function create\n * @param {Object} params - Required params for answer\n * @param {Number} [params.orderId] - Answer order id.\n * @param {String} [params.text] - Answer text.\n * @static\n * @return {module:Answer} new Answer instance\n */\n create: function create(params) {\n return Answer(params);\n },\n /**\n * Factory method that returns a new Answer object from an XMP answer element.\n * @function createFromXmpElement\n * @param {Object} element - XMP answer element.\n * @static\n * @return {module:Answer} new Answer instance\n */\n createFromXmpElement: createFromXmpElement$7\n};\nvar Feedback = function Feedback(params) {\n var _reason;\n var _jumpToTime;\n var _location;\n var _text;\n var _plainText;\n var _markupText;\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'reason') {\n _reason = params.reason;\n } else if (key === 'text') {\n _text = params.text;\n _plainText = Rtf.toText(_text);\n _markupText = Rtf.toHtml(_text);\n } else if (key === 'jumpToTime') {\n _jumpToTime = params.jumpToTime;\n } else if (key === 'location') {\n _location = params.location;\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'tscIQ:reason': _reason,\n 'tscIQ:jumpToTime': _jumpToTime,\n 'tscIQ:location': _location\n },\n children: [{\n name: 'xmpDM:name',\n children: [{\n name: 'rdf:Alt',\n // todo: according to the latest branch this is now a language collection of strings\n // for now i hardcoded a single english version to match the expected output\n children: [{\n name: 'rdf:li',\n atts: {\n 'xml:lang': 'en-US'\n },\n text: _text\n }]\n }]\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n reason: {\n get: function get() {\n return _reason;\n }\n },\n jumpToTime: {\n get: function get() {\n return _jumpToTime;\n }\n },\n location: {\n get: function get() {\n return _location;\n }\n },\n text: {\n get: function get() {\n return _text;\n }\n },\n plainText: {\n get: function get() {\n return _plainText;\n }\n },\n markupText: {\n get: function get() {\n return _markupText;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n reason: _reason,\n jumpToTime: _jumpToTime,\n location: _location,\n text: _text,\n plainText: _plainText,\n markupText: _markupText\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$8 = function createFromXmpElement$8(feedbackElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var feedbackText = _xmlUtility.getFirstChildElementTextByTagNameNSPrefix(feedbackElement, 'rdf:li');\n var params = {\n reason: feedbackElement.getAttribute('tscIQ:reason'),\n text: feedbackText\n };\n if (feedbackElement.getAttribute('tscIQ:jumpToTime')) {\n params.jumpToTime = Number(feedbackElement.getAttribute('tscIQ:jumpToTime'));\n }\n params.location = feedbackElement.getAttribute('tscIQ:location') || undefined;\n return Feedback(params);\n};\n\n/** @module Feedback */\nvar Feedback$1 = {\n /**\n * Factory method that returns a new Feedback object.\n * @function create\n * @param {Object} params - Required params for feedback\n * @param {String} [params.reason] - Feedback reason type.\n * @param {String} [params.text] - Feedback text.\n * @param {Number} [params.jumpToTime] - Feedback jumpToTime.\n * @param {String} [params.location] - Feedback location.\n * @static\n * @return {module:Feedback} new Feedback instance\n */\n create: function create(params) {\n return Feedback(params);\n },\n /**\n * Factory method that returns a new Feedback object from an XMP feedback element.\n * @function createFromXmpElement\n * @param {Object} element - XMP feedback element.\n * @static\n * @return {module:Feedback} new Feedback instance\n */\n createFromXmpElement: createFromXmpElement$8\n};\nvar Question$2 = function Question(params) {\n var _id;\n var _type;\n var _text;\n var _correctAnswer;\n var _answers = [];\n var _feedback = [];\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'id') {\n _id = params.id;\n } else if (key === 'type') {\n _type = params.type;\n } else if (key === 'text') {\n _text = params.text;\n } else if (key === 'correctAnswer') {\n _correctAnswer = params.correctAnswer;\n } else if (key === 'answers') {\n _answers = params.answers;\n } else if (key === 'feedback') {\n _feedback = params.feedback;\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'tscIQ:id': _id,\n 'tscIQ:type': _type\n },\n children: [{\n name: 'tscIQ:question',\n text: _text\n }, {\n name: 'tscIQ:correctAnswer',\n text: _type === 'MC' ? _correctAnswer : null\n }, {\n name: 'tscIQ:answerArray',\n children: [{\n name: 'rdf:Seq',\n children: _answers\n }]\n }, {\n name: 'tscIQ:feedback',\n children: [{\n name: 'rdf:Bag',\n children: _feedback\n }]\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n id: {\n get: function get() {\n return _id;\n }\n },\n type: {\n get: function get() {\n return _type;\n }\n },\n text: {\n get: function get() {\n return _text;\n }\n },\n correctAnswer: {\n get: function get() {\n return _correctAnswer;\n }\n },\n answers: {\n get: function get() {\n return _answers;\n }\n },\n feedback: {\n get: function get() {\n return _feedback;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n id: _id,\n type: _type,\n text: _text,\n correctAnswer: _correctAnswer,\n answers: invokeMap(_answers, 'toPOJO'),\n feedback: _feedback !== undefined ? invokeMap(_feedback, 'toPOJO') : undefined\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$9 = function createFromXmpElement$9(questionElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var text = _xmlUtility.getFirstChildElementTextByTagNameNSPrefix(questionElement, 'tscIQ:question');\n var correctAnswerText = _xmlUtility.getFirstChildElementTextByTagNameNSPrefix(questionElement, 'tscIQ:correctAnswer');\n var descriptionElements = _xmlUtility.getElementsByTagNameNSPrefix(questionElement, 'rdf:Description');\n var answerElements = filter(descriptionElements, function (element) {\n return _xmlUtility.hasAttribute(element, 'tscIQ:orderId');\n });\n var answers = map(answerElements, Answer$1.createFromXmpElement);\n var feedbackElements = filter(descriptionElements, function (element) {\n return _xmlUtility.hasAttribute(element, 'tscIQ:reason');\n });\n var feedback = map(feedbackElements, Feedback$1.createFromXmpElement);\n var params = {\n id: Number(questionElement.getAttribute('tscIQ:id')),\n type: questionElement.getAttribute('tscIQ:type'),\n text: text,\n correctAnswer: correctAnswerText ? Number(correctAnswerText) : undefined,\n answers: answers,\n feedback: feedback\n };\n return Question$2(params);\n};\n\n/** @module Question */\nvar Question$1$1 = {\n /**\n * Factory method that returns a new Question object.\n * @function create\n * @param {Object} params - Required params for question\n * @param {Number} [params.id] - Question id.\n * @param {String} [params.text] - Question text.\n * @param {Number} [params.correctAnswer] - Index of the correct answer within answer array (1 based).\n * @param {module:Answer[]} [params.answers] - Question answer array.\n * @param {module:Feedback[]} [params.feedback] - Question feedback array.\n * @static\n * @return {module:Question} new Question instance\n */\n create: function create(params) {\n return Question$2(params);\n },\n /**\n * Factory method that returns a new Question object from an XMP question element.\n * @function createFromXmpElement\n * @param {Object} element - XMP question element.\n * @static\n * @return {module:Question} new Question instance\n */\n createFromXmpElement: createFromXmpElement$9\n};\nvar QuestionSet$2 = function QuestionSet(params) {\n var _name;\n var _feedback;\n var _startTime;\n var _questions;\n var _file;\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'name') {\n _name = params.name;\n } else if (key === 'feedback') {\n _feedback = params.feedback;\n } else if (key === 'startTime') {\n _startTime = params.startTime;\n } else if (key === 'file') {\n _file = params.file;\n } else if (key === 'questions') {\n _questions = params.questions;\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'tscIQ:questionSetName': _name,\n 'tscIQ:feedback': _feedback ? '1' : '0',\n 'tscDM:file': _file,\n 'xmpDM:startTime': _startTime\n },\n children: [{\n name: 'tscIQ:questions',\n children: [{\n name: 'rdf:Seq',\n children: _questions\n }]\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n name: {\n get: function get() {\n return _name;\n }\n },\n feedback: {\n get: function get() {\n return _feedback;\n }\n },\n startTime: {\n get: function get() {\n return _startTime;\n }\n },\n file: {\n get: function get() {\n return _file;\n }\n },\n questions: {\n get: function get() {\n return _questions;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n name: _name,\n feedback: _feedback,\n startTime: _startTime,\n file: _file,\n questions: invokeMap(_questions, 'toPOJO')\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$a = function createFromXmpElement$a(questionSetElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var descriptionElements = _xmlUtility.getElementsByTagNameNSPrefix(questionSetElement, 'rdf:Description');\n var questionElements = filter(descriptionElements, function (element) {\n return _xmlUtility.hasAttribute(element, 'tscIQ:type');\n });\n var questions = map(questionElements, Question$1$1.createFromXmpElement);\n var params = {\n name: questionSetElement.getAttribute('tscIQ:questionSetName'),\n feedback: questionSetElement.getAttribute('tscIQ:feedback') === '1',\n startTime: Number(questionSetElement.getAttribute('xmpDM:startTime')),\n questions: questions\n };\n params.file = questionSetElement.getAttribute('tscDM:file') || undefined;\n return new QuestionSet$2(params);\n};\n\n/** @module QuestionSet */\nvar QuestionSet$1$1 = {\n /**\n * Factory method that returns a new QuestionSet object.\n * @function create\n * @param {Object} params - Required params for question set\n * @param {String} [params.questionsSetName] - Question set name.\n * @param {Boolean} [params.feedback] - Question set feedback.\n * @param {Number} [params.startTime] - Question set start time (milliseconds)\n * @param {String} [params.file] - Associated file\n * @param {module:Question[]} [params.questions] - Question set questions.\n * @static\n * @return {module:QuestionSet} new QuestionSet instance\n */\n create: function create(params) {\n return QuestionSet$2(params);\n },\n /**\n * Factory method that returns a new QuestionSet object from an XMP questionSet element.\n * @function createFromXmpElement\n * @param {Object} element - XMP questionSet element.\n * @static\n * @return {module:QuestionSet} new QuestionSet instance\n */\n createFromXmpElement: createFromXmpElement$a\n};\nvar QuizTrack = function QuizTrack(params) {\n var _quizGuid;\n var _authoredEmail;\n var _requireUserId;\n var _locale;\n var _reportMethod;\n var _clientId;\n var _quizHash;\n var _hideReplay;\n var _allowSkipQuiz;\n var _questionSets = [];\n var _parameters;\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'quizGuid') {\n _quizGuid = params.quizGuid;\n } else if (key === 'authoredEmail') {\n _authoredEmail = params.authoredEmail;\n } else if (key === 'requireUserId') {\n _requireUserId = params.requireUserId;\n } else if (key === 'locale') {\n _locale = params.locale;\n } else if (key === 'reportMethod') {\n _reportMethod = params.reportMethod;\n } else if (key === 'clientId') {\n _clientId = params.clientId;\n } else if (key === 'quizHash') {\n _quizHash = params.quizHash;\n } else if (key === 'hideReplay') {\n _hideReplay = params.hideReplay;\n } else if (key === 'allowSkipQuiz') {\n _allowSkipQuiz = params.allowSkipQuiz;\n } else if (key === 'parameters' && isArray$1(params.parameters)) {\n _parameters = params.parameters;\n } else if (key === 'questionSets' && isArray$1(params.questionSets)) {\n _questionSets = params.questionSets;\n }\n });\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:trackType': 'Quiz',\n 'xmpDM:trackName': 'Quiz',\n 'xmpDM:frameRate': 'f1000',\n 'tscIQ:clientId': _clientId,\n 'tscIQ:quizHash': _quizHash,\n 'tscIQ:quizGuid': _quizGuid,\n 'tscIQ:authoredEmail': _authoredEmail,\n 'tscIQ:requireUserId': _requireUserId ? '1' : '0',\n 'tscIQ:locale': _locale,\n 'tscIQ:reportMethod': _reportMethod,\n 'tscIQ:hideReplay': _hideReplay ? '1' : '0',\n 'tscIQ:allowSkipQuiz': _allowSkipQuiz ? '1' : '0'\n },\n children: [{\n name: 'xmpDM:markers',\n children: [{\n name: 'rdf:Seq',\n children: _questionSets\n }]\n }, {\n name: 'tscIQ:QuizParams',\n children: [{\n name: 'rdf:Bag',\n children: map(_parameters, function (param) {\n return {\n name: 'rdf:li',\n atts: {\n 'xmpDM:name': param.name,\n 'xmpDM:value': param.value\n }\n };\n })\n }]\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n quizGuid: {\n get: function get() {\n return _quizGuid;\n }\n },\n authoredEmail: {\n get: function get() {\n return _authoredEmail;\n }\n },\n requireUserId: {\n get: function get() {\n return _requireUserId;\n }\n },\n locale: {\n get: function get() {\n return _locale;\n }\n },\n reportMethod: {\n get: function get() {\n return _reportMethod;\n }\n },\n clientId: {\n get: function get() {\n return _clientId;\n }\n },\n quizHash: {\n get: function get() {\n return _quizHash;\n }\n },\n hideReplay: {\n get: function get() {\n return _hideReplay;\n }\n },\n allowSkipQuiz: {\n get: function get() {\n return _allowSkipQuiz;\n }\n },\n parameters: {\n get: function get() {\n return _parameters;\n }\n },\n questionSets: {\n get: function get() {\n return _questionSets;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n quizGuid: _quizGuid,\n authoredEmail: _authoredEmail,\n requireUserId: _requireUserId,\n locale: _locale,\n reportMethod: _reportMethod,\n clientId: _clientId,\n quizHash: _quizHash,\n hideReplay: _hideReplay,\n allowSkipQuiz: _allowSkipQuiz,\n questionSets: invokeMap(_questionSets, 'toPOJO'),\n parameters: _parameters || undefined\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n return pojo;\n };\n return _public;\n};\nvar parseParameter = function parseParameter(parameterElement) {\n return {\n name: parameterElement.getAttribute('xmpDM:name'),\n value: parameterElement.getAttribute('xmpDM:value')\n };\n};\nvar parseParameters = function parseParameters(quizParametersElement, xmlUtility) {\n if (quizParametersElement) {\n var parameterElements = xmlUtility.getElementsByTagNameNSPrefix(quizParametersElement, 'rdf:li');\n var parameters = map(parameterElements, parseParameter);\n return parameters;\n }\n return undefined;\n};\nvar createFromXmpElement$b = function createFromXmpElement$b(quizTrackElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var quizTrack = new QuizTrack();\n if (quizTrackElement) {\n var descriptionElements = _xmlUtility.getElementsByTagNameNSPrefix(quizTrackElement, 'rdf:Description');\n var questionSetElements = filter(descriptionElements, function (element) {\n return _xmlUtility.hasAttribute(element, 'tscIQ:questionSetName');\n });\n var questionSets = map(questionSetElements, QuestionSet$1$1.createFromXmpElement);\n var quizParametersElement = _xmlUtility.getFirstElementByTagNameNSPrefix(quizTrackElement, 'tscIQ:QuizParams');\n var params = {\n quizGuid: quizTrackElement.getAttribute('tscIQ:quizGuid'),\n authoredEmail: quizTrackElement.getAttribute('tscIQ:authoredEmail'),\n requireUserId: quizTrackElement.getAttribute('tscIQ:requireUserId') === '1',\n locale: quizTrackElement.getAttribute('tscIQ:locale'),\n reportMethod: quizTrackElement.getAttribute('tscIQ:reportMethod'),\n clientId: quizTrackElement.getAttribute('tscIQ:clientId'),\n quizHash: quizTrackElement.getAttribute('tscIQ:quizHash'),\n hideReplay: quizTrackElement.getAttribute('tscIQ:hideReplay') === '1',\n allowSkipQuiz: quizTrackElement.getAttribute('tscIQ:allowSkipQuiz') !== '0',\n parameters: parseParameters(quizParametersElement, _xmlUtility),\n questionSets: questionSets\n };\n quizTrack = new QuizTrack(params);\n }\n return quizTrack;\n};\n\n/** @module QuizTrack */\nvar QuizTrack$1 = {\n /**\n * Factory method that returns a new QuizTrack object.\n * @function create\n * @param {Object} params - Optional params for caption track\n * @param {module:QuestionSet[]} [params.questionSets] - Array of question sets.\n * @static\n * @return {module:QuizTrack} new QuizTrack instance\n */\n create: function create(params) {\n return QuizTrack(params);\n },\n /**\n * Factory method that returns a new QuizTrack object from an XMP quiz track element.\n * @function createFromXmpElement\n * @param {Object} element - XMP quiz track element.\n * @static\n * @return {module:QuizTrack} new QuizTrack instance\n */\n createFromXmpElement: createFromXmpElement$b\n};\nvar SpeechMarker = function SpeechMarker(params) {\n var _startTime;\n var _duration;\n var _name;\n var _probability;\n var _image;\n var _imageIndex;\n var _imageOffset;\n var _file;\n var _imageRectangle;\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'startTime') {\n _startTime = params.startTime;\n } else if (key === 'duration') {\n _duration = params.duration;\n } else if (key === 'name') {\n _name = params.name;\n } else if (key === 'probability') {\n _probability = params.probability;\n } else if (key === 'image') {\n _image = params.image;\n } else if (key === 'imageIndex') {\n _imageIndex = params.imageIndex;\n } else if (key === 'imageOffset') {\n _imageOffset = params.imageOffset;\n } else if (key === 'file') {\n _file = params.file;\n } else if (key === 'imageRectangle') {\n _imageRectangle = params.imageRectangle;\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:name': _name,\n 'xmpDM:startTime': _startTime,\n 'xmpDM:duration': _duration,\n 'xmpDM:probability': _probability,\n 'tscDM:image': _image,\n 'tscDM:imageindex': _imageIndex,\n 'tscDM:imageoffset': _imageOffset,\n 'tscDM:imagerect': _imageRectangle ? _imageRectangle.toXmpAtt() : null,\n 'tscDM:file': _file\n }\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n startTime: {\n get: function get() {\n return _startTime;\n }\n },\n duration: {\n get: function get() {\n return _duration;\n }\n },\n name: {\n get: function get() {\n return _name;\n }\n },\n probability: {\n get: function get() {\n return _probability;\n }\n },\n image: {\n get: function get() {\n return _image;\n }\n },\n imageIndex: {\n get: function get() {\n return _imageIndex;\n }\n },\n imageOffset: {\n get: function get() {\n return _imageOffset;\n }\n },\n file: {\n get: function get() {\n return _file;\n }\n },\n imageRectangle: {\n get: function get() {\n return _imageRectangle;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n startTime: _startTime,\n duration: _duration,\n name: _name,\n probability: _probability,\n image: _image,\n imageIndex: _imageIndex,\n imageOffset: _imageOffset,\n file: _file,\n imageRectangle: _imageRectangle ? _imageRectangle.toPOJO() : undefined\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$c = function createFromXmpElement$c(speechMarkerElement) {\n var params = {\n startTime: Number(speechMarkerElement.getAttribute('xmpDM:startTime')),\n duration: Number(speechMarkerElement.getAttribute('xmpDM:duration')),\n name: speechMarkerElement.getAttribute('xmpDM:name'),\n probability: Number(speechMarkerElement.getAttribute('xmpDM:probability'))\n };\n\n // optional attributes below\n\n params.image = speechMarkerElement.getAttribute('tscDM:image') || undefined;\n if (speechMarkerElement.getAttribute('tscDM:imageindex')) {\n params.imageIndex = Number(speechMarkerElement.getAttribute('tscDM:imageindex'));\n }\n if (speechMarkerElement.getAttribute('tscDM:imageoffset')) {\n params.imageOffset = Number(speechMarkerElement.getAttribute('tscDM:imageoffset'));\n }\n params.file = speechMarkerElement.getAttribute('tscDM:file') || undefined;\n if (speechMarkerElement.getAttribute('tscDM:imagerect')) {\n params.imageRectangle = ImageRectangle$1.create(speechMarkerElement.getAttribute('tscDM:imagerect'));\n }\n return new SpeechMarker(params);\n};\n\n/** @module SpeechMarker */\nvar SpeechMarker$1 = {\n /**\n * Factory method that returns a new SpeechMarker object.\n * @function create\n * @param {Object} params - Required params for table of contents item\n * @param {Number} [params.startTime] - Start time of the speech marker (milliseconds).\n * @param {Number} [params.duration] - Duration of the speech marker (milliseconds).\n * @param {String} [params.name] - Speech marker name.\n * @param {String} [params.image] - Speech marker image.\n * @param {Number} [params.imageIndex] - Speech marker image index.\n * @param {Number} [params.imageOffset] - Speech marker image offset.\n * @param {module:ImageRectangle} [params.imageRectangle] - Speech marker image rectangle.\n * @static\n * @return {module:SpeechMarker} new SpeechMarker instance\n */\n create: function create(params) {\n return SpeechMarker(params);\n },\n /**\n * Factory method that returns a new SpeechMarker object from an XMP speech marker element.\n * @function createFromXmpElement\n * @param {Object} element - XMP speechMarker element.\n * @static\n * @return {module:SpeechMarker} new SpeechMarker instance\n */\n createFromXmpElement: createFromXmpElement$c\n};\nvar SpeechTrack = function SpeechTrack(params) {\n var _markers = [];\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n if (params.hasOwnProperty('markers') && isArray$1(params.markers)) {\n _markers = params.markers;\n } else {\n throw new Error('SpeechTrack params is expecting an object eg. { markers: [marker1Object, ...] }');\n }\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:trackType': 'Speech',\n 'xmpDM:trackName': 'Speech to Text',\n 'xmpDM:frameRate': 'f1000'\n },\n children: [{\n name: 'xmpDM:markers',\n children: [{\n name: 'rdf:Seq',\n children: _markers\n }]\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n markers: {\n get: function get() {\n return _markers;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n markers: invokeMap(_markers, 'toPOJO')\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$d = function createFromXmpElement$d(speechTrackElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var speechTrack = new SpeechTrack();\n if (speechTrackElement) {\n var markerElements = _xmlUtility.getElementsByTagNameNSPrefix(speechTrackElement, 'rdf:li');\n var markers = map(markerElements, SpeechMarker$1.createFromXmpElement);\n var params = {\n markers: markers\n };\n speechTrack = new SpeechTrack(params);\n }\n return speechTrack;\n};\n\n/** @module SpeechTrack */\nvar SpeechTrack$1 = {\n /**\n * Factory method that returns a new SpeechTrack object.\n * @function create\n * @param {Object} params - Optional params for speech track\n * @param {module:SpeechMarker[]} [params.markers] - Array of speech marker items.\n * @static\n * @return {module:SpeechTrack} new SpeechTrack instance\n */\n create: function create(params) {\n return SpeechTrack(params);\n },\n /**\n * Factory method that returns a new SpeechTrack object from an XMP speech track element.\n * @function createFromXmpElement\n * @param {Object} element - XMP speech track element.\n * @static\n * @return {module:SpeechTrack} new SpeechTrack instance\n */\n createFromXmpElement: createFromXmpElement$d\n};\nvar ScreenTextMarker = function ScreenTextMarker(params) {\n var _name;\n var _startTime;\n var _duration;\n var _tableOfContentsEntry;\n var _image;\n var _imageIndex;\n var _imageOffset;\n var _imageRectangle;\n var _file;\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'name') {\n _name = params.name;\n } else if (key === 'startTime') {\n _startTime = params.startTime;\n } else if (key === 'duration') {\n _duration = params.duration;\n } else if (key === 'tableOfContentsEntry') {\n _tableOfContentsEntry = params.tableOfContentsEntry;\n } else if (key === 'image') {\n _image = params.image;\n } else if (key === 'imageIndex') {\n _imageIndex = params.imageIndex;\n } else if (key === 'imageOffset') {\n _imageOffset = params.imageOffset;\n } else if (key === 'imageRectangle') {\n _imageRectangle = params.imageRectangle;\n } else if (key === 'file') {\n _file = params.file;\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:name': _name,\n 'xmpDM:startTime': _startTime,\n 'xmpDM:duration': _duration,\n 'tscDM:tocEntry': _tableOfContentsEntry,\n 'tscDM:image': _image,\n 'tscDM:imageindex': _imageIndex,\n 'tscDM:imageoffset': _imageOffset,\n 'tscDM:imagerect': _imageRectangle ? _imageRectangle.toXmpAtt() : null,\n 'tscDM:file': _file\n }\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n name: {\n get: function get() {\n return _name;\n }\n },\n startTime: {\n get: function get() {\n return _startTime;\n }\n },\n duration: {\n get: function get() {\n return _duration;\n }\n },\n tableOfContentsEntry: {\n get: function get() {\n return _tableOfContentsEntry;\n }\n },\n image: {\n get: function get() {\n return _image;\n }\n },\n imageIndex: {\n get: function get() {\n return _imageIndex;\n }\n },\n imageOffset: {\n get: function get() {\n return _imageOffset;\n }\n },\n imageRectangle: {\n get: function get() {\n return _imageRectangle;\n }\n },\n file: {\n get: function get() {\n return _file;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n name: _name,\n startTime: _startTime,\n duration: _duration,\n tableOfContentsEntry: _tableOfContentsEntry,\n image: _image,\n imageIndex: _imageIndex,\n imageOffset: _imageOffset,\n imageRectangle: _imageRectangle ? _imageRectangle.toPOJO() : _imageRectangle,\n file: _file\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$e = function createFromXmpElement$e(screenTextMarkerElement) {\n var params = {\n name: screenTextMarkerElement.getAttribute('xmpDM:name'),\n startTime: Number(screenTextMarkerElement.getAttribute('xmpDM:startTime')),\n duration: Number(screenTextMarkerElement.getAttribute('xmpDM:duration'))\n };\n\n // optional attributes below\n\n if (screenTextMarkerElement.getAttribute('tscDM:tocEntry')) {\n params.tableOfContentsEntry = Number(screenTextMarkerElement.getAttribute('tscDM:tocEntry'));\n }\n params.image = screenTextMarkerElement.getAttribute('tscDM:image') || undefined;\n if (screenTextMarkerElement.getAttribute('tscDM:imageindex')) {\n params.imageIndex = Number(screenTextMarkerElement.getAttribute('tscDM:imageindex'));\n }\n if (screenTextMarkerElement.getAttribute('tscDM:imageoffset')) {\n params.imageOffset = Number(screenTextMarkerElement.getAttribute('tscDM:imageoffset'));\n }\n if (screenTextMarkerElement.getAttribute('tscDM:imagerect')) {\n params.imageRectangle = ImageRectangle$1.create(screenTextMarkerElement.getAttribute('tscDM:imagerect'));\n }\n params.file = screenTextMarkerElement.getAttribute('tscDM:file') || undefined;\n return new ScreenTextMarker(params);\n};\n\n/** @module ScreenTextMarker */\nvar ScreenTextMarker$1 = {\n /**\n * Factory method that returns a new ScreenTextMarker object.\n * @function create\n * @param {Object} params - Required params for table of contents item\n * @param {String} [params.name] - ScreenText marker name.\n * @param {Number} [params.startTime] - Start time of the screenText marker (milliseconds).\n * @param {Number} [params.duration] - Duration of the screenText marker (milliseconds).\n * @param {String} [params.tableOfContentsEntry] - Index of the table of contents entry corresponding to this screen text marker.\n * @param {String} [params.image] - ScreenText marker image.\n * @param {Number} [params.imageIndex] - ScreenText marker image index.\n * @param {Number} [params.imageOffset] - ScreenText marker image offset.\n * @param {module:ImageRectangle} [params.imageRectangle] - ScreenText marker image rectangle.\n * @param {String} [params.file] - file associated with ScreenText marker.\n * @static\n * @return {module:ScreenTextMarker} new ScreenTextMarker instance\n */\n create: function create(params) {\n return ScreenTextMarker(params);\n },\n /**\n * Factory method that returns a new ScreenTextMarker object from an XMP screenText marker element.\n * @function createFromXmpElement\n * @param {Object} element - XMP screenTextMarker element.\n * @static\n * @return {module:ScreenTextMarker} new ScreenTextMarker instance\n */\n createFromXmpElement: createFromXmpElement$e\n};\nvar ScreenTextTrack = function ScreenTextTrack(params) {\n var _markers = [];\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n if (params.hasOwnProperty('markers') && isArray$1(params.markers)) {\n _markers = params.markers;\n } else {\n throw new Error('ScreenTextTrack params is expecting an object eg. { markers: [marker1Object, ...] }');\n }\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:trackType': 'ScreenText',\n 'xmpDM:trackName': 'Screen Text',\n 'xmpDM:frameRate': 'f1000'\n },\n children: [{\n name: 'xmpDM:markers',\n children: [{\n name: 'rdf:Seq',\n children: _markers\n }]\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n markers: {\n get: function get() {\n return _markers;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n markers: invokeMap(_markers, 'toPOJO')\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n return pojo;\n };\n return _public;\n};\nvar createFromXmpElement$f = function createFromXmpElement$f(screenTextTrackElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var screenTextTrack = new ScreenTextTrack();\n if (screenTextTrackElement) {\n var markerElements = _xmlUtility.getElementsByTagNameNSPrefix(screenTextTrackElement, 'rdf:Description');\n var markers = map(markerElements, ScreenTextMarker$1.createFromXmpElement);\n var params = {\n markers: markers\n };\n screenTextTrack = new ScreenTextTrack(params);\n }\n return screenTextTrack;\n};\n\n/** @module ScreenTextTrack */\nvar ScreenTextTrack$1 = {\n /**\n * Factory method that returns a new ScreenTextTrack object.\n * @function create\n * @param {Object} params - Optional params for screenText track\n * @param {module:ScreenTextMarker[]} [params.markers] - Array of screenText marker items.\n * @static\n * @return {module:ScreenTextTrack} new ScreenTextTrack instance\n */\n create: function create(params) {\n return ScreenTextTrack(params);\n },\n /**\n * Factory method that returns a new ScreenTextTrack object from an XMP screenText track element.\n * @function createFromXmpElement\n * @param {Object} element - XMP screenText track element.\n * @static\n * @return {module:ScreenTextTrack} new ScreenTextTrack instance\n */\n createFromXmpElement: createFromXmpElement$f\n};\nvar _xmlUtility;\nvar getXmlUtility = function getXmlUtility() {\n return _xmlUtility || (_xmlUtility = new NamespaceXmlUtility(namespaceResolver));\n};\nvar Controller = function Controller(params) {\n var _name;\n var _parameters;\n var _controllerTextItems;\n var _additionalParamProperties = {};\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'name') {\n _name = params.name;\n } else if (key === 'parameters') {\n _parameters = params.parameters;\n } else if (key === 'controllerTextItems') {\n _controllerTextItems = params.controllerTextItems;\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n var toXmp = function toXmp() {\n var localizedTextTree = map(_controllerTextItems, function (item) {\n return {\n name: 'rdf:li',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmp:label': item.label\n },\n children: [{\n name: 'tscDM:localizedText',\n children: [{\n name: 'rdf:Alt',\n children: map(item.localizedTexts, function (localizedText) {\n return {\n name: 'rdf:li',\n atts: {\n 'xml:lang': localizedText.lang\n },\n text: localizedText.text\n };\n })\n }]\n }]\n }]\n };\n });\n var treeDesc = {\n name: 'tscDM:controller',\n children: [{\n name: 'rdf:Description',\n atts: {\n 'xmpDM:name': _name\n },\n children: [{\n name: 'tscDM:parameters',\n children: [{\n name: 'rdf:Bag',\n children: map(_parameters, function (param) {\n return {\n name: 'rdf:li',\n atts: {\n 'xmpDM:name': param.name,\n 'xmpDM:value': param.value\n }\n };\n })\n }]\n }, {\n name: 'tscDM:controllerText',\n children: [{\n name: 'rdf:Bag',\n children: localizedTextTree\n }]\n }]\n }]\n };\n return getXmlUtility().createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n name: {\n get: function get() {\n return _name;\n }\n },\n parameters: {\n get: function get() {\n return _parameters;\n }\n },\n controllerTextItems: {\n get: function get() {\n return _controllerTextItems;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n name: _name,\n parameters: _parameters,\n controllerTextItems: _controllerTextItems\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n return _public;\n};\nvar parseParameter$1 = function parseParameter$1(parameterElement) {\n return {\n name: parameterElement.getAttribute('xmpDM:name'),\n value: parameterElement.getAttribute('xmpDM:value')\n };\n};\nvar parseParameters$1 = function parseParameters$1(parametersElement) {\n if (parametersElement) {\n var parameterElements = getXmlUtility().getElementsByTagNameNSPrefix(parametersElement, 'rdf:li');\n var parameters = map(parameterElements, parseParameter$1);\n return parameters;\n }\n return undefined;\n};\nvar parseLocalizedTextItem = function parseLocalizedTextItem(textElement) {\n if (textElement) {\n return {\n lang: textElement.getAttribute('xml:lang'),\n text: getXmlUtility().getElementText(textElement)\n };\n }\n return undefined;\n};\nvar parseControllerText = function parseControllerText(controllerTextItemElement) {\n var textElements = getXmlUtility().getElementsByTagNameNSPrefix(controllerTextItemElement, 'rdf:li');\n return {\n label: controllerTextItemElement.getAttribute('xmp:label'),\n localizedTexts: map(textElements, parseLocalizedTextItem)\n };\n};\nvar parseControllerTextItems = function parseControllerTextItems(controllerTextElement) {\n if (controllerTextElement) {\n var controllerTextElements = getXmlUtility().getElementsByTagNameNSPrefix(controllerTextElement, 'rdf:Description');\n var controllerTextItems = map(controllerTextElements, parseControllerText);\n return controllerTextItems;\n }\n return undefined;\n};\nvar createFromXmpElement$g = function createFromXmpElement$g(controllerElement) {\n if (controllerElement) {\n var descriptionElement = getXmlUtility().getFirstElementByTagNameNSPrefix(controllerElement, 'rdf:Description');\n var parametersElement = getXmlUtility().getFirstElementByTagNameNSPrefix(descriptionElement, 'tscDM:parameters');\n var controllerTextElement = getXmlUtility().getFirstElementByTagNameNSPrefix(descriptionElement, 'tscDM:controllerText');\n var params = {\n name: descriptionElement.getAttribute('xmpDM:name'),\n parameters: parseParameters$1(parametersElement),\n controllerTextItems: parseControllerTextItems(controllerTextElement)\n };\n return new Controller(params);\n }\n return undefined;\n};\n\n/** @module Controller */\nvar Controller$1 = {\n /**\n * Factory method that returns a new Controller object.\n * @function create\n * @param {Object} params - Required params for controller\n * @param {String} [params.name] - Controller label.\n * @param {Object[]} [params.parameters] - Array of Objects with name and value properties.\n * @param {Object[]} [params.controllerTextItems] - Array of localized controller text items.\n * @static\n * @return {module:Controller} new Controller instance\n */\n create: function create(params) {\n return Controller(params);\n },\n /**\n * Factory method that returns a new Controller object from an XMP controller element.\n * @function createFromXmpElement\n * @param {Object} element - XMP controller element.\n * @static\n * @return {module:Controller} new Controller instance\n */\n createFromXmpElement: createFromXmpElement$g\n};\nvar ContentList = function ContentList(params) {\n var _items;\n var _additionalParamProperties = {};\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (params) {\n forEach(keys$1(params), function (key) {\n if (key === 'items') {\n _items = params.items;\n } else if (!isFunction(_additionalParamProperties[key])) {\n _additionalParamProperties[key] = params[key];\n }\n });\n }\n var toXmp = function toXmp() {\n var treeDesc = {\n name: 'tscDM:contentList',\n children: [{\n name: 'rdf:Description',\n children: [{\n name: 'tscDM:files',\n children: [{\n name: 'rdf:Seq',\n children: map(_items, function (item) {\n return {\n name: 'rdf:li',\n atts: {\n 'xmpDM:name': item.name,\n 'xmpDM:value': item.value\n }\n };\n })\n }]\n }]\n }]\n };\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var _public = Object.defineProperties({}, {\n items: {\n get: function get() {\n return _items;\n }\n }\n });\n _public.toXmp = toXmp;\n _public.toPOJO = function () {\n var pojo = {\n items: _items\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n forEach(keys$1(_additionalParamProperties), function (key) {\n pojo[key] = _additionalParamProperties[key];\n });\n return pojo;\n };\n return _public;\n};\nvar parseContentListItems = function parseContentListItems(contentListItemElements) {\n if (contentListItemElements) {\n var items = map(contentListItemElements, function (itemElement) {\n return {\n name: itemElement.getAttribute('xmpDM:name'),\n value: itemElement.getAttribute('xmpDM:value')\n };\n });\n return items;\n }\n return undefined;\n};\nvar createFromXmpElement$h = function createFromXmpElement$h(contentListElement) {\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n if (contentListElement) {\n var contentListItemElements = _xmlUtility.getElementsByTagNameNSPrefix(contentListElement, 'rdf:li');\n var params = {\n items: parseContentListItems(contentListItemElements)\n };\n return new ContentList(params);\n }\n return undefined;\n};\n\n/** @module ContentList */\nvar ContentList$1 = {\n /**\n * Factory method that returns a new ContentList object.\n * @function create\n * @param {Object} params - Required params for contentList\n * @param {Object[]} [params.items] - Array of content list items.\n * @static\n * @return {module:ContentList} new ContentList instance\n */\n create: function create(params) {\n return ContentList(params);\n },\n /**\n * Factory method that returns a new ContentList object from an XMP contentList element.\n * @function createFromXmpElement\n * @param {Object} element - XMP contentList element.\n * @static\n * @return {module:ContentList} new ContentList instance\n */\n createFromXmpElement: createFromXmpElement$h\n};\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return !start && end >= length ? array : baseSlice(array, start, end);\n}\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\n/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\n/**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\nfunction charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n}\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = \"\\\\ud800-\\\\udfff\",\n rsComboMarksRange = \"\\\\u0300-\\\\u036f\",\n reComboHalfMarksRange = \"\\\\ufe20-\\\\ufe2f\",\n rsComboSymbolsRange = \"\\\\u20d0-\\\\u20ff\",\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = \"\\\\ufe0e\\\\ufe0f\";\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = \"\\\\u200d\";\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange$1 = \"\\\\ud800-\\\\udfff\",\n rsComboMarksRange$1 = \"\\\\u0300-\\\\u036f\",\n reComboHalfMarksRange$1 = \"\\\\ufe20-\\\\ufe2f\",\n rsComboSymbolsRange$1 = \"\\\\u20d0-\\\\u20ff\",\n rsComboRange$1 = rsComboMarksRange$1 + reComboHalfMarksRange$1 + rsComboSymbolsRange$1,\n rsVarRange$1 = \"\\\\ufe0e\\\\ufe0f\";\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange$1 + ']',\n rsCombo = '[' + rsComboRange$1 + ']',\n rsFitz = \"\\\\ud83c[\\\\udffb-\\\\udfff]\",\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange$1 + ']',\n rsRegional = \"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",\n rsSurrPair = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",\n rsZWJ$1 = \"\\\\u200d\";\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange$1 + ']?',\n rsOptJoin = '(?:' + rsZWJ$1 + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);\n}\n\n/** Used to match leading and trailing whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * Removes leading whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimStart(' abc ');\n * // => 'abc '\n *\n * _.trimStart('-_-abc-_-', '_-');\n * // => 'abc-_-'\n */\nfunction trimStart(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.replace(reTrimStart, '');\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n start = charsStartIndex(strSymbols, stringToArray(chars));\n return castSlice(strSymbols, start).join('');\n}\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n return arrayMap(props, function (key) {\n return object[key];\n });\n}\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n return object == null ? [] : baseValues(object, keys$1(object));\n}\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax$2 = Math.max;\n\n/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\nfunction includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax$2(length + fromIndex, 0);\n }\n return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;\n}\nvar _parsers = [];\nfunction trimLeadingDot(extension) {\n return trimStart(extension, '.');\n}\nvar registerParser = function registerParser(name, supportedExtensions, parserCreator) {\n _parsers.push({\n name: name,\n extensions: map(supportedExtensions, trimLeadingDot),\n create: parserCreator\n });\n};\nvar resolveParser = function resolveParser(extension) {\n var parser = find(_parsers, function (theParser) {\n return includes(theParser.extensions, trimLeadingDot(extension));\n });\n return parser ? parser.create() : null;\n};\nvar captionParsers = {\n register: registerParser,\n resolveByExtension: resolveParser\n};\n\n/**\n * Factory method that returns a new CaptionText object.\n * @function importFromFile\n * @param {module:CaptionController} captionController - CaptionController object\n * @param {String} fileName - Name of caption file\n * @param {String} fileContents - Contents of the caption file\n * @param {String} [languageIdentifierString='en-US'] - RFC 3066 notation language string\n * @static\n * @return {boolean} Did import succeed\n */\nvar importFromFile = function importFromFile(captionController, fileName, fileContents, languageIdentifierString) {\n try {\n var extension = fileName.toLowerCase().split('.').pop();\n var parser = captionParsers.resolveByExtension(extension);\n if (parser) {\n var parsedCaptionTrack = parser.deserialize(fileContents, languageIdentifierString);\n captionController.addCaptionTrack(parsedCaptionTrack);\n return true;\n }\n return false;\n } catch (e) {\n console.error(e); // eslint-disable-line no-console\n return false;\n }\n};\nvar captionImporter = {\n importFromFile: importFromFile\n};\nvar Xmp$1 = function Xmp(xmpXml) {\n var _version;\n var _title;\n var _date;\n var _creator;\n var _presenterEmail;\n var _description;\n var _source;\n var _about;\n var _keywords;\n var _thumbnail;\n var _firstFrame;\n var _project;\n var _originId;\n var _iPodExplicit;\n var _documentId;\n var _duration;\n var _videoFrameSize;\n var _captionController = CaptionController$1$1.create();\n var _hotspotTrack = null;\n var _tableOfContentsTrack = null;\n var _quizTrack = null;\n var _speechTrack = null;\n var _screenTextTrack = null;\n var _controller;\n var _contentList;\n var _languages = [];\n var _containsTocThumbnails = false;\n var _containsToc = false;\n var _containsCaptions = false;\n var _containsHotspots = false;\n var _containsQuiz = false;\n var _containsQuizQuestions = false;\n var _containsScreenText = false;\n var _containsSpeechText = false;\n var _xmlUtility = new NamespaceXmlUtility(namespaceResolver);\n var toXmp = function toXmp() {\n var _captionXmpProvider = _captionController.containsCaptions ? _captionController : null;\n var tracksContainer = filter([_captionXmpProvider, _hotspotTrack, _quizTrack, _screenTextTrack, _speechTrack, _tableOfContentsTrack], function (track) {\n return track !== null;\n });\n var treeDesc = {\n name: 'rdf:Description',\n atts: {\n 'tsc:version': _version,\n 'dc:title': _title,\n 'tscDM:presenteremail': _presenterEmail,\n 'dc:source': _source,\n 'dc:date': _date,\n 'rdf:about': _about,\n 'dc:creator': _creator,\n 'dc:description': _description,\n 'tscDM:keywords': _keywords,\n 'tscDM:thumbnail': _thumbnail,\n 'tscDM:firstFrame': _firstFrame,\n 'tscDM:project': _project,\n 'tscDM:originId': _originId,\n 'tscDM:iPodExplicit': _iPodExplicit,\n 'xmpMM:DocumentID': _documentId\n },\n children: [{\n name: 'xmpDM:Tracks',\n children: [{\n name: 'rdf:Bag',\n children: tracksContainer\n }]\n }, {\n name: 'tscDM:controller',\n children: [_controller]\n }, {\n name: 'tscDM:contentList',\n children: [_contentList]\n }, {\n name: 'tsc:langName',\n children: [{\n name: 'rdf:Bag',\n children: map(_languages, function (language) {\n return {\n name: 'rdf:li',\n atts: {\n 'xml:lang': language.langName\n },\n text: language.langValue\n };\n })\n }]\n }, {\n name: 'xmpDM:videoFrameSize',\n atts: {\n 'stDim:unit': _videoFrameSize.unit,\n 'stDim:w': _videoFrameSize.width,\n 'stDim:h': _videoFrameSize.height\n }\n }]\n };\n if (_duration) {\n treeDesc.children.push({\n name: 'xmpDM:duration',\n atts: {\n 'xmpDM:scale': _duration.scale,\n 'xmpDM:value': _duration.value\n }\n });\n }\n return _xmlUtility.createElementFromObject(treeDesc);\n };\n var toString = function toString() {\n var doc = _xmlUtility.createDocument();\n var nsElement = _xmlUtility.createElementNS(doc, namespaceResolver('x'), 'x', 'xmpmeta');\n forEach(wellKnownNamespaces, function (nsUrl, nsPrefix) {\n if (nsPrefix !== 'xml') {\n nsElement.setAttributeNS('http://www.w3.org/2000/xmlns/', ['xmlns', nsPrefix].join(':'), nsUrl);\n }\n });\n var rdfElement = _xmlUtility.createElementNS(doc, namespaceResolver('rdf'), 'rdf', 'RDF');\n rdfElement.appendChild(toXmp());\n nsElement.appendChild(rdfElement);\n doc.appendChild(nsElement);\n return _xmlUtility.xmlDocToString(doc);\n };\n var _public = Object.defineProperties({}, {\n version: {\n get: function get() {\n return _version;\n }\n },\n title: {\n get: function get() {\n return _title;\n }\n },\n date: {\n get: function get() {\n return _date;\n }\n },\n creator: {\n get: function get() {\n return _creator;\n }\n },\n presenterEmail: {\n get: function get() {\n return _presenterEmail;\n }\n },\n description: {\n get: function get() {\n return _description;\n }\n },\n source: {\n get: function get() {\n return _source;\n }\n },\n about: {\n get: function get() {\n return _about;\n }\n },\n keywords: {\n get: function get() {\n return _keywords;\n }\n },\n thumbnail: {\n get: function get() {\n return _thumbnail;\n }\n },\n firstFrame: {\n get: function get() {\n return _firstFrame;\n }\n },\n project: {\n get: function get() {\n return _project;\n }\n },\n originId: {\n get: function get() {\n return _originId;\n }\n },\n iPodExplicit: {\n get: function get() {\n return _iPodExplicit;\n }\n },\n documentId: {\n get: function get() {\n return _documentId;\n }\n },\n duration: {\n get: function get() {\n return _duration;\n }\n },\n videoFrameSize: {\n get: function get() {\n return _videoFrameSize;\n }\n },\n tocThumbnailImageSrc: {\n get: function get() {\n if (_containsToc && _tableOfContentsTrack.items[0].image !== undefined) {\n return _tableOfContentsTrack.items[0].image;\n } else if (_containsSpeechText && _speechTrack.markers[0].image !== undefined) {\n return _speechTrack.markers[0].image;\n } else if (_containsScreenText && _screenTextTrack.markers[0].image !== undefined) {\n return _screenTextTrack.markers[0].image;\n } else if (_captionController.captionsContainsTocThumbnails) {\n return _captionController.getActiveCaptionsTocThumbnailImage();\n }\n return '';\n }\n },\n containsTocThumbnails: {\n get: function get() {\n return _containsTocThumbnails;\n }\n },\n containsToc: {\n get: function get() {\n return _containsToc;\n }\n },\n containsCaptions: {\n get: function get() {\n return _containsCaptions;\n }\n },\n containsHotspots: {\n get: function get() {\n return _containsHotspots;\n }\n },\n containsQuiz: {\n get: function get() {\n return _containsQuiz;\n }\n },\n containsQuizQuestions: {\n get: function get() {\n return _containsQuizQuestions;\n }\n },\n containsScreenText: {\n get: function get() {\n return _containsScreenText;\n }\n },\n containsSpeechText: {\n get: function get() {\n return _containsSpeechText;\n }\n },\n captionController: {\n get: function get() {\n return _captionController;\n }\n },\n captionTrack: {\n get: function get() {\n return _captionController.activeCaptionTrack;\n }\n },\n hotspotTrack: {\n get: function get() {\n return _hotspotTrack;\n },\n set: function set(value) {\n _hotspotTrack = value;\n }\n },\n tableOfContentsTrack: {\n get: function get() {\n return _tableOfContentsTrack;\n },\n set: function set(value) {\n _tableOfContentsTrack = value;\n }\n },\n quizTrack: {\n get: function get() {\n return _quizTrack;\n },\n set: function set(value) {\n _quizTrack = value;\n }\n },\n speechTrack: {\n get: function get() {\n return _speechTrack;\n }\n },\n screenTextTrack: {\n get: function get() {\n return _screenTextTrack;\n }\n },\n controller: {\n get: function get() {\n return _controller;\n }\n },\n contentList: {\n get: function get() {\n return _contentList;\n }\n }\n });\n var parseLanguageName = function parseLanguageName(languageNameElement) {\n return {\n langName: languageNameElement.getAttribute('xml:lang'),\n langValue: _xmlUtility.getElementText(languageNameElement)\n };\n };\n var parseLanguages = function parseLanguages(langNameElement) {\n if (langNameElement) {\n var languageNameElements = _xmlUtility.getElementsByTagNameNSPrefix(langNameElement, 'rdf:li');\n var languageNames = map(languageNameElements, parseLanguageName);\n return languageNames;\n }\n return null;\n };\n var parseProductionDetails = function parseProductionDetails(doc) {\n var rootDescriptionElement = _xmlUtility.getFirstElementByTagNameNSPrefix(doc, 'rdf:Description');\n _version = rootDescriptionElement.getAttribute('tsc:version');\n _title = rootDescriptionElement.getAttribute('dc:title');\n _documentId = rootDescriptionElement.getAttribute('xmpMM:DocumentID');\n var videoFrameSizeElement = _xmlUtility.getFirstElementByTagNameNSPrefix(doc, 'xmpDM:videoFrameSize');\n _videoFrameSize = {\n unit: videoFrameSizeElement ? videoFrameSizeElement.getAttribute('stDim:unit') : 'pixel',\n width: videoFrameSizeElement ? Number(videoFrameSizeElement.getAttribute('stDim:w')) : 0,\n height: videoFrameSizeElement ? Number(videoFrameSizeElement.getAttribute('stDim:h')) : 0\n };\n var langNameElement = _xmlUtility.getFirstElementByTagNameNSPrefix(doc, 'tsc:langName');\n _languages = parseLanguages(langNameElement);\n\n // optional attributes below\n\n _presenterEmail = rootDescriptionElement.getAttribute('tscDM:presenteremail') || undefined;\n _source = rootDescriptionElement.getAttribute('dc:source') || undefined;\n _date = rootDescriptionElement.getAttribute('dc:date') || undefined;\n _about = rootDescriptionElement.getAttribute('rdf:about') || undefined;\n _creator = rootDescriptionElement.getAttribute('dc:creator') || undefined;\n _description = rootDescriptionElement.getAttribute('dc:description') || undefined;\n _keywords = rootDescriptionElement.getAttribute('tscDM:keywords') || undefined;\n _thumbnail = rootDescriptionElement.getAttribute('tscDM:thumbnail') || undefined;\n _firstFrame = rootDescriptionElement.getAttribute('tscDM:firstFrame') || undefined;\n _project = rootDescriptionElement.getAttribute('tscDM:project') || undefined;\n _originId = rootDescriptionElement.getAttribute('tscDM:originId') || undefined;\n _iPodExplicit = rootDescriptionElement.getAttribute('tscDM:iPodExplicit') || undefined;\n var durationElement = _xmlUtility.getFirstElementByTagNameNSPrefix(doc, 'xmpDM:duration') || undefined;\n if (durationElement) {\n _duration = {\n scale: durationElement.getAttribute('xmpDM:scale'),\n value: Number(durationElement.getAttribute('xmpDM:value'))\n };\n }\n };\n var getElementForTrackType = function getElementForTrackType(elements, trackType) {\n return find(elements, function (element) {\n return _xmlUtility.hasAttributeWithValue(element, 'xmpDM:trackType', trackType);\n });\n };\n var parseCaptionTrack = function parseCaptionTrack(tracksDescriptionElements) {\n var captionTrackElement = getElementForTrackType(tracksDescriptionElements, 'Caption');\n if (captionTrackElement) {\n _captionController.addCaptionTrackFromXmpElement(captionTrackElement);\n }\n };\n var parseHotspotTrack = function parseHotspotTrack(tracksDescriptionElements) {\n var hotspotTrackElement = getElementForTrackType(tracksDescriptionElements, 'Hotspot');\n if (hotspotTrackElement) {\n return HotspotTrack$1.createFromXmpElement(hotspotTrackElement);\n }\n return null;\n };\n var parseTableOfContentsTrack = function parseTableOfContentsTrack(tracksDescriptionElements) {\n var tableOfContentsTrackElement = getElementForTrackType(tracksDescriptionElements, 'TableOfContents');\n if (tableOfContentsTrackElement) {\n return TableOfContentsTrack$1.createFromXmpElement(tableOfContentsTrackElement);\n }\n return null;\n };\n var parseQuizTrack = function parseQuizTrack(tracksDescriptionElements) {\n var quizTrackElement = getElementForTrackType(tracksDescriptionElements, 'Quiz');\n if (quizTrackElement) {\n return QuizTrack$1.createFromXmpElement(quizTrackElement);\n }\n return null;\n };\n var parseSpeechTrack = function parseSpeechTrack(tracksDescriptionElements) {\n var speechTrackElement = getElementForTrackType(tracksDescriptionElements, 'Speech');\n if (speechTrackElement) {\n return SpeechTrack$1.createFromXmpElement(speechTrackElement);\n }\n return null;\n };\n var parseScreenTextTrack = function parseScreenTextTrack(tracksDescriptionElements) {\n var screenTextTrackElement = getElementForTrackType(tracksDescriptionElements, 'ScreenText');\n if (screenTextTrackElement) {\n return ScreenTextTrack$1.createFromXmpElement(screenTextTrackElement);\n }\n return null;\n };\n var parseTracks = function parseTracks(doc) {\n var tracksElement = _xmlUtility.getFirstElementByTagNameNSPrefix(doc, 'xmpDM:Tracks');\n var tracksDescriptionElements = _xmlUtility.getElementsByTagNameNSPrefix(tracksElement, 'rdf:Description');\n parseCaptionTrack(tracksDescriptionElements);\n _hotspotTrack = parseHotspotTrack(tracksDescriptionElements);\n _tableOfContentsTrack = parseTableOfContentsTrack(tracksDescriptionElements);\n _quizTrack = parseQuizTrack(tracksDescriptionElements);\n _speechTrack = parseSpeechTrack(tracksDescriptionElements);\n _screenTextTrack = parseScreenTextTrack(tracksDescriptionElements);\n var controllerElement = _xmlUtility.getFirstElementByTagNameNSPrefix(doc, 'tscDM:controller');\n _controller = Controller$1.createFromXmpElement(controllerElement);\n var contentListElement = _xmlUtility.getFirstElementByTagNameNSPrefix(doc, 'tscDM:contentList');\n _contentList = ContentList$1.createFromXmpElement(contentListElement);\n recordXmpContentFlags();\n };\n var recordXmpContentFlags = function recordXmpContentFlags() {\n _containsToc = _tableOfContentsTrack !== null && _tableOfContentsTrack.items.length > 0;\n _containsCaptions = _captionController.containsCaptions;\n _containsHotspots = _hotspotTrack !== null && _hotspotTrack.hotspots.length > 0;\n _containsQuiz = _quizTrack !== null;\n _containsQuizQuestions = _quizTrack !== null && _quizTrack.questionSets.length > 0;\n _containsScreenText = _screenTextTrack !== null && _screenTextTrack.markers.length > 0;\n _containsSpeechText = _speechTrack !== null && _speechTrack.markers.length > 0;\n _containsTocThumbnails = _containsToc && _tableOfContentsTrack.items[0].image !== undefined || _containsSpeechText && _speechTrack.markers[0].image !== undefined || _containsScreenText && _screenTextTrack.markers[0].image !== undefined || _captionController.captionsContainsTocThumbnails;\n };\n var importCaptionsFromFile = function importCaptionsFromFile(fileName, fileContents, languageIdentifierString) {\n var importedCaptionTrack = captionImporter.importFromFile(_captionController, fileName, fileContents, languageIdentifierString);\n if (importedCaptionTrack) {\n recordXmpContentFlags();\n }\n };\n var parse = function parse() {\n // current 'parse' does NOT deal with different versions of the TSC-XMP schema, as far as we have tested\n // all existing versions of the schema from 2.0.0 - 2.1.0 will parse using this mechanism, but neither parser\n // nor output formatter attempt to take a 2.0.0 and formally migrate it forward to 2.1.0. Nor is the 'version'\n // property of the xml doc ever modified during reading a writing of a particular source. this note is here\n // because will have to deal with versioning someday. (JMD: 2016-05)\n var doc = _xmlUtility.parseXml(xmpXml);\n parseProductionDetails(doc);\n parseTracks(doc);\n };\n if (xmpXml) {\n parse();\n }\n _public.toXmp = toXmp;\n _public.toString = toString;\n _public.importCaptionsFromFile = importCaptionsFromFile;\n _public.toPOJO = function () {\n var pojo = {\n version: _version,\n title: _title,\n documentId: _documentId,\n languages: _languages,\n videoFrameSize: _videoFrameSize,\n source: _source,\n presenterEmail: _presenterEmail,\n date: _date,\n about: _about,\n creator: _creator,\n description: _description,\n keywords: _keywords,\n thumbnail: _thumbnail,\n firstFrame: _firstFrame,\n project: _project,\n originId: _originId,\n iPodExplicit: _iPodExplicit,\n duration: _duration,\n captionTrack: _captionController.toPOJO(),\n hotspotTrack: _hotspotTrack ? _hotspotTrack.toPOJO() : undefined,\n quizTrack: _quizTrack ? _quizTrack.toPOJO() : undefined,\n speechTrack: _speechTrack ? _speechTrack.toPOJO() : undefined,\n screenTextTrack: _screenTextTrack ? _screenTextTrack.toPOJO() : undefined,\n controller: _controller ? _controller.toPOJO() : undefined,\n contentList: _contentList ? _contentList.toPOJO() : undefined\n };\n var that = this;\n var additionalProperties = reject$1(keys$1(that), function (key) {\n return isFunction(that[key]);\n });\n forEach(additionalProperties, function (key) {\n pojo[key] = that[key];\n });\n return pojo;\n };\n return _public;\n};\n\n/** @module Xmp */\nvar xmp = {\n /**\n * Factory method that returns a new Xmp object.\n * @function create\n * @param {String=} xmpXml - XMP XML string to parse.\n * @static\n * @return {module:Xmp} new Xmp instance\n */\n create: function create(xmpXml) {\n return Xmp$1(xmpXml);\n }\n};\n\n/** Used for built-in method references. */\nvar objectProto$f = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$c = objectProto$f.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty$c.call(object, key);\n}\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\n/** Used for built-in method references. */\nvar arrayProto$2 = Array.prototype;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeJoin = arrayProto$2.join;\n\n/**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */\nfunction join(array, separator) {\n return array == null ? '' : nativeJoin.call(array, separator);\n}\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\nfunction charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n}\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim$1 = /^\\s+|\\s+$/g;\n\n/**\n * Removes leading and trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trim(' abc ');\n * // => 'abc'\n *\n * _.trim('-_-abc-_-', '_-');\n * // => 'abc'\n *\n * _.map([' foo ', ' bar '], _.trim);\n * // => ['foo', 'bar']\n */\nfunction trim(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.replace(reTrim$1, '');\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n chrSymbols = stringToArray(chars),\n start = charsStartIndex(strSymbols, chrSymbols),\n end = charsEndIndex(strSymbols, chrSymbols) + 1;\n return castSlice(strSymbols, start, end).join('');\n}\n\n/**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\nfunction head(array) {\n return array && array.length ? array[0] : undefined;\n}\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function (string) {\n string = toString(string);\n var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined;\n var chr = strSymbols ? strSymbols[0] : string.charAt(0);\n var trailing = strSymbols ? castSlice(strSymbols, 1).join('') : string.slice(1);\n return chr[methodName]() + trailing;\n };\n}\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\n/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function (value, index, collection) {\n accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray$1(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n return func(collection, baseIteratee(iteratee), accumulator, initAccum, baseEach);\n}\n\n/** Used to store function metadata. */\nvar metaMap = WeakMap && new WeakMap();\n\n/**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar baseSetData = !metaMap ? identity : function (func, data) {\n metaMap.set(func, data);\n return func;\n};\n\n/**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCtor(Ctor) {\n return function () {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0:\n return new Ctor();\n case 1:\n return new Ctor(args[0]);\n case 2:\n return new Ctor(args[0], args[1]);\n case 3:\n return new Ctor(args[0], args[1], args[2]);\n case 4:\n return new Ctor(args[0], args[1], args[2], args[3]);\n case 5:\n return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6:\n return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7:\n return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n}\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1;\n\n/**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n function wrapper() {\n var fn = this && this !== root && this instanceof wrapper ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n}\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax$3 = Math.max;\n\n/**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax$3(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n}\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax$4 = Math.max;\n\n/**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax$4(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n}\n\n/**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\nfunction countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n}\n\n/**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\nfunction baseLodash() {\n // No operation performed.\n}\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH$1 = 4294967295;\n\n/**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\nfunction LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH$1;\n this.__views__ = [];\n}\n\n// Ensure `LazyWrapper` is an instance of `baseLodash`.\nLazyWrapper.prototype = baseCreate(baseLodash.prototype);\nLazyWrapper.prototype.constructor = LazyWrapper;\n\n/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop$1$1() {\n // No operation performed.\n}\n\n/**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\nvar getData = !metaMap ? noop$1$1 : function (func) {\n return metaMap.get(func);\n};\n\n/** Used to lookup unminified function names. */\nvar realNames = {};\n\n/** Used for built-in method references. */\nvar objectProto$g = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$d = objectProto$g.hasOwnProperty;\n\n/**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\nfunction getFuncName(func) {\n var result = func.name + '',\n array = realNames[result],\n length = hasOwnProperty$d.call(realNames, result) ? array.length : 0;\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n}\n\n/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\nfunction LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n}\nLodashWrapper.prototype = baseCreate(baseLodash.prototype);\nLodashWrapper.prototype.constructor = LodashWrapper;\n\n/**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\nfunction wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto$h = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$e = objectProto$h.hasOwnProperty;\n\n/**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\nfunction lodash(value) {\n if (isObjectLike(value) && !isArray$1(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty$e.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n}\n\n// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype = baseLodash.prototype;\nlodash.prototype.constructor = lodash;\n\n/**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\nfunction isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n}\n\n/**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar setData = shortOut(baseSetData);\n\n/** Used to match wrap detail comments. */\nvar reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n/**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\nfunction getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n}\n\n/** Used to match wrap detail comments. */\nvar reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/;\n\n/**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\nfunction insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n}\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG$1 = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n/** Used to associate wrap methods with their bit flags. */\nvar wrapFlags = [['ary', WRAP_ARY_FLAG], ['bind', WRAP_BIND_FLAG$1], ['bindKey', WRAP_BIND_KEY_FLAG], ['curry', WRAP_CURRY_FLAG], ['curryRight', WRAP_CURRY_RIGHT_FLAG], ['flip', WRAP_FLIP_FLAG], ['partial', WRAP_PARTIAL_FLAG], ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], ['rearg', WRAP_REARG_FLAG]];\n\n/**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\nfunction updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function (pair) {\n var value = '_.' + pair[0];\n if (bitmask & pair[1] && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n}\n\n/**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\nfunction setWrapToString(wrapper, reference, bitmask) {\n var source = reference + '';\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n}\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG$2 = 1,\n WRAP_BIND_KEY_FLAG$1 = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG$1 = 8,\n WRAP_PARTIAL_FLAG$1 = 32,\n WRAP_PARTIAL_RIGHT_FLAG$1 = 64;\n\n/**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG$1,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n bitmask |= isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1;\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);\n }\n var newData = [func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, argPos, ary, arity];\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n}\n\n/**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\nfunction getHolder(func) {\n var object = func;\n return object.placeholder;\n}\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin$1 = Math.min;\n\n/**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\nfunction reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin$1(indexes.length, arrLength),\n oldArray = copyArray(array);\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n}\n\n/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\nfunction replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n}\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG$3 = 1,\n WRAP_BIND_KEY_FLAG$2 = 2,\n WRAP_CURRY_FLAG$2 = 8,\n WRAP_CURRY_RIGHT_FLAG$1 = 16,\n WRAP_ARY_FLAG$1 = 128,\n WRAP_FLIP_FLAG$1 = 512;\n\n/**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG$1,\n isBind = bitmask & WRAP_BIND_FLAG$3,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,\n isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),\n isFlip = bitmask & WRAP_FLIP_FLAG$1,\n Ctor = isBindKey ? undefined : createCtor(func);\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, thisArg, args, newHolders, argPos, ary, arity - length);\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n}\n\n/**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder);\n length -= holders.length;\n if (length < arity) {\n return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, undefined, args, holders, undefined, undefined, arity - length);\n }\n var fn = this && this !== root && this instanceof wrapper ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n}\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG$4 = 1;\n\n/**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG$4,\n Ctor = createCtor(func);\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = this && this !== root && this instanceof wrapper ? Ctor : func;\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n}\n\n/** Used as the internal argument placeholder. */\nvar PLACEHOLDER$1 = '__lodash_placeholder__';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG$5 = 1,\n WRAP_BIND_KEY_FLAG$3 = 2,\n WRAP_CURRY_BOUND_FLAG$1 = 4,\n WRAP_CURRY_FLAG$3 = 8,\n WRAP_ARY_FLAG$2 = 128,\n WRAP_REARG_FLAG$1 = 256;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin$2 = Math.min;\n\n/**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\nfunction mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);\n var isCombo = srcBitmask == WRAP_ARY_FLAG$2 && bitmask == WRAP_CURRY_FLAG$3 || srcBitmask == WRAP_ARY_FLAG$2 && bitmask == WRAP_REARG_FLAG$1 && data[7].length <= source[8] || srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG$3;\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG$5) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG$2) {\n data[8] = data[8] == null ? source[8] : nativeMin$2(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n return data;\n}\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT$2 = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG$6 = 1,\n WRAP_BIND_KEY_FLAG$4 = 2,\n WRAP_CURRY_FLAG$4 = 8,\n WRAP_CURRY_RIGHT_FLAG$2 = 16,\n WRAP_PARTIAL_FLAG$2 = 32,\n WRAP_PARTIAL_RIGHT_FLAG$2 = 64;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax$5 = Math.max;\n\n/**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT$2);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax$5(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {\n var partialsRight = partials,\n holdersRight = holders;\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n var newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined ? isBindKey ? 0 : func.length : nativeMax$5(newData[9] - length, 0);\n if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {\n bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n}\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_FLAG$5 = 8;\n\n/**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\nfunction curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG$5, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n}\n\n// Assign default placeholders.\ncurry.placeholder = {};\n\n/**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\nfunction isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\n}\nvar DEFAULT_CAPTION_LANGUAGE_IDENTIFIER_STRING = 'en-US';\n\n// Simple function to convert HH:MM:SS,MMM or HH:MM:SS.MMM to SS.MMM\n// Assume valid, returns 0 on error\n/* eslint-disable no-magic-numbers, no-mixed-operators */\nfunction toSeconds(timeIn) {\n var t = timeIn.split(':');\n try {\n var s = t[2].split(',');\n\n // Just in case a . is decimal separator\n if (s.length === 1) {\n s = t[2].split('.');\n }\n return parseFloat(t[0], 10) * 3600 + parseFloat(t[1], 10) * 60 + parseFloat(s[0], 10) + parseFloat(s[1], 10) / 1000;\n } catch (e) {\n return 0;\n }\n}\n/* eslint-enable no-magic-numbers, no-mixed-operators */\n\nfunction nextNonEmptyLine(linesArray, position) {\n var idx = position;\n while (!linesArray[idx] && idx < linesArray.length) {\n idx++;\n }\n return idx;\n}\nfunction lastNonEmptyLine(linesArray) {\n var idx = linesArray.length - 1;\n while (idx >= 0 && !linesArray[idx]) {\n idx--;\n }\n return idx;\n}\nfunction _readCaptionsFromString(input, timeDelimiter, hasIdRow, languageIdentifierString) {\n languageIdentifierString = languageIdentifierString || DEFAULT_CAPTION_LANGUAGE_IDENTIFIER_STRING;\n var captionCollection = CaptionCollection$1.create();\n var i = 0;\n var index = 0;\n var lines;\n var time;\n var text;\n var endIndex;\n var caption;\n var timeSplitRegex = new RegExp('[\\\\t ]*' + timeDelimiter + '[\\\\t ]*');\n var SSATagRegex = /\\{(\\\\[\\w]+\\(?([\\w\\d]+,?)+\\)?)+\\}/gi;\n var lessThanRegex = /</g;\n var greaterThanRegex = />/g;\n var newlinePlaceholderRegex = /\\\\N/gi;\n\n // Here is where the magic happens\n // Split on line breaks\n lines = input.split(/(?:\\r\\n|\\r|\\n)/gm);\n endIndex = lastNonEmptyLine(lines) + 1;\n for (i = 0; i < endIndex; i++) {\n caption = {};\n text = [];\n i = nextNonEmptyLine(lines, i);\n if (hasIdRow) {\n caption.id = parseInt(lines[i++], 10);\n } else {\n caption.id = i;\n }\n\n // Split on delimiter (often '-->' or ','), trimming spaces as well\n time = lines[i++].split(timeSplitRegex);\n caption.start = toSeconds(time[0]);\n\n // So as to trim positioning information from end\n index = time[1].indexOf(' ');\n if (index !== -1) {\n time[1] = time[1].substring(0, index);\n }\n caption.end = toSeconds(time[1]);\n\n // Build single line of text from multi-line subtitle in file\n while (i < endIndex && lines[i]) {\n text.push(lines[i++]);\n }\n\n // Join into 1 line, SSA-style linebreaks\n // Strip out other SSA-style tags\n caption.text = text.join('\\\\N').replace(SSATagRegex, '');\n\n // Escape HTML entities\n caption.text = caption.text.replace(lessThanRegex, '<').replace(greaterThanRegex, '>');\n\n // Unescape great than and less than when it makes a valid html tag of a supported style (font, b, u, s, i)\n // Modified version of regex from Phil Haack's blog: http://haacked.com/archive/2004/10/25/usingregularexpressionstomatchhtml.aspx\n // Later modified by kev: http://kevin.deldycke.com/2007/03/ultimate-regular-expression-for-html-tag-parsing-with-php/\n //caption.text = caption.text.replace( /<(\\/?(font|b|u|i|s))((\\s+(\\w|\\w[\\w\\-]*\\w)(\\s*=\\s*(?:\\\".*?\\\"|'.*?'|[^'\\\">\\s]+))?)+\\s*|\\s*)(\\/?)>/gi, \"<$1$3$7>\" );\n caption.text = caption.text.replace(newlinePlaceholderRegex, '\\n');\n captionCollection.addCaption(Caption$1.create({\n startTime: caption.start * 1000,\n duration: caption.end * 1000 - caption.start * 1000,\n captionTextList: [CaptionText$1.create({\n text: caption.text,\n languageIdentifierString: languageIdentifierString\n })],\n horizontalAlignment: 'Center',\n verticalAlignment: 'Bottom'\n }));\n }\n var captionTrack = CaptionTrack$1.create({\n captions: captionCollection.captions,\n languageIdentifierString: languageIdentifierString\n });\n return captionTrack;\n}\nfunction padWithZero(inputNumber, width) {\n inputNumber = inputNumber + '';\n return inputNumber.length >= width ? inputNumber : new Array(width - inputNumber.length + 1).join('0') + inputNumber;\n}\nfunction formatMillisecondsToTimeCode(inputMilliseconds, options) {\n var date = new Date(inputMilliseconds);\n var hoursPaddingIsSet = options.hoursPadding || options.hoursPadding === 0;\n var hoursPadding = hoursPaddingIsSet ? options.hoursPadding : 2;\n var hours = padWithZero(date.getUTCHours(), hoursPadding);\n var minutes = padWithZero(date.getUTCMinutes(), 2);\n var seconds = padWithZero(date.getUTCSeconds(), 2);\n var rawMilliseconds = date.getUTCMilliseconds().toFixed(3).split('.')[0]; // eslint-disable-line no-magic-numbers\n var milliseconds = padWithZero(rawMilliseconds, 3); // eslint-disable-line no-magic-numbers\n\n var millisecondDelimiter = options.millisecondDelimiter ? options.millisecondDelimiter : ',';\n return hours + ':' + minutes + ':' + seconds + millisecondDelimiter + milliseconds;\n}\nfunction captionsToString(captionTrack, options) {\n function captionToString(output, caption, index) {\n var isBeginningOfString = index === 0;\n if (!isBeginningOfString) {\n output += '\\n\\n';\n }\n if (options.hasIdRow) {\n var oneBasedIndex = index + 1;\n output += oneBasedIndex;\n output += '\\n';\n }\n output += formatMillisecondsToTimeCode(caption.startTime, options) + options.timeDelimiter + formatMillisecondsToTimeCode(caption.endTime, options);\n output += '\\n';\n output += caption.text;\n return output;\n }\n return reduce(captionTrack.captionCollection.captions, captionToString, options.accumulator);\n}\nvar baseNewlineParser = {\n readCaptionsFromStringWithIdRow: function readCaptionsFromStringWithIdRow(input, timeDelimiter, languageIdentifierString) {\n return _readCaptionsFromString(input, timeDelimiter, true, languageIdentifierString);\n },\n readCaptionsFromString: function readCaptionsFromString(input, timeDelimiter, languageIdentifierString) {\n return _readCaptionsFromString(input, timeDelimiter, false, languageIdentifierString);\n },\n captionsToString: captionsToString,\n DEFAULT_CAPTION_LANGUAGE_IDENTIFIER_STRING: DEFAULT_CAPTION_LANGUAGE_IDENTIFIER_STRING\n};\nvar registerParser$1 = function registerParser$1() {\n captionParsers.register('SAMI', ['.sami', '.smi'], function () {\n var _xmlUtility = new XmlUtility();\n function getElementText(textElement) {\n var nonBreakingSpace = String.fromCharCode(0xA0); //eslint-disable-line no-magic-numbers\n var text = _xmlUtility.getElementText(textElement).replace(nonBreakingSpace, ' ');\n return text;\n }\n function getSyncTagText(tag) {\n var textElements = _xmlUtility.getElementsByTagName(tag, 'p');\n if (textElements.length < 1) {\n return getElementText(tag);\n }\n var elementsText = map(textElements, getElementText);\n return join(elementsText, '\\n');\n }\n function parseSyncTagToCaption(horizontalAlignment, languageIdentifierString, captionCollection, tag) {\n var startTime = +tag.getAttribute('start');\n var captionText = CaptionText$1.create({\n languageIdentifierString: languageIdentifierString,\n text: getSyncTagText(tag)\n });\n var createParams = {\n startTime: startTime,\n duration: 0,\n captionTextList: [captionText],\n horizontalAlignment: capitalize(horizontalAlignment.toLowerCase()),\n verticalAlignment: 'Bottom'\n };\n captionCollection.addCaption(Caption$1.create(createParams));\n return captionCollection;\n }\n function assignCaptionDurationsByFillingCaptionStartTimeGaps(captionCollection) {\n for (var i = 0; i < captionCollection.captions.length; i++) {\n var currentCaption = captionCollection.captions[i];\n var nextCaption = null;\n if (i + 1 < captionCollection.captions.length) {\n nextCaption = captionCollection.captions[i + 1];\n }\n var defaultDuration = 3000;\n var duration = nextCaption ? nextCaption.startTime - currentCaption.endTime : defaultDuration;\n currentCaption.setDuration(duration);\n }\n return captionCollection;\n }\n function removeHtmlComments(input) {\n return input.replace(/<!--|-->/g, '');\n }\n function cssColorToRGB(cssColorValue) {\n if (!cssColorValue) {\n return null;\n }\n var result = tinycolor$1(cssColorValue);\n if (!result.isValid()) {\n return null;\n }\n return result.toRgb();\n }\n function parseStyle(text) {\n var fontSizeNoDescriptorRegex = /font-size: *(\\d+);/g;\n text = text.replace(fontSizeNoDescriptorRegex, 'font-size: $1px;');\n var doc = document.implementation.createHTMLDocument('');\n var styleElement = doc.createElement('style');\n styleElement.textContent = text;\n doc.body.appendChild(styleElement);\n return styleElement.sheet.cssRules;\n }\n function getCaptionTrackCreateParams(xmlDoc) {\n var styleElements = xmlDoc.getElementsByTagName('style');\n if (styleElements.length < 1) {\n return {};\n }\n var styles = parseStyle(removeHtmlComments(styleElements[0].textContent));\n var captionStyle = find(styles, function (s) {\n return s.selectorText.toLowerCase() === 'p';\n });\n captionStyle = captionStyle || head(styles);\n return {\n fgColor: cssColorToRGB(captionStyle.style.color),\n bgColor: cssColorToRGB(captionStyle.style.backgroundColor),\n fontFamily: trim(captionStyle.style.fontFamily, '\"\\''),\n fontSize: captionStyle.style.fontSize,\n horizontalAlignment: captionStyle.style.textAlign || 'Center'\n };\n }\n function readCaptionsFromString(input, languageIdentifierString) {\n languageIdentifierString = languageIdentifierString || baseNewlineParser.DEFAULT_CAPTION_LANGUAGE_IDENTIFIER_STRING;\n var captionCollection = CaptionCollection$1.create();\n var xmlDoc = _xmlUtility.parseXml(input, 'text/html');\n if (!xmlDoc) {\n throw new Error('xmlDoc is null');\n }\n var syncElements = xmlDoc.getElementsByTagName('sync');\n var createCaptionTrackParams = getCaptionTrackCreateParams(xmlDoc);\n var parseSyncTagToCaptionWithHorizontalAlignment = curry(parseSyncTagToCaption)(createCaptionTrackParams.horizontalAlignment, languageIdentifierString);\n captionCollection = reduce(syncElements, parseSyncTagToCaptionWithHorizontalAlignment, captionCollection);\n captionCollection = assignCaptionDurationsByFillingCaptionStartTimeGaps(captionCollection);\n createCaptionTrackParams.captions = captionCollection.captions;\n createCaptionTrackParams.languageIdentifierString = languageIdentifierString;\n var captionTrack = CaptionTrack$1.create(createCaptionTrackParams);\n return captionTrack;\n }\n function captionToString(output, caption, nextCaption) {\n var text = caption.text;\n if (text) {\n text += '\\n';\n }\n output += '<SYNC start=\"' + caption.startTime + '\"><P class=\"ENCC\">' + text + '</P></SYNC>';\n if (nextCaption && nextCaption.startTime > caption.endTime) {\n output += '<SYNC start=\"' + caption.endTime + '\"><P class=\"ENCC\"></P></SYNC>';\n }\n return output;\n }\n function getTextAlignment(captionTrack) {\n var textAlignments = reduce(captionTrack.captionCollection.captions, function (alignments, caption) {\n var alignment = caption.horizontalAlignment;\n if (!alignment || has(alignments, alignment)) {\n return alignments;\n }\n alignments[alignment] = true;\n return alignments;\n }, {});\n var allAlignments = keys$1(textAlignments);\n return allAlignments.length === 1 ? allAlignments[0].toLowerCase() : 'center';\n }\n function captionsToString(captionTrack) {\n var fontSize = isInteger(captionTrack.fontSize) ? captionTrack.fontSize + 'pt' : captionTrack.fontSize;\n var fontFamily = captionTrack.fontFamily;\n var fgHexColor = captionTrack.fgHexColor;\n var bgHexColor = captionTrack.bgHexColor;\n var textAlign = getTextAlignment(captionTrack);\n\n /* eslint-disable no-tabs */\n var samiCaptionHeader = '<SAMI>' + '<HEAD><TITLE>Captions</TITLE><STYLE TYPE=\"text/css\">' + '<!--' + 'P {\tmargin-left: 1pt;' + 'margin-right: 1pt;' + 'margin-bottom: 2pt;' + 'margin-top: 2pt;' + 'text-align: ' + textAlign + ';' + 'font-size: ' + fontSize + ';' + 'font-family: ' + fontFamily + ';' + 'font-weight: normal;' + 'font-style: normal;' + 'background-color: ' + bgHexColor + ';' + 'color: ' + fgHexColor + '; }' + '.ENCC {Name: English; lang: en-US; SAMI_Type: CC;}' + '-->' + '</STYLE></HEAD>' + '<BODY>';\n var samiCaptionFooter = '</BODY>' + '</SAMI>';\n /* eslint-enable no-tabs */\n\n var output = samiCaptionHeader;\n var captionCollection = captionTrack.captionCollection;\n for (var i = 0; i < captionCollection.captions.length; i++) {\n var currentCaption = captionCollection.captions[i];\n var isLastCaption = i === captionCollection.captions.length - 1;\n var nextCaption = isLastCaption ? null : captionCollection.captions[i + 1];\n output = captionToString(output, currentCaption, nextCaption);\n }\n output += samiCaptionFooter;\n return output;\n }\n return {\n deserialize: readCaptionsFromString,\n serialize: captionsToString\n };\n });\n};\nvar samiParser = {\n registerParser: registerParser$1\n};\nvar registerParser$2 = function registerParser$2() {\n captionParsers.register('SBV', ['.sbv'], function () {\n var sbvTimeDelimiter = ',';\n function readCaptionsFromString(input, languageIdentifierString) {\n return baseNewlineParser.readCaptionsFromString(input, sbvTimeDelimiter, languageIdentifierString);\n }\n function captionsToString(captionCollection) {\n return baseNewlineParser.captionsToString(captionCollection, {\n timeDelimiter: sbvTimeDelimiter,\n accumulator: '',\n hoursPadding: 1\n });\n }\n return {\n deserialize: readCaptionsFromString,\n serialize: captionsToString\n };\n });\n};\nvar sbvParser = {\n registerParser: registerParser$2\n};\nvar registerParser$3 = function registerParser$3() {\n captionParsers.register('SRT', ['.srt'], function () {\n var srtEndOfFileMarker = '\\n\\n\\n';\n var srtTimeDelimiter = ' --> ';\n function readCaptionsFromString(input, languageIdentifierString) {\n return baseNewlineParser.readCaptionsFromStringWithIdRow(input, srtTimeDelimiter.trim(), languageIdentifierString);\n }\n function captionsToString(captionCollection) {\n var captionString = baseNewlineParser.captionsToString(captionCollection, {\n timeDelimiter: srtTimeDelimiter,\n accumulator: '\\n\\n',\n hasIdRow: true\n });\n return captionString + srtEndOfFileMarker;\n }\n return {\n deserialize: readCaptionsFromString,\n serialize: captionsToString\n };\n });\n};\nvar srtParser = {\n registerParser: registerParser$3\n};\nvar registerParser$4 = function registerParser$4() {\n captionParsers.register('TTML', ['.ttml', '.dfxp'], function () {\n // Code below is taken from https://github.com/mozilla/popcorn-js/blob/master/parsers/parserTTML/popcorn.parserTTML.js\n\n var rWhitespace = /^[\\s]+|[\\s]+$/gm;\n var rLineBreak = /(?:\\r\\n|\\r|\\n)/gm;\n var rBreakTag = /(<br *\\/?>)/gm;\n\n // Parse the children of the given node\n function parseChildren(node, timeOffset, region) {\n var currNode = node.firstChild;\n var currRegion = getNodeRegion(node, region);\n var retVal = [];\n var newOffset;\n while (currNode) {\n if (currNode.nodeType === 1) {\n if (currNode.nodeName === 'p') {\n // p is a textual node, process contents as subtitle\n retVal.push(parseNode(currNode, timeOffset, currRegion));\n } else if (currNode.nodeName === 'div') {\n // div is container for subtitles, recurse\n newOffset = toSeconds(currNode.getAttribute('begin'));\n if (newOffset < 0) {\n newOffset = timeOffset;\n }\n retVal.push.apply(retVal, parseChildren(currNode, newOffset, currRegion));\n }\n }\n currNode = currNode.nextSibling;\n }\n return retVal;\n }\n\n // Get the \"region\" attribute of a node, to know where to put the subtitles\n function getNodeRegion(node, defaultTo) {\n var region = node.getAttribute('region');\n if (region !== null) {\n return region;\n }\n return defaultTo || '';\n }\n\n // Parse a node for text content\n function parseNode(node, timeOffset, region) {\n var sub = {};\n\n // Trim left and right whitespace from text and convert non-explicit line breaks\n sub.text = (node.textContent || node.text).replace(rWhitespace, '').replace(rLineBreak, '<br />');\n sub.id = node.getAttribute('xml:id') || node.getAttribute('id');\n sub.start = toSeconds(node.getAttribute('begin'), timeOffset);\n sub.end = toSeconds(node.getAttribute('end'), timeOffset);\n sub.target = getNodeRegion(node, region);\n if (sub.end < 0) {\n // No end given, infer duration if possible\n // Otherwise, give end as MAX_VALUE\n sub.end = toSeconds(node.getAttribute('duration'), 0);\n if (sub.end >= 0) {\n sub.end += sub.start;\n } else {\n sub.end = Number.MAX_VALUE;\n }\n }\n return {\n subtitle: sub\n };\n }\n function toTimelineSeconds(timeStr, framerate) {\n // Hours and minutes are optional\n // Seconds must be specified\n // Seconds can be followed by milliseconds OR by the frame information\n var validTimeFormat = /^([0-9]+:){0,2}[0-9]+([.;][0-9]+)?$/;\n var errorMessage = 'Invalid time format';\n var digitPairs;\n var lastIndex;\n var lastPair;\n var firstPair;\n var frameInfo;\n var frameTime;\n if (typeof timeStr === 'number') {\n return timeStr;\n }\n if (typeof timeStr === 'string' && !validTimeFormat.test(timeStr)) {\n throw errorMessage;\n }\n digitPairs = timeStr.split(':');\n lastIndex = digitPairs.length - 1;\n lastPair = digitPairs[lastIndex];\n\n // Fix last element:\n if (lastPair.indexOf(';') > -1) {\n frameInfo = lastPair.split(';');\n frameTime = 0;\n if (framerate && typeof framerate === 'number') {\n frameTime = parseFloat(frameInfo[1], 10) / framerate;\n }\n digitPairs[lastIndex] = parseInt(frameInfo[0], 10) + frameTime;\n }\n firstPair = digitPairs[0];\n\n /* eslint-disable no-magic-numbers, no-mixed-operators */\n return {\n 1: parseFloat(firstPair, 10),\n 2: parseInt(firstPair, 10) * 60 + parseFloat(digitPairs[1], 10),\n 3: parseInt(firstPair, 10) * 3600 + parseInt(digitPairs[1], 10) * 60 + parseFloat(digitPairs[2], 10)\n }[digitPairs.length || 1];\n /* eslint-enable no-magic-numbers, no-mixed-operators */\n }\n\n // Convert time expression to SS.mmm\n // Expression may be absolute to timeline (hh:mm:ss.ms)\n // or relative ( decimal followed by metric ) ex: 3.4s, 5.7m\n // Returns -1 if invalid\n function toSeconds(timeIn, offset) {\n var i;\n if (!timeIn) {\n return -1;\n }\n try {\n return toTimelineSeconds(timeIn);\n } catch (e) {\n i = getMetricIndex(timeIn);\n return parseFloat(timeIn.substring(0, i)) * getMultipler(timeIn.substring(i)) + (offset || 0);\n }\n }\n\n // In a time string such as 3.4ms, get the index of the first character (m) of the time metric (ms)\n function getMetricIndex(timeIn) {\n var i = timeIn.length - 1;\n while (i >= 0 && timeIn[i] <= '9' && timeIn[i] >= '0') {\n i--;\n }\n return i;\n }\n\n // Determine multiplier for metric relative to seconds\n function getMultipler(metric) {\n return {\n h: 3600,\n m: 60,\n s: 1,\n ms: 0.001\n }[metric] || -1;\n }\n function readCaptionsFromString(input, languageIdentifierString) {\n languageIdentifierString = languageIdentifierString || baseNewlineParser.DEFAULT_CAPTION_LANGUAGE_IDENTIFIER_STRING;\n var captionCollection = CaptionCollection$1.create();\n var node;\n var xmlDocument;\n\n // Null checks\n if (!input) {\n return null;\n }\n input = input.replace(/<head>.*<\\/head>/, '');\n input = input.replace(rBreakTag, '\\\\N');\n var _xmlUtility = new XmlUtility();\n xmlDocument = _xmlUtility.parseXml(input);\n if (!xmlDocument) {\n return captionCollection;\n }\n node = xmlDocument.documentElement.firstChild;\n\n // Find body tag\n while (node.nodeName !== 'body') {\n node = node.nextSibling;\n }\n if (node) {\n var captions = parseChildren(node, 0);\n map(captions, function (caption) {\n caption = caption.subtitle;\n var createParams = {\n startTime: caption.start * 1000,\n duration: caption.end * 1000 - caption.start * 1000,\n captionTextList: [CaptionText$1.create({\n text: caption.text.replace('\\\\N', '\\n'),\n languageIdentifierString: languageIdentifierString\n })],\n horizontalAlignment: 'Center',\n verticalAlignment: 'Bottom'\n };\n captionCollection.addCaption(Caption$1.create(createParams));\n });\n }\n var captionTrack = CaptionTrack$1.create({\n captions: captionCollection.captions,\n languageIdentifierString: languageIdentifierString\n });\n return captionTrack;\n }\n function captionToString(output, caption, index) {\n var oneBasedIndex = index + 1;\n output += '<p xml:id=\"subtitle' + oneBasedIndex + '\" begin=\"' + caption.startTime / 1000 + 's\" end=\"' + caption.endTime / 1000 + 's\">' + caption.text + '</p>';\n return output;\n }\n function captionsToString(captionTrack) {\n var ttmlHeader = '<?xml version=\"1.0\" encoding=\"UTF-8\"?><tt xmlns:tts=\"http://www.w3.org/2006/04/ttaf1#styling\" xmlns=\"http://www.w3.org/2006/04/ttaf1\">' + '<head>' + '<metadata xmlns:ttm=\"http://www.w3.org/ns/ttml#metadata\"><ttm:title>Captions</ttm:title></metadata>' + '<styling xmlns:tts=\"http://www.w3.org/ns/ttml#styling\"><style xml:id=\"s1\" tts:color=\"white\" tts:fontFamily=\"proportionalSansSerif\" tts:fontSize=\"22px\" tts:textAlign=\"center\" /></styling>' + '<layout xmlns:tts=\"http://www.w3.org/ns/ttml#styling\"><region xml:id=\"subtitleArea\" style=\"s1\" tts:extent=\"560px 62px\" tts:padding=\"5px 3px\" tts:backgroundColor=\"black\" tts:displayAlign=\"after\" /></layout>' + '</head>' + '<body region=\"subtitleArea\">' + '<div>';\n var ttmlFooter = '</div></body></tt>';\n var output = ttmlHeader;\n for (var i = 0; i < captionTrack.captionCollection.captions.length; i++) {\n var currentCaption = captionTrack.captionCollection.captions[i];\n output = captionToString(output, currentCaption, i);\n }\n output += ttmlFooter;\n return output;\n }\n return {\n deserialize: readCaptionsFromString,\n serialize: captionsToString\n };\n });\n};\nvar ttmlParser = {\n registerParser: registerParser$4\n};\nvar registerParser$5 = function registerParser$5() {\n captionParsers.register('VTT', ['.vtt'], function () {\n var vttTimeDelimiter = '-->';\n\n // [HH:]MM:SS.mmm string to SS.mmm float\n // Throws exception if invalid\n /* eslint-disable no-magic-numbers, no-mixed-operators */\n function toSeconds(timeIn) {\n var t = timeIn.split(':');\n var l = timeIn.length;\n var time;\n\n // Invalid time string provided\n if (l !== 12 && l !== 9) {\n throw new Error('Bad cue');\n }\n l = t.length - 1;\n try {\n time = parseInt(t[l - 1], 10) * 60 + parseFloat(t[l], 10);\n\n // Hours were given\n if (l === 2) {\n time += parseInt(t[0], 10) * 3600;\n }\n } catch (e) {\n throw new Error('Bad cue');\n }\n return time;\n }\n /* eslint-enable no-magic-numbers, no-mixed-operators */\n\n function parseCueHeader(line) {\n var lineSegments;\n var sub = {};\n var rToken = /-->/;\n var rWhitespace = /[\\t ]+/;\n if (!line || line.indexOf(vttTimeDelimiter) === -1) {\n throw new Error('Bad cue');\n }\n lineSegments = line.replace(rToken, ' ' + vttTimeDelimiter + ' ').split(rWhitespace);\n if (lineSegments.length < 2) {\n throw new Error('Bad cue');\n }\n sub.id = line;\n sub.start = toSeconds(lineSegments[0]);\n sub.end = toSeconds(lineSegments[2]);\n return sub;\n }\n function skipWhitespace(lines, len, i) {\n while (i < len && !lines[i]) {\n i++;\n }\n return i;\n }\n function skipNonWhitespace(lines, len, i) {\n while (i < len && lines[i]) {\n i++;\n }\n return i;\n }\n function skipToCueHeader(lines, len, i) {\n while (i < len && lines[i].indexOf(vttTimeDelimiter) === -1) {\n i++;\n }\n return i;\n }\n function readCaptionsFromString(input, languageIdentifierString) {\n languageIdentifierString = languageIdentifierString || baseNewlineParser.DEFAULT_CAPTION_LANGUAGE_IDENTIFIER_STRING;\n var captionCollection = CaptionCollection$1.create();\n var i = 0;\n var len = 0;\n var lines;\n var text;\n var sub;\n var newlineRegex = /(?:\\r\\n|\\r|\\n)/gm;\n var breakTagRegex = /(<br *\\/?>)/gm;\n\n // Here is where the magic happens\n // Split on line breaks\n lines = input.split(newlineRegex);\n len = lines.length;\n\n // Check for BOF token\n if (len === 0 || lines[0] !== 'WEBVTT') {\n return captionCollection;\n }\n i++;\n while (i < len) {\n text = [];\n try {\n i = skipWhitespace(lines, len, i);\n i = skipToCueHeader(lines, len, i);\n sub = parseCueHeader(lines[i++]);\n\n // Build single line of text from multi-line subtitle in file\n while (i < len && lines[i]) {\n text.push(lines[i++]);\n }\n\n // Join lines together to one and build subtitle text\n sub.text = text.join('\\n').replace(breakTagRegex, '\\n');\n sub.text = new window.DOMParser().parseFromString(sub.text, 'text/html').documentElement.textContent;\n var createParams = {\n startTime: sub.start * 1000,\n duration: sub.end * 1000 - sub.start * 1000,\n captionTextList: [CaptionText$1.create({\n text: sub.text,\n languageIdentifierString: languageIdentifierString\n })],\n horizontalAlignment: 'Center',\n verticalAlignment: 'Bottom'\n };\n captionCollection.addCaption(Caption$1.create(createParams));\n } catch (e) {\n i = skipNonWhitespace(lines, len, i);\n }\n }\n var captionTrack = CaptionTrack$1.create({\n captions: captionCollection.captions,\n languageIdentifierString: languageIdentifierString\n });\n return captionTrack;\n }\n function captionsToString(captionCollection) {\n var captionString = baseNewlineParser.captionsToString(captionCollection, {\n timeDelimiter: vttTimeDelimiter,\n accumulator: 'WEBVTT\\n\\n',\n hasIdRow: false,\n millisecondDelimiter: '.'\n });\n return captionString;\n }\n return {\n deserialize: readCaptionsFromString,\n serialize: captionsToString\n };\n });\n};\nvar vttParser = {\n registerParser: registerParser$5\n};\nsamiParser.registerParser();\nsbvParser.registerParser();\nsrtParser.registerParser();\nttmlParser.registerParser();\nvttParser.registerParser();\n\nvar _registeredExceptionListeners = [];\nvar _registeredMessageListeners = [];\nvar removeValueFromArray = function removeValueFromArray(array, value) {\n var index = -1;\n for (var i = 0; i < array.length; i++) {\n if (array[i] === value) {\n index = i;\n break;\n }\n }\n if (index !== -1) {\n array.splice(index, 1);\n return true;\n }\n return false;\n};\nvar log = {\n logException: function logException(error) {\n _registeredExceptionListeners.forEach(function (callback) {\n callback(new Error(error));\n });\n },\n logMessage: function logMessage(message) {\n _registeredMessageListeners.forEach(function (callback) {\n callback(message);\n });\n },\n addEventListener: function addEventListener(type, listener) {\n if (listener && typeof listener === 'function') {\n if (type === 'EXCEPTION') {\n _registeredExceptionListeners.push(listener);\n } else if (type === 'MESSAGE') {\n _registeredMessageListeners.push(listener);\n } else {\n throw new Error('log.js: addEventListener() Type argument was not EXCEPTION or MESSAGE');\n }\n } else {\n throw new Error('log.js: addEventListener() Listener argument was not a function');\n }\n },\n removeEventListener: function removeEventListener(type, listener) {\n var throwError = function throwError() {\n throw new Error('log.js: removeEventListener() ' + listener + ' was not found within the ' + type + ' callbacks.');\n };\n if (type === 'EXCEPTION') {\n if (!removeValueFromArray(_registeredExceptionListeners, listener)) {\n throwError();\n }\n } else if (type === 'MESSAGE') {\n if (!removeValueFromArray(_registeredMessageListeners, listener)) {\n throwError();\n }\n } else {\n throw new Error('log.js: removeEventListener() Type argument was not EXCEPTION or MESSAGE');\n }\n },\n removeAllEventListeners: function removeAllEventListeners() {\n _registeredExceptionListeners = [];\n _registeredMessageListeners = [];\n }\n};\n\nvar playerStringNames = Object.freeze({\n accessBtnAnswersSubmitted: 'accessBtnAnswersSubmitted',\n accessBtnAudioDescription: 'accessBtnAudioDescription',\n accessBtnClearSearch: 'accessBtnClearSearch',\n accessBtnClickToReplayLink: 'accessBtnClickToReplayLink',\n accessBtnClosedCaption: 'accessBtnClosedCaption',\n accessBtnCorrectOutOf: 'accessBtnCorrectOutOf',\n accessResultsLabelCorrectSuffix: 'accessResultsLabelCorrectSuffix',\n accessResultsLabelIncorrectSuffix: 'accessResultsLabelIncorrectSuffix',\n accessResultsLabelNoResponseSuffix: 'accessResultsLabelNoResponseSuffix',\n accessResultsLabelNoResponseGradedSuffix: 'accessResultsLabelNoResponseGradedSuffix',\n accessBtnFullScreen: 'accessBtnFullScreen',\n accessBtnFullScreenExpand: 'accessBtnFullScreenExpand',\n accessBtnGradedQuestions: 'accessBtnGradedQuestions',\n accessBtnHideAnswer: 'accessBtnHideAnswer',\n accessBtnHideQuiz: 'accessBtnHideQuiz',\n accessBtnPreviousQuestion: 'accessBtnPreviousQuestion',\n accessBtnNextQuestion: 'accessBtnNextQuestion',\n accessBtnNext: 'accessBtnNext',\n accessBtnPip: 'accessBtnPip',\n accessBtnPlay: 'accessBtnPlay',\n accessBtnPrevious: 'accessBtnPrevious',\n accessBtnProgressBar: 'accessBtnProgressBar',\n accessBtnRewind: 'accessBtnRewind',\n accessBtnForward: 'accessBtnForward',\n accessBtnSettings: 'accessBtnSettings',\n accessBtnShowAnswer: 'accessBtnShowAnswer',\n accessBtnShowQuiz: 'accessBtnShowQuiz',\n accessBtnTableOfContents: 'accessBtnTableOfContents',\n accessBtnTakeQuiz: 'accessBtnTakeQuiz',\n accessBtnVolume: 'accessBtnVolume',\n accessBtnWasNotGraded: 'accessBtnWasNotGraded',\n accessBtnWereNotGraded: 'accessBtnWereNotGraded',\n accessListNoSearchResults: 'accessListNoSearchResults',\n accessListSearchResults: 'accessListSearchResults',\n accessListTableOfContents: 'accessListTableOfContents',\n accessQuestionSetConfirmationTitle: 'accessQuestionSetConfirmationTitle',\n accessQuizResults: 'accessQuizResults',\n accessQuestionFeedbackContext: 'accessQuestionFeedbackContext',\n accessTxtVolume: 'accessTxtVolume',\n accessVideoPausedForQuiz: 'accessVideoPausedForQuiz',\n accessQuizHidden: 'accessQuizHidden',\n accessQuizShown: 'accessQuizShown',\n accessProgressBarTimeConjunction: 'accessProgressBarTimeConjunction',\n accessPlayerSettingsClose: 'accessPlayerSettingsClose',\n accessBtnTheaterMode: 'accessBtnTheaterMode',\n accessBtnExitTheaterMode: 'accessBtnExitTheaterMode',\n ccLanguageText: 'ccLanguageText',\n close: 'close',\n mediaNotFound: 'mediaNotFound',\n noWebMSupport: 'noWebMSupport',\n playerRateOptionsText: 'playerRateOptionsText',\n playerRateText: 'playerRateText',\n scormApiNotFoundMessage: 'scormApiNotFoundMessage',\n search: 'search',\n searchDisabledFullScreen: 'searchDisabledFullScreen',\n searchPlaceholder: 'searchPlaceholder',\n txtAnswerQuestion: 'txtAnswerQuestion',\n txtBadImageQuiz: 'txtBadImageQuiz',\n txtBegin: 'txtBegin',\n txtContinue: 'txtContinue',\n txtCorrect: 'txtCorrect',\n txtCorrectAnswer: 'txtCorrectAnswer',\n txtCorrectString: 'txtCorrectString',\n txtEnterEmail: 'txtEnterEmail',\n txtEnterFirstName: 'txtEnterFirstName',\n txtEnterLastName: 'txtEnterLastName',\n txtHotspot: 'txtHotspot',\n txtHotspotScreenReaderAlert: 'txtHotspotScreenReaderAlert',\n txtHotspotScreenReaderAlertPlural: 'txtHotspotScreenReaderAlertPlural',\n txtImageQuizNetworkErrorMessage: 'txtImageQuizNetworkErrorMessage',\n txtIncorrect: 'txtIncorrect',\n txtIncorrectString: 'txtIncorrectString',\n txtJumpToMedia: 'txtJumpToMedia',\n txtJumpToTime: 'txtJumpToTime',\n txtLoaderMessageDefinition: 'txtLoaderMessageDefinition',\n txtNext: 'txtNext',\n txtHideQuiz: 'txtHideQuiz',\n txtOpenLink: 'txtOpenLink',\n txtOpenLinkHeader: 'txtOpenLinkHeader',\n txtOpenLinkSubHeader: 'txtOpenLinkSubHeader',\n txtPrev: 'txtPrev',\n txtQuestionCount: 'txtQuestionCount',\n txtQuizBadDefinitionMessage: 'txtQuizBadDefinitionMessage',\n txtQuizErrorMessage: 'txtQuizErrorMessage',\n txtQuizOutOfDateMessage: 'txtQuizOutOfDateMessage',\n txtQuizOutOfDateRefreshButtonText: 'txtQuizOutOfDateRefreshButtonText',\n txtReplayVideo: 'txtReplayVideo',\n txtRequiredMessage: 'txtRequiredMessage',\n txtResults: 'txtResults',\n txtReview: 'txtReview',\n txtReviewAnswer: 'txtReviewAnswer',\n txtSkip: 'txtSkip',\n txtSubmit: 'txtSubmit',\n txtSubmittingAnswers: 'txtSubmittingAnswers',\n txtVideoQuizNetworkErrorMessage: 'txtVideoQuizNetworkErrorMessage',\n txtVisitSite: 'txtVisitSite',\n txtYourAnswer: 'txtYourAnswer',\n videoLoading: 'videoLoading',\n videoNotSupported: 'videoNotSupported',\n xmpSecurity: 'xmpSecurity',\n xmpError: 'xmpError',\n confirmOpenUrlModalScreenReaderAlertText: 'confirmOpenUrlModalScreenReaderAlertText',\n confirmOpenUrlConfirmButtonScreenReaderText: 'confirmOpenUrlConfirmButtonScreenReaderText',\n fastForwardDisabledScreenReaderText: 'fastForwardDisabledScreenReaderText',\n scormCompleteVideoLater: 'scormCompleteVideoLater',\n scormCompleteVideo: 'scormCompleteVideo',\n scormExitVideo: 'scormExitVideo',\n scormConfirmCompleteModalText: 'scormConfirmCompleteModalText',\n scormConfirmCompleteModalRestartVideoText: 'scormConfirmCompleteModalRestartVideoText',\n scormConfirmCompleteModalResumeVideoText: 'scormConfirmCompleteModalResumeVideoText',\n scormConfirmCompleteModalFailedToSaveProgressText: 'scormConfirmCompleteModalFailedToSaveProgressText',\n scormConfirmCompleteModalDismissButtonText: 'scormConfirmCompleteModalDismissButtonText',\n scormConfirmCompleteModalDismissButtonScreenReaderText: 'scormConfirmCompleteModalDismissButtonScreenReaderText',\n scormConfirmCompleteModalConfirmButtonText: 'scormConfirmCompleteModalConfirmButtonText',\n scormConfirmCompleteModalConfirmButtonScreenReaderText: 'scormConfirmCompleteModalConfirmButtonScreenReaderText',\n scormSessionEndedText: 'scormSessionEndedText',\n searchOrJumpTo: 'searchOrJumpTo',\n searchTextCleared: 'searchTextCleared',\n searchResultsUpdated: 'searchResultsUpdated',\n tableOfContentsDisplayed: 'tableOfContentsDisplayed',\n tableOfContentsHidden: 'tableOfContentsHidden',\n defaultMediaTitle: 'defaultMediaTitle',\n hideThumbnailDueToQuiz: 'hideThumbnailDueToQuiz',\n defaultFirstChapterName: 'defaultFirstChapterName',\n acknowledgementLinkName: 'acknowledgementLinkName'\n});\n\nvar strings$7 = {};\nstrings$7[playerStringNames.xmpError] = 'There seems to be a problem accessing certain features of this video. Please contact the video Author.';\nstrings$7[playerStringNames.xmpSecurity] = 'Certain features in your video are currently disabled due to Local Network Security. These features work correctly when the video is played from a Website or Server.';\nstrings$7[playerStringNames.videoNotSupported] = 'Your browser cannot play this video.';\nstrings$7[playerStringNames.noWebMSupport] = 'This browser does not support WebM video.';\nstrings$7[playerStringNames.search] = 'Search';\nstrings$7[playerStringNames.searchPlaceholder] = 'Search...';\nstrings$7[playerStringNames.playerRateText] = 'Playback Speed';\nstrings$7[playerStringNames.playerRateOptionsText] = {\n 0.25: '0.25',\n 0.5: '0.5',\n 0.75: '0.75',\n 1: 'normal',\n 1.25: '1.25',\n 1.5: '1.5',\n 1.75: '1.75',\n 2.0: '2.0'\n};\nstrings$7[playerStringNames.ccLanguageText] = 'Closed Captions';\nstrings$7[playerStringNames.searchDisabledFullScreen] = 'Search is disabled in fullscreen mode.';\nstrings$7[playerStringNames.mediaNotFound] = 'We\\'re sorry, but we are unable to connect to this content. Please try refreshing the page or <a href=\\'https://www.techsmith.com/redirect.asp?target=media_not_found&ver=4.*.*&lang=enu&os=na&product=smartplayer\\' target=\\'_blank\\'> click here for more help.</a>';\nstrings$7[playerStringNames.videoLoading] = 'The video is loading.';\nstrings$7[playerStringNames.close] = 'Close';\nstrings$7[playerStringNames.txtRequiredMessage] = 'The content owner requests the following:';\nstrings$7[playerStringNames.txtSkip] = 'Continue without Questions';\nstrings$7[playerStringNames.txtBegin] = 'Submit and Continue';\nstrings$7[playerStringNames.txtEnterFirstName] = 'Enter first name';\nstrings$7[playerStringNames.txtEnterLastName] = 'Enter last name';\nstrings$7[playerStringNames.txtEnterEmail] = 'Enter email address';\nstrings$7[playerStringNames.txtHotspot] = 'Hotspot';\nstrings$7[playerStringNames.txtHotspotScreenReaderAlert] = '{{numberOfHotspots}} new Hotspot';\nstrings$7[playerStringNames.txtHotspotScreenReaderAlertPlural] = '{{numberOfHotspots}} new Hotspots';\nstrings$7[playerStringNames.txtJumpToMedia] = 'Jump to media';\nstrings$7[playerStringNames.txtJumpToTime] = 'Jump to time';\nstrings$7[playerStringNames.txtOpenLink] = 'Open link';\nstrings$7[playerStringNames.txtOpenLinkHeader] = 'This video would like to send you to:';\nstrings$7[playerStringNames.txtOpenLinkSubHeader] = '';\nstrings$7[playerStringNames.txtReview] = 'Replay Last Section';\nstrings$7[playerStringNames.txtReplayVideo] = 'Replay Video';\nstrings$7[playerStringNames.txtAnswerQuestion] = 'Take Quiz Now';\nstrings$7[playerStringNames.txtPrev] = 'Previous';\nstrings$7[playerStringNames.txtNext] = 'Next';\nstrings$7[playerStringNames.txtHideQuiz] = 'Hide';\nstrings$7[playerStringNames.txtSubmit] = 'Submit Answers';\nstrings$7[playerStringNames.txtSubmittingAnswers] = 'Submitting answers.';\nstrings$7[playerStringNames.txtContinue] = 'Continue';\nstrings$7[playerStringNames.txtReviewAnswer] = 'View Answers';\nstrings$7[playerStringNames.txtBadImageQuiz] = 'We\\'re sorry, the requested quiz is not compatible with images and could not be loaded. Please contact the author of this quiz.';\nstrings$7[playerStringNames.txtVideoQuizNetworkErrorMessage] = 'We\\'re sorry, a network error has prevented the quiz from loading. The video is available to view. To try and reload the quiz, refresh the browser page or check your network connection.';\nstrings$7[playerStringNames.txtImageQuizNetworkErrorMessage] = 'We’re sorry, a network error has prevented the quiz from loading. The image is available to view. To try and reload the quiz, refresh the browser page or check your network connection.';\nstrings$7[playerStringNames.txtQuizErrorMessage] = 'We\\'re attempting to save your response. Please make sure you have an active internet connection.';\nstrings$7[playerStringNames.txtQuizOutOfDateMessage] = 'The quiz questions have changed. Please refresh the player to get the latest quiz.';\nstrings$7[playerStringNames.txtQuizBadDefinitionMessage] = 'Invalid Quiz. Unable to submit quiz feedback. Please refer the video owner to <a href=\"https://www.techsmith.com/redirect.asp?target=bad_quiz_definition&ver=5.*.*&lang=enu&os=na&product=smartplayer\" target=\"_blank\">this help article</a>.';\nstrings$7[playerStringNames.txtQuizOutOfDateRefreshButtonText] = 'Refresh Player';\nstrings$7[playerStringNames.txtLoaderMessageDefinition] = 'The quiz is loading.';\nstrings$7[playerStringNames.txtQuestionCount] = 'Question {{currentQuestion}} of {{totalQuestions}}';\nstrings$7[playerStringNames.txtResults] = 'Results: ';\nstrings$7[playerStringNames.txtCorrectString] = 'Correct';\nstrings$7[playerStringNames.txtIncorrectString] = 'Incorrect';\nstrings$7[playerStringNames.txtCorrect] = '{{numberCorrect}} Correct';\nstrings$7[playerStringNames.txtIncorrect] = '{{numberIncorrect}} Incorrect';\nstrings$7[playerStringNames.txtYourAnswer] = 'Your answer: ';\nstrings$7[playerStringNames.txtCorrectAnswer] = 'Correct answer: ';\nstrings$7[playerStringNames.txtVisitSite] = 'Visit Site';\nstrings$7[playerStringNames.accessBtnAudioDescription] = 'Audio Description';\nstrings$7[playerStringNames.accessBtnClearSearch] = 'Clear Search';\nstrings$7[playerStringNames.accessBtnRewind] = 'Skip back {{duration}} seconds';\nstrings$7[playerStringNames.accessBtnForward] = 'Skip forward {{duration}} seconds';\nstrings$7[playerStringNames.accessBtnPlay] = 'Play Video';\nstrings$7[playerStringNames.accessBtnPrevious] = 'Previous';\nstrings$7[playerStringNames.accessBtnNext] = 'Next';\nstrings$7[playerStringNames.accessBtnProgressBar] = 'Progress bar slider';\nstrings$7[playerStringNames.accessBtnVolume] = 'Mute';\nstrings$7[playerStringNames.accessTxtVolume] = 'Volume';\nstrings$7[playerStringNames.accessBtnClosedCaption] = 'Closed Caption';\nstrings$7[playerStringNames.accessBtnTableOfContents] = 'Show Chapters (T)';\nstrings$7[playerStringNames.accessBtnSettings] = 'Player Settings';\nstrings$7[playerStringNames.accessBtnPip] = 'Picture-in-Picture';\nstrings$7[playerStringNames.accessBtnFullScreen] = 'Full Screen';\nstrings$7[playerStringNames.accessBtnFullScreenExpand] = 'Open in new tab';\nstrings$7[playerStringNames.accessBtnTakeQuiz] = 'Click to take the quiz.';\nstrings$7[playerStringNames.accessBtnShowQuiz] = 'Show Quiz';\nstrings$7[playerStringNames.accessBtnHideQuiz] = 'Hide Quiz';\nstrings$7[playerStringNames.accessBtnPreviousQuestion] = 'Previous question';\nstrings$7[playerStringNames.accessBtnNextQuestion] = 'Next question';\nstrings$7[playerStringNames.accessQuizHidden] = 'Quiz has been hidden';\nstrings$7[playerStringNames.accessQuizShown] = 'Quiz is now displayed';\nstrings$7[playerStringNames.accessBtnShowAnswer] = 'Show Answers';\nstrings$7[playerStringNames.accessBtnHideAnswer] = 'Hide Answers';\nstrings$7[playerStringNames.accessBtnAnswersSubmitted] = 'Answers Submitted!';\nstrings$7[playerStringNames.accessBtnWereNotGraded] = ' were not graded.';\nstrings$7[playerStringNames.accessBtnWasNotGraded] = ' was not graded.';\nstrings$7[playerStringNames.accessBtnCorrectOutOf] = ' correct out of ';\nstrings$7[playerStringNames.accessBtnGradedQuestions] = ' graded questions.';\nstrings$7[playerStringNames.accessBtnClickToReplayLink] = 'Replay';\nstrings$7[playerStringNames.accessResultsLabelCorrectSuffix] = 'is correct.';\nstrings$7[playerStringNames.accessResultsLabelIncorrectSuffix] = 'is incorrect.';\nstrings$7[playerStringNames.accessResultsLabelNoResponseSuffix] = 'you did not answer this question.';\nstrings$7[playerStringNames.accessResultsLabelNoResponseGradedSuffix] = 'you did not answer this question and it has been marked incorrect.';\nstrings$7[playerStringNames.scormApiNotFoundMessage] = 'Unable to locate the LMS\\'s API Implementation.\\nCommunication with the LMS will not occur.';\nstrings$7[playerStringNames.accessListTableOfContents] = 'Chapters';\nstrings$7[playerStringNames.accessListSearchResults] = 'Search results in order of appearance';\nstrings$7[playerStringNames.accessListNoSearchResults] = 'No results found';\nstrings$7[playerStringNames.accessQuestionSetConfirmationTitle] = 'Quiz';\nstrings$7[playerStringNames.accessVideoPausedForQuiz] = 'Video paused for quiz';\nstrings$7[playerStringNames.accessQuizResults] = 'Quiz results';\nstrings$7[playerStringNames.accessQuestionFeedbackContext] = 'Question feedback: ';\nstrings$7[playerStringNames.accessProgressBarTimeConjunction] = ' of ';\nstrings$7[playerStringNames.accessPlayerSettingsClose] = 'Close Player Settings';\nstrings$7[playerStringNames.accessBtnTheaterMode] = 'Theater Mode';\nstrings$7[playerStringNames.accessBtnExitTheaterMode] = 'Default Mode';\nstrings$7[playerStringNames.confirmOpenUrlModalScreenReaderAlertText] = 'The video would like to open the following url URL_TOKEN.';\nstrings$7[playerStringNames.confirmOpenUrlConfirmButtonScreenReaderText] = 'Continue to new website';\nstrings$7[playerStringNames.fastForwardDisabledScreenReaderText] = 'Fast forward has been disabled for this video';\nstrings$7[playerStringNames.scormCompleteVideoLater] = 'Complete video later';\nstrings$7[playerStringNames.scormCompleteVideo] = 'Complete video';\nstrings$7[playerStringNames.scormExitVideo] = 'Exit video';\nstrings$7[playerStringNames.scormConfirmCompleteModalText] = 'Are you sure you want to exit the video?';\nstrings$7[playerStringNames.scormConfirmCompleteModalResumeVideoText] = 'The video will resume where you left off next time you open the video.';\nstrings$7[playerStringNames.scormConfirmCompleteModalRestartVideoText] = 'The video will restart at the beginning the next time. You will lose your current progress.';\nstrings$7[playerStringNames.scormConfirmCompleteModalFailedToSaveProgressText] = 'There was a problem saving your progress. The video will start from the beginning the next time you watch this video.';\nstrings$7[playerStringNames.scormConfirmCompleteModalDismissButtonText] = 'Return to video';\nstrings$7[playerStringNames.scormConfirmCompleteModalDismissButtonScreenReaderText] = 'Return to video';\nstrings$7[playerStringNames.scormConfirmCompleteModalConfirmButtonText] = 'Exit video';\nstrings$7[playerStringNames.scormConfirmCompleteModalConfirmButtonScreenReaderText] = 'Exit video';\nstrings$7[playerStringNames.scormSessionEndedText] = 'You can close the tab or head back to your course.';\nstrings$7[playerStringNames.searchOrJumpTo] = 'Search or jump to.';\nstrings$7[playerStringNames.searchTextCleared] = 'Search text cleared.';\nstrings$7[playerStringNames.searchResultsUpdated] = 'Search results updated. {{number}} results.';\nstrings$7[playerStringNames.tableOfContentsDisplayed] = 'Chapters displayed.';\nstrings$7[playerStringNames.tableOfContentsHidden] = 'Chapters hidden.';\nstrings$7[playerStringNames.defaultMediaTitle] = 'TechSmith Smart Player';\nstrings$7[playerStringNames.hideThumbnailDueToQuiz] = 'Take quiz to preview';\nstrings$7[playerStringNames.quizAtTimeHeading] = 'Quiz at';\nstrings$7[playerStringNames.defaultFirstChapterName] = 'Intro';\nstrings$7[playerStringNames.acknowledgementLinkName] = 'Acknowledgements';\nvar getLanguage$7 = function getLanguage() {\n return languageCodes.ENGLISH;\n};\nvar getReadableTimeByLocale$7 = function getReadableTimeByLocale(hours, minutes, seconds) {\n var timeStringList = [];\n if (hours > 0) {\n var hoursReadableString = hours + ' hour';\n hoursReadableString += hours > 1 ? 's' : '';\n timeStringList.push(hoursReadableString);\n }\n if (minutes > 0) {\n var minutesReadableString = minutes + ' minute';\n minutesReadableString += minutes > 1 ? 's' : '';\n timeStringList.push(minutesReadableString);\n }\n if (seconds > 0) {\n var secondsReadableString = seconds + ' second';\n secondsReadableString += seconds > 1 ? 's' : '';\n timeStringList.push(secondsReadableString);\n }\n return timeStringList.join(' and ');\n};\nvar enUsLocale = Object.defineProperties({\n getReadableTimeByLocale: getReadableTimeByLocale$7\n}, {\n language: {\n get: getLanguage$7\n },\n strings: {\n get: function get() {\n return strings$7;\n }\n }\n});\n\nvar strings$6 = {};\nstrings$6[playerStringNames.xmpError] = 'Einige Merkmale dieses Videos sind offenbar nicht zugänglich. Bitte setzen Sie sich mit dem Autor des Videos in Verbindung.';\nstrings$6[playerStringNames.xmpSecurity] = 'Einige Merkmale Ihrem Video sind zurzeit aufgrund der Sicherheitseinstellungen im lokalen Netzwerk deaktiviert. Diese Merkmale funktionieren wie vorgesehen, wenn das Video über eine Website oder einen Server wiedergegeben wird.';\nstrings$6[playerStringNames.videoNotSupported] = 'Ihr Browser kann dieses Video nicht wiedergeben.';\nstrings$6[playerStringNames.noWebMSupport] = 'Dieser Browser bietet keine WebM-Video-Unterstützung.';\nstrings$6[playerStringNames.search] = 'Suchen';\nstrings$6[playerStringNames.searchPlaceholder] = 'Suchen...';\nstrings$6[playerStringNames.playerRateText] = 'Wiedergabe-Geschwindigkeit';\nstrings$6[playerStringNames.playerRateOptionsText] = {\n 0.25: '0,25',\n 0.5: '0,5',\n 0.75: '0,75',\n 1: 'normal',\n 1.25: '1,25',\n 1.5: '1,5',\n 1.75: '1,75',\n 2.0: '2,0'\n};\nstrings$6[playerStringNames.ccLanguageText] = 'Geschlossene Untertitel';\nstrings$6[playerStringNames.searchDisabledFullScreen] = 'Die Suche ist im Vollbildmodus deaktiviert.';\nstrings$6[playerStringNames.mediaNotFound] = 'Leider können wir im Moment keine Verbindung zu diesen Inhalten herstellen. Bitte versuchen Sie die Seite neu zu laden oder <a href=\\'https://www.techsmith.com/redirect.asp?target=media_not_found&ver=4.*.*&lang=deu&os=na&product=smartplayer\\' target=\\'_blank\\'>klicken Sie hier für weitere Hilfe.</a>';\nstrings$6[playerStringNames.videoLoading] = 'Das Video wird geladen.';\nstrings$6[playerStringNames.close] = 'Schließen';\nstrings$6[playerStringNames.txtRequiredMessage] = 'Der Content-Eigentümer fordert die folgenden Angaben an:';\nstrings$6[playerStringNames.txtSkip] = 'Ohne Fragen fortfahren';\nstrings$6[playerStringNames.txtBegin] = 'Abschicken und fortfahren';\nstrings$6[playerStringNames.txtEnterFirstName] = 'Bitte Vornamen eingeben';\nstrings$6[playerStringNames.txtEnterLastName] = 'Bitte Nachnamen eingeben';\nstrings$6[playerStringNames.txtEnterEmail] = 'Bitte E-Mail Adresse eingeben';\nstrings$6[playerStringNames.txtHotspot] = 'Hotspot';\nstrings$6[playerStringNames.txtHotspotScreenReaderAlert] = '{{numberOfHotspots}} neuer Hotspot';\nstrings$6[playerStringNames.txtHotspotScreenReaderAlertPlural] = '{{numberOfHotspots}} neue Hotspots';\nstrings$6[playerStringNames.txtJumpToMedia] = 'Zu Medien springen';\nstrings$6[playerStringNames.txtJumpToTime] = 'Zu Zeitpunkt springen';\nstrings$6[playerStringNames.txtOpenLink] = 'Link öffnen';\nstrings$6[playerStringNames.txtOpenLinkHeader] = 'Sie werden aus diesem Video an folgende Website weitergeleitet:';\nstrings$6[playerStringNames.txtOpenLinkSubHeader] = '';\nstrings$6[playerStringNames.txtReview] = 'Letzten Abschnitt erneut wiedergeben';\nstrings$6[playerStringNames.txtReplayVideo] = 'Video erneut abspielen';\nstrings$6[playerStringNames.txtAnswerQuestion] = 'Jetzt am Quiz teilnehmen';\nstrings$6[playerStringNames.txtPrev] = 'Zurück';\nstrings$6[playerStringNames.txtNext] = 'Weiter';\nstrings$6[playerStringNames.txtHideQuiz] = 'Ausblenden';\nstrings$6[playerStringNames.txtSubmit] = 'Antworten abschicken';\nstrings$6[playerStringNames.txtSubmittingAnswers] = 'Antwort wird gesendet.';\nstrings$6[playerStringNames.txtContinue] = 'Fortsetzen';\nstrings$6[playerStringNames.txtReviewAnswer] = 'Antworten anzeigen';\nstrings$6[playerStringNames.txtBadImageQuiz] = 'Leider ist das angeforderte Quiz nicht kompatibel mit Bildern und konnte nicht geladen werden. Bitte kontaktieren Sie den Autor.';\nstrings$6[playerStringNames.txtVideoQuizNetworkErrorMessage] = 'Das Quiz konnte aufgrund eines Netzwerkfehlers nicht geladen werden. Das Video steht zur Ansicht bereit. Sie können versuchen das Quiz erneut zu laden, indem Sie die Browserseite aktualisieren bzw. Ihre Netzwerkverbindung überprüfen.';\nstrings$6[playerStringNames.txtImageQuizNetworkErrorMessage] = 'Leider hat ein Netzwerkfehler das Laden des Quiz verhindert. Das Bild kann angeschaut werden. Um das Quiz neu zu laden, aktualisieren Sie die Browser-Seite oder prüfen Sie Ihre Netzwerkverbindung.';\nstrings$6[playerStringNames.txtQuizErrorMessage] = 'Wir versuchen, Ihre Antworten zu speichern. Bitte achten Sie darauf, dass Sie eine aktive Internet Verbindung haben.';\nstrings$6[playerStringNames.txtQuizOutOfDateMessage] = 'Die Quizfragen sind geändert worden. Bitte aktualisieren Sie den Player, damit das aktuelle Quiz angezeigt wird.';\nstrings$6[playerStringNames.txtQuizBadDefinitionMessage] = 'Ungültiges Quiz. Quiz-Feedback kann nicht übermittelt werden. Bitte weisen Sie den Video-Eigentümer auf <a href=\"https://www.techsmith.com/redirect.asp?target=bad_quiz_definition&ver=5.*.*&lang=enu&os=na&product=smartplayer\" target=\"_blank\">diesen Hilfeartikel hin</a>.';\nstrings$6[playerStringNames.txtQuizOutOfDateRefreshButtonText] = 'Player aktualisieren';\nstrings$6[playerStringNames.txtLoaderMessageDefinition] = 'Das Quiz wird geladen.';\nstrings$6[playerStringNames.txtQuestionCount] = 'Frage {{currentQuestion}} von {{totalQuestions}}';\nstrings$6[playerStringNames.txtResults] = 'Ergebnisse: ';\nstrings$6[playerStringNames.txtCorrectString] = 'Richtig';\nstrings$6[playerStringNames.txtIncorrectString] = 'Falsch';\nstrings$6[playerStringNames.txtCorrect] = '{{numberCorrect}} Richtig';\nstrings$6[playerStringNames.txtIncorrect] = '{{numberIncorrect}} Falsch';\nstrings$6[playerStringNames.txtYourAnswer] = 'Ihre Antwort: ';\nstrings$6[playerStringNames.txtCorrectAnswer] = 'Richtige Antwort: ';\nstrings$6[playerStringNames.txtVisitSite] = 'Website besuchen';\nstrings$6[playerStringNames.accessBtnAudioDescription] = 'Audio-Beschreibung';\nstrings$6[playerStringNames.accessBtnClearSearch] = 'Suche löschen';\nstrings$6[playerStringNames.accessBtnRewind] = '{{duration}} Sekunden zurück';\nstrings$6[playerStringNames.accessBtnForward] = '{{duration}} Sekunden vor';\nstrings$6[playerStringNames.accessBtnPlay] = 'Video wiedergeben';\nstrings$6[playerStringNames.accessBtnPrevious] = 'Zurück';\nstrings$6[playerStringNames.accessBtnNext] = 'Weiter';\nstrings$6[playerStringNames.accessBtnProgressBar] = 'Fortschrittsbalken';\nstrings$6[playerStringNames.accessBtnVolume] = 'Stumm';\nstrings$6[playerStringNames.accessTxtVolume] = 'Volumen';\nstrings$6[playerStringNames.accessBtnClosedCaption] = 'Geschlossene Beschriftung';\nstrings$6[playerStringNames.accessBtnTableOfContents] = 'Kapitel anzeigen (T)';\nstrings$6[playerStringNames.accessBtnSettings] = 'Einstellungen';\nstrings$6[playerStringNames.accessBtnPip] = 'PIP';\nstrings$6[playerStringNames.accessBtnFullScreen] = 'Vollbild';\nstrings$6[playerStringNames.accessBtnFullScreenExpand] = 'In neuem Tab öffnen';\nstrings$6[playerStringNames.accessBtnTakeQuiz] = 'Klicken Sie hier, um die Quizfragen zu beantworten.';\nstrings$6[playerStringNames.accessBtnShowQuiz] = 'Quiz anzeigen';\nstrings$6[playerStringNames.accessBtnHideQuiz] = 'Quiz ausblenden';\nstrings$6[playerStringNames.accessBtnPreviousQuestion] = 'Vorherige Frage';\nstrings$6[playerStringNames.accessBtnNextQuestion] = 'Nächste Frage';\nstrings$6[playerStringNames.accessQuizHidden] = 'Quiz wurde ausgeblendet';\nstrings$6[playerStringNames.accessQuizShown] = 'Quiz wird jetzt angezeigt';\nstrings$6[playerStringNames.accessBtnShowAnswer] = 'Antworten anzeigen';\nstrings$6[playerStringNames.accessBtnHideAnswer] = 'Antworten ausblenden';\nstrings$6[playerStringNames.accessBtnAnswersSubmitted] = 'Antworten wurden übermittelt!';\nstrings$6[playerStringNames.accessBtnWereNotGraded] = ' wurden nicht bewertet.';\nstrings$6[playerStringNames.accessBtnWasNotGraded] = ' wurden nicht bewertet.';\nstrings$6[playerStringNames.accessBtnCorrectOutOf] = ' korrekte Antworten von ';\nstrings$6[playerStringNames.accessBtnGradedQuestions] = ' bewerteten Antworten.';\nstrings$6[playerStringNames.accessBtnClickToReplayLink] = 'Wiederholen';\nstrings$6[playerStringNames.accessResultsLabelCorrectSuffix] = 'ist richtig.';\nstrings$6[playerStringNames.accessResultsLabelIncorrectSuffix] = 'ist falsch.';\nstrings$6[playerStringNames.accessResultsLabelNoResponseSuffix] = 'Sie haben diese Frage nicht beantwortet.';\nstrings$6[playerStringNames.accessResultsLabelNoResponseGradedSuffix] = 'Sie haben diese Frage nicht beantwortet und sie wurde als falsch markiert.';\nstrings$6[playerStringNames.accessBtnTheaterMode] = 'Theatermodus';\nstrings$6[playerStringNames.accessBtnExitTheaterMode] = 'Standardmodus';\nstrings$6[playerStringNames.scormApiNotFoundMessage] = 'Die API-Implementierung des LMS-Systems kann nicht gefunden werden.\\nDie Kommunikation mit dem LMS-System kann nicht hergestellt werden.';\nstrings$6[playerStringNames.accessListTableOfContents] = 'Kapitel';\nstrings$6[playerStringNames.accessListSearchResults] = 'Suchergebnisse nach Zeitpunkt der Anzeige';\nstrings$6[playerStringNames.accessListNoSearchResults] = 'Keine Ergebnisse gefunden';\nstrings$6[playerStringNames.accessQuestionSetConfirmationTitle] = 'Quiz';\nstrings$6[playerStringNames.accessVideoPausedForQuiz] = 'Video wird angehalten - es folgt ein Quiz';\nstrings$6[playerStringNames.accessQuizResults] = 'Quizergebnisse';\nstrings$6[playerStringNames.accessQuestionFeedbackContext] = 'Feedback zur Frage: ';\nstrings$6[playerStringNames.accessProgressBarTimeConjunction] = ' von ';\nstrings$6[playerStringNames.accessPlayerSettingsClose] = 'SmartPlayer-Einstellungen schließen';\nstrings$6[playerStringNames.confirmOpenUrlModalScreenReaderAlertText] = 'Das Video leitet auf den folgenden Link weiter URL_TOKEN:';\nstrings$6[playerStringNames.confirmOpenUrlConfirmButtonScreenReaderText] = 'Weiter zur neuen Website';\nstrings$6[playerStringNames.fastForwardDisabledScreenReaderText] = 'Der Schnellvorlauf wurde für dieses Video deaktiviert.';\nstrings$6[playerStringNames.scormCompleteVideoLater] = 'Video später abschließen';\nstrings$6[playerStringNames.scormCompleteVideo] = 'Abgeschlossenes Video';\nstrings$6[playerStringNames.scormExitVideo] = 'Video beenden';\nstrings$6[playerStringNames.scormConfirmCompleteModalText] = 'Wollen Sie das Video wirklich beenden?';\nstrings$6[playerStringNames.scormConfirmCompleteModalResumeVideoText] = 'Das Video wird beim nächsten Öffnen dort fortgesetzt, wo Sie es angehalten haben.';\nstrings$6[playerStringNames.scormConfirmCompleteModalRestartVideoText] = 'Das Video wird beim nächsten Mal von Beginn an abgespielt. Ihr bisheriger Fortschritt geht verloren.';\nstrings$6[playerStringNames.scormConfirmCompleteModalFailedToSaveProgressText] = 'Beim Speichern Ihres Fortschritts ist ein Problem aufgetreten. Das Video beginnt von Anfang an, wenn Sie es das nächste Mal abspielen.';\nstrings$6[playerStringNames.scormConfirmCompleteModalDismissButtonText] = 'Zurück zum Video';\nstrings$6[playerStringNames.scormConfirmCompleteModalDismissButtonScreenReaderText] = 'Zurück zum Video';\nstrings$6[playerStringNames.scormConfirmCompleteModalConfirmButtonText] = 'Video beenden';\nstrings$6[playerStringNames.scormConfirmCompleteModalConfirmButtonScreenReaderText] = 'Video beenden';\nstrings$6[playerStringNames.scormSessionEndedText] = 'Sie können die Registerkarte schließen oder zu Ihrem Kurs zurückkehren.';\nstrings$6[playerStringNames.searchOrJumpTo] = 'Suchen oder springen zu.';\nstrings$6[playerStringNames.searchTextCleared] = 'Suchtext gelöscht.';\nstrings$6[playerStringNames.searchResultsUpdated] = 'Suchergebnisse aktualisiert. {{number}} Ergebnisse.';\nstrings$6[playerStringNames.tableOfContentsDisplayed] = 'Kapitel werden angezeigt.';\nstrings$6[playerStringNames.tableOfContentsHidden] = 'Kapitel sind ausgeblendet.';\nstrings$6[playerStringNames.defaultMediaTitle] = 'TechSmith Smart Player';\nstrings$6[playerStringNames.hideThumbnailDueToQuiz] = 'Lösen Sie das Quiz, um die Vorschau anzuzeigen';\nstrings$6[playerStringNames.quizAtTimeHeading] = 'Quizfrage bei';\nstrings$6[playerStringNames.defaultFirstChapterName] = 'Einleitung';\nstrings$6[playerStringNames.acknowledgementLinkName] = 'Lizenzhinweise';\nvar getLanguage$6 = function getLanguage() {\n return languageCodes.GERMAN;\n};\nvar getReadableTimeByLocale$6 = function getReadableTimeByLocale(hours, minutes, seconds) {\n var timeStringList = [];\n if (hours > 0) {\n var hoursReadableString = hours + ' Stunde';\n hoursReadableString += hours > 1 ? 'n' : '';\n timeStringList.push(hoursReadableString);\n }\n if (minutes > 0) {\n var minutesReadableString = minutes + ' Minute';\n minutesReadableString += minutes > 1 ? 'n' : '';\n timeStringList.push(minutesReadableString);\n }\n if (seconds > 0) {\n var secondsReadableString = seconds + ' Sekunde';\n secondsReadableString += seconds > 1 ? 'n' : '';\n timeStringList.push(secondsReadableString);\n }\n return timeStringList.join(' und ');\n};\nvar deDeLocale = Object.defineProperties({\n getReadableTimeByLocale: getReadableTimeByLocale$6\n}, {\n language: {\n get: getLanguage$6\n },\n strings: {\n get: function get() {\n return strings$6;\n }\n }\n});\n\nvar strings$5 = {};\nstrings$5[playerStringNames.xmpError] = 'ã“ã®ãƒ“デオã®ç‰¹å®šæ©Ÿèƒ½ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ™‚ã«å•é¡ŒãŒç™ºç”Ÿã—ãŸã‚ˆã†ã§ã™ã€‚ビデオã®ä½œæˆè€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。';\nstrings$5[playerStringNames.xmpSecurity] = 'ãƒãƒ¼ã‚«ãƒ« ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚»ã‚ュリティã®ãŸã‚ã«ã€ãƒ“デオã®ç‰¹å®šæ©Ÿèƒ½ãŒç¾åœ¨ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ã“れらã®æ©Ÿèƒ½ã¯ã€Web サイトã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ãƒ“デオをå†ç”Ÿã™ã‚‹ã¨æ£ã—ã動作ã—ã¾ã™ã€‚';\nstrings$5[playerStringNames.videoNotSupported] = 'ãŠä½¿ã„ã®ãƒ–ラウザã§ã¯ã“ã®ãƒ“デオをå†ç”Ÿã§ãã¾ã›ã‚“。';\nstrings$5[playerStringNames.noWebMSupport] = 'ã“ã®ãƒ–ラウザ㯠WebM ビデオをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。';\nstrings$5[playerStringNames.search] = '検索';\nstrings$5[playerStringNames.searchPlaceholder] = '検索...';\nstrings$5[playerStringNames.playerRateText] = 'å†ç”Ÿé€Ÿåº¦';\nstrings$5[playerStringNames.playerRateOptionsText] = {\n 0.25: '0.25',\n 0.5: '0.5',\n 0.75: '0.75',\n 1: '標準',\n 1.25: '1.25',\n 1.5: '1.5',\n 1.75: '1.75',\n 2.0: '2.0'\n};\nstrings$5[playerStringNames.ccLanguageText] = 'クãƒãƒ¼ã‚ºãƒ‰ ã‚ャプション';\nstrings$5[playerStringNames.searchDisabledFullScreen] = 'フル画é¢ãƒ¢ãƒ¼ãƒ‰ã§ã¯æ¤œç´¢æ©Ÿèƒ½ã¯ç„¡åŠ¹ã§ã™ã€‚';\nstrings$5[playerStringNames.mediaNotFound] = '申ã—訳ã‚ã‚Šã¾ã›ã‚“。ã“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。ページをå†èªã¿è¾¼ã¿ã™ã‚‹ã‹ã€<a href=\\'https://www.techsmith.com/redirect.asp?target=media_not_found&ver=4.*.*&lang=jpn&os=na&product=smartplayer\\' target=\\'_blank\\'>ã“ã“をクリックã—ã¦ãƒ˜ãƒ«ãƒ—ã‚’ã”å‚ç…§ãã ã•ã„。</a>';\nstrings$5[playerStringNames.videoLoading] = 'ビデオをèªã¿è¾¼ã‚“ã§ã„ã¾ã™ã€‚';\nstrings$5[playerStringNames.close] = 'é–‰ã˜ã‚‹';\nstrings$5[playerStringNames.txtRequiredMessage] = 'コンテンツã®æ‰€æœ‰è€…ãŒä»¥ä¸‹ã®æƒ…å ±ã‚’è¦æ±‚ã—ã¦ã„ã¾ã™:';\nstrings$5[playerStringNames.txtSkip] = '質å•ã‚’入力ã›ãšã«ç¶šè¡Œ';\nstrings$5[playerStringNames.txtBegin] = 'é€ä¿¡ã—ã¦ç¶šè¡Œ';\nstrings$5[playerStringNames.txtEnterFirstName] = 'åを入力ã—ã¦ãã ã•ã„';\nstrings$5[playerStringNames.txtEnterLastName] = '姓を入力ã—ã¦ãã ã•ã„';\nstrings$5[playerStringNames.txtEnterEmail] = 'メールアドレスを入力ã—ã¦ãã ã•ã„';\nstrings$5[playerStringNames.txtHotspot] = 'ホットスãƒãƒƒãƒˆ';\nstrings$5[playerStringNames.txtHotspotScreenReaderAlert] = '{{numberOfHotspots}} 個ã®æ–°ã—ã„ホットスãƒãƒƒãƒˆ';\nstrings$5[playerStringNames.txtHotspotScreenReaderAlertPlural] = '{{numberOfHotspots}} 個ã®æ–°ã—ã„ホットスãƒãƒƒãƒˆ';\nstrings$5[playerStringNames.txtJumpToMedia] = 'メディアã¸ã‚¸ãƒ£ãƒ³ãƒ—';\nstrings$5[playerStringNames.txtJumpToTime] = '時間ã¸ã‚¸ãƒ£ãƒ³ãƒ—';\nstrings$5[playerStringNames.txtOpenLink] = 'リンクを開ã';\nstrings$5[playerStringNames.txtOpenLinkHeader] = 'ã“ã®ãƒ“デオã¯æ¬¡ã®';\nstrings$5[playerStringNames.txtOpenLinkSubHeader] = 'ã‚’é–‹ã“ã†ã¨ã—ã¦ã„ã¾ã™ã€‚';\nstrings$5[playerStringNames.txtReview] = '最後ã«é¸æŠžã—ãŸç¯„囲をもã†ä¸€åº¦å†ç”Ÿ';\nstrings$5[playerStringNames.txtReplayVideo] = 'ビデオをもã†ä¸€åº¦å†ç”Ÿ';\nstrings$5[playerStringNames.txtAnswerQuestion] = '今ã™ãクイズã«è§£ç”ã™ã‚‹';\nstrings$5[playerStringNames.txtPrev] = 'å‰ã¸';\nstrings$5[playerStringNames.txtNext] = '次ã¸';\nstrings$5[playerStringNames.txtHideQuiz] = 'éžè¡¨ç¤º';\nstrings$5[playerStringNames.txtSubmit] = '解ç”・回ç”ã®é€ä¿¡';\nstrings$5[playerStringNames.txtSubmittingAnswers] = '回ç”ã‚’é€ä¿¡ä¸ã§ã™ã€‚';\nstrings$5[playerStringNames.txtContinue] = '続行';\nstrings$5[playerStringNames.txtReviewAnswer] = '解ç”・回ç”を表示';\nstrings$5[playerStringNames.txtBadImageQuiz] = '申ã—訳ã‚ã‚Šã¾ã›ã‚“。ã“ã®ã‚¯ã‚¤ã‚ºã¯ç”»åƒã¨äº’æ›æ€§ãŒãªããƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ã‚¯ã‚¤ã‚ºã®ä½œæˆè€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。';\nstrings$5[playerStringNames.txtVideoQuizNetworkErrorMessage] = '申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ エラーã«ã‚ˆã‚Šã‚¯ã‚¤ã‚ºã‚’èªã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚ビデオã¯è¡¨ç¤ºã§ãã¾ã™ã€‚クイズをå†åº¦èªã¿è¾¼ã‚€ã«ã¯ã€ãƒ–ラウザã®ãƒšãƒ¼ã‚¸ã‚’æ›´æ–°ã™ã‚‹ã‹ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’確èªã—ã¦ãã ã•ã„。';\nstrings$5[playerStringNames.txtImageQuizNetworkErrorMessage] = '申ã—訳ã‚ã‚Šã¾ã›ã‚“。ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ エラーã«ã‚ˆã‚Šã‚¯ã‚¤ã‚ºãŒãƒãƒ¼ãƒ‰ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚ç”»åƒã¯è¡¨ç¤ºã§ãã¾ã™ã€‚クイズをå†åº¦ãƒãƒ¼ãƒ‰ã™ã‚‹ã«ã¯ã€ãƒ–ラウザーã®ãƒšãƒ¼ã‚¸ã‚’å†èªã¿è¾¼ã¿ã™ã‚‹ã‹ã€ã¾ãŸã¯ã”使用ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’確èªã—ã¦ãã ã•ã„。';\nstrings$5[playerStringNames.txtQuizErrorMessage] = 'è¿”ç”ã®ä¿å˜ã‚’試ã¿ã¦ã„ã¾ã™ã€‚インターãƒãƒƒãƒˆã«æ£ã—ã接続ã—ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。';\nstrings$5[playerStringNames.txtQuizOutOfDateMessage] = 'クイズã®è³ªå•ãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚最新ã®ã‚¯ã‚¤ã‚ºã‚’å–å¾—ã™ã‚‹ã«ã¯ã€Player ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。';\nstrings$5[playerStringNames.txtQuizBadDefinitionMessage] = '<a href=\"https://www.techsmith.com/redirect.asp?target=bad_quiz_definition&ver=5.*.*&lang=enu&os=na&product=smartplayer\" target=\"_blank\">クイズãŒç„¡åŠ¹ã§ã™ã€‚クイズã®ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã‚’é€ä¿¡ã§ãã¾ã›ã‚“。ビデオã®æ‰€æœ‰è€…ã«ã“ã®ãƒ˜ãƒ«ãƒ—記事をå‚ç…§ã™ã‚‹ã‚ˆã†ã«ä¼ãˆã¦ãã ã•ã„。</a>';\nstrings$5[playerStringNames.txtQuizOutOfDateRefreshButtonText] = 'Player ã®æ›´æ–°';\nstrings$5[playerStringNames.txtLoaderMessageDefinition] = 'クイズをèªã¿è¾¼ã‚“ã§ã„ã¾ã™ã€‚';\nstrings$5[playerStringNames.txtQuestionCount] = 'å• {{currentQuestion}} ({{totalQuestions}} å•ä¸)';\nstrings$5[playerStringNames.txtResults] = 'çµæžœ: ';\nstrings$5[playerStringNames.txtCorrectString] = 'æ£è§£';\nstrings$5[playerStringNames.txtIncorrectString] = 'ä¸æ£è§£';\nstrings$5[playerStringNames.txtCorrect] = 'æ£è§£ {{numberCorrect}}';\nstrings$5[playerStringNames.txtIncorrect] = 'ä¸æ£è§£ {{numberIncorrect}}';\nstrings$5[playerStringNames.txtYourAnswer] = '解ç”/回ç”: ';\nstrings$5[playerStringNames.txtCorrectAnswer] = 'æ£è§£: ';\nstrings$5[playerStringNames.txtVisitSite] = 'サイトを開ã';\nstrings$5[playerStringNames.accessBtnAudioDescription] = '音声ガイド';\nstrings$5[playerStringNames.accessBtnClearSearch] = '検索をクリア';\nstrings$5[playerStringNames.accessBtnRewind] = '{{duration}} 秒戻ã—ã¾ã™';\nstrings$5[playerStringNames.accessBtnForward] = '{{duration}} 秒é€ã‚Šã¾ã™';\nstrings$5[playerStringNames.accessBtnPlay] = 'ビデオをå†ç”Ÿã™ã‚‹';\nstrings$5[playerStringNames.accessBtnPrevious] = 'å‰ã¸';\nstrings$5[playerStringNames.accessBtnNext] = '次ã¸';\nstrings$5[playerStringNames.accessBtnProgressBar] = '進行状æ³ãƒãƒ¼ スライダー';\nstrings$5[playerStringNames.accessBtnVolume] = 'ミュート';\nstrings$5[playerStringNames.accessTxtVolume] = '音é‡';\nstrings$5[playerStringNames.accessBtnClosedCaption] = 'クãƒãƒ¼ã‚ºãƒ‰ ã‚ャプション';\nstrings$5[playerStringNames.accessBtnTableOfContents] = 'ãƒãƒ£ãƒ—ターを表示(T)';\nstrings$5[playerStringNames.accessBtnSettings] = 'プレーヤーè¨å®š';\nstrings$5[playerStringNames.accessBtnPip] = 'Picture-In-Picture';\nstrings$5[playerStringNames.accessBtnFullScreen] = '全画é¢';\nstrings$5[playerStringNames.accessBtnFullScreenExpand] = 'æ–°ã—ã„タブã§é–‹ã';\nstrings$5[playerStringNames.accessBtnTakeQuiz] = 'クリックã—ã¦ã‚¯ã‚¤ã‚ºã«ç”ãˆã‚‹ã€‚';\nstrings$5[playerStringNames.accessBtnShowQuiz] = 'クイズã®è¡¨ç¤º';\nstrings$5[playerStringNames.accessBtnHideQuiz] = 'クイズã®éžè¡¨ç¤º';\nstrings$5[playerStringNames.accessBtnPreviousQuestion] = 'å‰ã®å•é¡Œ';\nstrings$5[playerStringNames.accessBtnNextQuestion] = '次ã®å•é¡Œ';\nstrings$5[playerStringNames.accessQuizHidden] = 'クイズãŒéžè¡¨ç¤ºã«ãªã‚Šã¾ã—ãŸ';\nstrings$5[playerStringNames.accessQuizShown] = 'クイズãŒè¡¨ç¤ºã•ã‚Œã¾ã—ãŸ';\nstrings$5[playerStringNames.accessBtnShowAnswer] = '解ç”・回ç”ã®è¡¨ç¤º';\nstrings$5[playerStringNames.accessBtnHideAnswer] = '解ç”・回ç”ã®éžè¡¨ç¤º';\nstrings$5[playerStringNames.accessBtnAnswersSubmitted] = '解ç”・回ç”ã‚’é€ä¿¡ã—ã¾ã—ãŸ!';\nstrings$5[playerStringNames.accessBtnWereNotGraded] = ' スコアã«å«ã¾ã‚Œãªã„質å•ã€‚';\nstrings$5[playerStringNames.accessBtnWasNotGraded] = ' スコアã«å«ã¾ã‚Œãªã„質å•ã€‚';\nstrings$5[playerStringNames.accessBtnCorrectOutOf] = ' å•ä¸ ';\nstrings$5[playerStringNames.accessBtnGradedQuestions] = ' スコアã«å«ã¾ã‚Œã‚‹è³ªå•ã€‚';\nstrings$5[playerStringNames.accessBtnClickToReplayLink] = 'å†ç”Ÿ';\nstrings$5[playerStringNames.accessResultsLabelCorrectSuffix] = 'ã¯æ£è§£ã§ã™ã€‚';\nstrings$5[playerStringNames.accessResultsLabelIncorrectSuffix] = 'ã¯ä¸æ£è§£ã§ã™ã€‚';\nstrings$5[playerStringNames.accessResultsLabelNoResponseSuffix] = 'ã“ã®å•é¡Œã«ç”ãˆã¦ã„ã¾ã›ã‚“。';\nstrings$5[playerStringNames.accessResultsLabelNoResponseGradedSuffix] = 'ã“ã®å•é¡Œã«ç”ãˆã¦ã„ãªã„ãŸã‚ã€ä¸æ£è§£ã¨åˆ¤å®šã•ã‚Œã¾ã—ãŸã€‚';\nstrings$5[playerStringNames.scormApiNotFoundMessage] = 'LMS ã® API 実装ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\\nLMS ã¨ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ãã¾ã›ã‚“';\nstrings$5[playerStringNames.accessListTableOfContents] = 'ãƒãƒ£ãƒ—ター';\nstrings$5[playerStringNames.accessListSearchResults] = '検索çµæžœ (出ç¾é †)';\nstrings$5[playerStringNames.accessListNoSearchResults] = 'çµæžœãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“';\nstrings$5[playerStringNames.accessQuestionSetConfirmationTitle] = 'クイズ';\nstrings$5[playerStringNames.accessVideoPausedForQuiz] = 'クイズã®å ´æ‰€ã§ãƒ“デオを一時åœæ¢ã—ã¾ã—ãŸ';\nstrings$5[playerStringNames.accessQuizResults] = 'クイズã®çµæžœ';\nstrings$5[playerStringNames.accessQuestionFeedbackContext] = 'å•é¡Œã®ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯: ';\nstrings$5[playerStringNames.accessProgressBarTimeConjunction] = '/';\nstrings$5[playerStringNames.accessPlayerSettingsClose] = 'Player ã®è¨å®šã‚’é–‰ã˜ã‚‹';\nstrings$5[playerStringNames.accessBtnTheaterMode] = 'シアター モード';\nstrings$5[playerStringNames.accessBtnExitTheaterMode] = 'デフォルト モード';\nstrings$5[playerStringNames.confirmOpenUrlModalScreenReaderAlertText] = 'ビデオã¯æ¬¡ã® URL URL_TOKEN ã‚’é–‹ã“ã†ã¨ã—ã¦ã„ã¾ã™ã€‚';\nstrings$5[playerStringNames.confirmOpenUrlConfirmButtonScreenReaderText] = 'æ–°ã—ã„ Web サイトã«é€²ã‚€';\nstrings$5[playerStringNames.fastForwardDisabledScreenReaderText] = 'ã“ã®ãƒ“デオã§ã¯æ—©é€ã‚ŠãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™';\nstrings$5[playerStringNames.scormCompleteVideoLater] = '後ã§ãƒ“デオを完æˆã•ã›ã‚‹';\nstrings$5[playerStringNames.scormCompleteVideo] = 'ビデオを完æˆã•ã›ã‚‹';\nstrings$5[playerStringNames.scormExitVideo] = 'ビデオを閉ã˜ã‚‹';\nstrings$5[playerStringNames.scormConfirmCompleteModalText] = 'ビデオを閉ã˜ã¾ã™ã‹?';\nstrings$5[playerStringNames.scormConfirmCompleteModalResumeVideoText] = '次ã«é–‹ã„ãŸã¨ãã€ãƒ“デオã¯é–‰ã˜ãŸå ´æ‰€ã‹ã‚‰å†é–‹ã•ã‚Œã¾ã™ã€‚';\nstrings$5[playerStringNames.scormConfirmCompleteModalRestartVideoText] = '次ã«é–‹ã„ãŸã¨ãã€ãƒ“デオã¯å…ˆé ã‹ã‚‰å†é–‹ã•ã‚Œã¾ã™ã€‚ç¾åœ¨ã®é€²è¡ŒçŠ¶æ³ã¯å¤±ã‚ã‚Œã¾ã™ã€‚';\nstrings$5[playerStringNames.scormConfirmCompleteModalFailedToSaveProgressText] = '進行状æ³ã‚’ä¿å˜ã™ã‚‹éš›ã«å•é¡ŒãŒã‚ã‚Šã¾ã—ãŸã€‚次ã«ã“ã®ãƒ“デオを見るã¨ãã€ãƒ“デオã¯å…ˆé ã‹ã‚‰å†ç”Ÿã•ã‚Œã¾ã™ã€‚';\nstrings$5[playerStringNames.scormConfirmCompleteModalDismissButtonText] = 'ビデオã«æˆ»ã‚‹';\nstrings$5[playerStringNames.scormConfirmCompleteModalDismissButtonScreenReaderText] = 'ビデオã«æˆ»ã‚‹';\nstrings$5[playerStringNames.scormConfirmCompleteModalConfirmButtonText] = 'ビデオを閉ã˜ã‚‹';\nstrings$5[playerStringNames.scormConfirmCompleteModalConfirmButtonScreenReaderText] = 'ビデオを閉ã˜ã‚‹';\nstrings$5[playerStringNames.scormSessionEndedText] = 'タブを閉ã˜ã‚‹ã‹ã€ã‚³ãƒ¼ã‚¹ã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚';\nstrings$5[playerStringNames.searchOrJumpTo] = '検索ã™ã‚‹ã‹ã‚¸ãƒ£ãƒ³ãƒ—先を指定ã—ã¦ãã ã•ã„。';\nstrings$5[playerStringNames.searchTextCleared] = '検索文å—をクリアã—ã¾ã—ãŸã€‚';\nstrings$5[playerStringNames.searchResultsUpdated] = '検索çµæžœã‚’æ›´æ–°ã—ã¾ã—ãŸã€‚çµæžœã¯ {{number}} 件ã§ã™ã€‚';\nstrings$5[playerStringNames.tableOfContentsDisplayed] = 'ãƒãƒ£ãƒ—ターãŒè¡¨ç¤ºã•ã‚Œã¾ã—ãŸã€‚';\nstrings$5[playerStringNames.tableOfContentsHidden] = 'ãƒãƒ£ãƒ—ターãŒéžè¡¨ç¤ºã«ãªã‚Šã¾ã—ãŸã€‚';\nstrings$5[playerStringNames.defaultMediaTitle] = 'TechSmith Smart Player';\nstrings$5[playerStringNames.hideThumbnailDueToQuiz] = 'プレビューã™ã‚‹ã«ã¯ã‚¯ã‚¤ã‚ºã«ç”ãˆã¦ãã ã•ã„';\nstrings$5[playerStringNames.quizAtTimeHeading] = 'クイズ:';\nstrings$5[playerStringNames.defaultFirstChapterName] = 'イントãƒ';\nstrings$5[playerStringNames.acknowledgementLinkName] = 'è¬è¾ž';\nvar getLanguage$5 = function getLanguage() {\n return languageCodes.JAPANESE;\n};\nvar getReadableTimeByLocale$5 = function getReadableTimeByLocale(hours, minutes, seconds) {\n var timeStringList = [];\n if (hours > 0) {\n var hoursReadableString = hours + '時間';\n timeStringList.push(hoursReadableString);\n }\n if (minutes > 0) {\n var minutesReadableString = minutes + '分1';\n timeStringList.push(minutesReadableString);\n }\n if (seconds > 0) {\n var secondsReadableString = seconds + '秒';\n timeStringList.push(secondsReadableString);\n }\n return timeStringList.join('');\n};\nvar jaJpLocale = Object.defineProperties({\n getReadableTimeByLocale: getReadableTimeByLocale$5\n}, {\n language: {\n get: getLanguage$5\n },\n strings: {\n get: function get() {\n return strings$5;\n }\n }\n});\n\nvar strings$4 = {};\nstrings$4[playerStringNames.xmpError] = 'Il semblerait qu\\'il y ait un problème pour accéder à certaines fonctionnalités de cette vidéo. Veuillez contacter l\\'auteur de la vidéo.';\nstrings$4[playerStringNames.xmpSecurity] = 'Certaines fonctionnalités de votre vidéo sont actuellement désactivées pour des raisons de sécurité du réseau local. Elles fonctionnent correctement lorsque la vidéo est lue à partir d\\'un site Web ou d\\'un serveur.';\nstrings$4[playerStringNames.videoNotSupported] = 'Votre navigateur ne peut pas lire cette vidéo.';\nstrings$4[playerStringNames.noWebMSupport] = 'Ce navigateur ne prend pas en charge la vidéo WebM.';\nstrings$4[playerStringNames.search] = 'Rechercher';\nstrings$4[playerStringNames.searchPlaceholder] = 'Rechercher...';\nstrings$4[playerStringNames.playerRateText] = 'Vitesse de lecture';\nstrings$4[playerStringNames.playerRateOptionsText] = {\n 0.25: '0,25',\n 0.5: '0,5',\n 0.75: '0,75',\n 1: 'normale',\n 1.25: '1,25',\n 1.5: '1,5',\n 1.75: '1,75',\n 2.0: '2,0'\n};\nstrings$4[playerStringNames.ccLanguageText] = 'Sous-titres activables';\nstrings$4[playerStringNames.searchDisabledFullScreen] = 'La recherche est désactivée en mode Plein écran.';\nstrings$4[playerStringNames.mediaNotFound] = 'Nous sommes désolés, nous n\\'avons pas pu établir de connexion avec ce contenu. Essayez d\\'actualiser la page ou <a href=\\'https://www.techsmith.com/redirect.asp?target=media_not_found&ver=4.*.*&lang=enu&os=na&product=smartplayer\\' target=\\'_blank\\'>cliquez ici pour obtenir de l\\'aide.</a>';\nstrings$4[playerStringNames.videoLoading] = 'La vidéo est en cours de chargement.';\nstrings$4[playerStringNames.close] = 'Fermer';\nstrings$4[playerStringNames.txtRequiredMessage] = 'Le propriétaire du contenu demande les informations suivantes :';\nstrings$4[playerStringNames.txtSkip] = 'Continuer sans les questions';\nstrings$4[playerStringNames.txtBegin] = 'Envoyer et continuer';\nstrings$4[playerStringNames.txtEnterFirstName] = 'Saisir le prénom';\nstrings$4[playerStringNames.txtEnterLastName] = 'Saisir le nom';\nstrings$4[playerStringNames.txtEnterEmail] = 'Saisir l\\'adresse e-mail';\nstrings$4[playerStringNames.txtHotspot] = 'Zone dynamique';\nstrings$4[playerStringNames.txtHotspotScreenReaderAlert] = '{{numberOfHotspots}} nouvelle zone interactive';\nstrings$4[playerStringNames.txtHotspotScreenReaderAlertPlural] = '{{numberOfHotspots}} nouvelles zones interactives';\nstrings$4[playerStringNames.txtJumpToMedia] = 'Atteindre un élément multimédia';\nstrings$4[playerStringNames.txtJumpToTime] = 'Atteindre une heure';\nstrings$4[playerStringNames.txtOpenLink] = 'Ouvrir le lien';\nstrings$4[playerStringNames.txtOpenLinkHeader] = 'Cette vidéo souhaite vous renvoyer vers :';\nstrings$4[playerStringNames.txtOpenLinkSubHeader] = '';\nstrings$4[playerStringNames.txtReview] = 'Revoir la dernière section';\nstrings$4[playerStringNames.txtReplayVideo] = 'Revoir la vidéo';\nstrings$4[playerStringNames.txtAnswerQuestion] = 'Répondre au questionnaire';\nstrings$4[playerStringNames.txtPrev] = 'Précédent';\nstrings$4[playerStringNames.txtNext] = 'Suivant';\nstrings$4[playerStringNames.txtHideQuiz] = 'Masquer';\nstrings$4[playerStringNames.txtSubmit] = 'Envoyer les réponses';\nstrings$4[playerStringNames.txtSubmittingAnswers] = 'Envoi des réponses en cours.';\nstrings$4[playerStringNames.txtContinue] = 'Continuer';\nstrings$4[playerStringNames.txtReviewAnswer] = 'Afficher les réponses';\nstrings$4[playerStringNames.txtBadImageQuiz] = 'Nous sommes désolés, le questionnaire demandé étant incompatible avec les images, il ne peut pas être chargé. Veuillez contacter l\\'auteur de ce questionnaire.';\nstrings$4[playerStringNames.txtVideoQuizNetworkErrorMessage] = 'Nous sommes désolés, une erreur réseau nous empêche de charger le questionnaire. Vous pouvez afficher la vidéo. Pour essayer de recharger le questionnaire, actualisez la page Web ou vérifiez la connexion réseau.';\nstrings$4[playerStringNames.txtImageQuizNetworkErrorMessage] = 'Nous sommes désolés, une erreur réseau nous empêche de charger le questionnaire. Vous pouvez afficher l\\'image. Pour essayer de recharger le questionnaire, actualisez la page Web ou vérifiez la connexion réseau.';\nstrings$4[playerStringNames.txtQuizErrorMessage] = 'Nous essayons d\\'enregistrer votre réponse. Vérifiez que vous disposez d\\'une connexion Internet active.';\nstrings$4[playerStringNames.txtQuizOutOfDateMessage] = 'Les questions ont changé. Veuillez actualiser le lecteur pour accéder à la dernière version du questionnaire.';\nstrings$4[playerStringNames.txtQuizBadDefinitionMessage] = 'Questionnaire non valide. Impossible d’envoyer les commentaires sur le questionnaire. Veuillez demander au propriétaire de la vidéo de consulter <a href=\"https://www.techsmith.com/redirect.asp?target=bad_quiz_definition&ver=5.*.*&lang=enu&os=na&product=smartplayer\" target=\"_blank\">cet article d’aide</a>.';\nstrings$4[playerStringNames.txtQuizOutOfDateRefreshButtonText] = 'Actualiser';\nstrings$4[playerStringNames.txtLoaderMessageDefinition] = 'Le questionnaire est en cours de chargement.';\nstrings$4[playerStringNames.txtQuestionCount] = 'Question {{currentQuestion}} sur {{totalQuestions}}';\nstrings$4[playerStringNames.txtResults] = 'Résultats : ';\nstrings$4[playerStringNames.txtCorrectString] = 'Correct';\nstrings$4[playerStringNames.txtIncorrectString] = 'Incorrect';\nstrings$4[playerStringNames.txtCorrect] = '{{numberCorrect}} Correct';\nstrings$4[playerStringNames.txtIncorrect] = '{{numberIncorrect}} Incorrect';\nstrings$4[playerStringNames.txtYourAnswer] = 'Votre réponse : ';\nstrings$4[playerStringNames.txtCorrectAnswer] = 'Réponse correcte : ';\nstrings$4[playerStringNames.txtVisitSite] = 'Consulter le site';\nstrings$4[playerStringNames.accessBtnAudioDescription] = 'Description audio';\nstrings$4[playerStringNames.accessBtnClearSearch] = 'Effacer la recherche';\nstrings$4[playerStringNames.accessBtnRewind] = 'Reculer de {{duration}} secondes';\nstrings$4[playerStringNames.accessBtnForward] = 'Avancer de {{duration}} secondes';\nstrings$4[playerStringNames.accessBtnPlay] = 'Lire la vidéo';\nstrings$4[playerStringNames.accessBtnPrevious] = 'Précédent';\nstrings$4[playerStringNames.accessBtnNext] = 'Suivant';\nstrings$4[playerStringNames.accessBtnProgressBar] = 'Curseur de progression';\nstrings$4[playerStringNames.accessBtnVolume] = 'Désactiver le son';\nstrings$4[playerStringNames.accessTxtVolume] = 'Volume';\nstrings$4[playerStringNames.accessBtnClosedCaption] = 'Sous-titre activable';\nstrings$4[playerStringNames.accessBtnTableOfContents] = 'Afficher les chapitres (T)';\nstrings$4[playerStringNames.accessBtnSettings] = 'Paramètres du Player';\nstrings$4[playerStringNames.accessBtnPip] = 'Incrustation d’images';\nstrings$4[playerStringNames.accessBtnFullScreen] = 'Plein écran';\nstrings$4[playerStringNames.accessBtnFullScreenExpand] = 'Ouvrir dans un nouvel onglet';\nstrings$4[playerStringNames.accessBtnTakeQuiz] = 'Cliquez pour répondre au questionnaire.';\nstrings$4[playerStringNames.accessBtnShowQuiz] = 'Afficher le questionnaire';\nstrings$4[playerStringNames.accessBtnHideQuiz] = 'Masquer le questionnaire';\nstrings$4[playerStringNames.accessBtnPreviousQuestion] = 'Question précédente';\nstrings$4[playerStringNames.accessBtnNextQuestion] = 'Question suivante';\nstrings$4[playerStringNames.accessQuizHidden] = 'Le questionnaire a été masqué';\nstrings$4[playerStringNames.accessQuizShown] = 'Le questionnaire est maintenant affiché';\nstrings$4[playerStringNames.accessBtnShowAnswer] = 'Afficher les réponses';\nstrings$4[playerStringNames.accessBtnHideAnswer] = 'Masquer les réponses';\nstrings$4[playerStringNames.accessBtnAnswersSubmitted] = 'Réponses envoyées.';\nstrings$4[playerStringNames.accessBtnWereNotGraded] = ' n\\'ont pas été notées.';\nstrings$4[playerStringNames.accessBtnWasNotGraded] = ' n\\'a pas été notée.';\nstrings$4[playerStringNames.accessBtnCorrectOutOf] = ' « Correct » sur ';\nstrings$4[playerStringNames.accessBtnGradedQuestions] = ' questions notées.';\nstrings$4[playerStringNames.accessBtnClickToReplayLink] = 'Relire';\nstrings$4[playerStringNames.accessResultsLabelCorrectSuffix] = 'est correcte.';\nstrings$4[playerStringNames.accessResultsLabelIncorrectSuffix] = 'est incorrecte.';\nstrings$4[playerStringNames.accessResultsLabelNoResponseSuffix] = 'vous n’avez pas répondu à cette question.';\nstrings$4[playerStringNames.accessResultsLabelNoResponseGradedSuffix] = 'vous n’avez pas répondu à cette question, qui a été marquée comme incorrecte.';\nstrings$4[playerStringNames.scormApiNotFoundMessage] = 'Impossible de localiser l\\'implémentation API du LMS.\\nLa communication avec le LMS sera impossible.';\nstrings$4[playerStringNames.accessListTableOfContents] = 'Chapitres';\nstrings$4[playerStringNames.accessListSearchResults] = 'Résultats de la recherche par ordre d\\'affichage';\nstrings$4[playerStringNames.accessListNoSearchResults] = 'Aucun résultat';\nstrings$4[playerStringNames.accessQuestionSetConfirmationTitle] = 'Questionnaire';\nstrings$4[playerStringNames.accessVideoPausedForQuiz] = 'Vidéo sur pause pour le questionnaire';\nstrings$4[playerStringNames.accessQuizResults] = 'Résultats du questionnaire';\nstrings$4[playerStringNames.accessQuestionFeedbackContext] = 'Commentaires sur la question : ';\nstrings$4[playerStringNames.accessProgressBarTimeConjunction] = ' sur ';\nstrings$4[playerStringNames.accessPlayerSettingsClose] = 'Fermer les paramètres du Player';\nstrings$4[playerStringNames.accessBtnTheaterMode] = 'Mode cinéma';\nstrings$4[playerStringNames.accessBtnExitTheaterMode] = 'Mode standard';\nstrings$4[playerStringNames.confirmOpenUrlModalScreenReaderAlertText] = 'La vidéo tente d’ouvrir l’URL suivante URL_TOKEN.';\nstrings$4[playerStringNames.confirmOpenUrlConfirmButtonScreenReaderText] = 'Continuer vers l’autre site Web';\nstrings$4[playerStringNames.fastForwardDisabledScreenReaderText] = 'L’avance rapide est désactivée pour cette vidéo';\nstrings$4[playerStringNames.scormCompleteVideoLater] = 'Terminer la vidéo plus tard';\nstrings$4[playerStringNames.scormCompleteVideo] = 'Terminer la vidéo';\nstrings$4[playerStringNames.scormExitVideo] = 'Quitter la vidéo';\nstrings$4[playerStringNames.scormConfirmCompleteModalText] = 'Voulez-vous vraiment quitter cette vidéo ?';\nstrings$4[playerStringNames.scormConfirmCompleteModalResumeVideoText] = 'Elle reprendra au même endroit la prochaine fois que vous la visionnerez.';\nstrings$4[playerStringNames.scormConfirmCompleteModalRestartVideoText] = 'Elle reprendra au début la prochaine fois que vous la visionnerez. Tout progrès sera perdu.';\nstrings$4[playerStringNames.scormConfirmCompleteModalFailedToSaveProgressText] = 'Un problème est survenu lors de l’enregistrement de la progression. La lecture reprendra au début la prochaine fois que vous regarderez cette vidéo.';\nstrings$4[playerStringNames.scormConfirmCompleteModalDismissButtonText] = 'Revenir à la vidéo';\nstrings$4[playerStringNames.scormConfirmCompleteModalDismissButtonScreenReaderText] = 'Revenir à la vidéo';\nstrings$4[playerStringNames.scormConfirmCompleteModalConfirmButtonText] = 'Quitter la vidéo';\nstrings$4[playerStringNames.scormConfirmCompleteModalConfirmButtonScreenReaderText] = 'Quitter la vidéo';\nstrings$4[playerStringNames.scormSessionEndedText] = 'Vous pouvez fermer l’onglet ou revenir à votre cours.';\nstrings$4[playerStringNames.searchOrJumpTo] = 'Rechercher ou accéder à un élément.';\nstrings$4[playerStringNames.searchTextCleared] = 'Texte de recherche supprimé.';\nstrings$4[playerStringNames.searchResultsUpdated] = 'Résultats de recherche mis à jour. {{number}} résultats.';\nstrings$4[playerStringNames.tableOfContentsDisplayed] = 'Chapitres affichés.';\nstrings$4[playerStringNames.tableOfContentsHidden] = 'Chapitres masqués.';\nstrings$4[playerStringNames.defaultMediaTitle] = 'TechSmith Smart Player';\nstrings$4[playerStringNames.hideThumbnailDueToQuiz] = 'Répondez au questionnaire pour afficher l’aperçu';\nstrings$4[playerStringNames.quizAtTimeHeading] = 'Questionnaire situé à ';\nstrings$4[playerStringNames.defaultFirstChapterName] = 'introduction';\nstrings$4[playerStringNames.acknowledgementLinkName] = 'Crédits';\nvar getLanguage$4 = function getLanguage() {\n return languageCodes.FRENCH;\n};\nvar getReadableTimeByLocale$4 = function getReadableTimeByLocale(hours, minutes, seconds) {\n var timeStringList = [];\n if (hours > 0) {\n var hoursReadableString = hours + ' heure';\n hoursReadableString += hours > 1 ? 's' : '';\n timeStringList.push(hoursReadableString);\n }\n if (minutes > 0) {\n var minutesReadableString = minutes + ' minute';\n minutesReadableString += minutes > 1 ? 's' : '';\n timeStringList.push(minutesReadableString);\n }\n if (seconds > 0) {\n var secondsReadableString = seconds + ' seconde';\n secondsReadableString += seconds > 1 ? 's' : '';\n timeStringList.push(secondsReadableString);\n }\n return timeStringList.join(' et ');\n};\nvar frFrLocale = Object.defineProperties({\n getReadableTimeByLocale: getReadableTimeByLocale$4\n}, {\n language: {\n get: getLanguage$4\n },\n strings: {\n get: function get() {\n return strings$4;\n }\n }\n});\n\nvar strings$3 = {};\nstrings$3[playerStringNames.xmpError] = 'Parece que hay problemas para acceder a determinadas funciones de este vÃdeo. Póngase en contacto con el autor.';\nstrings$3[playerStringNames.xmpSecurity] = 'Actualmente determinadas funciones del vÃdeo están desactivadas debido a la configuración de seguridad de la red local. Funcionarán correctamente cuando el vÃdeo se reproduzca desde un sitio web o un servidor.';\nstrings$3[playerStringNames.videoNotSupported] = 'Su explorador no puede reproducir este vÃdeo.';\nstrings$3[playerStringNames.noWebMSupport] = 'Este explorador no admite vÃdeo WebM.';\nstrings$3[playerStringNames.search] = 'Buscar';\nstrings$3[playerStringNames.searchPlaceholder] = 'Buscar...';\nstrings$3[playerStringNames.playerRateText] = 'Velocidad de reproducción';\nstrings$3[playerStringNames.playerRateOptionsText] = {\n 0.25: '0,25',\n 0.5: '0,5',\n 0.75: '0,75',\n 1: 'normal',\n 1.25: '1,25',\n 1.5: '1,5',\n 1.75: '1,75',\n 2.0: '2,0'\n};\nstrings$3[playerStringNames.ccLanguageText] = 'SubtÃtulos';\nstrings$3[playerStringNames.searchDisabledFullScreen] = 'La función Buscar está desactivada en el modo de pantalla completa.';\nstrings$3[playerStringNames.mediaNotFound] = 'Lo lamentamos, pero no hemos podido conectarnos a este contenido. Pruebe a actualizar la página o <a href=\\'https://www.techsmith.com/redirect.asp?target=media_not_found&ver=4.*.*&lang=enu&os=na&product=smartplayer\\' target=\\'_blank\\'> pulse aquà para obtener ayuda.</a>';\nstrings$3[playerStringNames.videoLoading] = 'El vÃdeo se está cargando.';\nstrings$3[playerStringNames.close] = 'Cerrar';\nstrings$3[playerStringNames.txtRequiredMessage] = 'El propietario del contenido solicita lo siguiente:';\nstrings$3[playerStringNames.txtSkip] = 'Continuar sin preguntas';\nstrings$3[playerStringNames.txtBegin] = 'Enviar y continuar';\nstrings$3[playerStringNames.txtEnterFirstName] = 'Introduzca su nombre';\nstrings$3[playerStringNames.txtEnterLastName] = 'Introduzca sus apellidos';\nstrings$3[playerStringNames.txtEnterEmail] = 'Introduzca su dirección de correo electrónico';\nstrings$3[playerStringNames.txtHotspot] = 'Zona activa';\nstrings$3[playerStringNames.txtHotspotScreenReaderAlert] = '{{numberOfHotspots}} zona activa nueva';\nstrings$3[playerStringNames.txtHotspotScreenReaderAlertPlural] = '{{numberOfHotspots}} zonas activas nuevas';\nstrings$3[playerStringNames.txtJumpToMedia] = 'Saltar al medio';\nstrings$3[playerStringNames.txtJumpToTime] = 'Saltar al tiempo';\nstrings$3[playerStringNames.txtOpenLink] = 'Abrir vÃnculo';\nstrings$3[playerStringNames.txtOpenLinkHeader] = 'Este vÃdeo quiere enviarte a:';\nstrings$3[playerStringNames.txtOpenLinkSubHeader] = '';\nstrings$3[playerStringNames.txtReview] = 'Reproducir última sección';\nstrings$3[playerStringNames.txtReplayVideo] = 'Volver a ver';\nstrings$3[playerStringNames.txtAnswerQuestion] = 'Responder al cuestionario ahora';\nstrings$3[playerStringNames.txtPrev] = 'Anterior';\nstrings$3[playerStringNames.txtNext] = 'Siguiente';\nstrings$3[playerStringNames.txtHideQuiz] = 'Ocultar';\nstrings$3[playerStringNames.txtSubmit] = 'Enviar respuestas';\nstrings$3[playerStringNames.txtSubmittingAnswers] = 'Enviando respuestas.';\nstrings$3[playerStringNames.txtContinue] = 'Continuar';\nstrings$3[playerStringNames.txtReviewAnswer] = 'Ver respuestas';\nstrings$3[playerStringNames.txtBadImageQuiz] = 'Lo lamentamos, el cuestionario solicitado no admite imágenes y no se puede cargar. Póngase en contacto con el autor de este cuestionario.';\nstrings$3[playerStringNames.txtVideoQuizNetworkErrorMessage] = 'Lo lamentamos, un error de red ha impedido la carga del cuestionario. El vÃdeo sà está disponible para su visualización. Para intentar volver a cargar el cuestionario, actualice la página del navegador o compruebe la conexión de red.';\nstrings$3[playerStringNames.txtImageQuizNetworkErrorMessage] = 'Lo lamentamos, un error de red ha impedido la carga del cuestionario. La imagen sà está disponible para su visualización. Para intentar volver a cargar el cuestionario, actualice la página del navegador o compruebe la conexión de red.';\nstrings$3[playerStringNames.txtQuizErrorMessage] = 'Estamos intentando guardar su respuesta. Verifique que tiene conexión a Internet.';\nstrings$3[playerStringNames.txtQuizOutOfDateMessage] = 'Las preguntas del cuestionario han cambiado. Actualiza el reproductor para ver el cuestionario más reciente.';\nstrings$3[playerStringNames.txtQuizBadDefinitionMessage] = 'Cuestionario no válido. No es posible enviar los comentarios del cuestionario. Refiere al propietario del vÃdeo a <a href=\"https://www.techsmith.com/redirect.asp?target=bad_quiz_definition&ver=5.*.*&lang=enu&os=na&product=smartplayer\" target=\"_blank\">este artÃculo de ayuda</a>.';\nstrings$3[playerStringNames.txtQuizOutOfDateRefreshButtonText] = 'Actualizar el reproductor';\nstrings$3[playerStringNames.txtLoaderMessageDefinition] = 'El cuestionario se está cargando.';\nstrings$3[playerStringNames.txtQuestionCount] = 'Pregunta {{currentQuestion}} de {{totalQuestions}}';\nstrings$3[playerStringNames.txtResults] = 'Resultados: ';\nstrings$3[playerStringNames.txtCorrectString] = 'Correcto';\nstrings$3[playerStringNames.txtIncorrectString] = 'Incorrecto';\nstrings$3[playerStringNames.txtCorrect] = '{{numberCorrect}} respuestas correctas';\nstrings$3[playerStringNames.txtIncorrect] = '{{numberIncorrect}} respuestas incorrectas';\nstrings$3[playerStringNames.txtYourAnswer] = 'Su respuesta: ';\nstrings$3[playerStringNames.txtCorrectAnswer] = 'Respuesta correcta: ';\nstrings$3[playerStringNames.txtVisitSite] = 'Visitar el sitio';\nstrings$3[playerStringNames.accessBtnAudioDescription] = 'Descripción de audio';\nstrings$3[playerStringNames.accessBtnClearSearch] = 'Borrar búsqueda';\nstrings$3[playerStringNames.accessBtnRewind] = 'Retroceder {{duration}} segundos';\nstrings$3[playerStringNames.accessBtnForward] = 'Avanzar {{duration}} segundos';\nstrings$3[playerStringNames.accessBtnPlay] = 'Reproducir vÃdeo';\nstrings$3[playerStringNames.accessBtnPrevious] = 'Anterior';\nstrings$3[playerStringNames.accessBtnNext] = 'Siguiente';\nstrings$3[playerStringNames.accessBtnProgressBar] = 'Control de barra de progreso';\nstrings$3[playerStringNames.accessBtnVolume] = 'Silencio';\nstrings$3[playerStringNames.accessTxtVolume] = 'Volumen';\nstrings$3[playerStringNames.accessBtnClosedCaption] = 'SubtÃtulo';\nstrings$3[playerStringNames.accessBtnTableOfContents] = 'Mostrar capÃtulos (T)';\nstrings$3[playerStringNames.accessBtnSettings] = 'Ajustes del reproductor';\nstrings$3[playerStringNames.accessBtnPip] = 'Imagen dentro de imagen';\nstrings$3[playerStringNames.accessBtnFullScreen] = 'Pantalla completa';\nstrings$3[playerStringNames.accessBtnFullScreenExpand] = 'Abrir en una nueva pestaña';\nstrings$3[playerStringNames.accessBtnTakeQuiz] = 'Pulse para responder al cuestionario.';\nstrings$3[playerStringNames.accessBtnShowQuiz] = 'Mostrar cuestionario';\nstrings$3[playerStringNames.accessBtnHideQuiz] = 'Ocultar cuestionario';\nstrings$3[playerStringNames.accessBtnPreviousQuestion] = 'Pregunta anterior';\nstrings$3[playerStringNames.accessBtnNextQuestion] = 'Pregunta siguiente';\nstrings$3[playerStringNames.accessQuizHidden] = 'El cuestionario se ha ocultado';\nstrings$3[playerStringNames.accessQuizShown] = 'El cuestionario se muestra ahora';\nstrings$3[playerStringNames.accessBtnShowAnswer] = 'Mostrar respuestas';\nstrings$3[playerStringNames.accessBtnHideAnswer] = 'Ocultar respuestas';\nstrings$3[playerStringNames.accessBtnAnswersSubmitted] = '¡Respuestas enviadas!';\nstrings$3[playerStringNames.accessBtnWereNotGraded] = ' no han sido calificadas.';\nstrings$3[playerStringNames.accessBtnWasNotGraded] = ' no ha sido calificada.';\nstrings$3[playerStringNames.accessBtnCorrectOutOf] = ' correcta(s) de ';\nstrings$3[playerStringNames.accessBtnGradedQuestions] = ' preguntas calificadas.';\nstrings$3[playerStringNames.accessBtnClickToReplayLink] = 'Reproducir';\nstrings$3[playerStringNames.accessResultsLabelCorrectSuffix] = 'es correcto.';\nstrings$3[playerStringNames.accessResultsLabelIncorrectSuffix] = 'es incorrecto.';\nstrings$3[playerStringNames.accessResultsLabelNoResponseSuffix] = 'no respondiste a esta pregunta.';\nstrings$3[playerStringNames.accessResultsLabelNoResponseGradedSuffix] = 'no respondiste a esta pregunta y se ha marcado como incorrecta.';\nstrings$3[playerStringNames.scormApiNotFoundMessage] = 'No es posible localizar la implementación de la API de LMS.\\nNo se establecerá ninguna conexión con LMS.';\nstrings$3[playerStringNames.accessListTableOfContents] = 'CapÃtulos';\nstrings$3[playerStringNames.accessListSearchResults] = 'Resultados de la búsqueda en orden de aparición';\nstrings$3[playerStringNames.accessListNoSearchResults] = 'No se encontró ningún resultado';\nstrings$3[playerStringNames.accessQuestionSetConfirmationTitle] = 'Cuestionario';\nstrings$3[playerStringNames.accessVideoPausedForQuiz] = 'VÃdeo en pausa para el cuestionario';\nstrings$3[playerStringNames.accessQuizResults] = 'Resultados del cuestionario';\nstrings$3[playerStringNames.accessQuestionFeedbackContext] = 'Comentarios de la pregunta: ';\nstrings$3[playerStringNames.accessProgressBarTimeConjunction] = ' de ';\nstrings$3[playerStringNames.accessPlayerSettingsClose] = 'Cerrar ajustes del reproductor';\nstrings$3[playerStringNames.accessBtnTheaterMode] = 'Modo de pantalla completa';\nstrings$3[playerStringNames.accessBtnExitTheaterMode] = 'Modo predeterminado';\nstrings$3[playerStringNames.confirmOpenUrlModalScreenReaderAlertText] = 'El vÃdeo quiere abrir la siguiente dirección url URL_TOKEN.';\nstrings$3[playerStringNames.confirmOpenUrlConfirmButtonScreenReaderText] = 'Continuar al nuevo sitio web';\nstrings$3[playerStringNames.fastForwardDisabledScreenReaderText] = 'Se ha desactivado el avance rápido en este vÃdeo';\nstrings$3[playerStringNames.scormCompleteVideoLater] = 'Terminar el vÃdeo más tarde';\nstrings$3[playerStringNames.scormCompleteVideo] = 'Terminar el vÃdeo';\nstrings$3[playerStringNames.scormExitVideo] = 'Salir del vÃdeo';\nstrings$3[playerStringNames.scormConfirmCompleteModalText] = '¿Seguro que quieres salir del vÃdeo?';\nstrings$3[playerStringNames.scormConfirmCompleteModalResumeVideoText] = 'La próxima vez que lo abras, el vÃdeo se reanudará en el punto en que lo dejaste.';\nstrings$3[playerStringNames.scormConfirmCompleteModalRestartVideoText] = 'La próxima vez que lo abras, el vÃdeo se volverá a reproducir desde el principio. No se conservará el progreso actual.';\nstrings$3[playerStringNames.scormConfirmCompleteModalFailedToSaveProgressText] = 'Ha habido un problema al guardar tu progreso. El vÃdeo comenzará desde el principio la próxima vez que lo veas.';\nstrings$3[playerStringNames.scormConfirmCompleteModalDismissButtonText] = 'Volver al vÃdeo';\nstrings$3[playerStringNames.scormConfirmCompleteModalDismissButtonScreenReaderText] = 'Volver al vÃdeo';\nstrings$3[playerStringNames.scormConfirmCompleteModalConfirmButtonText] = 'Salir del vÃdeo';\nstrings$3[playerStringNames.scormConfirmCompleteModalConfirmButtonScreenReaderText] = 'Salir del vÃdeo';\nstrings$3[playerStringNames.scormSessionEndedText] = 'Puedes cerrar la pestaña o volver al curso.';\nstrings$3[playerStringNames.searchOrJumpTo] = 'Buscar o acceder.';\nstrings$3[playerStringNames.searchTextCleared] = 'Texto de búsqueda borrado.';\nstrings$3[playerStringNames.searchResultsUpdated] = 'Resultados de búsqueda actualizados. {{number}} resultados.';\nstrings$3[playerStringNames.tableOfContentsDisplayed] = 'CapÃtulos mostrados.';\nstrings$3[playerStringNames.tableOfContentsHidden] = 'CapÃtulos ocultos.';\nstrings$3[playerStringNames.defaultMediaTitle] = 'TechSmith Smart Player';\nstrings$3[playerStringNames.hideThumbnailDueToQuiz] = 'Responder el cuestionario para ver vista previa';\nstrings$3[playerStringNames.quizAtTimeHeading] = 'Cuestionario en';\nstrings$3[playerStringNames.defaultFirstChapterName] = 'introducción';\nstrings$3[playerStringNames.acknowledgementLinkName] = 'Agradecimientos';\nvar getLanguage$3 = function getLanguage() {\n return languageCodes.SPANISH;\n};\nvar getReadableTimeByLocale$3 = function getReadableTimeByLocale(hours, minutes, seconds) {\n var timeStringList = [];\n if (hours > 0) {\n var hoursReadableString = hours + ' hora';\n hoursReadableString += hours > 1 ? 's' : '';\n timeStringList.push(hoursReadableString);\n }\n if (minutes > 0) {\n var minutesReadableString = minutes + ' minuto';\n minutesReadableString += minutes > 1 ? 's' : '';\n timeStringList.push(minutesReadableString);\n }\n if (seconds > 0) {\n var secondsReadableString = seconds + ' segundo';\n secondsReadableString += seconds > 1 ? 's' : '';\n timeStringList.push(secondsReadableString);\n }\n return timeStringList.join(' y ');\n};\nvar esEsLocale = Object.defineProperties({\n getReadableTimeByLocale: getReadableTimeByLocale$3\n}, {\n language: {\n get: getLanguage$3\n },\n strings: {\n get: function get() {\n return strings$3;\n }\n }\n});\n\nvar strings$2 = {};\nstrings$2[playerStringNames.xmpError] = '访问æ¤è§†é¢‘çš„æŸäº›åŠŸèƒ½ä¼¼ä¹Žå˜åœ¨é—®é¢˜ã€‚请è”系视频作者。';\nstrings$2[playerStringNames.xmpSecurity] = '由于本地网络安全,您视频ä¸çš„æŸäº›åŠŸèƒ½å½“å‰å·²è¢«ç¦ç”¨ã€‚从网站或æœåŠ¡å™¨æ’放æ¤è§†é¢‘时,这些功能æ£å¸¸å·¥ä½œã€‚';\nstrings$2[playerStringNames.videoNotSupported] = '您的æµè§ˆå™¨æ— 法æ’放æ¤è§†é¢‘。';\nstrings$2[playerStringNames.noWebMSupport] = 'æ¤æµè§ˆå™¨ä¸æ”¯æŒ WebM 视频。';\nstrings$2[playerStringNames.search] = 'æœç´¢';\nstrings$2[playerStringNames.searchPlaceholder] = 'æœç´¢...';\nstrings$2[playerStringNames.playerRateText] = 'æ’放速度';\nstrings$2[playerStringNames.playerRateOptionsText] = {\n 0.25: '0.25',\n 0.5: '0.5',\n 0.75: '0.75',\n 1: 'æ£å¸¸',\n 1.25: '1.25',\n 1.5: '1.5',\n 1.75: '1.75',\n 2.0: '2.0'\n};\nstrings$2[playerStringNames.ccLanguageText] = 'éšè—å¼å—幕';\nstrings$2[playerStringNames.searchDisabledFullScreen] = 'æœç´¢åœ¨å…¨å±æ¨¡å¼ä¸‹è¢«ç¦ç”¨ã€‚';\nstrings$2[playerStringNames.mediaNotFound] = '很抱æ‰ï¼Œæˆ‘ä»¬æ— æ³•è¿žæŽ¥åˆ°æ¤å†…容。请å°è¯•åˆ·æ–°é¡µé¢æˆ–<a href= \\'https://www.techsmith.com/redirect.asp?target=media_not_found&ver=4.*.*&lang=enu&os=na&product=smartplayer \\' target= \\'_blank \\'>å•å‡»æ¤å¤„获å–更多帮助。</a>';\nstrings$2[playerStringNames.videoLoading] = '视频æ£åœ¨åŠ è½½';\nstrings$2[playerStringNames.close] = 'å…³é—';\nstrings$2[playerStringNames.txtRequiredMessage] = '内容所有者è¦æ±‚以下内容:';\nstrings$2[playerStringNames.txtSkip] = '没有问题的情况下继ç»';\nstrings$2[playerStringNames.txtBegin] = 'æ交并继ç»';\nstrings$2[playerStringNames.txtEnterFirstName] = '输入åå—';\nstrings$2[playerStringNames.txtEnterLastName] = '输入姓æ°';\nstrings$2[playerStringNames.txtEnterEmail] = '输入电å邮件地å€';\nstrings$2[playerStringNames.txtHotspot] = 'çƒç‚¹';\nstrings$2[playerStringNames.txtHotspotScreenReaderAlert] = '{{numberOfHotspots}}æ–°çƒç‚¹';\nstrings$2[playerStringNames.txtHotspotScreenReaderAlertPlural] = '{{numberOfHotspots}}æ–°çƒç‚¹';\nstrings$2[playerStringNames.txtJumpToMedia] = '跳转到媒体';\nstrings$2[playerStringNames.txtJumpToTime] = '跳转到时间';\nstrings$2[playerStringNames.txtOpenLink] = '打开链接';\nstrings$2[playerStringNames.txtOpenLinkHeader] = '本视频希望å‘é€è‡³ï¼š';\nstrings$2[playerStringNames.txtOpenLinkSubHeader] = '';\nstrings$2[playerStringNames.txtReview] = 'é‡æ’最åŽä¸€éƒ¨åˆ†';\nstrings$2[playerStringNames.txtReplayVideo] = 'é‡æ’视频';\nstrings$2[playerStringNames.txtAnswerQuestion] = 'ç«‹å³è¿›è¡Œæµ‹éªŒ';\nstrings$2[playerStringNames.txtPrev] = '上一个';\nstrings$2[playerStringNames.txtNext] = '下一个';\nstrings$2[playerStringNames.txtHideQuiz] = 'éšè—';\nstrings$2[playerStringNames.txtSubmit] = 'æ交ç”案';\nstrings$2[playerStringNames.txtSubmittingAnswers] = 'æ£åœ¨æ交ç”案。';\nstrings$2[playerStringNames.txtContinue] = '继ç»';\nstrings$2[playerStringNames.txtReviewAnswer] = '查看ç”案';\nstrings$2[playerStringNames.txtBadImageQuiz] = '很抱æ‰ï¼Œè¯·æ±‚的测验与图片ä¸å…¼å®¹ï¼Œæ— æ³•åŠ è½½ã€‚è¯·è”系本测验的作者。';\nstrings$2[playerStringNames.txtVideoQuizNetworkErrorMessage] = '很抱æ‰ï¼Œç½‘ç»œé”™è¯¯å¯¼è‡´æµ‹éªŒæ— æ³•åŠ è½½ã€‚è¯¥è§†é¢‘å¯ä¾›è§‚看。è¦å°è¯•é‡æ–°åŠ 载测验,请刷新æµè§ˆå™¨é¡µé¢æˆ–检查您的网络连接。';\nstrings$2[playerStringNames.txtImageQuizNetworkErrorMessage] = '很抱æ‰ï¼Œç½‘ç»œé”™è¯¯å¯¼è‡´æµ‹éªŒæ— æ³•åŠ è½½ã€‚è¯¥å›¾ç‰‡å¯ä¾›æŸ¥çœ‹ã€‚è¦å°è¯•é‡æ–°åŠ 载测验,请刷新æµè§ˆå™¨é¡µé¢æˆ–检查您的网络连接。';\nstrings$2[playerStringNames.txtQuizErrorMessage] = '我们æ£åœ¨å°è¯•ä¿å˜æ‚¨çš„回ç”。请确ä¿æ‚¨æœ‰æœ‰æ•ˆçš„互è”网连接。';\nstrings$2[playerStringNames.txtQuizOutOfDateMessage] = '测验问题已更改。请刷新æ’放器以获å–最新的测验。';\nstrings$2[playerStringNames.txtQuizBadDefinitionMessage] = '<a href=\"https://www.techsmith.com/redirect.asp?target=bad_quiz_definition&ver=5.*.*&lang=enu&os=na&product=smartplayer\" target=\"_blank\">æ— æ•ˆæµ‹è¯•æ— æ³•æ交测试å馈请视频所有者å‚阅æ¤å¸®åŠ©æ–‡æ¡£</a>';\nstrings$2[playerStringNames.txtQuizOutOfDateRefreshButtonText] = '刷新æ’放器';\nstrings$2[playerStringNames.txtLoaderMessageDefinition] = '测验æ£åœ¨åŠ 载。';\nstrings$2[playerStringNames.txtQuestionCount] = '问题 {{currentQuestion}}/{{totalQuestions}}';\nstrings$2[playerStringNames.txtResults] = '结果:';\nstrings$2[playerStringNames.txtCorrectString] = 'æ£ç¡®';\nstrings$2[playerStringNames.txtIncorrectString] = 'ä¸æ£ç¡®';\nstrings$2[playerStringNames.txtCorrect] = '{{numberCorrect}}æ£ç¡®';\nstrings$2[playerStringNames.txtIncorrect] = '{{numberIncorrect}}ä¸æ£ç¡®';\nstrings$2[playerStringNames.txtYourAnswer] = '您的ç”案:';\nstrings$2[playerStringNames.txtCorrectAnswer] = 'æ£ç¡®ç”案:';\nstrings$2[playerStringNames.txtVisitSite] = '访问网站';\nstrings$2[playerStringNames.accessBtnAudioDescription] = '音频æè¿°';\nstrings$2[playerStringNames.accessBtnClearSearch] = '清除æœç´¢';\nstrings$2[playerStringNames.accessBtnRewind] = 'å‘åŽé€€å›ž {{duration}} 秒';\nstrings$2[playerStringNames.accessBtnForward] = 'å‘å‰è·³è¿‡ {{duration}} 秒';\nstrings$2[playerStringNames.accessBtnPlay] = 'æ’放视频';\nstrings$2[playerStringNames.accessBtnPrevious] = '上一个';\nstrings$2[playerStringNames.accessBtnNext] = '下一个';\nstrings$2[playerStringNames.accessBtnProgressBar] = '进度滑å—';\nstrings$2[playerStringNames.accessBtnVolume] = 'é™éŸ³';\nstrings$2[playerStringNames.accessTxtVolume] = '音é‡';\nstrings$2[playerStringNames.accessBtnClosedCaption] = 'éšè—å¼å—幕';\nstrings$2[playerStringNames.accessBtnTableOfContents] = 'æ˜¾ç¤ºç« èŠ‚(T)';\nstrings$2[playerStringNames.accessBtnSettings] = 'æ’放器设置';\nstrings$2[playerStringNames.accessBtnPip] = 'ç”»ä¸ç”»';\nstrings$2[playerStringNames.accessBtnFullScreen] = 'å…¨å±';\nstrings$2[playerStringNames.accessBtnFullScreenExpand] = '在新选项å¡ä¸æ‰“å¼€';\nstrings$2[playerStringNames.accessBtnTakeQuiz] = 'å•å‡»ä»¥å‚åŠ æµ‹éªŒã€‚';\nstrings$2[playerStringNames.accessBtnShowQuiz] = '显示测验';\nstrings$2[playerStringNames.accessBtnHideQuiz] = 'éšè—测验';\nstrings$2[playerStringNames.accessBtnPreviousQuestion] = '上一个问题';\nstrings$2[playerStringNames.accessBtnNextQuestion] = '下一个问题';\nstrings$2[playerStringNames.accessQuizHidden] = 'å·²éšè—测验';\nstrings$2[playerStringNames.accessQuizShown] = '已显示测验';\nstrings$2[playerStringNames.accessBtnShowAnswer] = '显示ç”案';\nstrings$2[playerStringNames.accessBtnHideAnswer] = 'éšè—ç”案';\nstrings$2[playerStringNames.accessBtnAnswersSubmitted] = 'ç”案已æ交ï¼';\nstrings$2[playerStringNames.accessBtnWereNotGraded] = ' 未分级。';\nstrings$2[playerStringNames.accessBtnWasNotGraded] = ' 未分级。';\nstrings$2[playerStringNames.accessBtnCorrectOutOf] = ' æ£ç¡®ç”案比例';\nstrings$2[playerStringNames.accessBtnGradedQuestions] = ' 已分级问题。';\nstrings$2[playerStringNames.accessBtnClickToReplayLink] = 'é‡æ’';\nstrings$2[playerStringNames.accessResultsLabelCorrectSuffix] = '是æ£ç¡®çš„';\nstrings$2[playerStringNames.accessResultsLabelIncorrectSuffix] = '是错误的';\nstrings$2[playerStringNames.accessResultsLabelNoResponseSuffix] = '您没有回ç”这个问题。';\nstrings$2[playerStringNames.accessResultsLabelNoResponseGradedSuffix] = '您没有回ç”æ¤é—®é¢˜ï¼Œå¹¶ä¸”å·²è¢«æ ‡è®°ä¸ºé”™è¯¯ã€‚';\nstrings$2[playerStringNames.scormApiNotFoundMessage] = 'æ— æ³•æ‰¾åˆ° LMS çš„ API Implementation。\\nä¸ä¼šå‘生与 LMS 的通信。';\nstrings$2[playerStringNames.accessListTableOfContents] = 'ç« èŠ‚';\nstrings$2[playerStringNames.accessListSearchResults] = '按外观顺åºæœç´¢ç»“æžœ';\nstrings$2[playerStringNames.accessListNoSearchResults] = '未找到结果';\nstrings$2[playerStringNames.accessQuestionSetConfirmationTitle] = '测验';\nstrings$2[playerStringNames.accessVideoPausedForQuiz] = 'è§†é¢‘å› æµ‹éªŒè€Œæš‚åœ';\nstrings$2[playerStringNames.accessQuizResults] = '测验结果';\nstrings$2[playerStringNames.accessQuestionFeedbackContext] = '问题å馈:';\nstrings$2[playerStringNames.accessProgressBarTimeConjunction] = ' çš„ ';\nstrings$2[playerStringNames.accessPlayerSettingsClose] = 'å…³é—æ’放器设置';\nstrings$2[playerStringNames.accessBtnTheaterMode] = '剧院模å¼';\nstrings$2[playerStringNames.accessBtnExitTheaterMode] = '默认模å¼';\nstrings$2[playerStringNames.confirmOpenUrlModalScreenReaderAlertText] = '该视频想è¦æ‰“å¼€ä»¥ä¸‹ç½‘å€ URL_TOKEN。';\nstrings$2[playerStringNames.confirmOpenUrlConfirmButtonScreenReaderText] = '继ç»åˆ°æ–°ç½‘ç«™';\nstrings$2[playerStringNames.fastForwardDisabledScreenReaderText] = '该视频的快进功能已被ç¦ç”¨';\nstrings$2[playerStringNames.scormCompleteVideoLater] = 'ç¨åŽå®Œæˆè§†é¢‘';\nstrings$2[playerStringNames.scormCompleteVideo] = '完æˆè§†é¢‘';\nstrings$2[playerStringNames.scormExitVideo] = '退出视频';\nstrings$2[playerStringNames.scormConfirmCompleteModalText] = '您确定è¦é€€å‡ºè§†é¢‘å—?';\nstrings$2[playerStringNames.scormConfirmCompleteModalResumeVideoText] = '视频将在您下次打开视频时从上次åœæ’的地方继ç»æ’放。';\nstrings$2[playerStringNames.scormConfirmCompleteModalRestartVideoText] = '视频将在下一次开始时é‡æ–°æ’放。您将失去当å‰çš„进度。';\nstrings$2[playerStringNames.scormConfirmCompleteModalFailedToSaveProgressText] = 'ä¿å˜æ‚¨çš„进度时出现问题。该视频将在您下次观看时将从头开始æ’放。';\nstrings$2[playerStringNames.scormConfirmCompleteModalDismissButtonText] = '返回视频';\nstrings$2[playerStringNames.scormConfirmCompleteModalDismissButtonScreenReaderText] = '返回视频';\nstrings$2[playerStringNames.scormConfirmCompleteModalConfirmButtonText] = '退出视频';\nstrings$2[playerStringNames.scormConfirmCompleteModalConfirmButtonScreenReaderText] = '退出视频';\nstrings$2[playerStringNames.scormSessionEndedText] = '您å¯ä»¥å…³é—选项å¡æˆ–返回课程。';\nstrings$2[playerStringNames.searchOrJumpTo] = 'æœç´¢æˆ–跳转到';\nstrings$2[playerStringNames.searchTextCleared] = 'æœç´¢æ–‡å—已清除。';\nstrings$2[playerStringNames.searchResultsUpdated] = 'æœç´¢ç»“果已更新。{{number}} 结果。';\nstrings$2[playerStringNames.tableOfContentsDisplayed] = 'æ˜¾ç¤ºçš„ç« èŠ‚ã€‚';\nstrings$2[playerStringNames.tableOfContentsHidden] = 'éšè—çš„ç« èŠ‚ã€‚';\nstrings$2[playerStringNames.defaultMediaTitle] = 'TechSmith Smart Player';\nstrings$2[playerStringNames.hideThumbnailDueToQuiz] = '进行测验以预览';\nstrings$2[playerStringNames.quizAtTimeHeading] = '测验所在ä½ç½®ï¼š';\nstrings$2[playerStringNames.defaultFirstChapterName] = '介ç»';\nstrings$2[playerStringNames.acknowledgementLinkName] = '致谢';\nvar getLanguage$2 = function getLanguage() {\n return languageCodes.CHINESE;\n};\nvar getReadableTimeByLocale$2 = function getReadableTimeByLocale(hours, minutes, seconds) {\n var timeStringList = [];\n if (hours > 0) {\n var hoursReadableString = hours + 'å°æ—¶';\n timeStringList.push(hoursReadableString);\n }\n if (minutes > 0) {\n var minutesReadableString = minutes + '分';\n timeStringList.push(minutesReadableString);\n }\n if (seconds > 0) {\n var secondsReadableString = seconds + '秒';\n timeStringList.push(secondsReadableString);\n }\n return timeStringList.join('');\n};\nvar zhCnLocale = Object.defineProperties({\n getReadableTimeByLocale: getReadableTimeByLocale$2\n}, {\n language: {\n get: getLanguage$2\n },\n strings: {\n get: function get() {\n return strings$2;\n }\n }\n});\n\nvar strings$1 = {};\nstrings$1[playerStringNames.xmpError] = 'Parece que há um problema no acesso a certos recursos deste vÃdeo. Entre em contato com o autor do vÃdeo.';\nstrings$1[playerStringNames.xmpSecurity] = 'Certos recursos do seu vÃdeo estão atualmente desativados devido à Segurança da Rede Local. Esses recursos funcionam corretamente quando o vÃdeo é reproduzido a partir de um site ou servidor.';\nstrings$1[playerStringNames.videoNotSupported] = 'Seu navegador não pode reproduzir este vÃdeo.';\nstrings$1[playerStringNames.noWebMSupport] = 'Este navegador não aceita vÃdeo WebM.';\nstrings$1[playerStringNames.search] = 'Pesquisar';\nstrings$1[playerStringNames.searchPlaceholder] = 'Pesquisar...';\nstrings$1[playerStringNames.playerRateText] = 'Velocidade de Reprodução';\nstrings$1[playerStringNames.playerRateOptionsText] = {\n 0.25: '0,25',\n 0.5: '0,5',\n 0.75: '0,75',\n 1: 'normal',\n 1.25: '1,25',\n 1.5: '1,5',\n 1.75: '1,75',\n 2.0: '2,0'\n};\nstrings$1[playerStringNames.ccLanguageText] = 'Closed Captions';\nstrings$1[playerStringNames.searchDisabledFullScreen] = 'A pesquisa é desativada no modo de tela cheia.';\nstrings$1[playerStringNames.mediaNotFound] = 'Desculpe, mas não é possÃvel conectar a este conteúdo. Tente atualizar a página ou <a href=\\'https://www.techsmith.com/redirect.asp?target=media_not_found&ver=4.*.*&lang=enu&os=na&product=smartplayer\\' target=\\'_blank\\'> clique aqui para obter mais ajuda.</a>';\nstrings$1[playerStringNames.videoLoading] = 'O vÃdeo está carregando.';\nstrings$1[playerStringNames.close] = 'Fechar';\nstrings$1[playerStringNames.txtRequiredMessage] = 'O dono do conteúdo solicita as seguintes informações:';\nstrings$1[playerStringNames.txtSkip] = 'Continuar sem perguntas';\nstrings$1[playerStringNames.txtBegin] = 'Enviar e continuar';\nstrings$1[playerStringNames.txtEnterFirstName] = 'Digite o nome';\nstrings$1[playerStringNames.txtEnterLastName] = 'Digite o sobrenome';\nstrings$1[playerStringNames.txtEnterEmail] = 'Digite o endereço de e-mail';\nstrings$1[playerStringNames.txtHotspot] = 'Hotspot';\nstrings$1[playerStringNames.txtHotspotScreenReaderAlert] = '{{numberOfHotspots}} novo hotspot';\nstrings$1[playerStringNames.txtHotspotScreenReaderAlertPlural] = '{{numberOfHotspots}} novos hotspots';\nstrings$1[playerStringNames.txtJumpToMedia] = 'Ir para mÃdia';\nstrings$1[playerStringNames.txtJumpToTime] = 'Ir para tempo';\nstrings$1[playerStringNames.txtOpenLink] = 'Abrir link';\nstrings$1[playerStringNames.txtOpenLinkHeader] = 'Este vÃdeo gostaria de direcionar você a:';\nstrings$1[playerStringNames.txtOpenLinkSubHeader] = '';\nstrings$1[playerStringNames.txtReview] = 'Repetir última seção';\nstrings$1[playerStringNames.txtReplayVideo] = 'Repetir vÃdeo';\nstrings$1[playerStringNames.txtAnswerQuestion] = 'Fazer o teste agora';\nstrings$1[playerStringNames.txtPrev] = 'Anterior';\nstrings$1[playerStringNames.txtNext] = 'Próximo';\nstrings$1[playerStringNames.txtHideQuiz] = 'Ocultar';\nstrings$1[playerStringNames.txtSubmit] = 'Enviar respostas';\nstrings$1[playerStringNames.txtSubmittingAnswers] = 'Enviando respostas.';\nstrings$1[playerStringNames.txtContinue] = 'Continuar';\nstrings$1[playerStringNames.txtReviewAnswer] = 'Ver respostas';\nstrings$1[playerStringNames.txtBadImageQuiz] = 'Desculpe, mas o teste solicitado não é compatÃvel com imagens e não pode ser carregado. Entre em contato com o autor deste teste.';\nstrings$1[playerStringNames.txtVideoQuizNetworkErrorMessage] = 'Desculpe, mas um erro na rede impediu o carregamento do teste. O vÃdeo está disponÃvel para visualização. Para tentar recarregar o teste, atualize a página do navegador ou verifique sua conexão de rede.';\nstrings$1[playerStringNames.txtImageQuizNetworkErrorMessage] = 'Desculpe, um erro na rede impediu o carregamento do teste. A imagem está disponÃvel para visualização. Para tentar recarregar o teste, atualize a página do navegador ou verifique sua conexão de rede.';\nstrings$1[playerStringNames.txtQuizErrorMessage] = 'Estamos tentando salvar sua resposta. Certifique-se de que você tenha uma conexão de internet ativa.';\nstrings$1[playerStringNames.txtQuizOutOfDateMessage] = 'As perguntas do teste foram alteradas. Atualize o player para acessar o teste mais recente.';\nstrings$1[playerStringNames.txtQuizBadDefinitionMessage] = 'Teste inválido. Não é possÃvel enviar o feedback do teste. Indique <a href=\"https://www.techsmith.com/redirect.asp?target=bad_quiz_definition&ver=5.*.*&lang=enu&os=na&product=smartplayer\" target=\"_blank\">este artigo de ajuda</a> ao autor do vÃdeo.';\nstrings$1[playerStringNames.txtQuizOutOfDateRefreshButtonText] = 'Atualizar o player';\nstrings$1[playerStringNames.txtLoaderMessageDefinition] = 'O teste está carregando.';\nstrings$1[playerStringNames.txtQuestionCount] = 'Pergunta {{currentQuestion}} de {{totalQuestions}}';\nstrings$1[playerStringNames.txtResults] = 'Resultados: ';\nstrings$1[playerStringNames.txtCorrectString] = 'Correto';\nstrings$1[playerStringNames.txtIncorrectString] = 'Incorreto';\nstrings$1[playerStringNames.txtCorrect] = '{{numberCorrect}} Correto';\nstrings$1[playerStringNames.txtIncorrect] = '{{numberIncorrect}} Incorreto';\nstrings$1[playerStringNames.txtYourAnswer] = 'Sua resposta: ';\nstrings$1[playerStringNames.txtCorrectAnswer] = 'Resposta correta: ';\nstrings$1[playerStringNames.txtVisitSite] = 'Visitar site';\nstrings$1[playerStringNames.accessBtnAudioDescription] = 'Descrição do áudio';\nstrings$1[playerStringNames.accessBtnClearSearch] = 'Limpar pesquisa';\nstrings$1[playerStringNames.accessBtnRewind] = 'Retroceder {{duration}} segundos';\nstrings$1[playerStringNames.accessBtnForward] = 'Avançar {{duration}} segundos';\nstrings$1[playerStringNames.accessBtnPlay] = 'Reproduzir vÃdeo';\nstrings$1[playerStringNames.accessBtnPrevious] = 'Anterior';\nstrings$1[playerStringNames.accessBtnNext] = 'Próximo';\nstrings$1[playerStringNames.accessBtnProgressBar] = 'Barra deslizante de andamento';\nstrings$1[playerStringNames.accessBtnVolume] = 'Mudo';\nstrings$1[playerStringNames.accessTxtVolume] = 'Volume';\nstrings$1[playerStringNames.accessBtnClosedCaption] = 'Closed Caption';\nstrings$1[playerStringNames.accessBtnTableOfContents] = 'Mostrar CapÃtulos (T)';\nstrings$1[playerStringNames.accessBtnSettings] = 'Configurações do player';\nstrings$1[playerStringNames.accessBtnPip] = 'Picture-in-Picture';\nstrings$1[playerStringNames.accessBtnFullScreen] = 'Tela cheia';\nstrings$1[playerStringNames.accessBtnFullScreenExpand] = 'Abrir em uma nova guia';\nstrings$1[playerStringNames.accessBtnTakeQuiz] = 'Clique para fazer o teste.';\nstrings$1[playerStringNames.accessBtnShowQuiz] = 'Mostrar teste';\nstrings$1[playerStringNames.accessBtnHideQuiz] = 'Ocultar teste';\nstrings$1[playerStringNames.accessBtnPreviousQuestion] = 'Pergunta anterior';\nstrings$1[playerStringNames.accessBtnNextQuestion] = 'Próxima pergunta';\nstrings$1[playerStringNames.accessQuizHidden] = 'O teste foi ocultado';\nstrings$1[playerStringNames.accessQuizShown] = 'O teste está sendo exibido';\nstrings$1[playerStringNames.accessBtnShowAnswer] = 'Mostrar respostas';\nstrings$1[playerStringNames.accessBtnHideAnswer] = 'Ocultar respostas';\nstrings$1[playerStringNames.accessBtnAnswersSubmitted] = 'Respostas enviadas!';\nstrings$1[playerStringNames.accessBtnWereNotGraded] = ' não foram avaliadas.';\nstrings$1[playerStringNames.accessBtnWasNotGraded] = ' não foi avaliada.';\nstrings$1[playerStringNames.accessBtnCorrectOutOf] = ' correta(s) de ';\nstrings$1[playerStringNames.accessBtnGradedQuestions] = ' perguntas avaliadas.';\nstrings$1[playerStringNames.accessBtnClickToReplayLink] = 'Repetir';\nstrings$1[playerStringNames.accessResultsLabelCorrectSuffix] = 'está correta.';\nstrings$1[playerStringNames.accessResultsLabelIncorrectSuffix] = 'está incorreta.';\nstrings$1[playerStringNames.accessResultsLabelNoResponseSuffix] = 'você não respondeu a pergunta.';\nstrings$1[playerStringNames.accessResultsLabelNoResponseGradedSuffix] = 'você não respondeu a pergunta e sua resposta será considerada incorreta.';\nstrings$1[playerStringNames.scormApiNotFoundMessage] = 'Não é possÃvel localizar a implementação da API do LMS.\\nA comunicação com o LMS não ocorrerá.';\nstrings$1[playerStringNames.accessListTableOfContents] = 'CapÃtulos';\nstrings$1[playerStringNames.accessListSearchResults] = 'Resultados da pesquisa na ordem em que aparecem';\nstrings$1[playerStringNames.accessListNoSearchResults] = 'Nenhum resultado encontrado';\nstrings$1[playerStringNames.accessQuestionSetConfirmationTitle] = 'Teste';\nstrings$1[playerStringNames.accessVideoPausedForQuiz] = 'VÃdeo pausado para teste';\nstrings$1[playerStringNames.accessQuizResults] = 'Resultados do teste';\nstrings$1[playerStringNames.accessQuestionFeedbackContext] = 'Resultado do teste: ';\nstrings$1[playerStringNames.accessProgressBarTimeConjunction] = ' de ';\nstrings$1[playerStringNames.accessPlayerSettingsClose] = 'Fechar configurações do player';\nstrings$1[playerStringNames.accessBtnTheaterMode] = 'Modo Cinema';\nstrings$1[playerStringNames.accessBtnExitTheaterMode] = 'Modo Padrão';\nstrings$1[playerStringNames.confirmOpenUrlModalScreenReaderAlertText] = 'O vÃdeo gostaria de abrir o seguinte URL URL_TOKEN.';\nstrings$1[playerStringNames.confirmOpenUrlConfirmButtonScreenReaderText] = 'Continuar para novo site';\nstrings$1[playerStringNames.fastForwardDisabledScreenReaderText] = 'A função de avanço rápido foi desativada para este vÃdeo';\nstrings$1[playerStringNames.scormCompleteVideoLater] = 'Concluir o vÃdeo mais tarde';\nstrings$1[playerStringNames.scormCompleteVideo] = 'Concluir o vÃdeo';\nstrings$1[playerStringNames.scormExitVideo] = 'Sair do vÃdeo';\nstrings$1[playerStringNames.scormConfirmCompleteModalText] = 'Tem certeza de que deseja sair do vÃdeo?';\nstrings$1[playerStringNames.scormConfirmCompleteModalResumeVideoText] = 'O vÃdeo será retomado de onde você parou na próxima vez que ele for aberto.';\nstrings$1[playerStringNames.scormConfirmCompleteModalRestartVideoText] = 'O vÃdeo será reiniciado do começo na próxima vez. Você perderá o andamento atual.';\nstrings$1[playerStringNames.scormConfirmCompleteModalFailedToSaveProgressText] = 'Houve um problema ao salvar seu progresso. O vÃdeo começará do inÃcio na próxima vez que você assisti-lo.';\nstrings$1[playerStringNames.scormConfirmCompleteModalDismissButtonText] = 'Retornar ao vÃdeo';\nstrings$1[playerStringNames.scormConfirmCompleteModalDismissButtonScreenReaderText] = 'Retornar ao vÃdeo';\nstrings$1[playerStringNames.scormConfirmCompleteModalConfirmButtonText] = 'Sair do vÃdeo';\nstrings$1[playerStringNames.scormConfirmCompleteModalConfirmButtonScreenReaderText] = 'Sair do vÃdeo';\nstrings$1[playerStringNames.scormSessionEndedText] = 'Você pode fechar a guia ou voltar para o seu curso.';\nstrings$1[playerStringNames.searchOrJumpTo] = 'Pesquisar ou pular para.';\nstrings$1[playerStringNames.searchTextCleared] = 'Texto de pesquisa apagado.';\nstrings$1[playerStringNames.searchResultsUpdated] = 'Resultados da pesquisa atualizados. {{number}} resultados.';\nstrings$1[playerStringNames.tableOfContentsDisplayed] = 'CapÃtulos exibidos.';\nstrings$1[playerStringNames.tableOfContentsHidden] = 'CapÃtulos ocultos.';\nstrings$1[playerStringNames.defaultMediaTitle] = 'TechSmith Smart Player';\nstrings$1[playerStringNames.hideThumbnailDueToQuiz] = 'Faça o teste para visualizar';\nstrings$1[playerStringNames.quizAtTimeHeading] = 'Teste à s';\nstrings$1[playerStringNames.defaultFirstChapterName] = 'introdução';\nstrings$1[playerStringNames.acknowledgementLinkName] = 'Créditos';\nvar getLanguage$1 = function getLanguage() {\n return languageCodes.PORTUGUESE;\n};\nvar getReadableTimeByLocale$1 = function getReadableTimeByLocale(hours, minutes, seconds) {\n var timeStringList = [];\n if (hours > 0) {\n var hoursReadableString = hours + ' hora';\n hoursReadableString += hours > 1 ? 's' : '';\n timeStringList.push(hoursReadableString);\n }\n if (minutes > 0) {\n var minutesReadableString = minutes + ' minuto';\n minutesReadableString += minutes > 1 ? 's' : '';\n timeStringList.push(minutesReadableString);\n }\n if (seconds > 0) {\n var secondsReadableString = seconds + ' segundo';\n secondsReadableString += seconds > 1 ? 's' : '';\n timeStringList.push(secondsReadableString);\n }\n return timeStringList.join(' e ');\n};\nvar ptBrLocale = Object.defineProperties({\n getReadableTimeByLocale: getReadableTimeByLocale$1\n}, {\n language: {\n get: getLanguage$1\n },\n strings: {\n get: function get() {\n return strings$1;\n }\n }\n});\n\nvar getLocaleByLanguageCode = function getLocaleByLanguageCode(languageCode) {\n switch (languageCode) {\n case languageCodes.ENGLISH:\n return enUsLocale;\n case languageCodes.GERMAN:\n return deDeLocale;\n case languageCodes.JAPANESE:\n return jaJpLocale;\n case languageCodes.FRENCH:\n return frFrLocale;\n case languageCodes.SPANISH:\n return esEsLocale;\n case languageCodes.CHINESE:\n return zhCnLocale;\n case languageCodes.PORTUGUESE:\n return ptBrLocale;\n default:\n return enUsLocale;\n }\n};\nvar localeFactory = Object.defineProperties({\n getLocaleByLanguageCode: getLocaleByLanguageCode\n}, {});\n\nvar strings = {};\nvar setString = function setString(stringKey, value) {\n if (!playerStringNames[stringKey]) {\n throw new Error('Player string not found');\n }\n strings[playerStringNames[stringKey]] = value;\n};\nvar clearStrings = function clearStrings() {\n strings = {};\n};\nvar customStrings = Object.defineProperties({\n setString: setString,\n clearStrings: clearStrings\n}, {\n strings: {\n get: function get() {\n return strings;\n }\n }\n});\n\nvar CURRENT_QUESTION_TOKEN = '{{currentQuestion}}';\nvar TOTAL_QUESTIONS_TOKEN = '{{totalQuestions}}';\nvar _language = null;\nvar _currentLocale = null;\nvar setLanguage = function setLanguage(language) {\n if (languageCodes.isValid(language)) {\n _language = language;\n _currentLocale = localeFactory.getLocaleByLanguageCode(_language);\n }\n};\nvar getLanguage = function getLanguage() {\n return _language;\n};\nvar getPlayerString = function getPlayerString(stringName) {\n if (customStrings.strings[stringName]) {\n return customStrings.strings[stringName];\n } else if (_currentLocale.strings[stringName]) {\n return _currentLocale.strings[stringName];\n }\n return '';\n};\nvar getLanguageNameFromIdentifierString = function getLanguageNameFromIdentifierString(languageIdentifierString) {\n var languageIdentifier = LanguageIdentifier$1.create(languageIdentifierString);\n return languageIdentifiers.identifiers[languageIdentifier.language] ? languageIdentifiers.identifiers[languageIdentifier.language].displayName : languageIdentifierString;\n};\nvar getQuestionCountString = function getQuestionCountString(currentQuestionNumber, totalNumberQuestions) {\n var questionCountString = getPlayerString(playerStringNames.txtQuestionCount);\n questionCountString = questionCountString.replace(CURRENT_QUESTION_TOKEN, currentQuestionNumber);\n return questionCountString.replace(TOTAL_QUESTIONS_TOKEN, totalNumberQuestions);\n};\nvar configureLanguageFromXmp = function configureLanguageFromXmp(xmp) {\n xmp.controllerParameters.forEach(function (controllerParameter) {\n if (controllerParameter.name.toLowerCase() === 'locale') {\n setLanguage(controllerParameter.value);\n }\n });\n};\nvar configureCustomStringsFromXmp = function configureCustomStringsFromXmp(xmp) {\n xmp.quizParameters.forEach(function (quizParameter) {\n try {\n customStrings.setString(quizParameter.name, quizParameter.value);\n } catch (e) {\n log.logMessage(e.message);\n }\n });\n};\nvar configureFromXmp$1 = function configureFromXmp(xmp) {\n configureLanguageFromXmp(xmp); //Configure language first so that _language is properly set\n configureCustomStringsFromXmp(xmp);\n};\nvar getReadableTimeByLocale = function getReadableTimeByLocale(hours, minutes, seconds) {\n return _currentLocale.getReadableTimeByLocale(hours, minutes, seconds);\n};\nvar reset$1 = function reset() {\n customStrings.clearStrings();\n setLanguage(languageCodes.ENGLISH);\n};\nsetLanguage(languageCodes.ENGLISH);\nvar localizationStrings = Object.defineProperties({\n setLanguage: setLanguage,\n getLanguage: getLanguage,\n getLanguageNameFromIdentifierString: getLanguageNameFromIdentifierString,\n configureFromXmp: configureFromXmp$1,\n getReadableTimeByLocale: getReadableTimeByLocale,\n getPlayerString: getPlayerString,\n getQuestionCountString: getQuestionCountString,\n reset: reset$1\n}, {});\n\nvar mediaMimeType = Object.freeze({\n JSON: 'application/json',\n M3U: 'application/mpegurl',\n MP4: 'video/mp4',\n WEBM: 'video/webm',\n OGV: 'video/ogg',\n JPEG: 'image/jpeg',\n PNG: 'image/png',\n GIF: 'image/gif',\n UNKNOWN: ''\n});\n\nvar jquery = {exports: {}};\n\n(function (module) {\n (function (global, factory) {\n\n {\n // For CommonJS and CommonJS-like environments where a proper `window`\n // is present, execute the factory and get jQuery.\n // For environments that do not have a `window` with a `document`\n // (such as Node.js), expose a factory as module.exports.\n // This accentuates the need for the creation of a real `window`.\n // e.g. var jQuery = require(\"jquery\")(window);\n // See ticket trac-14549 for more info.\n module.exports = global.document ? factory(global, true) : function (w) {\n if (!w.document) {\n throw new Error(\"jQuery requires a window with a document\");\n }\n return factory(w);\n };\n }\n\n // Pass this if window is not defined yet\n })(typeof window !== \"undefined\" ? window : commonjsGlobal, function (window, noGlobal) {\n\n var arr = [];\n var getProto = Object.getPrototypeOf;\n var _slice = arr.slice;\n var flat = arr.flat ? function (array) {\n return arr.flat.call(array);\n } : function (array) {\n return arr.concat.apply([], array);\n };\n var push = arr.push;\n var indexOf = arr.indexOf;\n var class2type = {};\n var toString = class2type.toString;\n var hasOwn = class2type.hasOwnProperty;\n var fnToString = hasOwn.toString;\n var ObjectFunctionString = fnToString.call(Object);\n var support = {};\n var isFunction = function isFunction(obj) {\n // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML <object> elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n // Plus for old WebKit, typeof returns \"function\" for HTML collections\n // (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\" && typeof obj.item !== \"function\";\n };\n var isWindow = function isWindow(obj) {\n return obj != null && obj === obj.window;\n };\n var document = window.document;\n var preservedScriptAttributes = {\n type: true,\n src: true,\n nonce: true,\n noModule: true\n };\n function DOMEval(code, node, doc) {\n doc = doc || document;\n var i,\n val,\n script = doc.createElement(\"script\");\n script.text = code;\n if (node) {\n for (i in preservedScriptAttributes) {\n // Support: Firefox 64+, Edge 18+\n // Some browsers don't support the \"nonce\" property on scripts.\n // On the other hand, just using `getAttribute` is not enough as\n // the `nonce` attribute is reset to an empty string whenever it\n // becomes browsing-context connected.\n // See https://github.com/whatwg/html/issues/2369\n // See https://html.spec.whatwg.org/#nonce-attributes\n // The `node.getAttribute` check was added for the sake of\n // `jQuery.globalEval` so that it can fake a nonce-containing node\n // via an object.\n val = node[i] || node.getAttribute && node.getAttribute(i);\n if (val) {\n script.setAttribute(i, val);\n }\n }\n }\n doc.head.appendChild(script).parentNode.removeChild(script);\n }\n function toType(obj) {\n if (obj == null) {\n return obj + \"\";\n }\n\n // Support: Android <=2.3 only (functionish RegExp)\n return _typeof$1(obj) === \"object\" || typeof obj === \"function\" ? class2type[toString.call(obj)] || \"object\" : _typeof$1(obj);\n }\n /* global Symbol */\n // Defining this global in .eslintrc.json would create a danger of using the global\n // unguarded in another place, it seems safer to define global only for this module\n\n var version = \"3.7.1\",\n rhtmlSuffix = /HTML$/i,\n // Define a local copy of jQuery\n jQuery = function jQuery(selector, context) {\n // The jQuery object is actually just the init constructor 'enhanced'\n // Need init if jQuery is called (just allow error to be thrown if not included)\n return new jQuery.fn.init(selector, context);\n };\n jQuery.fn = jQuery.prototype = {\n // The current version of jQuery being used\n jquery: version,\n constructor: jQuery,\n // The default length of a jQuery object is 0\n length: 0,\n toArray: function toArray() {\n return _slice.call(this);\n },\n // Get the Nth element in the matched element set OR\n // Get the whole matched element set as a clean array\n get: function get(num) {\n // Return all the elements in a clean array\n if (num == null) {\n return _slice.call(this);\n }\n\n // Return just the one element from the set\n return num < 0 ? this[num + this.length] : this[num];\n },\n // Take an array of elements and push it onto the stack\n // (returning the new matched element set)\n pushStack: function pushStack(elems) {\n // Build a new jQuery matched element set\n var ret = jQuery.merge(this.constructor(), elems);\n\n // Add the old object onto the stack (as a reference)\n ret.prevObject = this;\n\n // Return the newly-formed element set\n return ret;\n },\n // Execute a callback for every element in the matched set.\n each: function each(callback) {\n return jQuery.each(this, callback);\n },\n map: function map(callback) {\n return this.pushStack(jQuery.map(this, function (elem, i) {\n return callback.call(elem, i, elem);\n }));\n },\n slice: function slice() {\n return this.pushStack(_slice.apply(this, arguments));\n },\n first: function first() {\n return this.eq(0);\n },\n last: function last() {\n return this.eq(-1);\n },\n even: function even() {\n return this.pushStack(jQuery.grep(this, function (_elem, i) {\n return (i + 1) % 2;\n }));\n },\n odd: function odd() {\n return this.pushStack(jQuery.grep(this, function (_elem, i) {\n return i % 2;\n }));\n },\n eq: function eq(i) {\n var len = this.length,\n j = +i + (i < 0 ? len : 0);\n return this.pushStack(j >= 0 && j < len ? [this[j]] : []);\n },\n end: function end() {\n return this.prevObject || this.constructor();\n },\n // For internal use only.\n // Behaves like an Array's method, not like a jQuery method.\n push: push,\n sort: arr.sort,\n splice: arr.splice\n };\n jQuery.extend = jQuery.fn.extend = function () {\n var options,\n name,\n src,\n copy,\n copyIsArray,\n clone,\n target = arguments[0] || {},\n i = 1,\n length = arguments.length,\n deep = false;\n\n // Handle a deep copy situation\n if (typeof target === \"boolean\") {\n deep = target;\n\n // Skip the boolean and the target\n target = arguments[i] || {};\n i++;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if (_typeof$1(target) !== \"object\" && !isFunction(target)) {\n target = {};\n }\n\n // Extend jQuery itself if only one argument is passed\n if (i === length) {\n target = this;\n i--;\n }\n for (; i < length; i++) {\n // Only deal with non-null/undefined values\n if ((options = arguments[i]) != null) {\n // Extend the base object\n for (name in options) {\n copy = options[name];\n\n // Prevent Object.prototype pollution\n // Prevent never-ending loop\n if (name === \"__proto__\" || target === copy) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {\n src = target[name];\n\n // Ensure proper type for the source value\n if (copyIsArray && !Array.isArray(src)) {\n clone = [];\n } else if (!copyIsArray && !jQuery.isPlainObject(src)) {\n clone = {};\n } else {\n clone = src;\n }\n copyIsArray = false;\n\n // Never move original objects, clone them\n target[name] = jQuery.extend(deep, clone, copy);\n\n // Don't bring in undefined values\n } else if (copy !== undefined) {\n target[name] = copy;\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n };\n jQuery.extend({\n // Unique for each copy of jQuery on the page\n expando: \"jQuery\" + (version + Math.random()).replace(/\\D/g, \"\"),\n // Assume jQuery is ready without the ready module\n isReady: true,\n error: function error(msg) {\n throw new Error(msg);\n },\n noop: function noop() {},\n isPlainObject: function isPlainObject(obj) {\n var proto, Ctor;\n\n // Detect obvious negatives\n // Use toString instead of jQuery.type to catch host objects\n if (!obj || toString.call(obj) !== \"[object Object]\") {\n return false;\n }\n proto = getProto(obj);\n\n // Objects with no prototype (e.g., `Object.create( null )`) are plain\n if (!proto) {\n return true;\n }\n\n // Objects with prototype are plain iff they were constructed by a global Object function\n Ctor = hasOwn.call(proto, \"constructor\") && proto.constructor;\n return typeof Ctor === \"function\" && fnToString.call(Ctor) === ObjectFunctionString;\n },\n isEmptyObject: function isEmptyObject(obj) {\n var name;\n for (name in obj) {\n return false;\n }\n return true;\n },\n // Evaluates a script in a provided context; falls back to the global one\n // if not specified.\n globalEval: function globalEval(code, options, doc) {\n DOMEval(code, {\n nonce: options && options.nonce\n }, doc);\n },\n each: function each(obj, callback) {\n var length,\n i = 0;\n if (isArrayLike(obj)) {\n length = obj.length;\n for (; i < length; i++) {\n if (callback.call(obj[i], i, obj[i]) === false) {\n break;\n }\n }\n } else {\n for (i in obj) {\n if (callback.call(obj[i], i, obj[i]) === false) {\n break;\n }\n }\n }\n return obj;\n },\n // Retrieve the text value of an array of DOM nodes\n text: function text(elem) {\n var node,\n ret = \"\",\n i = 0,\n nodeType = elem.nodeType;\n if (!nodeType) {\n // If no nodeType, this is expected to be an array\n while (node = elem[i++]) {\n // Do not traverse comment nodes\n ret += jQuery.text(node);\n }\n }\n if (nodeType === 1 || nodeType === 11) {\n return elem.textContent;\n }\n if (nodeType === 9) {\n return elem.documentElement.textContent;\n }\n if (nodeType === 3 || nodeType === 4) {\n return elem.nodeValue;\n }\n\n // Do not include comment or processing instruction nodes\n\n return ret;\n },\n // results is for internal usage only\n makeArray: function makeArray(arr, results) {\n var ret = results || [];\n if (arr != null) {\n if (isArrayLike(Object(arr))) {\n jQuery.merge(ret, typeof arr === \"string\" ? [arr] : arr);\n } else {\n push.call(ret, arr);\n }\n }\n return ret;\n },\n inArray: function inArray(elem, arr, i) {\n return arr == null ? -1 : indexOf.call(arr, elem, i);\n },\n isXMLDoc: function isXMLDoc(elem) {\n var namespace = elem && elem.namespaceURI,\n docElem = elem && (elem.ownerDocument || elem).documentElement;\n\n // Assume HTML when documentElement doesn't yet exist, such as inside\n // document fragments.\n return !rhtmlSuffix.test(namespace || docElem && docElem.nodeName || \"HTML\");\n },\n // Support: Android <=4.0 only, PhantomJS 1 only\n // push.apply(_, arraylike) throws on ancient WebKit\n merge: function merge(first, second) {\n var len = +second.length,\n j = 0,\n i = first.length;\n for (; j < len; j++) {\n first[i++] = second[j];\n }\n first.length = i;\n return first;\n },\n grep: function grep(elems, callback, invert) {\n var callbackInverse,\n matches = [],\n i = 0,\n length = elems.length,\n callbackExpect = !invert;\n\n // Go through the array, only saving the items\n // that pass the validator function\n for (; i < length; i++) {\n callbackInverse = !callback(elems[i], i);\n if (callbackInverse !== callbackExpect) {\n matches.push(elems[i]);\n }\n }\n return matches;\n },\n // arg is for internal usage only\n map: function map(elems, callback, arg) {\n var length,\n value,\n i = 0,\n ret = [];\n\n // Go through the array, translating each of the items to their new values\n if (isArrayLike(elems)) {\n length = elems.length;\n for (; i < length; i++) {\n value = callback(elems[i], i, arg);\n if (value != null) {\n ret.push(value);\n }\n }\n\n // Go through every key on the object,\n } else {\n for (i in elems) {\n value = callback(elems[i], i, arg);\n if (value != null) {\n ret.push(value);\n }\n }\n }\n\n // Flatten any nested arrays\n return flat(ret);\n },\n // A global GUID counter for objects\n guid: 1,\n // jQuery.support is not used in Core but other projects attach their\n // properties to it so it needs to exist.\n support: support\n });\n if (typeof Symbol === \"function\") {\n jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];\n }\n\n // Populate the class2type map\n jQuery.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"), function (_i, name) {\n class2type[\"[object \" + name + \"]\"] = name.toLowerCase();\n });\n function isArrayLike(obj) {\n // Support: real iOS 8.2 only (not reproducible in simulator)\n // `in` check used to prevent JIT error (gh-2145)\n // hasOwn isn't used here due to false negatives\n // regarding Nodelist length in IE\n var length = !!obj && \"length\" in obj && obj.length,\n type = toType(obj);\n if (isFunction(obj) || isWindow(obj)) {\n return false;\n }\n return type === \"array\" || length === 0 || typeof length === \"number\" && length > 0 && length - 1 in obj;\n }\n function nodeName(elem, name) {\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n }\n var pop = arr.pop;\n var sort = arr.sort;\n var splice = arr.splice;\n var whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n var rtrimCSS = new RegExp(\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\");\n\n // Note: an element does not contain itself\n jQuery.contains = function (a, b) {\n var bup = b && b.parentNode;\n return a === bup || !!(bup && bup.nodeType === 1 && (\n // Support: IE 9 - 11+\n // IE doesn't have `contains` on SVG.\n a.contains ? a.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));\n };\n\n // CSS string/identifier serialization\n // https://drafts.csswg.org/cssom/#common-serializing-idioms\n var rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n function fcssescape(ch, asCodePoint) {\n if (asCodePoint) {\n // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n if (ch === \"\\0\") {\n return \"\\uFFFD\";\n }\n\n // Control characters and (dependent upon position) numbers get escaped as code points\n return ch.slice(0, -1) + \"\\\\\" + ch.charCodeAt(ch.length - 1).toString(16) + \" \";\n }\n\n // Other potentially-special ASCII characters get backslash-escaped\n return \"\\\\\" + ch;\n }\n jQuery.escapeSelector = function (sel) {\n return (sel + \"\").replace(rcssescape, fcssescape);\n };\n var preferredDoc = document,\n pushNative = push;\n (function () {\n var i,\n Expr,\n outermostContext,\n sortInput,\n hasDuplicate,\n push = pushNative,\n // Local document vars\n document,\n documentElement,\n documentIsHTML,\n rbuggyQSA,\n matches,\n // Instance-specific data\n expando = jQuery.expando,\n dirruns = 0,\n done = 0,\n classCache = createCache(),\n tokenCache = createCache(),\n compilerCache = createCache(),\n nonnativeSelectorCache = createCache(),\n sortOrder = function sortOrder(a, b) {\n if (a === b) {\n hasDuplicate = true;\n }\n return 0;\n },\n booleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|\" + \"loop|multiple|open|readonly|required|scoped\",\n // Regular expressions\n\n // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n identifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors\n attributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n // Operator (capture 2)\n \"*([*^$|!~]?=)\" + whitespace +\n // \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n \"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace + \"*\\\\]\",\n pseudos = \":(\" + identifier + \")(?:\\\\((\" +\n // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n // 1. quoted (capture 3; capture 4 or capture 5)\n \"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n // 2. simple (capture 6)\n \"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n // 3. anything else (capture 2)\n \".*\" + \")\\\\)|)\",\n // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n rwhitespace = new RegExp(whitespace + \"+\", \"g\"),\n rcomma = new RegExp(\"^\" + whitespace + \"*,\" + whitespace + \"*\"),\n rleadingCombinator = new RegExp(\"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\"),\n rdescend = new RegExp(whitespace + \"|>\"),\n rpseudo = new RegExp(pseudos),\n ridentifier = new RegExp(\"^\" + identifier + \"$\"),\n matchExpr = {\n ID: new RegExp(\"^#(\" + identifier + \")\"),\n CLASS: new RegExp(\"^\\\\.(\" + identifier + \")\"),\n TAG: new RegExp(\"^(\" + identifier + \"|[*])\"),\n ATTR: new RegExp(\"^\" + attributes),\n PSEUDO: new RegExp(\"^\" + pseudos),\n CHILD: new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\"),\n bool: new RegExp(\"^(?:\" + booleans + \")$\", \"i\"),\n // For use in libraries implementing .is()\n // We use this for POS matching in `select`\n needsContext: new RegExp(\"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\")\n },\n rinputs = /^(?:input|select|textarea|button)$/i,\n rheader = /^h\\d$/i,\n // Easily-parseable/retrievable ID or TAG or CLASS selectors\n rquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n rsibling = /[+~]/,\n // CSS escapes\n // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n runescape = new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\"),\n funescape = function funescape(escape, nonHex) {\n var high = \"0x\" + escape.slice(1) - 0x10000;\n if (nonHex) {\n // Strip the backslash prefix from a non-hex escape sequence\n return nonHex;\n }\n\n // Replace a hexadecimal escape sequence with the encoded Unicode code point\n // Support: IE <=11+\n // For values outside the Basic Multilingual Plane (BMP), manually construct a\n // surrogate pair\n return high < 0 ? String.fromCharCode(high + 0x10000) : String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);\n },\n // Used for iframes; see `setDocument`.\n // Support: IE 9 - 11+, Edge 12 - 18+\n // Removing the function wrapper causes a \"Permission Denied\"\n // error in IE/Edge.\n unloadHandler = function unloadHandler() {\n setDocument();\n },\n inDisabledFieldset = addCombinator(function (elem) {\n return elem.disabled === true && nodeName(elem, \"fieldset\");\n }, {\n dir: \"parentNode\",\n next: \"legend\"\n });\n\n // Support: IE <=9 only\n // Accessing document.activeElement can throw unexpectedly\n // https://bugs.jquery.com/ticket/13393\n function safeActiveElement() {\n try {\n return document.activeElement;\n } catch (err) {}\n }\n\n // Optimize for push.apply( _, NodeList )\n try {\n push.apply(arr = _slice.call(preferredDoc.childNodes), preferredDoc.childNodes);\n\n // Support: Android <=4.0\n // Detect silently failing push.apply\n // eslint-disable-next-line no-unused-expressions\n arr[preferredDoc.childNodes.length].nodeType;\n } catch (e) {\n push = {\n apply: function apply(target, els) {\n pushNative.apply(target, _slice.call(els));\n },\n call: function call(target) {\n pushNative.apply(target, _slice.call(arguments, 1));\n }\n };\n }\n function find(selector, context, results, seed) {\n var m,\n i,\n elem,\n nid,\n match,\n groups,\n newSelector,\n newContext = context && context.ownerDocument,\n // nodeType defaults to 9, since context defaults to document\n nodeType = context ? context.nodeType : 9;\n results = results || [];\n\n // Return early from calls with invalid selector or context\n if (typeof selector !== \"string\" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {\n return results;\n }\n\n // Try to shortcut find operations (as opposed to filters) in HTML documents\n if (!seed) {\n setDocument(context);\n context = context || document;\n if (documentIsHTML) {\n // If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n // (excepting DocumentFragment context, where the methods don't exist)\n if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {\n // ID selector\n if (m = match[1]) {\n // Document context\n if (nodeType === 9) {\n if (elem = context.getElementById(m)) {\n // Support: IE 9 only\n // getElementById can match elements by name instead of ID\n if (elem.id === m) {\n push.call(results, elem);\n return results;\n }\n } else {\n return results;\n }\n\n // Element context\n } else {\n // Support: IE 9 only\n // getElementById can match elements by name instead of ID\n if (newContext && (elem = newContext.getElementById(m)) && find.contains(context, elem) && elem.id === m) {\n push.call(results, elem);\n return results;\n }\n }\n\n // Type selector\n } else if (match[2]) {\n push.apply(results, context.getElementsByTagName(selector));\n return results;\n\n // Class selector\n } else if ((m = match[3]) && context.getElementsByClassName) {\n push.apply(results, context.getElementsByClassName(m));\n return results;\n }\n }\n\n // Take advantage of querySelectorAll\n if (!nonnativeSelectorCache[selector + \" \"] && (!rbuggyQSA || !rbuggyQSA.test(selector))) {\n newSelector = selector;\n newContext = context;\n\n // qSA considers elements outside a scoping root when evaluating child or\n // descendant combinators, which is not what we want.\n // In such cases, we work around the behavior by prefixing every selector in the\n // list with an ID selector referencing the scope context.\n // The technique has to be used as well when a leading combinator is used\n // as such selectors are not recognized by querySelectorAll.\n // Thanks to Andrew Dupont for this technique.\n if (nodeType === 1 && (rdescend.test(selector) || rleadingCombinator.test(selector))) {\n // Expand context for sibling selectors\n newContext = rsibling.test(selector) && testContext(context.parentNode) || context;\n\n // We can use :scope instead of the ID hack if the browser\n // supports it & if we're not changing the context.\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when\n // strict-comparing two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n if (newContext != context || !support.scope) {\n // Capture the context ID, setting it first if necessary\n if (nid = context.getAttribute(\"id\")) {\n nid = jQuery.escapeSelector(nid);\n } else {\n context.setAttribute(\"id\", nid = expando);\n }\n }\n\n // Prefix every selector in the list\n groups = tokenize(selector);\n i = groups.length;\n while (i--) {\n groups[i] = (nid ? \"#\" + nid : \":scope\") + \" \" + toSelector(groups[i]);\n }\n newSelector = groups.join(\",\");\n }\n try {\n push.apply(results, newContext.querySelectorAll(newSelector));\n return results;\n } catch (qsaError) {\n nonnativeSelectorCache(selector, true);\n } finally {\n if (nid === expando) {\n context.removeAttribute(\"id\");\n }\n }\n }\n }\n }\n\n // All others\n return select(selector.replace(rtrimCSS, \"$1\"), context, results, seed);\n }\n\n /**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\n function createCache() {\n var keys = [];\n function cache(key, value) {\n // Use (key + \" \") to avoid collision with native prototype properties\n // (see https://github.com/jquery/sizzle/issues/157)\n if (keys.push(key + \" \") > Expr.cacheLength) {\n // Only keep the most recent entries\n delete cache[keys.shift()];\n }\n return cache[key + \" \"] = value;\n }\n return cache;\n }\n\n /**\n * Mark a function for special use by jQuery selector module\n * @param {Function} fn The function to mark\n */\n function markFunction(fn) {\n fn[expando] = true;\n return fn;\n }\n\n /**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\n function assert(fn) {\n var el = document.createElement(\"fieldset\");\n try {\n return !!fn(el);\n } catch (e) {\n return false;\n } finally {\n // Remove from its parent by default\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n }\n\n // release memory in IE\n el = null;\n }\n }\n\n /**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\n function createInputPseudo(type) {\n return function (elem) {\n return nodeName(elem, \"input\") && elem.type === type;\n };\n }\n\n /**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\n function createButtonPseudo(type) {\n return function (elem) {\n return (nodeName(elem, \"input\") || nodeName(elem, \"button\")) && elem.type === type;\n };\n }\n\n /**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\n function createDisabledPseudo(disabled) {\n // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n return function (elem) {\n // Only certain elements can match :enabled or :disabled\n // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n if (\"form\" in elem) {\n // Check for inherited disabledness on relevant non-disabled elements:\n // * listed form-associated elements in a disabled fieldset\n // https://html.spec.whatwg.org/multipage/forms.html#category-listed\n // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n // * option elements in a disabled optgroup\n // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n // All such elements have a \"form\" property.\n if (elem.parentNode && elem.disabled === false) {\n // Option elements defer to a parent optgroup if present\n if (\"label\" in elem) {\n if (\"label\" in elem.parentNode) {\n return elem.parentNode.disabled === disabled;\n } else {\n return elem.disabled === disabled;\n }\n }\n\n // Support: IE 6 - 11+\n // Use the isDisabled shortcut property to check for disabled fieldset ancestors\n return elem.isDisabled === disabled ||\n // Where there is no isDisabled, check manually\n elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled;\n }\n return elem.disabled === disabled;\n\n // Try to winnow out elements that can't be disabled before trusting the disabled property.\n // Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n // even exist on them, let alone have a boolean value.\n } else if (\"label\" in elem) {\n return elem.disabled === disabled;\n }\n\n // Remaining elements are neither :enabled nor :disabled\n return false;\n };\n }\n\n /**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\n function createPositionalPseudo(fn) {\n return markFunction(function (argument) {\n argument = +argument;\n return markFunction(function (seed, matches) {\n var j,\n matchIndexes = fn([], seed.length, argument),\n i = matchIndexes.length;\n\n // Match elements found at the specified indexes\n while (i--) {\n if (seed[j = matchIndexes[i]]) {\n seed[j] = !(matches[j] = seed[j]);\n }\n }\n });\n });\n }\n\n /**\n * Checks a node for validity as a jQuery selector context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\n function testContext(context) {\n return context && typeof context.getElementsByTagName !== \"undefined\" && context;\n }\n\n /**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [node] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\n function setDocument(node) {\n var subWindow,\n doc = node ? node.ownerDocument || node : preferredDoc;\n\n // Return early if doc is invalid or already selected\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n if (doc == document || doc.nodeType !== 9 || !doc.documentElement) {\n return document;\n }\n\n // Update global variables\n document = doc;\n documentElement = document.documentElement;\n documentIsHTML = !jQuery.isXMLDoc(document);\n\n // Support: iOS 7 only, IE 9 - 11+\n // Older browsers didn't support unprefixed `matches`.\n matches = documentElement.matches || documentElement.webkitMatchesSelector || documentElement.msMatchesSelector;\n\n // Support: IE 9 - 11+, Edge 12 - 18+\n // Accessing iframe documents after unload throws \"permission denied\" errors\n // (see trac-13936).\n // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,\n // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.\n if (documentElement.msMatchesSelector &&\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n preferredDoc != document && (subWindow = document.defaultView) && subWindow.top !== subWindow) {\n // Support: IE 9 - 11+, Edge 12 - 18+\n subWindow.addEventListener(\"unload\", unloadHandler);\n }\n\n // Support: IE <10\n // Check if getElementById returns elements by name\n // The broken getElementById methods don't pick up programmatically-set names,\n // so use a roundabout getElementsByName test\n support.getById = assert(function (el) {\n documentElement.appendChild(el).id = jQuery.expando;\n return !document.getElementsByName || !document.getElementsByName(jQuery.expando).length;\n });\n\n // Support: IE 9 only\n // Check to see if it's possible to do matchesSelector\n // on a disconnected node.\n support.disconnectedMatch = assert(function (el) {\n return matches.call(el, \"*\");\n });\n\n // Support: IE 9 - 11+, Edge 12 - 18+\n // IE/Edge don't support the :scope pseudo-class.\n support.scope = assert(function () {\n return document.querySelectorAll(\":scope\");\n });\n\n // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only\n // Make sure the `:has()` argument is parsed unforgivingly.\n // We include `*` in the test to detect buggy implementations that are\n // _selectively_ forgiving (specifically when the list includes at least\n // one valid selector).\n // Note that we treat complete lack of support for `:has()` as if it were\n // spec-compliant support, which is fine because use of `:has()` in such\n // environments will fail in the qSA path and fall back to jQuery traversal\n // anyway.\n support.cssHas = assert(function () {\n try {\n document.querySelector(\":has(*,:jqfake)\");\n return false;\n } catch (e) {\n return true;\n }\n });\n\n // ID filter and find\n if (support.getById) {\n Expr.filter.ID = function (id) {\n var attrId = id.replace(runescape, funescape);\n return function (elem) {\n return elem.getAttribute(\"id\") === attrId;\n };\n };\n Expr.find.ID = function (id, context) {\n if (typeof context.getElementById !== \"undefined\" && documentIsHTML) {\n var elem = context.getElementById(id);\n return elem ? [elem] : [];\n }\n };\n } else {\n Expr.filter.ID = function (id) {\n var attrId = id.replace(runescape, funescape);\n return function (elem) {\n var node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n return node && node.value === attrId;\n };\n };\n\n // Support: IE 6 - 7 only\n // getElementById is not reliable as a find shortcut\n Expr.find.ID = function (id, context) {\n if (typeof context.getElementById !== \"undefined\" && documentIsHTML) {\n var node,\n i,\n elems,\n elem = context.getElementById(id);\n if (elem) {\n // Verify the id attribute\n node = elem.getAttributeNode(\"id\");\n if (node && node.value === id) {\n return [elem];\n }\n\n // Fall back on getElementsByName\n elems = context.getElementsByName(id);\n i = 0;\n while (elem = elems[i++]) {\n node = elem.getAttributeNode(\"id\");\n if (node && node.value === id) {\n return [elem];\n }\n }\n }\n return [];\n }\n };\n }\n\n // Tag\n Expr.find.TAG = function (tag, context) {\n if (typeof context.getElementsByTagName !== \"undefined\") {\n return context.getElementsByTagName(tag);\n\n // DocumentFragment nodes don't have gEBTN\n } else {\n return context.querySelectorAll(tag);\n }\n };\n\n // Class\n Expr.find.CLASS = function (className, context) {\n if (typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML) {\n return context.getElementsByClassName(className);\n }\n };\n\n /* QSA/matchesSelector\n ---------------------------------------------------------------------- */\n\n // QSA and matchesSelector support\n\n rbuggyQSA = [];\n\n // Build QSA regex\n // Regex strategy adopted from Diego Perini\n assert(function (el) {\n var input;\n documentElement.appendChild(el).innerHTML = \"<a id='\" + expando + \"' href='' disabled='disabled'></a>\" + \"<select id='\" + expando + \"-\\r\\\\' disabled='disabled'>\" + \"<option selected=''></option></select>\";\n\n // Support: iOS <=7 - 8 only\n // Boolean attributes and \"value\" are not treated correctly in some XML documents\n if (!el.querySelectorAll(\"[selected]\").length) {\n rbuggyQSA.push(\"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\");\n }\n\n // Support: iOS <=7 - 8 only\n if (!el.querySelectorAll(\"[id~=\" + expando + \"-]\").length) {\n rbuggyQSA.push(\"~=\");\n }\n\n // Support: iOS 8 only\n // https://bugs.webkit.org/show_bug.cgi?id=136851\n // In-page `selector#id sibling-combinator selector` fails\n if (!el.querySelectorAll(\"a#\" + expando + \"+*\").length) {\n rbuggyQSA.push(\".#.+[+~]\");\n }\n\n // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n // In some of the document kinds, these selectors wouldn't work natively.\n // This is probably OK but for backwards compatibility we want to maintain\n // handling them through jQuery traversal in jQuery 3.x.\n if (!el.querySelectorAll(\":checked\").length) {\n rbuggyQSA.push(\":checked\");\n }\n\n // Support: Windows 8 Native Apps\n // The type and name attributes are restricted during .innerHTML assignment\n input = document.createElement(\"input\");\n input.setAttribute(\"type\", \"hidden\");\n el.appendChild(input).setAttribute(\"name\", \"D\");\n\n // Support: IE 9 - 11+\n // IE's :disabled selector does not pick up the children of disabled fieldsets\n // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n // In some of the document kinds, these selectors wouldn't work natively.\n // This is probably OK but for backwards compatibility we want to maintain\n // handling them through jQuery traversal in jQuery 3.x.\n documentElement.appendChild(el).disabled = true;\n if (el.querySelectorAll(\":disabled\").length !== 2) {\n rbuggyQSA.push(\":enabled\", \":disabled\");\n }\n\n // Support: IE 11+, Edge 15 - 18+\n // IE 11/Edge don't find elements on a `[name='']` query in some cases.\n // Adding a temporary attribute to the document before the selection works\n // around the issue.\n // Interestingly, IE 10 & older don't seem to have the issue.\n input = document.createElement(\"input\");\n input.setAttribute(\"name\", \"\");\n el.appendChild(input);\n if (!el.querySelectorAll(\"[name='']\").length) {\n rbuggyQSA.push(\"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" + whitespace + \"*(?:''|\\\"\\\")\");\n }\n });\n if (!support.cssHas) {\n // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n // Our regular `try-catch` mechanism fails to detect natively-unsupported\n // pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n // in browsers that parse the `:has()` argument as a forgiving selector list.\n // https://drafts.csswg.org/selectors/#relational now requires the argument\n // to be parsed unforgivingly, but browsers have not yet fully adjusted.\n rbuggyQSA.push(\":has\");\n }\n rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join(\"|\"));\n\n /* Sorting\n ---------------------------------------------------------------------- */\n\n // Document order sorting\n sortOrder = function sortOrder(a, b) {\n // Flag for duplicate removal\n if (a === b) {\n hasDuplicate = true;\n return 0;\n }\n\n // Sort on method existence if only one input has compareDocumentPosition\n var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n if (compare) {\n return compare;\n }\n\n // Calculate position if both inputs belong to the same document\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n compare = (a.ownerDocument || a) == (b.ownerDocument || b) ? a.compareDocumentPosition(b) :\n // Otherwise we know they are disconnected\n 1;\n\n // Disconnected nodes\n if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {\n // Choose the first element that is related to our preferred document\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n if (a === document || a.ownerDocument == preferredDoc && find.contains(preferredDoc, a)) {\n return -1;\n }\n\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n if (b === document || b.ownerDocument == preferredDoc && find.contains(preferredDoc, b)) {\n return 1;\n }\n\n // Maintain original order\n return sortInput ? indexOf.call(sortInput, a) - indexOf.call(sortInput, b) : 0;\n }\n return compare & 4 ? -1 : 1;\n };\n return document;\n }\n find.matches = function (expr, elements) {\n return find(expr, null, null, elements);\n };\n find.matchesSelector = function (elem, expr) {\n setDocument(elem);\n if (documentIsHTML && !nonnativeSelectorCache[expr + \" \"] && (!rbuggyQSA || !rbuggyQSA.test(expr))) {\n try {\n var ret = matches.call(elem, expr);\n\n // IE 9's matchesSelector returns false on disconnected nodes\n if (ret || support.disconnectedMatch ||\n // As well, disconnected nodes are said to be in a document\n // fragment in IE 9\n elem.document && elem.document.nodeType !== 11) {\n return ret;\n }\n } catch (e) {\n nonnativeSelectorCache(expr, true);\n }\n }\n return find(expr, document, null, [elem]).length > 0;\n };\n find.contains = function (context, elem) {\n // Set document vars if needed\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n if ((context.ownerDocument || context) != document) {\n setDocument(context);\n }\n return jQuery.contains(context, elem);\n };\n find.attr = function (elem, name) {\n // Set document vars if needed\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n if ((elem.ownerDocument || elem) != document) {\n setDocument(elem);\n }\n var fn = Expr.attrHandle[name.toLowerCase()],\n // Don't get fooled by Object.prototype properties (see trac-13807)\n val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;\n if (val !== undefined) {\n return val;\n }\n return elem.getAttribute(name);\n };\n find.error = function (msg) {\n throw new Error(\"Syntax error, unrecognized expression: \" + msg);\n };\n\n /**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\n jQuery.uniqueSort = function (results) {\n var elem,\n duplicates = [],\n j = 0,\n i = 0;\n\n // Unless we *know* we can detect duplicates, assume their presence\n //\n // Support: Android <=4.0+\n // Testing for detecting duplicates is unpredictable so instead assume we can't\n // depend on duplicate detection in all browsers without a stable sort.\n hasDuplicate = !support.sortStable;\n sortInput = !support.sortStable && _slice.call(results, 0);\n sort.call(results, sortOrder);\n if (hasDuplicate) {\n while (elem = results[i++]) {\n if (elem === results[i]) {\n j = duplicates.push(i);\n }\n }\n while (j--) {\n splice.call(results, duplicates[j], 1);\n }\n }\n\n // Clear input after sorting to release objects\n // See https://github.com/jquery/sizzle/pull/225\n sortInput = null;\n return results;\n };\n jQuery.fn.uniqueSort = function () {\n return this.pushStack(jQuery.uniqueSort(_slice.apply(this)));\n };\n Expr = jQuery.expr = {\n // Can be adjusted by the user\n cacheLength: 50,\n createPseudo: markFunction,\n match: matchExpr,\n attrHandle: {},\n find: {},\n relative: {\n \">\": {\n dir: \"parentNode\",\n first: true\n },\n \" \": {\n dir: \"parentNode\"\n },\n \"+\": {\n dir: \"previousSibling\",\n first: true\n },\n \"~\": {\n dir: \"previousSibling\"\n }\n },\n preFilter: {\n ATTR: function ATTR(match) {\n match[1] = match[1].replace(runescape, funescape);\n\n // Move the given value to match[3] whether quoted or unquoted\n match[3] = (match[3] || match[4] || match[5] || \"\").replace(runescape, funescape);\n if (match[2] === \"~=\") {\n match[3] = \" \" + match[3] + \" \";\n }\n return match.slice(0, 4);\n },\n CHILD: function CHILD(match) {\n /* matches from matchExpr[\"CHILD\"]\n \t1 type (only|nth|...)\n \t2 what (child|of-type)\n \t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n \t4 xn-component of xn+y argument ([+-]?\\d*n|)\n \t5 sign of xn-component\n \t6 x of xn-component\n \t7 sign of y-component\n \t8 y of y-component\n */\n match[1] = match[1].toLowerCase();\n if (match[1].slice(0, 3) === \"nth\") {\n // nth-* requires argument\n if (!match[3]) {\n find.error(match[0]);\n }\n\n // numeric x and y parameters for Expr.filter.CHILD\n // remember that false/true cast respectively to 0/1\n match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === \"even\" || match[3] === \"odd\"));\n match[5] = +(match[7] + match[8] || match[3] === \"odd\");\n\n // other types prohibit arguments\n } else if (match[3]) {\n find.error(match[0]);\n }\n return match;\n },\n PSEUDO: function PSEUDO(match) {\n var excess,\n unquoted = !match[6] && match[2];\n if (matchExpr.CHILD.test(match[0])) {\n return null;\n }\n\n // Accept quoted arguments as-is\n if (match[3]) {\n match[2] = match[4] || match[5] || \"\";\n\n // Strip excess characters from unquoted arguments\n } else if (unquoted && rpseudo.test(unquoted) && (\n // Get excess from tokenize (recursively)\n excess = tokenize(unquoted, true)) && (\n // advance to the next closing parenthesis\n excess = unquoted.indexOf(\")\", unquoted.length - excess) - unquoted.length)) {\n // excess is a negative index\n match[0] = match[0].slice(0, excess);\n match[2] = unquoted.slice(0, excess);\n }\n\n // Return only captures needed by the pseudo filter method (type and argument)\n return match.slice(0, 3);\n }\n },\n filter: {\n TAG: function TAG(nodeNameSelector) {\n var expectedNodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();\n return nodeNameSelector === \"*\" ? function () {\n return true;\n } : function (elem) {\n return nodeName(elem, expectedNodeName);\n };\n },\n CLASS: function CLASS(className) {\n var pattern = classCache[className + \" \"];\n return pattern || (pattern = new RegExp(\"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\")) && classCache(className, function (elem) {\n return pattern.test(typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\");\n });\n },\n ATTR: function ATTR(name, operator, check) {\n return function (elem) {\n var result = find.attr(elem, name);\n if (result == null) {\n return operator === \"!=\";\n }\n if (!operator) {\n return true;\n }\n result += \"\";\n if (operator === \"=\") {\n return result === check;\n }\n if (operator === \"!=\") {\n return result !== check;\n }\n if (operator === \"^=\") {\n return check && result.indexOf(check) === 0;\n }\n if (operator === \"*=\") {\n return check && result.indexOf(check) > -1;\n }\n if (operator === \"$=\") {\n return check && result.slice(-check.length) === check;\n }\n if (operator === \"~=\") {\n return (\" \" + result.replace(rwhitespace, \" \") + \" \").indexOf(check) > -1;\n }\n if (operator === \"|=\") {\n return result === check || result.slice(0, check.length + 1) === check + \"-\";\n }\n return false;\n };\n },\n CHILD: function CHILD(type, what, _argument, first, last) {\n var simple = type.slice(0, 3) !== \"nth\",\n forward = type.slice(-4) !== \"last\",\n ofType = what === \"of-type\";\n return first === 1 && last === 0 ?\n // Shortcut for :nth-*(n)\n function (elem) {\n return !!elem.parentNode;\n } : function (elem, _context, xml) {\n var cache,\n outerCache,\n node,\n nodeIndex,\n start,\n dir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n parent = elem.parentNode,\n name = ofType && elem.nodeName.toLowerCase(),\n useCache = !xml && !ofType,\n diff = false;\n if (parent) {\n // :(first|last|only)-(child|of-type)\n if (simple) {\n while (dir) {\n node = elem;\n while (node = node[dir]) {\n if (ofType ? nodeName(node, name) : node.nodeType === 1) {\n return false;\n }\n }\n\n // Reverse direction for :only-* (if we haven't yet done so)\n start = dir = type === \"only\" && !start && \"nextSibling\";\n }\n return true;\n }\n start = [forward ? parent.firstChild : parent.lastChild];\n\n // non-xml :nth-child(...) stores cache data on `parent`\n if (forward && useCache) {\n // Seek `elem` from a previously-cached index\n outerCache = parent[expando] || (parent[expando] = {});\n cache = outerCache[type] || [];\n nodeIndex = cache[0] === dirruns && cache[1];\n diff = nodeIndex && cache[2];\n node = nodeIndex && parent.childNodes[nodeIndex];\n while (node = ++nodeIndex && node && node[dir] || (\n // Fallback to seeking `elem` from the start\n diff = nodeIndex = 0) || start.pop()) {\n // When found, cache indexes on `parent` and break\n if (node.nodeType === 1 && ++diff && node === elem) {\n outerCache[type] = [dirruns, nodeIndex, diff];\n break;\n }\n }\n } else {\n // Use previously-cached element index if available\n if (useCache) {\n outerCache = elem[expando] || (elem[expando] = {});\n cache = outerCache[type] || [];\n nodeIndex = cache[0] === dirruns && cache[1];\n diff = nodeIndex;\n }\n\n // xml :nth-child(...)\n // or :nth-last-child(...) or :nth(-last)?-of-type(...)\n if (diff === false) {\n // Use the same loop as above to seek `elem` from the start\n while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {\n if ((ofType ? nodeName(node, name) : node.nodeType === 1) && ++diff) {\n // Cache the index of each encountered element\n if (useCache) {\n outerCache = node[expando] || (node[expando] = {});\n outerCache[type] = [dirruns, diff];\n }\n if (node === elem) {\n break;\n }\n }\n }\n }\n }\n\n // Incorporate the offset, then check against cycle size\n diff -= last;\n return diff === first || diff % first === 0 && diff / first >= 0;\n }\n };\n },\n PSEUDO: function PSEUDO(pseudo, argument) {\n // pseudo-class names are case-insensitive\n // https://www.w3.org/TR/selectors/#pseudo-classes\n // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n // Remember that setFilters inherits from pseudos\n var args,\n fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || find.error(\"unsupported pseudo: \" + pseudo);\n\n // The user may use createPseudo to indicate that\n // arguments are needed to create the filter function\n // just as jQuery does\n if (fn[expando]) {\n return fn(argument);\n }\n\n // But maintain support for old signatures\n if (fn.length > 1) {\n args = [pseudo, pseudo, \"\", argument];\n return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {\n var idx,\n matched = fn(seed, argument),\n i = matched.length;\n while (i--) {\n idx = indexOf.call(seed, matched[i]);\n seed[idx] = !(matches[idx] = matched[i]);\n }\n }) : function (elem) {\n return fn(elem, 0, args);\n };\n }\n return fn;\n }\n },\n pseudos: {\n // Potentially complex pseudos\n not: markFunction(function (selector) {\n // Trim the selector passed to compile\n // to avoid treating leading and trailing\n // spaces as combinators\n var input = [],\n results = [],\n matcher = compile(selector.replace(rtrimCSS, \"$1\"));\n return matcher[expando] ? markFunction(function (seed, matches, _context, xml) {\n var elem,\n unmatched = matcher(seed, null, xml, []),\n i = seed.length;\n\n // Match elements unmatched by `matcher`\n while (i--) {\n if (elem = unmatched[i]) {\n seed[i] = !(matches[i] = elem);\n }\n }\n }) : function (elem, _context, xml) {\n input[0] = elem;\n matcher(input, null, xml, results);\n\n // Don't keep the element\n // (see https://github.com/jquery/sizzle/issues/299)\n input[0] = null;\n return !results.pop();\n };\n }),\n has: markFunction(function (selector) {\n return function (elem) {\n return find(selector, elem).length > 0;\n };\n }),\n contains: markFunction(function (text) {\n text = text.replace(runescape, funescape);\n return function (elem) {\n return (elem.textContent || jQuery.text(elem)).indexOf(text) > -1;\n };\n }),\n // \"Whether an element is represented by a :lang() selector\n // is based solely on the element's language value\n // being equal to the identifier C,\n // or beginning with the identifier C immediately followed by \"-\".\n // The matching of C against the element's language value is performed case-insensitively.\n // The identifier C does not have to be a valid language name.\"\n // https://www.w3.org/TR/selectors/#lang-pseudo\n lang: markFunction(function (lang) {\n // lang value must be a valid identifier\n if (!ridentifier.test(lang || \"\")) {\n find.error(\"unsupported lang: \" + lang);\n }\n lang = lang.replace(runescape, funescape).toLowerCase();\n return function (elem) {\n var elemLang;\n do {\n if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) {\n elemLang = elemLang.toLowerCase();\n return elemLang === lang || elemLang.indexOf(lang + \"-\") === 0;\n }\n } while ((elem = elem.parentNode) && elem.nodeType === 1);\n return false;\n };\n }),\n // Miscellaneous\n target: function target(elem) {\n var hash = window.location && window.location.hash;\n return hash && hash.slice(1) === elem.id;\n },\n root: function root(elem) {\n return elem === documentElement;\n },\n focus: function focus(elem) {\n return elem === safeActiveElement() && document.hasFocus() && !!(elem.type || elem.href || ~elem.tabIndex);\n },\n // Boolean properties\n enabled: createDisabledPseudo(false),\n disabled: createDisabledPseudo(true),\n checked: function checked(elem) {\n // In CSS3, :checked should return both checked and selected elements\n // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n return nodeName(elem, \"input\") && !!elem.checked || nodeName(elem, \"option\") && !!elem.selected;\n },\n selected: function selected(elem) {\n // Support: IE <=11+\n // Accessing the selectedIndex property\n // forces the browser to treat the default option as\n // selected when in an optgroup.\n if (elem.parentNode) {\n // eslint-disable-next-line no-unused-expressions\n elem.parentNode.selectedIndex;\n }\n return elem.selected === true;\n },\n // Contents\n empty: function empty(elem) {\n // https://www.w3.org/TR/selectors/#empty-pseudo\n // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n // but not by others (comment: 8; processing instruction: 7; etc.)\n // nodeType < 6 works because attributes (2) do not appear as children\n for (elem = elem.firstChild; elem; elem = elem.nextSibling) {\n if (elem.nodeType < 6) {\n return false;\n }\n }\n return true;\n },\n parent: function parent(elem) {\n return !Expr.pseudos.empty(elem);\n },\n // Element/input types\n header: function header(elem) {\n return rheader.test(elem.nodeName);\n },\n input: function input(elem) {\n return rinputs.test(elem.nodeName);\n },\n button: function button(elem) {\n return nodeName(elem, \"input\") && elem.type === \"button\" || nodeName(elem, \"button\");\n },\n text: function text(elem) {\n var attr;\n return nodeName(elem, \"input\") && elem.type === \"text\" && (\n // Support: IE <10 only\n // New HTML5 attribute values (e.g., \"search\") appear\n // with elem.type === \"text\"\n (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\");\n },\n // Position-in-collection\n first: createPositionalPseudo(function () {\n return [0];\n }),\n last: createPositionalPseudo(function (_matchIndexes, length) {\n return [length - 1];\n }),\n eq: createPositionalPseudo(function (_matchIndexes, length, argument) {\n return [argument < 0 ? argument + length : argument];\n }),\n even: createPositionalPseudo(function (matchIndexes, length) {\n var i = 0;\n for (; i < length; i += 2) {\n matchIndexes.push(i);\n }\n return matchIndexes;\n }),\n odd: createPositionalPseudo(function (matchIndexes, length) {\n var i = 1;\n for (; i < length; i += 2) {\n matchIndexes.push(i);\n }\n return matchIndexes;\n }),\n lt: createPositionalPseudo(function (matchIndexes, length, argument) {\n var i;\n if (argument < 0) {\n i = argument + length;\n } else if (argument > length) {\n i = length;\n } else {\n i = argument;\n }\n for (; --i >= 0;) {\n matchIndexes.push(i);\n }\n return matchIndexes;\n }),\n gt: createPositionalPseudo(function (matchIndexes, length, argument) {\n var i = argument < 0 ? argument + length : argument;\n for (; ++i < length;) {\n matchIndexes.push(i);\n }\n return matchIndexes;\n })\n }\n };\n Expr.pseudos.nth = Expr.pseudos.eq;\n\n // Add button/input type pseudos\n for (i in {\n radio: true,\n checkbox: true,\n file: true,\n password: true,\n image: true\n }) {\n Expr.pseudos[i] = createInputPseudo(i);\n }\n for (i in {\n submit: true,\n reset: true\n }) {\n Expr.pseudos[i] = createButtonPseudo(i);\n }\n\n // Easy API for creating new setFilters\n function setFilters() {}\n setFilters.prototype = Expr.filters = Expr.pseudos;\n Expr.setFilters = new setFilters();\n function tokenize(selector, parseOnly) {\n var matched,\n match,\n tokens,\n type,\n soFar,\n groups,\n preFilters,\n cached = tokenCache[selector + \" \"];\n if (cached) {\n return parseOnly ? 0 : cached.slice(0);\n }\n soFar = selector;\n groups = [];\n preFilters = Expr.preFilter;\n while (soFar) {\n // Comma and first run\n if (!matched || (match = rcomma.exec(soFar))) {\n if (match) {\n // Don't consume trailing commas as valid\n soFar = soFar.slice(match[0].length) || soFar;\n }\n groups.push(tokens = []);\n }\n matched = false;\n\n // Combinators\n if (match = rleadingCombinator.exec(soFar)) {\n matched = match.shift();\n tokens.push({\n value: matched,\n // Cast descendant combinators to space\n type: match[0].replace(rtrimCSS, \" \")\n });\n soFar = soFar.slice(matched.length);\n }\n\n // Filters\n for (type in Expr.filter) {\n if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {\n matched = match.shift();\n tokens.push({\n value: matched,\n type: type,\n matches: match\n });\n soFar = soFar.slice(matched.length);\n }\n }\n if (!matched) {\n break;\n }\n }\n\n // Return the length of the invalid excess\n // if we're just parsing\n // Otherwise, throw an error or return tokens\n if (parseOnly) {\n return soFar.length;\n }\n return soFar ? find.error(selector) :\n // Cache the tokens\n tokenCache(selector, groups).slice(0);\n }\n function toSelector(tokens) {\n var i = 0,\n len = tokens.length,\n selector = \"\";\n for (; i < len; i++) {\n selector += tokens[i].value;\n }\n return selector;\n }\n function addCombinator(matcher, combinator, base) {\n var dir = combinator.dir,\n skip = combinator.next,\n key = skip || dir,\n checkNonElements = base && key === \"parentNode\",\n doneName = done++;\n return combinator.first ?\n // Check against closest ancestor/preceding element\n function (elem, context, xml) {\n while (elem = elem[dir]) {\n if (elem.nodeType === 1 || checkNonElements) {\n return matcher(elem, context, xml);\n }\n }\n return false;\n } :\n // Check against all ancestor/preceding elements\n function (elem, context, xml) {\n var oldCache,\n outerCache,\n newCache = [dirruns, doneName];\n\n // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n if (xml) {\n while (elem = elem[dir]) {\n if (elem.nodeType === 1 || checkNonElements) {\n if (matcher(elem, context, xml)) {\n return true;\n }\n }\n }\n } else {\n while (elem = elem[dir]) {\n if (elem.nodeType === 1 || checkNonElements) {\n outerCache = elem[expando] || (elem[expando] = {});\n if (skip && nodeName(elem, skip)) {\n elem = elem[dir] || elem;\n } else if ((oldCache = outerCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) {\n // Assign to newCache so results back-propagate to previous elements\n return newCache[2] = oldCache[2];\n } else {\n // Reuse newcache so results back-propagate to previous elements\n outerCache[key] = newCache;\n\n // A match means we're done; a fail means we have to keep checking\n if (newCache[2] = matcher(elem, context, xml)) {\n return true;\n }\n }\n }\n }\n }\n return false;\n };\n }\n function elementMatcher(matchers) {\n return matchers.length > 1 ? function (elem, context, xml) {\n var i = matchers.length;\n while (i--) {\n if (!matchers[i](elem, context, xml)) {\n return false;\n }\n }\n return true;\n } : matchers[0];\n }\n function multipleContexts(selector, contexts, results) {\n var i = 0,\n len = contexts.length;\n for (; i < len; i++) {\n find(selector, contexts[i], results);\n }\n return results;\n }\n function condense(unmatched, map, filter, context, xml) {\n var elem,\n newUnmatched = [],\n i = 0,\n len = unmatched.length,\n mapped = map != null;\n for (; i < len; i++) {\n if (elem = unmatched[i]) {\n if (!filter || filter(elem, context, xml)) {\n newUnmatched.push(elem);\n if (mapped) {\n map.push(i);\n }\n }\n }\n }\n return newUnmatched;\n }\n function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {\n if (postFilter && !postFilter[expando]) {\n postFilter = setMatcher(postFilter);\n }\n if (postFinder && !postFinder[expando]) {\n postFinder = setMatcher(postFinder, postSelector);\n }\n return markFunction(function (seed, results, context, xml) {\n var temp,\n i,\n elem,\n matcherOut,\n preMap = [],\n postMap = [],\n preexisting = results.length,\n // Get initial elements from seed or context\n elems = seed || multipleContexts(selector || \"*\", context.nodeType ? [context] : context, []),\n // Prefilter to get matcher input, preserving a map for seed-results synchronization\n matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems;\n if (matcher) {\n // If we have a postFinder, or filtered seed, or non-seed postFilter\n // or preexisting results,\n matcherOut = postFinder || (seed ? preFilter : preexisting || postFilter) ?\n // ...intermediate processing is necessary\n [] :\n // ...otherwise use results directly\n results;\n\n // Find primary matches\n matcher(matcherIn, matcherOut, context, xml);\n } else {\n matcherOut = matcherIn;\n }\n\n // Apply postFilter\n if (postFilter) {\n temp = condense(matcherOut, postMap);\n postFilter(temp, [], context, xml);\n\n // Un-match failing elements by moving them back to matcherIn\n i = temp.length;\n while (i--) {\n if (elem = temp[i]) {\n matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);\n }\n }\n }\n if (seed) {\n if (postFinder || preFilter) {\n if (postFinder) {\n // Get the final matcherOut by condensing this intermediate into postFinder contexts\n temp = [];\n i = matcherOut.length;\n while (i--) {\n if (elem = matcherOut[i]) {\n // Restore matcherIn since elem is not yet a final match\n temp.push(matcherIn[i] = elem);\n }\n }\n postFinder(null, matcherOut = [], temp, xml);\n }\n\n // Move matched elements from seed to results to keep them synchronized\n i = matcherOut.length;\n while (i--) {\n if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1) {\n seed[temp] = !(results[temp] = elem);\n }\n }\n }\n\n // Add elements to results, through postFinder if defined\n } else {\n matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);\n if (postFinder) {\n postFinder(null, results, matcherOut, xml);\n } else {\n push.apply(results, matcherOut);\n }\n }\n });\n }\n function matcherFromTokens(tokens) {\n var checkContext,\n matcher,\n j,\n len = tokens.length,\n leadingRelative = Expr.relative[tokens[0].type],\n implicitRelative = leadingRelative || Expr.relative[\" \"],\n i = leadingRelative ? 1 : 0,\n // The foundational matcher ensures that elements are reachable from top-level context(s)\n matchContext = addCombinator(function (elem) {\n return elem === checkContext;\n }, implicitRelative, true),\n matchAnyContext = addCombinator(function (elem) {\n return indexOf.call(checkContext, elem) > -1;\n }, implicitRelative, true),\n matchers = [function (elem, context, xml) {\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n var ret = !leadingRelative && (xml || context != outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));\n\n // Avoid hanging onto element\n // (see https://github.com/jquery/sizzle/issues/299)\n checkContext = null;\n return ret;\n }];\n for (; i < len; i++) {\n if (matcher = Expr.relative[tokens[i].type]) {\n matchers = [addCombinator(elementMatcher(matchers), matcher)];\n } else {\n matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);\n\n // Return special upon seeing a positional matcher\n if (matcher[expando]) {\n // Find the next relative operator (if any) for proper handling\n j = ++i;\n for (; j < len; j++) {\n if (Expr.relative[tokens[j].type]) {\n break;\n }\n }\n return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(\n // If the preceding token was a descendant combinator, insert an implicit any-element `*`\n tokens.slice(0, i - 1).concat({\n value: tokens[i - 2].type === \" \" ? \"*\" : \"\"\n })).replace(rtrimCSS, \"$1\"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));\n }\n matchers.push(matcher);\n }\n }\n return elementMatcher(matchers);\n }\n function matcherFromGroupMatchers(elementMatchers, setMatchers) {\n var bySet = setMatchers.length > 0,\n byElement = elementMatchers.length > 0,\n superMatcher = function superMatcher(seed, context, xml, results, outermost) {\n var elem,\n j,\n matcher,\n matchedCount = 0,\n i = \"0\",\n unmatched = seed && [],\n setMatched = [],\n contextBackup = outermostContext,\n // We must always have either seed elements or outermost context\n elems = seed || byElement && Expr.find.TAG(\"*\", outermost),\n // Use integer dirruns iff this is the outermost matcher\n dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1,\n len = elems.length;\n if (outermost) {\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n outermostContext = context == document || context || outermost;\n }\n\n // Add elements passing elementMatchers directly to results\n // Support: iOS <=7 - 9 only\n // Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching\n // elements by id. (see trac-14142)\n for (; i !== len && (elem = elems[i]) != null; i++) {\n if (byElement && elem) {\n j = 0;\n\n // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n if (!context && elem.ownerDocument != document) {\n setDocument(elem);\n xml = !documentIsHTML;\n }\n while (matcher = elementMatchers[j++]) {\n if (matcher(elem, context || document, xml)) {\n push.call(results, elem);\n break;\n }\n }\n if (outermost) {\n dirruns = dirrunsUnique;\n }\n }\n\n // Track unmatched elements for set filters\n if (bySet) {\n // They will have gone through all possible matchers\n if (elem = !matcher && elem) {\n matchedCount--;\n }\n\n // Lengthen the array for every element, matched or not\n if (seed) {\n unmatched.push(elem);\n }\n }\n }\n\n // `i` is now the count of elements visited above, and adding it to `matchedCount`\n // makes the latter nonnegative.\n matchedCount += i;\n\n // Apply set filters to unmatched elements\n // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n // equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n // no element matchers and no seed.\n // Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n // case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n // numerically zero.\n if (bySet && i !== matchedCount) {\n j = 0;\n while (matcher = setMatchers[j++]) {\n matcher(unmatched, setMatched, context, xml);\n }\n if (seed) {\n // Reintegrate element matches to eliminate the need for sorting\n if (matchedCount > 0) {\n while (i--) {\n if (!(unmatched[i] || setMatched[i])) {\n setMatched[i] = pop.call(results);\n }\n }\n }\n\n // Discard index placeholder values to get only actual matches\n setMatched = condense(setMatched);\n }\n\n // Add matches to results\n push.apply(results, setMatched);\n\n // Seedless set matches succeeding multiple successful matchers stipulate sorting\n if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {\n jQuery.uniqueSort(results);\n }\n }\n\n // Override manipulation of globals by nested matchers\n if (outermost) {\n dirruns = dirrunsUnique;\n outermostContext = contextBackup;\n }\n return unmatched;\n };\n return bySet ? markFunction(superMatcher) : superMatcher;\n }\n function compile(selector, match /* Internal Use Only */) {\n var i,\n setMatchers = [],\n elementMatchers = [],\n cached = compilerCache[selector + \" \"];\n if (!cached) {\n // Generate a function of recursive functions that can be used to check each element\n if (!match) {\n match = tokenize(selector);\n }\n i = match.length;\n while (i--) {\n cached = matcherFromTokens(match[i]);\n if (cached[expando]) {\n setMatchers.push(cached);\n } else {\n elementMatchers.push(cached);\n }\n }\n\n // Cache the compiled function\n cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));\n\n // Save selector and tokenization\n cached.selector = selector;\n }\n return cached;\n }\n\n /**\n * A low-level selection function that works with jQuery's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with jQuery selector compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\n function select(selector, context, results, seed) {\n var i,\n tokens,\n token,\n type,\n find,\n compiled = typeof selector === \"function\" && selector,\n match = !seed && tokenize(selector = compiled.selector || selector);\n results = results || [];\n\n // Try to minimize operations if there is only one selector in the list and no seed\n // (the latter of which guarantees us context)\n if (match.length === 1) {\n // Reduce context if the leading compound selector is an ID\n tokens = match[0] = match[0].slice(0);\n if (tokens.length > 2 && (token = tokens[0]).type === \"ID\" && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {\n context = (Expr.find.ID(token.matches[0].replace(runescape, funescape), context) || [])[0];\n if (!context) {\n return results;\n\n // Precompiled matchers will still verify ancestry, so step up a level\n } else if (compiled) {\n context = context.parentNode;\n }\n selector = selector.slice(tokens.shift().value.length);\n }\n\n // Fetch a seed set for right-to-left matching\n i = matchExpr.needsContext.test(selector) ? 0 : tokens.length;\n while (i--) {\n token = tokens[i];\n\n // Abort if we hit a combinator\n if (Expr.relative[type = token.type]) {\n break;\n }\n if (find = Expr.find[type]) {\n // Search, expanding context for leading sibling combinators\n if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) {\n // If seed is empty or no tokens remain, we can return early\n tokens.splice(i, 1);\n selector = seed.length && toSelector(tokens);\n if (!selector) {\n push.apply(results, seed);\n return results;\n }\n break;\n }\n }\n }\n }\n\n // Compile and execute a filtering function if one is not provided\n // Provide `match` to avoid retokenization if we modified the selector above\n (compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context);\n return results;\n }\n\n // One-time assignments\n\n // Support: Android <=4.0 - 4.1+\n // Sort stability\n support.sortStable = expando.split(\"\").sort(sortOrder).join(\"\") === expando;\n\n // Initialize against the default document\n setDocument();\n\n // Support: Android <=4.0 - 4.1+\n // Detached nodes confoundingly follow *each other*\n support.sortDetached = assert(function (el) {\n // Should return 1, but returns 4 (following)\n return el.compareDocumentPosition(document.createElement(\"fieldset\")) & 1;\n });\n jQuery.find = find;\n\n // Deprecated\n jQuery.expr[\":\"] = jQuery.expr.pseudos;\n jQuery.unique = jQuery.uniqueSort;\n\n // These have always been private, but they used to be documented as part of\n // Sizzle so let's maintain them for now for backwards compatibility purposes.\n find.compile = compile;\n find.select = select;\n find.setDocument = setDocument;\n find.tokenize = tokenize;\n find.escape = jQuery.escapeSelector;\n find.getText = jQuery.text;\n find.isXML = jQuery.isXMLDoc;\n find.selectors = jQuery.expr;\n find.support = jQuery.support;\n find.uniqueSort = jQuery.uniqueSort;\n\n /* eslint-enable */\n })();\n var dir = function dir(elem, _dir, until) {\n var matched = [],\n truncate = until !== undefined;\n while ((elem = elem[_dir]) && elem.nodeType !== 9) {\n if (elem.nodeType === 1) {\n if (truncate && jQuery(elem).is(until)) {\n break;\n }\n matched.push(elem);\n }\n }\n return matched;\n };\n var _siblings = function siblings(n, elem) {\n var matched = [];\n for (; n; n = n.nextSibling) {\n if (n.nodeType === 1 && n !== elem) {\n matched.push(n);\n }\n }\n return matched;\n };\n var rneedsContext = jQuery.expr.match.needsContext;\n var rsingleTag = /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;\n\n // Implement the identical functionality for filter and not\n function winnow(elements, qualifier, not) {\n if (isFunction(qualifier)) {\n return jQuery.grep(elements, function (elem, i) {\n return !!qualifier.call(elem, i, elem) !== not;\n });\n }\n\n // Single element\n if (qualifier.nodeType) {\n return jQuery.grep(elements, function (elem) {\n return elem === qualifier !== not;\n });\n }\n\n // Arraylike of elements (jQuery, arguments, Array)\n if (typeof qualifier !== \"string\") {\n return jQuery.grep(elements, function (elem) {\n return indexOf.call(qualifier, elem) > -1 !== not;\n });\n }\n\n // Filtered directly for both simple and complex selectors\n return jQuery.filter(qualifier, elements, not);\n }\n jQuery.filter = function (expr, elems, not) {\n var elem = elems[0];\n if (not) {\n expr = \":not(\" + expr + \")\";\n }\n if (elems.length === 1 && elem.nodeType === 1) {\n return jQuery.find.matchesSelector(elem, expr) ? [elem] : [];\n }\n return jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {\n return elem.nodeType === 1;\n }));\n };\n jQuery.fn.extend({\n find: function find(selector) {\n var i,\n ret,\n len = this.length,\n self = this;\n if (typeof selector !== \"string\") {\n return this.pushStack(jQuery(selector).filter(function () {\n for (i = 0; i < len; i++) {\n if (jQuery.contains(self[i], this)) {\n return true;\n }\n }\n }));\n }\n ret = this.pushStack([]);\n for (i = 0; i < len; i++) {\n jQuery.find(selector, self[i], ret);\n }\n return len > 1 ? jQuery.uniqueSort(ret) : ret;\n },\n filter: function filter(selector) {\n return this.pushStack(winnow(this, selector || [], false));\n },\n not: function not(selector) {\n return this.pushStack(winnow(this, selector || [], true));\n },\n is: function is(selector) {\n return !!winnow(this,\n // If this is a positional/relative selector, check membership in the returned set\n // so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n typeof selector === \"string\" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;\n }\n });\n\n // Initialize a jQuery object\n\n // A central reference to the root jQuery(document)\n var rootjQuery,\n // A simple way to check for HTML strings\n // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)\n // Strict HTML recognition (trac-11290: must start with <)\n // Shortcut simple #id case for speed\n rquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n init = jQuery.fn.init = function (selector, context, root) {\n var match, elem;\n\n // HANDLE: $(\"\"), $(null), $(undefined), $(false)\n if (!selector) {\n return this;\n }\n\n // Method init() accepts an alternate rootjQuery\n // so migrate can support jQuery.sub (gh-2101)\n root = root || rootjQuery;\n\n // Handle HTML strings\n if (typeof selector === \"string\") {\n if (selector[0] === \"<\" && selector[selector.length - 1] === \">\" && selector.length >= 3) {\n // Assume that strings that start and end with <> are HTML and skip the regex check\n match = [null, selector, null];\n } else {\n match = rquickExpr.exec(selector);\n }\n\n // Match html or make sure no context is specified for #id\n if (match && (match[1] || !context)) {\n // HANDLE: $(html) -> $(array)\n if (match[1]) {\n context = context instanceof jQuery ? context[0] : context;\n\n // Option to run scripts is true for back-compat\n // Intentionally let the error be thrown if parseHTML is not present\n jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true));\n\n // HANDLE: $(html, props)\n if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {\n for (match in context) {\n // Properties of context are called as methods if possible\n if (isFunction(this[match])) {\n this[match](context[match]);\n\n // ...and otherwise set as attributes\n } else {\n this.attr(match, context[match]);\n }\n }\n }\n return this;\n\n // HANDLE: $(#id)\n } else {\n elem = document.getElementById(match[2]);\n if (elem) {\n // Inject the element directly into the jQuery object\n this[0] = elem;\n this.length = 1;\n }\n return this;\n }\n\n // HANDLE: $(expr, $(...))\n } else if (!context || context.jquery) {\n return (context || root).find(selector);\n\n // HANDLE: $(expr, context)\n // (which is just equivalent to: $(context).find(expr)\n } else {\n return this.constructor(context).find(selector);\n }\n\n // HANDLE: $(DOMElement)\n } else if (selector.nodeType) {\n this[0] = selector;\n this.length = 1;\n return this;\n\n // HANDLE: $(function)\n // Shortcut for document ready\n } else if (isFunction(selector)) {\n return root.ready !== undefined ? root.ready(selector) :\n // Execute immediately if ready is not present\n selector(jQuery);\n }\n return jQuery.makeArray(selector, this);\n };\n\n // Give the init function the jQuery prototype for later instantiation\n init.prototype = jQuery.fn;\n\n // Initialize central reference\n rootjQuery = jQuery(document);\n var rparentsprev = /^(?:parents|prev(?:Until|All))/,\n // Methods guaranteed to produce a unique set when starting from a unique set\n guaranteedUnique = {\n children: true,\n contents: true,\n next: true,\n prev: true\n };\n jQuery.fn.extend({\n has: function has(target) {\n var targets = jQuery(target, this),\n l = targets.length;\n return this.filter(function () {\n var i = 0;\n for (; i < l; i++) {\n if (jQuery.contains(this, targets[i])) {\n return true;\n }\n }\n });\n },\n closest: function closest(selectors, context) {\n var cur,\n i = 0,\n l = this.length,\n matched = [],\n targets = typeof selectors !== \"string\" && jQuery(selectors);\n\n // Positional selectors never match, since there's no _selection_ context\n if (!rneedsContext.test(selectors)) {\n for (; i < l; i++) {\n for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {\n // Always skip document fragments\n if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 :\n // Don't pass non-elements to jQuery#find\n cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {\n matched.push(cur);\n break;\n }\n }\n }\n }\n return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);\n },\n // Determine the position of an element within the set\n index: function index(elem) {\n // No argument, return index in parent\n if (!elem) {\n return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;\n }\n\n // Index in selector\n if (typeof elem === \"string\") {\n return indexOf.call(jQuery(elem), this[0]);\n }\n\n // Locate the position of the desired element\n return indexOf.call(this,\n // If it receives a jQuery object, the first element is used\n elem.jquery ? elem[0] : elem);\n },\n add: function add(selector, context) {\n return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context))));\n },\n addBack: function addBack(selector) {\n return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));\n }\n });\n function sibling(cur, dir) {\n while ((cur = cur[dir]) && cur.nodeType !== 1) {}\n return cur;\n }\n jQuery.each({\n parent: function parent(elem) {\n var parent = elem.parentNode;\n return parent && parent.nodeType !== 11 ? parent : null;\n },\n parents: function parents(elem) {\n return dir(elem, \"parentNode\");\n },\n parentsUntil: function parentsUntil(elem, _i, until) {\n return dir(elem, \"parentNode\", until);\n },\n next: function next(elem) {\n return sibling(elem, \"nextSibling\");\n },\n prev: function prev(elem) {\n return sibling(elem, \"previousSibling\");\n },\n nextAll: function nextAll(elem) {\n return dir(elem, \"nextSibling\");\n },\n prevAll: function prevAll(elem) {\n return dir(elem, \"previousSibling\");\n },\n nextUntil: function nextUntil(elem, _i, until) {\n return dir(elem, \"nextSibling\", until);\n },\n prevUntil: function prevUntil(elem, _i, until) {\n return dir(elem, \"previousSibling\", until);\n },\n siblings: function siblings(elem) {\n return _siblings((elem.parentNode || {}).firstChild, elem);\n },\n children: function children(elem) {\n return _siblings(elem.firstChild);\n },\n contents: function contents(elem) {\n if (elem.contentDocument != null &&\n // Support: IE 11+\n // <object> elements with no `data` attribute has an object\n // `contentDocument` with a `null` prototype.\n getProto(elem.contentDocument)) {\n return elem.contentDocument;\n }\n\n // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n // Treat the template element as a regular one in browsers that\n // don't support it.\n if (nodeName(elem, \"template\")) {\n elem = elem.content || elem;\n }\n return jQuery.merge([], elem.childNodes);\n }\n }, function (name, fn) {\n jQuery.fn[name] = function (until, selector) {\n var matched = jQuery.map(this, fn, until);\n if (name.slice(-5) !== \"Until\") {\n selector = until;\n }\n if (selector && typeof selector === \"string\") {\n matched = jQuery.filter(selector, matched);\n }\n if (this.length > 1) {\n // Remove duplicates\n if (!guaranteedUnique[name]) {\n jQuery.uniqueSort(matched);\n }\n\n // Reverse order for parents* and prev-derivatives\n if (rparentsprev.test(name)) {\n matched.reverse();\n }\n }\n return this.pushStack(matched);\n };\n });\n var rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\n\n // Convert String-formatted options into Object-formatted ones\n function createOptions(options) {\n var object = {};\n jQuery.each(options.match(rnothtmlwhite) || [], function (_, flag) {\n object[flag] = true;\n });\n return object;\n }\n\n /*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\n jQuery.Callbacks = function (options) {\n // Convert options from String-formatted to Object-formatted if needed\n // (we check in cache first)\n options = typeof options === \"string\" ? createOptions(options) : jQuery.extend({}, options);\n var\n // Flag to know if list is currently firing\n firing,\n // Last fire value for non-forgettable lists\n memory,\n // Flag to know if list was already fired\n _fired,\n // Flag to prevent firing\n _locked,\n // Actual callback list\n list = [],\n // Queue of execution data for repeatable lists\n queue = [],\n // Index of currently firing callback (modified by add/remove as needed)\n firingIndex = -1,\n // Fire callbacks\n fire = function fire() {\n // Enforce single-firing\n _locked = _locked || options.once;\n\n // Execute callbacks for all pending executions,\n // respecting firingIndex overrides and runtime changes\n _fired = firing = true;\n for (; queue.length; firingIndex = -1) {\n memory = queue.shift();\n while (++firingIndex < list.length) {\n // Run callback and check for early termination\n if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {\n // Jump to end and forget the data so .add doesn't re-fire\n firingIndex = list.length;\n memory = false;\n }\n }\n }\n\n // Forget the data if we're done with it\n if (!options.memory) {\n memory = false;\n }\n firing = false;\n\n // Clean up if we're done firing for good\n if (_locked) {\n // Keep an empty list if we have data for future add calls\n if (memory) {\n list = [];\n\n // Otherwise, this object is spent\n } else {\n list = \"\";\n }\n }\n },\n // Actual Callbacks object\n self = {\n // Add a callback or a collection of callbacks to the list\n add: function add() {\n if (list) {\n // If we have memory from a past run, we should fire after adding\n if (memory && !firing) {\n firingIndex = list.length - 1;\n queue.push(memory);\n }\n (function add(args) {\n jQuery.each(args, function (_, arg) {\n if (isFunction(arg)) {\n if (!options.unique || !self.has(arg)) {\n list.push(arg);\n }\n } else if (arg && arg.length && toType(arg) !== \"string\") {\n // Inspect recursively\n add(arg);\n }\n });\n })(arguments);\n if (memory && !firing) {\n fire();\n }\n }\n return this;\n },\n // Remove a callback from the list\n remove: function remove() {\n jQuery.each(arguments, function (_, arg) {\n var index;\n while ((index = jQuery.inArray(arg, list, index)) > -1) {\n list.splice(index, 1);\n\n // Handle firing indexes\n if (index <= firingIndex) {\n firingIndex--;\n }\n }\n });\n return this;\n },\n // Check if a given callback is in the list.\n // If no argument is given, return whether or not list has callbacks attached.\n has: function has(fn) {\n return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0;\n },\n // Remove all callbacks from the list\n empty: function empty() {\n if (list) {\n list = [];\n }\n return this;\n },\n // Disable .fire and .add\n // Abort any current/pending executions\n // Clear all callbacks and values\n disable: function disable() {\n _locked = queue = [];\n list = memory = \"\";\n return this;\n },\n disabled: function disabled() {\n return !list;\n },\n // Disable .fire\n // Also disable .add unless we have memory (since it would have no effect)\n // Abort any pending executions\n lock: function lock() {\n _locked = queue = [];\n if (!memory && !firing) {\n list = memory = \"\";\n }\n return this;\n },\n locked: function locked() {\n return !!_locked;\n },\n // Call all callbacks with the given context and arguments\n fireWith: function fireWith(context, args) {\n if (!_locked) {\n args = args || [];\n args = [context, args.slice ? args.slice() : args];\n queue.push(args);\n if (!firing) {\n fire();\n }\n }\n return this;\n },\n // Call all the callbacks with the given arguments\n fire: function fire() {\n self.fireWith(this, arguments);\n return this;\n },\n // To know if the callbacks have already been called at least once\n fired: function fired() {\n return !!_fired;\n }\n };\n return self;\n };\n function Identity(v) {\n return v;\n }\n function Thrower(ex) {\n throw ex;\n }\n function adoptValue(value, resolve, reject, noValue) {\n var method;\n try {\n // Check for promise aspect first to privilege synchronous behavior\n if (value && isFunction(method = value.promise)) {\n method.call(value).done(resolve).fail(reject);\n\n // Other thenables\n } else if (value && isFunction(method = value.then)) {\n method.call(value, resolve, reject);\n\n // Other non-thenables\n } else {\n // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n // * false: [ value ].slice( 0 ) => resolve( value )\n // * true: [ value ].slice( 1 ) => resolve()\n resolve.apply(undefined, [value].slice(noValue));\n }\n\n // For Promises/A+, convert exceptions into rejections\n // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n // Deferred#then to conditionally suppress rejection.\n } catch (value) {\n // Support: Android 4.0 only\n // Strict mode functions invoked without .call/.apply get global-object context\n reject.apply(undefined, [value]);\n }\n }\n jQuery.extend({\n Deferred: function Deferred(func) {\n var tuples = [\n // action, add listener, callbacks,\n // ... .then handlers, argument index, [final state]\n [\"notify\", \"progress\", jQuery.Callbacks(\"memory\"), jQuery.Callbacks(\"memory\"), 2], [\"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), jQuery.Callbacks(\"once memory\"), 0, \"resolved\"], [\"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), jQuery.Callbacks(\"once memory\"), 1, \"rejected\"]],\n _state = \"pending\",\n _promise = {\n state: function state() {\n return _state;\n },\n always: function always() {\n deferred.done(arguments).fail(arguments);\n return this;\n },\n \"catch\": function _catch(fn) {\n return _promise.then(null, fn);\n },\n // Keep pipe for back-compat\n pipe: function pipe( /* fnDone, fnFail, fnProgress */\n ) {\n var fns = arguments;\n return jQuery.Deferred(function (newDefer) {\n jQuery.each(tuples, function (_i, tuple) {\n // Map tuples (progress, done, fail) to arguments (done, fail, progress)\n var fn = isFunction(fns[tuple[4]]) && fns[tuple[4]];\n\n // deferred.progress(function() { bind to newDefer or newDefer.notify })\n // deferred.done(function() { bind to newDefer or newDefer.resolve })\n // deferred.fail(function() { bind to newDefer or newDefer.reject })\n deferred[tuple[1]](function () {\n var returned = fn && fn.apply(this, arguments);\n if (returned && isFunction(returned.promise)) {\n returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);\n } else {\n newDefer[tuple[0] + \"With\"](this, fn ? [returned] : arguments);\n }\n });\n });\n fns = null;\n }).promise();\n },\n then: function then(onFulfilled, onRejected, onProgress) {\n var maxDepth = 0;\n function resolve(depth, deferred, handler, special) {\n return function () {\n var that = this,\n args = arguments,\n mightThrow = function mightThrow() {\n var returned, then;\n\n // Support: Promises/A+ section 2.3.3.3.3\n // https://promisesaplus.com/#point-59\n // Ignore double-resolution attempts\n if (depth < maxDepth) {\n return;\n }\n returned = handler.apply(that, args);\n\n // Support: Promises/A+ section 2.3.1\n // https://promisesaplus.com/#point-48\n if (returned === deferred.promise()) {\n throw new TypeError(\"Thenable self-resolution\");\n }\n\n // Support: Promises/A+ sections 2.3.3.1, 3.5\n // https://promisesaplus.com/#point-54\n // https://promisesaplus.com/#point-75\n // Retrieve `then` only once\n then = returned && (\n // Support: Promises/A+ section 2.3.4\n // https://promisesaplus.com/#point-64\n // Only check objects and functions for thenability\n _typeof$1(returned) === \"object\" || typeof returned === \"function\") && returned.then;\n\n // Handle a returned thenable\n if (isFunction(then)) {\n // Special processors (notify) just wait for resolution\n if (special) {\n then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special));\n\n // Normal processors (resolve) also hook into progress\n } else {\n // ...and disregard older resolution values\n maxDepth++;\n then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special), resolve(maxDepth, deferred, Identity, deferred.notifyWith));\n }\n\n // Handle all other returned values\n } else {\n // Only substitute handlers pass on context\n // and multiple values (non-spec behavior)\n if (handler !== Identity) {\n that = undefined;\n args = [returned];\n }\n\n // Process the value(s)\n // Default process is resolve\n (special || deferred.resolveWith)(that, args);\n }\n },\n // Only normal processors (resolve) catch and reject exceptions\n process = special ? mightThrow : function () {\n try {\n mightThrow();\n } catch (e) {\n if (jQuery.Deferred.exceptionHook) {\n jQuery.Deferred.exceptionHook(e, process.error);\n }\n\n // Support: Promises/A+ section 2.3.3.3.4.1\n // https://promisesaplus.com/#point-61\n // Ignore post-resolution exceptions\n if (depth + 1 >= maxDepth) {\n // Only substitute handlers pass on context\n // and multiple values (non-spec behavior)\n if (handler !== Thrower) {\n that = undefined;\n args = [e];\n }\n deferred.rejectWith(that, args);\n }\n }\n };\n\n // Support: Promises/A+ section 2.3.3.3.1\n // https://promisesaplus.com/#point-57\n // Re-resolve promises immediately to dodge false rejection from\n // subsequent errors\n if (depth) {\n process();\n } else {\n // Call an optional hook to record the error, in case of exception\n // since it's otherwise lost when execution goes async\n if (jQuery.Deferred.getErrorHook) {\n process.error = jQuery.Deferred.getErrorHook();\n\n // The deprecated alias of the above. While the name suggests\n // returning the stack, not an error instance, jQuery just passes\n // it directly to `console.warn` so both will work; an instance\n // just better cooperates with source maps.\n } else if (jQuery.Deferred.getStackHook) {\n process.error = jQuery.Deferred.getStackHook();\n }\n window.setTimeout(process);\n }\n };\n }\n return jQuery.Deferred(function (newDefer) {\n // progress_handlers.add( ... )\n tuples[0][3].add(resolve(0, newDefer, isFunction(onProgress) ? onProgress : Identity, newDefer.notifyWith));\n\n // fulfilled_handlers.add( ... )\n tuples[1][3].add(resolve(0, newDefer, isFunction(onFulfilled) ? onFulfilled : Identity));\n\n // rejected_handlers.add( ... )\n tuples[2][3].add(resolve(0, newDefer, isFunction(onRejected) ? onRejected : Thrower));\n }).promise();\n },\n // Get a promise for this deferred\n // If obj is provided, the promise aspect is added to the object\n promise: function promise(obj) {\n return obj != null ? jQuery.extend(obj, _promise) : _promise;\n }\n },\n deferred = {};\n\n // Add list-specific methods\n jQuery.each(tuples, function (i, tuple) {\n var list = tuple[2],\n stateString = tuple[5];\n\n // promise.progress = list.add\n // promise.done = list.add\n // promise.fail = list.add\n _promise[tuple[1]] = list.add;\n\n // Handle state\n if (stateString) {\n list.add(function () {\n // state = \"resolved\" (i.e., fulfilled)\n // state = \"rejected\"\n _state = stateString;\n },\n // rejected_callbacks.disable\n // fulfilled_callbacks.disable\n tuples[3 - i][2].disable,\n // rejected_handlers.disable\n // fulfilled_handlers.disable\n tuples[3 - i][3].disable,\n // progress_callbacks.lock\n tuples[0][2].lock,\n // progress_handlers.lock\n tuples[0][3].lock);\n }\n\n // progress_handlers.fire\n // fulfilled_handlers.fire\n // rejected_handlers.fire\n list.add(tuple[3].fire);\n\n // deferred.notify = function() { deferred.notifyWith(...) }\n // deferred.resolve = function() { deferred.resolveWith(...) }\n // deferred.reject = function() { deferred.rejectWith(...) }\n deferred[tuple[0]] = function () {\n deferred[tuple[0] + \"With\"](this === deferred ? undefined : this, arguments);\n return this;\n };\n\n // deferred.notifyWith = list.fireWith\n // deferred.resolveWith = list.fireWith\n // deferred.rejectWith = list.fireWith\n deferred[tuple[0] + \"With\"] = list.fireWith;\n });\n\n // Make the deferred a promise\n _promise.promise(deferred);\n\n // Call given func if any\n if (func) {\n func.call(deferred, deferred);\n }\n\n // All done!\n return deferred;\n },\n // Deferred helper\n when: function when(singleValue) {\n var\n // count of uncompleted subordinates\n remaining = arguments.length,\n // count of unprocessed arguments\n i = remaining,\n // subordinate fulfillment data\n resolveContexts = Array(i),\n resolveValues = _slice.call(arguments),\n // the primary Deferred\n primary = jQuery.Deferred(),\n // subordinate callback factory\n updateFunc = function updateFunc(i) {\n return function (value) {\n resolveContexts[i] = this;\n resolveValues[i] = arguments.length > 1 ? _slice.call(arguments) : value;\n if (! --remaining) {\n primary.resolveWith(resolveContexts, resolveValues);\n }\n };\n };\n\n // Single- and empty arguments are adopted like Promise.resolve\n if (remaining <= 1) {\n adoptValue(singleValue, primary.done(updateFunc(i)).resolve, primary.reject, !remaining);\n\n // Use .then() to unwrap secondary thenables (cf. gh-3000)\n if (primary.state() === \"pending\" || isFunction(resolveValues[i] && resolveValues[i].then)) {\n return primary.then();\n }\n }\n\n // Multiple arguments are aggregated like Promise.all array elements\n while (i--) {\n adoptValue(resolveValues[i], updateFunc(i), primary.reject);\n }\n return primary.promise();\n }\n });\n\n // These usually indicate a programmer mistake during development,\n // warn about them ASAP rather than swallowing them by default.\n var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\n // If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error\n // captured before the async barrier to get the original error cause\n // which may otherwise be hidden.\n jQuery.Deferred.exceptionHook = function (error, asyncError) {\n // Support: IE 8 - 9 only\n // Console exists when dev tools are open, which can happen at any time\n if (window.console && window.console.warn && error && rerrorNames.test(error.name)) {\n window.console.warn(\"jQuery.Deferred exception: \" + error.message, error.stack, asyncError);\n }\n };\n jQuery.readyException = function (error) {\n window.setTimeout(function () {\n throw error;\n });\n };\n\n // The deferred used on DOM ready\n var readyList = jQuery.Deferred();\n jQuery.fn.ready = function (fn) {\n readyList.then(fn)\n\n // Wrap jQuery.readyException in a function so that the lookup\n // happens at the time of error handling instead of callback\n // registration.\n [\"catch\"](function (error) {\n jQuery.readyException(error);\n });\n return this;\n };\n jQuery.extend({\n // Is the DOM ready to be used? Set to true once it occurs.\n isReady: false,\n // A counter to track how many items to wait for before\n // the ready event fires. See trac-6781\n readyWait: 1,\n // Handle when the DOM is ready\n ready: function ready(wait) {\n // Abort if there are pending holds or we're already ready\n if (wait === true ? --jQuery.readyWait : jQuery.isReady) {\n return;\n }\n\n // Remember that the DOM is ready\n jQuery.isReady = true;\n\n // If a normal DOM Ready event fired, decrement, and wait if need be\n if (wait !== true && --jQuery.readyWait > 0) {\n return;\n }\n\n // If there are functions bound, to execute\n readyList.resolveWith(document, [jQuery]);\n }\n });\n jQuery.ready.then = readyList.then;\n\n // The ready event handler and self cleanup method\n function completed() {\n document.removeEventListener(\"DOMContentLoaded\", completed);\n window.removeEventListener(\"load\", completed);\n jQuery.ready();\n }\n\n // Catch cases where $(document).ready() is called\n // after the browser event has already occurred.\n // Support: IE <=9 - 10 only\n // Older IE sometimes signals \"interactive\" too soon\n if (document.readyState === \"complete\" || document.readyState !== \"loading\" && !document.documentElement.doScroll) {\n // Handle it asynchronously to allow scripts the opportunity to delay ready\n window.setTimeout(jQuery.ready);\n } else {\n // Use the handy event callback\n document.addEventListener(\"DOMContentLoaded\", completed);\n\n // A fallback to window.onload, that will always work\n window.addEventListener(\"load\", completed);\n }\n\n // Multifunctional method to get and set values of a collection\n // The value/s can optionally be executed if it's a function\n var access = function access(elems, fn, key, value, chainable, emptyGet, raw) {\n var i = 0,\n len = elems.length,\n bulk = key == null;\n\n // Sets many values\n if (toType(key) === \"object\") {\n chainable = true;\n for (i in key) {\n access(elems, fn, i, key[i], true, emptyGet, raw);\n }\n\n // Sets one value\n } else if (value !== undefined) {\n chainable = true;\n if (!isFunction(value)) {\n raw = true;\n }\n if (bulk) {\n // Bulk operations run against the entire set\n if (raw) {\n fn.call(elems, value);\n fn = null;\n\n // ...except when executing function values\n } else {\n bulk = fn;\n fn = function fn(elem, _key, value) {\n return bulk.call(jQuery(elem), value);\n };\n }\n }\n if (fn) {\n for (; i < len; i++) {\n fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));\n }\n }\n }\n if (chainable) {\n return elems;\n }\n\n // Gets\n if (bulk) {\n return fn.call(elems);\n }\n return len ? fn(elems[0], key) : emptyGet;\n };\n\n // Matches dashed string for camelizing\n var rmsPrefix = /^-ms-/,\n rdashAlpha = /-([a-z])/g;\n\n // Used by camelCase as callback to replace()\n function fcamelCase(_all, letter) {\n return letter.toUpperCase();\n }\n\n // Convert dashed to camelCase; used by the css and data modules\n // Support: IE <=9 - 11, Edge 12 - 15\n // Microsoft forgot to hump their vendor prefix (trac-9572)\n function camelCase(string) {\n return string.replace(rmsPrefix, \"ms-\").replace(rdashAlpha, fcamelCase);\n }\n var acceptData = function acceptData(owner) {\n // Accepts only:\n // - Node\n // - Node.ELEMENT_NODE\n // - Node.DOCUMENT_NODE\n // - Object\n // - Any\n return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType;\n };\n function Data() {\n this.expando = jQuery.expando + Data.uid++;\n }\n Data.uid = 1;\n Data.prototype = {\n cache: function cache(owner) {\n // Check if the owner object already has a cache\n var value = owner[this.expando];\n\n // If not, create one\n if (!value) {\n value = {};\n\n // We can accept data for non-element nodes in modern browsers,\n // but we should not, see trac-8335.\n // Always return an empty object.\n if (acceptData(owner)) {\n // If it is a node unlikely to be stringify-ed or looped over\n // use plain assignment\n if (owner.nodeType) {\n owner[this.expando] = value;\n\n // Otherwise secure it in a non-enumerable property\n // configurable must be true to allow the property to be\n // deleted when data is removed\n } else {\n Object.defineProperty(owner, this.expando, {\n value: value,\n configurable: true\n });\n }\n }\n }\n return value;\n },\n set: function set(owner, data, value) {\n var prop,\n cache = this.cache(owner);\n\n // Handle: [ owner, key, value ] args\n // Always use camelCase key (gh-2257)\n if (typeof data === \"string\") {\n cache[camelCase(data)] = value;\n\n // Handle: [ owner, { properties } ] args\n } else {\n // Copy the properties one-by-one to the cache object\n for (prop in data) {\n cache[camelCase(prop)] = data[prop];\n }\n }\n return cache;\n },\n get: function get(owner, key) {\n return key === undefined ? this.cache(owner) :\n // Always use camelCase key (gh-2257)\n owner[this.expando] && owner[this.expando][camelCase(key)];\n },\n access: function access(owner, key, value) {\n // In cases where either:\n //\n // 1. No key was specified\n // 2. A string key was specified, but no value provided\n //\n // Take the \"read\" path and allow the get method to determine\n // which value to return, respectively either:\n //\n // 1. The entire cache object\n // 2. The data stored at the key\n //\n if (key === undefined || key && typeof key === \"string\" && value === undefined) {\n return this.get(owner, key);\n }\n\n // When the key is not a string, or both a key and value\n // are specified, set or extend (existing objects) with either:\n //\n // 1. An object of properties\n // 2. A key and value\n //\n this.set(owner, key, value);\n\n // Since the \"set\" path can have two possible entry points\n // return the expected data based on which path was taken[*]\n return value !== undefined ? value : key;\n },\n remove: function remove(owner, key) {\n var i,\n cache = owner[this.expando];\n if (cache === undefined) {\n return;\n }\n if (key !== undefined) {\n // Support array or space separated string of keys\n if (Array.isArray(key)) {\n // If key is an array of keys...\n // We always set camelCase keys, so remove that.\n key = key.map(camelCase);\n } else {\n key = camelCase(key);\n\n // If a key with the spaces exists, use it.\n // Otherwise, create an array by matching non-whitespace\n key = key in cache ? [key] : key.match(rnothtmlwhite) || [];\n }\n i = key.length;\n while (i--) {\n delete cache[key[i]];\n }\n }\n\n // Remove the expando if there's no more data\n if (key === undefined || jQuery.isEmptyObject(cache)) {\n // Support: Chrome <=35 - 45\n // Webkit & Blink performance suffers when deleting properties\n // from DOM nodes, so set to undefined instead\n // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n if (owner.nodeType) {\n owner[this.expando] = undefined;\n } else {\n delete owner[this.expando];\n }\n }\n },\n hasData: function hasData(owner) {\n var cache = owner[this.expando];\n return cache !== undefined && !jQuery.isEmptyObject(cache);\n }\n };\n var dataPriv = new Data();\n var dataUser = new Data();\n\n //\tImplementation Summary\n //\n //\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n //\t2. Improve the module's maintainability by reducing the storage\n //\t\tpaths to a single mechanism.\n //\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n //\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n //\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n //\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\n var rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n rmultiDash = /[A-Z]/g;\n function getData(data) {\n if (data === \"true\") {\n return true;\n }\n if (data === \"false\") {\n return false;\n }\n if (data === \"null\") {\n return null;\n }\n\n // Only convert to a number if it doesn't change the string\n if (data === +data + \"\") {\n return +data;\n }\n if (rbrace.test(data)) {\n return JSON.parse(data);\n }\n return data;\n }\n function dataAttr(elem, key, data) {\n var name;\n\n // If nothing was found internally, try to fetch any\n // data from the HTML5 data-* attribute\n if (data === undefined && elem.nodeType === 1) {\n name = \"data-\" + key.replace(rmultiDash, \"-$&\").toLowerCase();\n data = elem.getAttribute(name);\n if (typeof data === \"string\") {\n try {\n data = getData(data);\n } catch (e) {}\n\n // Make sure we set the data so it isn't changed later\n dataUser.set(elem, key, data);\n } else {\n data = undefined;\n }\n }\n return data;\n }\n jQuery.extend({\n hasData: function hasData(elem) {\n return dataUser.hasData(elem) || dataPriv.hasData(elem);\n },\n data: function data(elem, name, _data) {\n return dataUser.access(elem, name, _data);\n },\n removeData: function removeData(elem, name) {\n dataUser.remove(elem, name);\n },\n // TODO: Now that all calls to _data and _removeData have been replaced\n // with direct calls to dataPriv methods, these can be deprecated.\n _data: function _data(elem, name, data) {\n return dataPriv.access(elem, name, data);\n },\n _removeData: function _removeData(elem, name) {\n dataPriv.remove(elem, name);\n }\n });\n jQuery.fn.extend({\n data: function data(key, value) {\n var i,\n name,\n data,\n elem = this[0],\n attrs = elem && elem.attributes;\n\n // Gets all values\n if (key === undefined) {\n if (this.length) {\n data = dataUser.get(elem);\n if (elem.nodeType === 1 && !dataPriv.get(elem, \"hasDataAttrs\")) {\n i = attrs.length;\n while (i--) {\n // Support: IE 11 only\n // The attrs elements can be null (trac-14894)\n if (attrs[i]) {\n name = attrs[i].name;\n if (name.indexOf(\"data-\") === 0) {\n name = camelCase(name.slice(5));\n dataAttr(elem, name, data[name]);\n }\n }\n }\n dataPriv.set(elem, \"hasDataAttrs\", true);\n }\n }\n return data;\n }\n\n // Sets multiple values\n if (_typeof$1(key) === \"object\") {\n return this.each(function () {\n dataUser.set(this, key);\n });\n }\n return access(this, function (value) {\n var data;\n\n // The calling jQuery object (element matches) is not empty\n // (and therefore has an element appears at this[ 0 ]) and the\n // `value` parameter was not undefined. An empty jQuery object\n // will result in `undefined` for elem = this[ 0 ] which will\n // throw an exception if an attempt to read a data cache is made.\n if (elem && value === undefined) {\n // Attempt to get data from the cache\n // The key will always be camelCased in Data\n data = dataUser.get(elem, key);\n if (data !== undefined) {\n return data;\n }\n\n // Attempt to \"discover\" the data in\n // HTML5 custom data-* attrs\n data = dataAttr(elem, key);\n if (data !== undefined) {\n return data;\n }\n\n // We tried really hard, but the data doesn't exist.\n return;\n }\n\n // Set the data...\n this.each(function () {\n // We always store the camelCased key\n dataUser.set(this, key, value);\n });\n }, null, value, arguments.length > 1, null, true);\n },\n removeData: function removeData(key) {\n return this.each(function () {\n dataUser.remove(this, key);\n });\n }\n });\n jQuery.extend({\n queue: function queue(elem, type, data) {\n var queue;\n if (elem) {\n type = (type || \"fx\") + \"queue\";\n queue = dataPriv.get(elem, type);\n\n // Speed up dequeue by getting out quickly if this is just a lookup\n if (data) {\n if (!queue || Array.isArray(data)) {\n queue = dataPriv.access(elem, type, jQuery.makeArray(data));\n } else {\n queue.push(data);\n }\n }\n return queue || [];\n }\n },\n dequeue: function dequeue(elem, type) {\n type = type || \"fx\";\n var queue = jQuery.queue(elem, type),\n startLength = queue.length,\n fn = queue.shift(),\n hooks = jQuery._queueHooks(elem, type),\n next = function next() {\n jQuery.dequeue(elem, type);\n };\n\n // If the fx queue is dequeued, always remove the progress sentinel\n if (fn === \"inprogress\") {\n fn = queue.shift();\n startLength--;\n }\n if (fn) {\n // Add a progress sentinel to prevent the fx queue from being\n // automatically dequeued\n if (type === \"fx\") {\n queue.unshift(\"inprogress\");\n }\n\n // Clear up the last queue stop function\n delete hooks.stop;\n fn.call(elem, next, hooks);\n }\n if (!startLength && hooks) {\n hooks.empty.fire();\n }\n },\n // Not public - generate a queueHooks object, or return the current one\n _queueHooks: function _queueHooks(elem, type) {\n var key = type + \"queueHooks\";\n return dataPriv.get(elem, key) || dataPriv.access(elem, key, {\n empty: jQuery.Callbacks(\"once memory\").add(function () {\n dataPriv.remove(elem, [type + \"queue\", key]);\n })\n });\n }\n });\n jQuery.fn.extend({\n queue: function queue(type, data) {\n var setter = 2;\n if (typeof type !== \"string\") {\n data = type;\n type = \"fx\";\n setter--;\n }\n if (arguments.length < setter) {\n return jQuery.queue(this[0], type);\n }\n return data === undefined ? this : this.each(function () {\n var queue = jQuery.queue(this, type, data);\n\n // Ensure a hooks for this queue\n jQuery._queueHooks(this, type);\n if (type === \"fx\" && queue[0] !== \"inprogress\") {\n jQuery.dequeue(this, type);\n }\n });\n },\n dequeue: function dequeue(type) {\n return this.each(function () {\n jQuery.dequeue(this, type);\n });\n },\n clearQueue: function clearQueue(type) {\n return this.queue(type || \"fx\", []);\n },\n // Get a promise resolved when queues of a certain type\n // are emptied (fx is the type by default)\n promise: function promise(type, obj) {\n var tmp,\n count = 1,\n defer = jQuery.Deferred(),\n elements = this,\n i = this.length,\n resolve = function resolve() {\n if (! --count) {\n defer.resolveWith(elements, [elements]);\n }\n };\n if (typeof type !== \"string\") {\n obj = type;\n type = undefined;\n }\n type = type || \"fx\";\n while (i--) {\n tmp = dataPriv.get(elements[i], type + \"queueHooks\");\n if (tmp && tmp.empty) {\n count++;\n tmp.empty.add(resolve);\n }\n }\n resolve();\n return defer.promise(obj);\n }\n });\n var pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source;\n var rcssNum = new RegExp(\"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\");\n var cssExpand = [\"Top\", \"Right\", \"Bottom\", \"Left\"];\n var documentElement = document.documentElement;\n var isAttached = function isAttached(elem) {\n return jQuery.contains(elem.ownerDocument, elem);\n },\n composed = {\n composed: true\n };\n\n // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n // Check attachment across shadow DOM boundaries when possible (gh-3504)\n // Support: iOS 10.0-10.2 only\n // Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n // leading to errors. We need to check for `getRootNode`.\n if (documentElement.getRootNode) {\n isAttached = function isAttached(elem) {\n return jQuery.contains(elem.ownerDocument, elem) || elem.getRootNode(composed) === elem.ownerDocument;\n };\n }\n var isHiddenWithinTree = function isHiddenWithinTree(elem, el) {\n // isHiddenWithinTree might be called from jQuery#filter function;\n // in that case, element will be second argument\n elem = el || elem;\n\n // Inline style trumps all\n return elem.style.display === \"none\" || elem.style.display === \"\" &&\n // Otherwise, check computed style\n // Support: Firefox <=43 - 45\n // Disconnected elements can have computed display: none, so first confirm that elem is\n // in the document.\n isAttached(elem) && jQuery.css(elem, \"display\") === \"none\";\n };\n function adjustCSS(elem, prop, valueParts, tween) {\n var adjusted,\n scale,\n maxIterations = 20,\n currentValue = tween ? function () {\n return tween.cur();\n } : function () {\n return jQuery.css(elem, prop, \"\");\n },\n initial = currentValue(),\n unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? \"\" : \"px\"),\n // Starting value computation is required for potential unit mismatches\n initialInUnit = elem.nodeType && (jQuery.cssNumber[prop] || unit !== \"px\" && +initial) && rcssNum.exec(jQuery.css(elem, prop));\n if (initialInUnit && initialInUnit[3] !== unit) {\n // Support: Firefox <=54\n // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n initial = initial / 2;\n\n // Trust units reported by jQuery.css\n unit = unit || initialInUnit[3];\n\n // Iteratively approximate from a nonzero starting point\n initialInUnit = +initial || 1;\n while (maxIterations--) {\n // Evaluate and update our best guess (doubling guesses that zero out).\n // Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n jQuery.style(elem, prop, initialInUnit + unit);\n if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) {\n maxIterations = 0;\n }\n initialInUnit = initialInUnit / scale;\n }\n initialInUnit = initialInUnit * 2;\n jQuery.style(elem, prop, initialInUnit + unit);\n\n // Make sure we update the tween properties later on\n valueParts = valueParts || [];\n }\n if (valueParts) {\n initialInUnit = +initialInUnit || +initial || 0;\n\n // Apply relative offset (+=/-=) if specified\n adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];\n if (tween) {\n tween.unit = unit;\n tween.start = initialInUnit;\n tween.end = adjusted;\n }\n }\n return adjusted;\n }\n var defaultDisplayMap = {};\n function getDefaultDisplay(elem) {\n var temp,\n doc = elem.ownerDocument,\n nodeName = elem.nodeName,\n display = defaultDisplayMap[nodeName];\n if (display) {\n return display;\n }\n temp = doc.body.appendChild(doc.createElement(nodeName));\n display = jQuery.css(temp, \"display\");\n temp.parentNode.removeChild(temp);\n if (display === \"none\") {\n display = \"block\";\n }\n defaultDisplayMap[nodeName] = display;\n return display;\n }\n function showHide(elements, show) {\n var display,\n elem,\n values = [],\n index = 0,\n length = elements.length;\n\n // Determine new display value for elements that need to change\n for (; index < length; index++) {\n elem = elements[index];\n if (!elem.style) {\n continue;\n }\n display = elem.style.display;\n if (show) {\n // Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n // check is required in this first loop unless we have a nonempty display value (either\n // inline or about-to-be-restored)\n if (display === \"none\") {\n values[index] = dataPriv.get(elem, \"display\") || null;\n if (!values[index]) {\n elem.style.display = \"\";\n }\n }\n if (elem.style.display === \"\" && isHiddenWithinTree(elem)) {\n values[index] = getDefaultDisplay(elem);\n }\n } else {\n if (display !== \"none\") {\n values[index] = \"none\";\n\n // Remember what we're overwriting\n dataPriv.set(elem, \"display\", display);\n }\n }\n }\n\n // Set the display of the elements in a second loop to avoid constant reflow\n for (index = 0; index < length; index++) {\n if (values[index] != null) {\n elements[index].style.display = values[index];\n }\n }\n return elements;\n }\n jQuery.fn.extend({\n show: function show() {\n return showHide(this, true);\n },\n hide: function hide() {\n return showHide(this);\n },\n toggle: function toggle(state) {\n if (typeof state === \"boolean\") {\n return state ? this.show() : this.hide();\n }\n return this.each(function () {\n if (isHiddenWithinTree(this)) {\n jQuery(this).show();\n } else {\n jQuery(this).hide();\n }\n });\n }\n });\n var rcheckableType = /^(?:checkbox|radio)$/i;\n var rtagName = /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i;\n var rscriptType = /^$|^module$|\\/(?:java|ecma)script/i;\n (function () {\n var fragment = document.createDocumentFragment(),\n div = fragment.appendChild(document.createElement(\"div\")),\n input = document.createElement(\"input\");\n\n // Support: Android 4.0 - 4.3 only\n // Check state lost if the name is set (trac-11217)\n // Support: Windows Web Apps (WWA)\n // `name` and `type` must use .setAttribute for WWA (trac-14901)\n input.setAttribute(\"type\", \"radio\");\n input.setAttribute(\"checked\", \"checked\");\n input.setAttribute(\"name\", \"t\");\n div.appendChild(input);\n\n // Support: Android <=4.1 only\n // Older WebKit doesn't clone checked state correctly in fragments\n support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;\n\n // Support: IE <=11 only\n // Make sure textarea (and checkbox) defaultValue is properly cloned\n div.innerHTML = \"<textarea>x</textarea>\";\n support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;\n\n // Support: IE <=9 only\n // IE <=9 replaces <option> tags with their contents when inserted outside of\n // the select element.\n div.innerHTML = \"<option></option>\";\n support.option = !!div.lastChild;\n })();\n\n // We have to close these tags to support XHTML (trac-13200)\n var wrapMap = {\n // XHTML parsers do not magically insert elements in the\n // same way that tag soup parsers do. So we cannot shorten\n // this by omitting <tbody> or other required elements.\n thead: [1, \"<table>\", \"</table>\"],\n col: [2, \"<table><colgroup>\", \"</colgroup></table>\"],\n tr: [2, \"<table><tbody>\", \"</tbody></table>\"],\n td: [3, \"<table><tbody><tr>\", \"</tr></tbody></table>\"],\n _default: [0, \"\", \"\"]\n };\n wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n wrapMap.th = wrapMap.td;\n\n // Support: IE <=9 only\n if (!support.option) {\n wrapMap.optgroup = wrapMap.option = [1, \"<select multiple='multiple'>\", \"</select>\"];\n }\n function getAll(context, tag) {\n // Support: IE <=9 - 11 only\n // Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n var ret;\n if (typeof context.getElementsByTagName !== \"undefined\") {\n ret = context.getElementsByTagName(tag || \"*\");\n } else if (typeof context.querySelectorAll !== \"undefined\") {\n ret = context.querySelectorAll(tag || \"*\");\n } else {\n ret = [];\n }\n if (tag === undefined || tag && nodeName(context, tag)) {\n return jQuery.merge([context], ret);\n }\n return ret;\n }\n\n // Mark scripts as having already been evaluated\n function setGlobalEval(elems, refElements) {\n var i = 0,\n l = elems.length;\n for (; i < l; i++) {\n dataPriv.set(elems[i], \"globalEval\", !refElements || dataPriv.get(refElements[i], \"globalEval\"));\n }\n }\n var rhtml = /<|&#?\\w+;/;\n function buildFragment(elems, context, scripts, selection, ignored) {\n var elem,\n tmp,\n tag,\n wrap,\n attached,\n j,\n fragment = context.createDocumentFragment(),\n nodes = [],\n i = 0,\n l = elems.length;\n for (; i < l; i++) {\n elem = elems[i];\n if (elem || elem === 0) {\n // Add nodes directly\n if (toType(elem) === \"object\") {\n // Support: Android <=4.0 only, PhantomJS 1 only\n // push.apply(_, arraylike) throws on ancient WebKit\n jQuery.merge(nodes, elem.nodeType ? [elem] : elem);\n\n // Convert non-html into a text node\n } else if (!rhtml.test(elem)) {\n nodes.push(context.createTextNode(elem));\n\n // Convert html into DOM nodes\n } else {\n tmp = tmp || fragment.appendChild(context.createElement(\"div\"));\n\n // Deserialize a standard representation\n tag = (rtagName.exec(elem) || [\"\", \"\"])[1].toLowerCase();\n wrap = wrapMap[tag] || wrapMap._default;\n tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];\n\n // Descend through wrappers to the right content\n j = wrap[0];\n while (j--) {\n tmp = tmp.lastChild;\n }\n\n // Support: Android <=4.0 only, PhantomJS 1 only\n // push.apply(_, arraylike) throws on ancient WebKit\n jQuery.merge(nodes, tmp.childNodes);\n\n // Remember the top-level container\n tmp = fragment.firstChild;\n\n // Ensure the created nodes are orphaned (trac-12392)\n tmp.textContent = \"\";\n }\n }\n }\n\n // Remove wrapper from fragment\n fragment.textContent = \"\";\n i = 0;\n while (elem = nodes[i++]) {\n // Skip elements already in the context collection (trac-4087)\n if (selection && jQuery.inArray(elem, selection) > -1) {\n if (ignored) {\n ignored.push(elem);\n }\n continue;\n }\n attached = isAttached(elem);\n\n // Append to fragment\n tmp = getAll(fragment.appendChild(elem), \"script\");\n\n // Preserve script evaluation history\n if (attached) {\n setGlobalEval(tmp);\n }\n\n // Capture executables\n if (scripts) {\n j = 0;\n while (elem = tmp[j++]) {\n if (rscriptType.test(elem.type || \"\")) {\n scripts.push(elem);\n }\n }\n }\n }\n return fragment;\n }\n var rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n function returnTrue() {\n return true;\n }\n function returnFalse() {\n return false;\n }\n function _on(elem, types, selector, data, fn, one) {\n var origFn, type;\n\n // Types can be a map of types/handlers\n if (_typeof$1(types) === \"object\") {\n // ( types-Object, selector, data )\n if (typeof selector !== \"string\") {\n // ( types-Object, data )\n data = data || selector;\n selector = undefined;\n }\n for (type in types) {\n _on(elem, type, selector, data, types[type], one);\n }\n return elem;\n }\n if (data == null && fn == null) {\n // ( types, fn )\n fn = selector;\n data = selector = undefined;\n } else if (fn == null) {\n if (typeof selector === \"string\") {\n // ( types, selector, fn )\n fn = data;\n data = undefined;\n } else {\n // ( types, data, fn )\n fn = data;\n data = selector;\n selector = undefined;\n }\n }\n if (fn === false) {\n fn = returnFalse;\n } else if (!fn) {\n return elem;\n }\n if (one === 1) {\n origFn = fn;\n fn = function fn(event) {\n // Can use an empty set, since event contains the info\n jQuery().off(event);\n return origFn.apply(this, arguments);\n };\n\n // Use same guid so caller can remove using origFn\n fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);\n }\n return elem.each(function () {\n jQuery.event.add(this, types, fn, data, selector);\n });\n }\n\n /*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\n jQuery.event = {\n global: {},\n add: function add(elem, types, handler, data, selector) {\n var handleObjIn,\n eventHandle,\n tmp,\n events,\n t,\n handleObj,\n special,\n handlers,\n type,\n namespaces,\n origType,\n elemData = dataPriv.get(elem);\n\n // Only attach events to objects that accept data\n if (!acceptData(elem)) {\n return;\n }\n\n // Caller can pass in an object of custom data in lieu of the handler\n if (handler.handler) {\n handleObjIn = handler;\n handler = handleObjIn.handler;\n selector = handleObjIn.selector;\n }\n\n // Ensure that invalid selectors throw exceptions at attach time\n // Evaluate against documentElement in case elem is a non-element node (e.g., document)\n if (selector) {\n jQuery.find.matchesSelector(documentElement, selector);\n }\n\n // Make sure that the handler has a unique ID, used to find/remove it later\n if (!handler.guid) {\n handler.guid = jQuery.guid++;\n }\n\n // Init the element's event structure and main handler, if this is the first\n if (!(events = elemData.events)) {\n events = elemData.events = Object.create(null);\n }\n if (!(eventHandle = elemData.handle)) {\n eventHandle = elemData.handle = function (e) {\n // Discard the second event of a jQuery.event.trigger() and\n // when an event is called after a page has unloaded\n return typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : undefined;\n };\n }\n\n // Handle multiple events separated by a space\n types = (types || \"\").match(rnothtmlwhite) || [\"\"];\n t = types.length;\n while (t--) {\n tmp = rtypenamespace.exec(types[t]) || [];\n type = origType = tmp[1];\n namespaces = (tmp[2] || \"\").split(\".\").sort();\n\n // There *must* be a type, no attaching namespace-only handlers\n if (!type) {\n continue;\n }\n\n // If event changes its type, use the special event handlers for the changed type\n special = jQuery.event.special[type] || {};\n\n // If selector defined, determine special event api type, otherwise given type\n type = (selector ? special.delegateType : special.bindType) || type;\n\n // Update special based on newly reset type\n special = jQuery.event.special[type] || {};\n\n // handleObj is passed to all event handlers\n handleObj = jQuery.extend({\n type: type,\n origType: origType,\n data: data,\n handler: handler,\n guid: handler.guid,\n selector: selector,\n needsContext: selector && jQuery.expr.match.needsContext.test(selector),\n namespace: namespaces.join(\".\")\n }, handleObjIn);\n\n // Init the event handler queue if we're the first\n if (!(handlers = events[type])) {\n handlers = events[type] = [];\n handlers.delegateCount = 0;\n\n // Only use addEventListener if the special events handler returns false\n if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {\n if (elem.addEventListener) {\n elem.addEventListener(type, eventHandle);\n }\n }\n }\n if (special.add) {\n special.add.call(elem, handleObj);\n if (!handleObj.handler.guid) {\n handleObj.handler.guid = handler.guid;\n }\n }\n\n // Add to the element's handler list, delegates in front\n if (selector) {\n handlers.splice(handlers.delegateCount++, 0, handleObj);\n } else {\n handlers.push(handleObj);\n }\n\n // Keep track of which events have ever been used, for event optimization\n jQuery.event.global[type] = true;\n }\n },\n // Detach an event or set of events from an element\n remove: function remove(elem, types, handler, selector, mappedTypes) {\n var j,\n origCount,\n tmp,\n events,\n t,\n handleObj,\n special,\n handlers,\n type,\n namespaces,\n origType,\n elemData = dataPriv.hasData(elem) && dataPriv.get(elem);\n if (!elemData || !(events = elemData.events)) {\n return;\n }\n\n // Once for each type.namespace in types; type may be omitted\n types = (types || \"\").match(rnothtmlwhite) || [\"\"];\n t = types.length;\n while (t--) {\n tmp = rtypenamespace.exec(types[t]) || [];\n type = origType = tmp[1];\n namespaces = (tmp[2] || \"\").split(\".\").sort();\n\n // Unbind all events (on this namespace, if provided) for the element\n if (!type) {\n for (type in events) {\n jQuery.event.remove(elem, type + types[t], handler, selector, true);\n }\n continue;\n }\n special = jQuery.event.special[type] || {};\n type = (selector ? special.delegateType : special.bindType) || type;\n handlers = events[type] || [];\n tmp = tmp[2] && new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\");\n\n // Remove matching events\n origCount = j = handlers.length;\n while (j--) {\n handleObj = handlers[j];\n if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector)) {\n handlers.splice(j, 1);\n if (handleObj.selector) {\n handlers.delegateCount--;\n }\n if (special.remove) {\n special.remove.call(elem, handleObj);\n }\n }\n }\n\n // Remove generic event handler if we removed something and no more handlers exist\n // (avoids potential for endless recursion during removal of special event handlers)\n if (origCount && !handlers.length) {\n if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {\n jQuery.removeEvent(elem, type, elemData.handle);\n }\n delete events[type];\n }\n }\n\n // Remove data and the expando if it's no longer used\n if (jQuery.isEmptyObject(events)) {\n dataPriv.remove(elem, \"handle events\");\n }\n },\n dispatch: function dispatch(nativeEvent) {\n var i,\n j,\n ret,\n matched,\n handleObj,\n handlerQueue,\n args = new Array(arguments.length),\n // Make a writable jQuery.Event from the native event object\n event = jQuery.event.fix(nativeEvent),\n handlers = (dataPriv.get(this, \"events\") || Object.create(null))[event.type] || [],\n special = jQuery.event.special[event.type] || {};\n\n // Use the fix-ed jQuery.Event rather than the (read-only) native event\n args[0] = event;\n for (i = 1; i < arguments.length; i++) {\n args[i] = arguments[i];\n }\n event.delegateTarget = this;\n\n // Call the preDispatch hook for the mapped type, and let it bail if desired\n if (special.preDispatch && special.preDispatch.call(this, event) === false) {\n return;\n }\n\n // Determine handlers\n handlerQueue = jQuery.event.handlers.call(this, event, handlers);\n\n // Run delegates first; they may want to stop propagation beneath us\n i = 0;\n while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {\n event.currentTarget = matched.elem;\n j = 0;\n while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {\n // If the event is namespaced, then each handler is only invoked if it is\n // specially universal or its namespaces are a superset of the event's.\n if (!event.rnamespace || handleObj.namespace === false || event.rnamespace.test(handleObj.namespace)) {\n event.handleObj = handleObj;\n event.data = handleObj.data;\n ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);\n if (ret !== undefined) {\n if ((event.result = ret) === false) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n }\n }\n }\n\n // Call the postDispatch hook for the mapped type\n if (special.postDispatch) {\n special.postDispatch.call(this, event);\n }\n return event.result;\n },\n handlers: function handlers(event, _handlers) {\n var i,\n handleObj,\n sel,\n matchedHandlers,\n matchedSelectors,\n handlerQueue = [],\n delegateCount = _handlers.delegateCount,\n cur = event.target;\n\n // Find delegate handlers\n if (delegateCount &&\n // Support: IE <=9\n // Black-hole SVG <use> instance trees (trac-13180)\n cur.nodeType &&\n // Support: Firefox <=42\n // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n // Support: IE 11 only\n // ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n !(event.type === \"click\" && event.button >= 1)) {\n for (; cur !== this; cur = cur.parentNode || this) {\n // Don't check non-elements (trac-13208)\n // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n if (cur.nodeType === 1 && !(event.type === \"click\" && cur.disabled === true)) {\n matchedHandlers = [];\n matchedSelectors = {};\n for (i = 0; i < delegateCount; i++) {\n handleObj = _handlers[i];\n\n // Don't conflict with Object.prototype properties (trac-13203)\n sel = handleObj.selector + \" \";\n if (matchedSelectors[sel] === undefined) {\n matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;\n }\n if (matchedSelectors[sel]) {\n matchedHandlers.push(handleObj);\n }\n }\n if (matchedHandlers.length) {\n handlerQueue.push({\n elem: cur,\n handlers: matchedHandlers\n });\n }\n }\n }\n }\n\n // Add the remaining (directly-bound) handlers\n cur = this;\n if (delegateCount < _handlers.length) {\n handlerQueue.push({\n elem: cur,\n handlers: _handlers.slice(delegateCount)\n });\n }\n return handlerQueue;\n },\n addProp: function addProp(name, hook) {\n Object.defineProperty(jQuery.Event.prototype, name, {\n enumerable: true,\n configurable: true,\n get: isFunction(hook) ? function () {\n if (this.originalEvent) {\n return hook(this.originalEvent);\n }\n } : function () {\n if (this.originalEvent) {\n return this.originalEvent[name];\n }\n },\n set: function set(value) {\n Object.defineProperty(this, name, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: value\n });\n }\n });\n },\n fix: function fix(originalEvent) {\n return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent);\n },\n special: {\n load: {\n // Prevent triggered image.load events from bubbling to window.load\n noBubble: true\n },\n click: {\n // Utilize native event to ensure correct state for checkable inputs\n setup: function setup(data) {\n // For mutual compressibility with _default, replace `this` access with a local var.\n // `|| data` is dead code meant only to preserve the variable through minification.\n var el = this || data;\n\n // Claim the first handler\n if (rcheckableType.test(el.type) && el.click && nodeName(el, \"input\")) {\n // dataPriv.set( el, \"click\", ... )\n leverageNative(el, \"click\", true);\n }\n\n // Return false to allow normal processing in the caller\n return false;\n },\n trigger: function trigger(data) {\n // For mutual compressibility with _default, replace `this` access with a local var.\n // `|| data` is dead code meant only to preserve the variable through minification.\n var el = this || data;\n\n // Force setup before triggering a click\n if (rcheckableType.test(el.type) && el.click && nodeName(el, \"input\")) {\n leverageNative(el, \"click\");\n }\n\n // Return non-false to allow normal event-path propagation\n return true;\n },\n // For cross-browser consistency, suppress native .click() on links\n // Also prevent it if we're currently inside a leveraged native-event stack\n _default: function _default(event) {\n var target = event.target;\n return rcheckableType.test(target.type) && target.click && nodeName(target, \"input\") && dataPriv.get(target, \"click\") || nodeName(target, \"a\");\n }\n },\n beforeunload: {\n postDispatch: function postDispatch(event) {\n // Support: Firefox 20+\n // Firefox doesn't alert if the returnValue field is not set.\n if (event.result !== undefined && event.originalEvent) {\n event.originalEvent.returnValue = event.result;\n }\n }\n }\n }\n };\n\n // Ensure the presence of an event listener that handles manually-triggered\n // synthetic events by interrupting progress until reinvoked in response to\n // *native* events that it fires directly, ensuring that state changes have\n // already occurred before other listeners are invoked.\n function leverageNative(el, type, isSetup) {\n // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add\n if (!isSetup) {\n if (dataPriv.get(el, type) === undefined) {\n jQuery.event.add(el, type, returnTrue);\n }\n return;\n }\n\n // Register the controller as a special universal handler for all event namespaces\n dataPriv.set(el, type, false);\n jQuery.event.add(el, type, {\n namespace: false,\n handler: function handler(event) {\n var result,\n saved = dataPriv.get(this, type);\n if (event.isTrigger & 1 && this[type]) {\n // Interrupt processing of the outer synthetic .trigger()ed event\n if (!saved) {\n // Store arguments for use when handling the inner native event\n // There will always be at least one argument (an event object), so this array\n // will not be confused with a leftover capture object.\n saved = _slice.call(arguments);\n dataPriv.set(this, type, saved);\n\n // Trigger the native event and capture its result\n this[type]();\n result = dataPriv.get(this, type);\n dataPriv.set(this, type, false);\n if (saved !== result) {\n // Cancel the outer synthetic event\n event.stopImmediatePropagation();\n event.preventDefault();\n return result;\n }\n\n // If this is an inner synthetic event for an event with a bubbling surrogate\n // (focus or blur), assume that the surrogate already propagated from triggering\n // the native event and prevent that from happening again here.\n // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n // bubbling surrogate propagates *after* the non-bubbling base), but that seems\n // less bad than duplication.\n } else if ((jQuery.event.special[type] || {}).delegateType) {\n event.stopPropagation();\n }\n\n // If this is a native event triggered above, everything is now in order\n // Fire an inner synthetic event with the original arguments\n } else if (saved) {\n // ...and capture the result\n dataPriv.set(this, type, jQuery.event.trigger(saved[0], saved.slice(1), this));\n\n // Abort handling of the native event by all jQuery handlers while allowing\n // native handlers on the same element to run. On target, this is achieved\n // by stopping immediate propagation just on the jQuery event. However,\n // the native event is re-wrapped by a jQuery one on each level of the\n // propagation so the only way to stop it for jQuery is to stop it for\n // everyone via native `stopPropagation()`. This is not a problem for\n // focus/blur which don't bubble, but it does also stop click on checkboxes\n // and radios. We accept this limitation.\n event.stopPropagation();\n event.isImmediatePropagationStopped = returnTrue;\n }\n }\n });\n }\n jQuery.removeEvent = function (elem, type, handle) {\n // This \"if\" is needed for plain objects\n if (elem.removeEventListener) {\n elem.removeEventListener(type, handle);\n }\n };\n jQuery.Event = function (src, props) {\n // Allow instantiation without the 'new' keyword\n if (!(this instanceof jQuery.Event)) {\n return new jQuery.Event(src, props);\n }\n\n // Event object\n if (src && src.type) {\n this.originalEvent = src;\n this.type = src.type;\n\n // Events bubbling up the document may have been marked as prevented\n // by a handler lower down the tree; reflect the correct value.\n this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined &&\n // Support: Android <=2.3 only\n src.returnValue === false ? returnTrue : returnFalse;\n\n // Create target properties\n // Support: Safari <=6 - 7 only\n // Target should not be a text node (trac-504, trac-13143)\n this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target;\n this.currentTarget = src.currentTarget;\n this.relatedTarget = src.relatedTarget;\n\n // Event type\n } else {\n this.type = src;\n }\n\n // Put explicitly provided properties onto the event object\n if (props) {\n jQuery.extend(this, props);\n }\n\n // Create a timestamp if incoming event doesn't have one\n this.timeStamp = src && src.timeStamp || Date.now();\n\n // Mark it as fixed\n this[jQuery.expando] = true;\n };\n\n // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\n jQuery.Event.prototype = {\n constructor: jQuery.Event,\n isDefaultPrevented: returnFalse,\n isPropagationStopped: returnFalse,\n isImmediatePropagationStopped: returnFalse,\n isSimulated: false,\n preventDefault: function preventDefault() {\n var e = this.originalEvent;\n this.isDefaultPrevented = returnTrue;\n if (e && !this.isSimulated) {\n e.preventDefault();\n }\n },\n stopPropagation: function stopPropagation() {\n var e = this.originalEvent;\n this.isPropagationStopped = returnTrue;\n if (e && !this.isSimulated) {\n e.stopPropagation();\n }\n },\n stopImmediatePropagation: function stopImmediatePropagation() {\n var e = this.originalEvent;\n this.isImmediatePropagationStopped = returnTrue;\n if (e && !this.isSimulated) {\n e.stopImmediatePropagation();\n }\n this.stopPropagation();\n }\n };\n\n // Includes all common event props including KeyEvent and MouseEvent specific props\n jQuery.each({\n altKey: true,\n bubbles: true,\n cancelable: true,\n changedTouches: true,\n ctrlKey: true,\n detail: true,\n eventPhase: true,\n metaKey: true,\n pageX: true,\n pageY: true,\n shiftKey: true,\n view: true,\n \"char\": true,\n code: true,\n charCode: true,\n key: true,\n keyCode: true,\n button: true,\n buttons: true,\n clientX: true,\n clientY: true,\n offsetX: true,\n offsetY: true,\n pointerId: true,\n pointerType: true,\n screenX: true,\n screenY: true,\n targetTouches: true,\n toElement: true,\n touches: true,\n which: true\n }, jQuery.event.addProp);\n jQuery.each({\n focus: \"focusin\",\n blur: \"focusout\"\n }, function (type, delegateType) {\n function focusMappedHandler(nativeEvent) {\n if (document.documentMode) {\n // Support: IE 11+\n // Attach a single focusin/focusout handler on the document while someone wants\n // focus/blur. This is because the former are synchronous in IE while the latter\n // are async. In other browsers, all those handlers are invoked synchronously.\n\n // `handle` from private data would already wrap the event, but we need\n // to change the `type` here.\n var handle = dataPriv.get(this, \"handle\"),\n event = jQuery.event.fix(nativeEvent);\n event.type = nativeEvent.type === \"focusin\" ? \"focus\" : \"blur\";\n event.isSimulated = true;\n\n // First, handle focusin/focusout\n handle(nativeEvent);\n\n // ...then, handle focus/blur\n //\n // focus/blur don't bubble while focusin/focusout do; simulate the former by only\n // invoking the handler at the lower level.\n if (event.target === event.currentTarget) {\n // The setup part calls `leverageNative`, which, in turn, calls\n // `jQuery.event.add`, so event handle will already have been set\n // by this point.\n handle(event);\n }\n } else {\n // For non-IE browsers, attach a single capturing handler on the document\n // while someone wants focusin/focusout.\n jQuery.event.simulate(delegateType, nativeEvent.target, jQuery.event.fix(nativeEvent));\n }\n }\n jQuery.event.special[type] = {\n // Utilize native event if possible so blur/focus sequence is correct\n setup: function setup() {\n var attaches;\n\n // Claim the first handler\n // dataPriv.set( this, \"focus\", ... )\n // dataPriv.set( this, \"blur\", ... )\n leverageNative(this, type, true);\n if (document.documentMode) {\n // Support: IE 9 - 11+\n // We use the same native handler for focusin & focus (and focusout & blur)\n // so we need to coordinate setup & teardown parts between those events.\n // Use `delegateType` as the key as `type` is already used by `leverageNative`.\n attaches = dataPriv.get(this, delegateType);\n if (!attaches) {\n this.addEventListener(delegateType, focusMappedHandler);\n }\n dataPriv.set(this, delegateType, (attaches || 0) + 1);\n } else {\n // Return false to allow normal processing in the caller\n return false;\n }\n },\n trigger: function trigger() {\n // Force setup before trigger\n leverageNative(this, type);\n\n // Return non-false to allow normal event-path propagation\n return true;\n },\n teardown: function teardown() {\n var attaches;\n if (document.documentMode) {\n attaches = dataPriv.get(this, delegateType) - 1;\n if (!attaches) {\n this.removeEventListener(delegateType, focusMappedHandler);\n dataPriv.remove(this, delegateType);\n } else {\n dataPriv.set(this, delegateType, attaches);\n }\n } else {\n // Return false to indicate standard teardown should be applied\n return false;\n }\n },\n // Suppress native focus or blur if we're currently inside\n // a leveraged native-event stack\n _default: function _default(event) {\n return dataPriv.get(event.target, type);\n },\n delegateType: delegateType\n };\n\n // Support: Firefox <=44\n // Firefox doesn't have focus(in | out) events\n // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n //\n // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n // focus(in | out) events fire after focus & blur events,\n // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n //\n // Support: IE 9 - 11+\n // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,\n // attach a single handler for both events in IE.\n jQuery.event.special[delegateType] = {\n setup: function setup() {\n // Handle: regular nodes (via `this.ownerDocument`), window\n // (via `this.document`) & document (via `this`).\n var doc = this.ownerDocument || this.document || this,\n dataHolder = document.documentMode ? this : doc,\n attaches = dataPriv.get(dataHolder, delegateType);\n\n // Support: IE 9 - 11+\n // We use the same native handler for focusin & focus (and focusout & blur)\n // so we need to coordinate setup & teardown parts between those events.\n // Use `delegateType` as the key as `type` is already used by `leverageNative`.\n if (!attaches) {\n if (document.documentMode) {\n this.addEventListener(delegateType, focusMappedHandler);\n } else {\n doc.addEventListener(type, focusMappedHandler, true);\n }\n }\n dataPriv.set(dataHolder, delegateType, (attaches || 0) + 1);\n },\n teardown: function teardown() {\n var doc = this.ownerDocument || this.document || this,\n dataHolder = document.documentMode ? this : doc,\n attaches = dataPriv.get(dataHolder, delegateType) - 1;\n if (!attaches) {\n if (document.documentMode) {\n this.removeEventListener(delegateType, focusMappedHandler);\n } else {\n doc.removeEventListener(type, focusMappedHandler, true);\n }\n dataPriv.remove(dataHolder, delegateType);\n } else {\n dataPriv.set(dataHolder, delegateType, attaches);\n }\n }\n };\n });\n\n // Create mouseenter/leave events using mouseover/out and event-time checks\n // so that event delegation works in jQuery.\n // Do the same for pointerenter/pointerleave and pointerover/pointerout\n //\n // Support: Safari 7 only\n // Safari sends mouseenter too often; see:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n // for the description of the bug (it existed in older Chrome versions as well).\n jQuery.each({\n mouseenter: \"mouseover\",\n mouseleave: \"mouseout\",\n pointerenter: \"pointerover\",\n pointerleave: \"pointerout\"\n }, function (orig, fix) {\n jQuery.event.special[orig] = {\n delegateType: fix,\n bindType: fix,\n handle: function handle(event) {\n var ret,\n target = this,\n related = event.relatedTarget,\n handleObj = event.handleObj;\n\n // For mouseenter/leave call the handler if related is outside the target.\n // NB: No relatedTarget if the mouse left/entered the browser window\n if (!related || related !== target && !jQuery.contains(target, related)) {\n event.type = handleObj.origType;\n ret = handleObj.handler.apply(this, arguments);\n event.type = fix;\n }\n return ret;\n }\n };\n });\n jQuery.fn.extend({\n on: function on(types, selector, data, fn) {\n return _on(this, types, selector, data, fn);\n },\n one: function one(types, selector, data, fn) {\n return _on(this, types, selector, data, fn, 1);\n },\n off: function off(types, selector, fn) {\n var handleObj, type;\n if (types && types.preventDefault && types.handleObj) {\n // ( event ) dispatched jQuery.Event\n handleObj = types.handleObj;\n jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);\n return this;\n }\n if (_typeof$1(types) === \"object\") {\n // ( types-object [, selector] )\n for (type in types) {\n this.off(type, selector, types[type]);\n }\n return this;\n }\n if (selector === false || typeof selector === \"function\") {\n // ( types [, fn] )\n fn = selector;\n selector = undefined;\n }\n if (fn === false) {\n fn = returnFalse;\n }\n return this.each(function () {\n jQuery.event.remove(this, types, fn, selector);\n });\n }\n });\n var\n // Support: IE <=10 - 11, Edge 12 - 13 only\n // In IE/Edge using regex groups here causes severe slowdowns.\n // See https://connect.microsoft.com/IE/feedback/details/1736512/\n rnoInnerhtml = /<script|<style|<link/i,\n // checked=\"checked\" or checked\n rchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n rcleanScript = /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;\n\n // Prefer a tbody over its parent table for containing new rows\n function manipulationTarget(elem, content) {\n if (nodeName(elem, \"table\") && nodeName(content.nodeType !== 11 ? content : content.firstChild, \"tr\")) {\n return jQuery(elem).children(\"tbody\")[0] || elem;\n }\n return elem;\n }\n\n // Replace/restore the type attribute of script elements for safe DOM manipulation\n function disableScript(elem) {\n elem.type = (elem.getAttribute(\"type\") !== null) + \"/\" + elem.type;\n return elem;\n }\n function restoreScript(elem) {\n if ((elem.type || \"\").slice(0, 5) === \"true/\") {\n elem.type = elem.type.slice(5);\n } else {\n elem.removeAttribute(\"type\");\n }\n return elem;\n }\n function cloneCopyEvent(src, dest) {\n var i, l, type, pdataOld, udataOld, udataCur, events;\n if (dest.nodeType !== 1) {\n return;\n }\n\n // 1. Copy private data: events, handlers, etc.\n if (dataPriv.hasData(src)) {\n pdataOld = dataPriv.get(src);\n events = pdataOld.events;\n if (events) {\n dataPriv.remove(dest, \"handle events\");\n for (type in events) {\n for (i = 0, l = events[type].length; i < l; i++) {\n jQuery.event.add(dest, type, events[type][i]);\n }\n }\n }\n }\n\n // 2. Copy user data\n if (dataUser.hasData(src)) {\n udataOld = dataUser.access(src);\n udataCur = jQuery.extend({}, udataOld);\n dataUser.set(dest, udataCur);\n }\n }\n\n // Fix IE bugs, see support tests\n function fixInput(src, dest) {\n var nodeName = dest.nodeName.toLowerCase();\n\n // Fails to persist the checked state of a cloned checkbox or radio button.\n if (nodeName === \"input\" && rcheckableType.test(src.type)) {\n dest.checked = src.checked;\n\n // Fails to return the selected option to the default selected state when cloning options\n } else if (nodeName === \"input\" || nodeName === \"textarea\") {\n dest.defaultValue = src.defaultValue;\n }\n }\n function domManip(collection, args, callback, ignored) {\n // Flatten any nested arrays\n args = flat(args);\n var fragment,\n first,\n scripts,\n hasScripts,\n node,\n doc,\n i = 0,\n l = collection.length,\n iNoClone = l - 1,\n value = args[0],\n valueIsFunction = isFunction(value);\n\n // We can't cloneNode fragments that contain checked, in WebKit\n if (valueIsFunction || l > 1 && typeof value === \"string\" && !support.checkClone && rchecked.test(value)) {\n return collection.each(function (index) {\n var self = collection.eq(index);\n if (valueIsFunction) {\n args[0] = value.call(this, index, self.html());\n }\n domManip(self, args, callback, ignored);\n });\n }\n if (l) {\n fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);\n first = fragment.firstChild;\n if (fragment.childNodes.length === 1) {\n fragment = first;\n }\n\n // Require either new content or an interest in ignored elements to invoke the callback\n if (first || ignored) {\n scripts = jQuery.map(getAll(fragment, \"script\"), disableScript);\n hasScripts = scripts.length;\n\n // Use the original fragment for the last item\n // instead of the first because it can end up\n // being emptied incorrectly in certain situations (trac-8070).\n for (; i < l; i++) {\n node = fragment;\n if (i !== iNoClone) {\n node = jQuery.clone(node, true, true);\n\n // Keep references to cloned scripts for later restoration\n if (hasScripts) {\n // Support: Android <=4.0 only, PhantomJS 1 only\n // push.apply(_, arraylike) throws on ancient WebKit\n jQuery.merge(scripts, getAll(node, \"script\"));\n }\n }\n callback.call(collection[i], node, i);\n }\n if (hasScripts) {\n doc = scripts[scripts.length - 1].ownerDocument;\n\n // Re-enable scripts\n jQuery.map(scripts, restoreScript);\n\n // Evaluate executable scripts on first document insertion\n for (i = 0; i < hasScripts; i++) {\n node = scripts[i];\n if (rscriptType.test(node.type || \"\") && !dataPriv.access(node, \"globalEval\") && jQuery.contains(doc, node)) {\n if (node.src && (node.type || \"\").toLowerCase() !== \"module\") {\n // Optional AJAX dependency, but won't run scripts if not present\n if (jQuery._evalUrl && !node.noModule) {\n jQuery._evalUrl(node.src, {\n nonce: node.nonce || node.getAttribute(\"nonce\")\n }, doc);\n }\n } else {\n // Unwrap a CDATA section containing script contents. This shouldn't be\n // needed as in XML documents they're already not visible when\n // inspecting element contents and in HTML documents they have no\n // meaning but we're preserving that logic for backwards compatibility.\n // This will be removed completely in 4.0. See gh-4904.\n DOMEval(node.textContent.replace(rcleanScript, \"\"), node, doc);\n }\n }\n }\n }\n }\n }\n return collection;\n }\n function _remove(elem, selector, keepData) {\n var node,\n nodes = selector ? jQuery.filter(selector, elem) : elem,\n i = 0;\n for (; (node = nodes[i]) != null; i++) {\n if (!keepData && node.nodeType === 1) {\n jQuery.cleanData(getAll(node));\n }\n if (node.parentNode) {\n if (keepData && isAttached(node)) {\n setGlobalEval(getAll(node, \"script\"));\n }\n node.parentNode.removeChild(node);\n }\n }\n return elem;\n }\n jQuery.extend({\n htmlPrefilter: function htmlPrefilter(html) {\n return html;\n },\n clone: function clone(elem, dataAndEvents, deepDataAndEvents) {\n var i,\n l,\n srcElements,\n destElements,\n clone = elem.cloneNode(true),\n inPage = isAttached(elem);\n\n // Fix IE cloning issues\n if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {\n // We eschew jQuery#find here for performance reasons:\n // https://jsperf.com/getall-vs-sizzle/2\n destElements = getAll(clone);\n srcElements = getAll(elem);\n for (i = 0, l = srcElements.length; i < l; i++) {\n fixInput(srcElements[i], destElements[i]);\n }\n }\n\n // Copy the events from the original to the clone\n if (dataAndEvents) {\n if (deepDataAndEvents) {\n srcElements = srcElements || getAll(elem);\n destElements = destElements || getAll(clone);\n for (i = 0, l = srcElements.length; i < l; i++) {\n cloneCopyEvent(srcElements[i], destElements[i]);\n }\n } else {\n cloneCopyEvent(elem, clone);\n }\n }\n\n // Preserve script evaluation history\n destElements = getAll(clone, \"script\");\n if (destElements.length > 0) {\n setGlobalEval(destElements, !inPage && getAll(elem, \"script\"));\n }\n\n // Return the cloned set\n return clone;\n },\n cleanData: function cleanData(elems) {\n var data,\n elem,\n type,\n special = jQuery.event.special,\n i = 0;\n for (; (elem = elems[i]) !== undefined; i++) {\n if (acceptData(elem)) {\n if (data = elem[dataPriv.expando]) {\n if (data.events) {\n for (type in data.events) {\n if (special[type]) {\n jQuery.event.remove(elem, type);\n\n // This is a shortcut to avoid jQuery.event.remove's overhead\n } else {\n jQuery.removeEvent(elem, type, data.handle);\n }\n }\n }\n\n // Support: Chrome <=35 - 45+\n // Assign undefined instead of using delete, see Data#remove\n elem[dataPriv.expando] = undefined;\n }\n if (elem[dataUser.expando]) {\n // Support: Chrome <=35 - 45+\n // Assign undefined instead of using delete, see Data#remove\n elem[dataUser.expando] = undefined;\n }\n }\n }\n }\n });\n jQuery.fn.extend({\n detach: function detach(selector) {\n return _remove(this, selector, true);\n },\n remove: function remove(selector) {\n return _remove(this, selector);\n },\n text: function text(value) {\n return access(this, function (value) {\n return value === undefined ? jQuery.text(this) : this.empty().each(function () {\n if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {\n this.textContent = value;\n }\n });\n }, null, value, arguments.length);\n },\n append: function append() {\n return domManip(this, arguments, function (elem) {\n if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {\n var target = manipulationTarget(this, elem);\n target.appendChild(elem);\n }\n });\n },\n prepend: function prepend() {\n return domManip(this, arguments, function (elem) {\n if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {\n var target = manipulationTarget(this, elem);\n target.insertBefore(elem, target.firstChild);\n }\n });\n },\n before: function before() {\n return domManip(this, arguments, function (elem) {\n if (this.parentNode) {\n this.parentNode.insertBefore(elem, this);\n }\n });\n },\n after: function after() {\n return domManip(this, arguments, function (elem) {\n if (this.parentNode) {\n this.parentNode.insertBefore(elem, this.nextSibling);\n }\n });\n },\n empty: function empty() {\n var elem,\n i = 0;\n for (; (elem = this[i]) != null; i++) {\n if (elem.nodeType === 1) {\n // Prevent memory leaks\n jQuery.cleanData(getAll(elem, false));\n\n // Remove any remaining nodes\n elem.textContent = \"\";\n }\n }\n return this;\n },\n clone: function clone(dataAndEvents, deepDataAndEvents) {\n dataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n return this.map(function () {\n return jQuery.clone(this, dataAndEvents, deepDataAndEvents);\n });\n },\n html: function html(value) {\n return access(this, function (value) {\n var elem = this[0] || {},\n i = 0,\n l = this.length;\n if (value === undefined && elem.nodeType === 1) {\n return elem.innerHTML;\n }\n\n // See if we can take a shortcut and just use innerHTML\n if (typeof value === \"string\" && !rnoInnerhtml.test(value) && !wrapMap[(rtagName.exec(value) || [\"\", \"\"])[1].toLowerCase()]) {\n value = jQuery.htmlPrefilter(value);\n try {\n for (; i < l; i++) {\n elem = this[i] || {};\n\n // Remove element nodes and prevent memory leaks\n if (elem.nodeType === 1) {\n jQuery.cleanData(getAll(elem, false));\n elem.innerHTML = value;\n }\n }\n elem = 0;\n\n // If using innerHTML throws an exception, use the fallback method\n } catch (e) {}\n }\n if (elem) {\n this.empty().append(value);\n }\n }, null, value, arguments.length);\n },\n replaceWith: function replaceWith() {\n var ignored = [];\n\n // Make the changes, replacing each non-ignored context element with the new content\n return domManip(this, arguments, function (elem) {\n var parent = this.parentNode;\n if (jQuery.inArray(this, ignored) < 0) {\n jQuery.cleanData(getAll(this));\n if (parent) {\n parent.replaceChild(elem, this);\n }\n }\n\n // Force callback invocation\n }, ignored);\n }\n });\n jQuery.each({\n appendTo: \"append\",\n prependTo: \"prepend\",\n insertBefore: \"before\",\n insertAfter: \"after\",\n replaceAll: \"replaceWith\"\n }, function (name, original) {\n jQuery.fn[name] = function (selector) {\n var elems,\n ret = [],\n insert = jQuery(selector),\n last = insert.length - 1,\n i = 0;\n for (; i <= last; i++) {\n elems = i === last ? this : this.clone(true);\n jQuery(insert[i])[original](elems);\n\n // Support: Android <=4.0 only, PhantomJS 1 only\n // .get() because push.apply(_, arraylike) throws on ancient WebKit\n push.apply(ret, elems.get());\n }\n return this.pushStack(ret);\n };\n });\n var rnumnonpx = new RegExp(\"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\");\n var rcustomProp = /^--/;\n var getStyles = function getStyles(elem) {\n // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n // IE throws on elements created in popups\n // FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n var view = elem.ownerDocument.defaultView;\n if (!view || !view.opener) {\n view = window;\n }\n return view.getComputedStyle(elem);\n };\n var swap = function swap(elem, options, callback) {\n var ret,\n name,\n old = {};\n\n // Remember the old values, and insert the new ones\n for (name in options) {\n old[name] = elem.style[name];\n elem.style[name] = options[name];\n }\n ret = callback.call(elem);\n\n // Revert the old values\n for (name in options) {\n elem.style[name] = old[name];\n }\n return ret;\n };\n var rboxStyle = new RegExp(cssExpand.join(\"|\"), \"i\");\n (function () {\n // Executing both pixelPosition & boxSizingReliable tests require only one layout\n // so they're executed at the same time to save the second computation.\n function computeStyleTests() {\n // This is a singleton, we need to execute it only once\n if (!div) {\n return;\n }\n container.style.cssText = \"position:absolute;left:-11111px;width:60px;\" + \"margin-top:1px;padding:0;border:0\";\n div.style.cssText = \"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" + \"margin:auto;border:1px;padding:1px;\" + \"width:60%;top:1%\";\n documentElement.appendChild(container).appendChild(div);\n var divStyle = window.getComputedStyle(div);\n pixelPositionVal = divStyle.top !== \"1%\";\n\n // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12;\n\n // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n // Some styles come back with percentage values, even though they shouldn't\n div.style.right = \"60%\";\n pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36;\n\n // Support: IE 9 - 11 only\n // Detect misreporting of content dimensions for box-sizing:border-box elements\n boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36;\n\n // Support: IE 9 only\n // Detect overflow:scroll screwiness (gh-3699)\n // Support: Chrome <=64\n // Don't get tricked when zoom affects offsetWidth (gh-4029)\n div.style.position = \"absolute\";\n scrollboxSizeVal = roundPixelMeasures(div.offsetWidth / 3) === 12;\n documentElement.removeChild(container);\n\n // Nullify the div so it wouldn't be stored in the memory and\n // it will also be a sign that checks already performed\n div = null;\n }\n function roundPixelMeasures(measure) {\n return Math.round(parseFloat(measure));\n }\n var pixelPositionVal,\n boxSizingReliableVal,\n scrollboxSizeVal,\n pixelBoxStylesVal,\n reliableTrDimensionsVal,\n reliableMarginLeftVal,\n container = document.createElement(\"div\"),\n div = document.createElement(\"div\");\n\n // Finish early in limited (non-browser) environments\n if (!div.style) {\n return;\n }\n\n // Support: IE <=9 - 11 only\n // Style of cloned element affects source element cloned (trac-8908)\n div.style.backgroundClip = \"content-box\";\n div.cloneNode(true).style.backgroundClip = \"\";\n support.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n jQuery.extend(support, {\n boxSizingReliable: function boxSizingReliable() {\n computeStyleTests();\n return boxSizingReliableVal;\n },\n pixelBoxStyles: function pixelBoxStyles() {\n computeStyleTests();\n return pixelBoxStylesVal;\n },\n pixelPosition: function pixelPosition() {\n computeStyleTests();\n return pixelPositionVal;\n },\n reliableMarginLeft: function reliableMarginLeft() {\n computeStyleTests();\n return reliableMarginLeftVal;\n },\n scrollboxSize: function scrollboxSize() {\n computeStyleTests();\n return scrollboxSizeVal;\n },\n // Support: IE 9 - 11+, Edge 15 - 18+\n // IE/Edge misreport `getComputedStyle` of table rows with width/height\n // set in CSS while `offset*` properties report correct values.\n // Behavior in IE 9 is more subtle than in newer versions & it passes\n // some versions of this test; make sure not to make it pass there!\n //\n // Support: Firefox 70+\n // Only Firefox includes border widths\n // in computed dimensions. (gh-4529)\n reliableTrDimensions: function reliableTrDimensions() {\n var table, tr, trChild, trStyle;\n if (reliableTrDimensionsVal == null) {\n table = document.createElement(\"table\");\n tr = document.createElement(\"tr\");\n trChild = document.createElement(\"div\");\n table.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n tr.style.cssText = \"box-sizing:content-box;border:1px solid\";\n\n // Support: Chrome 86+\n // Height set through cssText does not get applied.\n // Computed height then comes back as 0.\n tr.style.height = \"1px\";\n trChild.style.height = \"9px\";\n\n // Support: Android 8 Chrome 86+\n // In our bodyBackground.html iframe,\n // display for all div elements is set to \"inline\",\n // which causes a problem only in Android 8 Chrome 86.\n // Ensuring the div is `display: block`\n // gets around this issue.\n trChild.style.display = \"block\";\n documentElement.appendChild(table).appendChild(tr).appendChild(trChild);\n trStyle = window.getComputedStyle(tr);\n reliableTrDimensionsVal = parseInt(trStyle.height, 10) + parseInt(trStyle.borderTopWidth, 10) + parseInt(trStyle.borderBottomWidth, 10) === tr.offsetHeight;\n documentElement.removeChild(table);\n }\n return reliableTrDimensionsVal;\n }\n });\n })();\n function curCSS(elem, name, computed) {\n var width,\n minWidth,\n maxWidth,\n ret,\n isCustomProp = rcustomProp.test(name),\n // Support: Firefox 51+\n // Retrieving style before computed somehow\n // fixes an issue with getting wrong values\n // on detached elements\n style = elem.style;\n computed = computed || getStyles(elem);\n\n // getPropertyValue is needed for:\n // .css('filter') (IE 9 only, trac-12537)\n // .css('--customProperty) (gh-3144)\n if (computed) {\n // Support: IE <=9 - 11+\n // IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n // it's only available as `\"cssFloat\"`. We no longer modify properties\n // sent to `.css()` apart from camelCasing, so we need to check both.\n // Normally, this would create difference in behavior: if\n // `getPropertyValue` returns an empty string, the value returned\n // by `.css()` would be `undefined`. This is usually the case for\n // disconnected elements. However, in IE even disconnected elements\n // with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n ret = computed.getPropertyValue(name) || computed[name];\n if (isCustomProp && ret) {\n // Support: Firefox 105+, Chrome <=105+\n // Spec requires trimming whitespace for custom properties (gh-4926).\n // Firefox only trims leading whitespace. Chrome just collapses\n // both leading & trailing whitespace to a single space.\n //\n // Fall back to `undefined` if empty string returned.\n // This collapses a missing definition with property defined\n // and set to an empty string but there's no standard API\n // allowing us to differentiate them without a performance penalty\n // and returning `undefined` aligns with older jQuery.\n //\n // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n // as whitespace while CSS does not, but this is not a problem\n // because CSS preprocessing replaces them with U+000A LINE FEED\n // (which *is* CSS whitespace)\n // https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n ret = ret.replace(rtrimCSS, \"$1\") || undefined;\n }\n if (ret === \"\" && !isAttached(elem)) {\n ret = jQuery.style(elem, name);\n }\n\n // A tribute to the \"awesome hack by Dean Edwards\"\n // Android Browser returns percentage for some values,\n // but width seems to be reliably pixels.\n // This is against the CSSOM draft spec:\n // https://drafts.csswg.org/cssom/#resolved-values\n if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) {\n // Remember the original values\n width = style.width;\n minWidth = style.minWidth;\n maxWidth = style.maxWidth;\n\n // Put in the new values to get a computed value out\n style.minWidth = style.maxWidth = style.width = ret;\n ret = computed.width;\n\n // Revert the changed values\n style.width = width;\n style.minWidth = minWidth;\n style.maxWidth = maxWidth;\n }\n }\n return ret !== undefined ?\n // Support: IE <=9 - 11 only\n // IE returns zIndex value as an integer.\n ret + \"\" : ret;\n }\n function addGetHookIf(conditionFn, hookFn) {\n // Define the hook, we'll check on the first run if it's really needed.\n return {\n get: function get() {\n if (conditionFn()) {\n // Hook not needed (or it's not possible to use it due\n // to missing dependency), remove it.\n delete this.get;\n return;\n }\n\n // Hook needed; redefine it so that the support test is not executed again.\n return (this.get = hookFn).apply(this, arguments);\n }\n };\n }\n var cssPrefixes = [\"Webkit\", \"Moz\", \"ms\"],\n emptyStyle = document.createElement(\"div\").style,\n vendorProps = {};\n\n // Return a vendor-prefixed property or undefined\n function vendorPropName(name) {\n // Check for vendor prefixed names\n var capName = name[0].toUpperCase() + name.slice(1),\n i = cssPrefixes.length;\n while (i--) {\n name = cssPrefixes[i] + capName;\n if (name in emptyStyle) {\n return name;\n }\n }\n }\n\n // Return a potentially-mapped jQuery.cssProps or vendor prefixed property\n function finalPropName(name) {\n var _final = jQuery.cssProps[name] || vendorProps[name];\n if (_final) {\n return _final;\n }\n if (name in emptyStyle) {\n return name;\n }\n return vendorProps[name] = vendorPropName(name) || name;\n }\n var\n // Swappable if display is none or starts with table\n // except \"table\", \"table-cell\", or \"table-caption\"\n // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n rdisplayswap = /^(none|table(?!-c[ea]).+)/,\n cssShow = {\n position: \"absolute\",\n visibility: \"hidden\",\n display: \"block\"\n },\n cssNormalTransform = {\n letterSpacing: \"0\",\n fontWeight: \"400\"\n };\n function setPositiveNumber(_elem, value, subtract) {\n // Any relative (+/-) values have already been\n // normalized at this point\n var matches = rcssNum.exec(value);\n return matches ?\n // Guard against undefined \"subtract\", e.g., when used as in cssHooks\n Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || \"px\") : value;\n }\n function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) {\n var i = dimension === \"width\" ? 1 : 0,\n extra = 0,\n delta = 0,\n marginDelta = 0;\n\n // Adjustment may not be necessary\n if (box === (isBorderBox ? \"border\" : \"content\")) {\n return 0;\n }\n for (; i < 4; i += 2) {\n // Both box models exclude margin\n // Count margin delta separately to only add it after scroll gutter adjustment.\n // This is needed to make negative margins work with `outerHeight( true )` (gh-3982).\n if (box === \"margin\") {\n marginDelta += jQuery.css(elem, box + cssExpand[i], true, styles);\n }\n\n // If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n if (!isBorderBox) {\n // Add padding\n delta += jQuery.css(elem, \"padding\" + cssExpand[i], true, styles);\n\n // For \"border\" or \"margin\", add border\n if (box !== \"padding\") {\n delta += jQuery.css(elem, \"border\" + cssExpand[i] + \"Width\", true, styles);\n\n // But still keep track of it otherwise\n } else {\n extra += jQuery.css(elem, \"border\" + cssExpand[i] + \"Width\", true, styles);\n }\n\n // If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n // \"padding\" or \"margin\"\n } else {\n // For \"content\", subtract padding\n if (box === \"content\") {\n delta -= jQuery.css(elem, \"padding\" + cssExpand[i], true, styles);\n }\n\n // For \"content\" or \"padding\", subtract border\n if (box !== \"margin\") {\n delta -= jQuery.css(elem, \"border\" + cssExpand[i] + \"Width\", true, styles);\n }\n }\n }\n\n // Account for positive content-box scroll gutter when requested by providing computedVal\n if (!isBorderBox && computedVal >= 0) {\n // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n // Assuming integer scroll gutter, subtract the rest and round down\n delta += Math.max(0, Math.ceil(elem[\"offset\" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5\n\n // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n // Use an explicit zero to avoid NaN (gh-3964)\n )) || 0;\n }\n return delta + marginDelta;\n }\n function getWidthOrHeight(elem, dimension, extra) {\n // Start with computed style\n var styles = getStyles(elem),\n // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n // Fake content-box until we know it's needed to know the true value.\n boxSizingNeeded = !support.boxSizingReliable() || extra,\n isBorderBox = boxSizingNeeded && jQuery.css(elem, \"boxSizing\", false, styles) === \"border-box\",\n valueIsBorderBox = isBorderBox,\n val = curCSS(elem, dimension, styles),\n offsetProp = \"offset\" + dimension[0].toUpperCase() + dimension.slice(1);\n\n // Support: Firefox <=54\n // Return a confounding non-pixel value or feign ignorance, as appropriate.\n if (rnumnonpx.test(val)) {\n if (!extra) {\n return val;\n }\n val = \"auto\";\n }\n\n // Support: IE 9 - 11 only\n // Use offsetWidth/offsetHeight for when box sizing is unreliable.\n // In those cases, the computed value can be trusted to be border-box.\n if ((!support.boxSizingReliable() && isBorderBox ||\n // Support: IE 10 - 11+, Edge 15 - 18+\n // IE/Edge misreport `getComputedStyle` of table rows with width/height\n // set in CSS while `offset*` properties report correct values.\n // Interestingly, in some cases IE 9 doesn't suffer from this issue.\n !support.reliableTrDimensions() && nodeName(elem, \"tr\") ||\n // Fall back to offsetWidth/offsetHeight when value is \"auto\"\n // This happens for inline elements with no explicit setting (gh-3571)\n val === \"auto\" ||\n // Support: Android <=4.1 - 4.3 only\n // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n !parseFloat(val) && jQuery.css(elem, \"display\", false, styles) === \"inline\") &&\n // Make sure the element is visible & connected\n elem.getClientRects().length) {\n isBorderBox = jQuery.css(elem, \"boxSizing\", false, styles) === \"border-box\";\n\n // Where available, offsetWidth/offsetHeight approximate border box dimensions.\n // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n // retrieved value as a content box dimension.\n valueIsBorderBox = offsetProp in elem;\n if (valueIsBorderBox) {\n val = elem[offsetProp];\n }\n }\n\n // Normalize \"\" and auto\n val = parseFloat(val) || 0;\n\n // Adjust for the element's box model\n return val + boxModelAdjustment(elem, dimension, extra || (isBorderBox ? \"border\" : \"content\"), valueIsBorderBox, styles,\n // Provide the current computed size to request scroll gutter calculation (gh-3589)\n val) + \"px\";\n }\n jQuery.extend({\n // Add in style property hooks for overriding the default\n // behavior of getting and setting a style property\n cssHooks: {\n opacity: {\n get: function get(elem, computed) {\n if (computed) {\n // We should always get a number back from opacity\n var ret = curCSS(elem, \"opacity\");\n return ret === \"\" ? \"1\" : ret;\n }\n }\n }\n },\n // Don't automatically add \"px\" to these possibly-unitless properties\n cssNumber: {\n animationIterationCount: true,\n aspectRatio: true,\n borderImageSlice: true,\n columnCount: true,\n flexGrow: true,\n flexShrink: true,\n fontWeight: true,\n gridArea: true,\n gridColumn: true,\n gridColumnEnd: true,\n gridColumnStart: true,\n gridRow: true,\n gridRowEnd: true,\n gridRowStart: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n scale: true,\n widows: true,\n zIndex: true,\n zoom: true,\n // SVG-related\n fillOpacity: true,\n floodOpacity: true,\n stopOpacity: true,\n strokeMiterlimit: true,\n strokeOpacity: true\n },\n // Add in properties whose names you wish to fix before\n // setting or getting the value\n cssProps: {},\n // Get and set the style property on a DOM Node\n style: function style(elem, name, value, extra) {\n // Don't set styles on text and comment nodes\n if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {\n return;\n }\n\n // Make sure that we're working with the right name\n var ret,\n type,\n hooks,\n origName = camelCase(name),\n isCustomProp = rcustomProp.test(name),\n style = elem.style;\n\n // Make sure that we're working with the right name. We don't\n // want to query the value if it is a CSS custom property\n // since they are user-defined.\n if (!isCustomProp) {\n name = finalPropName(origName);\n }\n\n // Gets hook for the prefixed version, then unprefixed version\n hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];\n\n // Check if we're setting a value\n if (value !== undefined) {\n type = _typeof$1(value);\n\n // Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n if (type === \"string\" && (ret = rcssNum.exec(value)) && ret[1]) {\n value = adjustCSS(elem, name, ret);\n\n // Fixes bug trac-9237\n type = \"number\";\n }\n\n // Make sure that null and NaN values aren't set (trac-7116)\n if (value == null || value !== value) {\n return;\n }\n\n // If a number was passed in, add the unit (except for certain CSS properties)\n // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n // \"px\" to a few hardcoded values.\n if (type === \"number\" && !isCustomProp) {\n value += ret && ret[3] || (jQuery.cssNumber[origName] ? \"\" : \"px\");\n }\n\n // background-* props affect original clone's values\n if (!support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0) {\n style[name] = \"inherit\";\n }\n\n // If a hook was provided, use that value, otherwise just set the specified value\n if (!hooks || !(\"set\" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {\n if (isCustomProp) {\n style.setProperty(name, value);\n } else {\n style[name] = value;\n }\n }\n } else {\n // If a hook was provided get the non-computed value from there\n if (hooks && \"get\" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {\n return ret;\n }\n\n // Otherwise just get the value from the style object\n return style[name];\n }\n },\n css: function css(elem, name, extra, styles) {\n var val,\n num,\n hooks,\n origName = camelCase(name),\n isCustomProp = rcustomProp.test(name);\n\n // Make sure that we're working with the right name. We don't\n // want to modify the value if it is a CSS custom property\n // since they are user-defined.\n if (!isCustomProp) {\n name = finalPropName(origName);\n }\n\n // Try prefixed name followed by the unprefixed name\n hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];\n\n // If a hook was provided get the computed value from there\n if (hooks && \"get\" in hooks) {\n val = hooks.get(elem, true, extra);\n }\n\n // Otherwise, if a way to get the computed value exists, use that\n if (val === undefined) {\n val = curCSS(elem, name, styles);\n }\n\n // Convert \"normal\" to computed value\n if (val === \"normal\" && name in cssNormalTransform) {\n val = cssNormalTransform[name];\n }\n\n // Make numeric if forced or a qualifier was provided and val looks numeric\n if (extra === \"\" || extra) {\n num = parseFloat(val);\n return extra === true || isFinite(num) ? num || 0 : val;\n }\n return val;\n }\n });\n jQuery.each([\"height\", \"width\"], function (_i, dimension) {\n jQuery.cssHooks[dimension] = {\n get: function get(elem, computed, extra) {\n if (computed) {\n // Certain elements can have dimension info if we invisibly show them\n // but it must have a current display style that would benefit\n return rdisplayswap.test(jQuery.css(elem, \"display\")) && (\n // Support: Safari 8+\n // Table columns in Safari have non-zero offsetWidth & zero\n // getBoundingClientRect().width unless display is changed.\n // Support: IE <=11 only\n // Running getBoundingClientRect on a disconnected node\n // in IE throws an error.\n !elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function () {\n return getWidthOrHeight(elem, dimension, extra);\n }) : getWidthOrHeight(elem, dimension, extra);\n }\n },\n set: function set(elem, value, extra) {\n var matches,\n styles = getStyles(elem),\n // Only read styles.position if the test has a chance to fail\n // to avoid forcing a reflow.\n scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === \"absolute\",\n // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n boxSizingNeeded = scrollboxSizeBuggy || extra,\n isBorderBox = boxSizingNeeded && jQuery.css(elem, \"boxSizing\", false, styles) === \"border-box\",\n subtract = extra ? boxModelAdjustment(elem, dimension, extra, isBorderBox, styles) : 0;\n\n // Account for unreliable border-box dimensions by comparing offset* to computed and\n // faking a content-box to get border and padding (gh-3699)\n if (isBorderBox && scrollboxSizeBuggy) {\n subtract -= Math.ceil(elem[\"offset\" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles[dimension]) - boxModelAdjustment(elem, dimension, \"border\", false, styles) - 0.5);\n }\n\n // Convert to pixels if value adjustment is needed\n if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || \"px\") !== \"px\") {\n elem.style[dimension] = value;\n value = jQuery.css(elem, dimension);\n }\n return setPositiveNumber(elem, value, subtract);\n }\n };\n });\n jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) {\n if (computed) {\n return (parseFloat(curCSS(elem, \"marginLeft\")) || elem.getBoundingClientRect().left - swap(elem, {\n marginLeft: 0\n }, function () {\n return elem.getBoundingClientRect().left;\n })) + \"px\";\n }\n });\n\n // These hooks are used by animate to expand properties\n jQuery.each({\n margin: \"\",\n padding: \"\",\n border: \"Width\"\n }, function (prefix, suffix) {\n jQuery.cssHooks[prefix + suffix] = {\n expand: function expand(value) {\n var i = 0,\n expanded = {},\n // Assumes a single number if not a string\n parts = typeof value === \"string\" ? value.split(\" \") : [value];\n for (; i < 4; i++) {\n expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];\n }\n return expanded;\n }\n };\n if (prefix !== \"margin\") {\n jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;\n }\n });\n jQuery.fn.extend({\n css: function css(name, value) {\n return access(this, function (elem, name, value) {\n var styles,\n len,\n map = {},\n i = 0;\n if (Array.isArray(name)) {\n styles = getStyles(elem);\n len = name.length;\n for (; i < len; i++) {\n map[name[i]] = jQuery.css(elem, name[i], false, styles);\n }\n return map;\n }\n return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);\n }, name, value, arguments.length > 1);\n }\n });\n function Tween(elem, options, prop, end, easing) {\n return new Tween.prototype.init(elem, options, prop, end, easing);\n }\n jQuery.Tween = Tween;\n Tween.prototype = {\n constructor: Tween,\n init: function init(elem, options, prop, end, easing, unit) {\n this.elem = elem;\n this.prop = prop;\n this.easing = easing || jQuery.easing._default;\n this.options = options;\n this.start = this.now = this.cur();\n this.end = end;\n this.unit = unit || (jQuery.cssNumber[prop] ? \"\" : \"px\");\n },\n cur: function cur() {\n var hooks = Tween.propHooks[this.prop];\n return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);\n },\n run: function run(percent) {\n var eased,\n hooks = Tween.propHooks[this.prop];\n if (this.options.duration) {\n this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);\n } else {\n this.pos = eased = percent;\n }\n this.now = (this.end - this.start) * eased + this.start;\n if (this.options.step) {\n this.options.step.call(this.elem, this.now, this);\n }\n if (hooks && hooks.set) {\n hooks.set(this);\n } else {\n Tween.propHooks._default.set(this);\n }\n return this;\n }\n };\n Tween.prototype.init.prototype = Tween.prototype;\n Tween.propHooks = {\n _default: {\n get: function get(tween) {\n var result;\n\n // Use a property on the element directly when it is not a DOM element,\n // or when there is no matching style property that exists.\n if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {\n return tween.elem[tween.prop];\n }\n\n // Passing an empty string as a 3rd parameter to .css will automatically\n // attempt a parseFloat and fallback to a string if the parse fails.\n // Simple values such as \"10px\" are parsed to Float;\n // complex values such as \"rotate(1rad)\" are returned as-is.\n result = jQuery.css(tween.elem, tween.prop, \"\");\n\n // Empty strings, null, undefined and \"auto\" are converted to 0.\n return !result || result === \"auto\" ? 0 : result;\n },\n set: function set(tween) {\n // Use step hook for back compat.\n // Use cssHook if its there.\n // Use .style if available and use plain properties where available.\n if (jQuery.fx.step[tween.prop]) {\n jQuery.fx.step[tween.prop](tween);\n } else if (tween.elem.nodeType === 1 && (jQuery.cssHooks[tween.prop] || tween.elem.style[finalPropName(tween.prop)] != null)) {\n jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);\n } else {\n tween.elem[tween.prop] = tween.now;\n }\n }\n }\n };\n\n // Support: IE <=9 only\n // Panic based approach to setting things on disconnected nodes\n Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n set: function set(tween) {\n if (tween.elem.nodeType && tween.elem.parentNode) {\n tween.elem[tween.prop] = tween.now;\n }\n }\n };\n jQuery.easing = {\n linear: function linear(p) {\n return p;\n },\n swing: function swing(p) {\n return 0.5 - Math.cos(p * Math.PI) / 2;\n },\n _default: \"swing\"\n };\n jQuery.fx = Tween.prototype.init;\n\n // Back compat <1.8 extension point\n jQuery.fx.step = {};\n var fxNow,\n inProgress,\n rfxtypes = /^(?:toggle|show|hide)$/,\n rrun = /queueHooks$/;\n function schedule() {\n if (inProgress) {\n if (document.hidden === false && window.requestAnimationFrame) {\n window.requestAnimationFrame(schedule);\n } else {\n window.setTimeout(schedule, jQuery.fx.interval);\n }\n jQuery.fx.tick();\n }\n }\n\n // Animations created synchronously will run synchronously\n function createFxNow() {\n window.setTimeout(function () {\n fxNow = undefined;\n });\n return fxNow = Date.now();\n }\n\n // Generate parameters to create a standard animation\n function genFx(type, includeWidth) {\n var which,\n i = 0,\n attrs = {\n height: type\n };\n\n // If we include width, step value is 1 to do all cssExpand values,\n // otherwise step value is 2 to skip over Left and Right\n includeWidth = includeWidth ? 1 : 0;\n for (; i < 4; i += 2 - includeWidth) {\n which = cssExpand[i];\n attrs[\"margin\" + which] = attrs[\"padding\" + which] = type;\n }\n if (includeWidth) {\n attrs.opacity = attrs.width = type;\n }\n return attrs;\n }\n function createTween(value, prop, animation) {\n var tween,\n collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners[\"*\"]),\n index = 0,\n length = collection.length;\n for (; index < length; index++) {\n if (tween = collection[index].call(animation, prop, value)) {\n // We're done with this property\n return tween;\n }\n }\n }\n function defaultPrefilter(elem, props, opts) {\n var prop,\n value,\n toggle,\n hooks,\n oldfire,\n propTween,\n restoreDisplay,\n display,\n isBox = \"width\" in props || \"height\" in props,\n anim = this,\n orig = {},\n style = elem.style,\n hidden = elem.nodeType && isHiddenWithinTree(elem),\n dataShow = dataPriv.get(elem, \"fxshow\");\n\n // Queue-skipping animations hijack the fx hooks\n if (!opts.queue) {\n hooks = jQuery._queueHooks(elem, \"fx\");\n if (hooks.unqueued == null) {\n hooks.unqueued = 0;\n oldfire = hooks.empty.fire;\n hooks.empty.fire = function () {\n if (!hooks.unqueued) {\n oldfire();\n }\n };\n }\n hooks.unqueued++;\n anim.always(function () {\n // Ensure the complete handler is called before this completes\n anim.always(function () {\n hooks.unqueued--;\n if (!jQuery.queue(elem, \"fx\").length) {\n hooks.empty.fire();\n }\n });\n });\n }\n\n // Detect show/hide animations\n for (prop in props) {\n value = props[prop];\n if (rfxtypes.test(value)) {\n delete props[prop];\n toggle = toggle || value === \"toggle\";\n if (value === (hidden ? \"hide\" : \"show\")) {\n // Pretend to be hidden if this is a \"show\" and\n // there is still data from a stopped show/hide\n if (value === \"show\" && dataShow && dataShow[prop] !== undefined) {\n hidden = true;\n\n // Ignore all other no-op show/hide data\n } else {\n continue;\n }\n }\n orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);\n }\n }\n\n // Bail out if this is a no-op like .hide().hide()\n propTween = !jQuery.isEmptyObject(props);\n if (!propTween && jQuery.isEmptyObject(orig)) {\n return;\n }\n\n // Restrict \"overflow\" and \"display\" styles during box animations\n if (isBox && elem.nodeType === 1) {\n // Support: IE <=9 - 11, Edge 12 - 15\n // Record all 3 overflow attributes because IE does not infer the shorthand\n // from identically-valued overflowX and overflowY and Edge just mirrors\n // the overflowX value there.\n opts.overflow = [style.overflow, style.overflowX, style.overflowY];\n\n // Identify a display type, preferring old show/hide data over the CSS cascade\n restoreDisplay = dataShow && dataShow.display;\n if (restoreDisplay == null) {\n restoreDisplay = dataPriv.get(elem, \"display\");\n }\n display = jQuery.css(elem, \"display\");\n if (display === \"none\") {\n if (restoreDisplay) {\n display = restoreDisplay;\n } else {\n // Get nonempty value(s) by temporarily forcing visibility\n showHide([elem], true);\n restoreDisplay = elem.style.display || restoreDisplay;\n display = jQuery.css(elem, \"display\");\n showHide([elem]);\n }\n }\n\n // Animate inline elements as inline-block\n if (display === \"inline\" || display === \"inline-block\" && restoreDisplay != null) {\n if (jQuery.css(elem, \"float\") === \"none\") {\n // Restore the original display value at the end of pure show/hide animations\n if (!propTween) {\n anim.done(function () {\n style.display = restoreDisplay;\n });\n if (restoreDisplay == null) {\n display = style.display;\n restoreDisplay = display === \"none\" ? \"\" : display;\n }\n }\n style.display = \"inline-block\";\n }\n }\n }\n if (opts.overflow) {\n style.overflow = \"hidden\";\n anim.always(function () {\n style.overflow = opts.overflow[0];\n style.overflowX = opts.overflow[1];\n style.overflowY = opts.overflow[2];\n });\n }\n\n // Implement show/hide animations\n propTween = false;\n for (prop in orig) {\n // General show/hide setup for this element animation\n if (!propTween) {\n if (dataShow) {\n if (\"hidden\" in dataShow) {\n hidden = dataShow.hidden;\n }\n } else {\n dataShow = dataPriv.access(elem, \"fxshow\", {\n display: restoreDisplay\n });\n }\n\n // Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n if (toggle) {\n dataShow.hidden = !hidden;\n }\n\n // Show elements before animating them\n if (hidden) {\n showHide([elem], true);\n }\n\n /* eslint-disable no-loop-func */\n\n anim.done(function () {\n /* eslint-enable no-loop-func */\n\n // The final step of a \"hide\" animation is actually hiding the element\n if (!hidden) {\n showHide([elem]);\n }\n dataPriv.remove(elem, \"fxshow\");\n for (prop in orig) {\n jQuery.style(elem, prop, orig[prop]);\n }\n });\n }\n\n // Per-property setup\n propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim);\n if (!(prop in dataShow)) {\n dataShow[prop] = propTween.start;\n if (hidden) {\n propTween.end = propTween.start;\n propTween.start = 0;\n }\n }\n }\n }\n function propFilter(props, specialEasing) {\n var index, name, easing, value, hooks;\n\n // camelCase, specialEasing and expand cssHook pass\n for (index in props) {\n name = camelCase(index);\n easing = specialEasing[name];\n value = props[index];\n if (Array.isArray(value)) {\n easing = value[1];\n value = props[index] = value[0];\n }\n if (index !== name) {\n props[name] = value;\n delete props[index];\n }\n hooks = jQuery.cssHooks[name];\n if (hooks && \"expand\" in hooks) {\n value = hooks.expand(value);\n delete props[name];\n\n // Not quite $.extend, this won't overwrite existing keys.\n // Reusing 'index' because we have the correct \"name\"\n for (index in value) {\n if (!(index in props)) {\n props[index] = value[index];\n specialEasing[index] = easing;\n }\n }\n } else {\n specialEasing[name] = easing;\n }\n }\n }\n function Animation(elem, properties, options) {\n var result,\n stopped,\n index = 0,\n length = Animation.prefilters.length,\n deferred = jQuery.Deferred().always(function () {\n // Don't match elem in the :animated selector\n delete tick.elem;\n }),\n tick = function tick() {\n if (stopped) {\n return false;\n }\n var currentTime = fxNow || createFxNow(),\n remaining = Math.max(0, animation.startTime + animation.duration - currentTime),\n // Support: Android 2.3 only\n // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n temp = remaining / animation.duration || 0,\n percent = 1 - temp,\n index = 0,\n length = animation.tweens.length;\n for (; index < length; index++) {\n animation.tweens[index].run(percent);\n }\n deferred.notifyWith(elem, [animation, percent, remaining]);\n\n // If there's more to do, yield\n if (percent < 1 && length) {\n return remaining;\n }\n\n // If this was an empty animation, synthesize a final progress notification\n if (!length) {\n deferred.notifyWith(elem, [animation, 1, 0]);\n }\n\n // Resolve the animation and report its conclusion\n deferred.resolveWith(elem, [animation]);\n return false;\n },\n animation = deferred.promise({\n elem: elem,\n props: jQuery.extend({}, properties),\n opts: jQuery.extend(true, {\n specialEasing: {},\n easing: jQuery.easing._default\n }, options),\n originalProperties: properties,\n originalOptions: options,\n startTime: fxNow || createFxNow(),\n duration: options.duration,\n tweens: [],\n createTween: function createTween(prop, end) {\n var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);\n animation.tweens.push(tween);\n return tween;\n },\n stop: function stop(gotoEnd) {\n var index = 0,\n // If we are going to the end, we want to run all the tweens\n // otherwise we skip this part\n length = gotoEnd ? animation.tweens.length : 0;\n if (stopped) {\n return this;\n }\n stopped = true;\n for (; index < length; index++) {\n animation.tweens[index].run(1);\n }\n\n // Resolve when we played the last frame; otherwise, reject\n if (gotoEnd) {\n deferred.notifyWith(elem, [animation, 1, 0]);\n deferred.resolveWith(elem, [animation, gotoEnd]);\n } else {\n deferred.rejectWith(elem, [animation, gotoEnd]);\n }\n return this;\n }\n }),\n props = animation.props;\n propFilter(props, animation.opts.specialEasing);\n for (; index < length; index++) {\n result = Animation.prefilters[index].call(animation, elem, props, animation.opts);\n if (result) {\n if (isFunction(result.stop)) {\n jQuery._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result);\n }\n return result;\n }\n }\n jQuery.map(props, createTween, animation);\n if (isFunction(animation.opts.start)) {\n animation.opts.start.call(elem, animation);\n }\n\n // Attach callbacks from options\n animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);\n jQuery.fx.timer(jQuery.extend(tick, {\n elem: elem,\n anim: animation,\n queue: animation.opts.queue\n }));\n return animation;\n }\n jQuery.Animation = jQuery.extend(Animation, {\n tweeners: {\n \"*\": [function (prop, value) {\n var tween = this.createTween(prop, value);\n adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);\n return tween;\n }]\n },\n tweener: function tweener(props, callback) {\n if (isFunction(props)) {\n callback = props;\n props = [\"*\"];\n } else {\n props = props.match(rnothtmlwhite);\n }\n var prop,\n index = 0,\n length = props.length;\n for (; index < length; index++) {\n prop = props[index];\n Animation.tweeners[prop] = Animation.tweeners[prop] || [];\n Animation.tweeners[prop].unshift(callback);\n }\n },\n prefilters: [defaultPrefilter],\n prefilter: function prefilter(callback, prepend) {\n if (prepend) {\n Animation.prefilters.unshift(callback);\n } else {\n Animation.prefilters.push(callback);\n }\n }\n });\n jQuery.speed = function (speed, easing, fn) {\n var opt = speed && _typeof$1(speed) === \"object\" ? jQuery.extend({}, speed) : {\n complete: fn || !fn && easing || isFunction(speed) && speed,\n duration: speed,\n easing: fn && easing || easing && !isFunction(easing) && easing\n };\n\n // Go to the end state if fx are off\n if (jQuery.fx.off) {\n opt.duration = 0;\n } else {\n if (typeof opt.duration !== \"number\") {\n if (opt.duration in jQuery.fx.speeds) {\n opt.duration = jQuery.fx.speeds[opt.duration];\n } else {\n opt.duration = jQuery.fx.speeds._default;\n }\n }\n }\n\n // Normalize opt.queue - true/undefined/null -> \"fx\"\n if (opt.queue == null || opt.queue === true) {\n opt.queue = \"fx\";\n }\n\n // Queueing\n opt.old = opt.complete;\n opt.complete = function () {\n if (isFunction(opt.old)) {\n opt.old.call(this);\n }\n if (opt.queue) {\n jQuery.dequeue(this, opt.queue);\n }\n };\n return opt;\n };\n jQuery.fn.extend({\n fadeTo: function fadeTo(speed, to, easing, callback) {\n // Show any hidden elements after setting opacity to 0\n return this.filter(isHiddenWithinTree).css(\"opacity\", 0).show()\n\n // Animate to the value specified\n .end().animate({\n opacity: to\n }, speed, easing, callback);\n },\n animate: function animate(prop, speed, easing, callback) {\n var empty = jQuery.isEmptyObject(prop),\n optall = jQuery.speed(speed, easing, callback),\n doAnimation = function doAnimation() {\n // Operate on a copy of prop so per-property easing won't be lost\n var anim = Animation(this, jQuery.extend({}, prop), optall);\n\n // Empty animations, or finishing resolves immediately\n if (empty || dataPriv.get(this, \"finish\")) {\n anim.stop(true);\n }\n };\n doAnimation.finish = doAnimation;\n return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);\n },\n stop: function stop(type, clearQueue, gotoEnd) {\n var stopQueue = function stopQueue(hooks) {\n var stop = hooks.stop;\n delete hooks.stop;\n stop(gotoEnd);\n };\n if (typeof type !== \"string\") {\n gotoEnd = clearQueue;\n clearQueue = type;\n type = undefined;\n }\n if (clearQueue) {\n this.queue(type || \"fx\", []);\n }\n return this.each(function () {\n var dequeue = true,\n index = type != null && type + \"queueHooks\",\n timers = jQuery.timers,\n data = dataPriv.get(this);\n if (index) {\n if (data[index] && data[index].stop) {\n stopQueue(data[index]);\n }\n } else {\n for (index in data) {\n if (data[index] && data[index].stop && rrun.test(index)) {\n stopQueue(data[index]);\n }\n }\n }\n for (index = timers.length; index--;) {\n if (timers[index].elem === this && (type == null || timers[index].queue === type)) {\n timers[index].anim.stop(gotoEnd);\n dequeue = false;\n timers.splice(index, 1);\n }\n }\n\n // Start the next in the queue if the last step wasn't forced.\n // Timers currently will call their complete callbacks, which\n // will dequeue but only if they were gotoEnd.\n if (dequeue || !gotoEnd) {\n jQuery.dequeue(this, type);\n }\n });\n },\n finish: function finish(type) {\n if (type !== false) {\n type = type || \"fx\";\n }\n return this.each(function () {\n var index,\n data = dataPriv.get(this),\n queue = data[type + \"queue\"],\n hooks = data[type + \"queueHooks\"],\n timers = jQuery.timers,\n length = queue ? queue.length : 0;\n\n // Enable finishing flag on private data\n data.finish = true;\n\n // Empty the queue first\n jQuery.queue(this, type, []);\n if (hooks && hooks.stop) {\n hooks.stop.call(this, true);\n }\n\n // Look for any active animations, and finish them\n for (index = timers.length; index--;) {\n if (timers[index].elem === this && timers[index].queue === type) {\n timers[index].anim.stop(true);\n timers.splice(index, 1);\n }\n }\n\n // Look for any animations in the old queue and finish them\n for (index = 0; index < length; index++) {\n if (queue[index] && queue[index].finish) {\n queue[index].finish.call(this);\n }\n }\n\n // Turn off finishing flag\n delete data.finish;\n });\n }\n });\n jQuery.each([\"toggle\", \"show\", \"hide\"], function (_i, name) {\n var cssFn = jQuery.fn[name];\n jQuery.fn[name] = function (speed, easing, callback) {\n return speed == null || typeof speed === \"boolean\" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);\n };\n });\n\n // Generate shortcuts for custom animations\n jQuery.each({\n slideDown: genFx(\"show\"),\n slideUp: genFx(\"hide\"),\n slideToggle: genFx(\"toggle\"),\n fadeIn: {\n opacity: \"show\"\n },\n fadeOut: {\n opacity: \"hide\"\n },\n fadeToggle: {\n opacity: \"toggle\"\n }\n }, function (name, props) {\n jQuery.fn[name] = function (speed, easing, callback) {\n return this.animate(props, speed, easing, callback);\n };\n });\n jQuery.timers = [];\n jQuery.fx.tick = function () {\n var timer,\n i = 0,\n timers = jQuery.timers;\n fxNow = Date.now();\n for (; i < timers.length; i++) {\n timer = timers[i];\n\n // Run the timer and safely remove it when done (allowing for external removal)\n if (!timer() && timers[i] === timer) {\n timers.splice(i--, 1);\n }\n }\n if (!timers.length) {\n jQuery.fx.stop();\n }\n fxNow = undefined;\n };\n jQuery.fx.timer = function (timer) {\n jQuery.timers.push(timer);\n jQuery.fx.start();\n };\n jQuery.fx.interval = 13;\n jQuery.fx.start = function () {\n if (inProgress) {\n return;\n }\n inProgress = true;\n schedule();\n };\n jQuery.fx.stop = function () {\n inProgress = null;\n };\n jQuery.fx.speeds = {\n slow: 600,\n fast: 200,\n // Default speed\n _default: 400\n };\n\n // Based off of the plugin by Clint Helfers, with permission.\n jQuery.fn.delay = function (time, type) {\n time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;\n type = type || \"fx\";\n return this.queue(type, function (next, hooks) {\n var timeout = window.setTimeout(next, time);\n hooks.stop = function () {\n window.clearTimeout(timeout);\n };\n });\n };\n (function () {\n var input = document.createElement(\"input\"),\n select = document.createElement(\"select\"),\n opt = select.appendChild(document.createElement(\"option\"));\n input.type = \"checkbox\";\n\n // Support: Android <=4.3 only\n // Default value for a checkbox should be \"on\"\n support.checkOn = input.value !== \"\";\n\n // Support: IE <=11 only\n // Must access selectedIndex to make default options select\n support.optSelected = opt.selected;\n\n // Support: IE <=11 only\n // An input loses its value after becoming a radio\n input = document.createElement(\"input\");\n input.value = \"t\";\n input.type = \"radio\";\n support.radioValue = input.value === \"t\";\n })();\n var boolHook,\n attrHandle = jQuery.expr.attrHandle;\n jQuery.fn.extend({\n attr: function attr(name, value) {\n return access(this, jQuery.attr, name, value, arguments.length > 1);\n },\n removeAttr: function removeAttr(name) {\n return this.each(function () {\n jQuery.removeAttr(this, name);\n });\n }\n });\n jQuery.extend({\n attr: function attr(elem, name, value) {\n var ret,\n hooks,\n nType = elem.nodeType;\n\n // Don't get/set attributes on text, comment and attribute nodes\n if (nType === 3 || nType === 8 || nType === 2) {\n return;\n }\n\n // Fallback to prop when attributes are not supported\n if (typeof elem.getAttribute === \"undefined\") {\n return jQuery.prop(elem, name, value);\n }\n\n // Attribute hooks are determined by the lowercase version\n // Grab necessary hook if one is defined\n if (nType !== 1 || !jQuery.isXMLDoc(elem)) {\n hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : undefined);\n }\n if (value !== undefined) {\n if (value === null) {\n jQuery.removeAttr(elem, name);\n return;\n }\n if (hooks && \"set\" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {\n return ret;\n }\n elem.setAttribute(name, value + \"\");\n return value;\n }\n if (hooks && \"get\" in hooks && (ret = hooks.get(elem, name)) !== null) {\n return ret;\n }\n ret = jQuery.find.attr(elem, name);\n\n // Non-existent attributes return null, we normalize to undefined\n return ret == null ? undefined : ret;\n },\n attrHooks: {\n type: {\n set: function set(elem, value) {\n if (!support.radioValue && value === \"radio\" && nodeName(elem, \"input\")) {\n var val = elem.value;\n elem.setAttribute(\"type\", value);\n if (val) {\n elem.value = val;\n }\n return value;\n }\n }\n }\n },\n removeAttr: function removeAttr(elem, value) {\n var name,\n i = 0,\n // Attribute names can contain non-HTML whitespace characters\n // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n attrNames = value && value.match(rnothtmlwhite);\n if (attrNames && elem.nodeType === 1) {\n while (name = attrNames[i++]) {\n elem.removeAttribute(name);\n }\n }\n }\n });\n\n // Hooks for boolean attributes\n boolHook = {\n set: function set(elem, value, name) {\n if (value === false) {\n // Remove boolean attributes when set to false\n jQuery.removeAttr(elem, name);\n } else {\n elem.setAttribute(name, name);\n }\n return name;\n }\n };\n jQuery.each(jQuery.expr.match.bool.source.match(/\\w+/g), function (_i, name) {\n var getter = attrHandle[name] || jQuery.find.attr;\n attrHandle[name] = function (elem, name, isXML) {\n var ret,\n handle,\n lowercaseName = name.toLowerCase();\n if (!isXML) {\n // Avoid an infinite loop by temporarily removing this function from the getter\n handle = attrHandle[lowercaseName];\n attrHandle[lowercaseName] = ret;\n ret = getter(elem, name, isXML) != null ? lowercaseName : null;\n attrHandle[lowercaseName] = handle;\n }\n return ret;\n };\n });\n var rfocusable = /^(?:input|select|textarea|button)$/i,\n rclickable = /^(?:a|area)$/i;\n jQuery.fn.extend({\n prop: function prop(name, value) {\n return access(this, jQuery.prop, name, value, arguments.length > 1);\n },\n removeProp: function removeProp(name) {\n return this.each(function () {\n delete this[jQuery.propFix[name] || name];\n });\n }\n });\n jQuery.extend({\n prop: function prop(elem, name, value) {\n var ret,\n hooks,\n nType = elem.nodeType;\n\n // Don't get/set properties on text, comment and attribute nodes\n if (nType === 3 || nType === 8 || nType === 2) {\n return;\n }\n if (nType !== 1 || !jQuery.isXMLDoc(elem)) {\n // Fix name and attach hooks\n name = jQuery.propFix[name] || name;\n hooks = jQuery.propHooks[name];\n }\n if (value !== undefined) {\n if (hooks && \"set\" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {\n return ret;\n }\n return elem[name] = value;\n }\n if (hooks && \"get\" in hooks && (ret = hooks.get(elem, name)) !== null) {\n return ret;\n }\n return elem[name];\n },\n propHooks: {\n tabIndex: {\n get: function get(elem) {\n // Support: IE <=9 - 11 only\n // elem.tabIndex doesn't always return the\n // correct value when it hasn't been explicitly set\n // Use proper attribute retrieval (trac-12072)\n var tabindex = jQuery.find.attr(elem, \"tabindex\");\n if (tabindex) {\n return parseInt(tabindex, 10);\n }\n if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) {\n return 0;\n }\n return -1;\n }\n }\n },\n propFix: {\n \"for\": \"htmlFor\",\n \"class\": \"className\"\n }\n });\n\n // Support: IE <=11 only\n // Accessing the selectedIndex property\n // forces the browser to respect setting selected\n // on the option\n // The getter ensures a default option is selected\n // when in an optgroup\n // eslint rule \"no-unused-expressions\" is disabled for this code\n // since it considers such accessions noop\n if (!support.optSelected) {\n jQuery.propHooks.selected = {\n get: function get(elem) {\n /* eslint no-unused-expressions: \"off\" */\n\n var parent = elem.parentNode;\n if (parent && parent.parentNode) {\n parent.parentNode.selectedIndex;\n }\n return null;\n },\n set: function set(elem) {\n /* eslint no-unused-expressions: \"off\" */\n\n var parent = elem.parentNode;\n if (parent) {\n parent.selectedIndex;\n if (parent.parentNode) {\n parent.parentNode.selectedIndex;\n }\n }\n }\n };\n }\n jQuery.each([\"tabIndex\", \"readOnly\", \"maxLength\", \"cellSpacing\", \"cellPadding\", \"rowSpan\", \"colSpan\", \"useMap\", \"frameBorder\", \"contentEditable\"], function () {\n jQuery.propFix[this.toLowerCase()] = this;\n });\n\n // Strip and collapse whitespace according to HTML spec\n // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n function stripAndCollapse(value) {\n var tokens = value.match(rnothtmlwhite) || [];\n return tokens.join(\" \");\n }\n function getClass(elem) {\n return elem.getAttribute && elem.getAttribute(\"class\") || \"\";\n }\n function classesToArray(value) {\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n return value.match(rnothtmlwhite) || [];\n }\n return [];\n }\n jQuery.fn.extend({\n addClass: function addClass(value) {\n var classNames, cur, curValue, className, i, finalValue;\n if (isFunction(value)) {\n return this.each(function (j) {\n jQuery(this).addClass(value.call(this, j, getClass(this)));\n });\n }\n classNames = classesToArray(value);\n if (classNames.length) {\n return this.each(function () {\n curValue = getClass(this);\n cur = this.nodeType === 1 && \" \" + stripAndCollapse(curValue) + \" \";\n if (cur) {\n for (i = 0; i < classNames.length; i++) {\n className = classNames[i];\n if (cur.indexOf(\" \" + className + \" \") < 0) {\n cur += className + \" \";\n }\n }\n\n // Only assign if different to avoid unneeded rendering.\n finalValue = stripAndCollapse(cur);\n if (curValue !== finalValue) {\n this.setAttribute(\"class\", finalValue);\n }\n }\n });\n }\n return this;\n },\n removeClass: function removeClass(value) {\n var classNames, cur, curValue, className, i, finalValue;\n if (isFunction(value)) {\n return this.each(function (j) {\n jQuery(this).removeClass(value.call(this, j, getClass(this)));\n });\n }\n if (!arguments.length) {\n return this.attr(\"class\", \"\");\n }\n classNames = classesToArray(value);\n if (classNames.length) {\n return this.each(function () {\n curValue = getClass(this);\n\n // This expression is here for better compressibility (see addClass)\n cur = this.nodeType === 1 && \" \" + stripAndCollapse(curValue) + \" \";\n if (cur) {\n for (i = 0; i < classNames.length; i++) {\n className = classNames[i];\n\n // Remove *all* instances\n while (cur.indexOf(\" \" + className + \" \") > -1) {\n cur = cur.replace(\" \" + className + \" \", \" \");\n }\n }\n\n // Only assign if different to avoid unneeded rendering.\n finalValue = stripAndCollapse(cur);\n if (curValue !== finalValue) {\n this.setAttribute(\"class\", finalValue);\n }\n }\n });\n }\n return this;\n },\n toggleClass: function toggleClass(value, stateVal) {\n var classNames,\n className,\n i,\n self,\n type = _typeof$1(value),\n isValidValue = type === \"string\" || Array.isArray(value);\n if (isFunction(value)) {\n return this.each(function (i) {\n jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal);\n });\n }\n if (typeof stateVal === \"boolean\" && isValidValue) {\n return stateVal ? this.addClass(value) : this.removeClass(value);\n }\n classNames = classesToArray(value);\n return this.each(function () {\n if (isValidValue) {\n // Toggle individual class names\n self = jQuery(this);\n for (i = 0; i < classNames.length; i++) {\n className = classNames[i];\n\n // Check each className given, space separated list\n if (self.hasClass(className)) {\n self.removeClass(className);\n } else {\n self.addClass(className);\n }\n }\n\n // Toggle whole class name\n } else if (value === undefined || type === \"boolean\") {\n className = getClass(this);\n if (className) {\n // Store className if set\n dataPriv.set(this, \"__className__\", className);\n }\n\n // If the element has a class name or if we're passed `false`,\n // then remove the whole classname (if there was one, the above saved it).\n // Otherwise bring back whatever was previously saved (if anything),\n // falling back to the empty string if nothing was stored.\n if (this.setAttribute) {\n this.setAttribute(\"class\", className || value === false ? \"\" : dataPriv.get(this, \"__className__\") || \"\");\n }\n }\n });\n },\n hasClass: function hasClass(selector) {\n var className,\n elem,\n i = 0;\n className = \" \" + selector + \" \";\n while (elem = this[i++]) {\n if (elem.nodeType === 1 && (\" \" + stripAndCollapse(getClass(elem)) + \" \").indexOf(className) > -1) {\n return true;\n }\n }\n return false;\n }\n });\n var rreturn = /\\r/g;\n jQuery.fn.extend({\n val: function val(value) {\n var hooks,\n ret,\n valueIsFunction,\n elem = this[0];\n if (!arguments.length) {\n if (elem) {\n hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];\n if (hooks && \"get\" in hooks && (ret = hooks.get(elem, \"value\")) !== undefined) {\n return ret;\n }\n ret = elem.value;\n\n // Handle most common string cases\n if (typeof ret === \"string\") {\n return ret.replace(rreturn, \"\");\n }\n\n // Handle cases where value is null/undef or number\n return ret == null ? \"\" : ret;\n }\n return;\n }\n valueIsFunction = isFunction(value);\n return this.each(function (i) {\n var val;\n if (this.nodeType !== 1) {\n return;\n }\n if (valueIsFunction) {\n val = value.call(this, i, jQuery(this).val());\n } else {\n val = value;\n }\n\n // Treat null/undefined as \"\"; convert numbers to string\n if (val == null) {\n val = \"\";\n } else if (typeof val === \"number\") {\n val += \"\";\n } else if (Array.isArray(val)) {\n val = jQuery.map(val, function (value) {\n return value == null ? \"\" : value + \"\";\n });\n }\n hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];\n\n // If set returns undefined, fall back to normal setting\n if (!hooks || !(\"set\" in hooks) || hooks.set(this, val, \"value\") === undefined) {\n this.value = val;\n }\n });\n }\n });\n jQuery.extend({\n valHooks: {\n option: {\n get: function get(elem) {\n var val = jQuery.find.attr(elem, \"value\");\n return val != null ? val :\n // Support: IE <=10 - 11 only\n // option.text throws exceptions (trac-14686, trac-14858)\n // Strip and collapse whitespace\n // https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n stripAndCollapse(jQuery.text(elem));\n }\n },\n select: {\n get: function get(elem) {\n var value,\n option,\n i,\n options = elem.options,\n index = elem.selectedIndex,\n one = elem.type === \"select-one\",\n values = one ? null : [],\n max = one ? index + 1 : options.length;\n if (index < 0) {\n i = max;\n } else {\n i = one ? index : 0;\n }\n\n // Loop through all the selected options\n for (; i < max; i++) {\n option = options[i];\n\n // Support: IE <=9 only\n // IE8-9 doesn't update selected after form reset (trac-2551)\n if ((option.selected || i === index) &&\n // Don't return options that are disabled or in a disabled optgroup\n !option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, \"optgroup\"))) {\n // Get the specific value for the option\n value = jQuery(option).val();\n\n // We don't need an array for one selects\n if (one) {\n return value;\n }\n\n // Multi-Selects return an array\n values.push(value);\n }\n }\n return values;\n },\n set: function set(elem, value) {\n var optionSet,\n option,\n options = elem.options,\n values = jQuery.makeArray(value),\n i = options.length;\n while (i--) {\n option = options[i];\n\n /* eslint-disable no-cond-assign */\n\n if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {\n optionSet = true;\n }\n\n /* eslint-enable no-cond-assign */\n }\n\n // Force browsers to behave consistently when non-matching value is set\n if (!optionSet) {\n elem.selectedIndex = -1;\n }\n return values;\n }\n }\n }\n });\n\n // Radios and checkboxes getter/setter\n jQuery.each([\"radio\", \"checkbox\"], function () {\n jQuery.valHooks[this] = {\n set: function set(elem, value) {\n if (Array.isArray(value)) {\n return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;\n }\n }\n };\n if (!support.checkOn) {\n jQuery.valHooks[this].get = function (elem) {\n return elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n };\n }\n });\n\n // Return jQuery for attributes-only inclusion\n var location = window.location;\n var nonce = {\n guid: Date.now()\n };\n var rquery = /\\?/;\n\n // Cross-browser xml parsing\n jQuery.parseXML = function (data) {\n var xml, parserErrorElem;\n if (!data || typeof data !== \"string\") {\n return null;\n }\n\n // Support: IE 9 - 11 only\n // IE throws on parseFromString with invalid input.\n try {\n xml = new window.DOMParser().parseFromString(data, \"text/xml\");\n } catch (e) {}\n parserErrorElem = xml && xml.getElementsByTagName(\"parsererror\")[0];\n if (!xml || parserErrorElem) {\n jQuery.error(\"Invalid XML: \" + (parserErrorElem ? jQuery.map(parserErrorElem.childNodes, function (el) {\n return el.textContent;\n }).join(\"\\n\") : data));\n }\n return xml;\n };\n var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n stopPropagationCallback = function stopPropagationCallback(e) {\n e.stopPropagation();\n };\n jQuery.extend(jQuery.event, {\n trigger: function trigger(event, data, elem, onlyHandlers) {\n var i,\n cur,\n tmp,\n bubbleType,\n ontype,\n handle,\n special,\n lastElement,\n eventPath = [elem || document],\n type = hasOwn.call(event, \"type\") ? event.type : event,\n namespaces = hasOwn.call(event, \"namespace\") ? event.namespace.split(\".\") : [];\n cur = lastElement = tmp = elem = elem || document;\n\n // Don't do events on text and comment nodes\n if (elem.nodeType === 3 || elem.nodeType === 8) {\n return;\n }\n\n // focus/blur morphs to focusin/out; ensure we're not firing them right now\n if (rfocusMorph.test(type + jQuery.event.triggered)) {\n return;\n }\n if (type.indexOf(\".\") > -1) {\n // Namespaced trigger; create a regexp to match event type in handle()\n namespaces = type.split(\".\");\n type = namespaces.shift();\n namespaces.sort();\n }\n ontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n // Caller can pass in a jQuery.Event object, Object, or just an event type string\n event = event[jQuery.expando] ? event : new jQuery.Event(type, _typeof$1(event) === \"object\" && event);\n\n // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n event.isTrigger = onlyHandlers ? 2 : 3;\n event.namespace = namespaces.join(\".\");\n event.rnamespace = event.namespace ? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\") : null;\n\n // Clean up the event in case it is being reused\n event.result = undefined;\n if (!event.target) {\n event.target = elem;\n }\n\n // Clone any incoming data and prepend the event, creating the handler arg list\n data = data == null ? [event] : jQuery.makeArray(data, [event]);\n\n // Allow special events to draw outside the lines\n special = jQuery.event.special[type] || {};\n if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {\n return;\n }\n\n // Determine event propagation path in advance, per W3C events spec (trac-9951)\n // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n if (!onlyHandlers && !special.noBubble && !isWindow(elem)) {\n bubbleType = special.delegateType || type;\n if (!rfocusMorph.test(bubbleType + type)) {\n cur = cur.parentNode;\n }\n for (; cur; cur = cur.parentNode) {\n eventPath.push(cur);\n tmp = cur;\n }\n\n // Only add window if we got to document (e.g., not plain obj or detached DOM)\n if (tmp === (elem.ownerDocument || document)) {\n eventPath.push(tmp.defaultView || tmp.parentWindow || window);\n }\n }\n\n // Fire handlers on the event path\n i = 0;\n while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {\n lastElement = cur;\n event.type = i > 1 ? bubbleType : special.bindType || type;\n\n // jQuery handler\n handle = (dataPriv.get(cur, \"events\") || Object.create(null))[event.type] && dataPriv.get(cur, \"handle\");\n if (handle) {\n handle.apply(cur, data);\n }\n\n // Native handler\n handle = ontype && cur[ontype];\n if (handle && handle.apply && acceptData(cur)) {\n event.result = handle.apply(cur, data);\n if (event.result === false) {\n event.preventDefault();\n }\n }\n }\n event.type = type;\n\n // If nobody prevented the default action, do it now\n if (!onlyHandlers && !event.isDefaultPrevented()) {\n if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {\n // Call a native DOM method on the target with the same name as the event.\n // Don't do default actions on window, that's where global variables be (trac-6170)\n if (ontype && isFunction(elem[type]) && !isWindow(elem)) {\n // Don't re-trigger an onFOO event when we call its FOO() method\n tmp = elem[ontype];\n if (tmp) {\n elem[ontype] = null;\n }\n\n // Prevent re-triggering of the same event, since we already bubbled it above\n jQuery.event.triggered = type;\n if (event.isPropagationStopped()) {\n lastElement.addEventListener(type, stopPropagationCallback);\n }\n elem[type]();\n if (event.isPropagationStopped()) {\n lastElement.removeEventListener(type, stopPropagationCallback);\n }\n jQuery.event.triggered = undefined;\n if (tmp) {\n elem[ontype] = tmp;\n }\n }\n }\n }\n return event.result;\n },\n // Piggyback on a donor event to simulate a different one\n // Used only for `focus(in | out)` events\n simulate: function simulate(type, elem, event) {\n var e = jQuery.extend(new jQuery.Event(), event, {\n type: type,\n isSimulated: true\n });\n jQuery.event.trigger(e, null, elem);\n }\n });\n jQuery.fn.extend({\n trigger: function trigger(type, data) {\n return this.each(function () {\n jQuery.event.trigger(type, data, this);\n });\n },\n triggerHandler: function triggerHandler(type, data) {\n var elem = this[0];\n if (elem) {\n return jQuery.event.trigger(type, data, elem, true);\n }\n }\n });\n var rbracket = /\\[\\]$/,\n rCRLF = /\\r?\\n/g,\n rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n rsubmittable = /^(?:input|select|textarea|keygen)/i;\n function buildParams(prefix, obj, traditional, add) {\n var name;\n if (Array.isArray(obj)) {\n // Serialize array item.\n jQuery.each(obj, function (i, v) {\n if (traditional || rbracket.test(prefix)) {\n // Treat each array item as a scalar.\n add(prefix, v);\n } else {\n // Item is non-scalar (array or object), encode its numeric index.\n buildParams(prefix + \"[\" + (_typeof$1(v) === \"object\" && v != null ? i : \"\") + \"]\", v, traditional, add);\n }\n });\n } else if (!traditional && toType(obj) === \"object\") {\n // Serialize object item.\n for (name in obj) {\n buildParams(prefix + \"[\" + name + \"]\", obj[name], traditional, add);\n }\n } else {\n // Serialize scalar item.\n add(prefix, obj);\n }\n }\n\n // Serialize an array of form elements or a set of\n // key/values into a query string\n jQuery.param = function (a, traditional) {\n var prefix,\n s = [],\n add = function add(key, valueOrFunction) {\n // If value is a function, invoke it and use its return value\n var value = isFunction(valueOrFunction) ? valueOrFunction() : valueOrFunction;\n s[s.length] = encodeURIComponent(key) + \"=\" + encodeURIComponent(value == null ? \"\" : value);\n };\n if (a == null) {\n return \"\";\n }\n\n // If an array was passed in, assume that it is an array of form elements.\n if (Array.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {\n // Serialize the form elements\n jQuery.each(a, function () {\n add(this.name, this.value);\n });\n } else {\n // If traditional, encode the \"old\" way (the way 1.3.2 or older\n // did it), otherwise encode params recursively.\n for (prefix in a) {\n buildParams(prefix, a[prefix], traditional, add);\n }\n }\n\n // Return the resulting serialization\n return s.join(\"&\");\n };\n jQuery.fn.extend({\n serialize: function serialize() {\n return jQuery.param(this.serializeArray());\n },\n serializeArray: function serializeArray() {\n return this.map(function () {\n // Can add propHook for \"elements\" to filter or add form elements\n var elements = jQuery.prop(this, \"elements\");\n return elements ? jQuery.makeArray(elements) : this;\n }).filter(function () {\n var type = this.type;\n\n // Use .is( \":disabled\" ) so that fieldset[disabled] works\n return this.name && !jQuery(this).is(\":disabled\") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));\n }).map(function (_i, elem) {\n var val = jQuery(this).val();\n if (val == null) {\n return null;\n }\n if (Array.isArray(val)) {\n return jQuery.map(val, function (val) {\n return {\n name: elem.name,\n value: val.replace(rCRLF, \"\\r\\n\")\n };\n });\n }\n return {\n name: elem.name,\n value: val.replace(rCRLF, \"\\r\\n\")\n };\n }).get();\n }\n });\n var r20 = /%20/g,\n rhash = /#.*$/,\n rantiCache = /([?&])_=[^&]*/,\n rheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n // trac-7653, trac-8125, trac-8152: local protocol detection\n rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n rnoContent = /^(?:GET|HEAD)$/,\n rprotocol = /^\\/\\//,\n /* Prefilters\n * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n * 2) These are called:\n * - BEFORE asking for a transport\n * - AFTER param serialization (s.data is a string if s.processData is true)\n * 3) key is the dataType\n * 4) the catchall symbol \"*\" can be used\n * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n */\n prefilters = {},\n /* Transports bindings\n * 1) key is the dataType\n * 2) the catchall symbol \"*\" can be used\n * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n */\n transports = {},\n // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n allTypes = \"*/\".concat(\"*\"),\n // Anchor tag for parsing the document origin\n originAnchor = document.createElement(\"a\");\n originAnchor.href = location.href;\n\n // Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\n function addToPrefiltersOrTransports(structure) {\n // dataTypeExpression is optional and defaults to \"*\"\n return function (dataTypeExpression, func) {\n if (typeof dataTypeExpression !== \"string\") {\n func = dataTypeExpression;\n dataTypeExpression = \"*\";\n }\n var dataType,\n i = 0,\n dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || [];\n if (isFunction(func)) {\n // For each dataType in the dataTypeExpression\n while (dataType = dataTypes[i++]) {\n // Prepend if requested\n if (dataType[0] === \"+\") {\n dataType = dataType.slice(1) || \"*\";\n (structure[dataType] = structure[dataType] || []).unshift(func);\n\n // Otherwise append\n } else {\n (structure[dataType] = structure[dataType] || []).push(func);\n }\n }\n }\n };\n }\n\n // Base inspection function for prefilters and transports\n function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {\n var inspected = {},\n seekingTransport = structure === transports;\n function inspect(dataType) {\n var selected;\n inspected[dataType] = true;\n jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {\n var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);\n if (typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[dataTypeOrTransport]) {\n options.dataTypes.unshift(dataTypeOrTransport);\n inspect(dataTypeOrTransport);\n return false;\n } else if (seekingTransport) {\n return !(selected = dataTypeOrTransport);\n }\n });\n return selected;\n }\n return inspect(options.dataTypes[0]) || !inspected[\"*\"] && inspect(\"*\");\n }\n\n // A special extend for ajax options\n // that takes \"flat\" options (not to be deep extended)\n // Fixes trac-9887\n function ajaxExtend(target, src) {\n var key,\n deep,\n flatOptions = jQuery.ajaxSettings.flatOptions || {};\n for (key in src) {\n if (src[key] !== undefined) {\n (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];\n }\n }\n if (deep) {\n jQuery.extend(true, target, deep);\n }\n return target;\n }\n\n /* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\n function ajaxHandleResponses(s, jqXHR, responses) {\n var ct,\n type,\n finalDataType,\n firstDataType,\n contents = s.contents,\n dataTypes = s.dataTypes;\n\n // Remove auto dataType and get content-type in the process\n while (dataTypes[0] === \"*\") {\n dataTypes.shift();\n if (ct === undefined) {\n ct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n }\n }\n\n // Check if we're dealing with a known content-type\n if (ct) {\n for (type in contents) {\n if (contents[type] && contents[type].test(ct)) {\n dataTypes.unshift(type);\n break;\n }\n }\n }\n\n // Check to see if we have a response for the expected dataType\n if (dataTypes[0] in responses) {\n finalDataType = dataTypes[0];\n } else {\n // Try convertible dataTypes\n for (type in responses) {\n if (!dataTypes[0] || s.converters[type + \" \" + dataTypes[0]]) {\n finalDataType = type;\n break;\n }\n if (!firstDataType) {\n firstDataType = type;\n }\n }\n\n // Or just use first one\n finalDataType = finalDataType || firstDataType;\n }\n\n // If we found a dataType\n // We add the dataType to the list if needed\n // and return the corresponding response\n if (finalDataType) {\n if (finalDataType !== dataTypes[0]) {\n dataTypes.unshift(finalDataType);\n }\n return responses[finalDataType];\n }\n }\n\n /* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\n function ajaxConvert(s, response, jqXHR, isSuccess) {\n var conv2,\n current,\n conv,\n tmp,\n prev,\n converters = {},\n // Work with a copy of dataTypes in case we need to modify it for conversion\n dataTypes = s.dataTypes.slice();\n\n // Create converters map with lowercased keys\n if (dataTypes[1]) {\n for (conv in s.converters) {\n converters[conv.toLowerCase()] = s.converters[conv];\n }\n }\n current = dataTypes.shift();\n\n // Convert to each sequential dataType\n while (current) {\n if (s.responseFields[current]) {\n jqXHR[s.responseFields[current]] = response;\n }\n\n // Apply the dataFilter if provided\n if (!prev && isSuccess && s.dataFilter) {\n response = s.dataFilter(response, s.dataType);\n }\n prev = current;\n current = dataTypes.shift();\n if (current) {\n // There's only work to do if current dataType is non-auto\n if (current === \"*\") {\n current = prev;\n\n // Convert response if prev dataType is non-auto and differs from current\n } else if (prev !== \"*\" && prev !== current) {\n // Seek a direct converter\n conv = converters[prev + \" \" + current] || converters[\"* \" + current];\n\n // If none found, seek a pair\n if (!conv) {\n for (conv2 in converters) {\n // If conv2 outputs current\n tmp = conv2.split(\" \");\n if (tmp[1] === current) {\n // If prev can be converted to accepted input\n conv = converters[prev + \" \" + tmp[0]] || converters[\"* \" + tmp[0]];\n if (conv) {\n // Condense equivalence converters\n if (conv === true) {\n conv = converters[conv2];\n\n // Otherwise, insert the intermediate dataType\n } else if (converters[conv2] !== true) {\n current = tmp[0];\n dataTypes.unshift(tmp[1]);\n }\n break;\n }\n }\n }\n }\n\n // Apply converter (if not an equivalence)\n if (conv !== true) {\n // Unless errors are allowed to bubble, catch and return them\n if (conv && s[\"throws\"]) {\n response = conv(response);\n } else {\n try {\n response = conv(response);\n } catch (e) {\n return {\n state: \"parsererror\",\n error: conv ? e : \"No conversion from \" + prev + \" to \" + current\n };\n }\n }\n }\n }\n }\n }\n return {\n state: \"success\",\n data: response\n };\n }\n jQuery.extend({\n // Counter for holding the number of active queries\n active: 0,\n // Last-Modified header cache for next request\n lastModified: {},\n etag: {},\n ajaxSettings: {\n url: location.href,\n type: \"GET\",\n isLocal: rlocalProtocol.test(location.protocol),\n global: true,\n processData: true,\n async: true,\n contentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n /*\n timeout: 0,\n data: null,\n dataType: null,\n username: null,\n password: null,\n cache: null,\n throws: false,\n traditional: false,\n headers: {},\n */\n\n accepts: {\n \"*\": allTypes,\n text: \"text/plain\",\n html: \"text/html\",\n xml: \"application/xml, text/xml\",\n json: \"application/json, text/javascript\"\n },\n contents: {\n xml: /\\bxml\\b/,\n html: /\\bhtml/,\n json: /\\bjson\\b/\n },\n responseFields: {\n xml: \"responseXML\",\n text: \"responseText\",\n json: \"responseJSON\"\n },\n // Data converters\n // Keys separate source (or catchall \"*\") and destination types with a single space\n converters: {\n // Convert anything to text\n \"* text\": String,\n // Text to html (true = no transformation)\n \"text html\": true,\n // Evaluate text as a json expression\n \"text json\": JSON.parse,\n // Parse text as xml\n \"text xml\": jQuery.parseXML\n },\n // For options that shouldn't be deep extended:\n // you can add your own custom options here if\n // and when you create one that shouldn't be\n // deep extended (see ajaxExtend)\n flatOptions: {\n url: true,\n context: true\n }\n },\n // Creates a full fledged settings object into target\n // with both ajaxSettings and settings fields.\n // If target is omitted, writes into ajaxSettings.\n ajaxSetup: function ajaxSetup(target, settings) {\n return settings ?\n // Building a settings object\n ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :\n // Extending ajaxSettings\n ajaxExtend(jQuery.ajaxSettings, target);\n },\n ajaxPrefilter: addToPrefiltersOrTransports(prefilters),\n ajaxTransport: addToPrefiltersOrTransports(transports),\n // Main method\n ajax: function ajax(url, options) {\n // If url is an object, simulate pre-1.5 signature\n if (_typeof$1(url) === \"object\") {\n options = url;\n url = undefined;\n }\n\n // Force options to be an object\n options = options || {};\n var transport,\n // URL without anti-cache param\n cacheURL,\n // Response headers\n responseHeadersString,\n responseHeaders,\n // timeout handle\n timeoutTimer,\n // Url cleanup var\n urlAnchor,\n // Request state (becomes false upon send and true upon completion)\n completed,\n // To know if global events are to be dispatched\n fireGlobals,\n // Loop variable\n i,\n // uncached part of the url\n uncached,\n // Create the final options object\n s = jQuery.ajaxSetup({}, options),\n // Callbacks context\n callbackContext = s.context || s,\n // Context for global events is callbackContext if it is a DOM node or jQuery collection\n globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event,\n // Deferreds\n deferred = jQuery.Deferred(),\n completeDeferred = jQuery.Callbacks(\"once memory\"),\n // Status-dependent callbacks\n _statusCode = s.statusCode || {},\n // Headers (they are sent all at once)\n requestHeaders = {},\n requestHeadersNames = {},\n // Default abort message\n strAbort = \"canceled\",\n // Fake xhr\n jqXHR = {\n readyState: 0,\n // Builds headers hashtable if needed\n getResponseHeader: function getResponseHeader(key) {\n var match;\n if (completed) {\n if (!responseHeaders) {\n responseHeaders = {};\n while (match = rheaders.exec(responseHeadersString)) {\n responseHeaders[match[1].toLowerCase() + \" \"] = (responseHeaders[match[1].toLowerCase() + \" \"] || []).concat(match[2]);\n }\n }\n match = responseHeaders[key.toLowerCase() + \" \"];\n }\n return match == null ? null : match.join(\", \");\n },\n // Raw string\n getAllResponseHeaders: function getAllResponseHeaders() {\n return completed ? responseHeadersString : null;\n },\n // Caches the header\n setRequestHeader: function setRequestHeader(name, value) {\n if (completed == null) {\n name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name;\n requestHeaders[name] = value;\n }\n return this;\n },\n // Overrides response content-type header\n overrideMimeType: function overrideMimeType(type) {\n if (completed == null) {\n s.mimeType = type;\n }\n return this;\n },\n // Status-dependent callbacks\n statusCode: function statusCode(map) {\n var code;\n if (map) {\n if (completed) {\n // Execute the appropriate callbacks\n jqXHR.always(map[jqXHR.status]);\n } else {\n // Lazy-add the new callbacks in a way that preserves old ones\n for (code in map) {\n _statusCode[code] = [_statusCode[code], map[code]];\n }\n }\n }\n return this;\n },\n // Cancel the request\n abort: function abort(statusText) {\n var finalText = statusText || strAbort;\n if (transport) {\n transport.abort(finalText);\n }\n done(0, finalText);\n return this;\n }\n };\n\n // Attach deferreds\n deferred.promise(jqXHR);\n\n // Add protocol if not provided (prefilters might expect it)\n // Handle falsy url in the settings object (trac-10093: consistency with old signature)\n // We also use the url parameter if available\n s.url = ((url || s.url || location.href) + \"\").replace(rprotocol, location.protocol + \"//\");\n\n // Alias method option to type as per ticket trac-12004\n s.type = options.method || options.type || s.method || s.type;\n\n // Extract dataTypes list\n s.dataTypes = (s.dataType || \"*\").toLowerCase().match(rnothtmlwhite) || [\"\"];\n\n // A cross-domain request is in order when the origin doesn't match the current origin.\n if (s.crossDomain == null) {\n urlAnchor = document.createElement(\"a\");\n\n // Support: IE <=8 - 11, Edge 12 - 15\n // IE throws exception on accessing the href property if url is malformed,\n // e.g. http://example.com:80x/\n try {\n urlAnchor.href = s.url;\n\n // Support: IE <=8 - 11 only\n // Anchor's host property isn't correctly set when s.url is relative\n urlAnchor.href = urlAnchor.href;\n s.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !== urlAnchor.protocol + \"//\" + urlAnchor.host;\n } catch (e) {\n // If there is an error parsing the URL, assume it is crossDomain,\n // it can be rejected by the transport if it is invalid\n s.crossDomain = true;\n }\n }\n\n // Convert data if not already a string\n if (s.data && s.processData && typeof s.data !== \"string\") {\n s.data = jQuery.param(s.data, s.traditional);\n }\n\n // Apply prefilters\n inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);\n\n // If request was aborted inside a prefilter, stop there\n if (completed) {\n return jqXHR;\n }\n\n // We can fire global events as of now if asked to\n // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n fireGlobals = jQuery.event && s.global;\n\n // Watch for a new set of requests\n if (fireGlobals && jQuery.active++ === 0) {\n jQuery.event.trigger(\"ajaxStart\");\n }\n\n // Uppercase the type\n s.type = s.type.toUpperCase();\n\n // Determine if request has content\n s.hasContent = !rnoContent.test(s.type);\n\n // Save the URL in case we're toying with the If-Modified-Since\n // and/or If-None-Match header later on\n // Remove hash to simplify url manipulation\n cacheURL = s.url.replace(rhash, \"\");\n\n // More options handling for requests with no content\n if (!s.hasContent) {\n // Remember the hash so we can put it back\n uncached = s.url.slice(cacheURL.length);\n\n // If data is available and should be processed, append data to url\n if (s.data && (s.processData || typeof s.data === \"string\")) {\n cacheURL += (rquery.test(cacheURL) ? \"&\" : \"?\") + s.data;\n\n // trac-9682: remove data so that it's not used in an eventual retry\n delete s.data;\n }\n\n // Add or update anti-cache param if needed\n if (s.cache === false) {\n cacheURL = cacheURL.replace(rantiCache, \"$1\");\n uncached = (rquery.test(cacheURL) ? \"&\" : \"?\") + \"_=\" + nonce.guid++ + uncached;\n }\n\n // Put hash and anti-cache on the URL that will be requested (gh-1732)\n s.url = cacheURL + uncached;\n\n // Change '%20' to '+' if this is encoded form body content (gh-2658)\n } else if (s.data && s.processData && (s.contentType || \"\").indexOf(\"application/x-www-form-urlencoded\") === 0) {\n s.data = s.data.replace(r20, \"+\");\n }\n\n // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n if (s.ifModified) {\n if (jQuery.lastModified[cacheURL]) {\n jqXHR.setRequestHeader(\"If-Modified-Since\", jQuery.lastModified[cacheURL]);\n }\n if (jQuery.etag[cacheURL]) {\n jqXHR.setRequestHeader(\"If-None-Match\", jQuery.etag[cacheURL]);\n }\n }\n\n // Set the correct header, if data is being sent\n if (s.data && s.hasContent && s.contentType !== false || options.contentType) {\n jqXHR.setRequestHeader(\"Content-Type\", s.contentType);\n }\n\n // Set the Accepts header for the server, depending on the dataType\n jqXHR.setRequestHeader(\"Accept\", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\") : s.accepts[\"*\"]);\n\n // Check for headers option\n for (i in s.headers) {\n jqXHR.setRequestHeader(i, s.headers[i]);\n }\n\n // Allow custom headers/mimetypes and early abort\n if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed)) {\n // Abort if not done already and return\n return jqXHR.abort();\n }\n\n // Aborting is no longer a cancellation\n strAbort = \"abort\";\n\n // Install callbacks on deferreds\n completeDeferred.add(s.complete);\n jqXHR.done(s.success);\n jqXHR.fail(s.error);\n\n // Get transport\n transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);\n\n // If no transport, we auto-abort\n if (!transport) {\n done(-1, \"No Transport\");\n } else {\n jqXHR.readyState = 1;\n\n // Send global event\n if (fireGlobals) {\n globalEventContext.trigger(\"ajaxSend\", [jqXHR, s]);\n }\n\n // If request was aborted inside ajaxSend, stop there\n if (completed) {\n return jqXHR;\n }\n\n // Timeout\n if (s.async && s.timeout > 0) {\n timeoutTimer = window.setTimeout(function () {\n jqXHR.abort(\"timeout\");\n }, s.timeout);\n }\n try {\n completed = false;\n transport.send(requestHeaders, done);\n } catch (e) {\n // Rethrow post-completion exceptions\n if (completed) {\n throw e;\n }\n\n // Propagate others as results\n done(-1, e);\n }\n }\n\n // Callback for when everything is done\n function done(status, nativeStatusText, responses, headers) {\n var isSuccess,\n success,\n error,\n response,\n modified,\n statusText = nativeStatusText;\n\n // Ignore repeat invocations\n if (completed) {\n return;\n }\n completed = true;\n\n // Clear timeout if it exists\n if (timeoutTimer) {\n window.clearTimeout(timeoutTimer);\n }\n\n // Dereference transport for early garbage collection\n // (no matter how long the jqXHR object will be used)\n transport = undefined;\n\n // Cache response headers\n responseHeadersString = headers || \"\";\n\n // Set readyState\n jqXHR.readyState = status > 0 ? 4 : 0;\n\n // Determine if successful\n isSuccess = status >= 200 && status < 300 || status === 304;\n\n // Get response data\n if (responses) {\n response = ajaxHandleResponses(s, jqXHR, responses);\n }\n\n // Use a noop converter for missing script but not if jsonp\n if (!isSuccess && jQuery.inArray(\"script\", s.dataTypes) > -1 && jQuery.inArray(\"json\", s.dataTypes) < 0) {\n s.converters[\"text script\"] = function () {};\n }\n\n // Convert no matter what (that way responseXXX fields are always set)\n response = ajaxConvert(s, response, jqXHR, isSuccess);\n\n // If successful, handle type chaining\n if (isSuccess) {\n // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n if (s.ifModified) {\n modified = jqXHR.getResponseHeader(\"Last-Modified\");\n if (modified) {\n jQuery.lastModified[cacheURL] = modified;\n }\n modified = jqXHR.getResponseHeader(\"etag\");\n if (modified) {\n jQuery.etag[cacheURL] = modified;\n }\n }\n\n // if no content\n if (status === 204 || s.type === \"HEAD\") {\n statusText = \"nocontent\";\n\n // if not modified\n } else if (status === 304) {\n statusText = \"notmodified\";\n\n // If we have data, let's convert it\n } else {\n statusText = response.state;\n success = response.data;\n error = response.error;\n isSuccess = !error;\n }\n } else {\n // Extract error from statusText and normalize for non-aborts\n error = statusText;\n if (status || !statusText) {\n statusText = \"error\";\n if (status < 0) {\n status = 0;\n }\n }\n }\n\n // Set data for the fake xhr object\n jqXHR.status = status;\n jqXHR.statusText = (nativeStatusText || statusText) + \"\";\n\n // Success/Error\n if (isSuccess) {\n deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);\n } else {\n deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);\n }\n\n // Status-dependent callbacks\n jqXHR.statusCode(_statusCode);\n _statusCode = undefined;\n if (fireGlobals) {\n globalEventContext.trigger(isSuccess ? \"ajaxSuccess\" : \"ajaxError\", [jqXHR, s, isSuccess ? success : error]);\n }\n\n // Complete\n completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);\n if (fireGlobals) {\n globalEventContext.trigger(\"ajaxComplete\", [jqXHR, s]);\n\n // Handle the global AJAX counter\n if (! --jQuery.active) {\n jQuery.event.trigger(\"ajaxStop\");\n }\n }\n }\n return jqXHR;\n },\n getJSON: function getJSON(url, data, callback) {\n return jQuery.get(url, data, callback, \"json\");\n },\n getScript: function getScript(url, callback) {\n return jQuery.get(url, undefined, callback, \"script\");\n }\n });\n jQuery.each([\"get\", \"post\"], function (_i, method) {\n jQuery[method] = function (url, data, callback, type) {\n // Shift arguments if data argument was omitted\n if (isFunction(data)) {\n type = type || callback;\n callback = data;\n data = undefined;\n }\n\n // The url can be an options object (which then must have .url)\n return jQuery.ajax(jQuery.extend({\n url: url,\n type: method,\n dataType: type,\n data: data,\n success: callback\n }, jQuery.isPlainObject(url) && url));\n };\n });\n jQuery.ajaxPrefilter(function (s) {\n var i;\n for (i in s.headers) {\n if (i.toLowerCase() === \"content-type\") {\n s.contentType = s.headers[i] || \"\";\n }\n }\n });\n jQuery._evalUrl = function (url, options, doc) {\n return jQuery.ajax({\n url: url,\n // Make this explicit, since user can override this through ajaxSetup (trac-11264)\n type: \"GET\",\n dataType: \"script\",\n cache: true,\n async: false,\n global: false,\n // Only evaluate the response if it is successful (gh-4126)\n // dataFilter is not invoked for failure responses, so using it instead\n // of the default converter is kludgy but it works.\n converters: {\n \"text script\": function textScript() {}\n },\n dataFilter: function dataFilter(response) {\n jQuery.globalEval(response, options, doc);\n }\n });\n };\n jQuery.fn.extend({\n wrapAll: function wrapAll(html) {\n var wrap;\n if (this[0]) {\n if (isFunction(html)) {\n html = html.call(this[0]);\n }\n\n // The elements to wrap the target around\n wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);\n if (this[0].parentNode) {\n wrap.insertBefore(this[0]);\n }\n wrap.map(function () {\n var elem = this;\n while (elem.firstElementChild) {\n elem = elem.firstElementChild;\n }\n return elem;\n }).append(this);\n }\n return this;\n },\n wrapInner: function wrapInner(html) {\n if (isFunction(html)) {\n return this.each(function (i) {\n jQuery(this).wrapInner(html.call(this, i));\n });\n }\n return this.each(function () {\n var self = jQuery(this),\n contents = self.contents();\n if (contents.length) {\n contents.wrapAll(html);\n } else {\n self.append(html);\n }\n });\n },\n wrap: function wrap(html) {\n var htmlIsFunction = isFunction(html);\n return this.each(function (i) {\n jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html);\n });\n },\n unwrap: function unwrap(selector) {\n this.parent(selector).not(\"body\").each(function () {\n jQuery(this).replaceWith(this.childNodes);\n });\n return this;\n }\n });\n jQuery.expr.pseudos.hidden = function (elem) {\n return !jQuery.expr.pseudos.visible(elem);\n };\n jQuery.expr.pseudos.visible = function (elem) {\n return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\n };\n jQuery.ajaxSettings.xhr = function () {\n try {\n return new window.XMLHttpRequest();\n } catch (e) {}\n };\n var xhrSuccessStatus = {\n // File protocol always yields status code 0, assume 200\n 0: 200,\n // Support: IE <=9 only\n // trac-1450: sometimes IE returns 1223 when it should be 204\n 1223: 204\n },\n xhrSupported = jQuery.ajaxSettings.xhr();\n support.cors = !!xhrSupported && \"withCredentials\" in xhrSupported;\n support.ajax = xhrSupported = !!xhrSupported;\n jQuery.ajaxTransport(function (options) {\n var _callback, errorCallback;\n\n // Cross domain only allowed if supported through XMLHttpRequest\n if (support.cors || xhrSupported && !options.crossDomain) {\n return {\n send: function send(headers, complete) {\n var i,\n xhr = options.xhr();\n xhr.open(options.type, options.url, options.async, options.username, options.password);\n\n // Apply custom fields if provided\n if (options.xhrFields) {\n for (i in options.xhrFields) {\n xhr[i] = options.xhrFields[i];\n }\n }\n\n // Override mime type if needed\n if (options.mimeType && xhr.overrideMimeType) {\n xhr.overrideMimeType(options.mimeType);\n }\n\n // X-Requested-With header\n // For cross-domain requests, seeing as conditions for a preflight are\n // akin to a jigsaw puzzle, we simply never set it to be sure.\n // (it can always be set on a per-request basis or even using ajaxSetup)\n // For same-domain requests, won't change header if already provided.\n if (!options.crossDomain && !headers[\"X-Requested-With\"]) {\n headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n }\n\n // Set headers\n for (i in headers) {\n xhr.setRequestHeader(i, headers[i]);\n }\n\n // Callback\n _callback = function callback(type) {\n return function () {\n if (_callback) {\n _callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null;\n if (type === \"abort\") {\n xhr.abort();\n } else if (type === \"error\") {\n // Support: IE <=9 only\n // On a manual native abort, IE9 throws\n // errors on any property access that is not readyState\n if (typeof xhr.status !== \"number\") {\n complete(0, \"error\");\n } else {\n complete(\n // File: protocol always yields status 0; see trac-8605, trac-14207\n xhr.status, xhr.statusText);\n }\n } else {\n complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText,\n // Support: IE <=9 only\n // IE9 has no XHR2 but throws on binary (trac-11426)\n // For XHR2 non-text, let the caller handle it (gh-2498)\n (xhr.responseType || \"text\") !== \"text\" || typeof xhr.responseText !== \"string\" ? {\n binary: xhr.response\n } : {\n text: xhr.responseText\n }, xhr.getAllResponseHeaders());\n }\n }\n };\n };\n\n // Listen to events\n xhr.onload = _callback();\n errorCallback = xhr.onerror = xhr.ontimeout = _callback(\"error\");\n\n // Support: IE 9 only\n // Use onreadystatechange to replace onabort\n // to handle uncaught aborts\n if (xhr.onabort !== undefined) {\n xhr.onabort = errorCallback;\n } else {\n xhr.onreadystatechange = function () {\n // Check readyState before timeout as it changes\n if (xhr.readyState === 4) {\n // Allow onerror to be called first,\n // but that will not handle a native abort\n // Also, save errorCallback to a variable\n // as xhr.onerror cannot be accessed\n window.setTimeout(function () {\n if (_callback) {\n errorCallback();\n }\n });\n }\n };\n }\n\n // Create the abort callback\n _callback = _callback(\"abort\");\n try {\n // Do send the request (this may raise an exception)\n xhr.send(options.hasContent && options.data || null);\n } catch (e) {\n // trac-14683: Only rethrow if this hasn't been notified as an error yet\n if (_callback) {\n throw e;\n }\n }\n },\n abort: function abort() {\n if (_callback) {\n _callback();\n }\n }\n };\n }\n });\n\n // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\n jQuery.ajaxPrefilter(function (s) {\n if (s.crossDomain) {\n s.contents.script = false;\n }\n });\n\n // Install script dataType\n jQuery.ajaxSetup({\n accepts: {\n script: \"text/javascript, application/javascript, \" + \"application/ecmascript, application/x-ecmascript\"\n },\n contents: {\n script: /\\b(?:java|ecma)script\\b/\n },\n converters: {\n \"text script\": function textScript(text) {\n jQuery.globalEval(text);\n return text;\n }\n }\n });\n\n // Handle cache's special case and crossDomain\n jQuery.ajaxPrefilter(\"script\", function (s) {\n if (s.cache === undefined) {\n s.cache = false;\n }\n if (s.crossDomain) {\n s.type = \"GET\";\n }\n });\n\n // Bind script tag hack transport\n jQuery.ajaxTransport(\"script\", function (s) {\n // This transport only deals with cross domain or forced-by-attrs requests\n if (s.crossDomain || s.scriptAttrs) {\n var script, _callback2;\n return {\n send: function send(_, complete) {\n script = jQuery(\"<script>\").attr(s.scriptAttrs || {}).prop({\n charset: s.scriptCharset,\n src: s.url\n }).on(\"load error\", _callback2 = function callback(evt) {\n script.remove();\n _callback2 = null;\n if (evt) {\n complete(evt.type === \"error\" ? 404 : 200, evt.type);\n }\n });\n\n // Use native DOM manipulation to avoid our domManip AJAX trickery\n document.head.appendChild(script[0]);\n },\n abort: function abort() {\n if (_callback2) {\n _callback2();\n }\n }\n };\n }\n });\n var oldCallbacks = [],\n rjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n // Default jsonp settings\n jQuery.ajaxSetup({\n jsonp: \"callback\",\n jsonpCallback: function jsonpCallback() {\n var callback = oldCallbacks.pop() || jQuery.expando + \"_\" + nonce.guid++;\n this[callback] = true;\n return callback;\n }\n });\n\n // Detect, normalize options and install callbacks for jsonp requests\n jQuery.ajaxPrefilter(\"json jsonp\", function (s, originalSettings, jqXHR) {\n var callbackName,\n overwritten,\n responseContainer,\n jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? \"url\" : typeof s.data === \"string\" && (s.contentType || \"\").indexOf(\"application/x-www-form-urlencoded\") === 0 && rjsonp.test(s.data) && \"data\");\n\n // Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n if (jsonProp || s.dataTypes[0] === \"jsonp\") {\n // Get callback name, remembering preexisting value associated with it\n callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;\n\n // Insert callback into url or form data\n if (jsonProp) {\n s[jsonProp] = s[jsonProp].replace(rjsonp, \"$1\" + callbackName);\n } else if (s.jsonp !== false) {\n s.url += (rquery.test(s.url) ? \"&\" : \"?\") + s.jsonp + \"=\" + callbackName;\n }\n\n // Use data converter to retrieve json after script execution\n s.converters[\"script json\"] = function () {\n if (!responseContainer) {\n jQuery.error(callbackName + \" was not called\");\n }\n return responseContainer[0];\n };\n\n // Force json dataType\n s.dataTypes[0] = \"json\";\n\n // Install callback\n overwritten = window[callbackName];\n window[callbackName] = function () {\n responseContainer = arguments;\n };\n\n // Clean-up function (fires after converters)\n jqXHR.always(function () {\n // If previous value didn't exist - remove it\n if (overwritten === undefined) {\n jQuery(window).removeProp(callbackName);\n\n // Otherwise restore preexisting value\n } else {\n window[callbackName] = overwritten;\n }\n\n // Save back as free\n if (s[callbackName]) {\n // Make sure that re-using the options doesn't screw things around\n s.jsonpCallback = originalSettings.jsonpCallback;\n\n // Save the callback name for future use\n oldCallbacks.push(callbackName);\n }\n\n // Call if it was a function and we have a response\n if (responseContainer && isFunction(overwritten)) {\n overwritten(responseContainer[0]);\n }\n responseContainer = overwritten = undefined;\n });\n\n // Delegate to script\n return \"script\";\n }\n });\n\n // Support: Safari 8 only\n // In Safari 8 documents created via document.implementation.createHTMLDocument\n // collapse sibling forms: the second one becomes a child of the first one.\n // Because of that, this security measure has to be disabled in Safari 8.\n // https://bugs.webkit.org/show_bug.cgi?id=137337\n support.createHTMLDocument = function () {\n var body = document.implementation.createHTMLDocument(\"\").body;\n body.innerHTML = \"<form></form><form></form>\";\n return body.childNodes.length === 2;\n }();\n\n // Argument \"data\" should be string of html\n // context (optional): If specified, the fragment will be created in this context,\n // defaults to document\n // keepScripts (optional): If true, will include scripts passed in the html string\n jQuery.parseHTML = function (data, context, keepScripts) {\n if (typeof data !== \"string\") {\n return [];\n }\n if (typeof context === \"boolean\") {\n keepScripts = context;\n context = false;\n }\n var base, parsed, scripts;\n if (!context) {\n // Stop scripts or inline event handlers from being executed immediately\n // by using document.implementation\n if (support.createHTMLDocument) {\n context = document.implementation.createHTMLDocument(\"\");\n\n // Set the base href for the created document\n // so any parsed elements with URLs\n // are based on the document's URL (gh-2965)\n base = context.createElement(\"base\");\n base.href = document.location.href;\n context.head.appendChild(base);\n } else {\n context = document;\n }\n }\n parsed = rsingleTag.exec(data);\n scripts = !keepScripts && [];\n\n // Single tag\n if (parsed) {\n return [context.createElement(parsed[1])];\n }\n parsed = buildFragment([data], context, scripts);\n if (scripts && scripts.length) {\n jQuery(scripts).remove();\n }\n return jQuery.merge([], parsed.childNodes);\n };\n\n /**\n * Load a url into a page\n */\n jQuery.fn.load = function (url, params, callback) {\n var selector,\n type,\n response,\n self = this,\n off = url.indexOf(\" \");\n if (off > -1) {\n selector = stripAndCollapse(url.slice(off));\n url = url.slice(0, off);\n }\n\n // If it's a function\n if (isFunction(params)) {\n // We assume that it's the callback\n callback = params;\n params = undefined;\n\n // Otherwise, build a param string\n } else if (params && _typeof$1(params) === \"object\") {\n type = \"POST\";\n }\n\n // If we have elements to modify, make the request\n if (self.length > 0) {\n jQuery.ajax({\n url: url,\n // If \"type\" variable is undefined, then \"GET\" method will be used.\n // Make value of this field explicit since\n // user can override it through ajaxSetup method\n type: type || \"GET\",\n dataType: \"html\",\n data: params\n }).done(function (responseText) {\n // Save response for use in complete callback\n response = arguments;\n self.html(selector ?\n // If a selector was specified, locate the right elements in a dummy div\n // Exclude scripts to avoid IE 'Permission Denied' errors\n jQuery(\"<div>\").append(jQuery.parseHTML(responseText)).find(selector) :\n // Otherwise use the full result\n responseText);\n\n // If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n // but they are ignored because response was set above.\n // If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n }).always(callback && function (jqXHR, status) {\n self.each(function () {\n callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);\n });\n });\n }\n return this;\n };\n jQuery.expr.pseudos.animated = function (elem) {\n return jQuery.grep(jQuery.timers, function (fn) {\n return elem === fn.elem;\n }).length;\n };\n jQuery.offset = {\n setOffset: function setOffset(elem, options, i) {\n var curPosition,\n curLeft,\n curCSSTop,\n curTop,\n curOffset,\n curCSSLeft,\n calculatePosition,\n position = jQuery.css(elem, \"position\"),\n curElem = jQuery(elem),\n props = {};\n\n // Set position first, in-case top/left are set even on static elem\n if (position === \"static\") {\n elem.style.position = \"relative\";\n }\n curOffset = curElem.offset();\n curCSSTop = jQuery.css(elem, \"top\");\n curCSSLeft = jQuery.css(elem, \"left\");\n calculatePosition = (position === \"absolute\" || position === \"fixed\") && (curCSSTop + curCSSLeft).indexOf(\"auto\") > -1;\n\n // Need to be able to calculate position if either\n // top or left is auto and position is either absolute or fixed\n if (calculatePosition) {\n curPosition = curElem.position();\n curTop = curPosition.top;\n curLeft = curPosition.left;\n } else {\n curTop = parseFloat(curCSSTop) || 0;\n curLeft = parseFloat(curCSSLeft) || 0;\n }\n if (isFunction(options)) {\n // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n options = options.call(elem, i, jQuery.extend({}, curOffset));\n }\n if (options.top != null) {\n props.top = options.top - curOffset.top + curTop;\n }\n if (options.left != null) {\n props.left = options.left - curOffset.left + curLeft;\n }\n if (\"using\" in options) {\n options.using.call(elem, props);\n } else {\n curElem.css(props);\n }\n }\n };\n jQuery.fn.extend({\n // offset() relates an element's border box to the document origin\n offset: function offset(options) {\n // Preserve chaining for setter\n if (arguments.length) {\n return options === undefined ? this : this.each(function (i) {\n jQuery.offset.setOffset(this, options, i);\n });\n }\n var rect,\n win,\n elem = this[0];\n if (!elem) {\n return;\n }\n\n // Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n // Support: IE <=11 only\n // Running getBoundingClientRect on a\n // disconnected node in IE throws an error\n if (!elem.getClientRects().length) {\n return {\n top: 0,\n left: 0\n };\n }\n\n // Get document-relative position by adding viewport scroll to viewport-relative gBCR\n rect = elem.getBoundingClientRect();\n win = elem.ownerDocument.defaultView;\n return {\n top: rect.top + win.pageYOffset,\n left: rect.left + win.pageXOffset\n };\n },\n // position() relates an element's margin box to its offset parent's padding box\n // This corresponds to the behavior of CSS absolute positioning\n position: function position() {\n if (!this[0]) {\n return;\n }\n var offsetParent,\n offset,\n doc,\n elem = this[0],\n parentOffset = {\n top: 0,\n left: 0\n };\n\n // position:fixed elements are offset from the viewport, which itself always has zero offset\n if (jQuery.css(elem, \"position\") === \"fixed\") {\n // Assume position:fixed implies availability of getBoundingClientRect\n offset = elem.getBoundingClientRect();\n } else {\n offset = this.offset();\n\n // Account for the *real* offset parent, which can be the document or its root element\n // when a statically positioned element is identified\n doc = elem.ownerDocument;\n offsetParent = elem.offsetParent || doc.documentElement;\n while (offsetParent && (offsetParent === doc.body || offsetParent === doc.documentElement) && jQuery.css(offsetParent, \"position\") === \"static\") {\n offsetParent = offsetParent.parentNode;\n }\n if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) {\n // Incorporate borders into its offset, since they are outside its content origin\n parentOffset = jQuery(offsetParent).offset();\n parentOffset.top += jQuery.css(offsetParent, \"borderTopWidth\", true);\n parentOffset.left += jQuery.css(offsetParent, \"borderLeftWidth\", true);\n }\n }\n\n // Subtract parent offsets and element margins\n return {\n top: offset.top - parentOffset.top - jQuery.css(elem, \"marginTop\", true),\n left: offset.left - parentOffset.left - jQuery.css(elem, \"marginLeft\", true)\n };\n },\n // This method will return documentElement in the following cases:\n // 1) For the element inside the iframe without offsetParent, this method will return\n // documentElement of the parent window\n // 2) For the hidden or detached element\n // 3) For body or html element, i.e. in case of the html node - it will return itself\n //\n // but those exceptions were never presented as a real life use-cases\n // and might be considered as more preferable results.\n //\n // This logic, however, is not guaranteed and can change at any point in the future\n offsetParent: function offsetParent() {\n return this.map(function () {\n var offsetParent = this.offsetParent;\n while (offsetParent && jQuery.css(offsetParent, \"position\") === \"static\") {\n offsetParent = offsetParent.offsetParent;\n }\n return offsetParent || documentElement;\n });\n }\n });\n\n // Create scrollLeft and scrollTop methods\n jQuery.each({\n scrollLeft: \"pageXOffset\",\n scrollTop: \"pageYOffset\"\n }, function (method, prop) {\n var top = \"pageYOffset\" === prop;\n jQuery.fn[method] = function (val) {\n return access(this, function (elem, method, val) {\n // Coalesce documents and windows\n var win;\n if (isWindow(elem)) {\n win = elem;\n } else if (elem.nodeType === 9) {\n win = elem.defaultView;\n }\n if (val === undefined) {\n return win ? win[prop] : elem[method];\n }\n if (win) {\n win.scrollTo(!top ? val : win.pageXOffset, top ? val : win.pageYOffset);\n } else {\n elem[method] = val;\n }\n }, method, val, arguments.length);\n };\n });\n\n // Support: Safari <=7 - 9.1, Chrome <=37 - 49\n // Add the top/left cssHooks using jQuery.fn.position\n // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n // getComputedStyle returns percent when specified for top/left/bottom/right;\n // rather than make the css module depend on the offset module, just check for it here\n jQuery.each([\"top\", \"left\"], function (_i, prop) {\n jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) {\n if (computed) {\n computed = curCSS(elem, prop);\n\n // If curCSS returns percentage, fallback to offset\n return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + \"px\" : computed;\n }\n });\n });\n\n // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\n jQuery.each({\n Height: \"height\",\n Width: \"width\"\n }, function (name, type) {\n jQuery.each({\n padding: \"inner\" + name,\n content: type,\n \"\": \"outer\" + name\n }, function (defaultExtra, funcName) {\n // Margin is only for outerHeight, outerWidth\n jQuery.fn[funcName] = function (margin, value) {\n var chainable = arguments.length && (defaultExtra || typeof margin !== \"boolean\"),\n extra = defaultExtra || (margin === true || value === true ? \"margin\" : \"border\");\n return access(this, function (elem, type, value) {\n var doc;\n if (isWindow(elem)) {\n // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n return funcName.indexOf(\"outer\") === 0 ? elem[\"inner\" + name] : elem.document.documentElement[\"client\" + name];\n }\n\n // Get document width or height\n if (elem.nodeType === 9) {\n doc = elem.documentElement;\n\n // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n // whichever is greatest\n return Math.max(elem.body[\"scroll\" + name], doc[\"scroll\" + name], elem.body[\"offset\" + name], doc[\"offset\" + name], doc[\"client\" + name]);\n }\n return value === undefined ?\n // Get width or height on the element, requesting but not forcing parseFloat\n jQuery.css(elem, type, extra) :\n // Set width or height on the element\n jQuery.style(elem, type, value, extra);\n }, type, chainable ? margin : undefined, chainable);\n };\n });\n });\n jQuery.each([\"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\"], function (_i, type) {\n jQuery.fn[type] = function (fn) {\n return this.on(type, fn);\n };\n });\n jQuery.fn.extend({\n bind: function bind(types, data, fn) {\n return this.on(types, null, data, fn);\n },\n unbind: function unbind(types, fn) {\n return this.off(types, null, fn);\n },\n delegate: function delegate(selector, types, data, fn) {\n return this.on(types, selector, data, fn);\n },\n undelegate: function undelegate(selector, types, fn) {\n // ( namespace ) or ( selector, types [, fn] )\n return arguments.length === 1 ? this.off(selector, \"**\") : this.off(types, selector || \"**\", fn);\n },\n hover: function hover(fnOver, fnOut) {\n return this.on(\"mouseenter\", fnOver).on(\"mouseleave\", fnOut || fnOver);\n }\n });\n jQuery.each((\"blur focus focusin focusout resize scroll click dblclick \" + \"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" + \"change select submit keydown keypress keyup contextmenu\").split(\" \"), function (_i, name) {\n // Handle event binding\n jQuery.fn[name] = function (data, fn) {\n return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);\n };\n });\n\n // Support: Android <=4.0 only\n // Make sure we trim BOM and NBSP\n // Require that the \"whitespace run\" starts from a non-whitespace\n // to avoid O(N^2) behavior when the engine would try matching \"\\s+$\" at each space position.\n var rtrim = /^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;\n\n // Bind a function to a context, optionally partially applying any\n // arguments.\n // jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n // However, it is not slated for removal any time soon\n jQuery.proxy = function (fn, context) {\n var tmp, args, proxy;\n if (typeof context === \"string\") {\n tmp = fn[context];\n context = fn;\n fn = tmp;\n }\n\n // Quick check to determine if target is callable, in the spec\n // this throws a TypeError, but we will just return undefined.\n if (!isFunction(fn)) {\n return undefined;\n }\n\n // Simulated bind\n args = _slice.call(arguments, 2);\n proxy = function proxy() {\n return fn.apply(context || this, args.concat(_slice.call(arguments)));\n };\n\n // Set the guid of unique handler to the same of original handler, so it can be removed\n proxy.guid = fn.guid = fn.guid || jQuery.guid++;\n return proxy;\n };\n jQuery.holdReady = function (hold) {\n if (hold) {\n jQuery.readyWait++;\n } else {\n jQuery.ready(true);\n }\n };\n jQuery.isArray = Array.isArray;\n jQuery.parseJSON = JSON.parse;\n jQuery.nodeName = nodeName;\n jQuery.isFunction = isFunction;\n jQuery.isWindow = isWindow;\n jQuery.camelCase = camelCase;\n jQuery.type = toType;\n jQuery.now = Date.now;\n jQuery.isNumeric = function (obj) {\n // As of jQuery 3.0, isNumeric is limited to\n // strings and numbers (primitives or objects)\n // that can be coerced to finite numbers (gh-2662)\n var type = jQuery.type(obj);\n return (type === \"number\" || type === \"string\") &&\n // parseFloat NaNs numeric-cast false positives (\"\")\n // ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n // subtraction forces infinities to NaN\n !isNaN(obj - parseFloat(obj));\n };\n jQuery.trim = function (text) {\n return text == null ? \"\" : (text + \"\").replace(rtrim, \"$1\");\n };\n var\n // Map over jQuery in case of overwrite\n _jQuery = window.jQuery,\n // Map over the $ in case of overwrite\n _$ = window.$;\n jQuery.noConflict = function (deep) {\n if (window.$ === jQuery) {\n window.$ = _$;\n }\n if (deep && window.jQuery === jQuery) {\n window.jQuery = _jQuery;\n }\n return jQuery;\n };\n\n // Expose jQuery and $ identifiers, even in AMD\n // (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)\n // and CommonJS for browser emulators (trac-13566)\n if (typeof noGlobal === \"undefined\") {\n window.jQuery = window.$ = jQuery;\n }\n return jQuery;\n });\n})(jquery);\nvar jqueryExports = jquery.exports;\nvar $ = /*@__PURE__*/getDefaultExportFromCjs(jqueryExports);\n\nvar windowWrapper = {\n getLocationHref: function getLocationHref() {\n return window.location.href;\n },\n getLocation: function getLocation() {\n return window.location;\n },\n getNavigator: function getNavigator() {\n return window.navigator;\n },\n getWindow: function getWindow() {\n return window;\n },\n getDocument: function getDocument(wrapInJQuery) {\n return wrapInJQuery ? $(window.document) : window.document;\n },\n open: function open(url, features) {\n if (features) {\n window.open(url, features);\n } else {\n window.open(url);\n }\n }\n};\n\nvar documentWrapper = {\n getDocument: function getDocument() {\n return window.document;\n }\n};\n\nvar IPAD_OS_INITIAL_VERSION = 13;\nvar _supportsHTML5 = false;\nvar _supportsMP4 = false;\nvar _supportOgg = false;\nvar _supportWebM = false;\nvar _isIE = false;\nvar _isEdge = false;\nvar _ieVersion = null;\nvar _safariMajorVersion = null;\nvar _isFirefox = false;\nvar _isChrome = false;\nvar _isIPad = false;\nvar _isIPhone = false;\nvar _isIPod = false;\nvar _isIOS = false;\nvar _isAndroid = false;\nvar _isSafari = false;\nvar _isRetinaDisplay = false;\nvar _isSmallScreen = false;\nvar checkLocationProtocol = function checkLocationProtocol() {\n switch (windowWrapper.getLocation().protocol) {\n case 'http:':\n case 'https:':\n return false;\n case 'file:':\n return true;\n }\n};\nvar isTouchIEInterface = function isTouchIEInterface() {\n var navigator = windowWrapper.getNavigator();\n return navigator.msMaxTouchPoints;\n};\nvar isTouchInterface = function isTouchInterface() {\n return 'ontouchstart' in documentWrapper.getDocument().documentElement || isTouchIEInterface();\n};\nvar _lookAtDevice = function lookAtDevice() {\n var detect = documentWrapper.getDocument().createElement('video') || false;\n _supportsHTML5 = detect && typeof detect.canPlayType !== 'undefined';\n _supportsMP4 = _supportsHTML5 && detect.canPlayType(mediaMimeType.MP4);\n _supportOgg = _supportsHTML5 && detect.canPlayType(mediaMimeType.OGG);\n _supportWebM = _supportsHTML5 && detect.canPlayType(mediaMimeType.WEBM);\n var navigator = windowWrapper.getNavigator();\n _isIPad = navigator.userAgent.match(/iPad/i) !== null;\n _isIPhone = navigator.userAgent.match(/iPhone/i) !== null;\n _isIPod = navigator.userAgent.match(/iPod/i) !== null;\n _isIOS = _isIPad || _isIPhone || _isIPod;\n _isAndroid = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\n _isChrome = navigator.userAgent.toLowerCase().indexOf('chrome') !== -1;\n _isIE = navigator.appName === 'Microsoft Internet Explorer' || navigator.appName === 'Netscape' && new RegExp('Trident/.*rv:([0-9]{1,}[\\.0-9]{0,})').exec(navigator.userAgent) !== null;\n _isEdge = navigator.userAgent.match(/Edge/i) !== null;\n _isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n // Chrome contains safari in it's user agent string, but safari doesn't include chrome\n _isSafari = navigator.userAgent.match(/Safari/i) !== null && !_isChrome;\n\n // chrome for iOS will match as safari, so we need to do an additional check\n var iOSChromeMatchExp = new RegExp('CriOS\\/(.*)');\n if (navigator.appVersion.match(iOSChromeMatchExp)) {\n _isChrome = true;\n _isSafari = false;\n }\n\n // get IE version if IE\n if (_isIE) {\n var ua = navigator.userAgent;\n var re = new RegExp('MSIE ([0-9]{1,}[\\.0-9]{0,})');\n if (re.exec(ua) !== null) {\n _ieVersion = parseFloat(RegExp.$1);\n }\n }\n if (_isSafari) {\n var matchExp = new RegExp('Version\\/(.*) Safari');\n if (navigator.appVersion.match(matchExp)) {\n var safariVersion = navigator.appVersion.match(matchExp).slice(1)[0];\n _safariMajorVersion = safariVersion.substring(0, safariVersion.indexOf('.'));\n\n // iPad OS 13.x user agent does not contain information to ID the device as an iPad\n if (+_safariMajorVersion >= IPAD_OS_INITIAL_VERSION && !_isIPhone && !_isIPod && isTouchInterface()) {\n _isIPad = true;\n _isIOS = true;\n }\n }\n }\n\n // Portrait or landscape\n _isSmallScreen = windowWrapper.getWindow().screen.availWidth < 640 && windowWrapper.getWindow().screen.availHeight < 480 || windowWrapper.getWindow().screen.availWidth < 480 && windowWrapper.getWindow().screen.availHeight < 640;\n\n // Retina display is same res, but higher DPI, this detects that\n _isRetinaDisplay = windowWrapper.getWindow().devicePixelRatio && windowWrapper.getWindow().devicePixelRatio > 1;\n};\nvar supportsFullScreen = function supportsFullScreen() {\n var documentRef = documentWrapper.getDocument();\n return documentRef.fullscreenEnabled || documentRef.webkitFullscreenEnabled;\n};\nvar supportsLegacyIOSFullScreen = function supportsLegacyIOSFullScreen(videoElement) {\n return _isIOS && videoElement && videoElement.webkitSupportsFullscreen;\n};\nvar deviceInfo = {\n isSmallScreen: function isSmallScreen() {\n return _isSmallScreen;\n },\n isRetinaDisplay: function isRetinaDisplay() {\n return _isRetinaDisplay;\n },\n isIPad: function isIPad() {\n return _isIPad;\n },\n isIPhoneOrIPod: function isIPhoneOrIPod() {\n return _isIPhone || _isIPod;\n },\n isIOS: function isIOS() {\n return _isIOS;\n },\n isIE: function isIE() {\n return _isIE;\n },\n isEdge: function isEdge() {\n return _isEdge;\n },\n getIEVersion: function getIEVersion() {\n return _ieVersion;\n },\n getSafariMajorVersion: function getSafariMajorVersion() {\n return _safariMajorVersion;\n },\n isFirefox: function isFirefox() {\n return _isFirefox;\n },\n isChrome: function isChrome() {\n return _isChrome;\n },\n isSafari: function isSafari() {\n return _isSafari;\n },\n isAndroid: function isAndroid() {\n return _isAndroid;\n },\n canPlayHTML5Video: function canPlayHTML5Video() {\n return _supportsHTML5;\n },\n canPlayMP4: function canPlayMP4() {\n return _supportsMP4;\n },\n canPlayOgg: function canPlayOgg() {\n return _supportOgg;\n },\n canPlayWebM: function canPlayWebM() {\n return _supportWebM;\n },\n isTouchInterface: isTouchInterface,\n isTouchIEInterface: isTouchIEInterface,\n getFullScreenChangeEventNames: function getFullScreenChangeEventNames() {\n var documentRef = documentWrapper.getDocument();\n if (typeof documentRef.onfullscreenchange !== 'undefined') {\n return 'fullscreenchange';\n } else if (typeof documentRef.onwebkitfullscreenchange !== 'undefined') {\n return 'webkitfullscreenchange';\n }\n },\n requiresManualPreload: function requiresManualPreload() {\n return _isIOS || _isAndroid;\n },\n supportsFullScreen: supportsFullScreen,\n supportsLegacyIOSFullScreen: supportsLegacyIOSFullScreen,\n mediaLocation: function mediaLocation() {\n var path = windowWrapper.getLocation().href;\n var baseindex = path.lastIndexOf('/');\n var basex = path.substring(0, baseindex + 1);\n if (_isIE) {\n basex = encodeURI(basex);\n }\n basex = basex.split('%25').join('%');\n return basex;\n },\n isLocal: function isLocal() {\n return checkLocationProtocol();\n },\n lookAtDevice: function lookAtDevice() {\n _lookAtDevice();\n }\n};\n\nvar themeNames = Object.freeze({\n DAWN: 'dawn',\n DUSK: 'dusk'\n});\n\nvar preloadOptions = Object.freeze({\n none: 'none',\n metadata: 'metadata',\n auto: 'auto'\n});\nvar isValidPreloadOption = function isValidPreloadOption(preloadOption) {\n return Object.keys(preloadOptions).some(function (option) {\n return preloadOption === preloadOptions[option];\n });\n};\n\nvar DEFAULT_SKIP_DURATION_IN_SECONDS = 5;\nvar endsWithSlashRegex = /\\/$/;\nvar _mediaSources = [];\nvar _xmpSrc;\nvar _posterImageSrc;\nvar _mediaTitle = '';\nvar _tocSpriteSrc;\nvar _tocTitle = null;\nvar _mediaRotation = 0;\nvar _endActionType = 'stop';\nvar _endActionParam = true;\nvar _ignoreXmpControllerParameters = [];\nvar _ignoreQuizQuestions = false;\nvar _isSearchable = true; // make it undefined for initial value\nvar _autoPlayMedia = false;\nvar _forceAutoPlayMedia = false;\nvar _skipVideoDuration = -1;\nvar _skipVideoControlsEnabled = true;\nvar _captionsEnabled = null;\nvar _ignoreStoredCaptionVisibleSetting = false;\nvar _sidebarEnabled = false;\nvar _sidebarLocation = 'left';\nvar _backgroundColor = '#000';\nvar _useUnicode = false;\nvar _autoHideControls = true;\nvar _reportScormComplete = false;\nvar _isScormLesson = false;\nvar _enforceLinearAssessment = true;\nvar _disableFullframeMode = true;\nvar _disableControls = false;\nvar _disableYouTubeControls = true;\nvar _disablePictureInPicture = false;\nvar _disableContinueWithoutQuestions = false;\nvar _mobileWebViewCanAutoPlay = false;\nvar _googleAnalyticsID;\nvar _gaPageViewTrack = true;\nvar _gaEventTrack = true;\nvar _customEventTracking = false;\nvar _customEventCallback;\nvar _ga4EventCallback;\nvar _altEventCategoryAsFilename = false;\nvar _altLoadTimeAsSeconds = false;\nvar _jumpToTime;\nvar _techSmithAccessTokenEndpoint;\nvar _isUserIdentified = false;\nvar _fathomId$1;\nvar _embedIFrameId;\nvar _additionalAppQueryString = '';\nvar _useSlimAppSplashScreen = true;\nvar _showYouTubeAnnotations = false;\nvar _preRollSrc;\nvar _contentType = '';\nvar _preload = preloadOptions.none;\nvar _fullViewPort = true;\nvar _webConnector;\nvar _contentBasePath = '';\nvar _disableContextMenuForVideo = false;\nvar _theme = themeNames.DUSK;\nvar _enableSingleClickControl = true;\nvar _enableDoubleClickControl = true;\nvar _pluginController$1 = null;\nvar _useLargerProgressBar = false;\nvar _displayHotspotsShape = false;\nvar _audioDescriptionMediaSrc = null;\nvar _captionSrcList = [];\nvar _disableInteractions = false;\nvar _allowFastForward = true;\nvar _showADACompliantCaptions = false;\nvar _rememberUserInfo = false;\nvar _logScormApiCalls = false;\nvar _userInfo = {};\nvar _videoThumbnailsSrc = null;\nvar _videoThumbnailWidth = 0;\nvar _videoThumbnailHeight = 0;\nvar _videoThumbnailInterval = 0;\nvar _videoThumbnailColumns = 0;\nvar _tocModelFromDescription = null;\nvar _completeScormOnRequirementsComplete = true;\nvar _customFullScreenDomElement = null;\nvar _quizServiceBaseUrl = null;\nvar _resultsServiceBaseUrl = null;\nvar _enableTheaterMode = false;\nvar _showAcknowledgementLink = true;\nvar isValidTheme = function isValidTheme(themeName) {\n return Object.keys(themeNames).some(function (themeKey) {\n return themeNames[themeKey] === themeName;\n });\n};\nvar decodedApostrophe = function decodedApostrophe(val) {\n //if runs on a server and is IE\n return val.replace(/’/g, '\\'');\n};\nvar containsNonLatinCodepoints = function containsNonLatinCodepoints(str) {\n return /[^\\u0000-\\u00ff]/.test(str); // eslint-disable-line no-control-regex\n};\nvar runOnServer = function runOnServer() {\n return window.document.location.href.indexOf('http') === 0;\n};\nvar getUnicodeSafeString = function getUnicodeSafeString(val) {\n if (val === undefined) {\n return val;\n }\n if (!_useUnicode) {\n return val;\n }\n if (!deviceInfo.isIE()) {\n return encodeURI(val);\n }\n if (!runOnServer()) {\n return decodeURI(val);\n }\n if (containsNonLatinCodepoints(val)) {\n return encodeURI(val);\n }\n return val;\n};\nvar clearConfiguration = function clearConfiguration() {\n _mediaSources = [];\n _preload = preloadOptions.none;\n _ignoreStoredCaptionVisibleSetting = false;\n _captionsEnabled = null;\n _pluginController$1 = null;\n _ignoreXmpControllerParameters = [];\n _ignoreQuizQuestions = false;\n _captionSrcList = [];\n _skipVideoControlsEnabled = true;\n _skipVideoDuration = -1;\n _allowFastForward = true;\n _showADACompliantCaptions = false;\n _rememberUserInfo = false;\n _mediaTitle = '';\n _tocTitle = null;\n _userInfo = {};\n _logScormApiCalls = false;\n _videoThumbnailsSrc = null;\n _videoThumbnailWidth = 0;\n _videoThumbnailHeight = 0;\n _videoThumbnailInterval = 0;\n _videoThumbnailColumns = 0;\n _tocModelFromDescription = null;\n _completeScormOnRequirementsComplete = true;\n _quizServiceBaseUrl = null;\n _resultsServiceBaseUrl = null;\n _customFullScreenDomElement = null;\n _enableTheaterMode = false;\n _ga4EventCallback = null;\n _showAcknowledgementLink = true;\n};\nvar getUnableToDisplayContentString = function getUnableToDisplayContentString() {\n return localizationStrings.getPlayerString(playerStringNames.videoNotSupported);\n};\nvar useCustomEventTracking = function useCustomEventTracking(customEventTracking, customEventCallback) {\n _customEventTracking = customEventTracking;\n _customEventCallback = customEventCallback;\n};\nvar getGA4EventCallback = function getGA4EventCallback() {\n return _ga4EventCallback;\n};\nvar setGA4EventCallback = function setGA4EventCallback(ga4EventCallback) {\n _ga4EventCallback = ga4EventCallback;\n};\nvar getTrackEvents = function getTrackEvents() {\n return _customEventTracking || _googleAnalyticsID !== undefined;\n};\nvar getCustomEventTracking = function getCustomEventTracking() {\n return _customEventTracking;\n};\nvar getCustomEventCallback = function getCustomEventCallback() {\n return _customEventCallback;\n};\nvar getIsUserIdentified = function getIsUserIdentified() {\n return _isUserIdentified;\n};\nvar setAdditionalAppQueryParamsFromJson = function setAdditionalAppQueryParamsFromJson(params) {\n var queryString = '';\n for (var key in params) {\n queryString += '&' + key + '=' + params[key];\n }\n _additionalAppQueryString = queryString;\n};\nvar getAdditionalAppQueryString = function getAdditionalAppQueryString() {\n return _additionalAppQueryString;\n};\nvar addMediaSrc$1 = function addMediaSrc(mediaSrc) {\n if (typeof mediaSrc === 'string') {\n _mediaSources.push(decodedApostrophe(mediaSrc));\n } else {\n _mediaSources.push(mediaSrc);\n }\n};\nvar getMediaSources = function getMediaSources() {\n return _mediaSources;\n};\nvar getMediaFileName = function getMediaFileName() {\n var mediaSource = _mediaSources.length > 0 ? _mediaSources[0] : undefined;\n if (mediaSource) {\n var splitEl = mediaSource.split('/');\n var mediaFileName = splitEl[splitEl.length - 1];\n return mediaFileName.split('?')[0] || 'Unnamed Media';\n }\n return 'No Media';\n};\nvar saveConfigurationFromQueryString = function saveConfigurationFromQueryString(configParams) {\n if (!(configParams instanceof Array)) {\n return;\n }\n var param;\n var numberParams = configParams.length;\n for (var i = 0; i < numberParams; i++) {\n param = configParams[i].split('=');\n if (param.length === 2) {\n switch (param[0].toLowerCase()) {\n case 'embediframeid':\n {\n _embedIFrameId = param[1];\n break;\n }\n case 't':\n {\n _jumpToTime = param[1];\n break;\n }\n case 'autoplay':\n {\n if (param[1].toLowerCase() === 'true') {\n _autoPlayMedia = true;\n } else if (param[1].toLowerCase() === 'false') {\n _autoPlayMedia = false;\n }\n break;\n }\n case 'forceautoplay':\n {\n if (param[1].toLowerCase() === 'true') {\n _forceAutoPlayMedia = true;\n } else if (param[1].toLowerCase() === 'false') {\n _forceAutoPlayMedia = false;\n }\n break;\n }\n case 'autohidecontrols':\n {\n if (param[1].toLowerCase() === 'true') {\n _autoHideControls = true;\n } else if (param[1].toLowerCase() === 'false') {\n _autoHideControls = false;\n }\n break;\n }\n case 'theme':\n {\n if (isValidTheme(param[1])) {\n _theme = param[1];\n }\n }\n }\n }\n }\n};\nvar isParamBeingIgnored = function isParamBeingIgnored(param) {\n for (var i = 0; i < _ignoreXmpControllerParameters.length; i++) {\n if (param === _ignoreXmpControllerParameters[i]) {\n return true;\n }\n }\n return false;\n};\nvar shouldLoadXmpParam = function shouldLoadXmpParam(param1, param2) {\n if (param1 !== param2) {\n return false;\n }\n return !isParamBeingIgnored(param1);\n};\nvar configureFromXmp = function configureFromXmp(xmp) {\n if (isParamBeingIgnored('*')) {\n return;\n }\n xmp.controllerParameters.forEach(function (controllerParameter) {\n var param = controllerParameter.name.toUpperCase();\n switch (true) {\n case shouldLoadXmpParam('AUTOHIDE', param):\n _autoHideControls = controllerParameter.value === 'true';\n break;\n case shouldLoadXmpParam('AUTOSTART', param):\n case shouldLoadXmpParam('AUTOPLAY', param):\n if (!_autoPlayMedia) {\n _autoPlayMedia = controllerParameter.value === 'true';\n }\n break;\n case shouldLoadXmpParam('SEARCHABLE', param):\n _isSearchable = controllerParameter.value === 'true';\n break;\n case shouldLoadXmpParam('CAPTIONSENABLED', param):\n if (!_ignoreStoredCaptionVisibleSetting) {\n _captionsEnabled = controllerParameter.value === 'true';\n }\n break;\n case shouldLoadXmpParam('SIDEBARENABLED', param):\n _sidebarEnabled = controllerParameter.value === 'true';\n break;\n case shouldLoadXmpParam('UNICODEENABLED', param):\n _useUnicode = controllerParameter.value === 'true';\n break;\n case shouldLoadXmpParam('BACKGROUNDCOLOR', param):\n var bgColor = controllerParameter.value;\n if (bgColor.indexOf('#') === -1) {\n bgColor = '#' + bgColor;\n }\n _backgroundColor = bgColor;\n break;\n case shouldLoadXmpParam('SIDEBARLOCATION', param):\n _sidebarLocation = controllerParameter.value === 'right' || controllerParameter.value === 'r' ? 'right' : 'left';\n break;\n case shouldLoadXmpParam('ENDACTION', param):\n _endActionType = controllerParameter.value;\n break;\n case shouldLoadXmpParam('ENDACTIONPARAM', param):\n _endActionParam = controllerParameter.value;\n break;\n }\n });\n // Only allow URLs that start with http:// or https:// so that\n // javascript: URLs cannot be used maliciously.\n var endActionType = _endActionType.toLowerCase();\n if (endActionType === 'jumptourl' || endActionType === 'jumptourlnew') {\n var endActionParam = _endActionParam.toLowerCase();\n if (endActionParam.indexOf('http://') !== 0 && endActionParam.indexOf('https://') !== 0) {\n _endActionType = 'stop';\n _endActionParam = 'true';\n }\n }\n};\nvar getMediaSrc = function getMediaSrc() {\n // pull the first media source from the list. Maintain backward compliance with version 1.0.20 and earlier\n return _mediaSources.length > 0 ? _mediaSources[0] : '';\n};\nvar setMediaSrc = function setMediaSrc(mediaSrc) {\n _mediaSources[0] = decodedApostrophe(mediaSrc);\n};\nvar getXMPSrc = function getXMPSrc() {\n return getUnicodeSafeString(_xmpSrc);\n};\nvar setXMPSrc = function setXMPSrc(xmpSrc) {\n _xmpSrc = decodedApostrophe(xmpSrc);\n};\nvar getDisableInteractions = function getDisableInteractions() {\n return _disableInteractions;\n};\nvar setDisableInteractions$1 = function setDisableInteractions(disableInteractions) {\n _disableInteractions = disableInteractions;\n};\nvar getPosterImageSrc = function getPosterImageSrc() {\n return getUnicodeSafeString(_posterImageSrc);\n};\nvar setPosterImageSrc = function setPosterImageSrc(posterImageSrc) {\n _posterImageSrc = posterImageSrc;\n};\nvar getTOCSpriteSrc = function getTOCSpriteSrc() {\n return getUnicodeSafeString(_tocSpriteSrc);\n};\nvar setTOCSpriteSrc = function setTOCSpriteSrc(tocSpriteSrc) {\n _tocSpriteSrc = tocSpriteSrc;\n};\nvar getMediaTitle = function getMediaTitle() {\n return _mediaTitle;\n};\nvar setMediaTitle = function setMediaTitle(mediaTitle) {\n _mediaTitle = mediaTitle;\n};\nvar getTOCTitle = function getTOCTitle() {\n return _tocTitle;\n};\nvar setTOCTitle = function setTOCTitle(tocTitle) {\n _tocTitle = tocTitle;\n};\nvar getMediaRotation = function getMediaRotation() {\n return _mediaRotation;\n};\nvar setMediaRotation = function setMediaRotation(rotation) {\n _mediaRotation = rotation;\n};\nvar getEndActionType$1 = function getEndActionType() {\n return _endActionType;\n};\nvar setEndActionType = function setEndActionType(endActionType) {\n _endActionType = endActionType;\n};\nvar getEndActionParam = function getEndActionParam() {\n return _endActionParam;\n};\nvar setEndActionParam = function setEndActionParam(endActionParam) {\n _endActionParam = endActionParam;\n};\nvar getIgnoreXmpControllerParameters = function getIgnoreXmpControllerParameters() {\n return _ignoreXmpControllerParameters;\n};\nvar setIgnoreXmpControllerParameters = function setIgnoreXmpControllerParameters(ignoreXmpControllerParameters) {\n var upperCasedIgnores = ignoreXmpControllerParameters.map(function (p) {\n return p.toUpperCase();\n });\n _ignoreXmpControllerParameters = upperCasedIgnores;\n};\nvar getIgnoreQuizQuestions = function getIgnoreQuizQuestions() {\n return _ignoreQuizQuestions;\n};\nvar setIgnoreQuizQuestions = function setIgnoreQuizQuestions(ignoreQuizQuestions) {\n _ignoreQuizQuestions = ignoreQuizQuestions;\n};\nvar getIsSearchable = function getIsSearchable() {\n return _isSearchable;\n};\nvar setIsSearchable = function setIsSearchable(isSearchable) {\n _isSearchable = isSearchable;\n};\nvar getAutoPlayMedia = function getAutoPlayMedia() {\n return _autoPlayMedia;\n};\nvar setAutoPlayMedia = function setAutoPlayMedia(autoPlayMedia) {\n _autoPlayMedia = autoPlayMedia;\n};\nvar getForceAutoPlayMedia = function getForceAutoPlayMedia() {\n return _forceAutoPlayMedia;\n};\nvar setForceAutoPlayMedia = function setForceAutoPlayMedia(forceAutoPlayMedia) {\n _forceAutoPlayMedia = forceAutoPlayMedia;\n};\nvar getCaptionsEnabled = function getCaptionsEnabled() {\n return _captionsEnabled === true;\n};\nvar setCaptionsEnabled = function setCaptionsEnabled(captionsEnabled) {\n _captionsEnabled = captionsEnabled;\n};\nvar getIgnoreStoredCaptionVisibleSetting = function getIgnoreStoredCaptionVisibleSetting() {\n return _ignoreStoredCaptionVisibleSetting;\n};\nvar setIgnoreStoredCaptionVisibleSetting = function setIgnoreStoredCaptionVisibleSetting(ignoreStored) {\n _ignoreStoredCaptionVisibleSetting = ignoreStored;\n};\nvar getSidebarEnabled = function getSidebarEnabled() {\n return _sidebarEnabled;\n};\nvar setSidebarEnabled = function setSidebarEnabled(sidebarEnabled) {\n _sidebarEnabled = sidebarEnabled;\n};\nvar getSidebarLocation = function getSidebarLocation() {\n return _sidebarLocation;\n};\nvar setSidebarLocation = function setSidebarLocation(sidebarLocation) {\n _sidebarLocation = sidebarLocation;\n};\nvar getBackgroundColor = function getBackgroundColor() {\n return _backgroundColor;\n};\nvar setBackgroundColor = function setBackgroundColor(backgroundColor) {\n _backgroundColor = backgroundColor;\n};\nvar getAutoHideControls = function getAutoHideControls() {\n return _autoHideControls;\n};\nvar setAutoHideControls = function setAutoHideControls(autoHideControls) {\n _autoHideControls = autoHideControls;\n};\nvar getProcessUnicodeNames = function getProcessUnicodeNames() {\n return _useUnicode;\n};\nvar setProcessUnicodeNames = function setProcessUnicodeNames(useUnicode) {\n _useUnicode = useUnicode;\n};\nvar getEnforceLinearAssessment = function getEnforceLinearAssessment() {\n return _enforceLinearAssessment;\n};\nvar setEnforceLinearAssessment = function setEnforceLinearAssessment(enforceLinearAssessment) {\n _enforceLinearAssessment = enforceLinearAssessment;\n};\nvar getDisableFullframeMode = function getDisableFullframeMode() {\n return _disableFullframeMode;\n};\nvar setDisableFullframeMode = function setDisableFullframeMode(disableFullframeMode) {\n _disableFullframeMode = disableFullframeMode;\n};\nvar getDisableControls = function getDisableControls() {\n return _disableControls;\n};\nvar setDisableControls = function setDisableControls(disableControls) {\n _disableControls = disableControls;\n};\nvar getDisableYouTubeControls = function getDisableYouTubeControls() {\n return _disableYouTubeControls;\n};\nvar setDisableYouTubeControls = function setDisableYouTubeControls(disableYouTubeControls) {\n _disableYouTubeControls = disableYouTubeControls;\n};\nvar getDisablePictureInPicture = function getDisablePictureInPicture() {\n return _disablePictureInPicture;\n};\nvar setDisablePictureInPicture = function setDisablePictureInPicture(disablePictureInPicture) {\n _disablePictureInPicture = disablePictureInPicture;\n};\nvar getDisableContinueWithoutQuestions = function getDisableContinueWithoutQuestions() {\n return _disableContinueWithoutQuestions;\n};\nvar setDisableContinueWithoutQuestions = function setDisableContinueWithoutQuestions(disableContinueWithoutQuestions) {\n _disableContinueWithoutQuestions = disableContinueWithoutQuestions;\n};\nvar getMobileWebViewCanAutoPlay = function getMobileWebViewCanAutoPlay() {\n return _mobileWebViewCanAutoPlay;\n};\nvar setMobileWebViewCanAutoPlay = function setMobileWebViewCanAutoPlay(canAutoPlay) {\n _mobileWebViewCanAutoPlay = canAutoPlay;\n};\nvar getGoogleAnalyticsID = function getGoogleAnalyticsID() {\n return _googleAnalyticsID;\n};\nvar setGoogleAnalyticsID = function setGoogleAnalyticsID(id) {\n console.warn('Setting custom Google Analytics has been removed'); // eslint-disable-line\n _googleAnalyticsID = id;\n};\nvar getGAPageViewTracking = function getGAPageViewTracking() {\n return _gaPageViewTrack;\n};\nvar setGAPageViewTracking = function setGAPageViewTracking(gaPageViewTrack) {\n _gaPageViewTrack = gaPageViewTrack;\n};\nvar getGAEventTracking = function getGAEventTracking() {\n return _gaEventTrack;\n};\nvar setGAEventTracking = function setGAEventTracking(gaEventTrack) {\n _gaEventTrack = gaEventTrack;\n};\nvar getAltEventCategoryAsFilename = function getAltEventCategoryAsFilename() {\n return _altEventCategoryAsFilename;\n};\nvar setAltEventCategoryAsFilename = function setAltEventCategoryAsFilename(altEventCategoryAsFilename) {\n _altEventCategoryAsFilename = altEventCategoryAsFilename;\n};\nvar getAltLoadTimeAsSeconds = function getAltLoadTimeAsSeconds() {\n return _altLoadTimeAsSeconds;\n};\nvar setAltLoadTimeAsSeconds = function setAltLoadTimeAsSeconds(altLoadTimeAsSeconds) {\n _altLoadTimeAsSeconds = altLoadTimeAsSeconds;\n};\nvar getTechSmithAccessTokenEndpoint = function getTechSmithAccessTokenEndpoint() {\n return _techSmithAccessTokenEndpoint;\n};\nvar setTechSmithAccessTokenEndpoint = function setTechSmithAccessTokenEndpoint(accessTokenEndpoint) {\n _techSmithAccessTokenEndpoint = accessTokenEndpoint;\n setUserSignedIn(true);\n};\nvar getJumpToTime = function getJumpToTime() {\n return _jumpToTime;\n};\nvar setJumpToTime = function setJumpToTime(time) {\n _jumpToTime = time;\n};\nvar getFathomId = function getFathomId() {\n return _fathomId$1;\n};\nvar setFathomId = function setFathomId(fathomId) {\n _fathomId$1 = fathomId;\n};\nvar getEmbedIFrameId = function getEmbedIFrameId() {\n return _embedIFrameId;\n};\nvar setEmbedIFrameId = function setEmbedIFrameId(embedIFrameId) {\n _embedIFrameId = embedIFrameId;\n};\nvar getUseSlimAppSplashScreen = function getUseSlimAppSplashScreen() {\n return _useSlimAppSplashScreen;\n};\nvar setUseSlimAppSplashScreen = function setUseSlimAppSplashScreen(useSlimAppSplashScreen) {\n _useSlimAppSplashScreen = useSlimAppSplashScreen;\n};\nvar getDisableContextMenuForVideo = function getDisableContextMenuForVideo() {\n return _disableContextMenuForVideo;\n};\nvar setDisableContextMenuForVideo = function setDisableContextMenuForVideo(disableContextMenuForVideo) {\n _disableContextMenuForVideo = disableContextMenuForVideo;\n};\nvar getShowYouTubeAnnotations = function getShowYouTubeAnnotations() {\n return _showYouTubeAnnotations;\n};\nvar setShowYouTubeAnnotations = function setShowYouTubeAnnotations(showAnnotations) {\n _showYouTubeAnnotations = showAnnotations;\n};\nvar getPreRollSrc = function getPreRollSrc() {\n return _preRollSrc;\n};\nvar setPreRollSrc = function setPreRollSrc(preRollSrc) {\n _preRollSrc = preRollSrc;\n};\nvar getContentBase = function getContentBase() {\n return _contentBasePath;\n};\nvar setContentBase = function setContentBase(value) {\n _contentBasePath = value;\n};\nvar getContentType = function getContentType() {\n return _contentType;\n};\nvar setContentType = function setContentType(contentType) {\n _contentType = contentType;\n};\nvar getPreload = function getPreload() {\n return _preload;\n};\nvar setPreload = function setPreload(preloadOption) {\n if (isValidPreloadOption(preloadOption)) {\n _preload = preloadOption;\n }\n};\nvar getFullViewPort = function getFullViewPort() {\n return _fullViewPort;\n};\nvar setFullViewPort = function setFullViewPort(value) {\n _fullViewPort = value;\n};\nvar getWebConnector = function getWebConnector() {\n return _webConnector;\n};\nvar setWebConnector = function setWebConnector(value) {\n _webConnector = value;\n};\nvar getTheme = function getTheme() {\n return _theme;\n};\nvar setTheme$2 = function setTheme(value) {\n if (isValidTheme(value)) {\n _theme = value;\n }\n};\nvar getEnableSingleClickControl = function getEnableSingleClickControl() {\n return _enableSingleClickControl;\n};\nvar setEnableSingleClickControl = function setEnableSingleClickControl(value) {\n _enableSingleClickControl = value;\n};\nvar getEnableDoubleClickControl = function getEnableDoubleClickControl() {\n return _enableDoubleClickControl;\n};\nvar setEnableDoubleClickControl = function setEnableDoubleClickControl(value) {\n _enableDoubleClickControl = value;\n};\nvar getPluginController = function getPluginController() {\n return _pluginController$1;\n};\nvar setPluginController = function setPluginController(pluginController) {\n _pluginController$1 = pluginController;\n};\nvar getUseLargerProgressBar = function getUseLargerProgressBar() {\n return _useLargerProgressBar;\n};\nvar setUseLargerProgressBar = function setUseLargerProgressBar(useLargerProgressBar) {\n _useLargerProgressBar = useLargerProgressBar;\n};\n\n// legacy scorm support\nvar getReportScormComplete = function getReportScormComplete() {\n return _reportScormComplete;\n};\nvar setReportScormComplete = function setReportScormComplete(reportScorm) {\n _reportScormComplete = reportScorm;\n};\n\n// built in scorm support\nvar getIsScormLesson = function getIsScormLesson() {\n return _isScormLesson;\n};\nvar setIsScormLesson = function setIsScormLesson(isScormLesson) {\n _isScormLesson = isScormLesson;\n};\nvar getDisplayHotspotsShape = function getDisplayHotspotsShape() {\n return _displayHotspotsShape;\n};\nvar setDisplayHotspotsShape = function setDisplayHotspotsShape(displayHotspotsShape) {\n _displayHotspotsShape = displayHotspotsShape;\n};\nvar getAudioDescriptionMediaSrc = function getAudioDescriptionMediaSrc() {\n return _audioDescriptionMediaSrc;\n};\nvar setAudioDescriptionMediaSrc = function setAudioDescriptionMediaSrc(audioDescriptionMediaSrc) {\n _audioDescriptionMediaSrc = audioDescriptionMediaSrc;\n};\nvar addCaptionSrc = function addCaptionSrc(captionSrc, languageIdentifierString) {\n _captionSrcList.push({\n src: captionSrc,\n languageIdentifier: languageIdentifierString\n });\n};\nvar getCaptionSrcList = function getCaptionSrcList() {\n return _captionSrcList;\n};\nvar getSkipVideoControlsEnabled = function getSkipVideoControlsEnabled() {\n return _skipVideoControlsEnabled;\n};\nvar setSkipVideoControlsEnabled = function setSkipVideoControlsEnabled(skipVideoControlsEnabled) {\n _skipVideoControlsEnabled = skipVideoControlsEnabled;\n};\nvar getSkipVideoDuration = function getSkipVideoDuration() {\n return _skipVideoDuration === -1 ? DEFAULT_SKIP_DURATION_IN_SECONDS : _skipVideoDuration;\n};\nvar setSkipVideoDuration = function setSkipVideoDuration(skipVideoDuration) {\n if (typeof skipVideoDuration !== 'number') {\n return;\n }\n _skipVideoDuration = skipVideoDuration;\n};\nvar getAllowFastForward = function getAllowFastForward() {\n return _allowFastForward;\n};\nvar setAllowFastForward = function setAllowFastForward(allowFastForward) {\n _allowFastForward = allowFastForward;\n};\nvar getShowADACompliantCaptions = function getShowADACompliantCaptions() {\n return _showADACompliantCaptions;\n};\nvar setShowADACompliantCaptions = function setShowADACompliantCaptions(showADACompliantCaptions) {\n _showADACompliantCaptions = showADACompliantCaptions;\n};\nvar getRememberUserInfo = function getRememberUserInfo() {\n return _rememberUserInfo;\n};\nvar setRememberUserInfo = function setRememberUserInfo(rememberUserInfo) {\n _rememberUserInfo = rememberUserInfo;\n};\nvar getLogScormApiCalls = function getLogScormApiCalls() {\n return _logScormApiCalls;\n};\nvar setLogScormApiCalls = function setLogScormApiCalls(logScormApiCalls) {\n _logScormApiCalls = logScormApiCalls;\n};\nvar getUserInfo = function getUserInfo() {\n return _userInfo;\n};\nvar setUserInfo = function setUserInfo(userInfo) {\n _userInfo = userInfo;\n};\nvar setUserSignedIn = function setUserSignedIn(userSignedIn) {\n _isUserIdentified = userSignedIn;\n};\nvar getVideoThumbnailSrc = function getVideoThumbnailSrc() {\n return _videoThumbnailsSrc;\n};\nvar setVideoThumbnailSrc = function setVideoThumbnailSrc(videoThumbnailSrc) {\n _videoThumbnailsSrc = videoThumbnailSrc;\n};\nvar getVideoThumbnailWidth = function getVideoThumbnailWidth() {\n return _videoThumbnailWidth;\n};\nvar setVideoThumbnailWidth = function setVideoThumbnailWidth(videoThumbnailWidth) {\n _videoThumbnailWidth = videoThumbnailWidth;\n};\nvar getVideoThumbnailHeight = function getVideoThumbnailHeight() {\n return _videoThumbnailHeight;\n};\nvar setVideoThumbnailHeight = function setVideoThumbnailHeight(videoThumbnailHeight) {\n _videoThumbnailHeight = videoThumbnailHeight;\n};\nvar getVideoThumbnailInterval = function getVideoThumbnailInterval() {\n return _videoThumbnailInterval;\n};\nvar setVideoThumbnailInterval = function setVideoThumbnailInterval(videoThumbnailInterval) {\n _videoThumbnailInterval = videoThumbnailInterval;\n};\nvar getVideoThumbnailColumns = function getVideoThumbnailColumns() {\n return _videoThumbnailColumns;\n};\nvar setVideoThumbnailColumns = function setVideoThumbnailColumns(videoThumbnailColumns) {\n _videoThumbnailColumns = videoThumbnailColumns;\n};\nvar getTocModelFromDescription = function getTocModelFromDescription() {\n return _tocModelFromDescription;\n};\nvar setTocModelFromDescription = function setTocModelFromDescription(tocModelFromDescription) {\n _tocModelFromDescription = tocModelFromDescription;\n};\nvar getCompleteScormOnRequirementsComplete = function getCompleteScormOnRequirementsComplete() {\n return _completeScormOnRequirementsComplete;\n};\nvar setCompleteScormOnRequirementsComplete = function setCompleteScormOnRequirementsComplete(completeScormOnRequirementsComplete) {\n _completeScormOnRequirementsComplete = completeScormOnRequirementsComplete;\n};\nvar getCustomFullScreenDomElement = function getCustomFullScreenDomElement() {\n return _customFullScreenDomElement;\n};\nvar setCustomFullScreenDomElement = function setCustomFullScreenDomElement(customFullScreenDomElement) {\n _customFullScreenDomElement = customFullScreenDomElement;\n};\nvar getQuizServiceBaseUrl = function getQuizServiceBaseUrl() {\n return _quizServiceBaseUrl;\n};\nvar setQuizServiceBaseUrl = function setQuizServiceBaseUrl(quizServiceBaseUrl) {\n if (quizServiceBaseUrl && quizServiceBaseUrl.search(endsWithSlashRegex) === -1) {\n quizServiceBaseUrl += '/';\n }\n _quizServiceBaseUrl = quizServiceBaseUrl;\n};\nvar getResultsServiceBaseUrl = function getResultsServiceBaseUrl() {\n return _resultsServiceBaseUrl;\n};\nvar setResultsServiceBaseUrl = function setResultsServiceBaseUrl(resultsServiceBaseUrl) {\n if (resultsServiceBaseUrl && resultsServiceBaseUrl.search(endsWithSlashRegex) === -1) {\n resultsServiceBaseUrl += '/';\n }\n _resultsServiceBaseUrl = resultsServiceBaseUrl;\n};\nvar getEnableTheaterMode = function getEnableTheaterMode() {\n return _enableTheaterMode;\n};\nvar setEnableTheaterMode = function setEnableTheaterMode(enabled) {\n _enableTheaterMode = enabled;\n};\nvar getShowAcknowledgementLink = function getShowAcknowledgementLink() {\n return _showAcknowledgementLink;\n};\nvar setShowAcknowledgementLink = function setShowAcknowledgementLink(showAcknowledgementLink) {\n _showAcknowledgementLink = showAcknowledgementLink;\n};\nvar deprecatedNoOp = function deprecatedNoOp() {}; // eslint-disable-line\n\nvar playerConfiguration = Object.defineProperties({\n clearConfiguration: clearConfiguration,\n runOnServer: runOnServer,\n addMediaSrc: addMediaSrc$1,\n getMediaSources: getMediaSources,\n addCaptionSrc: addCaptionSrc,\n getMediaFileName: getMediaFileName,\n getUnicodeSafeString: getUnicodeSafeString,\n getUnableToDisplayContentString: getUnableToDisplayContentString,\n useCustomEventTracking: useCustomEventTracking,\n getTrackEvents: getTrackEvents,\n getCustomEventTracking: getCustomEventTracking,\n getCustomEventCallback: getCustomEventCallback,\n getIsUserIdentified: getIsUserIdentified,\n setAdditionalAppQueryParamsFromJson: setAdditionalAppQueryParamsFromJson,\n getAdditionalAppQueryString: getAdditionalAppQueryString,\n saveConfigurationFromQueryString: saveConfigurationFromQueryString,\n configureFromXmp: configureFromXmp,\n getMediaSrc: getMediaSrc,\n setMediaSrc: setMediaSrc,\n getXMPSrc: getXMPSrc,\n setXMPSrc: setXMPSrc,\n getPosterImageSrc: getPosterImageSrc,\n setPosterImageSrc: setPosterImageSrc,\n getMediaTitle: getMediaTitle,\n setMediaTitle: setMediaTitle,\n getTOCSpriteSrc: getTOCSpriteSrc,\n setTOCSpriteSrc: setTOCSpriteSrc,\n getTOCTitle: getTOCTitle,\n setTOCTitle: setTOCTitle,\n getAudioDescriptionMediaSrc: getAudioDescriptionMediaSrc,\n setAudioDescriptionMediaSrc: setAudioDescriptionMediaSrc,\n getMediaRotation: getMediaRotation,\n setMediaRotation: setMediaRotation,\n getEndActionType: getEndActionType$1,\n setEndActionType: setEndActionType,\n getEndActionParam: getEndActionParam,\n setEndActionParam: setEndActionParam,\n getIgnoreXmpControllerParameters: getIgnoreXmpControllerParameters,\n setIgnoreXmpControllerParameters: setIgnoreXmpControllerParameters,\n getIgnoreQuizQuestions: getIgnoreQuizQuestions,\n setIgnoreQuizQuestions: setIgnoreQuizQuestions,\n getIsSearchable: getIsSearchable,\n setIsSearchable: setIsSearchable,\n getDisableInteractions: getDisableInteractions,\n setDisableInteractions: setDisableInteractions$1,\n getAutoPlayMedia: getAutoPlayMedia,\n setAutoPlayMedia: setAutoPlayMedia,\n getForceAutoPlayMedia: getForceAutoPlayMedia,\n setForceAutoPlayMedia: setForceAutoPlayMedia,\n getCaptionsEnabled: getCaptionsEnabled,\n setCaptionsEnabled: setCaptionsEnabled,\n getIgnoreStoredCaptionVisibleSetting: getIgnoreStoredCaptionVisibleSetting,\n setIgnoreStoredCaptionVisibleSetting: setIgnoreStoredCaptionVisibleSetting,\n getSidebarEnabled: getSidebarEnabled,\n setSidebarEnabled: setSidebarEnabled,\n getSidebarLocation: getSidebarLocation,\n setSidebarLocation: setSidebarLocation,\n getBackgroundColor: getBackgroundColor,\n setBackgroundColor: setBackgroundColor,\n getAutoHideControls: getAutoHideControls,\n setAutoHideControls: setAutoHideControls,\n getProcessUnicodeNames: getProcessUnicodeNames,\n setProcessUnicodeNames: setProcessUnicodeNames,\n getReportScormComplete: getReportScormComplete,\n setReportScormComplete: setReportScormComplete,\n getEnforceLinearAssessment: getEnforceLinearAssessment,\n setEnforceLinearAssessment: setEnforceLinearAssessment,\n getDisableFullframeMode: getDisableFullframeMode,\n setDisableFullframeMode: setDisableFullframeMode,\n getDisableControls: getDisableControls,\n setDisableControls: setDisableControls,\n getDisableYouTubeControls: getDisableYouTubeControls,\n setDisableYouTubeControls: setDisableYouTubeControls,\n getDisablePictureInPicture: getDisablePictureInPicture,\n setDisablePictureInPicture: setDisablePictureInPicture,\n getDisableContinueWithoutQuestions: getDisableContinueWithoutQuestions,\n setDisableContinueWithoutQuestions: setDisableContinueWithoutQuestions,\n getMobileWebViewCanAutoPlay: getMobileWebViewCanAutoPlay,\n setMobileWebViewCanAutoPlay: setMobileWebViewCanAutoPlay,\n getGoogleAnalyticsID: getGoogleAnalyticsID,\n setGoogleAnalyticsID: setGoogleAnalyticsID,\n getGAPageViewTracking: getGAPageViewTracking,\n setGAPageViewTracking: setGAPageViewTracking,\n getGAEventTracking: getGAEventTracking,\n setGAEventTracking: setGAEventTracking,\n getAltEventCategoryAsFilename: getAltEventCategoryAsFilename,\n setAltEventCategoryAsFilename: setAltEventCategoryAsFilename,\n getAltLoadTimeAsSeconds: getAltLoadTimeAsSeconds,\n setAltLoadTimeAsSeconds: setAltLoadTimeAsSeconds,\n getTechSmithAccessTokenEndpoint: getTechSmithAccessTokenEndpoint,\n setTechSmithAccessTokenEndpoint: setTechSmithAccessTokenEndpoint,\n getJumpToTime: getJumpToTime,\n setJumpToTime: setJumpToTime,\n getFathomId: getFathomId,\n setFathomId: setFathomId,\n getEmbedIFrameId: getEmbedIFrameId,\n setEmbedIFrameId: setEmbedIFrameId,\n getUseSlimAppSplashScreen: getUseSlimAppSplashScreen,\n setUseSlimAppSplashScreen: setUseSlimAppSplashScreen,\n getDisableContextMenuForVideo: getDisableContextMenuForVideo,\n setDisableContextMenuForVideo: setDisableContextMenuForVideo,\n getShowYouTubeAnnotations: getShowYouTubeAnnotations,\n setShowYouTubeAnnotations: setShowYouTubeAnnotations,\n getPreRollSrc: getPreRollSrc,\n setPreRollSrc: setPreRollSrc,\n getContentBase: getContentBase,\n setContentBase: setContentBase,\n getContentType: getContentType,\n setContentType: setContentType,\n getPreload: getPreload,\n setPreload: setPreload,\n getFullViewPort: getFullViewPort,\n setFullViewPort: setFullViewPort,\n getWebConnector: getWebConnector,\n setWebConnector: setWebConnector,\n getTheme: getTheme,\n setTheme: setTheme$2,\n getEnableSingleClickControl: getEnableSingleClickControl,\n setEnableSingleClickControl: setEnableSingleClickControl,\n getEnableDoubleClickControl: getEnableDoubleClickControl,\n setEnableDoubleClickControl: setEnableDoubleClickControl,\n getPluginController: getPluginController,\n setPluginController: setPluginController,\n getUseLargerProgressBar: getUseLargerProgressBar,\n setUseLargerProgressBar: setUseLargerProgressBar,\n getDisplayHotspotsShape: getDisplayHotspotsShape,\n setDisplayHotspotsShape: setDisplayHotspotsShape,\n getSkipVideoControlsEnabled: getSkipVideoControlsEnabled,\n setSkipVideoControlsEnabled: setSkipVideoControlsEnabled,\n getSkipVideoDuration: getSkipVideoDuration,\n setSkipVideoDuration: setSkipVideoDuration,\n getAllowFastForward: getAllowFastForward,\n setAllowFastForward: setAllowFastForward,\n getShowADACompliantCaptions: getShowADACompliantCaptions,\n setShowADACompliantCaptions: setShowADACompliantCaptions,\n getRememberUserInfo: getRememberUserInfo,\n setRememberUserInfo: setRememberUserInfo,\n getLogScormApiCalls: getLogScormApiCalls,\n setLogScormApiCalls: setLogScormApiCalls,\n getUserInfo: getUserInfo,\n setUserInfo: setUserInfo,\n getUserSignedIn: getIsUserIdentified,\n setUserSignedIn: setUserSignedIn,\n getVideoThumbnailSrc: getVideoThumbnailSrc,\n setVideoThumbnailSrc: setVideoThumbnailSrc,\n getVideoThumbnailWidth: getVideoThumbnailWidth,\n setVideoThumbnailWidth: setVideoThumbnailWidth,\n getVideoThumbnailHeight: getVideoThumbnailHeight,\n setVideoThumbnailHeight: setVideoThumbnailHeight,\n getVideoThumbnailInterval: getVideoThumbnailInterval,\n setVideoThumbnailInterval: setVideoThumbnailInterval,\n getVideoThumbnailColumns: getVideoThumbnailColumns,\n setVideoThumbnailColumns: setVideoThumbnailColumns,\n getTocModelFromDescription: getTocModelFromDescription,\n setTocModelFromDescription: setTocModelFromDescription,\n getCompleteScormOnRequirementsComplete: getCompleteScormOnRequirementsComplete,\n setCompleteScormOnRequirementsComplete: setCompleteScormOnRequirementsComplete,\n getCustomFullScreenDomElement: getCustomFullScreenDomElement,\n setCustomFullScreenDomElement: setCustomFullScreenDomElement,\n getQuizServiceBaseUrl: getQuizServiceBaseUrl,\n setQuizServiceBaseUrl: setQuizServiceBaseUrl,\n getResultsServiceBaseUrl: getResultsServiceBaseUrl,\n setResultsServiceBaseUrl: setResultsServiceBaseUrl,\n getEnableTheaterMode: getEnableTheaterMode,\n setEnableTheaterMode: setEnableTheaterMode,\n getGA4EventCallback: getGA4EventCallback,\n setGA4EventCallback: setGA4EventCallback,\n getShowAcknowledgementLink: getShowAcknowledgementLink,\n setShowAcknowledgementLink: setShowAcknowledgementLink,\n // deprecated methods\n setSwfBase: setContentBase,\n isIEOnServerWithUnicode: deprecatedNoOp,\n setFlashUpdateBootstrapSwf: deprecatedNoOp,\n getAdvancedSeeking: deprecatedNoOp,\n setAdvancedSeeking: deprecatedNoOp,\n getDebugUIMode: deprecatedNoOp,\n setDebugUIMode: deprecatedNoOp,\n getPlayerWidth: deprecatedNoOp,\n setPlayerWidth: deprecatedNoOp,\n getPlayerHeight: deprecatedNoOp,\n setPlayerHeight: deprecatedNoOp,\n setFlashPlayerSwf: deprecatedNoOp,\n setForceFlashPlayer: deprecatedNoOp,\n setForceHtml5Player: deprecatedNoOp,\n setConfigurationSrc: deprecatedNoOp,\n setPrioritizeFullScreen: deprecatedNoOp,\n getDisableYouTubeFullscreen: deprecatedNoOp,\n setDisableYouTubeFullscreen: deprecatedNoOp,\n setAllowRewind: deprecatedNoOp\n}, {\n mediaSrc: {\n get: getMediaSrc,\n set: setMediaSrc\n },\n xmpSrc: {\n get: getXMPSrc,\n set: setXMPSrc\n },\n posterImageSrc: {\n get: getPosterImageSrc,\n set: setPosterImageSrc\n },\n mediaTitle: {\n get: getMediaTitle,\n set: setMediaTitle\n },\n tocSpriteSrc: {\n get: getTOCSpriteSrc,\n set: setTOCSpriteSrc\n },\n tocTitle: {\n get: getTOCTitle,\n set: setTOCTitle\n },\n mediaRotation: {\n get: getMediaRotation,\n set: setMediaRotation\n },\n endActionType: {\n get: getEndActionType$1,\n set: setEndActionType\n },\n endActionParam: {\n get: getEndActionParam,\n set: setEndActionParam\n },\n ignoreXmpControllerParameters: {\n get: getIgnoreXmpControllerParameters,\n set: setIgnoreXmpControllerParameters\n },\n ignoreQuizQuestions: {\n get: getIgnoreQuizQuestions,\n set: setIgnoreQuizQuestions\n },\n disableInteractions: {\n get: getDisableInteractions,\n set: setDisableInteractions$1\n },\n isSearchable: {\n get: getIsSearchable,\n set: setIsSearchable\n },\n autoPlayMedia: {\n get: getAutoPlayMedia,\n set: setAutoPlayMedia\n },\n forceAutoPlayMedia: {\n get: getForceAutoPlayMedia,\n set: setForceAutoPlayMedia\n },\n captionsEnabled: {\n get: getCaptionsEnabled,\n set: setCaptionsEnabled\n },\n ignoreStoredCaptionVisibleSetting: {\n get: getIgnoreStoredCaptionVisibleSetting,\n set: setIgnoreStoredCaptionVisibleSetting\n },\n sidebarEnabled: {\n get: getSidebarEnabled,\n set: setSidebarEnabled\n },\n sidebarLocation: {\n get: getSidebarLocation,\n set: setSidebarLocation\n },\n backgroundColor: {\n get: getBackgroundColor,\n set: setBackgroundColor\n },\n autoHideControls: {\n get: getAutoHideControls,\n set: setAutoHideControls\n },\n processUnicodeNames: {\n get: getProcessUnicodeNames,\n set: setProcessUnicodeNames\n },\n enforceLinearAssessment: {\n get: getEnforceLinearAssessment,\n set: setEnforceLinearAssessment\n },\n disableFullframeMode: {\n get: getDisableFullframeMode,\n set: setDisableFullframeMode\n },\n disableControls: {\n get: getDisableControls,\n set: setDisableControls\n },\n disableYouTubeControls: {\n get: getDisableYouTubeControls,\n set: setDisableYouTubeControls\n },\n disablePictureInPicture: {\n get: getDisablePictureInPicture,\n set: setDisablePictureInPicture\n },\n disableContinueWithoutQuestions: {\n get: getDisableContinueWithoutQuestions,\n set: setDisableContinueWithoutQuestions\n },\n mobileWebViewCanAutoPlay: {\n get: getMobileWebViewCanAutoPlay,\n set: setMobileWebViewCanAutoPlay\n },\n googleAnalyticsID: {\n get: getGoogleAnalyticsID,\n set: setGoogleAnalyticsID\n },\n googleAnalyticsPageViewTracking: {\n get: getGAPageViewTracking,\n set: setGAPageViewTracking\n },\n googleAnalyticsEventTracking: {\n get: getGAEventTracking,\n set: setGAEventTracking\n },\n altEventCategoryAsFilename: {\n get: getAltEventCategoryAsFilename,\n set: setAltEventCategoryAsFilename\n },\n altLoadTimeAsSeconds: {\n get: getAltLoadTimeAsSeconds,\n set: setAltLoadTimeAsSeconds\n },\n techSmithAccessTokenEndpoint: {\n get: getTechSmithAccessTokenEndpoint,\n set: setTechSmithAccessTokenEndpoint\n },\n jumpToTime: {\n get: getJumpToTime,\n set: setJumpToTime\n },\n fathomId: {\n get: getFathomId,\n set: setFathomId\n },\n embedIFrameId: {\n get: getEmbedIFrameId,\n set: setEmbedIFrameId\n },\n useSlimAppSplashScreen: {\n get: getUseSlimAppSplashScreen,\n set: setUseSlimAppSplashScreen\n },\n disableContextMenuForVideo: {\n get: setDisableContextMenuForVideo,\n set: setDisableContextMenuForVideo\n },\n showYouTubeAnnotations: {\n get: getShowYouTubeAnnotations,\n set: setShowYouTubeAnnotations\n },\n preRollSrc: {\n get: getPreRollSrc,\n set: setPreRollSrc\n },\n contentBase: {\n get: getContentBase,\n set: setContentBase\n },\n contentType: {\n get: getContentType,\n set: setContentType\n },\n preload: {\n get: getPreload,\n set: setPreload\n },\n fullViewPort: {\n get: getFullViewPort,\n set: setFullViewPort\n },\n webConnector: {\n get: getWebConnector,\n set: setWebConnector\n },\n theme: {\n get: getTheme,\n set: setTheme$2\n },\n enableSingleClickControl: {\n get: getEnableSingleClickControl,\n set: setEnableSingleClickControl\n },\n enableDoubleClickControl: {\n get: getEnableDoubleClickControl,\n set: setEnableDoubleClickControl\n },\n pluginController: {\n get: getPluginController,\n set: setPluginController\n },\n useLargerProgressBar: {\n get: getUseLargerProgressBar,\n set: setUseLargerProgressBar\n },\n isScormLesson: {\n get: getIsScormLesson,\n set: setIsScormLesson\n },\n displayHotspotsShape: {\n get: getDisplayHotspotsShape,\n set: setDisplayHotspotsShape\n },\n audioDescriptionMediaSrc: {\n get: getAudioDescriptionMediaSrc,\n set: setAudioDescriptionMediaSrc\n },\n captionSrcList: {\n get: getCaptionSrcList\n },\n skipVideoControlsEnabled: {\n get: getSkipVideoControlsEnabled,\n set: setSkipVideoControlsEnabled\n },\n skipVideoDuration: {\n get: getSkipVideoDuration,\n set: setSkipVideoDuration\n },\n allowFastForward: {\n get: getAllowFastForward,\n set: setAllowFastForward\n },\n showADACompliantCaptions: {\n get: getShowADACompliantCaptions,\n set: setShowADACompliantCaptions\n },\n rememberUserInfo: {\n get: getRememberUserInfo,\n set: setRememberUserInfo\n },\n logScormApiCalls: {\n get: getLogScormApiCalls,\n set: setLogScormApiCalls\n },\n userInfo: {\n get: getUserInfo,\n set: setUserInfo\n },\n userSignedIn: {\n get: getIsUserIdentified,\n set: setUserSignedIn\n },\n videoThumbnailsSrc: {\n get: getVideoThumbnailSrc,\n set: setVideoThumbnailSrc\n },\n videoThumbnailWidth: {\n get: getVideoThumbnailWidth,\n set: setVideoThumbnailWidth\n },\n videoThumbnailHeight: {\n get: getVideoThumbnailHeight,\n set: setVideoThumbnailHeight\n },\n videoThumbnailInterval: {\n get: getVideoThumbnailInterval,\n set: setVideoThumbnailInterval\n },\n videoThumbnailColumns: {\n get: getVideoThumbnailColumns,\n set: setVideoThumbnailColumns\n },\n tocModelFromDescription: {\n get: getTocModelFromDescription,\n set: setTocModelFromDescription\n },\n completeScormOnRequirementsComplete: {\n get: getCompleteScormOnRequirementsComplete,\n set: setCompleteScormOnRequirementsComplete\n },\n customFullScreenDomElement: {\n get: getCustomFullScreenDomElement,\n set: setCustomFullScreenDomElement\n },\n enableTheaterMode: {\n get: getEnableTheaterMode,\n set: setEnableTheaterMode\n },\n ga4EventCallback: {\n get: getGA4EventCallback,\n set: setGA4EventCallback\n },\n showAcknowledgementLink: {\n get: getShowAcknowledgementLink,\n set: setShowAcknowledgementLink\n }\n});\n\n/**\n * @this {Promise}\n */\nfunction finallyConstructor(callback) {\n var constructor = this.constructor;\n return this.then(function (value) {\n // @ts-ignore\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n // @ts-ignore\n return constructor.resolve(callback()).then(function () {\n // @ts-ignore\n return constructor.reject(reason);\n });\n });\n}\n\nfunction allSettled(arr) {\n var P = this;\n return new P(function (resolve, reject) {\n if (!(arr && typeof arr.length !== 'undefined')) {\n return reject(new TypeError(_typeof$1(arr) + ' ' + arr + ' is not iterable(cannot read property Symbol(Symbol.iterator))'));\n }\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n function res(i, val) {\n if (val && (_typeof$1(val) === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(val, function (val) {\n res(i, val);\n }, function (e) {\n args[i] = {\n status: 'rejected',\n reason: e\n };\n if (--remaining === 0) {\n resolve(args);\n }\n });\n return;\n }\n }\n args[i] = {\n status: 'fulfilled',\n value: val\n };\n if (--remaining === 0) {\n resolve(args);\n }\n }\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n}\n\n/**\n * @constructor\n */\nfunction AggregateError(errors, message) {\n this.name = 'AggregateError', this.errors = errors;\n this.message = message || '';\n}\nAggregateError.prototype = Error.prototype;\nfunction any(arr) {\n var P = this;\n return new P(function (resolve, reject) {\n if (!(arr && typeof arr.length !== 'undefined')) {\n return reject(new TypeError('Promise.any accepts an array'));\n }\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return reject();\n var rejectionReasons = [];\n for (var i = 0; i < args.length; i++) {\n try {\n P.resolve(args[i]).then(resolve)[\"catch\"](function (error) {\n rejectionReasons.push(error);\n if (rejectionReasons.length === args.length) {\n reject(new AggregateError(rejectionReasons, 'All promises were rejected'));\n }\n });\n } catch (ex) {\n reject(ex);\n }\n }\n });\n}\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\nvar setTimeoutFunc = setTimeout;\nfunction isArray(x) {\n return Boolean(x && typeof x.length !== 'undefined');\n}\nfunction noop$1() {}\n\n// Polyfill for Function.prototype.bind\nfunction bind(fn, thisArg) {\n return function () {\n fn.apply(thisArg, arguments);\n };\n}\n\n/**\n * @constructor\n * @param {Function} fn\n */\nfunction Promise$1(fn) {\n if (!(this instanceof Promise$1)) throw new TypeError('Promises must be constructed via new');\n if (typeof fn !== 'function') throw new TypeError('not a function');\n /** @type {!number} */\n this._state = 0;\n /** @type {!boolean} */\n this._handled = false;\n /** @type {Promise|undefined} */\n this._value = undefined;\n /** @type {!Array<!Function>} */\n this._deferreds = [];\n doResolve(fn, this);\n}\nfunction handle(self, deferred) {\n while (self._state === 3) {\n self = self._value;\n }\n if (self._state === 0) {\n self._deferreds.push(deferred);\n return;\n }\n self._handled = true;\n Promise$1._immediateFn(function () {\n var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n return;\n }\n var ret;\n try {\n ret = cb(self._value);\n } catch (e) {\n reject(deferred.promise, e);\n return;\n }\n resolve(deferred.promise, ret);\n });\n}\nfunction resolve(self, newValue) {\n try {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');\n if (newValue && (_typeof$1(newValue) === 'object' || typeof newValue === 'function')) {\n var then = newValue.then;\n if (newValue instanceof Promise$1) {\n self._state = 3;\n self._value = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(bind(then, newValue), self);\n return;\n }\n }\n self._state = 1;\n self._value = newValue;\n finale(self);\n } catch (e) {\n reject(self, e);\n }\n}\nfunction reject(self, newValue) {\n self._state = 2;\n self._value = newValue;\n finale(self);\n}\nfunction finale(self) {\n if (self._state === 2 && self._deferreds.length === 0) {\n Promise$1._immediateFn(function () {\n if (!self._handled) {\n Promise$1._unhandledRejectionFn(self._value);\n }\n });\n }\n for (var i = 0, len = self._deferreds.length; i < len; i++) {\n handle(self, self._deferreds[i]);\n }\n self._deferreds = null;\n}\n\n/**\n * @constructor\n */\nfunction Handler(onFulfilled, onRejected, promise) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, self) {\n var done = false;\n try {\n fn(function (value) {\n if (done) return;\n done = true;\n resolve(self, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(self, reason);\n });\n } catch (ex) {\n if (done) return;\n done = true;\n reject(self, ex);\n }\n}\nPromise$1.prototype['catch'] = function (onRejected) {\n return this.then(null, onRejected);\n};\nPromise$1.prototype.then = function (onFulfilled, onRejected) {\n // @ts-ignore\n var prom = new this.constructor(noop$1);\n handle(this, new Handler(onFulfilled, onRejected, prom));\n return prom;\n};\nPromise$1.prototype['finally'] = finallyConstructor;\nPromise$1.all = function (arr) {\n return new Promise$1(function (resolve, reject) {\n if (!isArray(arr)) {\n return reject(new TypeError('Promise.all accepts an array'));\n }\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n function res(i, val) {\n try {\n if (val && (_typeof$1(val) === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(val, function (val) {\n res(i, val);\n }, reject);\n return;\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n } catch (ex) {\n reject(ex);\n }\n }\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\nPromise$1.any = any;\nPromise$1.allSettled = allSettled;\nPromise$1.resolve = function (value) {\n if (value && _typeof$1(value) === 'object' && value.constructor === Promise$1) {\n return value;\n }\n return new Promise$1(function (resolve) {\n resolve(value);\n });\n};\nPromise$1.reject = function (value) {\n return new Promise$1(function (resolve, reject) {\n reject(value);\n });\n};\nPromise$1.race = function (arr) {\n return new Promise$1(function (resolve, reject) {\n if (!isArray(arr)) {\n return reject(new TypeError('Promise.race accepts an array'));\n }\n for (var i = 0, len = arr.length; i < len; i++) {\n Promise$1.resolve(arr[i]).then(resolve, reject);\n }\n });\n};\n\n// Use polyfill for setImmediate for performance gains\nPromise$1._immediateFn =\n// @ts-ignore\ntypeof setImmediate === 'function' && function (fn) {\n // @ts-ignore\n setImmediate(fn);\n} || function (fn) {\n setTimeoutFunc(fn, 0);\n};\nPromise$1._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n if (typeof console !== 'undefined' && console) {\n console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n }\n};\n\nvar MEASURE_NOT_FOUND_VALUE = -1;\nvar _performanceApiSupported = window.performance && window.performance.mark && window.performance.measure && window.performance.getEntriesByType;\nvar getMeasureDuration = function getMeasureDuration(measureName) {\n if (!_performanceApiSupported) {\n return MEASURE_NOT_FOUND_VALUE;\n }\n try {\n var measureDuration = MEASURE_NOT_FOUND_VALUE;\n var measures = window.performance.getEntriesByType('measure');\n for (var i = 0; i < measures.length; i++) {\n if (measures[i].name === measureName) {\n measureDuration = measures[i].duration;\n }\n }\n return Math.round(measureDuration);\n } catch (e) {\n return MEASURE_NOT_FOUND_VALUE;\n }\n};\nvar createMarker = function createMarker(markerName) {\n if (!_performanceApiSupported) {\n return;\n }\n try {\n window.performance.mark(markerName);\n } catch (e) {\n // ignore the error\n }\n};\nvar createMeasure = function createMeasure(measureName, startMark, endMark) {\n if (!_performanceApiSupported) {\n return;\n }\n try {\n // IE11 and Edge throw a syntax error if undefined is passed in to performance.measure\n if (endMark) {\n window.performance.measure(measureName, startMark, endMark);\n } else {\n window.performance.measure(measureName, startMark);\n }\n } catch (e) {\n // ignore the error\n }\n};\nvar getRumEventData = function getRumEventData(measureNames) {\n if (!_performanceApiSupported) {\n return [];\n }\n var rumData = [];\n measureNames.forEach(function (measureName) {\n var measureDuration = getMeasureDuration(measureName);\n if (measureDuration !== MEASURE_NOT_FOUND_VALUE) {\n rumData.push({\n name: measureName,\n time: measureDuration\n });\n }\n });\n return rumData;\n};\nvar performanceWrapper = {\n createMarker: createMarker,\n createMeasure: createMeasure,\n getRumEventData: getRumEventData\n};\n\nvar registeredEvents = {};\nvar listeningToWindowMessageEvent = false;\nvar onExternalMessage = function onExternalMessage(e) {\n // filter out non smart player events\n if (!e.data || typeof e.data.indexOf !== 'function' || e.data.indexOf('smartPlayerEventName') === -1) {\n return;\n }\n var message = window.JSON.parse(e.data);\n if (registeredEvents[message.smartPlayerEventName]) {\n registeredEvents[message.smartPlayerEventName].call(this, message.data);\n }\n};\nvar addWindowMessageListener = function addWindowMessageListener() {\n if (listeningToWindowMessageEvent) {\n return;\n }\n if (window.addEventListener) {\n window.addEventListener('message', onExternalMessage, false);\n } else {\n window.attachEvent('onmessage', onExternalMessage);\n }\n listeningToWindowMessageEvent = true;\n};\nvar removeWindowMessageListener = function removeWindowMessageListener() {\n if (!listeningToWindowMessageEvent) {\n return;\n }\n if (window.removeEventListener) {\n window.removeEventListener('message', onExternalMessage, false);\n } else {\n window.removeEvent('onmessage', onExternalMessage);\n }\n listeningToWindowMessageEvent = false;\n};\nvar externalMessageController = {\n addCallback: function addCallback(eventName, callbackFunction) {\n addWindowMessageListener();\n registeredEvents[eventName] = callbackFunction;\n },\n removeCallback: function removeCallback(eventName) {\n if (registeredEvents[eventName]) {\n delete registeredEvents[eventName];\n }\n if (Object.keys(registeredEvents).length === 0) {\n removeWindowMessageListener();\n }\n },\n removeAllCallbacks: function removeAllCallbacks() {\n registeredEvents = {};\n removeWindowMessageListener();\n }\n};\n\nvar postMessage = function postMessage(eventName, domain, data) {\n var message = {};\n message.smartPlayerEventName = eventName;\n if (playerConfiguration.getEmbedIFrameId()) {\n message.iFrameId = playerConfiguration.getEmbedIFrameId();\n }\n if (data) {\n message.data = data;\n }\n window.top.postMessage(window.JSON.stringify(message), domain);\n};\nvar isInIframe = function isInIframe() {\n return window !== window.top;\n};\nvar iFrameBridge = {\n postMessage: postMessage,\n isInIframe: isInIframe\n};\n\nvar parsePlayerURLParams = function parsePlayerURLParams(queryString) {\n var playerUrlParams = queryString.slice(queryString.indexOf('?') + 1).split('&');\n if (playerUrlParams && playerUrlParams.length > 0) {\n playerConfiguration.saveConfigurationFromQueryString(playerUrlParams);\n }\n};\nvar requestEmbeddedURLParams = function requestEmbeddedURLParams() {\n externalMessageController.addCallback('PARENT-URL-PARAMS', parseEmbeddedURLParams);\n iFrameBridge.postMessage('GET-EMBEDDED-URL-VARS', '*');\n};\nvar parseEmbeddedURLParams = function parseEmbeddedURLParams(data) {\n externalMessageController.removeCallback('PARENT-URL-PARAMS');\n parsePlayerURLParams(data);\n};\nvar queryParamsStripper = {\n strip: function strip() {\n parsePlayerURLParams(windowWrapper.getLocationHref());\n if (iFrameBridge.isInIframe()) {\n requestEmbeddedURLParams();\n }\n }\n};\n\nvar mediaType = Object.freeze({\n WEBM: 'webm',\n MP4: 'mp4',\n OGG: 'ogg',\n YOUTUBE: 'youtube',\n JPG: 'jpg',\n PNG: 'png',\n GIF: 'gif',\n PLAYLIST: 'playlist',\n UNKNOWN: 'unknown',\n NOT_AVAILABLE: 'not available',\n MULTIPLE_TYPES: 'multiple types'\n});\n\nvar Media = function Media(media, type, mimeType, uri) {\n var _media = media;\n var _type = type;\n var _mimeType = mimeType;\n var _uri = uri;\n return Object.defineProperties({}, {\n media: {\n get: function get() {\n return _media;\n }\n },\n type: {\n get: function get() {\n return _type;\n }\n },\n mimeType: {\n get: function get() {\n return _mimeType;\n }\n },\n uri: {\n get: function get() {\n return _uri;\n }\n }\n });\n};\nvar Media$1 = {\n create: Media\n};\n\nvar PLAYLIST_EXT = 'm3u';\nvar getFileExtension = function getFileExtension(fileName) {\n return fileName.split('#')[0].split('?')[0].split('.').pop().toLowerCase();\n};\nvar findMediaMimeTypeByRequestHeader = function findMediaMimeTypeByRequestHeader(mediaSource) {\n return new Promise$1(function (resolve) {\n $.ajax({\n type: 'HEAD',\n url: mediaSource\n }).done(function (data, textStatus, jqXHR) {\n var contentType = jqXHR.getResponseHeader('content-type') || mediaMimeType.UNKNOWN;\n resolve(contentType);\n }).fail(function () {\n resolve(mediaMimeType.UNKNOWN);\n });\n });\n};\nvar inferMimeTypeFromFileExtension = function inferMimeTypeFromFileExtension(ext) {\n switch (ext) {\n case PLAYLIST_EXT:\n return mediaMimeType.M3U;\n case 'mp4':\n case 'm4v':\n case 'mov':\n return mediaMimeType.MP4;\n case 'webm':\n return mediaMimeType.WEBM;\n case 'ogv':\n return mediaMimeType.OGV;\n case 'jpg':\n case 'jpeg':\n return mediaMimeType.JPEG;\n case 'png':\n return mediaMimeType.PNG;\n case 'gif':\n return mediaMimeType.GIF;\n default:\n return mediaMimeType.UNKNOWN;\n }\n};\nvar mediaTypeFromMimeType = function mediaTypeFromMimeType(mimeType) {\n switch (mimeType) {\n case mediaMimeType.M3U:\n return mediaType.PLAYLIST;\n case mediaMimeType.MP4:\n return mediaType.MP4;\n case mediaMimeType.WEBM:\n return mediaType.WEBM;\n case mediaMimeType.OGV:\n return mediaType.OGG;\n case mediaMimeType.PNG:\n return mediaType.PNG;\n case mediaMimeType.GIF:\n return mediaType.GIF;\n case mediaMimeType.JPEG:\n return mediaType.JPG;\n default:\n return mediaType.UNKNOWN;\n }\n};\nvar loadPlaylistFile = function loadPlaylistFile(playlistSrc) {\n return $.ajax({\n type: 'GET',\n url: playlistSrc,\n isLocal: true,\n dataType: 'text'\n });\n};\n\n/**\n * @memberof TSC\n * @class MediaListParser\n * @classdesc Parse media sources.\n * @param {Array} mediaSources - List of media source strings or objects.\n * @return new MediaListParser instance\n */\nvar MediaListParser = function MediaListParser(mediaSources) {\n var _mediaList = [];\n var _ready = null;\n var _mediaProcessedPromises = [];\n var parseM3UData = function parseM3UData(playlistData) {\n return new Promise$1(function (resolve, reject) {\n var playListMediaPromises = [];\n var playListMedia = [];\n var playlistMediaUrls = playlistData.split(/\\r?\\n/g).filter(function (value) {\n return value !== '';\n });\n playlistMediaUrls.forEach(function (mediaSrc, index) {\n playListMediaPromises.push(parseMediaUrl(mediaSrc, playListMedia, index));\n });\n Promise$1.all(playListMediaPromises).then(function () {\n resolve(playListMedia);\n })[\"catch\"](function () {\n reject('Failed to create media objects for the playlist sources.');\n });\n });\n };\n var parseYouTubeMedia = function parseYouTubeMedia(youTubeMediaSource, index) {\n var media = Media$1.create(youTubeMediaSource, mediaType.YOUTUBE, mediaMimeType.UNKNOWN, youTubeMediaSource);\n _mediaList[index] = media;\n return Promise$1.resolve(media);\n };\n var parsePlaylistSource = function parsePlaylistSource(playlistMediaSource, index) {\n return new Promise$1(function (resolve, reject) {\n var jHxr = loadPlaylistFile(playlistMediaSource);\n jHxr.done(function (data) {\n parseM3UData(data).then(function (playlistMedia) {\n var media = Media$1.create(playlistMedia, mediaType.PLAYLIST, mediaMimeType.M3U, playlistMediaSource);\n _mediaList[index] = media;\n resolve(media);\n })[\"catch\"](function () {\n reject();\n });\n });\n jHxr.fail(function () {\n reject('Failed to load the supplied playlist (' + playlistMediaSource + ')');\n });\n });\n };\n var parseMediaUrl = function parseMediaUrl(mediaSource, mediaList, index) {\n return new Promise$1(function (resolve, reject) {\n var media = null;\n if (playerConfiguration.getContentType()) {\n media = Media$1.create(mediaSource, mediaTypeFromMimeType(playerConfiguration.getContentType()), playerConfiguration.getContentType(), mediaSource);\n mediaList[index] = media;\n resolve(media);\n } else {\n var inferredMimeType = inferMimeTypeFromFileExtension(getFileExtension(mediaSource));\n if (inferredMimeType === mediaMimeType.UNKNOWN) {\n findMediaMimeTypeByRequestHeader(mediaSource).then(function (mimeType) {\n if (mimeType !== mediaMimeType.UNKNOWN) {\n media = Media$1.create(mediaSource, mediaTypeFromMimeType(mimeType), mimeType, mediaSource);\n mediaList[index] = media;\n resolve(media);\n } else {\n reject('Could not determine the content type of media (' + mediaSource + ')');\n }\n });\n } else {\n media = Media$1.create(mediaSource, mediaTypeFromMimeType(inferredMimeType), inferredMimeType, mediaSource);\n mediaList[index] = media;\n resolve(media);\n }\n }\n });\n };\n var parseMedia = function parseMedia(mediaSource, index) {\n var youtubeRegex = /youtu(?:\\.be|be\\.com)\\//;\n if (youtubeRegex.test(mediaSource)) {\n return parseYouTubeMedia(mediaSource, index);\n }\n if (getFileExtension(mediaSource) === PLAYLIST_EXT) {\n return parsePlaylistSource(mediaSource, index);\n }\n return parseMediaUrl(mediaSource, _mediaList, index);\n };\n mediaSources.forEach(function (source, index) {\n _mediaProcessedPromises.push(parseMedia(source, index));\n });\n _ready = Promise$1.all(_mediaProcessedPromises);\n return Object.defineProperties({}, {\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaListParser\n * @property {Array} ready - List of Media objects.\n */\n mediaList: {\n get: function get() {\n return [].concat(_mediaList);\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaListParser\n * @property {Promise} ready - Promise that resolves when media sources has been parsed.\n */\n ready: {\n get: function get() {\n return _ready;\n }\n }\n });\n};\nvar MediaListParser$1 = {\n /**\n * Factory method that returns a new MediaListParser object.\n * @function create\n * @memberof TSC.MediaListParser\n * @static\n * @param {Array} mediaSources - List of media source strings or objects.\n * @return new MediaListParser instance\n */\n create: MediaListParser\n};\n\n/**\n * @memberof TSC\n * @class MediaList\n * @classdesc List of media\n * @param {Array} mediaSources - List of media source strings or objects.\n * @return new MediaList instance\n */\nvar MediaList = function MediaList(mediaSources) {\n var _readyPromiseResolve;\n var _readyPromiseReject;\n var _readyPromise = new Promise$1(function (resolve, reject) {\n _readyPromiseResolve = resolve;\n _readyPromiseReject = reject;\n });\n var _mediaListParser;\n var _currentMediaIndex = 0;\n var _mediaList;\n _mediaListParser = MediaListParser$1.create(mediaSources);\n _mediaListParser.ready.then(function () {\n _mediaList = _mediaListParser.mediaList[0].type === mediaType.PLAYLIST ? _mediaListParser.mediaList[0].media : _mediaListParser.mediaList;\n _readyPromiseResolve();\n })[\"catch\"](function () {\n _readyPromiseReject();\n });\n var getMediaIndexByUri = function getMediaIndexByUri(uri) {\n var mediaIndex = -1;\n _mediaList.some(function (media, index) {\n if (media.uri === uri) {\n mediaIndex = index;\n }\n return media.uri === uri;\n });\n return mediaIndex;\n };\n var isMediaTypeAvailable = function isMediaTypeAvailable(type) {\n return _mediaList.some(function (media) {\n return type === media.type;\n });\n };\n var setCurrentMediaIndex = function setCurrentMediaIndex(mediaPosition) {\n if (typeof mediaPosition === 'string') {\n if (mediaPosition === 'next') {\n if (_currentMediaIndex < _mediaList.length - 1) {\n _currentMediaIndex++;\n }\n } else if (mediaPosition === 'previous') {\n if (_currentMediaIndex > 0) {\n _currentMediaIndex--;\n }\n }\n } else if (typeof mediaPosition === 'number') {\n if (mediaPosition >= 0 && mediaPosition < _mediaList.length) {\n _currentMediaIndex = mediaPosition;\n }\n }\n return _currentMediaIndex;\n };\n return Object.defineProperties({\n /**\n * Get the index of an uri in the media list.\n * @function getMediaIndexByUri\n * @memberof TSC.MediaList\n * @param {String} uri - uri to search for.\n * @return {Number} index of uri or -1 if not found.\n */\n getMediaIndexByUri: getMediaIndexByUri,\n /**\n * Checks media list for supplied type and return true if found.\n * @function isMediaTypeAvailable\n * @memberof TSC.MediaList\n * @param {String} type - media type.\n * @return {Boolean} Is the type available.\n */\n isMediaTypeAvailable: isMediaTypeAvailable\n }, {\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaList\n * @property {Promise} ready - Promise that resolves when media list has been parsed.\n */\n ready: {\n get: function get() {\n return _readyPromise;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaList\n * @property {TSC.Media} currentMedia - Current Media object.\n */\n currentMedia: {\n get: function get() {\n return _mediaList[_currentMediaIndex];\n }\n },\n /**\n * @public\n * @memberof TSC.MediaList\n * @property {Number} currentMediaIndex - Current index in the media list.\n */\n currentMediaIndex: {\n get: function get() {\n return _currentMediaIndex;\n },\n set: setCurrentMediaIndex\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaList\n * @property {Array} mediaList - List of media objects.\n */\n mediaList: {\n get: function get() {\n return _mediaList;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaList\n * @property {String} currentMediaType - Current media object type.\n */\n currentMediaType: {\n get: function get() {\n return _mediaList[_currentMediaIndex].type;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaList\n * @property {Boolean} onFirstMedia - Is the current index pointing to the first media element in the list.\n */\n onFirstMedia: {\n get: function get() {\n return _currentMediaIndex === 0;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaList\n * @property {Boolean} onFirstMedia - Is the current index pointing to the last media element in the list.\n */\n onLastMedia: {\n get: function get() {\n return _currentMediaIndex + 1 === _mediaList.length;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaList\n * @property {Boolean} hasImage - Is there an image in the media list.\n */\n hasImage: {\n get: function get() {\n return _mediaList[0].type === mediaType.JPG || _mediaList[0].type === mediaType.GIF || _mediaList[0].type === mediaType.PNG;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaList\n * @property {Boolean} isPlaylist - Is the first media element a playlist.\n */\n isPlaylist: {\n get: function get() {\n return _mediaListParser.mediaList[0].type === mediaType.PLAYLIST;\n }\n }\n });\n};\nvar MediaList$1 = {\n /**\n * Factory method that returns a new MediaList object.\n * @function create\n * @memberof TSC.MediaList\n * @static\n * @param {Array} mediaSources - List of media source strings or objects.\n * @return new MediaList instance\n */\n create: MediaList\n};\n\nvar playerType = Object.freeze({\n HTML5_VIDEO: 'html5',\n YOUTUBE: 'youtube',\n IMAGE: 'image',\n NOT_SUPPORTED: 'not_supported'\n});\n\nvar _currentPlayerType$1;\nvar MIN_IE_VERSION = 9;\nvar _getPlayerType = function getPlayerType(mediaList) {\n var haveImage = mediaList.hasImage;\n var haveWebMAndCanPlay = mediaList.isMediaTypeAvailable(mediaType.WEBM) && deviceInfo.canPlayWebM();\n var haveMP4AndCanPlay = mediaList.isMediaTypeAvailable(mediaType.MP4) && deviceInfo.canPlayMP4();\n var haveOGGAndCanPlay = mediaList.isMediaTypeAvailable(mediaType.OGG) && deviceInfo.canPlayOgg();\n var haveYoutubeEmbedUrl = mediaList.isMediaTypeAvailable(mediaType.YOUTUBE);\n if (deviceInfo.isIE() && deviceInfo.getIEVersion() !== null && deviceInfo.getIEVersion() <= MIN_IE_VERSION) {\n return playerType.NOT_SUPPORTED;\n }\n if (haveYoutubeEmbedUrl) {\n return playerType.YOUTUBE;\n }\n if (haveWebMAndCanPlay || haveMP4AndCanPlay || haveOGGAndCanPlay) {\n return playerType.HTML5_VIDEO;\n }\n if (haveImage) {\n return playerType.IMAGE;\n }\n return playerType.NOT_SUPPORTED;\n};\nvar mediaPlayerController = {\n getPlayerType: function getPlayerType(mediaList) {\n return _currentPlayerType$1 || (_currentPlayerType$1 = _getPlayerType(mediaList));\n },\n clearPlayerType: function clearPlayerType() {\n _currentPlayerType$1 = undefined;\n }\n};\n\nvar _smartPlayerNamespace = 'tsc-smartplayer';\nvar _videoWrapper = 'video-wrapper';\nvar _scormModule = 'scorm-module';\nvar _scormModuleNavigationContainer = 'scorm-module-navigation-container';\nvar _playerControlsVisible = 'player-controls-visible';\nvar _largerProgressBar = 'larger-progress-bar';\nvar _disabled = 'disabled-button';\nvar _hide = 'hide';\nvar _hideElement = 'hide-element';\nvar _volumeSliderHidden = 'volume-slider-hidden';\nvar _hideSecondaryControls = 'hide-secondary-controls';\nvar _fullscreenMode = 'fullscreen-mode';\nvar _volumeMutedButtonGlyph = 'volume-muted-button-glyph';\nvar _volumeLowButtonGlyph = 'volume-low-button-glyph';\nvar _volumeMediumButtonGlyph = 'volume-medium-button-glyph';\nvar _volumeHighButtonGlyph = 'volume-high-button-glyph';\nvar _playButtonGlyph = 'play-button-glyph';\nvar _pauseButtonGlyph = 'pause-button-glyph';\nvar _fullscreenButtonGlyph = 'fullscreen-button-glyph';\nvar _fullscreenButtonActiveGlyph = 'fullscreen-button-active-glyph';\nvar _fullFrameButtonGlyph = 'full-frame-button-glyph';\nvar _fullFrameButtonActiveGlyph = 'full-frame-button-active-glyph';\nvar _theaterModeButtonGlyph = 'theater-mode-button-glyph';\nvar _theaterModeButtonActiveGlyph = 'theater-mode-button-active-glyph';\nvar _expandButtonActiveGlyph = 'expand-button-glyph';\nvar _audioDescriptionButtonGlyph = 'audio-description-button-glyph';\nvar _audioDescriptionButtonActiveGlyph = 'audio-description-button-active-glyph';\nvar _closedCaptionButtonGlyph = 'closed-caption-glyph';\nvar _closedCaptionNonEnglishButtonGlyph = 'closed-caption-non-en-glyph';\nvar _closedCaptionButtonActiveGlyph = 'closed-caption-active-glyph';\nvar _closedCaptionNonEnglishButtonActiveGlyph = 'closed-caption-non-en-active-glyph';\nvar _tocButtonGlyph = 'toc-button-glyph';\nvar _tocButtonActiveGlyph = 'toc-button-active-glyph';\nvar _settingsButtonGlyph = 'settings-button-glyph';\nvar _settingsButtonActiveGlyph = 'settings-button-active-glyph';\nvar _tertiaryButton = 'tertiary-button';\nvar _tertiaryButtonActive = 'tertiary-button-active';\nvar _generatedPluginContainer = 'generated-plugin-container';\nvar _pluginNamedContainerPrefix = 'plugin-';\nvar _hotspotVisible = 'hotspot-visible';\nvar _screenReaderAlert = 'alert-only';\nvar _imageViewAnimateTransitions = 'animate-transitions';\nvar _safariPipIssueFix = 'patch-safari-pip-issue';\nvar _captionsUnderVideo = 'caption_under_video';\nvar _captionsVerticalAlignTop = 'captionVAlignTop';\nvar _captionsVerticalAlignBottom = 'captionVAlignBottom';\nvar _captionsHorizontalAlignLeft = 'captionHAlignLeft';\nvar _captionsHorizontalAlignCenter = 'captionHAlignCenter';\nvar _captionsHorizontalAlignRight = 'captionHAlignRight';\nvar _captionsCustomPosition = 'custom-caption-position';\nvar _captionsCaptionSelected = 'caption-selected';\nvar _captionsPreventCaptionDrag = 'prevent-caption-drag';\nvar _captionXmpView = 'xmp-caption';\nvar _captionAdaView = 'ada-caption';\nvar _progressBarTrackPreventSeeking = 'prevent-seeking';\nvar _hideBubbleArrow = 'hide-bubble-arrow';\nvar _hiddenVideoThumbnailVisible = 'hidden-video-thumbnail-visible';\nvar _scrubPreviewHasThumbnail = 'has-thumbnail';\nvar _focusableAnswerInput = 'focusable-answer-input';\nvar _constrainMediaHeight = 'constrain-media-height';\nvar _constrainMediaWidth = 'constrain-media-width';\nvar _mediaTypeYouTube = 'media-type-youtube';\nvar cssClasses = Object.defineProperties({}, {\n smartPlayerNamespace: {\n value: _smartPlayerNamespace\n },\n videoWrapper: {\n value: _videoWrapper\n },\n scormModule: {\n value: _scormModule\n },\n scormModuleNavigationContainer: {\n value: _scormModuleNavigationContainer\n },\n playerControlsVisible: {\n value: _playerControlsVisible\n },\n largerProgressBar: {\n value: _largerProgressBar\n },\n hide: {\n value: _hide\n },\n hideElement: {\n value: _hideElement\n },\n volumeSliderHidden: {\n value: _volumeSliderHidden\n },\n hideSecondaryControls: {\n value: _hideSecondaryControls\n },\n disabled: {\n value: _disabled\n },\n fullscreenMode: {\n value: _fullscreenMode\n },\n volumeMutedButtonGlyph: {\n value: _volumeMutedButtonGlyph\n },\n volumeLowButtonGlyph: {\n value: _volumeLowButtonGlyph\n },\n volumeMediumButtonGlyph: {\n value: _volumeMediumButtonGlyph\n },\n volumeHighButtonGlyph: {\n value: _volumeHighButtonGlyph\n },\n playButtonGlyph: {\n value: _playButtonGlyph\n },\n pauseButtonGlyph: {\n value: _pauseButtonGlyph\n },\n fullscreenButtonGlyph: {\n value: _fullscreenButtonGlyph\n },\n fullscreenButtonActiveGlyph: {\n value: _fullscreenButtonActiveGlyph\n },\n fullFrameButtonGlyph: {\n value: _fullFrameButtonGlyph\n },\n fullFrameButtonActiveGlyph: {\n value: _fullFrameButtonActiveGlyph\n },\n expandButtonGlyph: {\n value: _expandButtonActiveGlyph\n },\n audioDescriptionButtonGlyph: {\n value: _audioDescriptionButtonGlyph\n },\n audioDescriptionButtonActiveGlyph: {\n value: _audioDescriptionButtonActiveGlyph\n },\n closedCaptionButtonGlyph: {\n value: _closedCaptionButtonGlyph\n },\n closedCaptionNonEnglishButtonGlyph: {\n value: _closedCaptionNonEnglishButtonGlyph\n },\n closedCaptionButtonActiveGlyph: {\n value: _closedCaptionButtonActiveGlyph\n },\n closedCaptionNonEnglishButtonActiveGlyph: {\n value: _closedCaptionNonEnglishButtonActiveGlyph\n },\n tocButtonGlyph: {\n value: _tocButtonGlyph\n },\n tocButtonActiveGlyph: {\n value: _tocButtonActiveGlyph\n },\n settingsButtonGlyph: {\n value: _settingsButtonGlyph\n },\n settingsButtonActiveGlyph: {\n value: _settingsButtonActiveGlyph\n },\n tertiaryButton: {\n value: _tertiaryButton\n },\n tertiaryButtonActive: {\n value: _tertiaryButtonActive\n },\n generatedPluginContainer: {\n value: _generatedPluginContainer\n },\n pluginNamedContainerPrefix: {\n value: _pluginNamedContainerPrefix\n },\n hotspotVisible: {\n value: _hotspotVisible\n },\n screenReaderAlert: {\n value: _screenReaderAlert\n },\n imageViewAnimateTransitions: {\n value: _imageViewAnimateTransitions\n },\n safariPipIssueFix: {\n value: _safariPipIssueFix\n },\n captionsUnderVideo: {\n value: _captionsUnderVideo\n },\n captionsVerticalAlignTop: {\n value: _captionsVerticalAlignTop\n },\n captionsVerticalAlignBottom: {\n value: _captionsVerticalAlignBottom\n },\n captionsHorizontalAlignLeft: {\n value: _captionsHorizontalAlignLeft\n },\n captionsHorizontalAlignCenter: {\n value: _captionsHorizontalAlignCenter\n },\n captionsHorizontalAlignRight: {\n value: _captionsHorizontalAlignRight\n },\n captionsCustomPosition: {\n value: _captionsCustomPosition\n },\n captionsCaptionSelected: {\n value: _captionsCaptionSelected\n },\n captionsPreventCaptionDrag: {\n value: _captionsPreventCaptionDrag\n },\n captionXmpView: {\n value: _captionXmpView\n },\n captionAdaView: {\n value: _captionAdaView\n },\n progressBarTrackPreventSeeking: {\n value: _progressBarTrackPreventSeeking\n },\n hideBubbleArrow: {\n value: _hideBubbleArrow\n },\n hiddenVideoThumbnailVisible: {\n value: _hiddenVideoThumbnailVisible\n },\n scrubPreviewHasThumbnail: {\n value: _scrubPreviewHasThumbnail\n },\n focusableAnswerInput: {\n value: _focusableAnswerInput\n },\n constrainMediaHeight: {\n value: _constrainMediaHeight\n },\n constrainMediaWidth: {\n value: _constrainMediaWidth\n },\n mediaTypeYouTube: {\n value: _mediaTypeYouTube\n },\n theaterModeButtonGlyph: {\n value: _theaterModeButtonGlyph\n },\n theaterModeButtonActiveGlyph: {\n value: _theaterModeButtonActiveGlyph\n }\n});\n\nvar cssVariables = Object.defineProperties({}, {\n playerWidth: {\n value: '--player-width'\n },\n playerHeight: {\n value: '--player-height'\n },\n mediaIntrinsicWidth: {\n value: '--media-intrinsic-width'\n },\n mediaIntrinsicHeight: {\n value: '--media-intrinsic-height'\n },\n mediaIntrinsicAspectRatio: {\n value: '--media-intrinsic-aspect-ratio'\n },\n mediaIntrinsicAspectRatioNumber: {\n value: '--media-intrinsic-aspect-ratio-number'\n },\n mediaViewPortWidth: {\n value: '--media-viewport-width'\n },\n mediaViewPortHeight: {\n value: '--media-viewport-height'\n },\n mediaViewPortAspectRatio: {\n value: '--media-viewport-aspect-ratio'\n },\n mediaViewPortAspectRatioNumber: {\n value: '--media-viewport-aspect-ratio-number'\n },\n reservedSizeScorm: {\n value: '--reserved-size-scorm-controls'\n },\n reservedSizeCaptions: {\n value: '--reserved-size-captions'\n },\n reservedSizeControls: {\n value: '--reserved-size-controls'\n },\n tocTopOffset: {\n value: '--toc-top-offset'\n }\n});\n\n/**\n * @memberof TSC\n * @class responsiveController\n * @classdesc Control responsive classes and css variables on player container and media container\n * @param {jQuery} $rootContainer - Smart Player main container jquery element\n *\n */\nvar ResponsiveController = function ResponsiveController($rootContainer) {\n var _$rootContainer = $rootContainer;\n var _$mediaViewPortContainer = null;\n var _$mediaSizingContainer = null;\n var _currentViewPortWidth = 0;\n var _currentViewPortHeight = 0;\n var _currentViewPortAspectRatio = 1.0;\n var _intrinsicWidth = 0;\n var _intrinsicHeight = 0;\n var _intrinsicAspectRatio = 1.0;\n var _rootContainerResizeObserver = null;\n var _viewPortContainerResizeObserver = null;\n var _initialCheck = true;\n var isApproximatelySameSize = function isApproximatelySameSize(newDimensionDouble, existingCssVarName) {\n // not pretty, but... at least chrome will trigger size change on partial pixel calculation changes, even if it lands in the same pixel, due to\n // compounding javascript rounding errors that happen in continued calculations of aspect-ratio, this can cause a subtle, slow run-away down/up-sizing\n // so, we compare the existing value from CSS var, parseInt to clip off the 'px' and get to number, and do an === compare from there. if the whole numbers\n // really haven't changed, we just return early exit where this func is used to prevent run-away size changes\n return Math.round(newDimensionDouble) === Math.round(parseFloat(_$rootContainer[0].style.getPropertyValue(existingCssVarName), 10));\n };\n _rootContainerResizeObserver = new ResizeObserver(function () {\n if (!_initialCheck && isApproximatelySameSize(_$rootContainer.width(), cssVariables.playerWidth) && isApproximatelySameSize(_$rootContainer.height(), cssVariables.playerHeight)) {\n return;\n }\n _initialCheck = false;\n manageResponsiveClasses();\n _$rootContainer[0].style.setProperty(cssVariables.playerWidth, \"\".concat(_$rootContainer.width(), \"px\"));\n _$rootContainer[0].style.setProperty(cssVariables.playerHeight, \"\".concat(_$rootContainer.height(), \"px\"));\n _$rootContainer.trigger(events.Controls.PlayerResize);\n });\n _viewPortContainerResizeObserver = new ResizeObserver(function () {\n calculateMediaViewPortDimensions();\n setCssVariables(_$rootContainer[0]);\n _$rootContainer.trigger(events.Controls.MediaResize);\n });\n var _responsiveBreakpoints = Object.freeze({\n 'small-mobile': {\n width: 1,\n height: 1\n },\n 'medium-mobile': {\n width: 250,\n height: 250\n },\n 'small-desktop': {\n width: 400,\n height: 400\n },\n 'medium-desktop': {\n width: 510,\n height: 510\n }\n });\n var initializeIntrinsicSizing = function initializeIntrinsicSizing(intrinsicWidth, intrinsicHeight) {\n if (_intrinsicWidth === 0 && _intrinsicHeight === 0) {\n _intrinsicWidth = intrinsicWidth;\n _intrinsicHeight = intrinsicHeight;\n _intrinsicAspectRatio = intrinsicWidth / intrinsicHeight;\n }\n calculateMediaViewPortDimensions();\n setCssVariables($rootContainer[0]);\n };\n var monitorContainerSize = function monitorContainerSize() {\n _rootContainerResizeObserver.observe(_$rootContainer[0]);\n };\n var calculateMediaViewPortDimensions = function calculateMediaViewPortDimensions() {\n if (!_$mediaViewPortContainer || _intrinsicWidth === 0 || _intrinsicHeight === 0) {\n return;\n }\n var viewPortWidth = _$mediaViewPortContainer.width();\n var viewPortHeight = _$mediaViewPortContainer.height();\n if (viewPortWidth === 0 || viewPortHeight === 0) {\n return;\n }\n if (isApproximatelySameSize(viewPortWidth, cssVariables.mediaViewPortWidth) && isApproximatelySameSize(viewPortHeight, cssVariables.mediaViewPortHeight)) {\n return;\n }\n _currentViewPortWidth = viewPortWidth;\n _currentViewPortHeight = viewPortHeight;\n _currentViewPortAspectRatio = _currentViewPortWidth / _currentViewPortHeight;\n\n // note: i _hate_ that we have to resort to this, i fought for many days trying to get our browser support vector\n // to use just plain css to do these things:\n // 1) expand the 'media-container' to the max width/height available based on the native media and viewport size\n // 2) reduce the 'media-container' to the necessary width/height available based on the native media and viewport size\n // 3) preserve aspect-ratio of the native media (ideally by just using the intrinsic dimensions of the video tag itself)\n // 4) put a container around that native media that shrinks height _AND_ width to the size of the auto-sized media\n // - this container can then contain the hotspots, plugins, other to allow them to autosize to 100%/100% absolute\n // even with several layers of divs, i could not achieve this and am reduced to managing aspect-ratio-driven calculations\n // this final solution manages some responsive classes and allows CSS and css-variables to do the calculations\n // but ideally we could use flex and/or grid to just allow media to flex shrink/grow, preserve aspect ratio, and contain a\n // wrapping container that shrinks to the size of the media auto-sized media. (JMD: 2022-07)\n if (_currentViewPortAspectRatio < _intrinsicAspectRatio) {\n // width == 100%, add constrain-height\n _$mediaSizingContainer.addClass(cssClasses.constrainMediaHeight);\n _$mediaSizingContainer.removeClass(cssClasses.constrainMediaWidth);\n } else {\n // height == 100%, add constrain-width\n _$mediaSizingContainer.addClass(cssClasses.constrainMediaWidth);\n _$mediaSizingContainer.removeClass(cssClasses.constrainMediaHeight);\n }\n };\n var setCssVariables = function setCssVariables(domContainer) {\n domContainer.style.setProperty(cssVariables.mediaIntrinsicWidth, \"\".concat(_intrinsicWidth, \"px\"));\n domContainer.style.setProperty(cssVariables.mediaIntrinsicHeight, \"\".concat(_intrinsicHeight, \"px\"));\n domContainer.style.setProperty(cssVariables.mediaIntrinsicAspectRatio, \"\".concat(_intrinsicWidth, \" / \").concat(_intrinsicHeight)); // we dont round this because intrinsic media data should always come in as whole number dimensions\n domContainer.style.setProperty(cssVariables.mediaIntrinsicAspectRatioNumber, \"\".concat(_intrinsicAspectRatio));\n if (_currentViewPortWidth !== 0 && _currentViewPortHeight !== 0) {\n domContainer.style.setProperty(cssVariables.mediaViewPortWidth, \"\".concat(_currentViewPortWidth, \"px\"));\n domContainer.style.setProperty(cssVariables.mediaViewPortHeight, \"\".concat(_currentViewPortHeight, \"px\"));\n domContainer.style.setProperty(cssVariables.mediaViewPortAspectRatio, \"\".concat(Math.round(_currentViewPortWidth), \" / \").concat(Math.round(_currentViewPortHeight))); // round this, because it can come in as partial-pixel, the valid aspect-ratio for css are whole numbers\n domContainer.style.setProperty(cssVariables.mediaViewPortAspectRatioNumber, \"\".concat(_currentViewPortAspectRatio));\n }\n };\n var monitorMediaViewPortSize = function monitorMediaViewPortSize($mediaViewPortContainer, $mediaSizingContainer, intrinsicWidth, intrinsicHeight) {\n _$mediaViewPortContainer = $mediaViewPortContainer;\n _$mediaSizingContainer = $mediaSizingContainer;\n if (intrinsicWidth > 0 && intrinsicHeight > 0) {\n _intrinsicWidth = intrinsicWidth;\n _intrinsicHeight = intrinsicHeight;\n _intrinsicAspectRatio = intrinsicHeight ? intrinsicWidth / intrinsicHeight : 1; // guard for div0 even though it really shouldnt happen\n }\n calculateMediaViewPortDimensions();\n setCssVariables(_$rootContainer[0]);\n _viewPortContainerResizeObserver.observe(_$mediaViewPortContainer[0]);\n };\n var manageResponsiveClasses = function manageResponsiveClasses() {\n if (!_$rootContainer) {\n return;\n }\n var containerWidth = _$rootContainer.width();\n var containerHeight = _$rootContainer.height();\n $.each(_responsiveBreakpoints, function (key, breakpoint) {\n var widthClassName = [key, 'width'].join('-');\n var heightClassName = [key, 'height'].join('-');\n if (breakpoint.width && containerWidth > breakpoint.width) {\n _$rootContainer.addClass(widthClassName);\n } else {\n _$rootContainer.removeClass(widthClassName);\n }\n if (breakpoint.height && containerHeight > breakpoint.height) {\n _$rootContainer.addClass(heightClassName);\n } else {\n _$rootContainer.removeClass(heightClassName);\n }\n });\n };\n var clearContainerMonitors = function clearContainerMonitors() {\n _rootContainerResizeObserver.disconnect();\n _viewPortContainerResizeObserver.disconnect();\n\n // not resetting the $_rootContainer, _$mediaViewPortContainer or _$mediaSizingContainer because afaik, they persist for\n // the lifetime of the player? if monitorMediaViewPortSize is called again, they will be re-established anyway\n _currentViewPortWidth = 0;\n _currentViewPortHeight = 0;\n _currentViewPortAspectRatio = 1.0;\n _intrinsicWidth = 0;\n _intrinsicHeight = 0;\n _intrinsicAspectRatio = 1.0;\n };\n return Object.defineProperties({\n /**\n * Monitor the root player element for a change in size\n * @function monitorContainerSize\n * @memberof TSC.ResponsiveController\n * @static\n */\n monitorContainerSize: monitorContainerSize,\n /**\n * Monitor the viewport element for a change in size\n * @function monitorMediaViewPortSize\n * @param {JQuery} $mediaViewPortContainer - jquery element to monitor that is the media viewport\n * @param {JQuery} $mediaSizingContainer - jquery element to resize based on aspect-ratio of media vs size of current viewport\n * @param {number} intrinsicWidth - the current media intrinsic width.\n * @param {number} intrinsicHeight - the current media intrinsic height.\n * @memberof TSC.ResponsiveController\n * @static\n */\n monitorMediaViewPortSize: monitorMediaViewPortSize,\n /**\n * Configure some intrinsic media sizing hints for the media from data or configuration before media has been loaded.\n * @function initializeIntrinsicSizing\n * @param {number} intrinsicWidth - the current media intrinsic width.\n * @param {number} intrinsicHeight - the current media intrinsic height.\n * @memberof TSC.ResponsiveController\n * @static\n */\n initializeIntrinsicSizing: initializeIntrinsicSizing,\n /**\n * Stop monitoring the root player element for a change in size\n * @function clearContainerMonitors\n * @memberof TSC.ResponsiveController\n * @static\n */\n clearContainerMonitors: clearContainerMonitors\n }, {\n responsiveBreakpoints: {\n get: function get() {\n return _responsiveBreakpoints;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ResponsiveController\n * @property {number} currentMediaWidth - the current width of the media\n */\n currentMediaWidth: {\n get: function get() {\n return _$mediaSizingContainer.width();\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ResponsiveController\n * @property {number} currentMediaHeight - the current height of the media\n */\n currentMediaHeight: {\n get: function get() {\n return _$mediaSizingContainer.height();\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ResponsiveController\n * @property {number} intrinsicMediaWidth - the intrinsic (native) width of the media\n */\n intrinsicMediaWidth: {\n get: function get() {\n return _intrinsicWidth;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ResponsiveController\n * @property {number} intrinsicMediaHeight - the intrinsic (native) height of the media\n */\n intrinsicMediaHeight: {\n get: function get() {\n return _intrinsicHeight;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ResponsiveController\n * @property {number} intrinsicMediaAspectRatio - the intrinsic (native) aspect-ratio of the media\n */\n intrinsicMediaAspectRatio: {\n get: function get() {\n return _intrinsicAspectRatio;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ResponsiveController\n * @property {number} currentViewPortWidth - the current width of the viewport\n */\n currentViewPortWidth: {\n get: function get() {\n return _currentViewPortWidth;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ResponsiveController\n * @property {number} currentViewPortHeight - the current height of the viewport\n */\n currentViewPortHeight: {\n get: function get() {\n return _currentViewPortHeight;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ResponsiveController\n * @property {number} currentViewPortAspectRatio - the current aspect-ratio of the viewport\n */\n currentViewPortAspectRatio: {\n get: function get() {\n return _currentViewPortAspectRatio;\n }\n }\n });\n};\nvar ResponsiveController$1 = {\n /**\n * Factory method that returns a new ResponsiveController.\n * @function create\n * @memberof TSC.ResponsiveController\n * @static\n * @param {jQuery} $rootContainer - Smart Player main container jquery element\n * @return new ResponsiveController instance\n */\n create: ResponsiveController\n};\n\nvar _noneType = 'NONE';\nvar _apiType = 'API';\nvar _scormType = 'SCORM';\nvar _apiAndScormType = 'APIANDSCORM';\nvar reportType = Object.freeze({\n NONE: _noneType,\n API: _apiType,\n SCORM: _scormType,\n APIANDSCORM: _apiAndScormType,\n isValid: function isValid(type) {\n return type === _noneType || type === _apiType || type === _scormType || type === _apiAndScormType;\n }\n});\n\nvar MARKER_BEGIN_OFFSET = 250; // 250 milliseconds\nvar MARKER_END_OFFSET = 100; // 100 milliseconds\n\n/**\n * @memberof TSC\n * @class QuestionSetMarker\n * @classdesc Question Set Marker\n * @params {Number} questionSetIndex - Question Set index\n * @params {TSC.QuestionSet} questionSet - Question set object for this marker.\n */\nvar QuestionSetMarker = function QuestionSetMarker(questionSetIndex, questionSet) {\n var _questionSetIndex = questionSetIndex;\n var _startTime = questionSet.startTime;\n var _rangeStart = questionSet.startTime - MARKER_BEGIN_OFFSET;\n var _rangeEnd = questionSet.startTime + MARKER_END_OFFSET;\n var _canSeekPast = false;\n return Object.defineProperties({}, {\n questionSetIndex: {\n get: function get() {\n return _questionSetIndex;\n },\n set: function set(questionSetId) {\n _questionSetIndex = questionSetId;\n }\n },\n rangeStart: {\n get: function get() {\n return _rangeStart;\n },\n set: function set(rangeStart) {\n _rangeStart = rangeStart;\n }\n },\n rangeEnd: {\n get: function get() {\n return _rangeEnd;\n },\n set: function set(rangeEnd) {\n _rangeEnd = rangeEnd;\n }\n },\n startTime: {\n get: function get() {\n return _startTime;\n },\n set: function set(time) {\n _startTime = time;\n }\n },\n completed: {\n get: function get() {\n return questionSet.completed;\n }\n },\n canSeekPast: {\n get: function get() {\n return questionSet.completed || _canSeekPast;\n },\n set: function set(canSeekPast) {\n _canSeekPast = canSeekPast;\n }\n }\n });\n};\nvar QuestionSetMarker$1 = {\n /**\n * Factory method that returns a new QuestionSetMarker object.\n * @function create\n * @memberof TSC.QuestionSetMarker\n * @params {Number} questionSetIndex - Question Set index\n * @params {Number} startTime - Time of question marker relative to media.\n * @static\n * @return new QuestionSetMarker instance\n */\n create: QuestionSetMarker\n};\n\nvar questionType = Object.freeze({\n FILL_IN: 'FITB',\n CHOICE: 'MC',\n SHORT: 'SHORT'\n});\n\nvar SHORT_ANSWER_SNAPSHOT_TEXT = 'n/a';\n\n/**\n * @memberof TSC\n * @class Question\n * @param {tscme.Question} tscmeQuestionModel - Question model from Media-Extensions-js\n * @classdesc Question model\n */\nvar Question = function Question(tscmeQuestionModel) {\n var _isGraded = false;\n var _userResponse;\n var _isResponseCorrect;\n var _attemptDuration = 0;\n var _correctAnswer;\n var _responseLocked = false;\n var _feedbackActionExecuted = false;\n var getIsGraded = function getIsGraded(type, correctAnswer, answers) {\n return type === questionType.CHOICE && correctAnswer && correctAnswer > 0 || type === questionType.FILL_IN && answers.length > 0;\n };\n _isGraded = getIsGraded(tscmeQuestionModel.type, tscmeQuestionModel.correctAnswer, tscmeQuestionModel.answers);\n _correctAnswer = tscmeQuestionModel.correctAnswer;\n var toJSON = function toJSON() {\n return {\n id: tscmeQuestionModel.id,\n type: tscmeQuestionModel.type,\n questionText: tscmeQuestionModel.text,\n choices: tscmeQuestionModel.answers.map(function (answer) {\n return answer.text;\n }),\n correctAnswer: _correctAnswer\n };\n };\n var getSnapShot = function getSnapShot() {\n // due to character limitations with SCORM data we will not include short answer user response\n var snapshotUserResponse = _userResponse;\n if (tscmeQuestionModel.type === questionType.SHORT && _userResponse) {\n snapshotUserResponse = SHORT_ANSWER_SNAPSHOT_TEXT;\n }\n return {\n id: tscmeQuestionModel.id,\n rl: _responseLocked,\n ad: _attemptDuration,\n ur: snapshotUserResponse,\n irc: _isResponseCorrect\n };\n };\n var populateQuestion = function populateQuestion(questionSnapShot) {\n if (questionSnapShot.id === tscmeQuestionModel.id) {\n _responseLocked = questionSnapShot.rl;\n _attemptDuration = questionSnapShot.ad;\n _userResponse = questionSnapShot.ur;\n _isResponseCorrect = questionSnapShot.irc;\n }\n };\n var getQuizServiceData = function getQuizServiceData(percentOfVideoSegmentWatched) {\n var questionData = {\n type: tscmeQuestionModel.type,\n id: tscmeQuestionModel.id,\n duration: _attemptDuration,\n response: _userResponse,\n correct: _isResponseCorrect,\n segmentWatched: percentOfVideoSegmentWatched\n };\n\n // no correct answer for MC question, don't include correct var\n if (tscmeQuestionModel.type === questionType.CHOICE && _correctAnswer === 0) {\n delete questionData.correct;\n }\n return questionData;\n };\n var getFeedbackForReason = function getFeedbackForReason(reason) {\n var feedback = null;\n tscmeQuestionModel.feedback.forEach(function (feedbackItem) {\n if (feedbackItem.reason === reason) {\n feedback = feedbackItem;\n }\n });\n return feedback;\n };\n return Object.defineProperties({\n toJSON: toJSON,\n getSnapShot: getSnapShot,\n populateQuestion: populateQuestion,\n getQuizServiceData: getQuizServiceData,\n getFeedbackForReason: getFeedbackForReason\n }, {\n id: {\n get: function get() {\n return tscmeQuestionModel.id;\n }\n },\n type: {\n get: function get() {\n return tscmeQuestionModel.type;\n }\n },\n text: {\n get: function get() {\n return tscmeQuestionModel.text;\n }\n },\n correctAnswer: {\n get: function get() {\n return _correctAnswer;\n },\n set: function set(correctAnswer) {\n _correctAnswer = correctAnswer;\n }\n },\n answers: {\n get: function get() {\n return tscmeQuestionModel.answers;\n }\n },\n feedback: {\n get: function get() {\n return tscmeQuestionModel.feedback;\n }\n },\n isGraded: {\n get: function get() {\n return _isGraded;\n },\n set: function set(isGraded) {\n _isGraded = isGraded;\n }\n },\n userResponse: {\n get: function get() {\n return _userResponse;\n },\n set: function set(userResponse) {\n if (_responseLocked) {\n return;\n }\n _userResponse = userResponse;\n }\n },\n isResponseCorrect: {\n get: function get() {\n return _isResponseCorrect;\n },\n set: function set(isResponseCorrect) {\n _isResponseCorrect = isResponseCorrect;\n }\n },\n attemptDuration: {\n get: function get() {\n return _attemptDuration;\n },\n set: function set(attemptDuration) {\n if (_responseLocked) {\n return;\n }\n _attemptDuration = attemptDuration;\n }\n },\n responseLocked: {\n get: function get() {\n return _responseLocked;\n },\n set: function set(responseLocked) {\n _responseLocked = responseLocked;\n }\n },\n feedbackActionExecuted: {\n get: function get() {\n return _feedbackActionExecuted;\n },\n set: function set(feedbackActionExecuted) {\n _feedbackActionExecuted = feedbackActionExecuted;\n }\n }\n });\n};\nvar Question$1 = {\n /**\n * Factory method that returns a new Question object.\n * @function create\n * @memberof TSC.Question\n * @param {tscme.Question} tscmeQuestionModel - Question model from Media-Extensions-js\n * @static\n * @return new Question instance\n */\n create: Question\n};\n\n/**\n * @memberof TSC\n * @class QuestionSet\n * @classdesc Question Set Model\n * @param {tscme.QuestionSet} tscmeQuestionSetModel - Question set model from Media-Extensions-js\n * @param {Number} orderId - Order id of the question set. Should be a number above 0.\n */\nvar QuestionSet = function QuestionSet(tscmeQuestionSetModel, orderId) {\n var _questions = [];\n var _orderId = orderId;\n var _percentOfVideoSegmentWatched = 0;\n var _numberGradedQuestions = 0;\n var _numberUngradedQuestions = 0;\n var createQuestionModels = function createQuestionModels() {\n tscmeQuestionSetModel.questions.forEach(function (tscmeQuestion) {\n _questions.push(Question$1.create(tscmeQuestion));\n });\n };\n var cacheQuestionDetails = function cacheQuestionDetails() {\n _numberGradedQuestions = 0;\n _numberUngradedQuestions = 0;\n _questions.forEach(function (question) {\n if (question.isGraded) {\n _numberGradedQuestions++;\n } else {\n _numberUngradedQuestions++;\n }\n });\n };\n var toJSON = function toJSON() {\n return {\n name: tscmeQuestionSetModel.name,\n mediaTimePosition: tscmeQuestionSetModel.startTime,\n order: _orderId,\n questions: _questions.map(function (question) {\n return question.toJSON();\n })\n };\n };\n var getSnapShot = function getSnapShot() {\n return {\n n: tscmeQuestionSetModel.name,\n vsw: _percentOfVideoSegmentWatched,\n q: _questions.map(function (question) {\n return question.getSnapShot();\n })\n };\n };\n var populateQuestionSet = function populateQuestionSet(questionSetSnapShot) {\n if (tscmeQuestionSetModel.name === questionSetSnapShot.n) {\n _percentOfVideoSegmentWatched = questionSetSnapShot.vsw;\n questionSetSnapShot.q.forEach(function (questionSnapShot) {\n for (var i = 0; i < _questions.length; i++) {\n if (_questions[i].id === questionSnapShot.id) {\n _questions[i].populateQuestion(questionSnapShot);\n }\n }\n });\n }\n };\n var getQuizServiceData = function getQuizServiceData(quizId) {\n var questionSetData = {};\n questionSetData.quizId = quizId;\n questionSetData.order = _orderId;\n questionSetData.questions = _questions.filter(function (question) {\n return question.responseLocked;\n }).map(function (question) {\n return question.getQuizServiceData(_percentOfVideoSegmentWatched);\n });\n return JSON.stringify(questionSetData);\n };\n createQuestionModels();\n cacheQuestionDetails();\n return Object.defineProperties({\n toJSON: toJSON,\n getSnapShot: getSnapShot,\n populateQuestionSet: populateQuestionSet,\n getQuizServiceData: getQuizServiceData,\n cacheQuestionDetails: cacheQuestionDetails\n }, {\n name: {\n get: function get() {\n return tscmeQuestionSetModel.name;\n }\n },\n displayFeedback: {\n get: function get() {\n return tscmeQuestionSetModel.feedback;\n }\n },\n startTime: {\n get: function get() {\n return tscmeQuestionSetModel.startTime;\n }\n },\n questions: {\n get: function get() {\n return _questions;\n }\n },\n inProgress: {\n get: function get() {\n return _questions.some(function (question) {\n return question.responseLocked;\n });\n }\n },\n completed: {\n get: function get() {\n return _questions.every(function (question) {\n return question.responseLocked;\n });\n }\n },\n percentOfVideoSegmentWatched: {\n get: function get() {\n return _percentOfVideoSegmentWatched;\n },\n set: function set(percentOfVideoSegmentWatched) {\n _percentOfVideoSegmentWatched = percentOfVideoSegmentWatched;\n }\n },\n numberGradedQuestions: {\n get: function get() {\n return _numberGradedQuestions;\n }\n },\n numberUngradedQuestions: {\n get: function get() {\n return _numberUngradedQuestions;\n }\n },\n numberCorrectQuestions: {\n get: function get() {\n var correctQuestions = _questions.filter(function (question) {\n return question.isGraded && question.isResponseCorrect;\n });\n return correctQuestions.length;\n }\n },\n usesRationale: {\n get: function get() {\n return _questions.some(function (question) {\n return question.feedback.length > 0;\n });\n }\n }\n });\n};\nvar QuestionSet$1 = {\n /**\n * Factory method that returns a new QuestionSet object.\n * @function create\n * @memberof TSC.QuestionSet\n * @param {tscme.QuestionSet} tscmeQuestionSetModel - Question set model from Media-Extensions-js\n * @param {Number} orderId - Order id of the question set. Should be a number above 0.\n * @static\n * @return new QuestionSet instance\n */\n create: QuestionSet\n};\n\nvar MIN_MARKER_TIME_DIFF = 2000;\n\n/**\n * @memberof TSC\n * @class Quiz\n * @classdesc Quiz Model\n * @param {TSC.Xmp} xmpModel - Xmp Model\n */\nvar Quiz = function Quiz(xmpModel) {\n var _productionName;\n var _originId;\n var _projectName;\n var _quizTitle;\n var _quizId;\n var _quizInstanceId;\n var _authoredEmail;\n var _clientId;\n var _quizHash;\n var _reportMethod = reportType.NONE;\n var _requireUserId = true;\n var _hideReplay = false;\n var _questionSets = [];\n var _questionSetMarkers = [];\n var _mediaDuration = 0;\n var _locale = '';\n var _allowSkipQuiz = true;\n var createQuizDefinition = function createQuizDefinition() {\n var quizDef = {};\n quizDef.quizId = _quizId;\n quizDef.lang = _locale;\n quizDef.projectName = _projectName;\n quizDef.productionName = _productionName;\n quizDef.originId = _originId;\n quizDef.mediaDuration = _mediaDuration;\n quizDef.reportRecipients = [_authoredEmail];\n quizDef.questionSets = [];\n _questionSets.forEach(function (questionSet) {\n quizDef.questionSets.push(questionSet.toJSON());\n });\n return window.JSON.stringify(quizDef);\n };\n var setAllowSkipQuiz = function setAllowSkipQuiz(allowSkipQuiz) {\n _allowSkipQuiz = !(allowSkipQuiz === '0' || allowSkipQuiz === false);\n };\n var setReportMethod = function setReportMethod(method) {\n if (reportType.isValid(method)) {\n _reportMethod = method;\n }\n };\n var getApiDataForQuestionSet = function getApiDataForQuestionSet(questionSetIndex) {\n if (questionSetIndex < 0 || questionSetIndex >= _questionSets.length) {\n return;\n }\n return _questionSets[questionSetIndex].getQuizServiceData(_quizId);\n };\n var createQuestionSetMarkers = function createQuestionSetMarkers() {\n _questionSetMarkers = [];\n _questionSets.forEach(function (questionSet, index) {\n _questionSetMarkers.push(QuestionSetMarker$1.create(index, questionSet));\n });\n };\n var processXmp = function processXmp() {\n _productionName = xmpModel.title;\n _originId = xmpModel.originId;\n _projectName = xmpModel.project;\n _locale = xmpModel.quizLocale;\n _quizTitle = xmpModel.title;\n _quizId = xmpModel.quizGuid;\n _requireUserId = xmpModel.quizRequireUserId;\n _hideReplay = xmpModel.quizHideReplay;\n _authoredEmail = xmpModel.quizAuthoredEmail;\n _clientId = xmpModel.quizClientId;\n _quizHash = xmpModel.quizHash;\n _mediaDuration = xmpModel.mediaDuration;\n setReportMethod(xmpModel.quizReportMethod);\n setAllowSkipQuiz(xmpModel.quizAllowSkipQuiz);\n xmpModel.quizQuestionSetArray.forEach(function (tscmeQuestionSet, index) {\n _questionSets.push(QuestionSet$1.create(tscmeQuestionSet, index + 1));\n });\n };\n var getScormScore = function getScormScore() {\n var scormScore = 0;\n var totalGradableQuestions = 0;\n var totalCorrectQuestions = 0;\n _questionSets.forEach(function (questionSet) {\n totalGradableQuestions += questionSet.numberGradedQuestions;\n totalCorrectQuestions += questionSet.numberCorrectQuestions;\n });\n if (totalGradableQuestions !== 0) {\n scormScore = totalCorrectQuestions / totalGradableQuestions * 100;\n }\n return scormScore;\n };\n var isLastQuestionComplete = function isLastQuestionComplete(considerQuestionSetCompleteId) {\n if (considerQuestionSetCompleteId === undefined) {\n considerQuestionSetCompleteId = -1;\n }\n return _questionSets.every(function (questionSet, index) {\n return questionSet.numberGradedQuestions === 0 || questionSet.completed || index === considerQuestionSetCompleteId;\n });\n };\n var getPreviousMarkerTimeForMarker = function getPreviousMarkerTimeForMarker(questionSetIndex) {\n var markerTime = 0;\n var timeDiff;\n if (questionSetIndex > 0) {\n if (questionSetIndex >= _questionSets.length) {\n markerTime = _questionSets[_questionSets.length - 1].startTime;\n } else {\n for (var i = questionSetIndex - 1; i >= 0; i--) {\n if (!_questionSets[i].completed) {\n continue;\n }\n timeDiff = _questionSets[questionSetIndex].startTime - _questionSets[i].startTime;\n if (timeDiff >= MIN_MARKER_TIME_DIFF) {\n markerTime = _questionSets[i].startTime;\n break;\n }\n }\n }\n }\n return markerTime;\n };\n var getSnapShot = function getSnapShot() {\n return {\n qs: _questionSets.map(function (questionSet) {\n return questionSet.getSnapShot();\n })\n };\n };\n var populateQuiz = function populateQuiz(quizModelSnapshot) {\n quizModelSnapshot.qs.forEach(function (questionSetSnapshot) {\n for (var i = 0; i < _questionSets.length; i++) {\n if (_questionSets[i].name === questionSetSnapshot.n) {\n _questionSets[i].populateQuestionSet(questionSetSnapshot);\n }\n }\n });\n };\n processXmp();\n createQuestionSetMarkers();\n return Object.defineProperties({\n getApiDataForQuestionSet: getApiDataForQuestionSet,\n getScormScore: getScormScore,\n isLastQuestionComplete: isLastQuestionComplete,\n getPreviousMarkerTimeForMarker: getPreviousMarkerTimeForMarker,\n getSnapShot: getSnapShot,\n populateQuiz: populateQuiz\n }, {\n quizDefinition: {\n get: function get() {\n return createQuizDefinition();\n }\n },\n useQuizApi: {\n get: function get() {\n return _reportMethod === reportType.API || _reportMethod === reportType.APIANDSCORM;\n }\n },\n useScorm: {\n get: function get() {\n return _reportMethod === reportType.SCORM || _reportMethod === reportType.APIANDSCORM;\n }\n },\n quizTitle: {\n get: function get() {\n return _quizTitle;\n }\n },\n quizID: {\n get: function get() {\n return _quizId;\n }\n },\n quizInstanceID: {\n set: function set(quizInstanceId) {\n _quizInstanceId = quizInstanceId;\n },\n get: function get() {\n return _quizInstanceId;\n }\n },\n authoredEmail: {\n get: function get() {\n return _authoredEmail;\n }\n },\n clientId: {\n get: function get() {\n return _clientId;\n }\n },\n quizHash: {\n get: function get() {\n return _quizHash;\n }\n },\n mediaDuration: {\n get: function get() {\n return _mediaDuration;\n }\n },\n reportMethod: {\n set: setReportMethod,\n get: function get() {\n return _reportMethod;\n }\n },\n requireUserId: {\n get: function get() {\n return _requireUserId;\n }\n },\n hideReplay: {\n get: function get() {\n return _hideReplay;\n }\n },\n allowSkipQuiz: {\n get: function get() {\n return _allowSkipQuiz;\n }\n },\n locale: {\n get: function get() {\n return _locale;\n }\n },\n questionSetMarkerTimes: {\n get: function get() {\n return _questionSetMarkers;\n }\n },\n numberQuestionSets: {\n get: function get() {\n return _questionSets.length;\n }\n },\n questionSets: {\n get: function get() {\n return _questionSets;\n }\n },\n minMarkerTimeDiff: {\n get: function get() {\n return MIN_MARKER_TIME_DIFF;\n }\n },\n totalNumberOfGradedQuestionSets: {\n get: function get() {\n var totalGradableQuestionSets = 0;\n _questionSets.forEach(function (questionSet) {\n if (questionSet.numberGradedQuestions > 0) {\n totalGradableQuestionSets++;\n }\n });\n return totalGradableQuestionSets;\n }\n }\n });\n};\nvar Quiz$1 = {\n /**\n * Factory method that returns a new Quiz object.\n * @function create\n * @memberof TSC.Quiz\n * @param {TSC.Xmp} xmpModel - Xmp Model\n * @static\n * @return new Quiz instance\n */\n create: Quiz\n};\n\n/**\n * @memberof TSC\n * @class urlService\n * @classdesc Url opening service.\n */\nvar ensureUrlHasValidScheme = function ensureUrlHasValidScheme(url) {\n if (typeof url === 'string' && url.indexOf('http://') !== 0 && url.indexOf('https://') !== 0) {\n url = 'http://' + url;\n }\n return url;\n};\nvar openUrl = function openUrl(url, features) {\n url = ensureUrlHasValidScheme(url);\n if (features) {\n windowWrapper.open(url, features);\n } else {\n windowWrapper.open(url);\n }\n};\nvar isUrlAbsolute = function isUrlAbsolute(url) {\n return url.indexOf('http://') === 0 || url.indexOf('https://') === 0;\n};\nvar generateQueryStringWithExtraParam = function generateQueryStringWithExtraParam(key, value) {\n key = encodeURI(key);\n value = encodeURI(value);\n var windowLocation = windowWrapper.getLocation();\n var kvp = windowLocation.search.substr(1).split('&');\n var i = kvp.length;\n var x;\n while (i--) {\n x = kvp[i].split('=');\n if (x[0] === key) {\n x[1] = value;\n kvp[i] = x.join('=');\n break;\n }\n }\n if (i < 0) {\n kvp[kvp.length] = [key, value].join('=');\n }\n var query = kvp.join('&');\n if (query.indexOf('&') === 0) {\n query = query.substr(1);\n }\n return '?' + query;\n};\nvar generateCurrentUrlWithExtraQueryParam = function generateCurrentUrlWithExtraQueryParam(paramName, paramValue) {\n var search = generateQueryStringWithExtraParam(paramName, paramValue);\n var windowLocation = windowWrapper.getLocation();\n var port = windowLocation.port ? ':' + windowLocation.port : '';\n return windowLocation.protocol + '//' + windowLocation.hostname + port + windowLocation.pathname + search + windowLocation.hash;\n};\nvar convertUrlTime = function convertUrlTime(val) {\n if (isNaN(val)) {\n var hrs = 0;\n var min = 0;\n var sec = 0;\n var strTime = val.toLowerCase();\n // Regex patterns ----------------------------------------------------\n var hrsPattern = new RegExp('(\\\\d+[\\h])', 'g'); //( 999h )\n var minPattern = new RegExp('(\\\\d+[\\m])', 'g'); //( 999m )\n var secPattern = new RegExp('(\\\\d+[\\s])', 'g'); //( 999s )\n var numPattern = new RegExp('\\\\d+', 'g'); // * numerals\n // Match regex Tests -------------------------------------------------\n var hrsTest = strTime.match(hrsPattern);\n var minTest = strTime.match(minPattern);\n var secTest = strTime.match(secPattern);\n var numTest = strTime.match(numPattern);\n if (secTest || minTest || hrsTest) {\n // assumes we want the 1st pattern encountered in each array is\n // the time we want to use.\n\n if (hrsTest) {\n // 3600 seconds in 1 hour\n hrs = Number(hrsTest[0].split('h').join('')) * 60 * 60;\n }\n if (minTest) {\n // 60 seconds in 1 minute\n min = Number(minTest[0].split('m').join('')) * 60;\n }\n if (secTest) {\n // 1 seconds = 1 second\n sec = Number(secTest[0].split('s').join(''));\n }\n // return the Time in seconds\n return Number(hrs + min + sec);\n } else if (numTest) {\n sec = Number(numTest[0]);\n // return the Time assuming seconds\n return sec;\n }\n // not valid time or all non-numeric characters\n return 0;\n }\n if (val < 0) {\n val = 0;\n }\n return val;\n};\nvar urlService = {\n openUrl: openUrl,\n isUrlAbsolute: isUrlAbsolute,\n generateCurrentUrlWithExtraQueryParam: generateCurrentUrlWithExtraQueryParam,\n convertUrlTime: convertUrlTime\n};\n\n// This file is autogenerated. It's used to publish ESM to npm.\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\n\n// https://github.com/bgrins/TinyColor\n// Brian Grinstead, MIT License\n\nvar trimLeft = /^\\s+/;\nvar trimRight = /\\s+$/;\nfunction tinycolor(color, opts) {\n color = color ? color : \"\";\n opts = opts || {};\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n var rgb = inputToRGB(color);\n this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = Math.round(100 * this._a) / 100, this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this._r < 1) this._r = Math.round(this._r);\n if (this._g < 1) this._g = Math.round(this._g);\n if (this._b < 1) this._b = Math.round(this._b);\n this._ok = rgb.ok;\n}\ntinycolor.prototype = {\n isDark: function isDark() {\n return this.getBrightness() < 128;\n },\n isLight: function isLight() {\n return !this.isDark();\n },\n isValid: function isValid() {\n return this._ok;\n },\n getOriginalInput: function getOriginalInput() {\n return this._originalInput;\n },\n getFormat: function getFormat() {\n return this._format;\n },\n getAlpha: function getAlpha() {\n return this._a;\n },\n getBrightness: function getBrightness() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function getLuminance() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r / 255;\n GsRGB = rgb.g / 255;\n BsRGB = rgb.b / 255;\n if (RsRGB <= 0.03928) R = RsRGB / 12.92;else R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n if (GsRGB <= 0.03928) G = GsRGB / 12.92;else G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n if (BsRGB <= 0.03928) B = BsRGB / 12.92;else B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n },\n setAlpha: function setAlpha(value) {\n this._a = boundAlpha(value);\n this._roundA = Math.round(100 * this._a) / 100;\n return this;\n },\n toHsv: function toHsv() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return {\n h: hsv.h * 360,\n s: hsv.s,\n v: hsv.v,\n a: this._a\n };\n },\n toHsvString: function toHsvString() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = Math.round(hsv.h * 360),\n s = Math.round(hsv.s * 100),\n v = Math.round(hsv.v * 100);\n return this._a == 1 ? \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" : \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \" + this._roundA + \")\";\n },\n toHsl: function toHsl() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return {\n h: hsl.h * 360,\n s: hsl.s,\n l: hsl.l,\n a: this._a\n };\n },\n toHslString: function toHslString() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = Math.round(hsl.h * 360),\n s = Math.round(hsl.s * 100),\n l = Math.round(hsl.l * 100);\n return this._a == 1 ? \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" : \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \" + this._roundA + \")\";\n },\n toHex: function toHex(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function toHexString(allow3Char) {\n return \"#\" + this.toHex(allow3Char);\n },\n toHex8: function toHex8(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function toHex8String(allow4Char) {\n return \"#\" + this.toHex8(allow4Char);\n },\n toRgb: function toRgb() {\n return {\n r: Math.round(this._r),\n g: Math.round(this._g),\n b: Math.round(this._b),\n a: this._a\n };\n },\n toRgbString: function toRgbString() {\n return this._a == 1 ? \"rgb(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \")\" : \"rgba(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \", \" + this._roundA + \")\";\n },\n toPercentageRgb: function toPercentageRgb() {\n return {\n r: Math.round(bound01(this._r, 255) * 100) + \"%\",\n g: Math.round(bound01(this._g, 255) * 100) + \"%\",\n b: Math.round(bound01(this._b, 255) * 100) + \"%\",\n a: this._a\n };\n },\n toPercentageRgbString: function toPercentageRgbString() {\n return this._a == 1 ? \"rgb(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%)\" : \"rgba(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n },\n toName: function toName() {\n if (this._a === 0) {\n return \"transparent\";\n }\n if (this._a < 1) {\n return false;\n }\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function toFilter(secondColor) {\n var hex8String = \"#\" + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = \"#\" + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n return \"progid:DXImageTransform.Microsoft.gradient(\" + gradientType + \"startColorstr=\" + hex8String + \",endColorstr=\" + secondHex8String + \")\";\n },\n toString: function toString(format) {\n var formatSet = !!format;\n format = format || this._format;\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === \"name\" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === \"rgb\") {\n formattedString = this.toRgbString();\n }\n if (format === \"prgb\") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === \"hex\" || format === \"hex6\") {\n formattedString = this.toHexString();\n }\n if (format === \"hex3\") {\n formattedString = this.toHexString(true);\n }\n if (format === \"hex4\") {\n formattedString = this.toHex8String(true);\n }\n if (format === \"hex8\") {\n formattedString = this.toHex8String();\n }\n if (format === \"name\") {\n formattedString = this.toName();\n }\n if (format === \"hsl\") {\n formattedString = this.toHslString();\n }\n if (format === \"hsv\") {\n formattedString = this.toHsvString();\n }\n return formattedString || this.toHexString();\n },\n clone: function clone() {\n return tinycolor(this.toString());\n },\n _applyModification: function _applyModification(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function lighten() {\n return this._applyModification(_lighten, arguments);\n },\n brighten: function brighten() {\n return this._applyModification(_brighten, arguments);\n },\n darken: function darken() {\n return this._applyModification(_darken, arguments);\n },\n desaturate: function desaturate() {\n return this._applyModification(_desaturate, arguments);\n },\n saturate: function saturate() {\n return this._applyModification(_saturate, arguments);\n },\n greyscale: function greyscale() {\n return this._applyModification(_greyscale, arguments);\n },\n spin: function spin() {\n return this._applyModification(_spin, arguments);\n },\n _applyCombination: function _applyCombination(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function analogous() {\n return this._applyCombination(_analogous, arguments);\n },\n complement: function complement() {\n return this._applyCombination(_complement, arguments);\n },\n monochromatic: function monochromatic() {\n return this._applyCombination(_monochromatic, arguments);\n },\n splitcomplement: function splitcomplement() {\n return this._applyCombination(_splitcomplement, arguments);\n },\n // Disabled until https://github.com/bgrins/TinyColor/issues/254\n // polyad: function (number) {\n // return this._applyCombination(polyad, [number]);\n // },\n triad: function triad() {\n return this._applyCombination(polyad, [3]);\n },\n tetrad: function tetrad() {\n return this._applyCombination(polyad, [4]);\n }\n};\n\n// If input is an object, force 1 into \"1.0\" to handle ratios properly\n// String input requires \"1.0\" as input, so 1 will be treated as 1\ntinycolor.fromRatio = function (color, opts) {\n if (_typeof(color) == \"object\") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === \"a\") {\n newColor[i] = color[i];\n } else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n return tinycolor(color, opts);\n};\n\n// Given a string or object, convert that input to RGB\n// Possible string inputs:\n//\n// \"red\"\n// \"#f00\" or \"f00\"\n// \"#ff0000\" or \"ff0000\"\n// \"#ff000000\" or \"ff000000\"\n// \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n// \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n// \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n// \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n// \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n// \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n// \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n//\nfunction inputToRGB(color) {\n var rgb = {\n r: 0,\n g: 0,\n b: 0\n };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color == \"string\") {\n color = stringInputToObject(color);\n }\n if (_typeof(color) == \"object\") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = \"hsv\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = \"hsl\";\n }\n if (color.hasOwnProperty(\"a\")) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a: a\n };\n}\n\n// Conversion Functions\n// --------------------\n\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n\n// `rgbToRgb`\n// Handle bounds / percentage checking to conform to CSS color spec\n// <http://www.w3.org/TR/css3-color/>\n// *Assumes:* r, g, b in [0, 255] or [0, 1]\n// *Returns:* { r, g, b } in [0, 255]\nfunction rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n}\n\n// `rgbToHsl`\n// Converts an RGB color value to HSL.\n// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n// *Returns:* { h, s, l } in [0,1]\nfunction rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n l = (max + min) / 2;\n if (max == min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n l: l\n };\n}\n\n// `hslToRgb`\n// Converts an HSL color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hslToRgb(h, s, l) {\n var r, g, b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n}\n\n// `rgbToHsv`\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nfunction rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n v = max;\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n v: v\n };\n}\n\n// `hsvToRgb`\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n}\n\n// `rgbToHex`\n// Converts an RGB color to hex\n// Assumes r, g, and b are contained in the set [0, 255]\n// Returns a 3 or 6 character hex\nfunction rgbToHex(r, g, b, allow3Char) {\n var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join(\"\");\n}\n\n// `rgbaToHex`\n// Converts an RGBA color plus alpha transparency to hex\n// Assumes r, g, b are contained in the set [0, 255] and\n// a in [0, 1]. Returns a 4 or 8 character rgba hex\nfunction rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)), pad2(convertDecimalToHex(a))];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join(\"\");\n}\n\n// `rgbaToArgbHex`\n// Converts an RGBA color to an ARGB Hex8 string\n// Rarely used, but required for \"toFilter()\"\nfunction rgbaToArgbHex(r, g, b, a) {\n var hex = [pad2(convertDecimalToHex(a)), pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n return hex.join(\"\");\n}\n\n// `equals`\n// Can be called with any tinycolor input\ntinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) return false;\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n};\ntinycolor.random = function () {\n return tinycolor.fromRatio({\n r: Math.random(),\n g: Math.random(),\n b: Math.random()\n });\n};\n\n// Modification Functions\n// ----------------------\n// Thanks to less.js for some of the basics here\n// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>\n\nfunction _desaturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\nfunction _saturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\nfunction _greyscale(color) {\n return tinycolor(color).desaturate(100);\n}\nfunction _lighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\nfunction _brighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var rgb = tinycolor(color).toRgb();\n rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));\n rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));\n rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));\n return tinycolor(rgb);\n}\nfunction _darken(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\n// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n// Values outside of this range will be wrapped into this range.\nfunction _spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n}\n\n// Combination Functions\n// ---------------------\n// Thanks to jQuery xColor for some of the ideas behind these\n// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>\n\nfunction _complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n}\nfunction polyad(color, number) {\n if (isNaN(number) || number <= 0) {\n throw new Error(\"Argument to polyad must be a positive number\");\n }\n var hsl = tinycolor(color).toHsl();\n var result = [tinycolor(color)];\n var step = 360 / number;\n for (var i = 1; i < number; i++) {\n result.push(tinycolor({\n h: (hsl.h + i * step) % 360,\n s: hsl.s,\n l: hsl.l\n }));\n }\n return result;\n}\nfunction _splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({\n h: (h + 72) % 360,\n s: hsl.s,\n l: hsl.l\n }), tinycolor({\n h: (h + 216) % 360,\n s: hsl.s,\n l: hsl.l\n })];\n}\nfunction _analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n}\nfunction _monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h,\n s = hsv.s,\n v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n while (results--) {\n ret.push(tinycolor({\n h: h,\n s: s,\n v: v\n }));\n v = (v + modification) % 1;\n }\n return ret;\n}\n\n// Utility Functions\n// ---------------------\n\ntinycolor.mix = function (color1, color2, amount) {\n amount = amount === 0 ? 0 : amount || 50;\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n var p = amount / 100;\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a\n };\n return tinycolor(rgba);\n};\n\n// Readability Functions\n// ---------------------\n// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)\n\n// `contrast`\n// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)\ntinycolor.readability = function (color1, color2) {\n var c1 = tinycolor(color1);\n var c2 = tinycolor(color2);\n return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);\n};\n\n// `isReadable`\n// Ensure that foreground and background color combinations meet WCAG2 guidelines.\n// The third argument is an optional Object.\n// the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';\n// the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.\n// If the entire object is absent, isReadable defaults to {level:\"AA\",size:\"small\"}.\n\n// *Example*\n// tinycolor.isReadable(\"#000\", \"#111\") => false\n// tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\ntinycolor.isReadable = function (color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n out = false;\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case \"AAsmall\":\n case \"AAAlarge\":\n out = readability >= 4.5;\n break;\n case \"AAlarge\":\n out = readability >= 3;\n break;\n case \"AAAsmall\":\n out = readability >= 7;\n break;\n }\n return out;\n};\n\n// `mostReadable`\n// Given a base color and a list of possible foreground or background\n// colors for that base, returns the most readable color.\n// Optionally returns Black or White if the most readable color is unreadable.\n// *Example*\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString(); // \"#ffffff\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\ntinycolor.mostReadable = function (baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors;\n level = args.level;\n size = args.size;\n for (var i = 0; i < colorList.length; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n if (tinycolor.isReadable(baseColor, bestColor, {\n level: level,\n size: size\n }) || !includeFallbackColors) {\n return bestColor;\n } else {\n args.includeFallbackColors = false;\n return tinycolor.mostReadable(baseColor, [\"#fff\", \"#000\"], args);\n }\n};\n\n// Big List of Colors\n// ------------------\n// <https://www.w3.org/TR/css-color-4/#named-colors>\nvar names = tinycolor.names = {\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"0ff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000\",\n blanchedalmond: \"ffebcd\",\n blue: \"00f\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n burntsienna: \"ea7e5d\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"0ff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"f0f\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"789\",\n lightslategrey: \"789\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"0f0\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"f0f\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"f00\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"fff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ff0\",\n yellowgreen: \"9acd32\"\n};\n\n// Make it easy to access colors via `hexNames[hex]`\nvar hexNames = tinycolor.hexNames = flip(names);\n\n// Utilities\n// ---------\n\n// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\nfunction flip(o) {\n var flipped = {};\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n}\n\n// Return a valid alpha value [0,1] with all invalid values being set to 1\nfunction boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n\n// Take input from [0, n] and return it as [0, 1]\nfunction bound01(n, max) {\n if (isOnePointZero(n)) n = \"100%\";\n var processPercent = isPercentage(n);\n n = Math.min(max, Math.max(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return n % max / parseFloat(max);\n}\n\n// Force a number between 0 and 1\nfunction clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n\n// Parse a base-16 hex value into a base-10 integer\nfunction parseIntFromHex(val) {\n return parseInt(val, 16);\n}\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\nfunction isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf(\".\") != -1 && parseFloat(n) === 1;\n}\n\n// Check to see if string passed in is a percentage\nfunction isPercentage(n) {\n return typeof n === \"string\" && n.indexOf(\"%\") != -1;\n}\n\n// Force a hex value to have 2 characters\nfunction pad2(c) {\n return c.length == 1 ? \"0\" + c : \"\" + c;\n}\n\n// Replace a decimal with it's percentage value\nfunction convertToPercentage(n) {\n if (n <= 1) {\n n = n * 100 + \"%\";\n }\n return n;\n}\n\n// Converts a decimal to a hex value\nfunction convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n// Converts a hex value to a decimal\nfunction convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\nvar matchers = function () {\n // <http://www.w3.org/TR/css3-values/#integers>\n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // <http://www.w3.org/TR/css3-values/#number-value>\n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n}();\n\n// `isValidCSSUnit`\n// Take in a single string / number and check to see if it looks like a CSS unit\n// (see `matchers` above for definition).\nfunction isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n}\n\n// `stringInputToObject`\n// Permissive string parsing. Take in a number of formats, and output an object\n// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\nfunction stringInputToObject(color) {\n color = color.replace(trimLeft, \"\").replace(trimRight, \"\").toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n } else if (color == \"transparent\") {\n return {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n format: \"name\"\n };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if (match = matchers.rgb.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3]\n };\n }\n if (match = matchers.rgba.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsl.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3]\n };\n }\n if (match = matchers.hsla.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsv.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3]\n };\n }\n if (match = matchers.hsva.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hex8.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex6.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n if (match = matchers.hex4.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + \"\" + match[1]),\n g: parseIntFromHex(match[2] + \"\" + match[2]),\n b: parseIntFromHex(match[3] + \"\" + match[3]),\n a: convertHexToDecimal(match[4] + \"\" + match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex3.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + \"\" + match[1]),\n g: parseIntFromHex(match[2] + \"\" + match[2]),\n b: parseIntFromHex(match[3] + \"\" + match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n return false;\n}\nfunction validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n var level, size;\n parms = parms || {\n level: \"AA\",\n size: \"small\"\n };\n level = (parms.level || \"AA\").toUpperCase();\n size = (parms.size || \"small\").toLowerCase();\n if (level !== \"AA\" && level !== \"AAA\") {\n level = \"AA\";\n }\n if (size !== \"small\" && size !== \"large\") {\n size = \"small\";\n }\n return {\n level: level,\n size: size\n };\n}\n\nvar BASE_FONT_SIZE_FOR_1080P_VIDEO = 48;\nvar BASE_VIDEO_WIDTH = 1920;\nvar BASE_VIDEO_HEIGHT = 1080;\nvar ROUNDING_MODIFIER = 0.5;\nvar _defaultTextColorObject = Object.freeze(tinycolor({\n r: 255,\n g: 255,\n b: 255,\n a: 1.0\n}));\nvar _defaultBgColorObject = Object.freeze(tinycolor({\n r: 0,\n g: 0,\n b: 0,\n a: 0.9\n}));\nvar _defaults = Object.freeze({\n captionFontFamily: 'Arial, Helvetica, sans-serif;',\n captionFontSize: 24,\n captionFontSizeMin: 12,\n captionFontSizeMax: 144,\n captionTextColor: _defaultTextColorObject,\n captionBgColor: _defaultBgColorObject,\n captionPosition: 'overlay',\n captionBarHeight: 0\n});\n\n/**\n * @memberof TSC\n * @class CaptionService\n * @classdesc The caption service\n */\nvar CaptionService = function CaptionService() {\n var _position = _defaults.captionPosition;\n var _barHeight = _defaults.captionBarHeight;\n var _font = _defaults.captionFontFamily;\n var _fontSize = _defaults.captionFontSize;\n var _fontSizeForPlayerDimensions = _defaults.captionFontSize;\n var _fontSizeMin = _defaults.captionFontSizeMin;\n var _fontSizeMax = _defaults.captionFontSizeMax;\n var _textColor = _defaults.captionTextColor.clone();\n var _backgroundColor = _defaults.captionBgColor.clone();\n var _captionController = CaptionController$1$1.create();\n var _eventHandlers = {};\n var setupSupportedEvents = function setupSupportedEvents() {\n _eventHandlers[events.CaptionService.NewCaptionTrack] = [];\n };\n var setFontSize = function setFontSize(value) {\n _fontSize = Math.min(Math.max(value, _fontSizeMin), _fontSizeMax);\n };\n var initFromXmp = function initFromXmp(xmp) {\n _position = xmp.captionPosition;\n _barHeight = xmp.captionBarHeight;\n _font = xmp.captionFontFamily;\n _fontSize = xmp.captionFontSize;\n _fontSizeMin = xmp.minCaptionFontSize;\n _fontSizeMax = xmp.maxCaptionFontSize;\n _textColor = tinycolor(xmp.captionTextColor);\n _backgroundColor = tinycolor(xmp.captionBg);\n _captionController = xmp.captionController;\n };\n var initDefaults = function initDefaults() {\n _position = _defaults.captionPosition;\n _barHeight = _defaults.captionBarHeight;\n _font = _defaults.captionFontFamily;\n _fontSize = _defaults.captionFontSize;\n _fontSizeForPlayerDimensions = _defaults.captionFontSize;\n _fontSizeMin = _defaults.captionFontSizeMin;\n _fontSizeMax = _defaults.captionFontSizeMax;\n _textColor = _defaults.captionTextColor.clone();\n _backgroundColor = _defaults.captionBgColor.clone();\n };\n var setFontSizeForPlayerDimensions = function setFontSizeForPlayerDimensions(playerWidth, playerHeight) {\n var scaleX = playerWidth / BASE_VIDEO_WIDTH;\n var scaleY = playerHeight / BASE_VIDEO_HEIGHT;\n _fontSizeForPlayerDimensions = Math.floor(BASE_FONT_SIZE_FOR_1080P_VIDEO * Math.min(scaleX, scaleY) + ROUNDING_MODIFIER);\n };\n var dispatchEvent = function dispatchEvent(eventName) {\n if (_eventHandlers[eventName]) {\n _eventHandlers[eventName].forEach(function (eventCallback) {\n eventCallback();\n });\n }\n };\n var addEventListener = function addEventListener(eventName, eventHandler) {\n if (!_eventHandlers[eventName]) {\n return;\n }\n _eventHandlers[eventName].push(eventHandler);\n };\n var removeEventListener = function removeEventListener(eventName, eventHandler) {\n if (!_eventHandlers[eventName]) {\n return;\n }\n var eventEntry = _eventHandlers[eventName];\n for (var i = 0; i < eventEntry.length; i++) {\n if (eventEntry[i] === eventHandler) {\n eventEntry.splice(i, 1);\n break;\n }\n }\n };\n var setCaptionTrack = function setCaptionTrack(newCaptionTrack) {\n _captionController.addCaptionTrack(newCaptionTrack);\n _backgroundColor = tinycolor({\n r: _captionController.activeCaptionTrack.bgColor.r,\n g: _captionController.activeCaptionTrack.bgColor.g,\n b: _captionController.activeCaptionTrack.bgColor.b,\n a: _captionController.activeCaptionTrack.bgOpacity\n });\n _textColor = tinycolor({\n r: _captionController.activeCaptionTrack.fgColor.r,\n g: _captionController.activeCaptionTrack.fgColor.g,\n b: _captionController.activeCaptionTrack.fgColor.b\n });\n setFontSize(_captionController.activeCaptionTrack.fontSize);\n _font = _captionController.activeCaptionTrack.fontFamily;\n _barHeight = _captionController.activeCaptionTrack.barHeight;\n _position = _captionController.activeCaptionTrack.position;\n dispatchEvent(events.CaptionService.NewCaptionTrack);\n };\n setupSupportedEvents();\n return Object.defineProperties({\n initFromXmp: initFromXmp,\n initDefaults: initDefaults,\n setFontSizeForPlayerDimensions: setFontSizeForPlayerDimensions,\n addEventListener: addEventListener,\n removeEventListener: removeEventListener\n }, {\n position: {\n get: function get() {\n return _position;\n }\n },\n height: {\n get: function get() {\n return _barHeight;\n }\n },\n font: {\n get: function get() {\n return _font;\n },\n set: function set(value) {\n _font = value;\n }\n },\n fontEnclosedWithQuotes: {\n get: function get() {\n var fontFamilies = _font.split(',');\n var quotedFontFamilies = fontFamilies.map(function (fontFamily) {\n return '\\'' + fontFamily.trim() + '\\'';\n });\n return quotedFontFamilies.join(',');\n }\n },\n fontSize: {\n get: function get() {\n return _fontSize;\n },\n set: setFontSize\n },\n fontSizeForPlayerDimensions: {\n get: function get() {\n return _fontSizeForPlayerDimensions;\n }\n },\n fontSizeMin: {\n get: function get() {\n return _fontSizeMin;\n }\n },\n fontSizeMax: {\n get: function get() {\n return _fontSizeMax;\n }\n },\n textColor: {\n get: function get() {\n return _textColor;\n },\n set: function set(value) {\n _textColor = tinycolor(value);\n }\n },\n backgroundColor: {\n get: function get() {\n return _backgroundColor;\n },\n set: function set(value) {\n _backgroundColor = tinycolor(value);\n }\n },\n backgroundOpacity: {\n get: function get() {\n return _backgroundColor.getAlpha();\n },\n set: function set(value) {\n _backgroundColor.setAlpha(value);\n }\n },\n captionController: {\n get: function get() {\n return _captionController;\n }\n },\n captionTrack: {\n get: function get() {\n return _captionController.activeCaptionTrack;\n },\n set: setCaptionTrack\n },\n hasCaptions: {\n get: function get() {\n return _captionController.containsCaptions;\n }\n }\n });\n};\nvar CaptionService$1 = {\n /**\n * Factory method that returns a new CaptionService object.\n * @function create\n * @memberof TSC.CaptionService\n * @static\n * @return new CaptionService instance\n */\n create: function create() {\n return CaptionService();\n },\n defaults: function defaults() {\n return _defaults;\n }\n};\n\n/**\n * @memberof TSC\n * @class XmpModel\n * @classdesc Xmp model\n */\nvar XmpModel = function XmpModel() {\n var _readyPromiseResolve;\n var _readyPromiseReject;\n var _readyPromise = new Promise$1(function (resolve, reject) {\n _readyPromiseResolve = resolve;\n _readyPromiseReject = reject;\n });\n var _xmpModel = xmp.create('');\n var _maxAttemptTime = 5000;\n var _retryLimit = 2;\n var _timeBetweenRetries = 0;\n var _groupedScreenTextItems = null;\n var _captionDefaults = CaptionService$1.defaults();\n var _xmpAjaxPromise = null;\n var _captionFileAjaxPromiseList = [];\n var loadXmpWithRetry = function loadXmpWithRetry(xmpSrc, retrylimit, crossDomainRequest) {\n _xmpAjaxPromise = $.ajax({\n type: 'GET',\n url: xmpSrc,\n crossDomain: crossDomainRequest,\n dataType: 'text',\n timeout: _maxAttemptTime\n }).done(function (data) {\n if (retrylimit < _retryLimit) {\n log.logMessage('xmp: loadXMP() succeeded after ' + (_retryLimit - retrylimit) + ' failed attempts.');\n }\n _xmpAjaxPromise = null;\n parseXmp(data);\n }).fail(function () {\n _xmpAjaxPromise = null;\n if (retrylimit > 0) {\n setTimeout(function () {\n loadXmpWithRetry(xmpSrc, --retrylimit);\n }, _timeBetweenRetries, crossDomainRequest);\n } else {\n _readyPromiseReject('xmp: loadXMP() failed after ' + _retryLimit + ' retries.');\n }\n });\n };\n var loadXmp = function loadXmp(xmpSrc, crossDomainRequest) {\n loadXmpWithRetry(xmpSrc, _retryLimit, crossDomainRequest);\n };\n var parseXmp = function parseXmp(xmpXml) {\n try {\n _xmpModel = xmp.create(xmpXml);\n _readyPromiseResolve();\n } catch (err) {\n console.warn('Smart Player XMP parsing error - ', err);\n _readyPromiseReject('xmp - failed to parse XMP string');\n }\n };\n var groupScreenTextByStartTime = function groupScreenTextByStartTime() {\n var itemStartTime = null;\n var groupIndex = -1;\n _groupedScreenTextItems = [];\n _xmpModel.screenTextTrack.markers.forEach(function (item) {\n if (item.startTime !== itemStartTime) {\n groupIndex++;\n itemStartTime = item.startTime;\n _groupedScreenTextItems[groupIndex] = {\n startTime: item.startTime,\n file: item.file,\n image: item.image,\n imageRectangle: item.imageRectangle,\n items: []\n };\n }\n _groupedScreenTextItems[groupIndex].items.push(item);\n });\n _groupedScreenTextItems.forEach(function (groupedItem) {\n groupedItem.text = groupedItem.items.map(function (item) {\n return item.name;\n }).reduce(function (previousItemName, currentItemName) {\n return previousItemName + ' ' + currentItemName;\n });\n });\n };\n var loadCaptionFile = function loadCaptionFile(src) {\n var captionAjaxPromise;\n return new Promise$1(function (resolve) {\n captionAjaxPromise = $.ajax({\n type: 'GET',\n url: src,\n dataType: 'text',\n timeout: _maxAttemptTime\n }).done(function (captionData) {\n captionAjaxPromise = null;\n resolve(captionData);\n }).fail(function () {\n console.warn('Failed to load captions file [' + src + ']');\n captionAjaxPromise = null;\n resolve();\n });\n _captionFileAjaxPromiseList.push(captionAjaxPromise);\n });\n };\n var importCaptionsFromFile = function importCaptionsFromFile(captionsSrcList) {\n var loadedCaptionData = {};\n return Promise$1.all(captionsSrcList.map(function (captionSrcItem) {\n return loadCaptionFile(captionSrcItem.src).then(function (captionData) {\n loadedCaptionData[captionSrcItem.languageIdentifier] = captionData;\n });\n })).then(function () {\n _xmpModel.captionController.clearCaptions();\n\n // import the caption data in the same order as configured\n captionsSrcList.forEach(function (captionSrcItem) {\n if (loadedCaptionData[captionSrcItem.languageIdentifier]) {\n _xmpModel.importCaptionsFromFile(captionSrcItem.src, loadedCaptionData[captionSrcItem.languageIdentifier], captionSrcItem.languageIdentifier);\n }\n });\n });\n };\n var abortPendingRequests = function abortPendingRequests() {\n _xmpAjaxPromise && _xmpAjaxPromise.abort();\n _captionFileAjaxPromiseList.forEach(function (captionAjaxPromise) {\n captionAjaxPromise && captionAjaxPromise.abort();\n });\n };\n var imageExistsForTocFromDescription = function imageExistsForTocFromDescription() {\n return playerConfiguration.tocModelFromDescription && playerConfiguration.tocModelFromDescription.items.length && playerConfiguration.tocModelFromDescription.items[0].image;\n };\n return Object.defineProperties({\n load: loadXmp,\n parse: parseXmp,\n importCaptionsFromFile: importCaptionsFromFile,\n abortPendingRequests: abortPendingRequests\n }, {\n ready: {\n get: function get() {\n return _readyPromise;\n }\n },\n hasAdvancedFeatures: {\n get: function get() {\n return playerConfiguration.tocModelFromDescription || _xmpModel.containsToc || _xmpModel.containsCaptions || _xmpModel.containsHotspots || _xmpModel.containsQuiz;\n }\n },\n hasTocItems: {\n get: function get() {\n return playerConfiguration.tocModelFromDescription || _xmpModel.containsToc;\n }\n },\n hasCaptionItems: {\n get: function get() {\n return _xmpModel.containsCaptions;\n }\n },\n hasHotspotItems: {\n get: function get() {\n return _xmpModel.containsHotspots;\n }\n },\n hasQuiz: {\n get: function get() {\n return _xmpModel.containsQuiz;\n }\n },\n hasScreenTextItems: {\n get: function get() {\n return _xmpModel.containsScreenText;\n }\n },\n hasSpeechTextItems: {\n get: function get() {\n return _xmpModel.containsSpeechText;\n }\n },\n hasSearchableItems: {\n get: function get() {\n var hasAnySearchableItems = _xmpModel.containsCaptions || _xmpModel.containsScreenText || _xmpModel.containsSpeechText;\n return playerConfiguration.tocModelFromDescription || _xmpModel.containsToc || hasAnySearchableItems && playerConfiguration.getIsSearchable();\n }\n },\n project: {\n get: function get() {\n return _xmpModel.project;\n }\n },\n originId: {\n get: function get() {\n return _xmpModel.originId;\n }\n },\n mediaDuration: {\n get: function get() {\n return _xmpModel.duration.value;\n }\n },\n title: {\n get: function get() {\n return _xmpModel.title;\n }\n },\n controllerParameters: {\n get: function get() {\n return _xmpModel.controller && _xmpModel.controller.parameters ? _xmpModel.controller.parameters : [];\n }\n },\n tocImageSrc: {\n get: function get() {\n return _xmpModel.containsToc ? _xmpModel.tableOfContentsTrack.image : null;\n }\n },\n tocCellLayoutType: {\n get: function get() {\n return _xmpModel.containsToc ? _xmpModel.tableOfContentsTrack.cellLayout : null;\n }\n },\n tocItemArray: {\n get: function get() {\n if (playerConfiguration.tocModelFromDescription) {\n return playerConfiguration.tocModelFromDescription.items;\n } else if (_xmpModel.containsToc) {\n return _xmpModel.tableOfContentsTrack.items;\n }\n return [];\n }\n },\n speechTextItemArray: {\n get: function get() {\n return _xmpModel.containsSpeechText ? _xmpModel.speechTrack.markers : [];\n }\n },\n screenTextItemArray: {\n get: function get() {\n if (_xmpModel.containsScreenText && _groupedScreenTextItems === null) {\n groupScreenTextByStartTime();\n }\n return _xmpModel.containsScreenText ? _groupedScreenTextItems : [];\n }\n },\n hotspotItemArray: {\n get: function get() {\n return _xmpModel.containsHotspots ? _xmpModel.hotspotTrack.hotspots : [];\n }\n },\n quizGuid: {\n get: function get() {\n return _xmpModel.containsQuiz ? _xmpModel.quizTrack.quizGuid : null;\n }\n },\n quizAuthoredEmail: {\n get: function get() {\n return _xmpModel.containsQuiz ? _xmpModel.quizTrack.authoredEmail : null;\n }\n },\n quizRequireUserId: {\n get: function get() {\n return _xmpModel.containsQuiz ? _xmpModel.quizTrack.requireUserId : null;\n }\n },\n quizLocale: {\n get: function get() {\n return _xmpModel.containsQuiz ? _xmpModel.quizTrack.locale : null;\n }\n },\n quizReportMethod: {\n get: function get() {\n return _xmpModel.containsQuiz ? _xmpModel.quizTrack.reportMethod : null;\n }\n },\n quizClientId: {\n get: function get() {\n return _xmpModel.containsQuiz ? _xmpModel.quizTrack.clientId : null;\n }\n },\n quizHash: {\n get: function get() {\n return _xmpModel.containsQuiz ? _xmpModel.quizTrack.quizHash : null;\n }\n },\n quizHideReplay: {\n get: function get() {\n return _xmpModel.containsQuiz ? _xmpModel.quizTrack.hideReplay : null;\n }\n },\n quizAllowSkipQuiz: {\n get: function get() {\n return _xmpModel.containsQuiz ? _xmpModel.quizTrack.allowSkipQuiz : null;\n }\n },\n quizParameters: {\n get: function get() {\n return _xmpModel.containsQuiz && _xmpModel.quizTrack.parameters ? _xmpModel.quizTrack.parameters : [];\n }\n },\n quizQuestionSetArray: {\n get: function get() {\n return _xmpModel.containsQuiz ? _xmpModel.quizTrack.questionSets : [];\n }\n },\n captionController: {\n get: function get() {\n return _xmpModel.captionController;\n }\n },\n captionsHasMultipleLanguages: {\n get: function get() {\n return _xmpModel.containsCaptions && _xmpModel.captionController.getAvailableLanguages().length > 1;\n }\n },\n captionItems: {\n get: function get() {\n return _xmpModel.containsCaptions ? _xmpModel.captionController.activeCaptionTrack.captionCollection.captions : [];\n }\n },\n captionFontFamily: {\n get: function get() {\n return _xmpModel.containsCaptions && _xmpModel.captionController.activeCaptionTrack.fontFamily !== undefined ? _xmpModel.captionController.activeCaptionTrack.fontFamily : _captionDefaults.captionFontFamily;\n }\n },\n captionFontSize: {\n get: function get() {\n return _xmpModel.containsCaptions && _xmpModel.captionController.activeCaptionTrack.fontSize !== undefined ? _xmpModel.captionController.activeCaptionTrack.fontSize : _captionDefaults.captionFontSize;\n }\n },\n minCaptionFontSize: {\n get: function get() {\n return _captionDefaults.captionFontSizeMin;\n }\n },\n maxCaptionFontSize: {\n get: function get() {\n return _captionDefaults.captionFontSizeMax;\n }\n },\n captionBgOpacity: {\n get: function get() {\n return _xmpModel.containsCaptions && _xmpModel.captionController.activeCaptionTrack.bgOpacity !== undefined ? _xmpModel.captionController.activeCaptionTrack.bgOpacity : _captionDefaults.captionBgColor.getAlpha();\n }\n },\n captionTextColor: {\n get: function get() {\n return _xmpModel.containsCaptions && _xmpModel.captionController.activeCaptionTrack.fgHexColor !== undefined ? _xmpModel.captionController.activeCaptionTrack.fgHexColor : _captionDefaults.captionTextColor.toHexString();\n }\n },\n captionBgColor: {\n get: function get() {\n return _xmpModel.containsCaptions && _xmpModel.captionController.activeCaptionTrack.bgColor !== undefined ? _xmpModel.captionController.activeCaptionTrack.bgColor : _captionDefaults.captionBgColor.toHexString();\n }\n },\n captionBg: {\n get: function get() {\n return _xmpModel.containsCaptions && _xmpModel.captionController.activeCaptionTrack.bgRGBACssColor ? _xmpModel.captionController.activeCaptionTrack.bgRGBACssColor : _captionDefaults.captionBgColor.toRgbString();\n }\n },\n captionPosition: {\n get: function get() {\n return _xmpModel.containsCaptions && _xmpModel.captionController.activeCaptionTrack.position !== undefined ? _xmpModel.captionController.activeCaptionTrack.position : _captionDefaults.captionPosition;\n }\n },\n captionBarHeight: {\n get: function get() {\n return _xmpModel.containsCaptions && _xmpModel.captionController.activeCaptionTrack.barHeight !== undefined ? _xmpModel.captionController.activeCaptionTrack.barHeight : _captionDefaults.captionBarHeight;\n }\n },\n tocContainsThumbs: {\n get: function get() {\n return imageExistsForTocFromDescription() || _xmpModel.containsTocThumbnails;\n }\n },\n tocThumbImageSrc: {\n get: function get() {\n if (imageExistsForTocFromDescription()) {\n return playerConfiguration.tocModelFromDescription.items[0].image;\n } else if (playerConfiguration.getTOCSpriteSrc()) {\n return playerConfiguration.getTOCSpriteSrc();\n } else if (!urlService.isUrlAbsolute(_xmpModel.tocThumbnailImageSrc)) {\n return playerConfiguration.getContentBase() + playerConfiguration.getUnicodeSafeString(_xmpModel.tocThumbnailImageSrc);\n }\n return playerConfiguration.getUnicodeSafeString(_xmpModel.tocThumbnailImageSrc);\n }\n }\n });\n};\nvar Xmp = {\n /**\n * Factory method that returns a new XmpModel object.\n * @function create\n * @memberof TSC.XmpModel\n * @static\n * @return new XmpModel instance\n */\n create: XmpModel\n};\n\nvar _fathomId;\nvar _getCompleteCallback;\nvar _errorHandlerCallback;\nvar _xmpModel;\nvar _baseUrl = 'https://results.techsmith.com/';\nvar _getFathomEndPoint = 'Assessment/Xmp/';\nvar getBaseUrl = function getBaseUrl() {\n if (playerConfiguration.getResultsServiceBaseUrl()) {\n return playerConfiguration.getResultsServiceBaseUrl();\n }\n return _baseUrl;\n};\nvar onFathomLoad = function onFathomLoad(xmlModel) {\n if (_getCompleteCallback) {\n _getCompleteCallback.call(this, xmlModel);\n }\n};\nvar errorHandler = function errorHandler() {\n if (_errorHandlerCallback) {\n _errorHandlerCallback.call();\n }\n};\nvar _getFathom = function getFathom() {\n {\n var url = getBaseUrl() + _getFathomEndPoint + _fathomId + '?noop=1';\n _xmpModel = Xmp.create();\n _xmpModel.load(url, true);\n _xmpModel.ready.then(function () {\n onFathomLoad(_xmpModel);\n })[\"catch\"](function (error) {\n log.logMessage('fathom-service: getFathom() failed. ' + error);\n errorHandler();\n });\n }\n};\nvar abortPendingRequests$2 = function abortPendingRequests() {\n _xmpModel && _xmpModel.abortPendingRequests();\n};\nvar fathomService = {\n getFathom: function getFathom(fathomId) {\n _fathomId = fathomId;\n _getFathom();\n },\n abortPendingRequests: abortPendingRequests$2,\n addEventListener: function addEventListener(type, listener) {\n if (type === events.Fathom.GetComplete) {\n _getCompleteCallback = listener;\n } else if (type === events.Fathom.Error) {\n _errorHandlerCallback = listener;\n }\n },\n removeEventListener: function removeEventListener(type) {\n if (type === events.Fathom.GetComplete) {\n _getCompleteCallback = undefined;\n } else if (type === events.Fathom.Error) {\n _errorHandlerCallback = undefined;\n }\n }\n};\n\nvar NullSmartPlayerView = function NullSmartPlayerView() {\n var noOp = function noOp() {}; // eslint-disable-line\n\n return Object.defineProperties({\n loadMedia: noOp,\n destroy: noOp,\n play: noOp,\n pause: noOp,\n isInFullScreenMode: noOp,\n addEventListener: noOp,\n removeEventListener: noOp,\n addMediaEventListener: noOp,\n removeMediaEventListener: noOp,\n getCaptionsVisible: noOp,\n setCaptionsVisible: noOp,\n getScrubbing: noOp,\n setScrubbing: noOp,\n triggerVideoStartEventCallbacks: noOp,\n getSafeSeekTime: noOp\n }, {\n initializedPromise: {\n get: function get() {\n return Promise.resolve();\n }\n },\n currentSrc: {\n get: function get() {\n return undefined;\n }\n },\n currentTime: {\n get: function get() {\n return 0;\n },\n set: noOp\n },\n duration: {\n get: function get() {\n return 0;\n }\n },\n paused: {\n get: function get() {\n return false;\n }\n },\n volume: {\n get: function get() {\n return 1;\n },\n set: noOp\n },\n muted: {\n get: function get() {\n return false;\n },\n set: noOp\n },\n playbackRate: {\n get: function get() {\n return 1;\n },\n set: noOp\n },\n ended: {\n get: function get() {\n return false;\n }\n },\n seeking: {\n get: function get() {\n return false;\n }\n },\n buffered: {\n get: function get() {\n return [];\n }\n },\n played: {\n get: function get() {\n return [];\n }\n },\n seekable: {\n get: function get() {\n return [];\n }\n }\n });\n};\nvar NullSmartPlayerView$1 = {\n create: NullSmartPlayerView\n};\n\nvar uuidGenerator = function uuidGenerator() {\n // src: http://slavik.meltser.info/the-efficient-way-to-create-guid-uuid-in-javascript-with-explanation/\n var _p8 = function _p8(s) {\n var p = (Math.random().toString(16) + '000000000').substr(2, 8);\n return s ? '-' + p.substr(0, 4) + '-' + p.substr(4, 4) : p;\n };\n return _p8() + _p8(true) + _p8(true) + _p8();\n};\nvar uuidGenerator$1 = {\n getUUID: uuidGenerator\n};\n\nvar _analyticsCategory = null;\nvar getCategory = function getCategory() {\n return _analyticsCategory;\n};\nvar setCategory = function setCategory(analyticsCategory) {\n _analyticsCategory = analyticsCategory;\n};\nvar initGoogleAnalytics = function initGoogleAnalytics() {\n log.logMessage('Built in Google Analytics has been removed');\n};\nvar sendEvent = function sendEvent(action, label, value) {\n if (_analyticsCategory === null) {\n log.logMessage('AnalyticsService :: Could not send analytics event, no category was set');\n return;\n }\n var customEventCallback = playerConfiguration.getCustomEventCallback();\n if (playerConfiguration.getCustomEventTracking() && typeof customEventCallback === 'function') {\n var eventCategory = playerConfiguration.getAltEventCategoryAsFilename() ? playerConfiguration.getMediaFileName() : _analyticsCategory;\n customEventCallback({\n category: eventCategory,\n action: action,\n label: label,\n value: value\n });\n }\n};\nvar sendGA4Event = function sendGA4Event(eventName, eventParams) {\n if (playerConfiguration.ga4EventCallback && typeof playerConfiguration.ga4EventCallback === 'function') {\n playerConfiguration.ga4EventCallback({\n eventName: eventName,\n eventParams: eventParams\n });\n }\n};\nvar analyticsService = {\n getCategory: getCategory,\n setCategory: setCategory,\n initGoogleAnalytics: initGoogleAnalytics,\n sendEvent: sendEvent,\n sendGA4Event: sendGA4Event\n};\n\nvar haveEnoughDataTimeoutInMilliseconds = 20000;\nvar EVENT_DELAY_TIME_MILLISECONDS = 100;\nvar EVENT_TIME_DIFF_TO_REMOVE_FROM_QUEUE = 200;\nvar readyStates = {\n HAVE_NOTHING: 0,\n // No information is available about the media resource.\n HAVE_METADATA: 1,\n // Enough of the media resource has been retrieved that the metadata attributes are initialized. Seeking will no longer raise an exception.\n HAVE_CURRENT_DATA: 2,\n // Data is available for the current playback position, but not enough to actually play more than one frame.\n HAVE_FUTURE_DATA: 3,\n // Data for the current playback position as well as for at least a little bit of time into the future is available (in other words, at least two frames of video, for example).\n HAVE_ENOUGH_DATA: 4 // Enough data is available—and the download rate is high enough—that the media can be played through to the end without interruption.\n};\n\n/**\n * @memberof TSC\n * @class VideoPlaybackQualityMetrics\n * @classdesc Utility to monitor and report on how video is streaming\n * @param {TSC.VideoElementView} videoElementView - Video element view\n * @param {Function} triggerRumDataEventCallback - callback function for rum timing events\n * @param {Function} eventLabelSuffixRetriever - function for retrieving event label suffix (optional)\n * @param {TSC.playerState} playerState - player state\n */\nvar VideoPlaybackQualityMetrics = function VideoPlaybackQualityMetrics(videoElementView, triggerRumDataEventCallback, eventLabelSuffixRetriever, playerState) {\n var _readyStateHasAtLeastEnoughDataOnce = false;\n var _readyStateHasEnoughDataAfterSeeked = false;\n var _timeToReachFirstHaveEnoughData = -1;\n var _videoLoadStartTimeInMilliseconds = -1;\n var _uniqueID = uuidGenerator$1.getUUID();\n var _mediaLocation = windowWrapper.getLocation();\n var _eventListeners = {};\n var _currentReadyState = null;\n var _isSeeking = false;\n var _playingEventShouldFireAfterStalled = false; // workaround for Safari annoyance\n var _mediaElement = videoElementView.mediaElement;\n var _eventLabel = null;\n var _queuedEvents = [];\n var _sendEventsDelayID = -1;\n eventLabelSuffixRetriever = eventLabelSuffixRetriever || function () {\n return '';\n };\n var setEventLabel = function setEventLabel(eventLabel) {\n _eventLabel = eventLabel;\n };\n var getEventLabel = function getEventLabel() {\n var id = _eventLabel ? _eventLabel : 'UUID_' + _uniqueID;\n return id + '__' + _mediaLocation;\n };\n var triggerShowVideoBufferingViewEvent = function triggerShowVideoBufferingViewEvent() {\n _playingEventShouldFireAfterStalled = true;\n if (_eventListeners[events.Controls.ShowVideoBufferingView]) {\n _eventListeners[events.Controls.ShowVideoBufferingView]();\n }\n };\n var triggerHideVideoBufferingView = function triggerHideVideoBufferingView() {\n _playingEventShouldFireAfterStalled = false;\n if (_eventListeners[events.Controls.HideVideoBufferingView]) {\n _eventListeners[events.Controls.HideVideoBufferingView]();\n }\n };\n var sendQueuedEvents = function sendQueuedEvents() {\n _queuedEvents.forEach(function (queuedEvent) {\n analyticsService.sendEvent(queuedEvent.event.type, queuedEvent.event.label, queuedEvent.event.value);\n analyticsService.sendGA4Event(queuedEvent.ga4Event.eventName, queuedEvent.ga4Event.eventParams);\n });\n _queuedEvents = [];\n };\n var checkVideoReadyState = function checkVideoReadyState(currentReadyState) {\n // workaround for Safari not dispatching 'playing' event as expected\n if (_playingEventShouldFireAfterStalled && !_mediaElement.paused && !_isSeeking && currentReadyState >= readyStates.HAVE_ENOUGH_DATA) {\n triggerHideVideoBufferingView();\n }\n if (currentReadyState === _currentReadyState) {\n return;\n }\n var previousReadyState = _currentReadyState;\n _currentReadyState = currentReadyState;\n if (previousReadyState === readyStates.HAVE_ENOUGH_DATA && _currentReadyState < readyStates.HAVE_FUTURE_DATA && !_mediaElement.ended && _readyStateHasEnoughDataAfterSeeked && !playerState.pausedForQuiz) {\n var eventLabel = getEventLabel();\n eventLabel += eventLabelSuffixRetriever();\n var eventTime = performance.now();\n _queuedEvents.push({\n time: eventTime,\n event: {\n type: events.Analytics.PlaybackWasStoppedToBuffer,\n label: eventLabel,\n value: 1\n },\n ga4Event: {\n eventName: events.GA4.PlaybackWasStoppedToBuffer,\n eventParams: {\n video_session_id: eventLabel // eslint-disable-line\n }\n }\n });\n triggerShowVideoBufferingViewEvent();\n }\n if (_currentReadyState === readyStates.HAVE_ENOUGH_DATA) {\n if (_timeToReachFirstHaveEnoughData === -1) {\n performanceWrapper.createMeasure(events.Timing.VideoHasEnoughData, events.Timing.VideoHasEnoughData);\n triggerRumDataEventCallback([events.Timing.VideoHasEnoughData]);\n _timeToReachFirstHaveEnoughData = window.performance.now() - _videoLoadStartTimeInMilliseconds;\n }\n _readyStateHasAtLeastEnoughDataOnce = true;\n _readyStateHasEnoughDataAfterSeeked = true;\n }\n if (_sendEventsDelayID !== -1) {\n clearTimeout(_sendEventsDelayID);\n }\n _sendEventsDelayID = setTimeout(sendQueuedEvents, EVENT_DELAY_TIME_MILLISECONDS);\n };\n var onStalledEventHandler = function onStalledEventHandler(e) {\n if (e.target && e.target.readyState !== undefined) {\n checkVideoReadyState(e.target.readyState);\n }\n };\n var onProgressEventHandler = function onProgressEventHandler(e) {\n if (e.target && e.target.readyState !== undefined) {\n checkVideoReadyState(e.target.readyState);\n }\n };\n var removeStoppedToBufferEventIfNeeded = function removeStoppedToBufferEventIfNeeded() {\n var time = performance.now();\n for (var i = _queuedEvents.length - 1; i >= 0; i--) {\n if (time - _queuedEvents[i].time <= EVENT_TIME_DIFF_TO_REMOVE_FROM_QUEUE) {\n _queuedEvents.splice(i, 1);\n }\n }\n };\n var onVideoSeekingHandler = function onVideoSeekingHandler(e) {\n removeStoppedToBufferEventIfNeeded();\n if (!_isSeeking) {\n _isSeeking = true;\n _readyStateHasEnoughDataAfterSeeked = false;\n triggerShowVideoBufferingViewEvent();\n if (e.target && e.target.readyState !== undefined) {\n checkVideoReadyState(e.target.readyState);\n }\n }\n };\n var onVideoSeekedHandler = function onVideoSeekedHandler(e) {\n if (e.target && e.target.readyState !== undefined) {\n checkVideoReadyState(e.target.readyState);\n }\n triggerHideVideoBufferingView();\n _isSeeking = false;\n };\n var onVideoWaitingHandler = function onVideoWaitingHandler(e) {\n if (e.target && e.target.readyState !== undefined) {\n checkVideoReadyState(e.target.readyState);\n }\n };\n var onVideoTimeUpdateHandler = function onVideoTimeUpdateHandler(e) {\n if (e.target && e.target.readyState !== undefined) {\n checkVideoReadyState(e.target.readyState);\n }\n };\n var onVideoLoadStartHandler = function onVideoLoadStartHandler() {\n performanceWrapper.createMarker(events.Timing.VideoMetadataLoaded);\n performanceWrapper.createMarker(events.Timing.VideoLoadedData);\n performanceWrapper.createMarker(events.Timing.VideoCanPlay);\n performanceWrapper.createMarker(events.Timing.VideoHasEnoughData);\n _videoLoadStartTimeInMilliseconds = window.performance.now();\n window.setTimeout(function () {\n if (!_readyStateHasAtLeastEnoughDataOnce) {\n analyticsService.sendEvent(events.Analytics.CouldNotPlaySmoothlyIn20Secs, getEventLabel());\n analyticsService.sendGA4Event(events.GA4.CouldNotPlaySmoothlyIn20Secs, {\n video_session_id: getEventLabel() // eslint-disable-line\n });\n }\n }, haveEnoughDataTimeoutInMilliseconds);\n _mediaElement.removeEventListener(events.ExternalVideo.VideoLoadStart, onVideoLoadStartHandler);\n };\n var onVideoMetadataLoadedHandler = function onVideoMetadataLoadedHandler() {\n _mediaElement.removeEventListener(events.ExternalVideo.VideoLoadedMetadata, onVideoMetadataLoadedHandler);\n performanceWrapper.createMeasure(events.Timing.VideoMetadataLoaded, events.Timing.VideoMetadataLoaded);\n triggerRumDataEventCallback([events.Timing.VideoMetadataLoaded]);\n };\n var onVideoLoadedDataHandler = function onVideoLoadedDataHandler() {\n _mediaElement.removeEventListener(events.ExternalVideo.VideoLoadedData, onVideoLoadedDataHandler);\n performanceWrapper.createMeasure(events.Timing.VideoLoadedData, events.Timing.VideoLoadedData);\n triggerRumDataEventCallback([events.Timing.VideoLoadedData]);\n };\n var onVideoCanPlayHandler = function onVideoCanPlayHandler() {\n _mediaElement.removeEventListener(events.ExternalVideo.VideoCanPlay, onVideoCanPlayHandler);\n performanceWrapper.createMeasure(events.Timing.VideoCanPlay, events.Timing.VideoCanPlay);\n triggerRumDataEventCallback([events.Timing.VideoCanPlay]);\n };\n var onVideoDurationChange = function onVideoDurationChange() {\n removeStoppedToBufferEventIfNeeded();\n _currentReadyState = null;\n _readyStateHasAtLeastEnoughDataOnce = false;\n _readyStateHasEnoughDataAfterSeeked = false;\n };\n var onMediaPlayingEventHandler = function onMediaPlayingEventHandler() {\n if (_isSeeking) {\n return;\n }\n triggerHideVideoBufferingView();\n };\n var addMediaEvents = function addMediaEvents() {\n videoElementView.addEventListener(events.Controls.ShowVideoBufferingView, triggerShowVideoBufferingViewEvent);\n videoElementView.addEventListener(events.Controls.HideVideoBufferingView, triggerHideVideoBufferingView);\n _mediaElement.addEventListener(events.ExternalVideo.VideoLoadStart, onVideoLoadStartHandler);\n _mediaElement.addEventListener(events.ExternalVideo.VideoLoadedMetadata, onVideoMetadataLoadedHandler);\n _mediaElement.addEventListener(events.ExternalVideo.VideoLoadedData, onVideoLoadedDataHandler);\n _mediaElement.addEventListener(events.ExternalVideo.VideoCanPlay, onVideoCanPlayHandler);\n _mediaElement.addEventListener(events.ExternalVideo.VideoSeeking, onVideoSeekingHandler);\n _mediaElement.addEventListener(events.ExternalVideo.VideoSeeked, onVideoSeekedHandler);\n _mediaElement.addEventListener(events.ExternalVideo.VideoWaiting, onVideoWaitingHandler);\n _mediaElement.addEventListener(events.ExternalVideo.VideoTimeUpdate, onVideoTimeUpdateHandler);\n _mediaElement.addEventListener(events.ExternalVideo.VideoDurationChange, onVideoDurationChange);\n _mediaElement.addEventListener(events.Media.Progress, onProgressEventHandler);\n _mediaElement.addEventListener(events.Media.Stalled, onStalledEventHandler);\n _mediaElement.addEventListener(events.Media.Playing, onMediaPlayingEventHandler);\n };\n var addEventListener = function addEventListener(eventName, eventHandler) {\n _eventListeners[eventName] = eventHandler;\n };\n var removeEventListener = function removeEventListener(eventName) {\n _eventListeners[eventName] = undefined;\n };\n var destroy = function destroy() {\n videoElementView.removeEventListener(events.Controls.ShowVideoBufferingView);\n videoElementView.removeEventListener(events.Controls.HideVideoBufferingView);\n _mediaElement.removeEventListener(events.ExternalVideo.VideoLoadStart, onVideoLoadStartHandler);\n _mediaElement.removeEventListener(events.ExternalVideo.VideoLoadedMetadata, onVideoMetadataLoadedHandler);\n _mediaElement.removeEventListener(events.ExternalVideo.VideoLoadedData, onVideoLoadedDataHandler);\n _mediaElement.removeEventListener(events.ExternalVideo.VideoCanPlay, onVideoCanPlayHandler);\n _mediaElement.removeEventListener(events.ExternalVideo.VideoSeeking, onVideoSeekingHandler);\n _mediaElement.removeEventListener(events.ExternalVideo.VideoSeeked, onVideoSeekedHandler);\n _mediaElement.removeEventListener(events.ExternalVideo.VideoWaiting, onVideoWaitingHandler);\n _mediaElement.removeEventListener(events.ExternalVideo.VideoTimeUpdate, onVideoTimeUpdateHandler);\n _mediaElement.removeEventListener(events.ExternalVideo.VideoDurationChange, onVideoDurationChange);\n _mediaElement.removeEventListener(events.Media.Progress, onProgressEventHandler);\n _mediaElement.removeEventListener(events.Media.Stalled, onStalledEventHandler);\n _mediaElement.removeEventListener(events.Media.Playing, onMediaPlayingEventHandler);\n };\n addMediaEvents();\n return Object.defineProperties({\n addEventListener: addEventListener,\n removeEventListener: removeEventListener,\n setEventLabel: setEventLabel,\n destroy: destroy\n }, {});\n};\n\n/**\n * Factory method that returns a new VideoPlaybackQualityMetrics object.\n * @memberof TSC.VideoPlaybackQualityMetrics\n * @function create\n * @static\n * @param {TSC.VideoElementView} videoElementView - Video element view\n * @param {Function} triggerRumDataEventCallback - callback function for rum timing events\n * @param {Function} eventLabelSuffixRetriever - function for retrieving event label suffix (optional)\n * @param {TSC.playerState} playerState - player state\n * @return new VideoPlaybackQualityMetrics instance\n */\nvar VideoPlaybackQualityMetrics$1 = {\n create: VideoPlaybackQualityMetrics\n};\n\nvar tabIndex = Object.freeze({\n Disabled: -1,\n DomOrder: 0\n});\n\n// pulled from https://gist.github.com/WebReflection/df05641bd04954f6d366\nvar escape = function escape(s) {\n if (typeof s !== 'string') {\n return s;\n }\n var escaped = {\n '&': '&',\n '<': '<',\n '>': '>',\n \"'\": ''',\n '\"': '"'\n };\n return s.replace(/[&<>'\"]/g, function (m) {\n return escaped[m];\n });\n};\n\nvar audioDescriptionButtonTemplate = function audioDescriptionButtonTemplate(_ref) {\n var accessBtnAudioDescription = _ref.accessBtnAudioDescription,\n audioDescriptionIndex = _ref.audioDescriptionIndex;\n return \"<button class=\\\"audio-description-button ui control-button tertiary-button\\\" name=\\\"AudioDescriptionButton\\\" type=\\\"button\\\" title=\\\"\".concat(accessBtnAudioDescription, \"\\\" tabindex=\\\"\").concat(audioDescriptionIndex, \"\\\" aria-pressed=\\\"false\\\">\\n <span class=\\\"ui audio-description-button-glyph\\\"></span>\\n</button>\");\n};\n\nvar audioDescriptionTrackTemplate = function audioDescriptionTrackTemplate(_ref) {\n var audioDescriptionTrackSrc = _ref.audioDescriptionTrackSrc;\n return \"<audio class=\\\"audio-description-track\\\" muted src=\\\"\".concat(audioDescriptionTrackSrc, \"\\\" preload=\\\"auto\\\"></audio>\");\n};\n\nvar beforeAfterPlayControlsTemplate = function beforeAfterPlayControlsTemplate(_ref) {\n var playButtonIndex = _ref.playButtonIndex,\n playIndex = _ref.playIndex,\n accessBtnClickToPlay = _ref.accessBtnClickToPlay,\n replayButtonIndex = _ref.replayButtonIndex,\n replayIndex = _ref.replayIndex,\n accessBtnClickToReplay = _ref.accessBtnClickToReplay;\n return \"<div class=\\\"video-click-to-play-link\\\" tabindex=\\\"\".concat(playButtonIndex, \"\\\">\\n <button type=\\\"button\\\" class=\\\"video-click-to-play ui play-button-overlay-glyph\\\" tabindex=\\\"\").concat(playIndex, \"\\\" aria-label=\\\"\").concat(accessBtnClickToPlay, \"\\\" data-cy=\\\"video-click-to-play\\\"></button>\\n</div>\\n<div class=\\\"video-click-to-replay-link\\\" tabindex=\\\"\").concat(replayButtonIndex, \"\\\">\\n <button type=\\\"button\\\" class=\\\"video-click-to-replay ui replay-button-overlay-glyph\\\" tabindex=\\\"\").concat(replayIndex, \"\\\" aria-label=\\\"\").concat(accessBtnClickToReplay, \"\\\"></button>\\n</div>\\n<div class=\\\"before-after-plugin-container\\\"></div>\");\n};\n\nvar captionsButtonTemplate = function captionsButtonTemplate(_ref) {\n var accessBtnClosedCaption = _ref.accessBtnClosedCaption,\n closedCaptionIndex = _ref.closedCaptionIndex;\n return \"<button class=\\\"closed-caption-button ui control-button tertiary-button\\\" name=\\\"ClosedCaption\\\" type=\\\"button\\\" title=\\\"\".concat(accessBtnClosedCaption, \"\\\" tabindex=\\\"\").concat(closedCaptionIndex, \"\\\">\\n <span class=\\\"ui closed-caption-button-glyph\\\"></span>\\n</button>\");\n};\n\nvar choiceAnswerTemplate = function choiceAnswerTemplate(_ref) {\n var questionText = _ref.questionText,\n answers = _ref.answers,\n placeHolderImg = _ref.placeHolderImg,\n focusableAnswerInput = _ref.focusableAnswerInput;\n return \"<form onsubmit=\\\"return false;\\\">\\n <fieldset>\\n <legend class=\\\"sr-only\\\">\".concat(questionText, \"</legend>\\n \").concat(answers.map(function (_ref2) {\n var answer = _ref2.answer,\n answerIndex = _ref2.answerIndex,\n isChecked = _ref2.isChecked;\n return \"<label class=\\\"multiple-choice active-question-item\\\">\\n <img src='\".concat(placeHolderImg, \"' class='image-feedback feedback-placeholder' alt='' />\\n <input type=\\\"radio\\\" \").concat(answerIndex === 0 ? \"class=\\\"\".concat(focusableAnswerInput, \"\\\"\") : '', \" name=\\\"multiple-choice\\\" value=\\\"\").concat(answerIndex, \"\\\" \").concat(isChecked ? 'checked' : '', \" />\\n <span class=\\\"multiple-choice-answer-text\\\">\").concat(answer, \"</span>\\n </label>\");\n }).join(''), \"\\n </fieldset>\\n </form>\");\n};\n\nvar fillAnswerTemplate = function fillAnswerTemplate(_ref) {\n var questionText = _ref.questionText,\n inputId = _ref.inputId,\n inputLabel = _ref.inputLabel,\n placeHolderImg = _ref.placeHolderImg,\n inputName = _ref.inputName,\n userResponse = _ref.userResponse,\n useAutofocus = _ref.useAutofocus,\n focusableAnswerInput = _ref.focusableAnswerInput;\n return \"<form onsubmit=\\\"return false;\\\">\\n <fieldset>\\n <legend class=\\\"sr-only\\\">\".concat(questionText, \"</legend>\\n <label for=\\\"\").concat(inputId, \"\\\" class=\\\"sr-only float-element-left\\\">\").concat(inputLabel, \"</label>\\n <div class=\\\"fill-in-and-short-answer-answer-container\\\">\\n <img src='\").concat(placeHolderImg, \"' class='image-feedback feedback-placeholder' aria-hidden=\\\"true\\\" alt=\\\"\\\" />\\n <input type=\\\"text\\\" id=\\\"\").concat(inputId, \"\\\" class=\\\"fill-in-the-blank-input \").concat(focusableAnswerInput, \"\\\" maxlength=\\\"140\\\" name=\\\"\").concat(inputName, \"\\\" value=\\\"\").concat(userResponse ? userResponse : '', \"\\\" autocomplete=\\\"off\\\" \").concat(useAutofocus ? 'autofocus' : '', \" />\\n </div>\\n </fieldset>\\n</form>\");\n};\n\nvar fullscreenControlTemplate = function fullscreenControlTemplate(_ref) {\n var accessBtnFullScreen = _ref.accessBtnFullScreen,\n fullscreenIndex = _ref.fullscreenIndex;\n return \"<button name=\\\"FullScreen\\\" type=\\\"button\\\" aria-pressed=\\\"false\\\" class=\\\"ui control-button tertiary-button fullscreen-button\\\" title=\\\"\".concat(accessBtnFullScreen, \"\\\" tabindex=\\\"\").concat(fullscreenIndex, \"\\\">\\n <span class=\\\"ui fullscreen-button-glyph\\\"></span>\\n</button>\");\n};\n\nvar screenReaderAlertTemplate = function screenReaderAlertTemplate(_ref) {\n var screenReaderAlertText = _ref.screenReaderAlertText;\n return \"<div class=\\\"sr-only alert-only\\\" role=\\\"alert\\\">\".concat(screenReaderAlertText, \"</div>')\");\n};\n\nvar hotspotViewTemplate = function hotspotViewTemplate(_ref) {\n var hotspotContainerWidth = _ref.hotspotContainerWidth,\n hotspotContainerHeight = _ref.hotspotContainerHeight,\n hotspotIndex = _ref.hotspotIndex,\n displayHotspotsShape = _ref.displayHotspotsShape,\n hotspotDescriptionId = _ref.hotspotDescriptionId,\n hotspotDescription = _ref.hotspotDescription,\n hotspotLinkClassName = _ref.hotspotLinkClassName,\n hotspotCoordinatesSeparationBySpace = _ref.hotspotCoordinatesSeparationBySpace;\n return \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\"\\n width=\\\"100%\\\" height=\\\"100%\\\"\\n viewBox=\\\"0 0 \".concat(hotspotContainerWidth, \" \").concat(hotspotContainerHeight, \"\\\"\\n version=\\\"1.1\\\"\\n data-hotspot-index=\\\"\").concat(hotspotIndex, \"\\\"\\n focusable=\\\"false\\\"\\n tabindex=\\\"-1\\\"\\n \").concat(displayHotspotsShape ? 'class=\"display-hotspots-shape\"' : '', \"\\n <desc id=\\\"\").concat(hotspotDescriptionId, \"\\\">\").concat(hotspotDescription, \"</desc>\\n <a xlink:href=\\\"#\\\" class=\\\"\").concat(hotspotLinkClassName, \"\\\" role=\\\"link\\\" tabindex=\\\"0\\\" focusable=\\\"true\\\" aria-labelledby=\\\"\").concat(hotspotDescriptionId, \"\\\" data-hotspot-index=\\\"\").concat(hotspotIndex, \"\\\">\\n <polygon points=\\\"\").concat(hotspotCoordinatesSeparationBySpace, \"\\\" data-hotspot-index=\\\"\").concat(hotspotIndex, \"\\\"></polygon>\\n </a>\\n</svg>\");\n};\n\nvar hotspotsTemplate = function hotspotsTemplate(_ref) {\n var hotspotsContainerId = _ref.hotspotsContainerId;\n return \"<div id=\\\"\".concat(hotspotsContainerId, \"\\\" class=\\\"hotspots\\\"></div>\");\n};\n\nvar videoViewTemplate = function videoViewTemplate(_ref) {\n var videoTagUniqueId = _ref.videoTagUniqueId;\n return \"\\n <div class=\\\"audio-description-track-wrapper\\\"></div>\\n <div class=\\\"media-container\\\">\\n <div id=\\\"\".concat(videoTagUniqueId, \"\\\" class=\\\"video-div\\\"></div>\\n <div class=\\\"youtube-pointer-event-workaround hide\\\"></div>\\n <div class=\\\"hotspots-container\\\"></div>\\n <div class=\\\"media-plugin-container\\\"></div>\\n <div class=\\\"play-pause-state\\\">\\n <div class=\\\"play-state-indicator-container\\\">\\n <div class=\\\"ui play-pause-state-indicator\\\"></div>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"caption hide\\\">\\n <p class=\\\"hide\\\"></p>\\n </div>\\n\");\n};\n\nvar imageViewTemplate = function imageViewTemplate(_ref) {\n var mediaTagUniqueId = _ref.mediaTagUniqueId;\n return \"\\n<div id=\\\"\".concat(mediaTagUniqueId, \"\\\" class=\\\"media-container image-container\\\" aria-hidden=\\\"true\\\">\\n <div class=\\\"image-div\\\">\\n <img class=\\\"smart-player-image-media\\\" />\\n </div>\\n <div class=\\\"media-plugin-container\\\"></div>\\n</div>\");\n};\n\nvar ioOverlayViewTemplate = function ioOverlayViewTemplate(_ref) {\n var loaderImg = _ref.loaderImg,\n loaderAltText = _ref.loaderAltText;\n return \"<div style=\\\"display:none\\\" class=\\\"tsc-io-container\\\">\\n <div class=\\\"tsc-io-message\\\">\\n <span role=\\\"status\\\" aria-live=\\\"polite\\\"></span>\\n <img src=\\\"\".concat(loaderImg, \"\\\" alt=\\\"\").concat(loaderAltText, \"\\\" aria-hidden=\\\"true\\\"/>\\n </div>\\n</div>\");\n};\n\nvar messageBarViewTemplate = function messageBarViewTemplate(_ref) {\n var messageText = _ref.messageText,\n primaryActionButtonText = _ref.primaryActionButtonText;\n return \"<div role=\\\"alert\\\" class=\\\"message-bar-view-container\\\">\\n <div class=\\\"message-bar-view-content-container\\\">\\n <span class=\\\"message-bar-text-container\\\">\".concat(messageText, \"</span>\\n \").concat(primaryActionButtonText ? \"<button class=\\\"button button-cta message-bar-action-button\\\">\".concat(primaryActionButtonText, \"</button>\") : '', \"\\n </div>\\n</div>\");\n};\n\nvar openExternalLinkTemplate = function openExternalLinkTemplate(_ref) {\n var screenReaderAlertText = _ref.screenReaderAlertText,\n headerText = _ref.headerText,\n link = _ref.link,\n subHeaderText = _ref.subHeaderText,\n replayText = _ref.replayText,\n openButtonScreenReaderText = _ref.openButtonScreenReaderText,\n visitSiteText = _ref.visitSiteText;\n return \"<div class=\\\"open-external-link-content\\\">\\n <span class=\\\"sr-only\\\" role=\\\"status\\\" aria-live=\\\"polite\\\">\".concat(screenReaderAlertText, \"</span>\\n <div class=\\\"open-external-link-text\\\">\").concat(headerText, \"</div>\\n <div class=\\\"open-external-link-text link-text\\\" title=\").concat(link, \">\").concat(link, \"</div>\\n \").concat(subHeaderText ? \"<div class=\\\"open-external-link-text\\\">\".concat(subHeaderText, \"</div>\") : '', \"\\n <div class=\\\"open-external-link-actions\\\">\\n <div class=\\\"button-and-text-container\\\">\\n <div class=\\\"open-external-link-button-container\\\">\\n <button role=\\\"button\\\" aria-label=\\\"\").concat(replayText, \"\\\" class=\\\"open-external-link-replay ui open-external-link-replay-glyph\\\"></button>\\n </div>\\n <div class=\\\"open-external-link-text\\\">\").concat(replayText, \"</div>\\n </div>\\n <div class=\\\"button-and-text-container\\\">\\n <div class=\\\"open-external-link-button-container\\\">\\n <button role=\\\"button\\\" class=\\\"open-external-link-open ui open-external-link-open-glyph\\\" aria-label=\\\"\").concat(openButtonScreenReaderText, \"\\\" title=\\\"\").concat(link, \"\\\"></button>\\n </div>\\n <div class=\\\"open-external-link-text\\\">\").concat(visitSiteText, \"</div>\\n </div>\\n </div>\\n</div>\");\n};\n\nvar pipControlTemplate = function pipControlTemplate(_ref) {\n var accessBtnPip = _ref.accessBtnPip,\n pipButtonIndex = _ref.pipButtonIndex;\n return \"<button name=\\\"PIP\\\" type=\\\"button\\\" role=\\\"button\\\" aria-pressed=\\\"false\\\" class=\\\"ui control-button tertiary-button pip-button\\\" title=\\\"\".concat(accessBtnPip, \"\\\" tabindex=\\\"\").concat(pipButtonIndex, \"\\\">\\n <span class=\\\"ui pip-button-glyph\\\"></span>\\n</button>\");\n};\n\nvar playRewindControlsTemplate = function playRewindControlsTemplate(_ref) {\n var accessBtnPlay = _ref.accessBtnPlay,\n playIndex = _ref.playIndex,\n accessBtnRewind = _ref.accessBtnRewind,\n rewindIndex = _ref.rewindIndex,\n accessBtnForward = _ref.accessBtnForward,\n forwardIndex = _ref.forwardIndex;\n return \"<button type=\\\"button\\\" name=\\\"Play\\\" aria-pressed=\\\"false\\\" class=\\\"ui control-button tertiary-button play-control\\\" title=\\\"\".concat(accessBtnPlay, \"\\\" tabindex=\\\"\").concat(playIndex, \"\\\">\\n <span class=\\\"ui play-button-glyph\\\"></span>\\n <span class=\\\"ui pause-button-glyph\\\"></span>\\n</button>\\n<button type=\\\"button\\\" name=\\\"Rewind\\\" class=\\\"ui control-button tertiary-button rewind-control\\\" title=\\\"\").concat(accessBtnRewind, \"\\\" tabindex=\\\"\").concat(rewindIndex, \"\\\">\\n <span class=\\\"ui rewind-button-glyph\\\"></span>\\n</button>\\n<button type=\\\"button\\\" name=\\\"Forward\\\" class=\\\"ui control-button tertiary-button forward-control\\\" title=\\\"\").concat(accessBtnForward, \"\\\" tabindex=\\\"\").concat(forwardIndex, \"\\\">\\n <span class=\\\"ui forward-button-glyph\\\"></span>\\n</button>\");\n};\n\nvar preRollContainerTemplate = function preRollContainerTemplate(_ref) {\n var preRollSizeClass = _ref.preRollSizeClass,\n preRollSrc = _ref.preRollSrc;\n return \"<iframe id=\\\"pre_roll_container\\\" class=\\\"preRoll preRollHidden \".concat(preRollSizeClass, \"\\\" src=\\\"\").concat(preRollSrc, \"\\\" scrolling=\\\"no\\\" frameborder=\\\"0\\\"></iframe>\");\n};\n\nvar prevNextControlsTemplate = function prevNextControlsTemplate(_ref) {\n var accessBtnPrevious = _ref.accessBtnPrevious,\n previousIndex = _ref.previousIndex,\n accessBtnNext = _ref.accessBtnNext,\n nextIndex = _ref.nextIndex;\n return \"<button type=\\\"button\\\" name=\\\"Previous\\\" class=\\\"ui disabled-button control-button tertiary-button previous-control\\\" aria-disabled=\\\"false\\\" title=\\\"\".concat(accessBtnPrevious, \"\\\" tabindex=\\\"\").concat(previousIndex, \"\\\">\\n <span class=\\\"ui previous-button-glyph\\\"></span>\\n</button>\\n<button type=\\\"button\\\" name=\\\"Next\\\" class=\\\"ui control-button tertiary-button next-control\\\" aria-disabled=\\\"false\\\" title=\\\"\").concat(accessBtnNext, \"\\\" tabindex=\\\"\").concat(nextIndex, \"\\\">\\n <span class=\\\"ui next-button-glyph\\\"></span>\\n</button>\");\n};\n\nvar progressBarControlTemplate = function progressBarControlTemplate(_ref) {\n var progressIndex = _ref.progressIndex,\n accessBtnProgressBar = _ref.accessBtnProgressBar;\n return \"<div class=\\\"plugin-container\\\"></div>\\n<div class=\\\"progress-scrubbar-track\\\" role=\\\"slider\\\" tabindex=\\\"\".concat(progressIndex, \"\\\" aria-label=\\\"\").concat(accessBtnProgressBar, \"\\\">\\n <div class=\\\"ui scrubbar-track\\\"></div>\\n <div class=\\\"markers\\\"></div>\\n <div class=\\\"scrub-preview\\\">\\n <div class=\\\"scrub-details\\\">\\n <canvas class=\\\"video-thumbnail\\\"></canvas>\\n <div class=\\\"hidden-video-thumbnail\\\">\\n <div class=\\\"hidden-glyph\\\"></div>\\n </div>\\n <span class=\\\"chapter-name\\\"></span>\\n <span class=\\\"video-time\\\"></span>\\n </div>\\n </div>\\n</div>\");\n};\n\nvar progressBarChapterSegmentTemplate = function progressBarChapterSegmentTemplate(_ref) {\n var chapterIndex = _ref.chapterIndex;\n return \"<div class=\\\"progress-bar-chapter\\\" data-chapter-index=\\\"\".concat(chapterIndex, \"\\\">\\n <div class=\\\"ui scrubbar-background-track\\\"></div>\\n <div class=\\\"ui scrubbar-loaded-track load-progress\\\"></div>\\n <div class=\\\"ui scrubbar-seek-hint-track seek-hint-progress\\\"></div>\\n <div class=\\\"ui scrubbar-played-track play-progress\\\"></div>\\n</div>\");\n};\n\nvar questionCountTemplate = function questionCountTemplate(_ref) {\n var questionCountText = _ref.questionCountText;\n return \"<p>\".concat(questionCountText, \"</p>\");\n};\n\nvar questionSetConfirmationTemplate = function questionSetConfirmationTemplate(_ref) {\n var title = _ref.title,\n alertText = _ref.alertText,\n reviewText = _ref.reviewText,\n confirmationText = _ref.confirmationText;\n return \"<div class=\\\"start-question-set-confirmation-container\\\" role=\\\"alertdialog\\\" aria-label=\\\"\".concat(title, \"\\\" aria-describedby=\\\"questionSetConfirmationAlert\\\">\\n <p id=\\\"questionSetConfirmationAlert\\\" class=\\\"sr-only alert-only\\\">\").concat(alertText, \"</p>\\n <button type=\\\"button\\\" class=\\\"review-button button button-secondary fill-parent top-button-element button-taller\\\" data-cy=\\\"review-quiz-button\\\">\").concat(reviewText, \"</button>\\n <button type=\\\"button\\\" class=\\\"confirm-button button button-primary fill-parent button-taller\\\" data-cy=\\\"confirm-quiz-button\\\">\").concat(confirmationText, \"</button>\\n <div class=\\\"chat-bubble-arrow\\\"></div>\\n</div>\");\n};\n\nvar questionSetReviewConfirmationTemplate = function questionSetReviewConfirmationTemplate(_ref) {\n var title = _ref.title,\n alertText = _ref.alertText,\n numberCorrect = _ref.numberCorrect,\n percentCorrect = _ref.percentCorrect,\n numberInCorrect = _ref.numberInCorrect,\n percentInCorrect = _ref.percentInCorrect,\n reviewAnswerText = _ref.reviewAnswerText,\n continueText = _ref.continueText;\n return \"<div class=\\\"review-confirmation-container\\\" role=\\\"alertdialog\\\" aria-label=\\\"\".concat(title, \"\\\" aria-describedby=\\\"questionSetReviewConfirmationAlert\\\">\\n \").concat(alertText ? \" <p id=\\\"questionSetReviewConfirmationAlert\\\" class=\\\"sr-only alert-only\\\">\".concat(alertText, \"</p>\") : '', \"\\n \").concat(numberCorrect ? \"<div class=\\\"results-summary\\\">\\n <div class=\\\"results-container correct-result\\\"><span class=\\\"result-label\\\">\".concat(numberCorrect, \"</span> <span class=\\\"calculated-percentage\\\">\").concat(percentCorrect, \"</span></div>\\n <div class=\\\"results-container incorrect-result\\\"><span class=\\\"result-label\\\">\").concat(numberInCorrect, \"</span> <span class=\\\"calculated-percentage\\\">\").concat(percentInCorrect, \"</span></div>\\n </div>\") : '', \"\\n <div class=\\\"controls-container\\\">\\n <button type=\\\"button\\\" class=\\\"review-answers-button button button-secondary fill-parent top-button-element\\\">\").concat(reviewAnswerText, \"</button>\\n <button type=\\\"button\\\" class=\\\"continue-video-button button button-primary fill-parent\\\">\").concat(continueText, \"</button>\\n </div>\\n <div class=\\\"chat-bubble-arrow\\\"></div>\\n</div>\");\n};\n\nvar questionSetReviewStatusTemplate = function questionSetReviewStatusTemplate(_ref) {\n var questionSetResultsTabIndex = _ref.questionSetResultsTabIndex,\n txtAnswersSubmitted = _ref.txtAnswersSubmitted,\n gradeableDetails = _ref.gradeableDetails,\n unGradeableDetails = _ref.unGradeableDetails,\n txtViewAnswers = _ref.txtViewAnswers,\n txtHideAnswers = _ref.txtHideAnswers;\n return \"<div class=\\\"question-set-container\\\">\\n <div class=\\\"question-set-results\\\" tabindex=\\\"\".concat(questionSetResultsTabIndex, \"\\\">\\n <div class=\\\"results-title\\\">\").concat(txtAnswersSubmitted, \"</div>\\n <div class=\\\"gradeable-details\\\">\").concat(gradeableDetails, \"</div>\\n <div class=\\\"ungradeable-details\\\">\").concat(unGradeableDetails, \"</div>\\n <button type=\\\"button\\\" class=\\\"view-answers-button button button-primary\\\">\").concat(txtViewAnswers, \"</button>\\n <button type=\\\"button\\\" class=\\\"hide-answers-button button button-secondary\\\">\").concat(txtHideAnswers, \"</button>\\n </div>\\n <div class=\\\"chat-bubble-arrow\\\"></div>\\n</div>\");\n};\n\nvar questionSetTemplate = function questionSetTemplate(_ref) {\n var submittingImg = _ref.submittingImg,\n submittingImgAltText = _ref.submittingImgAltText,\n previousQuestionButtonA11yText = _ref.previousQuestionButtonA11yText,\n previousButtonName = _ref.previousButtonName,\n nextQuestionButtonA11yText = _ref.nextQuestionButtonA11yText,\n nextButtonName = _ref.nextButtonName,\n submitButtonName = _ref.submitButtonName,\n continueButtonName = _ref.continueButtonName,\n hideQuizA11yText = _ref.hideQuizA11yText,\n hideQuizText = _ref.hideQuizText,\n showQuizText = _ref.showQuizText,\n quizTime = _ref.quizTime,\n quizAtTimeHeading = _ref.quizAtTimeHeading,\n videoId = _ref.videoId;\n return \"<div class=\\\"question-set-container\\\">\\n <div class=\\\"submitting-response-container\\\">\\n <span class=\\\"submitting-text\\\">Submitting...</span>\\n <img class=\\\"loading-image\\\" src=\\\"\".concat(submittingImg, \"\\\" alt=\\\"\").concat(submittingImgAltText, \"\\\"/>\\n </div>\\n <section class=\\\"question-set-content\\\" aria-labelledby=\\\"\").concat(videoId, \"-quiz-header\\\">\\n <h1 id=\\\"\").concat(videoId, \"-quiz-header\\\" class=\\\"sr-only\\\">\").concat(quizAtTimeHeading, \" \").concat(quizTime, \"</h1>\\n <div class=\\\"question-content-container\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\">\\n <div class=\\\"question-header\\\">\\n <div class=\\\"question-status-container\\\">\\n <div class=\\\"question-count\\\"></div>\\n </div>\\n <div class=\\\"question-text\\\"></div>\\n </div>\\n <div class=\\\"question-feedback hide-element\\\"></div>\\n </div>\\n <div class=\\\"question-answers\\\"></div>\\n <div class=\\\"question-set-controls\\\">\\n <button type=\\\"button\\\" class=\\\"previous-button button button-secondary\\\" aria-label=\\\"\").concat(previousQuestionButtonA11yText, \"\\\" disabled=\\\"disabled\\\">\").concat(previousButtonName, \"</button>\\n <button type=\\\"button\\\" class=\\\"next-button button button-secondary\\\" aria-label=\\\"\").concat(nextQuestionButtonA11yText, \"\\\" disabled=\\\"disabled\\\">\").concat(nextButtonName, \"</button>\\n <button type=\\\"button\\\" class=\\\"submit-button button button-primary\\\" disabled=\\\"disabled\\\">\").concat(submitButtonName, \"</button>\\n <button type=\\\"button\\\" class=\\\"continue-button button button-primary\\\" disabled=\\\"disabled\\\">\").concat(continueButtonName, \"</button>\\n </div>\\n <div class=\\\"question-badge-container\\\">\\n <div class=\\\"question-graded-status\\\"></div>\\n <button type=\\\"button\\\" aria-label=\\\"\").concat(hideQuizA11yText, \"\\\" class=\\\"hide-quiz-button button button-secondary\\\">\").concat(hideQuizText, \"</button>\\n </div>\\n </section>\\n <div class=\\\"minimized-question-set-container hide-element\\\">\\n <button class=\\\"show-quiz-button button button-primary\\\">\").concat(showQuizText, \"</button>\\n </div>\\n</div>\");\n};\n\nvar questionTextTemplate = function questionTextTemplate(_ref) {\n var questionText = _ref.questionText,\n correctAnswerText = _ref.correctAnswerText;\n return \"<div>\\n <p>\".concat(questionText, \"</p>\\n \").concat(correctAnswerText ? \"<span class=\\\"sr-only\\\">\".concat(correctAnswerText, \"</span>\") : '', \"\\n</div>\");\n};\n\nvar questionFeedbackContextTextTemplate = function questionFeedbackContextTextTemplate(_ref) {\n var questionFeedbackContextText = _ref.questionFeedbackContextText;\n return \"<span class=\\\"sr-only\\\">\".concat(questionFeedbackContextText, \"</span>\");\n};\n\nvar questionGradedStatusTemplate = function questionGradedStatusTemplate(_ref) {\n var correctTextString = _ref.correctTextString,\n incorrectTextString = _ref.incorrectTextString;\n return \"<div class=\\\"question-grade-status-text question-correct-text hide-element\\\">\".concat(correctTextString, \"</div>\\n<div class=\\\"question-grade-status-text question-incorrect-text hide-element\\\">\").concat(incorrectTextString, \"</div>\\n\");\n};\n\nvar quizSetupTemplate = function quizSetupTemplate(_ref) {\n var setupMessage = _ref.setupMessage,\n enterName1 = _ref.enterName1,\n name1Class = _ref.name1Class,\n enterName2 = _ref.enterName2,\n name2Class = _ref.name2Class,\n enterEmail = _ref.enterEmail,\n beginButtonText = _ref.beginButtonText,\n skipControlText = _ref.skipControlText;\n return \"<div class=\\\"tsc_quiz_setup_ui_container\\\">\\n <div class=\\\"tsc_quiz_setup_container\\\">\\n <div class=\\\"tsc_setup_input_container\\\">\\n <h2 class=\\\"quiz-user-info-instructions\\\">\".concat(setupMessage, \"</h2>\\n <input type=\\\"text\\\" name=\\\"\").concat(enterName1, \"\\\" aria-label=\\\"\").concat(setupMessage, \" \").concat(enterName1, \"\\\" class=\\\"quiz-user-input name-component-input \").concat(name1Class, \"\\\"\\n placeholder=\\\"\").concat(enterName1, \"\\\" size=\\\"24\\\" maxlength=\\\"256\\\" spellcheck=\\\"false\\\" data-cy=\\\"quiz-first-name-input\\\" />\\n <input type=\\\"text\\\" aria-label=\\\"\").concat(enterName2, \"\\\" name=\\\"\").concat(enterName2, \"\\\" class=\\\"quiz-user-input name-component-input \").concat(name2Class, \"\\\"\\n placeholder=\\\"\").concat(enterName2, \"\\\" size=\\\"24\\\" maxlength=\\\"256\\\" spellcheck=\\\"false\\\" data-cy=\\\"quiz-second-name-input\\\" />\\n <input type=\\\"email\\\" aria-label=\\\"\").concat(enterEmail, \"\\\" name=\\\"\").concat(enterEmail, \"\\\" class=\\\"quiz-user-input email_address\\\"\\n placeholder=\\\"\").concat(enterEmail, \"\\\" size=\\\"55\\\" maxlength=\\\"150\\\" spellcheck=\\\"false\\\" data-cy=\\\"quiz-email-input\\\" />\\n <div class=\\\"button-container\\\">\\n <button type=\\\"button\\\" class=\\\"button button-primary tsc_begin_button\\\" disabled data-cy=\\\"quiz-user-submit-button\\\">\").concat(beginButtonText, \"</button>\\n <button type=\\\"button\\\" class=\\\"button button-secondary skip_control\\\" data-cy=\\\"quiz-skip-user-input-button\\\">\").concat(skipControlText, \"</button>\\n </div>\\n </div>\\n </div>\\n</div>\");\n};\n\nvar settingsViewTemplate = function settingsViewTemplate(_ref) {\n var accessBtnSettings = _ref.accessBtnSettings,\n settingsIndex = _ref.settingsIndex,\n playerRateText = _ref.playerRateText,\n speedSettingIndex = _ref.speedSettingIndex,\n playbackRates = _ref.playbackRates,\n hasMultipleLanguages = _ref.hasMultipleLanguages,\n ccLanguageText = _ref.ccLanguageText,\n ccLanguageSettingIndex = _ref.ccLanguageSettingIndex,\n ccLanguages = _ref.ccLanguages,\n accessBtnAudioDescription = _ref.accessBtnAudioDescription,\n audioDescriptionMediaSrc = _ref.audioDescriptionMediaSrc,\n captionsExist = _ref.captionsExist,\n accessPlayerSettingsClose = _ref.accessPlayerSettingsClose,\n acknowledgementLinkName = _ref.acknowledgementLinkName,\n acknowledgmentUrl = _ref.acknowledgmentUrl;\n return \"<button name=\\\"Settings\\\" type=\\\"button\\\" class=\\\"settings-button ui control-button tertiary-button\\\" title=\\\"\".concat(accessBtnSettings, \"\\\" tabindex=\\\"\").concat(settingsIndex, \"\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"ui settings-button-glyph\\\"></span>\\n</button>\\n<div class=\\\"player-settings-container ui\\\">\\n <div class=\\\"acknowledgment-container-modal\\\">\\n <a href=\\\"\").concat(acknowledgmentUrl, \"\\\" class=\\\"settings-acknowledgementlink\\\" target=\\\"_blank\\\" referrerpolicy=\\\"no-referrer\\\">\").concat(acknowledgementLinkName, \"</a>\\n </div>\\n <div class=\\\"setting-header-container\\\">\\n <span class=\\\"setting-text-large\\\">\").concat(accessBtnSettings, \"</span>\\n <button class=\\\"settings-close-button\\\" aria-label=\\\"\").concat(accessPlayerSettingsClose, \"\\\">\\n <span class=\\\"ui close-button-glyph\\\"></span>\\n </button>\\n </div>\\n \").concat(audioDescriptionMediaSrc ? \" <div class=\\\"setting-container toggle-container audio-description-setting\\\">\\n <span class=\\\"setting-text\\\">\".concat(accessBtnAudioDescription, \"</span>\\n <label class=\\\"settings-select toggle\\\">\\n <input type=\\\"checkbox\\\" class=\\\"ad-toggle\\\" aria-label=\\\"\").concat(accessBtnAudioDescription, \"\\\">\\n <span class=\\\"slider round\\\"></span>\\n </label>\\n </div>\") : '', \"\\n \").concat(hasMultipleLanguages ? \"<div class=\\\"setting-container\\\">\\n <span class=\\\"setting-text\\\">\".concat(ccLanguageText, \"</span>\\n <select tabindex=\\\"\").concat(ccLanguageSettingIndex, \"\\\" aria-label=\\\"\").concat(ccLanguageText, \"\\\" class=\\\"settings-select cc-language-select\\\">\\n \").concat(ccLanguages.map(function (_ref2) {\n var selected = _ref2.selected,\n languageValue = _ref2.languageValue,\n languageLabel = _ref2.languageLabel;\n return \"<option class=\\\"cc-language-option\\\" \".concat(selected ? 'selected' : '', \" value=\\\"\").concat(languageValue, \"\\\" tabindex=\\\"-1\\\">\").concat(languageLabel, \"</option>\");\n }).join(''), \"\\n </select>\\n </div>\") : '', \"\\n <div class=\\\"setting-container toggle-container closed-caption-setting \").concat(!captionsExist ? 'hide' : '', \"\\\">\\n <span class=\\\"setting-text\\\">\").concat(ccLanguageText, \"</span>\\n <label class=\\\"settings-select toggle\\\">\\n <input type=\\\"checkbox\\\" class=\\\"cc-toggle\\\" aria-label=\\\"\").concat(ccLanguageText, \"\\\">\\n <span class=\\\"slider round\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"setting-container\\\">\\n <span class=\\\"setting-text\\\">\").concat(playerRateText, \"</span>\\n <select tabindex=\\\"\").concat(speedSettingIndex, \"\\\" aria-label=\\\"\").concat(playerRateText, \"\\\" class=\\\"settings-select player-speed-select\\\">\\n \").concat(playbackRates.map(function (_ref3) {\n var selected = _ref3.selected,\n rateValue = _ref3.rateValue,\n rateLabel = _ref3.rateLabel;\n return \"<option class=\\\"player-speed-option\\\" \".concat(selected ? 'selected' : '', \" value=\\\"\").concat(rateValue, \"\\\" tabindex=\\\"-1\\\">\").concat(rateLabel, \"</option>\");\n }).join(''), \"\\n </select>\\n </div>\\n <div class=\\\"acknowledgment-container-panel\\\">\\n <a href=\\\"\").concat(acknowledgmentUrl, \"\\\" class=\\\"settings-acknowledgementlink\\\" target=\\\"_blank\\\" referrerpolicy=\\\"no-referrer\\\">\").concat(acknowledgementLinkName, \"</a>\\n </div>\\n</div>\");\n};\n\nvar shortAnswerTemplate = function shortAnswerTemplate(_ref) {\n var questionText = _ref.questionText,\n inputId = _ref.inputId,\n inputLabel = _ref.inputLabel,\n inputName = _ref.inputName,\n useAutofocus = _ref.useAutofocus,\n userResponse = _ref.userResponse,\n focusableAnswerInput = _ref.focusableAnswerInput;\n return \"<form onsubmit=\\\"return false;\\\">\\n <fieldset>\\n <legend class=\\\"sr-only\\\">\".concat(questionText, \"</legend>\\n <label for=\\\"\").concat(inputId, \"\\\" class=\\\"sr-only\\\">\").concat(inputLabel, \"</label>\\n <div class=\\\"fill-in-and-short-answer-answer-container\\\">\\n <textarea name=\\\"\").concat(inputName, \"\\\" id=\\\"\").concat(inputId, \"\\\" class=\\\"short-answer-input \").concat(focusableAnswerInput, \"\\\" maxlength=\\\"2000\\\" rows=\\\"5\\\" \").concat(useAutofocus ? 'autofocus' : '', \">\").concat(userResponse ? userResponse : '', \"</textarea>\\n </div>\\n </fieldset>\\n</form>\");\n};\n\nvar tocButtonTemplate = function tocButtonTemplate(_ref) {\n var accessBtnTableOfContents = _ref.accessBtnTableOfContents,\n tocIndex = _ref.tocIndex;\n return \"<button class=\\\"toc-button ui control-button tertiary-button\\\" name=\\\"TableOfContents\\\" type=\\\"button\\\" title=\\\"\".concat(accessBtnTableOfContents, \"\\\" tabindex=\\\"\").concat(tocIndex, \"\\\" data-cy=\\\"toc-toggle-button\\\">\\n <span class=\\\"ui toc-button-glyph\\\"></span>\\n</button>\");\n};\n\nvar tocItemTemplate = function tocItemTemplate(_ref) {\n var showText = _ref.showText,\n centerContent = _ref.centerContent,\n dataTocTime = _ref.dataTocTime,\n dataFileText = _ref.dataFileText,\n tocItemRawText = _ref.tocItemRawText,\n tocItemIndex = _ref.tocItemIndex,\n showThumbnail = _ref.showThumbnail,\n tocItemText = _ref.tocItemText;\n return \"<li class=\\\"toc-list-item\\\" role=\\\"listitem\\\">\\n <button class=\\\"toc-item \".concat(showText ? 'limit-max-toc-item-height' : '', \" \").concat(centerContent ? 'center-flex-content' : '', \"\\\" \").concat(dataTocTime, \" \").concat(dataFileText, \" aria-label=\\\"\").concat(tocItemRawText, \"\\\" tabindex=\\\"\").concat(tocItemIndex, \"\\\">\\n \").concat(showThumbnail ? '<canvas class=\"thumbnail-placeholder\"></canvas>' : '', \"\\n \").concat(showText ? \"<span class=\\\"toc-item-text\\\">\\n \".concat(tocItemText, \"\\n </span>\") : '', \"\\n </button>\\n</li>\");\n};\n\nvar tocTemplate = function tocTemplate(_ref) {\n var searchLabel = _ref.searchLabel,\n msgSearch = _ref.msgSearch,\n tocSearchIndex = _ref.tocSearchIndex,\n searchOrJumpTo = _ref.searchOrJumpTo,\n accessBtnClearSearch = _ref.accessBtnClearSearch,\n tocEraseIndex = _ref.tocEraseIndex,\n msgSearchIsDisabledInFS = _ref.msgSearchIsDisabledInFS;\n return \"<div class=\\\"toc-head-container\\\">\\n <div class=\\\"toc-pip-image-container\\\"></div>\\n <h2 class=\\\"toc-media-title\\\"></h2>\\n <div class=\\\"toc-search-container\\\">\\n <div class=\\\"ui toc-search-glyph\\\"></div>\\n <label class=\\\"toc-search-input-label\\\">\".concat(searchLabel, \"\\n <input type=\\\"text\\\" class=\\\"toc-search-input\\\" placeholder=\\\"\").concat(msgSearch, \"\\\" tabindex=\\\"\").concat(tocSearchIndex, \"\\\" aria-label=\\\"\").concat(searchOrJumpTo, \"\\\"/>\\n </label>\\n <button class=\\\"ui clear-search-button\\\" name=\\\"ClearSearch\\\" type=\\\"button\\\" title=\\\"\").concat(accessBtnClearSearch, \"\\\" tabindex=\\\"\").concat(tocEraseIndex, \"\\\"></button>\\n </div>\\n <div class=\\\"toc-full-screen-search-alert\\\">\\n <p>\").concat(msgSearchIsDisabledInFS, \"</p>\\n </div>\\n </div>\\n <div class=\\\"toc-content-scroll-container\\\">\\n <h3 class=\\\"sr-only\\\" id=\\\"tocContentScreenReaderLabel\\\"></h3>\\n <ol class=\\\"toc-content-container\\\" role=\\\"directory\\\" aria-labelledby=\\\"tocContentScreenReaderLabel\\\"></ol>\\n </div>\");\n};\n\nvar volumeControlTemplate = function volumeControlTemplate(_ref) {\n var accessBtnVolume = _ref.accessBtnVolume,\n volumeIndex = _ref.volumeIndex,\n accessVolumeSlider = _ref.accessVolumeSlider;\n return \"<button type=\\\"button\\\" title=\\\"\".concat(accessBtnVolume, \"\\\" class=\\\"volume ui volume-button-high-glyph control-button tertiary-button\\\" tabindex=\\\"\").concat(volumeIndex, \"\\\"></button>\\n<div class=\\\"volume-slider-container volume-slider-hidden\\\">\\n <div class=\\\"volume-slider-track\\\"></div>\\n <div class=\\\"button volume-slider\\\" role=\\\"slider\\\" aria-label=\\\"\").concat(accessVolumeSlider, \"\\\"></div>\\n</div>\");\n};\n\nvar alertModalViewTemplate = function alertModalViewTemplate(_ref) {\n var screenReaderAlertText = _ref.screenReaderAlertText,\n modalTitle = _ref.modalTitle,\n closeModalButtonTitle = _ref.closeModalButtonTitle,\n modalContent = _ref.modalContent,\n dismissButtonText = _ref.dismissButtonText,\n confirmButtonText = _ref.confirmButtonText;\n return \"<div class=\\\"alert-modal-view\\\">\\n <div class=\\\"modal-overlay\\\"></div>\\n <span class=\\\"sr-only\\\" role=\\\"status\\\" aria-live=\\\"polite\\\">\".concat(screenReaderAlertText, \"</span>\\n <div class=\\\"alert-modal-container\\\">\\n <div class=\\\"modal-header\\\"><h2>\").concat(modalTitle, \"</h2>\\n \").concat(closeModalButtonTitle ? \"<button class=\\\"close-model-button button button-icon\\\" title=\\\"\".concat(closeModalButtonTitle, \"\\\" type=\\\"button\\\">\\n <span class=\\\"sr-only\\\">\").concat(closeModalButtonTitle, \"</span>\\n <span class=\\\"glyph\\\">\\n <svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\" aria-hidden=\\\"true\\\" focusable=\\\"false\\\" tabindex=\\\"-1\\\">\\n <path d=\\\"M10.12 8l4.24-4.24a1 1 0 0 0 0-1.41l-.71-.71a1 1 0 0 0-1.41 0L8 5.88 3.76 1.64a1 1 0 0 0-1.41 0l-.71.71a1 1 0 0 0 0 1.41L5.88 8l-4.24 4.24a1 1 0 0 0 0 1.41l.71.71a1 1 0 0 0 1.41 0L8 10.12l4.24 4.24a1 1 0 0 0 1.41 0l.71-.71a1 1 0 0 0 0-1.41z\\\"></path>\\n </svg>\\n </span>\\n </button>\") : '', \"\\n </div>\\n <div class=\\\"modal-body\\\">\").concat(modalContent, \"</div>\\n <div class=\\\"modal-footer\\\">\\n <div class=\\\"modal-button-group\\\">\\n <button class=\\\"dismiss-alert-button button button-tertiary\\\" aria-label=\\\"{{dismissButtonScreenReaderText}}\\\" type=\\\"button\\\"><span>\").concat(dismissButtonText, \"</span></button>\\n <button class=\\\"confirm-alert-button button button-secondary\\\" aria-label=\\\"{{confirmButtonScreenReaderText}}\\\" type=\\\"button\\\"><span>\").concat(confirmButtonText, \"</span></button>\\n </div>\\n </div>\\n </div>\\n</div>\");\n};\n\nvar scormNavigationBarTemplate = function scormNavigationBarTemplate(_ref) {\n var isPrimaryButton = _ref.isPrimaryButton,\n completeSessionButtonLabel = _ref.completeSessionButtonLabel;\n return \"<div class=\\\"scorm-navigation-bar\\\">\\n <h1 class=\\\"scorm-module-title\\\"></h1>\\n <button class=\\\"button \".concat(isPrimaryButton ? 'button-primary' : 'button-secondary', \" complete-scorm-session-button\\\">\").concat(completeSessionButtonLabel, \"</button>\\n</div>\");\n};\n\nvar scormConfirmCompleteModalTemplate = function scormConfirmCompleteModalTemplate(_ref) {\n var screenReaderAlertText = _ref.screenReaderAlertText,\n confirmText = _ref.confirmText,\n dismissButtonScreenReaderText = _ref.dismissButtonScreenReaderText,\n dismissButtonText = _ref.dismissButtonText,\n isDestructiveButton = _ref.isDestructiveButton,\n confirmButtonScreenReaderText = _ref.confirmButtonScreenReaderText,\n confirmButtonText = _ref.confirmButtonText;\n return \"<div class=\\\"scorm-confirm-complete-modal-view\\\">\\n <div class=\\\"modal-overlay\\\"></div>\\n <span class=\\\"sr-only\\\" role=\\\"status\\\" aria-live=\\\"polite\\\">\".concat(screenReaderAlertText, \"</span>\\n <div class=\\\"scorm-confirm-complete-modal-container\\\">\\n <div class=\\\"modal-body\\\">\").concat(confirmText, \"</div>\\n <div class=\\\"modal-button-group\\\">\\n <button class=\\\"dismiss-complete-button button button-secondary\\\" aria-label=\\\"\").concat(dismissButtonScreenReaderText, \"\\\" type=\\\"button\\\"><span>\").concat(dismissButtonText, \"</span></button>\\n <button class=\\\"confirm-complete-button button \").concat(isDestructiveButton ? 'button-destructive' : 'button-primary', \"\\\" aria-label=\\\"\").concat(confirmButtonScreenReaderText, \"\\\" type=\\\"button\\\"><span>\").concat(confirmButtonText, \"</span></button>\\n </div>\\n </div>\\n</div>\");\n};\n\nvar scormSessionEndedTemplate = function scormSessionEndedTemplate(_ref) {\n var screenReaderAlertText = _ref.screenReaderAlertText,\n scormSessionEndedText = _ref.scormSessionEndedText;\n return \"<div class=\\\"scorm-session-complete-container\\\">\\n <span class=\\\"sr-only\\\" role=\\\"status\\\" aria-live=\\\"polite\\\">\".concat(screenReaderAlertText, \"</span>\\n <span>\").concat(scormSessionEndedText, \"</span>\\n</div>\");\n};\n\nvar videoSeekingSpinnerViewTemplate = function videoSeekingSpinnerViewTemplate() {\n return \"<div style=\\\"display:none\\\" class=\\\"video-seeking-spinner-container\\\">\\n <div class=\\\"video-seeking-spinner\\\">\\n <svg class=\\\"spinner-svg\\\" viewBox=\\\"0 0 80 80\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" >\\n <circle class=\\\"spinner-circle\\\" cx=\\\"40\\\" cy=\\\"40\\\" r=\\\"35\\\"/>\\n </svg>\\n </div>\\n</div>\";\n};\n\nvar playerLayoutTemplate = function playerLayoutTemplate(_ref) {\n var videoWrapperIndex = _ref.videoWrapperIndex;\n return \"\\n<div class=\\\"scorm-module-navigation-container\\\"></div>\\n<div class=\\\"media-wrapper video-wrapper click-controls hide\\\" tabindex=\\\"\".concat(videoWrapperIndex, \"\\\"></div>\\n<div class=\\\"ui control-backdrop video-controls-container hide\\\">\\n <div class=\\\"progress-bar-control\\\"></div>\\n <div class=\\\"player-controls\\\">\\n <div class=\\\"bottom-controls primary-controls\\\">\\n <div class=\\\"play-rewind-controls\\\"></div>\\n <div class=\\\"prev-next-controls\\\"></div>\\n <div class=\\\"volume-wrapper\\\"></div>\\n <div class=\\\"play-time\\\" aria-hidden=\\\"true\\\">0:00 / 0:00</div>\\n </div>\\n <div class=\\\"bottom-controls secondary-controls\\\">\\n <div class=\\\"audio-description-control-wrapper\\\"></div>\\n <div class=\\\"caption-wrapper\\\"></div>\\n <div class=\\\"toc-button-wrapper\\\"></div>\\n <div class=\\\"toc-container\\\"></div>\\n <div class=\\\"player-settings-wrapper\\\"></div>\\n <div class=\\\"pip-wrapper\\\"></div>\\n <div class=\\\"theater-mode-wrapper\\\"></div>\\n <div class=\\\"fullscreen-wrapper\\\"></div>\\n </div>\\n </div>\\n</div>\\n<div class=\\\"before-after-play-controls\\\"></div>\\n<div class=\\\"scorm-confirm-complete-modal-wrapper\\\"></div>\\n<div class=\\\"scorm-session-ended-wrapper\\\"></div>\\n<div class=\\\"open-external-link\\\"></div>\\n<div class=\\\"player-plugin-container\\\"></div>\\n\");\n};\n\nvar theaterModeButtonTemplate = function theaterModeButtonTemplate(_ref) {\n var accessBtnTheaterMode = _ref.accessBtnTheaterMode,\n theaterModeIndex = _ref.theaterModeIndex;\n return \"<button class=\\\"theater-mode-button ui control-button tertiary-button\\\" name=\\\"TheaterMode\\\" type=\\\"button\\\" title=\\\"\".concat(accessBtnTheaterMode, \"\\\" tabindex=\\\"\").concat(theaterModeIndex, \"\\\">\\n <span class=\\\"ui theater-mode-button-glyph\\\"></span>\\n</button>\");\n};\n\nvar timecodeDelimiter = ':';\nvar maxSupportTimecodePlaces = 3;\nvar secondsMultiplier = 60;\nvar millisecondsMultiplier = 1000;\nvar padIfNecessary = function padIfNecessary(num) {\n return num >= 10 ? num : \"0\".concat(num);\n};\nvar getHourMinuteSecondsFromTimeInSeconds = function getHourMinuteSecondsFromTimeInSeconds(timeInSeconds) {\n timeInSeconds = Math.round(timeInSeconds);\n var hours = Math.floor(timeInSeconds / 3600);\n var secondsWithoutHours = timeInSeconds % 3600;\n var minutes = Math.floor(secondsWithoutHours / 60);\n var seconds = secondsWithoutHours % 60;\n return {\n hours: hours,\n minutes: minutes,\n seconds: seconds\n };\n};\nvar formatTime = function formatTime(timeInSeconds) {\n var timeComponents = getHourMinuteSecondsFromTimeInSeconds(timeInSeconds);\n if (timeComponents.hours > 0) {\n return \"\".concat(timeComponents.hours, \":\").concat(padIfNecessary(timeComponents.minutes), \":\").concat(padIfNecessary(timeComponents.seconds));\n } else if (timeComponents.minutes > 0) {\n return \"\".concat(timeComponents.minutes, \":\").concat(padIfNecessary(timeComponents.seconds));\n }\n return \"0:\".concat(padIfNecessary(timeComponents.seconds));\n};\nvar formatTimeForReadability = function formatTimeForReadability(timeInSeconds) {\n var timeComponents = getHourMinuteSecondsFromTimeInSeconds(timeInSeconds);\n return localizationStrings.getReadableTimeByLocale(timeComponents.hours, timeComponents.minutes, timeComponents.seconds);\n};\nvar formatTimeForCmiTimespan = function formatTimeForCmiTimespan(timeInSeconds) {\n var timeComponents = getHourMinuteSecondsFromTimeInSeconds(timeInSeconds);\n return \"\".concat(padIfNecessary(timeComponents.hours), \":\").concat(padIfNecessary(timeComponents.minutes), \":\").concat(padIfNecessary(timeComponents.seconds));\n};\nvar formatTimeAsTimeInterval = function formatTimeAsTimeInterval(timeInSeconds) {\n var timeComponents = getHourMinuteSecondsFromTimeInSeconds(timeInSeconds);\n var timeInterval = 'PT';\n if (timeComponents.hours > 0) {\n timeInterval += timeComponents.hours + 'H';\n }\n if (timeComponents.minutes > 0) {\n timeInterval += timeComponents.minutes + 'M';\n }\n timeInterval += timeComponents.seconds + 'S';\n return timeInterval;\n};\nvar convertTimecodeToMilliseconds = function convertTimecodeToMilliseconds(timecode) {\n if (!timecode || typeof timecode !== 'string') {\n return 0;\n }\n var timeInSeconds = 0;\n var multiplier = 1;\n var timecodeParts = timecode.split(timecodeDelimiter);\n var lowTimeBounds = timecodeParts.length > maxSupportTimecodePlaces ? timecodeParts.length - maxSupportTimecodePlaces : 0;\n for (var i = timecodeParts.length - 1; i >= lowTimeBounds; i--) {\n var timePartAsNumber = parseInt(timecodeParts[i], 10);\n if (!isNaN(timePartAsNumber)) {\n timeInSeconds += timePartAsNumber * multiplier;\n }\n multiplier *= secondsMultiplier;\n }\n return timeInSeconds * millisecondsMultiplier;\n};\nvar timeFormatter = {\n /**\n * Utility function for formatting a number seconds into a user-readable duration\n * @function formatTime\n * @memberof TSC.timeFormatter\n * @static\n * @param {Number} totalSeconds - numbers of seconds to format\n * @returns {String} time formatted as string (ex: 132 would return '02:12')\n */\n formatTime: formatTime,\n /**\n * Utility function for formatting a number seconds into a human readable string\n * @function formatTimeForReadability\n * @memberof TSC.timeFormatter\n * @static\n * @param {Number} totalSeconds - numbers of seconds to format\n * @returns {String} seconds formatted as string (ex: 132 would return '2 minutes and 12 seconds')\n */\n formatTimeForReadability: formatTimeForReadability,\n /**\n * Utility function for formatting number of seconds into CMI timespan format used for SCORM 1.2 reporting\n * @function formatTimeForCmiTimespan\n * @memberof TSC.timeFormatter\n * @static\n * @param {Number} totalSeconds - numbers of seconds to format\n * @returns {String} time formatted as CMI Timespan (ex: 132 would return '00:02:12')\n */\n formatTimeForCmiTimespan: formatTimeForCmiTimespan,\n /**\n * Utility function for formatting number of seconds into Time Interval format used for SCORM 2004 reporting\n * @function formatTimeAsTimeInterval\n * @memberof TSC.timeFormatter\n * @static\n * @param {Number} totalSeconds - numbers of seconds to format\n * @returns {String} time formatted as Time Interval (Ex: 132 would return 'PT2M12S')\n */\n formatTimeAsTimeInterval: formatTimeAsTimeInterval,\n /**\n * Utility function will take a timecode string and return the time in milliseconds.\n * @function convertTimecodeToMilliseconds\n * @memberof TSC.timeFormatter\n * @static\n * @param {String} timecode - String timecode HH:MM:SS (ex: 01:12:33)\n * @returns {Number} time in milliseconds\n */\n convertTimecodeToMilliseconds: convertTimecodeToMilliseconds\n};\n\nvar LOADER_IMG = 'data:image/gif;base64,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';\nvar PLACEHOLDER_GLYPH_DATA_URL = 'data:image/png;base64,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';\nvar SUBMITTING_GLYPH_DATA_URL = 'data:image/gif;base64,R0lGODlhUABQANU/ALW2uPX19WJjZdXV1qusrerq6m1ucMDBwZeXmba2t4KDhIyNjnd4evb29u7v76Gio8vLzPv7+/j4+f39/sDCxN3e35qcnujp6drb2/n5+XZ3euTk5fHy8n+Ag8nKy/z8/PLz88TGyO3t7enq66Gipff399bX2Obn58jIyr+/wZKSlaSlps3O0Ly9v66wsu/w8ezt7vT09eLi49XW2NDQ0snKzIiJjNHS06epq+vs7Obn6JOVmLy+wG1ucVhZW////yH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiOWFhNzdiZC01YTI1LTQyNjctOWIwYS02ZmE4Mjg4MTMwNTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzM5RTQ0RkE2QzE1MTFFNDk5MThBRTMzOThEQjZENTAiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzM5RTQ0Rjk2QzE1MTFFNDk5MThBRTMzOThEQjZENTAiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06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';\nvar _videoId;\nvar generateAudioDescriptionButtonMarkup = function generateAudioDescriptionButtonMarkup() {\n return audioDescriptionButtonTemplate({\n accessBtnAudioDescription: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnAudioDescription)),\n fullscreenIndex: tabIndex.DomOrder\n });\n};\nvar generateAudioDescriptionTrackMarkup = function generateAudioDescriptionTrackMarkup(audioDescriptionMediaSrc) {\n return audioDescriptionTrackTemplate({\n audioDescriptionTrackSrc: escape(audioDescriptionMediaSrc)\n });\n};\nvar generateBeforeAfterPlayControlsMarkup = function generateBeforeAfterPlayControlsMarkup() {\n var templateContext = {\n playIndex: tabIndex.DomOrder,\n replayIndex: tabIndex.DomOrder,\n playButtonIndex: tabIndex.DomOrder,\n replayButtonIndex: tabIndex.DomOrder,\n accessBtnClickToPlay: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnPlay)),\n accessBtnClickToReplay: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnClickToReplayLink))\n };\n return beforeAfterPlayControlsTemplate(templateContext);\n};\nvar generateCaptionsButtonMarkup = function generateCaptionsButtonMarkup() {\n return captionsButtonTemplate({\n accessBtnClosedCaption: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnClosedCaption)),\n closedCaptionIndex: tabIndex.DomOrder\n });\n};\nvar generateChoiceAnswersMarkup = function generateChoiceAnswersMarkup(questionText, questionAnswers, userResponse) {\n var templateContext = {};\n templateContext.questionText = escape(questionText);\n templateContext.answers = [];\n templateContext.placeHolderImg = PLACEHOLDER_GLYPH_DATA_URL;\n templateContext.focusableAnswerInput = cssClasses.focusableAnswerInput;\n questionAnswers.forEach(function (answer, index) {\n if (userResponse && index === parseInt(userResponse, 10)) {\n templateContext.answers.push({\n answerIndex: index,\n answer: escape(answer.text),\n isChecked: true\n });\n } else {\n templateContext.answers.push({\n answerIndex: index,\n answer: escape(answer.text)\n });\n }\n });\n return choiceAnswerTemplate(templateContext);\n};\nvar generateFillInTheBlankAnswerMarkup = function generateFillInTheBlankAnswerMarkup(questionText, userResponse, autoFocus) {\n var templateContext = {};\n templateContext.questionText = escape(questionText);\n templateContext.inputLabel = 'Fill in question answer';\n templateContext.inputId = 'fill-in-the-blank-input';\n templateContext.inputName = 'fill-in-the-blank-input';\n templateContext.placeHolderImg = PLACEHOLDER_GLYPH_DATA_URL;\n templateContext.userResponse = escape(userResponse);\n templateContext.focusableAnswerInput = cssClasses.focusableAnswerInput;\n if (autoFocus) {\n templateContext.useAutofocus = 'true';\n }\n return fillAnswerTemplate(templateContext);\n};\nvar generateFullscreenControlMarkup = function generateFullscreenControlMarkup(buttonTitle) {\n return fullscreenControlTemplate({\n accessBtnFullScreen: escape(buttonTitle),\n fullscreenIndex: tabIndex.DomOrder\n });\n};\nvar generateHotspotMarkup = function generateHotspotMarkup(hotspotContainerWidth, hotspotContainerHeight, hotspotIndex, descriptionId, hotspotDescription, hotspotShape, hotspotCoordinatesSeparationBySpace, hotspotLinkClassName) {\n return hotspotViewTemplate({\n hotspotContainerWidth: hotspotContainerWidth,\n hotspotContainerHeight: hotspotContainerHeight,\n hotspotIndex: hotspotIndex,\n hotspotDescriptionId: escape(descriptionId),\n hotspotDescription: escape(hotspotDescription),\n displayHotspotsShape: hotspotShape,\n hotspotCoordinatesSeparationBySpace: hotspotCoordinatesSeparationBySpace,\n hotspotLinkClassName: escape(hotspotLinkClassName)\n });\n};\nvar generateScreenReaderAlertMarkup = function generateScreenReaderAlertMarkup(screenReaderAlertText) {\n return screenReaderAlertTemplate({\n screenReaderAlertText: escape(screenReaderAlertText)\n });\n};\nvar generateHotspotsMarkup = function generateHotspotsMarkup(hotspotsContainerId) {\n return hotspotsTemplate({\n hotspotsContainerId: escape(hotspotsContainerId),\n hotspotsAltText: escape(localizationStrings.getPlayerString(playerStringNames.txtHotspot))\n });\n};\nvar generateVideoViewMarkup = function generateVideoViewMarkup(videoTagUniqueId) {\n _videoId = videoTagUniqueId;\n return videoViewTemplate({\n videoTagUniqueId: escape(videoTagUniqueId)\n });\n};\nvar generateImageMarkup = function generateImageMarkup(mediaTagUniqueId) {\n return imageViewTemplate({\n mediaTagUniqueId: escape(mediaTagUniqueId)\n });\n};\nvar generateIoOverlayMarkup = function generateIoOverlayMarkup() {\n return ioOverlayViewTemplate({\n loaderImg: LOADER_IMG,\n loaderAltText: escape(localizationStrings.getPlayerString(playerStringNames.videoLoading))\n });\n};\nvar generateMessageBarMarkup = function generateMessageBarMarkup(messageText, primaryActionButtonText) {\n return messageBarViewTemplate({\n messageText: messageText,\n primaryActionButtonText: escape(primaryActionButtonText)\n });\n};\nvar generateOpenExternalLinkMarkup = function generateOpenExternalLinkMarkup(link) {\n return openExternalLinkTemplate({\n link: escape(link),\n replayText: escape(localizationStrings.getPlayerString(playerStringNames.txtReplayVideo)),\n visitSiteText: escape(localizationStrings.getPlayerString(playerStringNames.txtVisitSite)),\n headerText: escape(localizationStrings.getPlayerString(playerStringNames.txtOpenLinkHeader)),\n subHeaderText: escape(localizationStrings.getPlayerString(playerStringNames.txtOpenLinkSubHeader)),\n screenReaderAlertText: escape(localizationStrings.getPlayerString(playerStringNames.confirmOpenUrlModalScreenReaderAlertText).replace('URL_TOKEN', link)),\n openButtonScreenReaderText: escape(localizationStrings.getPlayerString(playerStringNames.confirmOpenUrlConfirmButtonScreenReaderText))\n });\n};\nvar generatePipControlMarkup = function generatePipControlMarkup(buttonTitle) {\n return pipControlTemplate({\n accessBtnPip: escape(buttonTitle),\n pipButtonIndex: tabIndex.DomOrder\n });\n};\nvar generatePlayRewindControlsMarkup = function generatePlayRewindControlsMarkup(skipDuration) {\n return playRewindControlsTemplate({\n accessBtnRewind: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnRewind).replace('{{duration}}', skipDuration)),\n accessBtnForward: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnForward).replace('{{duration}}', skipDuration)),\n accessBtnPlay: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnPlay)),\n rewindIndex: tabIndex.DomOrder,\n playIndex: tabIndex.DomOrder,\n forwardIndex: tabIndex.DomOrder\n });\n};\nvar generatePlayerLayoutMarkup = function generatePlayerLayoutMarkup() {\n return playerLayoutTemplate({\n videoWrapperIndex: tabIndex.Disabled\n });\n};\nvar generatePreRollMarkup = function generatePreRollMarkup(preRollSrc) {\n return preRollContainerTemplate({\n preRollSizeClass: 'preRoll-fullPage',\n preRollSrc: escape(preRollSrc)\n });\n};\nvar generatePrevNextControlsMarkup = function generatePrevNextControlsMarkup() {\n return prevNextControlsTemplate({\n accessBtnPrevious: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnPrevious)),\n accessBtnNext: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnNext)),\n previousIndex: tabIndex.DomOrder,\n nextIndex: tabIndex.DomOrder\n });\n};\nvar generateProgressBarMarkup = function generateProgressBarMarkup() {\n return progressBarControlTemplate({\n progressIndex: tabIndex.DomOrder,\n accessBtnProgressBar: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnProgressBar))\n });\n};\nvar generateProgressBarChapterSegmentMarkup = function generateProgressBarChapterSegmentMarkup(chapterIndex) {\n return progressBarChapterSegmentTemplate({\n chapterIndex: chapterIndex\n });\n};\nvar generateQuestionTextMarkup = function generateQuestionTextMarkup(questionText, correctAnswerText) {\n var questionTextContext = {\n questionText: escape(questionText),\n correctAnswerText: escape(correctAnswerText)\n };\n return questionTextTemplate(questionTextContext);\n};\nvar generateQuestionFeedbackContextMarkup = function generateQuestionFeedbackContextMarkup(questionFeedbackContextText) {\n var questionFeedbackContextContext = {\n questionFeedbackContextText: escape(questionFeedbackContextText)\n };\n return questionFeedbackContextTextTemplate(questionFeedbackContextContext);\n};\nvar generateQuestionGradedStatusMarkup = function generateQuestionGradedStatusMarkup() {\n var questionGradedStatusContext = {\n correctTextString: escape(localizationStrings.getPlayerString(playerStringNames.txtCorrectString)),\n incorrectTextString: escape(localizationStrings.getPlayerString(playerStringNames.txtIncorrectString))\n };\n return questionGradedStatusTemplate(questionGradedStatusContext);\n};\nvar generateQuestionSetMarkup = function generateQuestionSetMarkup(quizTime) {\n var context = {\n previousButtonName: escape(localizationStrings.getPlayerString(playerStringNames.txtPrev)),\n previousQuestionButtonA11yText: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnPreviousQuestion)),\n nextButtonName: escape(localizationStrings.getPlayerString(playerStringNames.txtNext)),\n nextQuestionButtonA11yText: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnNextQuestion)),\n submitButtonName: escape(localizationStrings.getPlayerString(playerStringNames.txtSubmit)),\n continueButtonName: escape(localizationStrings.getPlayerString(playerStringNames.txtContinue)),\n hideQuizText: escape(localizationStrings.getPlayerString(playerStringNames.txtHideQuiz)),\n hideQuizA11yText: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnHideQuiz)),\n showQuizText: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnShowQuiz)),\n submittingImg: SUBMITTING_GLYPH_DATA_URL,\n submittingImgAltText: escape(localizationStrings.getPlayerString(playerStringNames.txtSubmittingAnswers)),\n quizTime: timeFormatter.formatTimeForReadability(quizTime),\n quizAtTimeHeading: escape(localizationStrings.getPlayerString(playerStringNames.quizAtTimeHeading)),\n videoId: _videoId\n };\n return questionSetTemplate(context);\n};\nvar generateQuestionSetConfirmationMarkup = function generateQuestionSetConfirmationMarkup(reviewText, confirmationText) {\n var context = {\n reviewText: escape(reviewText),\n confirmationText: escape(confirmationText),\n title: escape(localizationStrings.getPlayerString(playerStringNames.accessQuestionSetConfirmationTitle)),\n alertText: escape(localizationStrings.getPlayerString(playerStringNames.accessVideoPausedForQuiz))\n };\n return questionSetConfirmationTemplate(context);\n};\nvar generateQuestionSetQuestionCountMarkup = function generateQuestionSetQuestionCountMarkup(currentQuestionNumber, totalQuestions) {\n var questionCountContext = {\n questionCountText: localizationStrings.getQuestionCountString(currentQuestionNumber, totalQuestions)\n };\n return questionCountTemplate(questionCountContext);\n};\nvar generateQuestionSetReviewConfirmationMarkup = function generateQuestionSetReviewConfirmationMarkup(numberCorrectText, percentCorrectText, numberInCorrectText, percentInCorrectText, continueText, reviewText) {\n var context = {\n title: localizationStrings.getPlayerString(playerStringNames.accessQuizResults),\n alertText: numberCorrectText ? escape(\"\".concat(numberCorrectText, \" \").concat(percentCorrectText, \". \").concat(numberInCorrectText, \" \").concat(percentInCorrectText)) : null,\n numberCorrect: escape(numberCorrectText),\n percentCorrect: escape(percentCorrectText),\n numberInCorrect: numberInCorrectText,\n percentInCorrect: percentInCorrectText,\n continueText: escape(continueText),\n reviewAnswerText: escape(reviewText)\n };\n return questionSetReviewConfirmationTemplate(context);\n};\nvar generateQuestionSetReviewStatusMarkup = function generateQuestionSetReviewStatusMarkup(gradableDetails, unGradeableDetails) {\n var context = {\n gradeableDetails: escape(gradableDetails),\n unGradeableDetails: escape(unGradeableDetails),\n txtAnswersSubmitted: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnAnswersSubmitted)),\n txtViewAnswers: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnShowAnswer)),\n txtHideAnswers: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnHideAnswer)),\n questionSetResultsTabIndex: tabIndex.DomOrder\n };\n return questionSetReviewStatusTemplate(context);\n};\nvar generateQuizSetupMarkup = function generateQuizSetupMarkup() {\n var FIRST_NAME_CLASS = 'first_name';\n var LAST_NAME_CLASS = 'last_name';\n var reverseNames = localizationStrings.getLanguage() === languageCodes.JAPANESE;\n var setupMessage = localizationStrings.getPlayerString(playerStringNames.txtRequiredMessage);\n var enterEmail = localizationStrings.getPlayerString(playerStringNames.txtEnterEmail);\n var enterName1;\n var enterName2;\n var beginButtonText = localizationStrings.getPlayerString(playerStringNames.txtBegin);\n var skipControlText = localizationStrings.getPlayerString(playerStringNames.txtSkip);\n var name1Class;\n var name2Class;\n if (reverseNames) {\n enterName1 = localizationStrings.getPlayerString(playerStringNames.txtEnterLastName);\n enterName2 = localizationStrings.getPlayerString(playerStringNames.txtEnterFirstName);\n name1Class = LAST_NAME_CLASS;\n name2Class = FIRST_NAME_CLASS;\n } else {\n enterName1 = localizationStrings.getPlayerString(playerStringNames.txtEnterFirstName);\n enterName2 = localizationStrings.getPlayerString(playerStringNames.txtEnterLastName);\n name1Class = FIRST_NAME_CLASS;\n name2Class = LAST_NAME_CLASS;\n }\n var context = {\n setupMessage: setupMessage,\n enterName1: escape(enterName1),\n enterName2: escape(enterName2),\n name1Class: escape(name1Class),\n name2Class: escape(name2Class),\n enterEmail: escape(enterEmail),\n beginButtonText: escape(beginButtonText),\n skipControlText: escape(skipControlText)\n };\n return quizSetupTemplate(context);\n};\nvar generateSettingsMarkup = function generateSettingsMarkup(hasMultipleLanguages, playbackRatesList, ccLanguageList, captionsExist, audioDescriptionMediaSrc) {\n var acknowledgmentUrl = 'https://www.techsmith.com/redirect.asp?target=SmartPlayerAcknowledgementLink&ver=1.0.0&lang=enu&os=na&product=smartplayer';\n var context = {\n accessBtnSettings: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnSettings)),\n settingsIndex: tabIndex.DomOrder,\n playerRateText: escape(localizationStrings.getPlayerString(playerStringNames.playerRateText)),\n speedSettingIndex: tabIndex.DomOrder,\n playbackRates: playbackRatesList,\n hasMultipleLanguages: hasMultipleLanguages,\n ccLanguageText: escape(localizationStrings.getPlayerString(playerStringNames.ccLanguageText)),\n ccLanguageSettingIndex: tabIndex.DomOrder,\n ccLanguages: ccLanguageList,\n accessBtnAudioDescription: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnAudioDescription)),\n audioDescriptionMediaSrc: audioDescriptionMediaSrc,\n captionsExist: captionsExist,\n accessPlayerSettingsClose: escape(localizationStrings.getPlayerString(playerStringNames.accessPlayerSettingsClose)),\n acknowledgementLinkName: localizationStrings.getPlayerString(playerStringNames.acknowledgementLinkName),\n acknowledgmentUrl: acknowledgmentUrl\n };\n return settingsViewTemplate(context);\n};\nvar generateShortAnswerMarkup = function generateShortAnswerMarkup(questionText, userResponse, autoFocus) {\n var templateContext = {};\n templateContext.questionText = escape(questionText);\n templateContext.inputLabel = 'Supply your response';\n templateContext.inputId = 'short-answer-input';\n templateContext.inputName = 'short-answer-input';\n templateContext.userResponse = escape(userResponse);\n templateContext.focusableAnswerInput = cssClasses.focusableAnswerInput;\n if (autoFocus) {\n templateContext.useAutofocus = 'true';\n }\n return shortAnswerTemplate(templateContext);\n};\nvar generateTocMarkup = function generateTocMarkup() {\n return tocTemplate({\n searchLabel: escape(localizationStrings.getPlayerString(playerStringNames.search)),\n msgSearch: escape(localizationStrings.getPlayerString(playerStringNames.searchPlaceholder)),\n msgSearchIsDisabledInFS: escape(localizationStrings.getPlayerString(playerStringNames.searchDisabledFullScreen)),\n accessBtnClearSearch: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnClearSearch)),\n searchOrJumpTo: escape(localizationStrings.getPlayerString(playerStringNames.searchOrJumpTo)),\n tocSearchIndex: tabIndex.DomOrder,\n tocEraseIndex: tabIndex.DomOrder\n });\n};\nvar generateTocButtonMarkup = function generateTocButtonMarkup() {\n return tocButtonTemplate({\n accessBtnTableOfContents: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnTableOfContents)),\n tocIndex: tabIndex.DomOrder\n });\n};\nvar generateTocItemMarkup = function generateTocItemMarkup(dataTocTime, dataFileText, showThumbnail, centerContent, showText, tocText, tocRawText) {\n return tocItemTemplate({\n dataTocTime: dataTocTime,\n dataFileText: dataFileText,\n showThumbnail: showThumbnail,\n centerContent: centerContent,\n showText: showText,\n tocItemText: tocText,\n tocItemRawText: escape(tocRawText),\n tocItemIndex: tabIndex.DomOrder\n });\n};\nvar generateVolumeControlMarkup = function generateVolumeControlMarkup(cachedVolume) {\n var VOLUME_SLIDER_MIN = 0;\n var VOLUME_SLIDER_MAX = 100;\n return volumeControlTemplate({\n accessBtnVolume: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnVolume)),\n volumeIndex: tabIndex.DomOrder,\n minVolume: VOLUME_SLIDER_MIN,\n maxVolume: VOLUME_SLIDER_MAX,\n currentVolume: cachedVolume,\n accessVolumeSlider: escape(localizationStrings.getPlayerString(playerStringNames.accessTxtVolume))\n });\n};\nvar generateAlertModalMarkup = function generateAlertModalMarkup(screenReaderAlertText, closeModalButtonTitle, modalTitle, modalContent, dismissButtonText, dismissButtonScreenReaderText, confirmButtonText, confirmButtonScreenReaderText) {\n return alertModalViewTemplate({\n screenReaderAlertText: escape(screenReaderAlertText),\n closeModalButtonTitle: escape(closeModalButtonTitle),\n modalTitle: escape(modalTitle),\n modalContent: modalContent,\n dismissButtonText: escape(dismissButtonText),\n dismissButtonScreenReaderText: escape(dismissButtonScreenReaderText),\n confirmButtonText: escape(confirmButtonText),\n confirmButtonScreenReaderText: escape(confirmButtonScreenReaderText)\n });\n};\nvar generateScormNavigationBarMarkup = function generateScormNavigationBarMarkup(buttonLabel, isPrimaryButton) {\n return scormNavigationBarTemplate({\n completeSessionButtonLabel: escape(buttonLabel),\n isPrimaryButton: isPrimaryButton\n });\n};\nvar generateScormConfirmCompleteModalMarkup = function generateScormConfirmCompleteModalMarkup(screenReaderAlertText, confirmText, dismissButtonText, dismissButtonScreenReaderText, confirmButtonText, confirmButtonScreenReaderText, isDestructiveButton) {\n return scormConfirmCompleteModalTemplate({\n screenReaderAlertText: escape(screenReaderAlertText),\n confirmText: confirmText,\n dismissButtonText: escape(dismissButtonText),\n dismissButtonScreenReaderText: escape(dismissButtonScreenReaderText),\n confirmButtonText: escape(confirmButtonText),\n confirmButtonScreenReaderText: escape(confirmButtonScreenReaderText),\n isDestructiveButton: escape(isDestructiveButton)\n });\n};\nvar generateScormSessionEndedMarkup = function generateScormSessionEndedMarkup(sessionEndedText) {\n return scormSessionEndedTemplate({\n screenReaderAlertText: escape(sessionEndedText),\n scormSessionEndedText: escape(sessionEndedText)\n });\n};\nvar generateVideoSeekingSpinnerViewTemplateMarkup = function generateVideoSeekingSpinnerViewTemplateMarkup() {\n return videoSeekingSpinnerViewTemplate();\n};\nvar generateTheaterModeButtonMarkup = function generateTheaterModeButtonMarkup() {\n return theaterModeButtonTemplate({\n accessBtnTheaterMode: escape(localizationStrings.getPlayerString(playerStringNames.accessBtnTheaterMode)),\n theaterModeIndex: tabIndex.DomOrder\n });\n};\nvar templateGenerator = {\n generateAudioDescriptionButtonMarkup: generateAudioDescriptionButtonMarkup,\n generateAudioDescriptionTrackMarkup: generateAudioDescriptionTrackMarkup,\n generateBeforeAfterPlayControlsMarkup: generateBeforeAfterPlayControlsMarkup,\n generateCaptionsButtonMarkup: generateCaptionsButtonMarkup,\n generateChoiceAnswersMarkup: generateChoiceAnswersMarkup,\n generateFillInTheBlankAnswerMarkup: generateFillInTheBlankAnswerMarkup,\n generateFullscreenControlMarkup: generateFullscreenControlMarkup,\n generateHotspotMarkup: generateHotspotMarkup,\n generateScreenReaderAlertMarkup: generateScreenReaderAlertMarkup,\n generateHotspotsMarkup: generateHotspotsMarkup,\n generateVideoViewMarkup: generateVideoViewMarkup,\n generateImageMarkup: generateImageMarkup,\n generateIoOverlayMarkup: generateIoOverlayMarkup,\n generateMessageBarMarkup: generateMessageBarMarkup,\n generateOpenExternalLinkMarkup: generateOpenExternalLinkMarkup,\n generatePipControlMarkup: generatePipControlMarkup,\n generatePlayRewindControlsMarkup: generatePlayRewindControlsMarkup,\n generatePlayerLayoutMarkup: generatePlayerLayoutMarkup,\n generatePreRollMarkup: generatePreRollMarkup,\n generatePrevNextControlsMarkup: generatePrevNextControlsMarkup,\n generateProgressBarMarkup: generateProgressBarMarkup,\n generateProgressBarChapterSegmentMarkup: generateProgressBarChapterSegmentMarkup,\n generateQuestionTextMarkup: generateQuestionTextMarkup,\n generateQuestionFeedbackContextMarkup: generateQuestionFeedbackContextMarkup,\n generateQuestionGradedStatusMarkup: generateQuestionGradedStatusMarkup,\n generateQuestionSetConfirmationMarkup: generateQuestionSetConfirmationMarkup,\n generateQuestionSetQuestionCountMarkup: generateQuestionSetQuestionCountMarkup,\n generateQuestionSetMarkup: generateQuestionSetMarkup,\n generateQuestionSetReviewConfirmationMarkup: generateQuestionSetReviewConfirmationMarkup,\n generateQuestionSetReviewStatusMarkup: generateQuestionSetReviewStatusMarkup,\n generateQuizSetupMarkup: generateQuizSetupMarkup,\n generateSettingsMarkup: generateSettingsMarkup,\n generateShortAnswerMarkup: generateShortAnswerMarkup,\n generateTocButtonMarkup: generateTocButtonMarkup,\n generateTocItemMarkup: generateTocItemMarkup,\n generateTocMarkup: generateTocMarkup,\n generateVolumeControlMarkup: generateVolumeControlMarkup,\n generateAlertModalMarkup: generateAlertModalMarkup,\n generateScormNavigationBarMarkup: generateScormNavigationBarMarkup,\n generateScormConfirmCompleteModalMarkup: generateScormConfirmCompleteModalMarkup,\n generateScormSessionEndedMarkup: generateScormSessionEndedMarkup,\n generateVideoSeekingSpinnerViewTemplateMarkup: generateVideoSeekingSpinnerViewTemplateMarkup,\n generateTheaterModeButtonMarkup: generateTheaterModeButtonMarkup\n};\n\nvar DISPLAY_DELAY_MILLISECONDS = 500;\n\n/**\n * @memberof TSC\n * @class VideoSeekingSpinnerView\n * @classdesc IoOverlay View\n * @param {jQuery} $container - Top level DOM element wrapped in jQuery.\n */\nvar VideoSeekingSpinnerView = function VideoSeekingSpinnerView($container) {\n var _viewOpen = false;\n var _displayTimeoutId = -1;\n var markup = templateGenerator.generateVideoSeekingSpinnerViewTemplateMarkup();\n $container.append(markup);\n var _$seekingSpinnerContainer = $container.find('.video-seeking-spinner-container');\n var showViewAfterDelay = function showViewAfterDelay() {\n _displayTimeoutId = -1;\n _viewOpen = true;\n _$seekingSpinnerContainer.show();\n };\n var showView = function showView() {\n if (_viewOpen || _displayTimeoutId !== -1) {\n return;\n }\n _displayTimeoutId = window.setTimeout(showViewAfterDelay, DISPLAY_DELAY_MILLISECONDS);\n };\n var hideView = function hideView() {\n if (_displayTimeoutId !== -1) {\n window.clearTimeout(_displayTimeoutId);\n _displayTimeoutId = -1;\n }\n if (_viewOpen) {\n _viewOpen = false;\n _$seekingSpinnerContainer.hide();\n }\n };\n return Object.defineProperties({\n hideView: hideView,\n showView: showView\n }, {});\n};\nvar VideoSeekingSpinnerView$1 = {\n /**\n * Factory method that returns a new VideoSeekingSpinnerView object.\n * @memberof TSC.VideoSeekingSpinnerView\n * @function create\n * @static\n * @param {jQuery} $container - Top level DOM element wrapped in jQuery.\n * @return new VideoSeekingSpinnerView instance\n */\n create: VideoSeekingSpinnerView\n};\n\nvar NUMBER_MILLISECONDS_IN_SECOND = 1000;\nvar WEB_COMPATIBLE_CAPTION_FILE_EXT = 'vtt';\nvar quizController = null;\nvar setQuizController = function setQuizController(newQuizController) {\n quizController = newQuizController;\n};\nvar getSafeSeekTime$1 = function getSafeSeekTime(mediaElement, timeInSeconds) {\n var timeInMilliseconds = timeInSeconds * NUMBER_MILLISECONDS_IN_SECOND;\n var questionSetMarker;\n var shouldRespectQuizMarkers = quizController && quizController.quizModel && quizController.quizEnabled && !playerConfiguration.ignoreQuizQuestions;\n if (shouldRespectQuizMarkers) {\n for (var i = 0; i < quizController.quizModel.questionSetMarkerTimes.length; i++) {\n questionSetMarker = quizController.quizModel.questionSetMarkerTimes[i];\n if (!questionSetMarker.canSeekPast && questionSetMarker.startTime < timeInMilliseconds) {\n return questionSetMarker.startTime / NUMBER_MILLISECONDS_IN_SECOND;\n }\n }\n }\n\n // video time bounds\n if (timeInSeconds < 0) {\n return 0;\n }\n if (timeInSeconds > mediaElement.duration) {\n return mediaElement.duration;\n }\n return timeInSeconds;\n};\nvar calculateCanvasScale = function calculateCanvasScale(mediaView, wrapperWidth, wrapperHeight) {\n var scale = 1;\n if (mediaView.mediaWidth > 0 && wrapperWidth > 0 && wrapperHeight > 0 && mediaView.mediaHeight > 0) {\n var ratioOfWidth = wrapperWidth / mediaView.mediaWidth;\n var ratioOfHeight = wrapperHeight / mediaView.mediaHeight;\n scale = Math.min(ratioOfWidth, ratioOfHeight);\n }\n return scale;\n};\nvar captionSrcIsWebCompatible = function captionSrcIsWebCompatible(captionSrc) {\n return captionSrc && captionSrc.toLowerCase().split('.').pop() === WEB_COMPATIBLE_CAPTION_FILE_EXT;\n};\nvar videoApiUtils = {\n getSafeSeekTime: getSafeSeekTime$1,\n setQuizController: setQuizController,\n calculateCanvasScale: calculateCanvasScale,\n captionSrcIsWebCompatible: captionSrcIsWebCompatible\n};\n\nvar AnalyticsVideoEventCategory = 'HTML5-Video';\nvar AnalyticsYouTubeEventCategory = 'YouTube-Video';\nvar AnalyticsImageEventCategory = 'Image';\nvar AnalyticsRumVideoCategorySuffix = '';\n\nvar playerControlsType = Object.freeze({\n none: 'none',\n video: 'video',\n videoPlaylist: 'videoPlaylist'\n});\n\nvar mediaViewType = Object.freeze({\n video: 'video',\n youtube: 'youtube',\n playlist: 'playlist',\n image: 'image'\n});\n\nvar CAPTION_TRACK_SHOWING = 'showing';\nvar CAPTION_TRACK_HIDDEN = 'hidden';\nvar SAFARI_VERSION_WITH_PIP_ISSUE = 13;\n\n/**\n * @memberof TSC\n * @implement MediaView\n * @class VideoElementView\n * @classdesc HTML 5 Video element view\n * @param {jQuery} $rootContainer - Smart Player main container jquery element\n * @param {jQuery} $mediaContainer - Smart Player media container jquery element\n * @param {Array} mediaSources - html5 media DOM element (or wrapper presenting same interface)\n * @param {Boolean} includeControls - Include the built in controls for the video element\n * @param {Function} triggerRumDataEvent - Callback function to use when triggering rum data event\n * @param {Function} firstPlayCallback - callback function called on the first play click\n * @param {Boolean} [includePosterIfAvailable=false] - Include the poster image if available\n */\nvar VideoElementView = function VideoElementView($rootContainer, $mediaContainer, mediaSources, includeControls, triggerRumDataEvent, firstPlayCallback, includePosterIfAvailable) {\n var _containsWebTrackCaptions = false;\n var _view;\n var _mediaWrapper;\n var _mediaElement;\n var _videoSeekingSpinnerView;\n var _videoPlaybackQualityMetrics;\n var _videoFirstPlayTriggered = false;\n var _$videoAndVideoSources = null;\n var _captionTrackElements = {};\n if (!includePosterIfAvailable) {\n includePosterIfAvailable = false;\n }\n var createView = function createView() {\n var videoElementMarkup = '<video';\n if (includePosterIfAvailable && playerConfiguration.getPosterImageSrc()) {\n videoElementMarkup += ' poster=\"' + playerConfiguration.getPosterImageSrc() + '\"';\n }\n if (includeControls) {\n videoElementMarkup += ' controls';\n }\n if (deviceInfo.isIOS()) {\n videoElementMarkup += ' webkit-playsinline playsinline';\n }\n videoElementMarkup += '>';\n if (playerConfiguration.captionSrcList.length > 0) {\n playerConfiguration.captionSrcList.forEach(function (captionSrc) {\n if (videoApiUtils.captionSrcIsWebCompatible(captionSrc.src)) {\n _containsWebTrackCaptions = true;\n var languageIdentifier = LanguageIdentifier$1.create(captionSrc.languageIdentifier);\n var languageDisplayName = languageIdentifiers.identifiers[languageIdentifier.language].displayName;\n videoElementMarkup += '<track label=\"' + languageDisplayName + '\" kind=\"subtitles\" srclang=\"' + languageIdentifier.language + '\" src=\"' + captionSrc.src + '\">';\n }\n });\n }\n videoElementMarkup += playerConfiguration.getUnableToDisplayContentString() + '</video>';\n var $videoElementContainer = $mediaContainer.find('.video-div');\n $videoElementContainer.html(videoElementMarkup);\n if (deviceInfo.isSafari() && +deviceInfo.getSafariMajorVersion() >= SAFARI_VERSION_WITH_PIP_ISSUE) {\n $videoElementContainer.addClass(cssClasses.safariPipIssueFix);\n }\n _mediaWrapper = $mediaContainer.find('video');\n if (_mediaWrapper.length > 0) {\n _mediaElement = _mediaWrapper[0];\n }\n _videoSeekingSpinnerView = VideoSeekingSpinnerView$1.create($mediaContainer);\n };\n var setVideoSources = function setVideoSources() {\n var numberMediaSource = mediaSources.length;\n for (var i = 0; i < numberMediaSource; i++) {\n var source = playerConfiguration.getUnicodeSafeString(mediaSources[i].media);\n _mediaWrapper.append('<source src=\"' + source + '\" type=\"' + mediaSources[i].mimeType + '\" />');\n }\n bindVideoSourceEvents();\n };\n var showVideoBufferingView = function showVideoBufferingView() {\n _videoSeekingSpinnerView.showView();\n };\n var hideVideoBufferingView = function hideVideoBufferingView() {\n _videoSeekingSpinnerView.hideView();\n };\n var createPlaybackQualityMetrics = function createPlaybackQualityMetrics(view) {\n _videoPlaybackQualityMetrics = VideoPlaybackQualityMetrics$1.create(view, function (timingMeasureList) {\n triggerRumDataEvent(timingMeasureList, AnalyticsRumVideoCategorySuffix);\n }, null, $rootContainer.playerState);\n _videoPlaybackQualityMetrics.addEventListener(events.Controls.ShowVideoBufferingView, showVideoBufferingView);\n _videoPlaybackQualityMetrics.addEventListener(events.Controls.HideVideoBufferingView, hideVideoBufferingView);\n };\n var cacheCaptionTrackElements = function cacheCaptionTrackElements() {\n if (_containsWebTrackCaptions) {\n var captionTrackElements = _mediaElement.textTracks;\n for (var i = 0, numberTracks = captionTrackElements.length; i < numberTracks; i++) {\n var captionLanguage = captionTrackElements[i].language;\n _captionTrackElements[captionLanguage] = captionTrackElements[i];\n }\n }\n };\n var showCaptionTrack = function showCaptionTrack(languageIdentifier) {\n if (_captionTrackElements[languageIdentifier.language]) {\n _captionTrackElements[languageIdentifier.language].mode = CAPTION_TRACK_SHOWING;\n }\n };\n var hideCaptionTrack = function hideCaptionTrack(languageIdentifier) {\n if (_captionTrackElements[languageIdentifier.language]) {\n _captionTrackElements[languageIdentifier.language].mode = CAPTION_TRACK_HIDDEN;\n }\n };\n var onVideoErrorHandler = function onVideoErrorHandler() {\n $rootContainer.trigger(events.Media.Error, {\n errorString: localizationStrings.getPlayerString(playerStringNames.mediaNotFound)\n });\n };\n var onFirstPlayHandler = function onFirstPlayHandler() {\n if (!_videoFirstPlayTriggered) {\n firstPlayCallback();\n _videoFirstPlayTriggered = true;\n unbindVideoEvents();\n }\n };\n var unbindVideoEvents = function unbindVideoEvents() {\n _mediaElement && _mediaElement.removeEventListener(events.ExternalVideo.VideoPlay, onFirstPlayHandler);\n _mediaElement && _mediaElement.removeEventListener(events.ExternalVideo.VideoSeeking, onFirstPlayHandler);\n };\n var bindVideoEvents = function bindVideoEvents() {\n _mediaElement && _mediaElement.addEventListener(events.ExternalVideo.VideoPlay, onFirstPlayHandler);\n _mediaElement && _mediaElement.addEventListener(events.ExternalVideo.VideoSeeking, onFirstPlayHandler);\n };\n var bindVideoSourceEvents = function bindVideoSourceEvents() {\n // Selecting video and sources because ie throws errors to video and everyone to sources\n _$videoAndVideoSources = $mediaContainer.find('video, video source');\n _$videoAndVideoSources.on(events.ExternalVideo.VideoError, onVideoErrorHandler);\n };\n var processVideoEnd = function processVideoEnd() {\n return true;\n };\n var reshowVideoAfterClickToReplay = function reshowVideoAfterClickToReplay() {\n // do nothing\n };\n var destroy = function destroy() {\n unbindVideoEvents();\n _$videoAndVideoSources && _$videoAndVideoSources.off();\n _videoPlaybackQualityMetrics.destroy();\n };\n var addEventListener = function addEventListener(eventName, onEventHandler) {\n };\n var removeEventListener = function removeEventListener(eventName) {\n };\n var hotfixViewAndControlsCSS = function hotfixViewAndControlsCSS($controlsView) {}; // eslint-disable-line\n\n createView();\n bindVideoEvents();\n cacheCaptionTrackElements();\n _view = Object.defineProperties({\n hotfixViewAndControlsCSS: hotfixViewAndControlsCSS,\n showCaptionTrack: showCaptionTrack,\n hideCaptionTrack: hideCaptionTrack,\n addEventListener: addEventListener,\n removeEventListener: removeEventListener,\n reshowVideoAfterClickToReplay: reshowVideoAfterClickToReplay,\n processVideoEnd: processVideoEnd,\n loadMedia: setVideoSources,\n destroy: destroy\n }, {\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {jQuery} mediaWrapper - jQuery wrapper of the video element.\n */\n mediaWrapper: {\n get: function get() {\n return _mediaWrapper;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {HTMLVideoElement} mediaElement - HTML video element\n */\n mediaElement: {\n get: function get() {\n return _mediaElement;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Boolean} containsWebTrackCaptions - Does the video contain web track captions?\n */\n containsWebTrackCaptions: {\n get: function get() {\n return _containsWebTrackCaptions;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Number} mediaWidth - video width\n */\n mediaWidth: {\n get: function get() {\n return _mediaElement.videoWidth;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Number} mediaHeight - video height\n */\n mediaHeight: {\n get: function get() {\n return _mediaElement.videoHeight;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {int} currentTimeInMilliseconds - The current time of the media, in milliseconds\n */\n currentTimeInMilliseconds: {\n get: function get() {\n var mediaElement = this.mediaElement;\n var currentTimeInSeconds = mediaElement.currentTime > mediaElement.duration ? mediaElement.duration : mediaElement.currentTime;\n return currentTimeInSeconds ? currentTimeInSeconds * 1000 : 0;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Boolean} - allows dragging extension content\n */\n canDragContentOnVideo: {\n get: function get() {\n return true;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {string} playerControlType - Type of player controls to use\n */\n playerControlType: {\n get: function get() {\n return playerControlsType.video;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {string} type - Media view type\n */\n type: {\n get: function get() {\n return mediaViewType.video;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {boolean} supportsClickToPlayControls - Does view support click to play controls over media\n */\n supportsClickToPlayControls: {\n get: function get() {\n return true;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {boolean} supportsSCORM - Does view support SCORM\n */\n supportsSCORM: {\n get: function get() {\n return true;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {TSC.VideoPlaybackQualityMetrics} playbackQualityMetrics - the playback quality metrics set up for this view (may be null)\n */\n playbackQualityMetrics: {\n get: function get() {\n return _videoPlaybackQualityMetrics;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {string} currentSrc - The current source path of the media\n */\n currentSrc: {\n get: function get() {\n return _mediaElement.currentSrc;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Number} currentTime - The current time for the media\n */\n currentTime: {\n get: function get() {\n return _mediaElement.currentTime;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Number} duration - The duration of the media\n */\n duration: {\n get: function get() {\n return _mediaElement.duration;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Boolean} ended - Has the media ended\n */\n ended: {\n get: function get() {\n return _mediaElement.ended;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Boolean} paused - Is the media paused\n */\n paused: {\n get: function get() {\n return _mediaElement.paused;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Boolean} seeking - Is the media seeking\n */\n seeking: {\n get: function get() {\n return _mediaElement.seeking;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Number} volume - The volume of the media\n */\n volume: {\n get: function get() {\n return _mediaElement.volume;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Boolean} muted - Is the media muted\n */\n muted: {\n get: function get() {\n return _mediaElement.muted;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Number} playbackRate - Playback rate of the media\n */\n playbackRate: {\n get: function get() {\n return _mediaElement.playbackRate;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Array} buffered - THe array of buffered segments\n */\n buffered: {\n get: function get() {\n return _mediaElement.buffered;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Array} played - THe array of media segments that have been played\n */\n played: {\n get: function get() {\n return _mediaElement.played;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoElementView\n * @property {Array} seekable - THe array of media segments that are seekable\n */\n seekable: {\n get: function get() {\n return _mediaElement.seekable;\n }\n }\n });\n createPlaybackQualityMetrics(_view);\n return _view;\n};\nvar VideoElementView$1 = {\n create: VideoElementView\n};\n\nvar messageBarType = Object.freeze({\n info: 'info',\n warning: 'warning'\n});\n\nvar animationTimeMilliseconds = 300;\n\n/**\n * @memberof TSC\n * @class MessageBarView\n * @classdesc View to display player messages\n * @param {jQuery} $container - jQuery element to append message bar view to.\n * @param {String} type - Type of message bar to display\n * @param {String} messageText - Text to display in message bar.\n * @param {String} [primaryActionButtonText] - Text to display in action button\n * @param {Function} [customActionButtonHandler] - Optional function to call when action button is clicked.\n */\nvar MessageBarView = function MessageBarView($container, type, messageText, primaryActionButtonText, customActionButtonHandler) {\n var _$messageBarContainer;\n var _$actionButton;\n var onActionClick = function onActionClick() {\n remove();\n if (customActionButtonHandler) {\n customActionButtonHandler();\n }\n };\n var showView = function showView() {\n _$messageBarContainer.stop().css('opacity', 0).show().animate({\n opacity: 1\n }, animationTimeMilliseconds);\n };\n var remove = function remove() {\n if (_$actionButton.length > 0) {\n _$actionButton.off('click');\n }\n _$messageBarContainer.remove();\n };\n var init = function init() {\n var markup = templateGenerator.generateMessageBarMarkup(messageText, primaryActionButtonText);\n $container.append(markup);\n _$messageBarContainer = $container.find('.message-bar-view-container');\n _$actionButton = _$messageBarContainer.find('.message-bar-action-button');\n if (type === messageBarType.warning) {\n _$messageBarContainer.addClass('warning');\n }\n };\n var bindEvents = function bindEvents() {\n if (_$actionButton.length > 0) {\n _$actionButton.on('click', onActionClick);\n }\n };\n init();\n bindEvents();\n showView();\n return {\n remove: remove\n };\n};\nvar MessageBarView$1 = {\n /**\n * Factory method that returns a new MessageBarView object.\n * @function create\n * @memberof TSC.MessageBarView\n * @static\n * @param {jQuery} $container - jQuery element to append message bar view to.\n * @param {String} type - Type of message bar to display\n * @param {String} messageText - Text to display in message bar.\n * @param {String} [primaryActionButtonText] - Text to display in action button\n * @param {Function} [customActionButtonHandler] - Optional function to call when action button is clicked.\n * @return new MessageBarView instance\n */\n create: MessageBarView\n};\n\nvar playedTracker = function playedTracker(video) {\n var mergeToleranceInSeconds = 0.5;\n // if two time updates are farther apart than this,\n // assume something like seek or replay happened, and we need a new segment\n var timeDifferenceToForceNewSegment = 5;\n var tracker = function tracker() {\n var internalPlayed = [];\n var currentMediaSegmentIndex = 0;\n var that = this;\n var seeking = false;\n var lastTimeUpdate = 0;\n this.start = function (segmentIndex) {\n if (segmentIndex < 0 || segmentIndex > internalPlayed.length - 1) {\n throw new Error('INDEX_SIZE_ERR');\n }\n return internalPlayed[segmentIndex].start;\n };\n this.end = function (segmentIndex) {\n if (segmentIndex < 0 || segmentIndex > internalPlayed.length - 1) {\n throw new Error('INDEX_SIZE_ERR');\n }\n return internalPlayed[segmentIndex].end;\n };\n Object.defineProperty(this, 'length', {\n get: function get() {\n return internalPlayed.length;\n }\n });\n var createNewPlayedMediaSegment = function createNewPlayedMediaSegment(time) {\n var newIndex = 0;\n var numberPlayedSegments = internalPlayed.length;\n for (var i = 0; i < numberPlayedSegments; i++) {\n if (time > internalPlayed[i].end) {\n newIndex++;\n }\n }\n internalPlayed.splice(newIndex, 0, new PlayedMediaSegment());\n currentMediaSegmentIndex = newIndex;\n };\n var onTimeChange = function onTimeChange(event) {\n if (video.paused) {\n seeking = true;\n return;\n }\n var timeChangeSinceLastUpdate = Math.abs(event.data - lastTimeUpdate);\n lastTimeUpdate = event.data;\n if (seeking || timeChangeSinceLastUpdate > timeDifferenceToForceNewSegment) {\n seeking = false;\n onMediaSeekEnd(event);\n }\n if (that.length === 0) {\n createNewPlayedMediaSegment(event.data);\n internalPlayed[0].recordTime(0);\n }\n internalPlayed[currentMediaSegmentIndex].recordTime(event.data);\n if (internalPlayed.length > 1) {\n mergeOverlappingMediaSegments();\n }\n };\n var onMediaSeekEnd = function onMediaSeekEnd(event) {\n var mediaSegmentIndexForTime = getPlayedMediaSegmentIndexByTime(event.data);\n if (mediaSegmentIndexForTime === -1) {\n createNewPlayedMediaSegment(event.data);\n } else {\n currentMediaSegmentIndex = mediaSegmentIndexForTime;\n }\n };\n var mergeOverlappingMediaSegments = function mergeOverlappingMediaSegments() {\n var numberSegments = internalPlayed.length;\n for (var i = 0; i < numberSegments; i++) {\n if (currentMediaSegmentIndex !== i && that.areMediaSegmentsOverlapping(internalPlayed[currentMediaSegmentIndex], internalPlayed[i])) {\n mergeMediaSegments(currentMediaSegmentIndex, i);\n break;\n }\n }\n };\n var mergeMediaSegments = function mergeMediaSegments(segmentOneIndex, segmentTwoIndex) {\n var mergedIndex = Math.min(segmentOneIndex, segmentTwoIndex);\n var notMergedIndex = Math.max(segmentOneIndex, segmentTwoIndex);\n internalPlayed[mergedIndex].start = Math.min(internalPlayed[segmentOneIndex].start, internalPlayed[segmentTwoIndex].start);\n internalPlayed[mergedIndex].end = Math.max(internalPlayed[segmentOneIndex].end, internalPlayed[segmentTwoIndex].end);\n internalPlayed.splice(notMergedIndex, 1);\n currentMediaSegmentIndex = mergedIndex;\n };\n var getPlayedMediaSegmentIndexByTime = function getPlayedMediaSegmentIndexByTime(time) {\n var segmentIndex = -1;\n var numberPlayedSegments = internalPlayed.length;\n for (var i = 0; i < numberPlayedSegments; i++) {\n if (time >= internalPlayed[i].start && time <= internalPlayed[i].end) {\n segmentIndex = i;\n break;\n }\n }\n return segmentIndex;\n };\n video.addEventListener('timeupdate', onTimeChange);\n };\n tracker.prototype.areMediaSegmentsOverlapping = function (segment1, segment2) {\n var startInOuterSegment = segment2.start >= segment1.start - mergeToleranceInSeconds && segment2.start <= segment1.end + mergeToleranceInSeconds;\n var endInOuterSegment = segment2.end >= segment1.start - mergeToleranceInSeconds && segment2.end <= segment1.end + mergeToleranceInSeconds;\n return startInOuterSegment || endInOuterSegment;\n };\n return new tracker();\n};\nvar PlayedMediaSegment = function PlayedMediaSegment() {\n var startTime = -1;\n var endTime = -1;\n var segment = {};\n Object.defineProperty(segment, 'start', {\n get: function get() {\n return startTime;\n },\n set: function set(value) {\n startTime = +value;\n }\n });\n Object.defineProperty(segment, 'end', {\n get: function get() {\n return endTime;\n },\n set: function set(value) {\n endTime = +value;\n }\n });\n segment.recordTime = function (time) {\n if (startTime === -1 || time < startTime) {\n startTime = time;\n }\n if (time > endTime) {\n endTime = time;\n }\n };\n return segment;\n};\n\nvar getIdFromUrl = function getIdFromUrl(videoUrl) {\n var videoIdRegex = /(youtu\\.be\\/|v=)(.{11})/i;\n var videoIdMatch = videoIdRegex.exec(videoUrl);\n return videoIdMatch && videoIdMatch[2] ? videoIdMatch[2] : '*';\n};\nvar youtubeIdParser = {\n getIdFromUrl: getIdFromUrl\n};\n\nvar addYouTubeApiReadyHandler = function addYouTubeApiReadyHandler() {\n if (!window.onYouTubeIframeAPIReady) {\n window.onYouTubeIframeAPIReady = function () {\n window.onYouTubeIframeAPIReady.ready = true;\n if (Array.isArray(window.onYouTubeIframeAPIReady.queued)) {\n for (var i = 0; i < window.onYouTubeIframeAPIReady.queued.length; i++) {\n if (typeof window.onYouTubeIframeAPIReady.queued[i] === 'function') {\n window.onYouTubeIframeAPIReady.queued[i]();\n } else {\n console.warn('window.onYouTubeIframeAPIReady.queued[' + i + '] is not a function');\n }\n }\n } else {\n console.warn('window.onYouTubeIframeAPIReady.queued is not an array');\n }\n };\n window.onYouTubeIframeAPIReady.queued = [];\n }\n};\nvar youTubeApiUri = 'https://www.youtube.com/iframe_api';\nvar _playbackReadyPromiseResolve;\nvar _playbackReadyPromise = new Promise$1(function (resolve) {\n _playbackReadyPromiseResolve = resolve;\n});\nvar YouTubePlayer = function YouTubePlayer(videoUrl, iFrameId, onFirstPlay, onError, playerWidth, playerHeight, startTimeInSeconds, disableFullScreen) {\n var that = this;\n //Keep local variables to minimize cross-iframe communication\n var events = {};\n var currentTime = 0;\n var duration = 0;\n var loadedPercent = 0;\n var playbackRate = 1;\n var playerState = -1;\n var supportPlaybackRate = false;\n var volume = 0.5;\n var muted = false;\n var availableRateSettings = [];\n var ended = false;\n var displayAnnotations = 3; //3 indicates that annotations should be hidden\n var videoId = youtubeIdParser.getIdFromUrl(videoUrl);\n var heartbeatIntervalId = null;\n if (typeof startTimeInSeconds !== 'number') {\n startTimeInSeconds = 0;\n }\n that.playbackReadyPromise = _playbackReadyPromise;\n this.addEventListener = function (eventName, handler) {\n events[eventName] = events[eventName] || [];\n events[eventName].push(handler);\n };\n this.removeEventListener = function (eventName, handler) {\n if (!events[eventName] || events[eventName].length === 0) {\n return;\n }\n var handlerIndex = events[eventName].indexOf(handler);\n if (handlerIndex !== -1) {\n events[eventName].splice(handlerIndex, 1);\n }\n };\n this.bind = function (arg1, arg2) {\n if (typeof arg1 === 'string') {\n this.addEventListener(arg1, arg2);\n } else if (_typeof$1(arg1) === 'object') {\n var keys = Object.keys(arg1);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n that.addEventListener(key, arg1[key]);\n }\n }\n };\n this.on = this.bind;\n this.unbind = function (eventName, handler) {\n if (typeof handler !== 'undefined') {\n this.removeEventListener(eventName, handler);\n } else {\n events[eventName] = [];\n }\n };\n this.off = this.unbind;\n var errorHandler = function errorHandler(event) {\n switch (event.data) {\n case 2:\n //The watch URL is probably wrong - missing/too many characters, or invalid characters\n dispatchEvent('error', 'Invalid video url.'); //\n break;\n case 5:\n //The internal HTML5_VIDEO player cannot play the content\n dispatchEvent('error', 'The video cannot be played.');\n break;\n case 100:\n //Video has been removed or marked private\n dispatchEvent('error', 'This video has been removed from YouTube and is no longer available for playback.');\n break;\n case 101:\n case 150:\n //The video has embedding disabled\n dispatchEvent('error', 'This video is unavailable. Its YouTube owner either disabled embedding or marked it private.');\n break;\n //Unknown video error?\n }\n };\n if (onError) {\n this.addEventListener('error', onError);\n }\n var firstPlay = function firstPlay() {\n duration = player.getDuration();\n dispatchEvent('durationchange');\n if (onFirstPlay) {\n onFirstPlay();\n }\n dispatchEvent('loadedmetadata');\n dispatchEvent('loadeddata');\n dispatchEvent('canplay');\n //Ensure these events get fired in the proper order the first time, especially for mobile case\n that.removeEventListener('playing', firstPlay);\n dispatchEvent('playing');\n dispatchEvent('play');\n };\n var onStateChange = function onStateChange(event) {\n playerState = event.data;\n switch (event.data) {\n case window.YT.PlayerState.PAUSED:\n dispatchEvent('pause');\n break;\n case window.YT.PlayerState.ENDED:\n ended = true;\n dispatchEvent('ended');\n break;\n case window.YT.PlayerState.PLAYING:\n dispatchEvent('playing');\n dispatchEvent('play');\n break;\n case window.YT.PlayerState.BUFFERING:\n dispatchEvent('waiting');\n break;\n }\n };\n var onPlaybackRateChange = function onPlaybackRateChange(event) {\n playbackRate = event.data;\n dispatchEvent('ratechange', playbackRate);\n };\n var removeFullScreenAttributes = function removeFullScreenAttributes() {\n var playerIFrame = $('#' + iFrameId);\n var fullScreenAttributes = ['allowfullscreen', 'webkitAllowFullScreen', 'mozallowfullscreen'];\n fullScreenAttributes.forEach(function (attr) {\n playerIFrame.removeAttr(attr);\n });\n };\n var readyHandler = function readyHandler() {\n dispatchEvent('loadstart');\n if (disableFullScreen) {\n removeFullScreenAttributes();\n }\n availableRateSettings = player.getAvailablePlaybackRates();\n if (availableRateSettings.length > 1) {\n supportPlaybackRate = true;\n }\n that.addEventListener('playing', firstPlay);\n _playbackReadyPromiseResolve();\n };\n if (playerConfiguration.getShowYouTubeAnnotations()) {\n displayAnnotations = 1;\n }\n\n /* eslint camelcase:'off' */\n var player = new window.YT.Player(iFrameId, {\n width: playerWidth,\n height: playerHeight,\n playerVars: {\n wmode: 'opaque',\n //Fix for overlays when iframe is hosting flash content\n loop: 0,\n autoplay: 0,\n controls: playerConfiguration.getDisableYouTubeControls() ? 0 : 1,\n disablekb: playerConfiguration.getDisableYouTubeControls() ? 1 : 0,\n rel: 0,\n showsearch: 0,\n showinfo: 0,\n iv_load_policy: displayAnnotations,\n playsinline: 1,\n fs: disableFullScreen ? 0 : 1,\n modestbranding: 1\n },\n events: {\n onReady: readyHandler,\n onStateChange: onStateChange,\n onPlaybackRateChange: onPlaybackRateChange,\n onError: errorHandler\n }\n });\n var dispatchEvent = function dispatchEvent(eventName, arg) {\n var event = {\n type: eventName,\n target: that,\n data: arg\n };\n if (events.hasOwnProperty(eventName)) {\n var eventHandlers = events[eventName].slice(0);\n for (var i = 0; i < eventHandlers.length; i++) {\n eventHandlers[i](event);\n }\n }\n };\n var _playedTracker = new playedTracker(this);\n\n //As the name suggests, this is mocking the behavior of the html5 spec 'loaded' parameter\n var loadedMock = function loadedMock() {\n return {\n start: function start() {\n return 0;\n },\n end: function end() {\n return duration * loadedPercent;\n },\n length: 1\n };\n };\n Object.defineProperty(this, 'buffered', {\n get: loadedMock\n });\n Object.defineProperty(this, 'currentSrc', {\n get: function get() {\n return videoUrl;\n }\n });\n Object.defineProperty(this, 'currentTime', {\n get: function get() {\n return player.getCurrentTime();\n },\n set: function set(value) {\n dispatchEvent('seeking');\n if (+value > that.buffered.end()) {\n player.seekTo(+value, true);\n } else {\n player.seekTo(+value);\n }\n dispatchEvent('seeked');\n }\n });\n Object.defineProperty(this, 'duration', {\n get: function get() {\n return duration;\n }\n });\n Object.defineProperty(this, 'paused', {\n get: function get() {\n return playerState === window.YT.PlayerState.PAUSED;\n }\n });\n Object.defineProperty(this, 'playbackRate', {\n get: function get() {\n return playbackRate;\n },\n set: function set(value) {\n if (player.setPlaybackRate) {\n player.setPlaybackRate(+value);\n }\n //Don't set internal value here - let the emitted event update it\n }\n });\n Object.defineProperty(this, 'played', {\n get: function get() {\n return _playedTracker;\n }\n });\n Object.defineProperty(this, 'ended', {\n get: function get() {\n return ended;\n }\n });\n Object.defineProperty(this, 'seekable', {\n get: function get() {\n return {\n start: function start() {\n return 0;\n },\n end: function end() {\n return duration;\n },\n length: 1\n };\n }\n });\n Object.defineProperty(this, 'supportPlaybackRate', {\n get: function get() {\n return supportPlaybackRate;\n }\n });\n Object.defineProperty(this, 'validRateSettings', {\n get: function get() {\n return availableRateSettings;\n }\n });\n Object.defineProperty(this, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(value) {\n //Youtube player decided to let volume be 1-100 instead of html5 spec 0-1\n var scaledValue = value * 100;\n player.setVolume && player.setVolume(scaledValue);\n volume = value;\n dispatchEvent('volumechange', null);\n }\n });\n Object.defineProperty(this, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(value) {\n if (muted !== value) {\n muted = value;\n dispatchEvent('volumechange', null);\n }\n if (value) {\n player.mute && player.mute();\n } else {\n player.unMute && player.unMute();\n }\n }\n });\n Object.defineProperty(this, 'height', {\n get: function get() {\n return playerHeight;\n }\n });\n Object.defineProperty(this, 'width', {\n get: function get() {\n return playerWidth;\n }\n });\n Object.defineProperty(this, 'playbackReadyPromise', {\n get: function get() {\n return _playbackReadyPromise;\n }\n });\n this.play = function () {\n player.playVideo();\n };\n this.pause = function () {\n player.pauseVideo();\n };\n this.attr = function (property, value) {\n var domPlayer = document.getElementById(iFrameId);\n domPlayer.setAttribute(property, value);\n };\n this.load = function () {\n _playbackReadyPromise.then(function () {\n player.cueVideoById(videoId, startTimeInSeconds);\n });\n };\n this.destroy = function () {\n if (player) {\n player.destroy();\n window.onYouTubeIframeAPIReady = null;\n }\n if (heartbeatIntervalId) {\n clearInterval(heartbeatIntervalId);\n }\n };\n var heartbeat = function heartbeat() {\n if (typeof player.getCurrentTime === 'undefined') {\n return;\n }\n playerState = player.getPlayerState();\n var time = player.getCurrentTime();\n if (currentTime !== time) {\n currentTime = time;\n dispatchEvent('timeupdate', time);\n }\n var videoLoadedFraction = player.getVideoLoadedFraction;\n if (typeof videoLoadedFraction === 'undefined' || videoLoadedFraction === null) {\n return;\n }\n var percentLoaded = player.getVideoLoadedFraction();\n if (loadedPercent !== percentLoaded) {\n loadedPercent = percentLoaded;\n dispatchEvent('progress');\n // not really sure on this, but if it's at 99%, should be able to play through...\n if (loadedPercent > 0.99) {\n dispatchEvent('canplaythrough');\n }\n }\n };\n heartbeatIntervalId = setInterval(heartbeat, 100);\n};\nvar addApi = function addApi() {\n addYouTubeApiReadyHandler();\n var youTubeApiFound = $(\"script[src='\" + youTubeApiUri + \"']\").length;\n if (!youTubeApiFound) {\n $.getScript(youTubeApiUri);\n }\n return !youTubeApiFound;\n};\nvar youTube = {\n create: YouTubePlayer,\n addApi: addApi\n};\n\n/**\n * @memberof TSC\n * @implement MediaView\n * @class YoutubeElementView\n * @classdesc Youtube Video element view\n * @param {jQuery} $rootContainer - Smart Player top container jquery element\n * @param {jQuery} $mediaContainer - Smart Player media container jquery element\n * @param {string} containerElementUniqueId - Smart Player main container id\n * @param {Array} mediaSources - html5 media DOM element (or wrapper presenting same interface)\n * @param {Function} firstPlayCallback - callback function called on the first play click\n */\nvar YoutubeElementView = function YoutubeElementView($rootContainer, $mediaContainer, containerElementUniqueId, mediaSources, firstPlayCallback) {\n var _youtubePlayer;\n var _errorMessageBarView;\n var _$youtubePointerEventWorkaround = $mediaContainer.find('.youtube-pointer-event-workaround');\n var addHideBubbleClass = function addHideBubbleClass() {\n $rootContainer.addClass(cssClasses.hideBubbleArrow);\n };\n var removeHideBubbleClass = function removeHideBubbleClass() {\n $rootContainer.removeClass(cssClasses.hideBubbleArrow);\n };\n\n // need to first MediaControlsReady event when using YouTube controls\n var internalFirstPlayCallback = function internalFirstPlayCallback() {\n firstPlayCallback && firstPlayCallback();\n };\n var onControlsHidden = function onControlsHidden() {\n if (playerConfiguration.getDisableYouTubeControls()) {\n _$youtubePointerEventWorkaround.removeClass(cssClasses.hide);\n }\n };\n var onControlsVisible = function onControlsVisible() {\n _$youtubePointerEventWorkaround.addClass(cssClasses.hide);\n };\n var processVideoEnd = function processVideoEnd() {\n return true;\n };\n var reshowVideoAfterClickToReplay = function reshowVideoAfterClickToReplay() {\n // do nothing\n };\n var bindToEvents = function bindToEvents() {\n $rootContainer.on(events.Controls.VideoControlsVisible, onControlsVisible);\n $rootContainer.on(events.Controls.VideoControlsHidden, onControlsHidden);\n };\n var unbindToEvents = function unbindToEvents() {\n $rootContainer.off(events.Controls.VideoControlsVisible, onControlsVisible);\n $rootContainer.off(events.Controls.VideoControlsHidden, onControlsHidden);\n };\n var destroy = function destroy() {\n if (_youtubePlayer) {\n _youtubePlayer.destroy();\n }\n removeHideBubbleClass();\n _errorMessageBarView && _errorMessageBarView.remove();\n unbindToEvents();\n };\n var showCaptionTrack = function showCaptionTrack() {\n // our captions are not shown over youtube videos\n };\n var hideCaptionTrack = function hideCaptionTrack() {\n // our captions are not shown over youtube videos\n };\n var addEventListener = function addEventListener(eventName, handler) {\n _youtubePlayer.addEventListener(eventName, handler);\n };\n var removeEventListener = function removeEventListener(eventName, handler) {\n _youtubePlayer.removeEventListener(eventName, handler);\n };\n var onError = function onError(event) {\n _errorMessageBarView = MessageBarView$1.create($rootContainer, messageBarType.info, event.data);\n };\n var hotfixViewAndControlsCSS = function hotfixViewAndControlsCSS($controlsView) {\n if (playerConfiguration.getDisableControls() || playerConfiguration.getDisableInteractions()) {\n // Quiz location logic needs the controls to have reasonable width and height.\n // But in the case when we are using YouTube controls we want the controls hidden\n // so they can't be interacted with. By pushing it behind the player with z-index\n // it accomplishes \"hiding\" the controls but still allowing the controls to take\n // up the correct width and height for the quiz marker location logic. Using\n // _$controls.hide() does not accomplish the same affect and that is why it is\n // avoided here.\n $controlsView.css('z-index', '-1');\n } else {\n _youtubePlayer.css('height', 'calc(100% - ' + $controlsView.height() + 'px)');\n }\n };\n addHideBubbleClass();\n var startTime = playerConfiguration.getJumpToTime();\n if (startTime !== undefined) {\n startTime = urlService.convertUrlTime(startTime);\n } else {\n startTime = 0;\n }\n var youtubeElementViewObject = Object.defineProperties({\n hotfixViewAndControlsCSS: hotfixViewAndControlsCSS,\n showCaptionTrack: showCaptionTrack,\n hideCaptionTrack: hideCaptionTrack,\n addEventListener: addEventListener,\n removeEventListener: removeEventListener,\n reshowVideoAfterClickToReplay: reshowVideoAfterClickToReplay,\n processVideoEnd: processVideoEnd,\n loadMedia: function loadMedia() {\n _youtubePlayer.load();\n },\n destroy: destroy\n }, {\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {jQuery} mediaWrapper - jQuery wrapper of the video element.\n */\n mediaWrapper: {\n get: function get() {\n return _youtubePlayer;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {HTMLVideoElement} mediaElement - HTML video element\n */\n mediaElement: {\n get: function get() {\n return _youtubePlayer;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Boolean} containsWebTrackCaptions - Does the video contain web track captions?\n */\n containsWebTrackCaptions: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {int} currentTimeInMilliseconds - The current time of the media, in milliseconds\n */\n currentTimeInMilliseconds: {\n get: function get() {\n var mediaElement = this.mediaElement;\n var currentTimeInSeconds = mediaElement.currentTime > mediaElement.duration ? mediaElement.duration : mediaElement.currentTime;\n return currentTimeInSeconds ? currentTimeInSeconds * 1000 : 0;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Number} mediaWidth - video width\n */\n mediaWidth: {\n get: function get() {\n return _youtubePlayer.width;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Number} mediaHeight - video height\n */\n mediaHeight: {\n get: function get() {\n return _youtubePlayer.height;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Boolean} - allows dragging extension content\n */\n canDragContentOnVideo: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {string} playerControlType - Type of player controls to use\n */\n playerControlType: {\n get: function get() {\n return playerControlsType.video;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {string} type - Media view type\n */\n type: {\n get: function get() {\n return mediaViewType.youtube;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {boolean} supportsClickToPlayControls - Does view support click to play controls over media\n */\n supportsClickToPlayControls: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {boolean} supportsSCORM - Does view support SCORM\n */\n supportsSCORM: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {TSC.VideoPlaybackQualityMetrics} playbackQualityMetrics - the playback quality metrics set up for this view (may be null)\n */\n playbackQualityMetrics: {\n get: function get() {\n return null;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {string} currentSrc - The current source path of the media\n */\n currentSrc: {\n get: function get() {\n return _youtubePlayer.currentSrc;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Number} currentTime - The current time for the media\n */\n currentTime: {\n get: function get() {\n return _youtubePlayer.currentTime;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Number} duration - The duration of the media\n */\n duration: {\n get: function get() {\n return _youtubePlayer.duration;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Boolean} ended - Has the media ended\n */\n ended: {\n get: function get() {\n return _youtubePlayer.ended;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Boolean} paused - Is the media paused\n */\n paused: {\n get: function get() {\n return _youtubePlayer.paused;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Boolean} seeking - Is the media seeking\n */\n seeking: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Number} volume - The volume of the media\n */\n volume: {\n get: function get() {\n return _youtubePlayer.volume;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Boolean} muted - Is the media muted\n */\n muted: {\n get: function get() {\n return _youtubePlayer.muted;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Number} playbackRate - Playback rate of the media\n */\n playbackRate: {\n get: function get() {\n return _youtubePlayer.playbackRate;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Array} buffered - THe array of buffered segments\n */\n buffered: {\n get: function get() {\n return _youtubePlayer.buffered;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Array} played - THe array of media segments that have been played\n */\n played: {\n get: function get() {\n return _youtubePlayer.played;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.YoutubeElementView\n * @property {Array} seekable - THe array of media segments that are seekable\n */\n seekable: {\n get: function get() {\n return _youtubePlayer.seekable;\n }\n }\n });\n youTube.addApi();\n return new Promise$1(function (resolve, reject) {\n try {\n var disableFullScreen = $rootContainer.playerState.mediaHasQuizQuestions;\n if (window.onYouTubeIframeAPIReady.ready) {\n _youtubePlayer = new youTube.create(mediaSources[0].uri, containerElementUniqueId, internalFirstPlayCallback, onError, $mediaContainer.width(), $mediaContainer.height(), startTime, disableFullScreen);\n bindToEvents();\n $rootContainer.trigger(events.Controls.HideIOOverlay);\n resolve(youtubeElementViewObject);\n } else {\n window.onYouTubeIframeAPIReady.queued.push(function () {\n _youtubePlayer = new youTube.create(mediaSources[0].uri, containerElementUniqueId, internalFirstPlayCallback, onError, $mediaContainer.width(), $mediaContainer.height(), startTime, disableFullScreen);\n bindToEvents();\n $rootContainer.trigger(events.Controls.HideIOOverlay);\n resolve(youtubeElementViewObject);\n });\n }\n } catch (_) {\n reject(new Error('unhandled error creating youtube element view'));\n }\n });\n};\nvar YoutubeElementView$1 = {\n create: YoutubeElementView\n};\n\nvar DEFAULT_SEGMENT_LENGTH = 30000;\nvar SEGMENT_CHOICES = [{\n duration: 300000,\n segmentLength: 2000\n}, {\n duration: 1800000,\n segmentLength: 5000\n}];\nvar _videoLoadStartTime;\nvar _videoLoadEndTime;\nvar _videoDuration = 0;\nvar _segmentLength = DEFAULT_SEGMENT_LENGTH;\nvar _numberSegments = 0;\nvar _videoSegments = [];\nvar _numberVideoSegmentWatched = 0;\nvar _currentPlayTime = 0;\nvar _enabled = false;\nvar videoAnalytics = {\n setVideoLoadStartTime: function setVideoLoadStartTime(time) {\n _videoLoadStartTime = time;\n },\n setVideoLoadEndTime: function setVideoLoadEndTime(time) {\n _videoLoadEndTime = time;\n },\n getVideoLoadTime: function getVideoLoadTime() {\n var loadTime = 0;\n if (_videoLoadStartTime && _videoLoadEndTime) {\n loadTime = _videoLoadEndTime - _videoLoadStartTime;\n }\n return loadTime;\n },\n getNumberSegments: function getNumberSegments() {\n return _numberSegments;\n },\n setCurrentPlayTime: function setCurrentPlayTime(time) {\n _currentPlayTime = time;\n },\n getCurrentPlayTime: function getCurrentPlayTime() {\n return _currentPlayTime;\n },\n getNumberWatchedSegments: function getNumberWatchedSegments() {\n return _numberVideoSegmentWatched;\n },\n isPercentWatchedInitialized: function isPercentWatchedInitialized() {\n return _videoDuration > 0;\n },\n clearPercentWatched: function clearPercentWatched() {\n _numberSegments = 0;\n _videoSegments = [];\n _numberVideoSegmentWatched = 0;\n _currentPlayTime = 0;\n _videoDuration = 0;\n },\n initPercentWatched: function initPercentWatched(videoDurationInMilliseconds) {\n if (videoDurationInMilliseconds <= 0) {\n return;\n }\n _videoDuration = videoDurationInMilliseconds;\n\n // determine video segment length\n _segmentLength = DEFAULT_SEGMENT_LENGTH;\n for (var i = 0; i < SEGMENT_CHOICES.length; i++) {\n if (videoDurationInMilliseconds <= SEGMENT_CHOICES[i].duration) {\n _segmentLength = SEGMENT_CHOICES[i].segmentLength;\n break;\n }\n }\n\n // create array to store percentage watched\n _videoSegments = [];\n _numberSegments = Math.ceil(videoDurationInMilliseconds / _segmentLength);\n for (var j = 0; j < _numberSegments; j++) {\n _videoSegments.push(false);\n }\n _numberVideoSegmentWatched = 0;\n },\n markTimeWatched: function markTimeWatched(videoTimeInMilliseconds) {\n videoTimeInMilliseconds = Math.min(videoTimeInMilliseconds, _videoDuration);\n _currentPlayTime = videoTimeInMilliseconds / 1000;\n var index = Math.floor(videoTimeInMilliseconds / _segmentLength);\n if (index < 0 || index >= _numberSegments) {\n return;\n }\n if (!_videoSegments[index]) {\n _numberVideoSegmentWatched++;\n _videoSegments[index] = true;\n }\n },\n getPercentageWatched: function getPercentageWatched() {\n if (_numberSegments && _numberSegments > 0) {\n return _numberVideoSegmentWatched / _numberSegments;\n }\n return 0;\n },\n getPercentageWatchedForVideoSegment: function getPercentageWatchedForVideoSegment(startTimeInMilliseconds, endTimeInMilliseconds) {\n var percentageWatched = 0;\n if (_videoDuration > 0 && startTimeInMilliseconds <= endTimeInMilliseconds) {\n var startSegmentIndex = Math.floor(startTimeInMilliseconds / _segmentLength);\n var endSegmentIndex = Math.floor(endTimeInMilliseconds / _segmentLength);\n var numberSegmentsWatched = 0;\n var totalSegmentsInRange = endSegmentIndex - startSegmentIndex + 1;\n for (var i = startSegmentIndex; i <= endSegmentIndex; i++) {\n if (_videoSegments[i]) {\n numberSegmentsWatched++;\n }\n }\n percentageWatched = numberSegmentsWatched / totalSegmentsInRange;\n }\n return percentageWatched;\n },\n setEnabled: function setEnabled(enabled) {\n _enabled = enabled;\n },\n isEnabled: function isEnabled() {\n return _enabled;\n },\n getVideoSegmentSnapShot: function getVideoSegmentSnapShot() {\n return _videoSegments.map(function (segmentValue) {\n return segmentValue === true ? '1' : '0';\n }).join(',');\n },\n populateVideoSegmentsWatch: function populateVideoSegmentsWatch(videoSegmentSnapshot) {\n var videoSegmentSnapshotList = videoSegmentSnapshot.split(',');\n if (_videoSegments.length !== videoSegmentSnapshotList.length) {\n return;\n }\n videoSegmentSnapshotList.forEach(function (segmentValue, index) {\n if (segmentValue === '1') {\n _numberVideoSegmentWatched++;\n _videoSegments[index] = true;\n }\n });\n }\n};\n\n/**\n * @memberof TSC\n * @implement MediaView\n * @class PlaylistElementView\n * @classdesc HTML 5 Video element view\n * @param {jQuery} $rootContainer - Smart Player main container jquery element\n * @param {jQuery} $mediaContainer - Smart Player media container jquery element\n * @param {MediaList} mediaList - the media sources to use when creating the view\n * @param {Boolean} includeControls - Include the built in controls for the video element\n * @param {Function} triggerRumDataEvent - Callback function to use when triggering rum data event\n * @param {Function} firstPlayCallback - callback function called on the first play click\n * @param {Boolean} [includePosterIfAvailable=false] - Include the poster image if available\n */\nvar PlaylistElementView = function PlaylistElementView($rootContainer, $mediaContainer, mediaList, includeControls, triggerRumDataEvent, firstPlayCallback, includePosterIfAvailable) {\n var _videoElementView = VideoElementView$1.create($rootContainer, $mediaContainer, mediaList.mediaList, includeControls, triggerRumDataEvent, firstPlayCallback, includePosterIfAvailable);\n var initCurrentMedia = function initCurrentMedia() {\n _videoElementView.mediaElement.src = mediaList.currentMedia.media;\n if (videoAnalytics.isEnabled()) {\n videoAnalytics.clearPercentWatched();\n }\n $mediaContainer.trigger(events.Media.InitializeCurrent, {\n enablePreviousButton: !mediaList.onFirstMedia,\n enableNextButton: !mediaList.onLastMedia\n });\n };\n var clickPrevHandler = function clickPrevHandler() {\n if (!mediaList.onFirstMedia) {\n mediaList.currentMediaIndex = 'previous';\n initCurrentMedia();\n }\n };\n var clickNextHandler = function clickNextHandler() {\n if (!mediaList.onLastMedia) {\n mediaList.currentMediaIndex = 'next';\n initCurrentMedia();\n }\n };\n var processVideoEnd = function processVideoEnd() {\n var wasPlaylistLastMediaItem = mediaList.onLastMedia;\n if (!wasPlaylistLastMediaItem) {\n mediaList.currentMediaIndex = 'next';\n initCurrentMedia();\n }\n return wasPlaylistLastMediaItem;\n };\n var restartPlaybackAtBeginning = function restartPlaybackAtBeginning() {\n mediaList.currentMediaIndex = 0;\n initCurrentMedia();\n };\n var destroy = function destroy() {\n $rootContainer.off(events.Controls.ClickPrev, clickPrevHandler);\n $rootContainer.off(events.Controls.ClickNext, clickNextHandler);\n $rootContainer.off(events.Media.SourceChanged, initCurrentMedia);\n _videoElementView.destroy();\n };\n var hotfixViewAndControlsCSS = function hotfixViewAndControlsCSS($controlsView) {}; // eslint-disable-line\n\n $rootContainer.on(events.Controls.ClickNext, clickNextHandler);\n $rootContainer.on(events.Controls.ClickPrev, clickPrevHandler);\n $rootContainer.on(events.Media.SourceChanged, initCurrentMedia);\n return Object.defineProperties({\n hotfixViewAndControlsCSS: hotfixViewAndControlsCSS,\n showCaptionTrack: _videoElementView.showCaptionTrack,\n hideCaptionTrack: _videoElementView.hideCaptionTrack,\n addEventListener: _videoElementView.addEventListener,\n removeEventListener: _videoElementView.removeEventListener,\n reshowVideoAfterClickToReplay: restartPlaybackAtBeginning,\n processVideoEnd: processVideoEnd,\n loadMedia: _videoElementView.loadMedia,\n destroy: destroy\n }, {\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {jQuery} mediaWrapper - jQuery wrapper of the video element.\n */\n mediaWrapper: {\n get: function get() {\n return _videoElementView.mediaWrapper;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {HTMLVideoElement} mediaElement - HTML video element\n */\n mediaElement: {\n get: function get() {\n return _videoElementView.mediaElement;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Boolean} containsWebTrackCaptions - Does the video contain web track captions?\n */\n containsWebTrackCaptions: {\n get: function get() {\n return _videoElementView.containsWebTrackCaptions;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {int} currentTimeInMilliseconds - The current time of the media, in milliseconds\n */\n currentTimeInMilliseconds: {\n get: function get() {\n return _videoElementView.currentTimeInMilliseconds;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Number} mediaWidth - video width\n */\n mediaWidth: {\n get: function get() {\n return _videoElementView.mediaWidth;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Number} mediaHeight - video height\n */\n mediaHeight: {\n get: function get() {\n return _videoElementView.mediaHeight;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Boolean} - allows dragging extension content\n */\n canDragContentOnVideo: {\n get: function get() {\n return true;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {string} playerControlType - Type of player controls to use\n */\n playerControlType: {\n get: function get() {\n return playerControlsType.videoPlaylist;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {string} type - Media view type\n */\n type: {\n get: function get() {\n return mediaViewType.playlist;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {boolean} supportsClickToPlayControls - Does view support click to play controls over media\n */\n supportsClickToPlayControls: {\n get: function get() {\n return true;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {boolean} supportsSCORM - Does view support SCORM\n */\n supportsSCORM: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {TSC.VideoPlaybackQualityMetrics} playbackQualityMetrics - the playback quality metrics set up for this view (may be null)\n */\n playbackQualityMetrics: {\n get: function get() {\n return _videoElementView.playbackQualityMetrics;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {string} currentSrc - The current source path of the media\n */\n currentSrc: {\n get: function get() {\n return _videoElementView.currentSrc;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Number} currentTime - The current time for the media\n */\n currentTime: {\n get: function get() {\n return _videoElementView.currentTime;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Number} duration - The duration of the media\n */\n duration: {\n get: function get() {\n return _videoElementView.duration;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Boolean} ended - Has the media ended\n */\n ended: {\n get: function get() {\n return _videoElementView.ended;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Boolean} paused - Is the media paused\n */\n paused: {\n get: function get() {\n return _videoElementView.paused;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Boolean} seeking - Is the media seeking\n */\n seeking: {\n get: function get() {\n return _videoElementView.seeking;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Number} volume - The volume of the media\n */\n volume: {\n get: function get() {\n return _videoElementView.volume;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Boolean} muted - Is the media muted\n */\n muted: {\n get: function get() {\n return _videoElementView.muted;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Number} playbackRate - Playback rate of the media\n */\n playbackRate: {\n get: function get() {\n return _videoElementView.playbackRate;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Array} buffered - THe array of buffered segments\n */\n buffered: {\n get: function get() {\n return _videoElementView.buffered;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Array} played - THe array of media segments that have been played\n */\n played: {\n get: function get() {\n return _videoElementView.played;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {Array} seekable - THe array of media segments that are seekable\n */\n seekable: {\n get: function get() {\n return _videoElementView.seekable;\n }\n }\n });\n};\nvar PlaylistElementView$1 = {\n create: PlaylistElementView\n};\n\nvar switchToFullScreenMode = function switchToFullScreenMode(elementToFullScreen) {\n if (elementToFullScreen.requestFullscreen) {\n elementToFullScreen.requestFullscreen();\n } else if (elementToFullScreen.webkitRequestFullscreen) {\n elementToFullScreen.webkitRequestFullscreen();\n } else if (elementToFullScreen.webkitEnterFullscreen) {\n // legacy iOS full screen api\n elementToFullScreen.webkitEnterFullscreen();\n }\n};\nvar exitFullscreenMode = function exitFullscreenMode(fullScreenElement) {\n if (window.document.exitFullscreen) {\n window.document.exitFullscreen();\n } else if (window.document.webkitExitFullscreen) {\n window.document.webkitExitFullscreen();\n } else if (fullScreenElement && fullScreenElement.webkitExitFullscreen) {\n // legacy iOS full screen api\n fullScreenElement.webkitExitFullscreen();\n }\n};\nvar fullscreenHelper = {\n switchToFullscreenMode: switchToFullScreenMode,\n exitFullscreenMode: exitFullscreenMode\n};\n\n/**\n * @memberof TSC\n * @implement MediaView\n * @class ImageView\n * @classdesc Image View @param {jQuery} $rootContainer - Smart Player main container jquery element\n * @param {jQuery} $rootContainer - Smart Player main container jquery element\n * @param {jQuery} $mediaContainer - Smart Player media container jquery element\n * @param {string} containerElementUniqueId - ID for container element\n * @param {string} imageSrc - Image source\n*/\nvar ImageView = function ImageView($rootContainer, $mediaContainer, containerElementUniqueId, imageSrc) {\n var _$imageEl;\n var _imageTapActive = true; // default to active\n var _$document = windowWrapper.getDocument(true);\n var onImageError = function onImageError(e) {\n e.preventDefault();\n $mediaContainer.trigger(events.Media.Error, {\n errorString: localizationStrings.getPlayerString(playerStringNames.mediaNotFound)\n });\n _$imageEl.hide();\n };\n var setBackgroundImage = function setBackgroundImage() {\n _$imageEl.attr('src', imageSrc);\n };\n var switchToFullscreenMode = function switchToFullscreenMode() {\n fullscreenHelper.switchToFullscreenMode($rootContainer[0]);\n };\n var exitFullscreenMode = function exitFullscreenMode() {\n fullscreenHelper.exitFullscreenMode();\n };\n var onFullscreenChange = function onFullscreenChange() {\n if (_$document[0].fullscreenElement) {\n $rootContainer.addClass('fullscreen-mode');\n } else {\n $rootContainer.removeClass('fullscreen-mode');\n }\n };\n var initDom = function initDom() {\n var imageViewMarkup = templateGenerator.generateImageMarkup(containerElementUniqueId);\n $mediaContainer.html(imageViewMarkup);\n _$imageEl = $mediaContainer.find('.smart-player-image-media');\n };\n var createView = function createView() {\n initDom();\n };\n var loadImage = function loadImage() {\n setBackgroundImage();\n\n // simulate the loadedmetadata html5 video events, must be dispatchEvent as jQuery events dont propagate to addEventListener\n _$imageEl[0].dispatchEvent(new Event(events.ExternalVideo.VideoLoadedMetadata));\n _$imageEl[0].dispatchEvent(new Event(events.ExternalVideo.VideoLoadedData));\n };\n var destroy = function destroy() {\n _$imageEl.off('pointerup', onImageTouchToggle);\n _$imageEl.off('click', switchToFullscreenMode);\n _$imageEl.off('error', onImageError);\n _$document.off('fullscreenchange', onFullscreenChange);\n $rootContainer.off(events.External.SwitchToFullscreen, switchToFullscreenMode);\n $rootContainer.off(events.External.ExitFullscreen, exitFullscreenMode);\n };\n var onImageTouchToggle = function onImageTouchToggle() {\n _imageTapActive = !_imageTapActive;\n if (_imageTapActive) {\n $rootContainer.trigger(events.Images.PointerOver);\n } else {\n $rootContainer.trigger(events.Images.PointerLeave);\n }\n };\n var initializeHandlers = function initializeHandlers() {\n if (deviceInfo.isTouchInterface()) {\n _$imageEl.on('pointerup', onImageTouchToggle);\n }\n _$imageEl.on('click', switchToFullscreenMode);\n _$imageEl.on('error', onImageError);\n _$document.on('fullscreenchange', onFullscreenChange);\n $rootContainer.on(events.External.SwitchToFullscreen, switchToFullscreenMode);\n $rootContainer.on(events.External.ExitFullscreen, exitFullscreenMode);\n };\n createView();\n initializeHandlers();\n var noOp = function noOp() {}; // eslint-disable-line\n var hotfixViewAndControlsCSS = function hotfixViewAndControlsCSS($controlsView) {}; // eslint-disable-line\n\n return Object.defineProperties({\n hotfixViewAndControlsCSS: hotfixViewAndControlsCSS,\n // these are only defined on the image view\n exitFullscreenMode: exitFullscreenMode,\n switchToFullscreenMode: switchToFullscreenMode,\n // the rest of these are standard media element view\n showCaptionTrack: noOp,\n hideCaptionTrack: noOp,\n addEventListener: noOp,\n removeEventListener: noOp,\n reshowVideoAfterClickToReplay: noOp,\n processVideoEnd: noOp,\n loadMedia: loadImage,\n destroy: destroy\n }, {\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {jQuery} mediaWrapper - jQuery wrapper of the imagre element.\n */\n mediaWrapper: {\n get: function get() {\n return _$imageEl;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {HTMLImageElement} mediaElement - HTML image element\n */\n mediaElement: {\n get: function get() {\n return _$imageEl[0];\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Boolean} containsWebTrackCaptions - Does the view contain web track captions?\n */\n containsWebTrackCaptions: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.PlaylistElementView\n * @property {int} currentTimeInMilliseconds - The current time of the media, in milliseconds\n */\n currentTimeInMilliseconds: {\n get: function get() {\n return 0;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Number} mediaWidth - image width\n */\n mediaWidth: {\n get: function get() {\n return this.mediaElement.naturalWidth;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Number} mediaHeight - image height\n */\n mediaHeight: {\n get: function get() {\n return this.mediaElement.naturalHeight;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Boolean} - allows dragging extension content\n */\n canDragContentOnVideo: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {string} playerControlType - Type of player controls to use\n */\n playerControlType: {\n get: function get() {\n return playerControlsType.none;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {string} type - Media view type\n */\n type: {\n get: function get() {\n return mediaViewType.image;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {boolean} supportsClickToPlayControls - Does view support click to play controls over media\n */\n supportsClickToPlayControls: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {boolean} supportsSCORM - Does view support SCORM\n */\n supportsSCORM: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {TSC.VideoPlaybackQualityMetrics} playbackQualityMetrics - the playback quality metrics set up for this view (may be null)\n */\n playbackQualityMetrics: {\n get: function get() {\n return null;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {string} currentSrc - The current source path of the media\n */\n currentSrc: {\n get: function get() {\n return imageSrc;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Number} currentTime - The current time for the media\n */\n currentTime: {\n get: function get() {\n return 0;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Number} duration - The duration of the media\n */\n duration: {\n get: function get() {\n return 0;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Boolean} ended - Has the media ended\n */\n ended: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Boolean} paused - Is the media paused\n */\n paused: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Boolean} seeking - Is the media seeking\n */\n seeking: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Number} volume - The volume of the media\n */\n volume: {\n get: function get() {\n return 1;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Boolean} muted - Is the media muted\n */\n muted: {\n get: function get() {\n return false;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Number} playbackRate - Playback rate of the media\n */\n playbackRate: {\n get: function get() {\n return 1;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Array} buffered - THe array of buffered segments\n */\n buffered: {\n get: function get() {\n return [];\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Array} played - THe array of media segments that have been played\n */\n played: {\n get: function get() {\n return [];\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.ImageView\n * @property {Array} seekable - THe array of media segments that are seekable\n */\n seekable: {\n get: function get() {\n return [];\n }\n }\n });\n};\nvar ImageView$1 = {\n /**\n * Factory method that returns a new ImageView object.\n * @function create\n * @memberof TSC.ImageView\n * @static\n * @param {jQuery} $rootContainer - Smart Player main container jquery element\n * @param {jQuery} $mediaContainer - Smart Player media container jquery element\n * @param {string} containerElementUniqueId - ID for container element\n * @param {string} imageSrc - Image source\n * @return new ImageView instance\n */\n create: ImageView\n};\n\n/**\n * Interface for a media view\n *\n * @interface MediaView\n *\n * @property {jQuery} mediaWrapper - jQuery wrapper around media element\n * @property {HTMLImageElement|HTMLVideoElement} mediaElement - reference to the media element.\n * @property {Boolean} containsWebTrackCaptions - Does the view contain web track captions\n * @property {Number} mediaWidth - Width of the media\n * @property {Number} mediaHeight - Height of the media\n * @property {string} playerControlType - Type of controls to use with view.\n * @property {String} type - The view type\n * @property {Boolean} supportsClickToPlayControls - View supports click to play controls\n * @property {Boolean} supportsSCORM - Does the media view support SCORM.\n * @property {TSC.VideoPlaybackQualityMetrics} playbackQualityMetrics - Video playback quality metrics instance for view\n * @property {String} currentSrc - Current source string\n * @property {Number} currentTime - Current time of the media\n * @property {Number} duration - The duration of the media\n * @property {Boolean} ended - Has the media ended\n * @property {Boolean} paused - Is the media paused\n * @property {Boolean} seeking - Is the media seeking\n * @property {Number} volume - Volume of the media\n * @property {Boolean} muted - Is media muted\n * @property {Number} playbackRate - Playback rate of the media\n * @property {Array} buffered - The array of segments the media has buffered\n * @property {Array} played - The array of media segments that have been played\n * @property {Array} seekable - The array of media segments that are seekable\n */\n\n/**\n * @memberof TSC\n * @class MediaViewFactory\n * @classdesc Media View Factory\n * @param {JQuery} $rootContainer - Smart Player top-level container\n * @param {JQuery} $mediaContainer - Smart Player container of media viewport\n * @param {string} containerElementUniqueId - Smart Player main container id\n * @param {TSC.MediaList} mediaList - the media sources to use when creating the view\n * @param {Function} firstPlayCallback - callback function called on the first play click\n * @param {Function} triggerRumDataEvent - Callback function to use when triggering rum data event\n *\n */\nvar MediaViewFactory = function MediaViewFactory($rootContainer, $mediaContainer, containerElementUniqueId, mediaList, firstPlayCallback, triggerRumDataEvent) {\n var includeControls = false;\n var haveYoutubeEmbedUrl = mediaList.isMediaTypeAvailable(mediaType.YOUTUBE);\n var createBaseVideoViewMarkup = function createBaseVideoViewMarkup() {\n var playerMarkup = templateGenerator.generateVideoViewMarkup(containerElementUniqueId);\n $mediaContainer.html(playerMarkup);\n };\n if (!mediaList.hasImage) {\n createBaseVideoViewMarkup();\n }\n if (haveYoutubeEmbedUrl) {\n $mediaContainer.addClass(cssClasses.mediaTypeYouTube);\n return YoutubeElementView$1.create($rootContainer, $mediaContainer, containerElementUniqueId, mediaList.mediaList, firstPlayCallback);\n }\n if (mediaList.isPlaylist) {\n return Promise$1.resolve(PlaylistElementView$1.create($rootContainer, $mediaContainer, mediaList, includeControls, triggerRumDataEvent, firstPlayCallback));\n }\n if (mediaList.hasImage) {\n return Promise$1.resolve(ImageView$1.create($rootContainer, $mediaContainer, containerElementUniqueId, mediaList.currentMedia.media));\n }\n return Promise$1.resolve(VideoElementView$1.create($rootContainer, $mediaContainer, mediaList.mediaList, includeControls, triggerRumDataEvent, firstPlayCallback));\n};\nvar MediaViewFactory$1 = {\n /**\n * Factory method that returns a new MediaViewFactory.\n * @function create\n * @memberof TSC.MediaViewFactory\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {string} videoTagUniqueId - Smart Player main container id\n * @param {MediaList} mediaList - the media sources to use when creating the view\n * @param {Function} firstPlayCallback - callback function called on the first play click\n * @param {Function} triggerRumDataEvent - Callback function to use when triggering rum data event\n * @return new Promise that resolves a MediaViewFactory instance\n */\n createView: MediaViewFactory\n};\n\nvar highlightProperty = 'outline-style';\nvar disableHighlights = function disableHighlights($element) {\n $element.css(highlightProperty, 'none').on('blur', function () {\n $element.off('blur').css(highlightProperty, '');\n });\n};\nvar disableHighlightsOnMouseClick = function disableHighlightsOnMouseClick($element, e) {\n if (e.screenX || e.screenY) {\n disableHighlights($element);\n }\n};\nvar checkIfElementIsHighlighted = function checkIfElementIsHighlighted($element) {\n var highlightState = $element.css(highlightProperty);\n return highlightState !== 'none' && highlightState !== '';\n};\nvar highlightDisabler = {\n disableHighlights: disableHighlights,\n disableHighlightsOnMouseClick: disableHighlightsOnMouseClick,\n checkIfElementIsHighlighted: checkIfElementIsHighlighted\n};\n\nvar _keyTypes = Object.freeze({\n escape: 1,\n space: 2,\n leftArrow: 3,\n upArrow: 4,\n rightArrow: 5,\n downArrow: 6,\n tab: 7,\n enter: 8,\n tableOfContents: 9\n});\nvar isKeyPassedOfSameType = function isKeyPassedOfSameType(key, type) {\n switch (key.toLowerCase()) {\n case 'esc': // IE11 and Edge\n case 'escape':\n return type === _keyTypes.escape;\n case 'spacebar': // IE11\n case ' ':\n return type === _keyTypes.space;\n case 'left': // IE11 and Edge\n case 'arrowleft':\n return type === _keyTypes.leftArrow;\n case 'up': // IE11 and Edge\n case 'arrowup':\n return type === _keyTypes.upArrow;\n case 'right': // IE11 and Edge\n case 'arrowright':\n return type === _keyTypes.rightArrow;\n case 'down': // IE11 and Edge\n case 'arrowdown':\n return type === _keyTypes.downArrow;\n case 'tab':\n return type === _keyTypes.tab;\n case 'enter':\n return type === _keyTypes.enter;\n default:\n return isKeyOfLanguageSpecificType(key.toLowerCase(), type);\n }\n};\nvar isKeyOfLanguageSpecificType = function isKeyOfLanguageSpecificType(key, type) {\n switch (localizationStrings.getLanguage()) {\n case languageCodes.ENGLISH:\n return isKeyOfEnglishSpecificType(key, type);\n case languageCodes.GERMAN:\n return isKeyOfGermanSpecificType(key, type);\n case languageCodes.JAPANESE:\n return isKeyOfJapaneseSpecificType(key, type);\n default:\n return false;\n }\n};\nvar isKeyOfEnglishSpecificType = function isKeyOfEnglishSpecificType(key, type) {\n switch (key) {\n case 't':\n return type === _keyTypes.tableOfContents;\n default:\n return false;\n }\n};\nvar isKeyOfGermanSpecificType = function isKeyOfGermanSpecificType(key, type) {\n switch (key) {\n case 'i':\n return type === _keyTypes.tableOfContents;\n default:\n return false;\n }\n};\nvar isKeyOfJapaneseSpecificType = function isKeyOfJapaneseSpecificType(key, type) {\n switch (key) {\n case 't':\n return type === _keyTypes.tableOfContents;\n default:\n return false;\n }\n};\nvar isKeyOfType = function isKeyOfType(key) {\n for (var i = 1; i < arguments.length; ++i) {\n if (isKeyPassedOfSameType(key, arguments[i])) {\n return true;\n }\n }\n return false;\n};\nvar keys = Object.defineProperties({\n isKeyOfType: isKeyOfType\n}, {\n keyTypes: {\n get: function get() {\n return _keyTypes;\n }\n }\n});\n\nvar _previousActiveElement;\nvar _previousActiveElementWasHighlighted;\nvar _$focusTrapElement = null;\nvar _firstFocusableEl = null;\nvar _lastFocusableEl = null;\nvar _$window$1 = $(window);\nvar scrollActiveElementIntoView = function scrollActiveElementIntoView() {\n try {\n var activeElement = document.activeElement;\n if (activeElement) {\n scrollIntoView(activeElement);\n }\n } catch (e) {\n /* eslint no-empty:'off' */\n }\n};\nvar scrollIntoView = function scrollIntoView(e) {\n setTimeout(function () {\n var element = e.currentTarget ? e.currentTarget : e;\n var container = $(element).scrollParent();\n if (!element || !container || !element.scrollIntoViewIfNeeded) {\n return;\n }\n\n // Android uses container innerHeight while ios uses window innerHeight\n var elementFitsInsideContainer = element.offsetHeight <= container.innerHeight() && element.offsetHeight < window.innerHeight;\n element.scrollIntoViewIfNeeded(elementFitsInsideContainer);\n }, 200);\n};\nvar saveActiveElement = function saveActiveElement() {\n try {\n _previousActiveElement = document.activeElement;\n _previousActiveElementWasHighlighted = highlightDisabler.checkIfElementIsHighlighted($(document.activeElement));\n } catch (e) {\n /* eslint no-empty:'off' */\n }\n};\nvar disableHighlightsOnPreviousActiveElement = function disableHighlightsOnPreviousActiveElement() {\n if (_previousActiveElement) {\n var $previousActiveElement = $(_previousActiveElement);\n if (!_previousActiveElementWasHighlighted) {\n highlightDisabler.disableHighlights($previousActiveElement);\n }\n }\n};\nvar focusPreviousElement = function focusPreviousElement() {\n if (_previousActiveElement) {\n var $previousActiveElement = $(_previousActiveElement);\n $previousActiveElement.focus();\n disableHighlightsOnPreviousActiveElement();\n }\n};\nvar elementOrChildHasFocus = function elementOrChildHasFocus($element) {\n try {\n return $element.is(':focus') || $element.has(document.activeElement).length > 0;\n } catch (e) {\n return false;\n }\n};\nvar getActiveElement = function getActiveElement(document) {\n document = document || window.document;\n if (document.body === document.activeElement || document.activeElement.tagName.toLowerCase() === 'iframe') {\n var iframes = document.getElementsByTagName('iframe');\n for (var i = 0; i < iframes.length; i++) {\n var focused = getActiveElement(iframes[i].contentWindow.document);\n if (focused !== false) {\n return focused;\n }\n }\n } else {\n return document.activeElement;\n }\n return false;\n};\nvar onFocusTrapTab = function onFocusTrapTab(e) {\n var isTabPressed = keys.isKeyOfType(e.key, keys.keyTypes.tab);\n if (!isTabPressed) {\n return;\n }\n if (e.shiftKey && document.activeElement === _firstFocusableEl) {\n _lastFocusableEl.focus();\n e.preventDefault();\n } else if (!e.shiftKey && document.activeElement === _lastFocusableEl) {\n _firstFocusableEl.focus();\n e.preventDefault();\n }\n};\nvar removeFocusTrap = function removeFocusTrap() {\n if (!_$focusTrapElement) {\n return;\n }\n _$focusTrapElement.off('keydown', onFocusTrapTab);\n _firstFocusableEl = null;\n _lastFocusableEl = null;\n};\nvar trapFocus = function trapFocus($element) {\n if (_$focusTrapElement) {\n removeFocusTrap();\n }\n _$focusTrapElement = $element;\n var focusableEls = $element.find('a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type=\"text\"]:not([disabled]), input[type=\"email\"]:not([disabled]), input[type=\"radio\"]:not([disabled]), input[type=\"checkbox\"]:not([disabled]), select:not([disabled])');\n _firstFocusableEl = focusableEls[0];\n _lastFocusableEl = focusableEls[focusableEls.length - 1];\n _$focusTrapElement.on('keydown', onFocusTrapTab);\n};\nvar init$1 = function init() {\n _$window$1.blur(saveActiveElement).focus(disableHighlightsOnPreviousActiveElement);\n};\ninit$1();\nvar viewHelper = {\n trapFocus: trapFocus,\n removeFocusTrap: removeFocusTrap,\n scrollActiveElementIntoView: scrollActiveElementIntoView,\n scrollIntoView: scrollIntoView,\n saveActiveElement: saveActiveElement,\n focusPreviousElement: focusPreviousElement,\n elementOrChildHasFocus: elementOrChildHasFocus,\n getActiveElement: getActiveElement\n};\n\nvar rightParenRegex$1 = /\\)/gi;\nvar leftParenRegex$1 = /\\(/gi;\nvar playReplayControlStates = Object.freeze({\n none: 'none',\n playVideoDisplayed: 'playVideo',\n replayVideoDisplayed: 'replayVideo'\n});\n\n/**\n * @memberof TSC\n * @class BeforeAfterPlayControlsView\n * @param {jQuery} $container - Smart Player root dom element\n * @param {Object} playerConfiguration - Player configuration object\n * @classdesc View containing the large play video and replay video buttons at the beginning and end of videos\n */\nvar BeforeAfterPlayControlsView = function BeforeAfterPlayControlsView($container, playerConfiguration) {\n var _markup;\n var _$videoClickToPlayLink;\n var _$videoClickToReplayLink;\n var _$videoClickToPlayGraphic;\n var _$videoClickToReplayGraphic;\n var _$pluginContainer;\n var _viewState = playReplayControlStates.none;\n var onPlayHandler = function onPlayHandler(e) {\n e.preventDefault();\n e.stopPropagation();\n if (playerConfiguration.disableInteractions) {\n return;\n }\n hideVideoClickToPlayLink();\n $container.trigger(events.Controls.HeroPlayControlClicked);\n };\n var showVideoClickToPlayLink = function showVideoClickToPlayLink() {\n _viewState = playReplayControlStates.playVideoDisplayed;\n _$videoClickToPlayLink.show();\n $container.trigger(events.Controls.HeroPlayControlVisible);\n };\n var hideVideoClickToPlayLink = function hideVideoClickToPlayLink() {\n _viewState = playReplayControlStates.none;\n _$videoClickToPlayLink.hide();\n $container.trigger(events.Controls.HeroPlayControlHidden);\n };\n var setVideoClickToPlayErrorState = function setVideoClickToPlayErrorState(state) {\n if (state) {\n _$videoClickToPlayLink.addClass('video-click-to-play-error');\n } else {\n _$videoClickToPlayLink.removeClass('video-click-to-play-error');\n }\n };\n var hideVideoClickToReplayLink = function hideVideoClickToReplayLink() {\n if (_viewState === playReplayControlStates.replayVideoDisplayed) {\n _viewState = playReplayControlStates.none;\n _$videoClickToReplayLink.hide();\n $container.trigger(events.Controls.ReplayControlHidden);\n }\n };\n var showVideoClickToReplayLink = function showVideoClickToReplayLink() {\n _viewState = playReplayControlStates.replayVideoDisplayed;\n _$videoClickToReplayLink.show();\n $container.trigger(events.Controls.ReplayControlVisible);\n if (viewHelper.elementOrChildHasFocus($container)) {\n _$videoClickToReplayGraphic.focus();\n highlightDisabler.disableHighlights(_$videoClickToReplayGraphic);\n }\n };\n var addVideoClickToPlayBackground = function addVideoClickToPlayBackground(posterSrc) {\n posterSrc = posterSrc.replace(rightParenRegex$1, '\\\\\\)');\n posterSrc = posterSrc.replace(leftParenRegex$1, '\\\\\\(');\n var url = 'url(' + posterSrc + ')';\n _$videoClickToPlayLink.css('background-image', url);\n _$videoClickToReplayLink.css('background-image', url);\n };\n var replayHandler = function replayHandler(e) {\n e.stopPropagation();\n hideVideoClickToReplayLink();\n $container.trigger(events.Media.Replay);\n };\n var disableControls = function disableControls() {\n _$videoClickToReplayGraphic && _$videoClickToReplayGraphic.attr('tabindex', tabIndex.Disabled);\n };\n var enableControls = function enableControls() {\n _$videoClickToReplayGraphic && _$videoClickToReplayGraphic.attr('tabindex', tabIndex.DomOrder);\n };\n var toggleFullscreen = function toggleFullscreen() {\n $container.trigger(events.Controls.ToggleFullScreen);\n };\n var createView = function createView() {\n _markup = templateGenerator.generateBeforeAfterPlayControlsMarkup();\n $container.find('.before-after-play-controls').html(_markup);\n _$videoClickToPlayLink = $container.find('.video-click-to-play-link');\n _$videoClickToReplayLink = $container.find('.video-click-to-replay-link');\n _$videoClickToPlayGraphic = $container.find('.video-click-to-play');\n _$videoClickToReplayGraphic = $container.find('.video-click-to-replay');\n _$pluginContainer = $container.find('.before-after-plugin-container');\n _$videoClickToReplayLink.hide();\n if (viewHelper.elementOrChildHasFocus($container)) {\n _$videoClickToPlayGraphic.focus();\n highlightDisabler.disableHighlights(_$videoClickToPlayGraphic);\n }\n };\n var initPlugins = function initPlugins(event, data) {\n var pluginController = playerConfiguration.getPluginController();\n if (pluginController && data.viewElementType === supportedPluginViewElements.BEFORE_AFTER_PLAY_CONTROLS) {\n pluginController.initializePluginsForViewElement(supportedPluginViewElements.BEFORE_AFTER_PLAY_CONTROLS, _$pluginContainer);\n }\n };\n var bindEvents = function bindEvents() {\n $container.on(events.Media.TryToAutoPlay, hideVideoClickToPlayLink);\n $container.on(events.Modals.Open, disableControls);\n $container.on(events.Modals.Closed, enableControls);\n $container.on(events.Plugin.Added, initPlugins);\n _$videoClickToReplayLink.on('dblclick', toggleFullscreen);\n _$videoClickToReplayGraphic.on('click', replayHandler);\n _$videoClickToPlayLink.on('click', onPlayHandler);\n };\n var disableClickToPlayEvents = function disableClickToPlayEvents() {\n _$videoClickToPlayLink.addClass('noClickToPlayEvents');\n };\n var destroy = function destroy() {\n $container.off(events.Media.TryToAutoPlay, hideVideoClickToPlayLink);\n $container.off(events.Modals.Open, disableControls);\n $container.off(events.Modals.Closed, enableControls);\n $container.off(events.Plugin.Added, initPlugins);\n _$videoClickToReplayLink.off('dblclick', toggleFullscreen);\n _$videoClickToReplayGraphic.off('click', replayHandler);\n _$videoClickToPlayLink.off('click', onPlayHandler);\n };\n createView();\n bindEvents();\n return Object.defineProperties({\n showVideoClickToPlayLink: showVideoClickToPlayLink,\n hideVideoClickToPlayLink: hideVideoClickToPlayLink,\n setVideoClickToPlayErrorState: setVideoClickToPlayErrorState,\n hideVideoClickToReplayLink: hideVideoClickToReplayLink,\n showVideoClickToReplayLink: showVideoClickToReplayLink,\n addVideoClickToPlayBackground: addVideoClickToPlayBackground,\n disableClickToPlayEvents: disableClickToPlayEvents,\n destroy: destroy\n }, {\n viewState: {\n get: function get() {\n return _viewState;\n }\n }\n });\n};\nvar BeforeAfterPlayControlsView$1 = {\n /**\n * Factory method that returns a new BeforeAfterPlayControlsView object.\n * @function create\n * @memberof TSC.BeforeAfterPlayControlsView\n * @static\n * @param {jQuery} $container - Smart Player root dom element\n * @param {Object} playerConfiguration - Player configuration object\n * @return new BeforeAfterPlayControlsView instance\n */\n create: BeforeAfterPlayControlsView\n};\n\nvar mouseButtons = Object.freeze({\n mainButton: 0,\n auxiliaryButton: 1,\n secondaryButton: 2\n});\n\n/**\n * @memberof TSC\n * @class ProgressChapterModel\n * @classdesc Progress Chapter View Model\n * @param {Number} index - Index of the chapter\n * @param {String} name - Chapter name\n * @param {Number} startTime - Start time of the video for the chapter (in seconds)\n * @param {Number} startAsPercent - Percentage of the video when the chapter starts\n * @param {Number} endAsPercent - Percentage of the video when the chapter ends\n * @param {Number} durationAsPercent - Duration of the chapter as a percentage of the video duration\n * @param {jQuery} $chapterElement - jQuery wrapper of the chapter element\n */\nvar ProgressChapterModel = function ProgressChapterModel(index, name, startTime, startAsPercent, endAsPercent, durationAsPercent, $chapterElement) {\n var _index = index;\n var _name = name;\n var _startTime = startTime;\n var _startAsPercent = startAsPercent;\n var _endAsPercent = endAsPercent;\n var _durationAsPercent = durationAsPercent;\n var _$chapterElement = $chapterElement;\n var _$loadProgressElement = $chapterElement.find('.load-progress');\n var _$seekHintProgressElement = $chapterElement.find('.seek-hint-progress');\n var _$playProgressElement = $chapterElement.find('.play-progress');\n return Object.defineProperties({}, {\n index: {\n get: function get() {\n return _index;\n }\n },\n name: {\n get: function get() {\n return _name;\n }\n },\n startTime: {\n get: function get() {\n return _startTime;\n }\n },\n startAsPercent: {\n get: function get() {\n return _startAsPercent;\n }\n },\n endAsPercent: {\n get: function get() {\n return _endAsPercent;\n }\n },\n durationAsPercent: {\n get: function get() {\n return _durationAsPercent;\n }\n },\n $element: {\n get: function get() {\n return _$chapterElement;\n }\n },\n $loadProgressElement: {\n get: function get() {\n return _$loadProgressElement;\n }\n },\n $seekHintProgressElement: {\n get: function get() {\n return _$seekHintProgressElement;\n }\n },\n $playProgressElement: {\n get: function get() {\n return _$playProgressElement;\n }\n }\n });\n};\nvar ProgressChapterModel$1 = {\n /**\n * Factory method that returns a new ProgressChapterModel object.\n * @function create\n * @memberof TSC.ProgressChapterModel\n * @static\n * @param {Number} index - Index of the chapter\n * @param {String} name - Chapter name\n * @param {Number} startTime - Start time of the video for the chapter (in seconds)\n * @param {Number} startAsPercent - Percentage of the video when the chapter starts\n * @param {Number} endAsPercent - Percentage of the video when the chapter ends\n * @param {Number} durationAsPercent - Duration of the chapter as a percentage of the video duration\n * @param {jQuery} $chapterElement - jQuery wrapper of the chapter element\n * @return new ProgressChapterModel instance\n */\n create: ProgressChapterModel\n};\n\n/**\n * Utility function that find the rectangle for the video frame in the video thumbnails sprite sheet.\n * @function getThumbnailRectangleByTime\n * @param {Number} timeInSeconds - Time in seconds to locate the video thumbnail\n * @param {Number} videoThumbnailInterval - The interval in time between generated thumbnails in sprite sheet.\n * @param {Number} videoThumbnailColumns - The max number of columns in the sprite sheet.\n * @param {Number} videoThumbnailWidth - The width of a video frame thumbnail.\n * @param {Number} videoThumbnailHeight - The height of a video frame thumbnail.\n * @returns {Object} An object that contains the x, y, width, height of the video thumbnail frame.\n */\nvar getThumbnailRectangleByTime = function getThumbnailRectangleByTime(timeInSeconds, videoThumbnailInterval, videoThumbnailColumns, videoThumbnailWidth, videoThumbnailHeight) {\n var timeIndex = Math.floor(timeInSeconds / videoThumbnailInterval);\n var row = Math.floor(timeIndex / videoThumbnailColumns);\n var column = timeIndex - videoThumbnailColumns * row;\n return {\n x: column * videoThumbnailWidth,\n y: row * videoThumbnailHeight,\n width: videoThumbnailWidth,\n height: videoThumbnailHeight\n };\n};\n\nvar SHIFT_KEY_SKIP_DURATION_MODIFIER = 4;\nvar SCRUB_PREVIEW_OFFSET = 10;\nvar SCRUB_PREVIEW_BOX_PADDING = 8;\nvar MAX_NUMBER_CHAPTERS_CAN_RENDER = 100;\nvar MAX_LOAD_VALUE = 100;\nvar CHECK_VIDEO_LOAD_PROGRESS_INTERVAL = 1000;\nvar HIDE_SCRUB_PREVIEW_DELAY = 200;\n\n/**\n * @memberof TSC\n * @class ProgressBarControlView\n * @classdesc Video progress bar view\n * @param {jQuery} $container - Smart Player root dom element\n * @param {HTMLVideoElement} mediaElement\n * @param {TSC.Quiz} quizModel\n */\nvar ProgressBarControlView = function ProgressBarControlView($container, mediaElement, quizModel) {\n var markup = templateGenerator.generateProgressBarMarkup();\n $container.find('.progress-bar-control').html(markup);\n var _$document = windowWrapper.getDocument(true);\n var _documentRef = _$document[0];\n var _windowRef = windowWrapper.getWindow();\n var _requestAnimationId = null;\n var _scrubbing = false;\n var _lastScrubTime = 0;\n var _wasPlayingBeforeSeek = false;\n var _playStatusAfterSeek = false;\n var _quizModel = quizModel;\n var _$playTimeDisplay = $container.find('.play-time');\n var _$scrubBar = $container.find('.progress-scrubbar-track');\n var _$scrubbarTrack = $container.find('.scrubbar-track');\n var _$quizMarkers = $container.find('.markers');\n var _$scrubPreview = $container.find('.scrub-preview');\n var _videoThumbnailImage;\n var _$scrubVideoThumbnail = _$scrubPreview.find('.video-thumbnail');\n var _$hiddenVideoThumbnail = _$scrubPreview.find('.hidden-video-thumbnail');\n var _scrubVideoThumbnailCanvasCtx = null;\n var _$scrubPreviewChapterName = _$scrubPreview.find('.chapter-name');\n var _$scrubPreviewVideoTime = _$scrubPreview.find('.video-time');\n var _$pluginContainer = $container.find('.plugin-container');\n var _markers = [];\n var _keysEnabled = true;\n var _durationDisplayInitialized = false;\n var _markersCreated = false;\n var _formattedDuration;\n var _readableDuration;\n var _lastUpdatedFormattedMediaTime = -1;\n var _lastUpdatedScrubTime = -1;\n var _showSeekPreview = false;\n var _lastSeekHintVideoPercent = -1;\n var _lastSeekPreviewDetails = {\n hideThumbnail: false,\n videoTimeInSeconds: 0,\n displayAtVideoPercent: -1,\n chapterName: null,\n formattedVideoTime: null\n };\n var _chaptersCache = [];\n var _shouldRespectQuizMarkers = false;\n var _updateBufferedTimeout = -1;\n var _hideSeekPreviewTimeoutId = -1;\n var _currentProgressBarWidth = 0;\n var setShouldRespectQuizMarkers = function setShouldRespectQuizMarkers(newShouldRespectQuizMarkers) {\n _shouldRespectQuizMarkers = newShouldRespectQuizMarkers;\n };\n var shouldRespectQuizMarkers = function shouldRespectQuizMarkers() {\n return _shouldRespectQuizMarkers;\n };\n var getClickX = function getClickX(event) {\n if (event.targetTouches && event.targetTouches[0] && event.targetTouches[0].pageX) {\n return event.targetTouches[0].pageX;\n }\n return event.pageX;\n };\n var getClosestRequiredQuizMarkerTimeBeforeVideoTime = function getClosestRequiredQuizMarkerTimeBeforeVideoTime(timeInSeconds) {\n if (!shouldRespectQuizMarkers()) {\n return null;\n }\n var timeInMilliseconds = timeInSeconds * 1000;\n for (var i = 0; i < _quizModel.questionSetMarkerTimes.length; i++) {\n if (_quizModel.questionSetMarkerTimes[i].startTime <= timeInMilliseconds && !_quizModel.questionSetMarkerTimes[i].canSeekPast) {\n return _quizModel.questionSetMarkerTimes[i].startTime / 1000;\n }\n }\n return null;\n };\n var allowSkipQuestionSetMarkersBeforeTime = function allowSkipQuestionSetMarkersBeforeTime(timeInSeconds) {\n if (!shouldRespectQuizMarkers()) {\n return;\n }\n var timeInMilliseconds = timeInSeconds * 1000;\n _quizModel.questionSetMarkerTimes.forEach(function (questionSetMarker) {\n questionSetMarker.canSeekPast = questionSetMarker.startTime < timeInMilliseconds;\n });\n };\n var resetSeekPastFlagForQuizMarkersPastTime = function resetSeekPastFlagForQuizMarkersPastTime(timeInSeconds) {\n if (!shouldRespectQuizMarkers()) {\n return;\n }\n var timeInMilliseconds = timeInSeconds * 1000;\n _quizModel.questionSetMarkerTimes.forEach(function (questionSetMarker) {\n if (timeInMilliseconds <= questionSetMarker.startTime) {\n questionSetMarker.canSeekPast = false;\n }\n });\n };\n var getChapterNameAtVideoTime = function getChapterNameAtVideoTime(videoTimeInMilliseconds) {\n for (var i = _chaptersCache.length - 1; i >= 0; i--) {\n if (videoTimeInMilliseconds >= _chaptersCache[i].startTime) {\n return _chaptersCache[i].name;\n }\n }\n return null;\n };\n var getChapterPercentageFromTotalPercentage = function getChapterPercentageFromTotalPercentage(totalPercent, chapter) {\n if (totalPercent >= chapter.startAsPercent && totalPercent <= chapter.endAsPercent) {\n return (totalPercent - chapter.startAsPercent) / chapter.durationAsPercent * 100;\n } else if (totalPercent > chapter.endAsPercent) {\n return 100;\n }\n return 0;\n };\n var getVideoTimeFromXPosition = function getVideoTimeFromXPosition(xPos) {\n var closestRequiredQuizMarker;\n var relativeXPos = xPos - _$scrubBar.offset().left;\n var scrubBarWidth = _$scrubBar.width();\n var amountPlayedPercentage = Math.max(Math.min(relativeXPos / scrubBarWidth, 1), 0);\n var pendingVideoTime = mediaElement.duration * amountPlayedPercentage;\n closestRequiredQuizMarker = getClosestRequiredQuizMarkerTimeBeforeVideoTime(pendingVideoTime);\n return {\n videoTime: pendingVideoTime,\n closestRequiredQuizMarker: closestRequiredQuizMarker\n };\n };\n var updateLoadProgress = function updateLoadProgress(progress) {\n _chaptersCache.forEach(function (chapter) {\n chapter.$loadProgressElement.css({\n width: getChapterPercentageFromTotalPercentage(progress, chapter) + '%'\n });\n });\n };\n var onDownSeek = function onDownSeek(e) {\n e.preventDefault();\n if (_scrubbing) {\n return;\n }\n _$document.on('pointermove touchmove', onMoveSeek);\n // Safari needs mouseup, Safari reports wrong event.buttons code after user\n // right clicks on player. This causes pepjs to report pointerup event as pointermove event\n _$document.on('pointerup mouseup touchend mouseleave', onUpSeek);\n if (!mediaElement.paused) {\n _wasPlayingBeforeSeek = true;\n mediaElement.pause();\n } else {\n _wasPlayingBeforeSeek = false;\n }\n _playStatusAfterSeek = _wasPlayingBeforeSeek;\n setScrubbing(true);\n _lastUpdatedScrubTime = -1;\n setPlayProgress(getClickX(e.originalEvent));\n };\n var moveScrubPreview = function moveScrubPreview(videoPercent) {\n var scrubBarWidth = _$scrubBar.width();\n var previewLeftPos = scrubBarWidth * videoPercent;\n var scrubPreviewWidth = _$scrubPreview.width();\n previewLeftPos -= scrubPreviewWidth / 2;\n if (previewLeftPos < SCRUB_PREVIEW_OFFSET) {\n previewLeftPos = SCRUB_PREVIEW_OFFSET;\n } else if (previewLeftPos + scrubPreviewWidth > scrubBarWidth - SCRUB_PREVIEW_OFFSET) {\n previewLeftPos = scrubBarWidth - (SCRUB_PREVIEW_OFFSET + scrubPreviewWidth);\n }\n _$scrubPreview.css('left', previewLeftPos + 'px');\n };\n var drawSeekHint = function drawSeekHint(videoPercent) {\n var videoPercentNormalized = videoPercent * 100;\n _chaptersCache.forEach(function (chapter) {\n chapter.$seekHintProgressElement.css({\n width: getChapterPercentageFromTotalPercentage(videoPercentNormalized, chapter) + '%'\n });\n });\n };\n var updateScrubPreviewText = function updateScrubPreviewText(chapterName, formattedVideoTime) {\n var previewDisplayText = '';\n if (_lastSeekPreviewDetails.hideThumbnail) {\n previewDisplayText = localizationStrings.getPlayerString(playerStringNames.hideThumbnailDueToQuiz);\n } else if (chapterName) {\n previewDisplayText = chapterName;\n }\n _$scrubPreviewChapterName.text(previewDisplayText);\n _$scrubPreviewVideoTime.text(formattedVideoTime);\n };\n var setScrubPreviewDetailsAtTime = function setScrubPreviewDetailsAtTime(videoSeekTimes) {\n var unrestrictedVideoPercent = videoSeekTimes.videoTime / mediaElement.duration;\n var restrictedVideoPercent = videoSeekTimes.closestRequiredQuizMarker !== null ? videoSeekTimes.closestRequiredQuizMarker / mediaElement.duration : unrestrictedVideoPercent;\n _lastSeekPreviewDetails.videoTimeInSeconds = videoSeekTimes.videoTime;\n _lastSeekPreviewDetails.hideThumbnail = unrestrictedVideoPercent !== restrictedVideoPercent;\n _lastSeekPreviewDetails.chapterName = getChapterNameAtVideoTime(videoSeekTimes.videoTime * 1000);\n _lastSeekPreviewDetails.formattedVideoTime = timeFormatter.formatTime(videoSeekTimes.videoTime);\n _lastSeekPreviewDetails.displayAtVideoPercent = unrestrictedVideoPercent;\n _lastSeekHintVideoPercent = restrictedVideoPercent;\n };\n var onMouseMoveToPreview = function onMouseMoveToPreview(e) {\n var videoSeekTimes = getVideoTimeFromXPosition(getClickX(e.originalEvent));\n setScrubPreviewDetailsAtTime(videoSeekTimes);\n };\n var clearHideScrubPreviewDelay = function clearHideScrubPreviewDelay() {\n _hideSeekPreviewTimeoutId !== -1 && clearTimeout(_hideSeekPreviewTimeoutId);\n _hideSeekPreviewTimeoutId = -1;\n };\n var showScrubPreview = function showScrubPreview(e) {\n clearHideScrubPreviewDelay();\n _showSeekPreview = true;\n onMouseMoveToPreview(e);\n updateSeekHint();\n _$scrubPreview.show();\n _$document.on('pointermove touchmove', onMouseMoveToPreview);\n };\n var hideScrubPreview = function hideScrubPreview() {\n _hideSeekPreviewTimeoutId = -1;\n _showSeekPreview = false;\n _$scrubPreview.hide();\n _chaptersCache.forEach(function (chapter) {\n chapter.$seekHintProgressElement.css({\n width: '0'\n });\n });\n _$document.off('pointermove touchmove', onMouseMoveToPreview);\n };\n var onScrubBarMouseOut = function onScrubBarMouseOut() {\n clearHideScrubPreviewDelay();\n _hideSeekPreviewTimeoutId = setTimeout(hideScrubPreview, HIDE_SCRUB_PREVIEW_DELAY);\n };\n var onMoveSeek = function onMoveSeek(e) {\n if (!_scrubbing) {\n return;\n }\n if (!mediaElement.paused) {\n mediaElement.pause();\n }\n setPlayProgress(getClickX(e.originalEvent));\n };\n var onUpSeek = function onUpSeek() {\n if (!_scrubbing) {\n return;\n }\n _$document.off('pointermove touchmove', onMoveSeek);\n _$document.off('pointerup mouseup touchend mouseleave', onUpSeek);\n var atVideoEndTime = Number(mediaElement.currentTime.toFixed(2)) >= Number(mediaElement.duration.toFixed(2));\n if (_playStatusAfterSeek && !atVideoEndTime) {\n mediaElement.play();\n }\n setScrubbing(false);\n };\n var setPlayProgress = function setPlayProgress(xPos) {\n var videoTimes = getVideoTimeFromXPosition(xPos);\n if (videoTimes.closestRequiredQuizMarker) {\n _playStatusAfterSeek = false;\n } else {\n _playStatusAfterSeek = _wasPlayingBeforeSeek;\n }\n _lastScrubTime = videoTimes.closestRequiredQuizMarker || videoTimes.videoTime;\n };\n var updatePlayProgress = function updatePlayProgress() {\n if (mediaElement.duration === 0) {\n return;\n }\n if (_scrubbing) {\n if (_lastScrubTime === _lastUpdatedScrubTime || _lastScrubTime < 0) {\n return;\n }\n _lastUpdatedScrubTime = _lastScrubTime;\n if (mediaElement.ended) {\n $container.trigger(events.Media.Replay, {\n time: _lastScrubTime,\n playAfterSeek: false\n });\n } else {\n $container.trigger(events.Media.SeekToTime, {\n time: _lastScrubTime\n });\n }\n updateUi(_lastScrubTime);\n } else {\n if (mediaElement.seeking) {\n return;\n }\n updateUi(mediaElement.currentTime);\n }\n };\n var updateVideoThumbnail = function updateVideoThumbnail() {\n if (!_scrubVideoThumbnailCanvasCtx) {\n return;\n }\n if (_lastSeekPreviewDetails.hideThumbnail) {\n _$hiddenVideoThumbnail.addClass(cssClasses.hiddenVideoThumbnailVisible);\n _$scrubVideoThumbnail.hide();\n } else {\n _$hiddenVideoThumbnail.removeClass(cssClasses.hiddenVideoThumbnailVisible);\n _$scrubVideoThumbnail.show();\n var thumbnailRect = getThumbnailRectangleByTime(_lastSeekPreviewDetails.videoTimeInSeconds, playerConfiguration.videoThumbnailInterval, playerConfiguration.videoThumbnailColumns, playerConfiguration.videoThumbnailWidth, playerConfiguration.videoThumbnailHeight);\n _scrubVideoThumbnailCanvasCtx.drawImage(_videoThumbnailImage, thumbnailRect.x, thumbnailRect.y, thumbnailRect.width, thumbnailRect.height, 0, 0, playerConfiguration.videoThumbnailWidth, playerConfiguration.videoThumbnailHeight);\n }\n };\n var updateSeekHint = function updateSeekHint() {\n if (!_showSeekPreview) {\n return;\n }\n updateVideoThumbnail();\n updateScrubPreviewText(_lastSeekPreviewDetails.chapterName, _lastSeekPreviewDetails.formattedVideoTime);\n moveScrubPreview(_lastSeekPreviewDetails.displayAtVideoPercent);\n drawSeekHint(_lastSeekHintVideoPercent);\n };\n var updateUi = function updateUi(currentTime) {\n var percentPlayed = currentTime / mediaElement.duration * 100;\n _chaptersCache.forEach(function (chapter) {\n chapter.$playProgressElement.css({\n width: getChapterPercentageFromTotalPercentage(percentPlayed, chapter) + '%'\n });\n });\n updateTimeDisplay(currentTime);\n };\n var updateTimeDisplay = function updateTimeDisplay(currentTime) {\n var formattedCurrentTime = timeFormatter.formatTime(currentTime);\n if (formattedCurrentTime === _lastUpdatedFormattedMediaTime && _durationDisplayInitialized) {\n return;\n }\n _lastUpdatedFormattedMediaTime = formattedCurrentTime;\n var progressDisplayText = formattedCurrentTime;\n if (!_durationDisplayInitialized && mediaElement.duration) {\n _durationDisplayInitialized = true;\n _formattedDuration = timeFormatter.formatTime(mediaElement.duration);\n _readableDuration = timeFormatter.formatTimeForReadability(mediaElement.duration);\n _$scrubBar.attr('aria-valuemax', mediaElement.duration);\n }\n if (_durationDisplayInitialized) {\n progressDisplayText += ' / ' + _formattedDuration;\n _$playTimeDisplay.html(progressDisplayText);\n var ariaValueText = timeFormatter.formatTimeForReadability(currentTime) + localizationStrings.getPlayerString(playerStringNames.accessProgressBarTimeConjunction) + _readableDuration;\n _$scrubBar.attr('aria-valuenow', currentTime);\n _$scrubBar.attr('aria-valuetext', ariaValueText);\n }\n };\n var setMarkersXPos = function setMarkersXPos() {\n var markerSize = 4;\n var mediaDurationInMilliseconds = mediaElement.duration * 1000;\n var xPos = 0;\n var timePercent = 0;\n var quizMarkerContainerWidth = _$quizMarkers.width();\n _quizModel.questionSetMarkerTimes.forEach(function (questionSetMarker, i) {\n timePercent = questionSetMarker.startTime / mediaDurationInMilliseconds;\n xPos = Math.round(quizMarkerContainerWidth * timePercent - markerSize / 2);\n var marker = _markers[i];\n marker && marker.css('left', xPos + 'px');\n });\n };\n var cacheProgressBarWidth = function cacheProgressBarWidth() {\n _currentProgressBarWidth = _$scrubBar.width();\n };\n var onPlayerResize = function onPlayerResize() {\n updateQuizMarkers();\n cacheProgressBarWidth();\n };\n var updateQuizMarkers = function updateQuizMarkers() {\n if (!shouldRespectQuizMarkers()) {\n return;\n }\n if (!_markersCreated) {\n createQuizMarkers();\n }\n updateMarkerVisibility();\n };\n var updateMarkerVisibility = function updateMarkerVisibility() {\n _quizModel.questionSetMarkerTimes.forEach(function (questionSetMarker, i) {\n if (questionSetMarker.completed) {\n var marker = _markers[i];\n marker && marker.hide();\n }\n });\n setMarkersXPos();\n };\n var createQuizMarkers = function createQuizMarkers() {\n if (!shouldRespectQuizMarkers()) {\n return;\n }\n _markersCreated = true;\n _quizModel.questionSetMarkerTimes.forEach(function () {\n _markers.push($('<div></div>').addClass('quiz-marker'));\n });\n _$quizMarkers.append(_markers);\n };\n var blockTextSelection = function blockTextSelection() {\n _documentRef.body.focus();\n _documentRef.onselectstart = function () {\n return false;\n };\n };\n var unblockTextSelection = function unblockTextSelection() {\n _documentRef.onselectstart = function () {\n return true;\n };\n };\n var setScrubbing = function setScrubbing(value) {\n _scrubbing = value;\n if (_scrubbing) {\n blockTextSelection();\n $container.trigger(events.Scrubbing.Started);\n } else {\n unblockTextSelection();\n $container.trigger(events.Scrubbing.Ended);\n }\n };\n var alertScreenReaderFastForwardIsDisabled = function alertScreenReaderFastForwardIsDisabled() {\n var fastForwardDisabledText = localizationStrings.getPlayerString(playerStringNames.fastForwardDisabledScreenReaderText);\n var screenReaderAlertMarkup = templateGenerator.generateScreenReaderAlertMarkup(fastForwardDisabledText);\n var $screenReaderAlert = $(screenReaderAlertMarkup);\n $container.append($screenReaderAlert);\n };\n var keyPressed = function keyPressed(e) {\n if (!_keysEnabled) {\n return;\n }\n var timeToSkip = e.shiftKey ? SHIFT_KEY_SKIP_DURATION_MODIFIER * playerConfiguration.skipVideoDuration : playerConfiguration.skipVideoDuration;\n if (keys.isKeyOfType(e.key, keys.keyTypes.rightArrow)) {\n if (playerConfiguration.allowFastForward) {\n mediaElement.currentTime = videoApiUtils.getSafeSeekTime(mediaElement, mediaElement.currentTime + timeToSkip);\n } else {\n alertScreenReaderFastForwardIsDisabled();\n }\n } else if (keys.isKeyOfType(e.key, keys.keyTypes.leftArrow)) {\n mediaElement.currentTime = videoApiUtils.getSafeSeekTime(mediaElement, mediaElement.currentTime - timeToSkip);\n } else if (keys.isKeyOfType(e.key, keys.keyTypes.space) && _documentRef.activeElement === _$scrubBar[0]) {\n e.preventDefault();\n if (mediaElement.paused) {\n mediaElement.play();\n } else {\n mediaElement.pause();\n }\n }\n };\n var onMousedown = function onMousedown(e) {\n if (e.button === mouseButtons.mainButton) {\n onDownSeek(e);\n } else {\n highlightDisabler.disableHighlights($(this));\n }\n };\n var disableKeyListeners = function disableKeyListeners() {\n _$scrubBar.attr('tabindex', tabIndex.Disabled);\n _keysEnabled = false;\n };\n var enableKeyListeners = function enableKeyListeners() {\n _$scrubBar.attr('tabindex', tabIndex.DomOrder);\n _keysEnabled = true;\n };\n var getXPositionForQuestionSetMarker = function getXPositionForQuestionSetMarker(questionSetMarkerId) {\n if (!shouldRespectQuizMarkers()) {\n return;\n }\n var questionSetMarker = null;\n var mediaDurationInMilliseconds = mediaElement.duration * 1000;\n var measuredContainerWidth = $container.width();\n var measuredQuizMarkerWidth = _$quizMarkers.width();\n // use the max width, when control is hidden width measurement is not correct.\n var usedElementWidth = Math.max(measuredContainerWidth, measuredQuizMarkerWidth);\n var scrubBarLeftOffset = _$scrubBar.offset().left;\n for (var i = 0; i < _quizModel.questionSetMarkerTimes.length; i++) {\n questionSetMarker = quizModel.questionSetMarkerTimes[i];\n if (questionSetMarker.questionSetIndex === questionSetMarkerId) {\n var timePercent = questionSetMarker.startTime / mediaDurationInMilliseconds;\n return Math.round(usedElementWidth * timePercent) + scrubBarLeftOffset;\n }\n }\n };\n var onQuizzingCompleteHandler = function onQuizzingCompleteHandler() {\n allowSkipQuestionSetMarkersBeforeTime(mediaElement.currentTime);\n };\n var onMediaSeekedEvent = function onMediaSeekedEvent() {\n resetSeekPastFlagForQuizMarkersPastTime(mediaElement.currentTime);\n };\n var onLoadedMetadata = function onLoadedMetadata() {\n _$scrubBar.show();\n updateQuizMarkers();\n cacheProgressBarWidth();\n };\n var createDefaultChapter = function createDefaultChapter() {\n var progressBarChapterSegmentMarkup = templateGenerator.generateProgressBarChapterSegmentMarkup(0);\n var $chapterElement = $(progressBarChapterSegmentMarkup);\n $chapterElement.css('width', '100%');\n _$scrubbarTrack.append($chapterElement);\n _chaptersCache = [ProgressChapterModel$1.create(0, null, 0, 0, 100, 100, $chapterElement)];\n };\n var onVideoThumbnailLoaded = function onVideoThumbnailLoaded() {\n _scrubVideoThumbnailCanvasCtx = _$scrubVideoThumbnail[0].getContext('2d');\n _videoThumbnailImage.onload = undefined;\n _videoThumbnailImage.onerror = undefined;\n };\n var loadVideoThumbnailsImage = function loadVideoThumbnailsImage() {\n _videoThumbnailImage = new Image();\n _videoThumbnailImage.onload = onVideoThumbnailLoaded;\n _videoThumbnailImage.onerror = function () {\n _videoThumbnailImage.onload = undefined;\n _videoThumbnailImage.onerror = undefined;\n _videoThumbnailImage = null;\n };\n _videoThumbnailImage.src = playerConfiguration.videoThumbnailsSrc;\n };\n var initPlugins = function initPlugins() {\n var pluginController = playerConfiguration.getPluginController();\n if (!pluginController) {\n return;\n }\n pluginController.initializePluginsForViewElement(supportedPluginViewElements.PROGRESS_BAR, _$pluginContainer);\n };\n var onAddPlugin = function onAddPlugin() {\n initPlugins();\n };\n var setup = function setup() {\n _$scrubBar.attr('aria-valuemin', 0);\n if (playerConfiguration.allowFastForward) {\n _$scrubBar.on('touchstart', onDownSeek);\n _$scrubBar.on('mousedown', onMousedown);\n _$scrubBar.on('mouseover touchstart', showScrubPreview);\n _$scrubBar.on('mouseout touchend', onScrubBarMouseOut);\n } else {\n _$scrubBar.addClass(cssClasses.progressBarTrackPreventSeeking);\n }\n $container.on('keydown', keyPressed);\n $container.on(events.Modals.Open, disableKeyListeners);\n $container.on(events.Modals.Closed, enableKeyListeners);\n $container.on(events.Controls.Disable, disableKeyListeners);\n $container.on(events.Controls.Enable, enableKeyListeners);\n $container.on(events.Quizzing.Complete, onQuizzingCompleteHandler);\n $container.on(events.Controls.PlayerResize, onPlayerResize);\n $container.on(events.Plugin.Added, onAddPlugin);\n mediaElement.addEventListener(events.ExternalVideo.VideoSeeked, onMediaSeekedEvent);\n mediaElement.addEventListener(events.ExternalVideo.VideoLoadedMetadata, onLoadedMetadata);\n mediaElement.addEventListener(events.ExternalVideo.VideoDurationChange, onVideoDurationChange);\n mediaElement.addEventListener(events.ExternalVideo.VideoProgress, onVideoProgress);\n var onRequestAnimationFrame = function onRequestAnimationFrame() {\n updatePlayProgress();\n updateSeekHint();\n _requestAnimationId = _windowRef.requestAnimationFrame(onRequestAnimationFrame);\n };\n _requestAnimationId = _windowRef.requestAnimationFrame(onRequestAnimationFrame);\n\n // will be re-shown when metadata loads\n cacheProgressBarWidth();\n _$scrubBar.hide();\n if (!playerConfiguration.videoThumbnailsSrc) {\n _$scrubVideoThumbnail.hide();\n } else {\n _$scrubPreview.addClass(cssClasses.scrubPreviewHasThumbnail);\n _$scrubPreview.css({\n width: \"\".concat(playerConfiguration.videoThumbnailWidth + SCRUB_PREVIEW_BOX_PADDING, \"px\")\n });\n _$hiddenVideoThumbnail.css({\n width: \"\".concat(playerConfiguration.videoThumbnailWidth, \"px\"),\n height: \"\".concat(playerConfiguration.videoThumbnailHeight, \"px\")\n });\n _$scrubVideoThumbnail.attr('width', \"\".concat(playerConfiguration.videoThumbnailWidth, \"px\"));\n _$scrubVideoThumbnail.attr('height', \"\".concat(playerConfiguration.videoThumbnailHeight, \"px\"));\n loadVideoThumbnailsImage();\n }\n createDefaultChapter();\n initPlugins();\n };\n var createTocChapters = function createTocChapters(xmpTocItems) {\n if (!mediaElement.duration) {\n return;\n }\n // limit number chapters the player will render, protect from kayak man projects :)\n if (xmpTocItems.length > MAX_NUMBER_CHAPTERS_CAN_RENDER) {\n console.info('The Table of contents contains too many items to render in the progress bar.'); // eslint-disable-line\n return;\n }\n _$scrubbarTrack.empty();\n _chaptersCache = [];\n var mediaDurationInMilliseconds = mediaElement.duration * 1000;\n var lastStartTime = 0;\n var lastChapterDuration = 0;\n for (var i = 0; i < xmpTocItems.length; i++) {\n if (xmpTocItems[i].startTime >= mediaDurationInMilliseconds) {\n continue;\n }\n var nextChapterTimeOrDuration = i < xmpTocItems.length - 1 ? xmpTocItems[i + 1].startTime : mediaDurationInMilliseconds;\n var chapterDurationInMilliseconds = nextChapterTimeOrDuration - lastStartTime;\n var chapterPercentage = chapterDurationInMilliseconds / mediaDurationInMilliseconds * 100;\n var progressBarChapterSegmentMarkup = templateGenerator.generateProgressBarChapterSegmentMarkup(i);\n var $chapterElement = $(progressBarChapterSegmentMarkup);\n $chapterElement.css('width', chapterPercentage + '%');\n _$scrubbarTrack.append($chapterElement);\n _chaptersCache.push(ProgressChapterModel$1.create(i, xmpTocItems[i].name, xmpTocItems[i].startTime, lastChapterDuration, lastChapterDuration + chapterPercentage, chapterPercentage, $chapterElement));\n lastChapterDuration += chapterPercentage;\n lastStartTime = nextChapterTimeOrDuration;\n }\n };\n var onVideoProgress = function onVideoProgress() {\n var downloadedPercent = 0;\n if (mediaElement) {\n if (mediaElement.buffered && mediaElement.buffered.length) {\n downloadedPercent = Math.min(MAX_LOAD_VALUE, Math.ceil(mediaElement.buffered.end(mediaElement.buffered.length - 1) * MAX_LOAD_VALUE / mediaElement.duration));\n }\n updateLoadProgress(downloadedPercent);\n if (downloadedPercent === MAX_LOAD_VALUE && _updateBufferedTimeout !== -1) {\n _windowRef.clearInterval(_updateBufferedTimeout);\n }\n }\n };\n var onVideoDurationChange = function onVideoDurationChange() {\n // this is a workaround because the ipad/iphone do not support the\n // progress event so we must check the buffering every second\n onVideoProgress();\n if (_updateBufferedTimeout !== -1) {\n _windowRef.clearInterval(_updateBufferedTimeout);\n }\n updateQuizMarkers();\n _updateBufferedTimeout = _windowRef.setInterval(onVideoProgress, CHECK_VIDEO_LOAD_PROGRESS_INTERVAL);\n };\n var destroy = function destroy() {\n if (_updateBufferedTimeout !== -1) {\n _windowRef.clearInterval(_updateBufferedTimeout);\n }\n _$scrubBar.off('touchstart', onDownSeek);\n _$scrubBar.off('mousedown', onMousedown);\n _$scrubBar.off('mouseover touchstart', showScrubPreview);\n _$scrubBar.off('mouseout touchend', onScrubBarMouseOut);\n $container.off('keydown', keyPressed);\n $container.off(events.Modals.Open, disableKeyListeners);\n $container.off(events.Modals.Closed, enableKeyListeners);\n $container.off(events.Controls.Disable, disableKeyListeners);\n $container.off(events.Controls.Enable, enableKeyListeners);\n $container.off(events.Quizzing.Complete, onQuizzingCompleteHandler);\n $container.off(events.Controls.PlayerResize, onPlayerResize);\n $container.off(events.Plugin.Added, onAddPlugin);\n mediaElement.removeEventListener(events.ExternalVideo.VideoSeeked, onMediaSeekedEvent);\n mediaElement.removeEventListener(events.ExternalVideo.VideoDurationChange, onVideoDurationChange);\n mediaElement.removeEventListener(events.ExternalVideo.VideoProgress, onVideoProgress);\n if (_requestAnimationId !== null) {\n _windowRef.cancelAnimationFrame(_requestAnimationId);\n }\n };\n var durationHasChanged = function durationHasChanged() {\n _durationDisplayInitialized = false;\n };\n setup();\n return Object.defineProperties({\n getXPositionForQuestionSetMarker: getXPositionForQuestionSetMarker,\n updateQuizMarkers: updateQuizMarkers,\n updateLoadProgress: updateLoadProgress,\n allowSkipQuestionSetMarkersBeforeTime: allowSkipQuestionSetMarkersBeforeTime,\n durationHasChanged: durationHasChanged,\n createTocChapters: createTocChapters,\n destroy: destroy,\n setShouldRespectQuizMarkers: setShouldRespectQuizMarkers\n }, {\n scrubbing: {\n get: function get() {\n return _scrubbing;\n },\n set: setScrubbing\n },\n lastScrubTime: {\n get: function get() {\n return _lastScrubTime;\n }\n },\n controlElement: {\n get: function get() {\n return _$scrubBar;\n }\n },\n displayWidth: {\n get: function get() {\n return _currentProgressBarWidth;\n }\n }\n });\n};\nvar ProgressBarControlView$1 = {\n /**\n * Factory method that returns a new ProgressBarControlView object\n * @function create\n * @memberof TSC.ProgressBarControlView\n * @param {jQuery} $container - Smart Player root dom element\n * @param {HTMLVideoElement} mediaElement\n * @param {TSC.Quiz} quizModel\n * @static\n * @return new ProgressBarControlView instance\n */\n create: ProgressBarControlView\n};\n\nvar PlayRewindControlsView = function PlayRewindControlsView($container, mediaElement) {\n var skipDuration = playerConfiguration.skipVideoDuration;\n var _markup = templateGenerator.generatePlayRewindControlsMarkup(skipDuration);\n $container.find('.play-rewind-controls').html(_markup);\n var _disabled = false;\n var _$playControl = $container.find('.play-control');\n var _$rewindControl = $container.find('.rewind-control');\n var _$forwardControl = $container.find('.forward-control');\n var _$playButtonGlyph = _$playControl.find('.play-button-glyph');\n var _$pauseButtonGlyph = _$playControl.find('.pause-button-glyph');\n var disableKeyListeners = function disableKeyListeners() {\n _$playControl.attr('tabindex', tabIndex.Disabled);\n _$rewindControl.attr('tabindex', tabIndex.Disabled);\n _$forwardControl.attr('tabindex', tabIndex.Disabled);\n _disabled = true;\n };\n var enableKeyListeners = function enableKeyListeners() {\n _$playControl.attr('tabindex', tabIndex.DomOrder);\n _$rewindControl.attr('tabindex', tabIndex.DomOrder);\n _$forwardControl.attr('tabindex', tabIndex.DomOrder);\n _disabled = false;\n };\n var pauseMedia = function pauseMedia() {\n mediaElement.pause();\n };\n $container.on(events.Controls.Disable, disableKeyListeners);\n $container.on(events.Controls.Enable, enableKeyListeners);\n $container.on(events.SCORM.ExitSession, pauseMedia);\n mediaElement.addEventListener(events.Media.Play, function () {\n _$playButtonGlyph.hide();\n _$pauseButtonGlyph.show();\n _$playControl.attr('aria-pressed', true);\n });\n mediaElement.addEventListener(events.Media.Pause, function () {\n _$pauseButtonGlyph.hide();\n _$playButtonGlyph.show();\n _$playControl.attr('aria-pressed', false);\n });\n var onPlayHandler = function onPlayHandler(e) {\n e.preventDefault();\n togglePlay();\n };\n var togglePlay = function togglePlay() {\n if (_disabled) {\n return;\n }\n if (mediaElement.paused) {\n if (mediaElement.ended) {\n $container.trigger(events.Media.Replay);\n } else {\n mediaElement.play();\n }\n } else {\n pauseMedia();\n }\n };\n var seekVideo = function seekVideo(timeInSeconds) {\n $container.trigger(events.Media.SeekToTime, {\n time: videoApiUtils.getSafeSeekTime(mediaElement, timeInSeconds)\n });\n };\n var rewindVideo = function rewindVideo(e) {\n e.preventDefault();\n seekVideo(mediaElement.currentTime - playerConfiguration.skipVideoDuration);\n };\n var skipVideoForward = function skipVideoForward(e) {\n e.preventDefault();\n seekVideo(mediaElement.currentTime + playerConfiguration.skipVideoDuration);\n };\n var setInitialFocus = function setInitialFocus() {\n if (viewHelper.elementOrChildHasFocus($container)) {\n _$playControl.focus();\n highlightDisabler.disableHighlights(_$playControl);\n }\n };\n var destroy = function destroy() {\n _$playControl.off('click', onPlayHandler);\n _$rewindControl.off('click', rewindVideo);\n _$forwardControl.off('click', skipVideoForward);\n };\n if (playerConfiguration.skipVideoControlsEnabled) {\n _$rewindControl.on('click', rewindVideo);\n if (playerConfiguration.allowFastForward) {\n _$forwardControl.on('click', skipVideoForward);\n } else {\n _$forwardControl.addClass(cssClasses.hide);\n }\n } else {\n _$rewindControl.addClass(cssClasses.hide);\n _$forwardControl.addClass(cssClasses.hide);\n }\n _$playControl.on('click', onPlayHandler);\n _$pauseButtonGlyph.hide();\n return Object.defineProperties({\n togglePlay: togglePlay,\n setInitialFocus: setInitialFocus,\n destroy: destroy\n }, {});\n};\nvar PlayRewindControlsView$1 = {\n create: PlayRewindControlsView\n};\n\nvar PrevNextControlsView = function PrevNextControlsView($container) {\n var _markup = templateGenerator.generatePrevNextControlsMarkup();\n $container.find('.prev-next-controls').html(_markup);\n var _$previousControl = $container.find('.previous-control');\n var _$nextControl = $container.find('.next-control');\n var disableKeyListeners = function disableKeyListeners() {\n _$previousControl.attr('tabindex', tabIndex.Disabled);\n _$nextControl.attr('tabindex', tabIndex.Disabled);\n };\n var enableKeyListeners = function enableKeyListeners() {\n _$previousControl.attr('tabindex', tabIndex.DomOrder);\n _$nextControl.attr('tabindex', tabIndex.DomOrder);\n };\n $container.on(events.Controls.Disable, disableKeyListeners);\n $container.on(events.Controls.Enable, enableKeyListeners);\n _$previousControl.click(function () {\n $container.trigger(events.Controls.ClickPrev);\n });\n _$nextControl.click(function () {\n $container.trigger(events.Controls.ClickNext);\n });\n var hide = function hide() {\n _$previousControl.addClass(cssClasses.hide);\n _$nextControl.addClass(cssClasses.hide);\n };\n var show = function show() {\n _$previousControl.removeClass(cssClasses.hide);\n _$nextControl.removeClass(cssClasses.hide);\n };\n var disablePreviousButton = function disablePreviousButton() {\n _$previousControl.addClass(cssClasses.disabled).attr('aria-disabled', true);\n };\n var enablePreviousButton = function enablePreviousButton() {\n _$previousControl.removeClass(cssClasses.disabled).attr('aria-disabled', false);\n };\n var disableNextButton = function disableNextButton() {\n _$nextControl.addClass(cssClasses.disabled).attr('aria-disabled', true);\n };\n var enableNextButton = function enableNextButton() {\n _$nextControl.removeClass(cssClasses.disabled).attr('aria-disabled', false);\n };\n var destroy = function destroy() {\n $container.off(events.Controls.Disable, disableKeyListeners);\n $container.off(events.Controls.Enable, enableKeyListeners);\n $container.find('.prev-next-controls').html('');\n };\n return {\n show: show,\n hide: hide,\n disablePreviousButton: disablePreviousButton,\n enablePreviousButton: enablePreviousButton,\n disableNextButton: disableNextButton,\n enableNextButton: enableNextButton,\n destroy: destroy\n };\n};\nvar PrevNextControlsView$1 = {\n create: PrevNextControlsView\n};\n\nvar setItem$1 = function setItem(key, value) {\n try {\n window.localStorage.setItem(key, value);\n } catch (e) {\n //oh well\n }\n};\nvar getItem$1 = function getItem(key) {\n try {\n return window.localStorage.getItem(key);\n } catch (e) {\n return null;\n }\n};\nvar localStorageWrapper = {\n /**\n * Wraps native local storage setItem with a try/catch.\n * @function setItem\n * @memberof TSC.localStorageWrapper\n * @static\n * @param {String} key - the key of the value to set in local storage\n * @param {String} value - the value to set in local storage\n */\n setItem: setItem$1,\n /**\n * Wraps native local storage getItem.\n * @function getItem\n * @memberof TSC.localStorageWrapper\n * @static\n * @param {String} key - the key of the value to retrieve in local storage\n * @returns {String} value from local storage (could be null or undefined)\n */\n getItem: getItem$1\n};\n\nvar VOLUME_CACHE_KEY = 'volume';\nvar MUTED_CACHE_KEY = 'muted';\nvar DEFAULT_VOLUME_VALUE = 1;\nvar VOLUME_SLIDER_MIN = 0;\nvar VOLUME_SLIDER_MAX = 100;\nvar MIN_VOLUME_POSITION_PERCENT = 0;\nvar MAX_VOLUME_POSITION_PERCENT = 1;\nvar MOUSEOUT_HIDE_SLIDER_TIMEOUT = 1000;\nvar FOCUSOUT_HIDE_SLIDER_TIMEOUT = 200;\nvar VOLUME_STRING = localizationStrings.getPlayerString(playerStringNames.accessTxtVolume);\nvar VOLUME_TRACK_WIDTH = 67;\nvar VOLUME_SLIDER_HALF_WIDTH = 6;\nvar KEYBOARD_VOLUME_MODIFIER = .1;\nvar MIN_VOLUME_PERCENT_HIGH_VOLUME_GLYPH = .7;\nvar MIN_VOLUME_PERCENT_MEDIUM_VOLUME_GLYPH = .3;\nvar getCachedVolumeValueAsValidNumber = function getCachedVolumeValueAsValidNumber() {\n var cachedVolumeValue = localStorageWrapper.getItem(VOLUME_CACHE_KEY);\n if (cachedVolumeValue === undefined || cachedVolumeValue === null || +cachedVolumeValue > MAX_VOLUME_POSITION_PERCENT) {\n return DEFAULT_VOLUME_VALUE;\n }\n return +cachedVolumeValue;\n};\n\n/**\n * @memberof TSC\n * @class VolumeControlView\n * @classdesc VolumeControl View\n */\nvar VolumeControlView = function VolumeControlView($container, mediaElement) {\n var _showVolumeSlider = false;\n var _secondaryControlsHidden = false;\n var _cachedVolume = getCachedVolumeValueAsValidNumber();\n var _cachedMuted = localStorageWrapper.getItem(MUTED_CACHE_KEY);\n var _sliderShowTimeoutId = -1;\n var _markup = templateGenerator.generateVolumeControlMarkup(_cachedVolume);\n var _$controlsContainer = $container.find('.player-controls');\n var _$primaryControlsContainer = $container.find('.primary-controls');\n var _$secondaryControlsContainer = $container.find('.secondary-controls');\n var _$volumeContainer = $container.find('.volume-wrapper');\n _$volumeContainer.html(_markup);\n var _$volumeSliderContainer = _$volumeContainer.find('.volume-slider-container');\n var _$volumeSlider = _$volumeContainer.find('.volume-slider');\n var _$volumeSliderTrack = _$volumeContainer.find('.volume-slider-track');\n var _$volumeControl = _$volumeContainer.find('.volume');\n var _initialVolume = _cachedVolume;\n var _initialMuted = _cachedMuted === 'true';\n var _sliderVolumeValue = _initialVolume;\n var _sliderActive = false;\n if (deviceInfo.isIOS() || deviceInfo.isAndroid()) {\n _$volumeControl.remove();\n _$volumeSliderContainer.remove();\n }\n var onKeyDownHandler = function onKeyDownHandler(e) {\n if (keys.isKeyOfType(e.key, keys.keyTypes.upArrow) || keys.isKeyOfType(e.key, keys.keyTypes.downArrow)) {\n e.preventDefault();\n }\n };\n var onKeyHandler = function onKeyHandler(e) {\n e.preventDefault();\n if (keys.isKeyOfType(e.key, keys.keyTypes.upArrow)) {\n setSliderValue(_sliderVolumeValue + KEYBOARD_VOLUME_MODIFIER);\n updateVolumeSliderPositionByVolume(_sliderVolumeValue);\n setVolume(_sliderVolumeValue);\n } else if (keys.isKeyOfType(e.key, keys.keyTypes.downArrow)) {\n setSliderValue(_sliderVolumeValue - KEYBOARD_VOLUME_MODIFIER);\n updateVolumeSliderPositionByVolume(_sliderVolumeValue);\n setVolume(_sliderVolumeValue);\n }\n };\n var clampVolumePercentage = function clampVolumePercentage(volumeAsPercent) {\n volumeAsPercent = volumeAsPercent < MIN_VOLUME_POSITION_PERCENT ? MIN_VOLUME_POSITION_PERCENT : volumeAsPercent;\n volumeAsPercent = volumeAsPercent > MAX_VOLUME_POSITION_PERCENT ? MAX_VOLUME_POSITION_PERCENT : volumeAsPercent;\n return volumeAsPercent;\n };\n var setSliderValue = function setSliderValue(volumePercentageValue) {\n volumePercentageValue = clampVolumePercentage(volumePercentageValue);\n\n // do not store min volume, the volume will be muted then\n if (volumePercentageValue > MIN_VOLUME_POSITION_PERCENT) {\n _sliderVolumeValue = volumePercentageValue;\n }\n };\n var onSliderMouseDownHandler = function onSliderMouseDownHandler(e) {\n e.preventDefault();\n highlightDisabler.disableHighlights(_$volumeSliderContainer);\n var volumeSliderLeftOffset = _$volumeSliderTrack.offset().left;\n var pendingVolumeValue = _sliderVolumeValue;\n var updateSliderOnAnimationFrame = function updateSliderOnAnimationFrame() {\n updateVolumeSliderPositionByVolume(pendingVolumeValue);\n setVolume(pendingVolumeValue);\n if (_sliderActive) {\n window.requestAnimationFrame(updateSliderOnAnimationFrame);\n }\n };\n var updateSliderValue = function updateSliderValue(pageX) {\n var currentDelta = pageX - volumeSliderLeftOffset;\n pendingVolumeValue = clampVolumePercentage(currentDelta / VOLUME_TRACK_WIDTH);\n };\n var onMouseMove = function onMouseMove(evt) {\n evt.preventDefault();\n updateSliderValue(evt.pageX);\n };\n var onMouseUp = function onMouseUp(evt) {\n evt.preventDefault();\n _sliderActive = false;\n setSliderValue(pendingVolumeValue);\n window.document.removeEventListener('mousemove', onMouseMove, true);\n window.document.removeEventListener('mouseup', onMouseUp, true);\n };\n window.document.addEventListener('mousemove', onMouseMove, true);\n window.document.addEventListener('mouseup', onMouseUp, true);\n updateSliderValue(e.pageX);\n _sliderActive = true;\n window.requestAnimationFrame(updateSliderOnAnimationFrame);\n };\n var updateVolumeSliderPositionByVolume = function updateVolumeSliderPositionByVolume(volumeFromMedia) {\n var volumeConverted = volumeFromMedia * VOLUME_SLIDER_MAX;\n var volumeSliderLeftCssValue = 'calc(' + volumeConverted + '% - ' + VOLUME_SLIDER_HALF_WIDTH + 'px)';\n var volumeTrackWidthCssValue = volumeConverted + '%';\n _$volumeSlider.css('left', volumeSliderLeftCssValue);\n _$volumeSliderTrack.css('width', volumeTrackWidthCssValue);\n };\n var showVolumeSlider = function showVolumeSlider() {\n _$volumeSliderContainer.removeClass(cssClasses.volumeSliderHidden);\n _showVolumeSlider = true;\n handleSecondaryControls();\n };\n var handleSecondaryControls = function handleSecondaryControls() {\n var controlsWidth = _$primaryControlsContainer.width() + _$secondaryControlsContainer.width();\n var volumeSliderExpandedWidth = _$volumeSliderContainer.width() === 0 ? VOLUME_TRACK_WIDTH : 0;\n var shouldHideSecondaryControls = controlsWidth + volumeSliderExpandedWidth >= _$controlsContainer.width();\n if (_secondaryControlsHidden && !shouldHideSecondaryControls) {\n setSecondaryControlsVisibility(false);\n } else if (!_secondaryControlsHidden && shouldHideSecondaryControls) {\n setSecondaryControlsVisibility(true);\n }\n };\n var setSecondaryControlsVisibility = function setSecondaryControlsVisibility(isHidden) {\n if (isHidden) {\n _$secondaryControlsContainer.addClass(cssClasses.hideSecondaryControls);\n _secondaryControlsHidden = true;\n } else {\n _$secondaryControlsContainer.removeClass(cssClasses.hideSecondaryControls);\n _secondaryControlsHidden = false;\n }\n };\n var hideControls = function hideControls() {\n if (_sliderShowTimeoutId !== -1) {\n hideVolumeSlider();\n }\n };\n var hideVolumeSlider = function hideVolumeSlider() {\n _showVolumeSlider = false;\n if (_sliderShowTimeoutId !== -1) {\n clearTimeout(_sliderShowTimeoutId);\n _sliderShowTimeoutId = -1;\n }\n setSecondaryControlsVisibility(false);\n _$volumeSliderContainer.addClass(cssClasses.volumeSliderHidden);\n };\n var updateUI = function updateUI() {\n var volumeValue = mediaElement.muted ? 0 : Math.round(mediaElement.volume * VOLUME_SLIDER_MAX);\n _$volumeSlider.attr('aria-valuenow', volumeValue);\n _$volumeSlider.attr('aria-valuetext', volumeValue + '% ' + VOLUME_STRING);\n _$volumeControl.attr('aria-pressed', !!mediaElement.muted);\n _$volumeSlider.attr({\n value: volumeValue\n });\n _$volumeControl.removeClass(cssClasses.volumeHighButtonGlyph);\n _$volumeControl.removeClass(cssClasses.volumeMediumButtonGlyph);\n _$volumeControl.removeClass(cssClasses.volumeLowButtonGlyph);\n _$volumeControl.removeClass(cssClasses.volumeMutedButtonGlyph);\n if (volumeValue === MIN_VOLUME_POSITION_PERCENT) {\n _$volumeControl.addClass(cssClasses.volumeMutedButtonGlyph);\n } else if (mediaElement.volume > MIN_VOLUME_PERCENT_HIGH_VOLUME_GLYPH) {\n _$volumeControl.addClass(cssClasses.volumeHighButtonGlyph);\n } else if (mediaElement.volume > MIN_VOLUME_PERCENT_MEDIUM_VOLUME_GLYPH) {\n _$volumeControl.addClass(cssClasses.volumeMediumButtonGlyph);\n } else {\n _$volumeControl.addClass(cssClasses.volumeLowButtonGlyph);\n }\n };\n var setMuted = function setMuted(muted) {\n mediaElement.muted = muted;\n localStorageWrapper.setItem(MUTED_CACHE_KEY, muted);\n };\n var setVolume = function setVolume(newVolumeAsPercent) {\n newVolumeAsPercent = clampVolumePercentage(newVolumeAsPercent);\n if (newVolumeAsPercent === MIN_VOLUME_POSITION_PERCENT) {\n setMuted(true);\n } else {\n setMuted(false);\n localStorageWrapper.setItem(VOLUME_CACHE_KEY, newVolumeAsPercent);\n mediaElement.volume = newVolumeAsPercent;\n }\n };\n var startHideSliderTimeout = function startHideSliderTimeout(timeout) {\n if (_sliderShowTimeoutId !== -1) {\n clearTimeout(_sliderShowTimeoutId);\n }\n _sliderShowTimeoutId = setTimeout(function () {\n hideVolumeSlider();\n _sliderShowTimeoutId = -1;\n }, timeout);\n };\n var onContainerMouseOver = function onContainerMouseOver() {\n if (_sliderShowTimeoutId !== -1) {\n clearTimeout(_sliderShowTimeoutId);\n _sliderShowTimeoutId = -1;\n }\n showVolumeSlider();\n };\n var onContainerMouseLeave = function onContainerMouseLeave(e) {\n if (e.buttons !== 1) {\n startHideSliderTimeout(MOUSEOUT_HIDE_SLIDER_TIMEOUT);\n }\n };\n var hideVolumeSliderOnFocusOut = function hideVolumeSliderOnFocusOut() {\n startHideSliderTimeout(FOCUSOUT_HIDE_SLIDER_TIMEOUT);\n };\n var onVolumeButtonClick = function onVolumeButtonClick() {\n setMuted(!mediaElement.muted);\n if (mediaElement.muted) {\n updateVolumeSliderPositionByVolume(0);\n } else {\n updateVolumeSliderPositionByVolume(_sliderVolumeValue);\n setVolume(_sliderVolumeValue);\n }\n };\n var disableControls = function disableControls() {\n _$volumeControl.attr('tabindex', tabIndex.Disabled);\n _$volumeSlider.attr('tabindex', tabIndex.Disabled);\n };\n var enableControls = function enableControls() {\n _$volumeControl.attr('tabindex', tabIndex.DomOrder);\n _$volumeSlider.attr('tabindex', tabIndex.DomOrder);\n };\n var initVolumeControls = function initVolumeControls() {\n setVolume(_initialVolume);\n setMuted(_initialMuted);\n updateUI();\n updateVolumeSliderPositionByVolume(mediaElement.muted ? MIN_VOLUME_POSITION_PERCENT : _initialVolume);\n };\n var onResize = function onResize() {\n if (_showVolumeSlider) {\n handleSecondaryControls();\n }\n };\n var onMediaVolumeChange = function onMediaVolumeChange() {\n if (!_sliderActive) {\n setSliderValue(mediaElement.volume);\n if (mediaElement.volume === VOLUME_SLIDER_MIN && !mediaElement.muted) {\n setMuted(true);\n }\n }\n updateUI();\n };\n var initializeHandlers = function initializeHandlers() {\n _$volumeContainer.on('mousemove', onContainerMouseOver);\n _$volumeContainer.on('mouseout', onContainerMouseLeave);\n _$volumeSliderContainer.on('mousedown', onSliderMouseDownHandler);\n _$volumeControl.on('click', onVolumeButtonClick);\n _$volumeSlider.on('focus', showVolumeSlider);\n _$volumeSlider.on('focusout', hideVolumeSliderOnFocusOut);\n _$volumeSlider.on('keydown', onKeyDownHandler);\n _$volumeSlider.on('keyup', onKeyHandler);\n _$volumeSlider.attr('tabindex', tabIndex.DomOrder);\n _$volumeSlider.attr('aria-valuemin', VOLUME_SLIDER_MIN);\n _$volumeSlider.attr('aria-valuemax', VOLUME_SLIDER_MAX);\n _$volumeSlider.attr('role', 'slider');\n mediaElement.addEventListener('volumechange', onMediaVolumeChange);\n $container.on(events.Controls.Disable, disableControls);\n $container.on(events.Controls.Enable, enableControls);\n $container.on(events.Controls.PlayerResize, onResize);\n };\n var destroy = function destroy() {\n _$volumeContainer.off('mousemove', onContainerMouseOver);\n _$volumeContainer.off('mouseout', onContainerMouseLeave);\n _$volumeSliderContainer.off('mousedown', onSliderMouseDownHandler);\n _$volumeControl.off('click', onVolumeButtonClick);\n _$volumeSlider.off('focus', showVolumeSlider);\n _$volumeSlider.off('focusout', hideVolumeSliderOnFocusOut);\n _$volumeSlider.off('keydown', onKeyDownHandler);\n _$volumeSlider.off('keyup', onKeyHandler);\n mediaElement.removeEventListener('volumechange', onMediaVolumeChange);\n $container.off(events.Controls.Disable, disableControls);\n $container.off(events.Controls.Enable, enableControls);\n };\n initializeHandlers();\n initVolumeControls();\n return Object.defineProperties({\n hideControls: hideControls,\n destroy: destroy\n }, {\n volume: {\n get: function get() {\n return mediaElement.volume;\n },\n set: setVolume\n },\n muted: {\n get: function get() {\n return mediaElement.muted;\n },\n set: setMuted\n }\n });\n};\nvar VolumeControlView$1 = {\n /**\n * Factory method that returns a new VolumeControlView object.\n * @function create\n * @memberof TSC.VolumeControlView\n * @static\n * @param {Object} $container - jQuery element that contains a .volume-wrapper element where the volume controls will be injected\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n * @return new VolumeControlView instance\n */\n create: VolumeControlView\n};\n\n/**\n * @memberof TSC\n * @class AudioDescriptionControlView\n * @classdesc Audio Description Control View\n * @param {Object} $container - jQuery element that contains a .audio-description-control-wrapper element where the control will be injected\n */\nvar AudioDescriptionControlView = function AudioDescriptionControlView($container) {\n var _audioDescriptionEnabled = false;\n var _$audioDescriptionButton;\n var _$audioDescriptionGlyph;\n var createView = function createView() {\n var _markup = templateGenerator.generateAudioDescriptionButtonMarkup();\n $container.find('.audio-description-control-wrapper').html(_markup);\n _$audioDescriptionButton = $container.find('.audio-description-button');\n _$audioDescriptionGlyph = $container.find('.audio-description-button-glyph');\n };\n var setAudioDescriptionState = function setAudioDescriptionState(audioDescriptionEnabled) {\n _audioDescriptionEnabled = audioDescriptionEnabled;\n if (_audioDescriptionEnabled) {\n _$audioDescriptionButton.attr('aria-pressed', true);\n _$audioDescriptionGlyph.removeClass(cssClasses.audioDescriptionButtonGlyph).addClass(cssClasses.audioDescriptionButtonActiveGlyph);\n _$audioDescriptionButton.removeClass(cssClasses.tertiaryButton).addClass(cssClasses.tertiaryButtonActive);\n } else {\n _$audioDescriptionButton.attr('aria-pressed', false);\n _$audioDescriptionGlyph.removeClass(cssClasses.audioDescriptionButtonActiveGlyph).addClass(cssClasses.audioDescriptionButtonGlyph);\n _$audioDescriptionButton.removeClass(cssClasses.tertiaryButtonActive).addClass(cssClasses.tertiaryButton);\n }\n };\n var onButtonClick = function onButtonClick(e) {\n e.preventDefault();\n $container.trigger(events.AudioDescription.Changed, {\n audioDescriptionEnabled: !_audioDescriptionEnabled\n });\n };\n var onAudioDescriptionChange = function onAudioDescriptionChange(e, eventData) {\n setAudioDescriptionState(eventData.audioDescriptionEnabled);\n };\n var audioDescriptionFailedToPlay = function audioDescriptionFailedToPlay() {\n _$audioDescriptionButton.attr('disabled', true);\n };\n var disableControl = function disableControl() {\n _$audioDescriptionButton.attr('tabindex', tabIndex.Disabled);\n };\n var enableControl = function enableControl() {\n _$audioDescriptionButton.attr('tabindex', tabIndex.DomOrder);\n };\n var initializeHandlers = function initializeHandlers() {\n _$audioDescriptionButton.on('click', onButtonClick);\n $container.on(events.AudioDescription.Failed, audioDescriptionFailedToPlay);\n $container.on(events.Controls.Disable, disableControl);\n $container.on(events.Controls.Enable, enableControl);\n $container.on(events.AudioDescription.Changed, onAudioDescriptionChange);\n };\n var destroy = function destroy() {\n $container.off(events.AudioDescription.Failed, audioDescriptionFailedToPlay);\n $container.off(events.Controls.Disable, disableControl);\n $container.off(events.Controls.Enable, enableControl);\n $container.off(events.AudioDescription.Changed, onAudioDescriptionChange);\n _$audioDescriptionButton.off('click', onButtonClick);\n };\n createView();\n initializeHandlers();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar AudioDescriptionControlView$1 = {\n /**\n * Factory method that returns a new AudioDescriptionControlView object.\n * @function create\n * @memberof TSC.AudioDescriptionControlView\n * @static\n * @param {Object} $container - jQuery element that contains a .audio-description-control-wrapper element where the control will be injected\n * @return new AudioDescriptionControlView instance\n */\n create: AudioDescriptionControlView\n};\n\n/**\n * @memberof TSC\n * @class CaptionsControlView\n * @classdesc Captions Control View in player controls\n * @param {Object} $container - jQuery element that contains a ??? element where the control will be injected\n */\nvar CaptionsControlView = function CaptionsControlView($container) {\n var _captionsEnabled = false;\n var _$closedCaptionButton;\n var _$closedCaptionGlyph;\n var _normalButtonClass = cssClasses.closedCaptionButtonGlyph;\n var _activeButtonClass = cssClasses.closedCaptionButtonActiveGlyph;\n if (localizationStrings.getLanguage() !== languageCodes.ENGLISH) {\n _normalButtonClass = cssClasses.closedCaptionNonEnglishButtonGlyph;\n _activeButtonClass = cssClasses.closedCaptionNonEnglishButtonActiveGlyph;\n }\n var createView = function createView() {\n var _markup = templateGenerator.generateCaptionsButtonMarkup();\n $container.find('.caption-wrapper').html(_markup);\n _$closedCaptionButton = $container.find('.closed-caption-button');\n _$closedCaptionGlyph = $container.find('.closed-caption-button-glyph');\n };\n var setCaptionState = function setCaptionState(captionsEnabled) {\n _captionsEnabled = captionsEnabled;\n if (_captionsEnabled) {\n _$closedCaptionButton.attr('aria-pressed', true);\n _$closedCaptionGlyph.removeClass(_normalButtonClass).addClass(_activeButtonClass);\n _$closedCaptionButton.removeClass(cssClasses.tertiaryButton).addClass(cssClasses.tertiaryButtonActive);\n } else {\n _$closedCaptionButton.attr('aria-pressed', false);\n _$closedCaptionGlyph.removeClass(_activeButtonClass).addClass(_normalButtonClass);\n _$closedCaptionButton.removeClass(cssClasses.tertiaryButtonActive).addClass(cssClasses.tertiaryButton);\n }\n };\n var onButtonClick = function onButtonClick(e) {\n e.preventDefault();\n $container.trigger(events.Captions.Toggled, {\n captionsEnabled: !_captionsEnabled,\n savePreference: true\n });\n };\n var onCaptionsToggle = function onCaptionsToggle(e, eventData) {\n setCaptionState(eventData.captionsEnabled);\n };\n var disableControl = function disableControl() {\n _$closedCaptionButton.attr('tabindex', tabIndex.Disabled);\n };\n var enableControl = function enableControl() {\n _$closedCaptionButton.attr('tabindex', tabIndex.DomOrder);\n };\n var savedStateLoaded = function savedStateLoaded(e, eventData) {\n $container.trigger(events.Captions.Toggled, {\n captionsEnabled: eventData.captionsEnabled,\n savePreference: false\n });\n };\n var initializeHandlers = function initializeHandlers() {\n _$closedCaptionButton.on('click', onButtonClick);\n $container.on(events.Controls.Disable, disableControl);\n $container.on(events.Controls.Enable, enableControl);\n $container.on(events.Captions.StateLoaded, savedStateLoaded);\n $container.on(events.Captions.Toggled, onCaptionsToggle);\n };\n var setCaptionButtonVisible = function setCaptionButtonVisible(captionButtonVisible) {\n if (captionButtonVisible) {\n _$closedCaptionButton.removeClass(cssClasses.hide);\n } else {\n _$closedCaptionButton.addClass(cssClasses.hide);\n }\n };\n var destroy = function destroy() {\n $container.off(events.Controls.Disable, disableControl);\n $container.off(events.Controls.Enable, enableControl);\n $container.off(events.Captions.StateLoaded, savedStateLoaded);\n _$closedCaptionButton.off('click', onButtonClick);\n $container.off(events.Captions.Toggled, onCaptionsToggle);\n };\n createView();\n initializeHandlers();\n return Object.defineProperties({\n setCaptionButtonVisible: setCaptionButtonVisible,\n destroy: destroy\n }, {});\n};\nvar CaptionsControlView$1 = {\n /**\n * Factory method that returns a new AudioDescriptionControlView object.\n * @function create\n * @memberof TSC.CaptionsControlView\n * @static\n * @param {Object} $container - jQuery element that contains a ??? element where the control will be injected\n * @return new CaptionsControlView instance\n */\n create: CaptionsControlView\n};\n\nvar _hotkeysEnabled = true;\nvar areHotkeysEnabled = function areHotkeysEnabled() {\n return _hotkeysEnabled;\n};\nvar disableHotkeys = function disableHotkeys() {\n _hotkeysEnabled = false;\n};\nvar enableHotkeys = function enableHotkeys() {\n _hotkeysEnabled = true;\n};\nvar hotkeyService = {\n areHotkeysEnabled: areHotkeysEnabled,\n disableHotkeys: disableHotkeys,\n enableHotkeys: enableHotkeys\n};\n\nvar REMOVE_SCREEN_READER_ALERT_TIME = 1000;\n\n/**\n * @memberof TSC\n * @class TocControlView\n * @classdesc TOC Control View in player controls\n * @param {Object} $container - Smart Player root jquery element.\n * @param {TSC.playerConfiguration} playerConfiguration - Player configuration\n */\nvar TocControlView = function TocControlView($container, playerConfiguration) {\n var _tocDisplayed = false;\n var _$tocButton;\n var _$tocGlyph;\n var _windowRef = windowWrapper.getWindow();\n var createView = function createView() {\n var tocButtonMarkup = templateGenerator.generateTocButtonMarkup();\n $container.find('.toc-button-wrapper').html(tocButtonMarkup);\n _$tocButton = $container.find('.toc-button');\n _$tocGlyph = $container.find('.toc-button-glyph');\n };\n var alertScreenReader = function alertScreenReader(alertText) {\n var screenReaderAlertMarkup = templateGenerator.generateScreenReaderAlertMarkup(alertText);\n var $screenReaderAlert = $(screenReaderAlertMarkup);\n $container.append($screenReaderAlert);\n _windowRef.setTimeout(function () {\n $screenReaderAlert.remove();\n }, REMOVE_SCREEN_READER_ALERT_TIME);\n };\n var setTocDisplayState = function setTocDisplayState(displayToc) {\n _tocDisplayed = displayToc;\n if (_tocDisplayed) {\n _$tocButton.attr('aria-expanded', true);\n _$tocButton.removeClass(cssClasses.tertiaryButton).addClass(cssClasses.tertiaryButtonActive);\n // bug in IE11 that does not display SVG glyph when toggling SVG when enabling TOC on player load\n if (!(deviceInfo.isIE() && playerConfiguration.getSidebarEnabled())) {\n _$tocGlyph.addClass(cssClasses.tocButtonActiveGlyph);\n }\n } else {\n _$tocGlyph.removeClass(cssClasses.tocButtonActiveGlyph);\n _$tocButton.attr('aria-expanded', false);\n _$tocButton.removeClass(cssClasses.tertiaryButtonActive).addClass(cssClasses.tertiaryButton);\n }\n $container.trigger(events.Controls.TocDisplayToggled, {\n displayToc: _tocDisplayed\n });\n };\n var setInitialState = function setInitialState() {\n setTocDisplayState(_tocDisplayed);\n };\n var onButtonClick = function onButtonClick(e) {\n e.preventDefault();\n setTocDisplayState(!_tocDisplayed);\n };\n var onKeyDownHandler = function onKeyDownHandler(e) {\n if (!hotkeyService.areHotkeysEnabled()) {\n return;\n }\n var isTypingInSearchBox = e.target && e.target.classList && e.target.classList.contains('toc-search-input');\n if (isTypingInSearchBox) {\n return;\n }\n if (keys.isKeyOfType(e.key, keys.keyTypes.tableOfContents)) {\n if (_$tocButton.attr('tabindex') !== tabIndex.Disabled) {\n if (_$tocButton.is(':focus')) {\n alertScreenReader(_tocDisplayed ? localizationStrings.getPlayerString(playerStringNames.tableOfContentsHidden) : localizationStrings.getPlayerString(playerStringNames.tableOfContentsDisplayed));\n } else {\n _$tocButton.focus();\n }\n setTocDisplayState(!_tocDisplayed);\n }\n }\n };\n var disableControl = function disableControl() {\n _$tocButton.attr('tabindex', tabIndex.Disabled);\n };\n var enableControl = function enableControl() {\n _$tocButton.attr('tabindex', tabIndex.DomOrder);\n };\n var onHideToc = function onHideToc() {\n setTocDisplayState(false);\n };\n var onShowToc = function onShowToc() {\n setTocDisplayState(true);\n };\n var focusTocButton = function focusTocButton() {\n _$tocButton.focus();\n };\n var initializeHandlers = function initializeHandlers() {\n _$tocButton.on('click', onButtonClick);\n $container.on('keydown', onKeyDownHandler);\n $container.on(events.Controls.Disable, disableControl);\n $container.on(events.Controls.Enable, enableControl);\n $container.on(events.Controls.FocusTocButton, focusTocButton);\n $container.on(events.Controls.HideToc, onHideToc);\n $container.on(events.Controls.ShowToc, onShowToc);\n };\n var destroy = function destroy() {\n _$tocButton.off('click', onButtonClick);\n $container.off('keydown', onKeyDownHandler);\n $container.off(events.Controls.Disable, disableControl);\n $container.off(events.Controls.Enable, enableControl);\n $container.off(events.Controls.FocusTocButton, focusTocButton);\n $container.off(events.Controls.HideToc, onHideToc);\n $container.off(events.Controls.ShowToc, onShowToc);\n };\n createView();\n initializeHandlers();\n setInitialState();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar TocControlView$1 = {\n /**\n * Factory method that returns a new TocControlView object.\n * @function create\n * @memberof TSC.TocControlView\n * @static\n * @param {Object} $container - Smart Player root jquery element.\n * @param {TSC.playerConfiguration} playerConfiguration - Player configuration\n * @return new TocControlView instance\n */\n create: TocControlView\n};\n\nvar LOCAL_STORAGE_PLAYBACK_SPEED_KEY = 'tscSmartPlayerPlaybackSpeed';\nvar _defaultPlaybackRate = 1.0;\nvar _defaultAvailablePlaybackRates = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\nvar hideButton = function hideButton($container) {\n $container.find('.settings-button').hide();\n};\n\n/**\n * @memberof TSC\n * @class PlayerSettingsView\n * @classdesc PlayerSettings View\n */\nvar PlayerSettingsView = function PlayerSettingsView($container, mediaElement, xmp, playbackRates, audioDescriptionMediaSrc) {\n var _isOpen = false;\n var _currentPlaybackRate = _defaultPlaybackRate;\n var _availablePlaybackRates = playbackRates || _defaultAvailablePlaybackRates;\n var _minPlaybackRate = _availablePlaybackRates[0];\n var _maxPlaybackRate = _availablePlaybackRates[_availablePlaybackRates.length - 1];\n mediaElement.playbackRate = _currentPlaybackRate;\n mediaElement.defaultPlaybackRate = _currentPlaybackRate;\n var getPlaybackRates = function getPlaybackRates() {\n var playerRateOptionsLocalizedStrings = localizationStrings.getPlayerString(playerStringNames.playerRateOptionsText);\n var playbackRatesList = [];\n for (var j = _availablePlaybackRates.length - 1; j >= 0; j--) {\n var rate = _availablePlaybackRates[j];\n playbackRatesList.push({\n rateValue: rate,\n rateLabel: playerRateOptionsLocalizedStrings[rate],\n selected: rate === _defaultPlaybackRate\n });\n }\n return playbackRatesList;\n };\n var getClosedCaptionLanguages = function getClosedCaptionLanguages() {\n var ccLanguageList = [];\n var selectedLanguageIdentifier = xmp.captionController.getActiveLanguageIdentifier();\n if (selectedLanguageIdentifier.identifier === languageIdentifiers.identifiers[\"default\"]) {\n selectedLanguageIdentifier = LanguageIdentifier$1.create(localizationStrings.getLanguage());\n }\n var foundSelectedLanguageInAvailableList = false;\n xmp.captionController.getAvailableLanguages().forEach(function (languageIdentifierString) {\n var languageIdentifier = LanguageIdentifier$1.create(languageIdentifierString);\n var languageLabel = localizationStrings.getLanguageNameFromIdentifierString(languageIdentifierString);\n var languageShouldBeSelected = languageIdentifier.language === selectedLanguageIdentifier.language;\n if (languageShouldBeSelected) {\n foundSelectedLanguageInAvailableList = true;\n }\n ccLanguageList.push({\n languageValue: languageIdentifierString,\n languageLabel: languageLabel,\n selected: languageShouldBeSelected\n });\n });\n if (foundSelectedLanguageInAvailableList) {\n xmp.captionController.setActiveLanguageIdentifier(selectedLanguageIdentifier.identifier);\n } else {\n xmp.captionController.setActiveLanguageIdentifier(languageIdentifiers.identifiers[\"default\"]);\n }\n return ccLanguageList;\n };\n var playerSettingsViewMarkup = templateGenerator.generateSettingsMarkup(xmp ? xmp.captionsHasMultipleLanguages : false, getPlaybackRates(), xmp ? getClosedCaptionLanguages() : [], xmp && xmp.hasCaptionItems, audioDescriptionMediaSrc);\n var _$playerSettingsWrapper = $container.find('.player-settings-wrapper');\n _$playerSettingsWrapper.html(playerSettingsViewMarkup);\n var _$playerSettingsViewEl = $container.find('.player-settings-container');\n var _$playbackRateSelectEl = _$playerSettingsViewEl.find('.player-speed-select');\n var _$ccLanguageSelectEl = _$playerSettingsViewEl.find('.cc-language-select');\n var _$playerSettingsButton = $container.find('.settings-button');\n var _$playerSettingsButtonGlyph = $container.find('.settings-button-glyph');\n var _$closedCaptionToggleContainer = $container.find('.closed-caption-setting');\n var _$closedCaptionToggle = _$playerSettingsViewEl.find('.cc-toggle');\n var _$closedCaptionToggleElement = _$closedCaptionToggle[0];\n var _$audioDescriptionToggle = _$playerSettingsViewEl.find('.ad-toggle');\n var _$audioDescriptionToggleElement = _$audioDescriptionToggle[0];\n var _$settingsCloseButton = _$playerSettingsViewEl.find('.settings-close-button');\n var _$settingsHeaderContainer = _$playerSettingsViewEl.find('.setting-header-container');\n if (!playerConfiguration.showAcknowledgementLink) {\n _$playerSettingsWrapper.find('.settings-acknowledgementlink').hide();\n }\n var hideView = function hideView() {\n _isOpen = false;\n $container.trigger(events.Controls.PlayerSettingsClose);\n _$playerSettingsViewEl.hide();\n _$playerSettingsButton.attr('aria-expanded', false);\n _$playerSettingsButton.removeClass(cssClasses.tertiaryButtonActive).addClass(cssClasses.tertiaryButton);\n _$playerSettingsButtonGlyph.removeClass(cssClasses.settingsButtonActiveGlyph).addClass(cssClasses.settingsButtonGlyph);\n removeClickHandler();\n viewHelper.removeFocusTrap();\n };\n var showView = function showView() {\n _isOpen = true;\n $container.trigger(events.Controls.PlayerSettingsOpen);\n _$playerSettingsViewEl.show();\n _$playerSettingsButton.attr('aria-expanded', true);\n _$playerSettingsButton.removeClass(cssClasses.tertiaryButton).addClass(cssClasses.tertiaryButtonActive);\n _$playerSettingsButtonGlyph.removeClass(cssClasses.settingsButtonGlyph).addClass(cssClasses.settingsButtonActiveGlyph);\n addClickHandler();\n trapFocusInModalView();\n };\n var isModalView = function isModalView() {\n return _$settingsHeaderContainer.css('display') !== 'none';\n };\n var trapFocusInModalView = function trapFocusInModalView() {\n if (isModalView()) {\n viewHelper.trapFocus(_$playerSettingsViewEl);\n }\n };\n var addClickHandler = function addClickHandler() {\n $container.mouseup(hideSettingsViewOnClickOutside);\n };\n var removeClickHandler = function removeClickHandler() {\n $container.off('mouseup', hideSettingsViewOnClickOutside);\n };\n var hideSettingsViewOnClickOutside = function hideSettingsViewOnClickOutside(e) {\n if (!_isOpen) {\n return;\n }\n if (!_$playerSettingsViewEl.is(e.target) && _$playerSettingsViewEl.has(e.target).length === 0) {\n //This timeout is so that the click handler for the settings view button sees the right state\n setTimeout(function () {\n hideView();\n }, 50);\n }\n };\n var syncPlaybackRateControlsWithPlaybackRateValue = function syncPlaybackRateControlsWithPlaybackRateValue() {\n var realPlaybackRate = mediaElement.playbackRate;\n if (realPlaybackRate !== Number(_$playbackRateSelectEl.find(':selected').val())) {\n if (realPlaybackRate > _maxPlaybackRate) {\n setPlaybackRate(_maxPlaybackRate);\n } else if (realPlaybackRate < _minPlaybackRate) {\n setPlaybackRate(_minPlaybackRate);\n } else {\n _$playbackRateSelectEl.find('.player-speed-option[value=\"' + mediaElement.playbackRate + '\"]').prop('selected', true);\n }\n }\n };\n var setPlaybackRate = function setPlaybackRate(playbackSpeed) {\n if (!playbackSpeed) {\n playbackSpeed = _defaultPlaybackRate;\n } else if (playbackSpeed < _minPlaybackRate) {\n playbackSpeed = _minPlaybackRate;\n } else if (playbackSpeed > _maxPlaybackRate) {\n playbackSpeed = _maxPlaybackRate;\n }\n _currentPlaybackRate = playbackSpeed;\n mediaElement.playbackRate = playbackSpeed;\n mediaElement.defaultPlaybackRate = playbackSpeed;\n localStorageWrapper.setItem(LOCAL_STORAGE_PLAYBACK_SPEED_KEY, playbackSpeed.toString());\n\n // workaround to get iOS to apply the playback rate change right away\n if (deviceInfo.isIOS() && !mediaElement.paused) {\n mediaElement.pause();\n mediaElement.play();\n }\n };\n var onPlaybackRateControlChange = function onPlaybackRateControlChange() {\n var playbackSpeed = Number(_$playbackRateSelectEl.find(':selected').val());\n setPlaybackRate(playbackSpeed);\n };\n var onCCLanguageControlChange = function onCCLanguageControlChange() {\n var ccLanguageCode = _$ccLanguageSelectEl.find(':selected').val();\n xmp.captionController.setActiveLanguageIdentifier(ccLanguageCode);\n $container.trigger(events.Captions.LanguageChanged);\n };\n var onAudioDescriptionToggleChange = function onAudioDescriptionToggleChange() {\n var checked = _$audioDescriptionToggleElement.checked;\n $container.trigger(events.AudioDescription.Changed, {\n audioDescriptionEnabled: checked\n });\n };\n var onAudioDescriptionChange = function onAudioDescriptionChange(e, eventData) {\n if (eventData.audioDescriptionEnabled) {\n _$audioDescriptionToggleElement.checked = true;\n } else {\n _$audioDescriptionToggleElement.checked = false;\n }\n };\n var onClosedCaptionToggleChange = function onClosedCaptionToggleChange() {\n var checked = _$closedCaptionToggleElement.checked;\n $container.trigger(events.Captions.Toggled, {\n captionsEnabled: checked,\n savePreference: true\n });\n };\n var onCaptionsToggled = function onCaptionsToggled(e, eventData) {\n if (_$closedCaptionToggleElement) {\n if (eventData.captionsEnabled) {\n _$closedCaptionToggleElement.checked = true;\n } else {\n _$closedCaptionToggleElement.checked = false;\n }\n }\n };\n var onPlaybackRateValueChange = function onPlaybackRateValueChange() {\n syncPlaybackRateControlsWithPlaybackRateValue();\n };\n var incrementPlaybackRate = function incrementPlaybackRate() {\n var indexOfCurrentRate = _availablePlaybackRates.indexOf(_currentPlaybackRate);\n if (indexOfCurrentRate === -1) {\n return;\n }\n if (indexOfCurrentRate + 1 < _availablePlaybackRates.length) {\n setPlaybackRate(_availablePlaybackRates[indexOfCurrentRate + 1]);\n }\n };\n var decrementPlaybackRate = function decrementPlaybackRate() {\n var indexOfCurrentRate = _availablePlaybackRates.indexOf(_currentPlaybackRate);\n if (indexOfCurrentRate === -1) {\n return;\n }\n if (indexOfCurrentRate > 0) {\n setPlaybackRate(_availablePlaybackRates[indexOfCurrentRate - 1]);\n }\n };\n var onKeyboardShortCut = function onKeyboardShortCut(e) {\n if (!hotkeyService.areHotkeysEnabled()) {\n return;\n }\n if (keys.isKeyOfType(e.key, keys.keyTypes.upArrow) && e.shiftKey) {\n e.preventDefault();\n incrementPlaybackRate();\n } else if (keys.isKeyOfType(e.key, keys.keyTypes.downArrow) && e.shiftKey) {\n e.preventDefault();\n decrementPlaybackRate();\n } else if (keys.isKeyOfType(e.key, keys.keyTypes.escape)) {\n if (_isOpen) {\n if (_$playbackRateSelectEl.is(':focus') || _$ccLanguageSelectEl.is(':focus')) {\n _$playerSettingsButton.focus();\n }\n hideView();\n }\n }\n };\n var stopPropagation = function stopPropagation(e) {\n e.stopPropagation();\n };\n var disableControl = function disableControl() {\n _$playerSettingsButton.attr('tabindex', tabIndex.Disabled);\n };\n var enableControl = function enableControl() {\n _$playerSettingsButton.attr('tabindex', tabIndex.DomOrder);\n };\n var onPlayerSettingsButtonClick = function onPlayerSettingsButtonClick(e) {\n e.preventDefault();\n if (_isOpen) {\n hideView();\n } else {\n showView();\n highlightDisabler.disableHighlightsOnMouseClick(_$playbackRateSelectEl, e);\n }\n };\n var onDisplayCaptionControl = function onDisplayCaptionControl(e, eventData) {\n if (eventData.displayCaptionControl) {\n _$closedCaptionToggleContainer.removeClass(cssClasses.hide);\n } else {\n _$closedCaptionToggleContainer.addClass(cssClasses.hide);\n }\n };\n var loadSavedSettings = function loadSavedSettings() {\n var savedPlayBackSpeedFromLocalStorage = localStorageWrapper.getItem(LOCAL_STORAGE_PLAYBACK_SPEED_KEY);\n if (savedPlayBackSpeedFromLocalStorage) {\n setPlaybackRate(+savedPlayBackSpeedFromLocalStorage);\n }\n };\n var initializeHandlers = function initializeHandlers() {\n _$playbackRateSelectEl.on('click', stopPropagation);\n _$playbackRateSelectEl.on('mouseup', stopPropagation);\n _$playbackRateSelectEl.on('change', onPlaybackRateControlChange);\n _$ccLanguageSelectEl.on('click', stopPropagation);\n _$ccLanguageSelectEl.on('mouseup', stopPropagation);\n _$ccLanguageSelectEl.on('change', onCCLanguageControlChange);\n _$playerSettingsButton.on('click', onPlayerSettingsButtonClick);\n _$settingsCloseButton.on('click', close);\n _$audioDescriptionToggle.on('change', onAudioDescriptionToggleChange);\n _$closedCaptionToggle.on('change', onClosedCaptionToggleChange);\n if (mediaElement.addEventListener) {\n mediaElement.addEventListener('ratechange', onPlaybackRateValueChange, false);\n } else if (mediaElement.on) {\n mediaElement.on('ratechange', onPlaybackRateValueChange);\n }\n $container.on(events.Controls.Disable, disableControl);\n $container.on(events.Controls.Enable, enableControl);\n $container.on('keydown', onKeyboardShortCut);\n $container.on(events.AudioDescription.Changed, onAudioDescriptionChange);\n $container.on(events.Captions.Toggled, onCaptionsToggled);\n $container.on(events.Controls.DisplayCaptionControl, onDisplayCaptionControl);\n };\n var destroy = function destroy() {\n _$playbackRateSelectEl.off('click', stopPropagation);\n _$playbackRateSelectEl.off('mouseup', stopPropagation);\n _$playbackRateSelectEl.off('change', onPlaybackRateControlChange);\n _$ccLanguageSelectEl.off('click', stopPropagation);\n _$ccLanguageSelectEl.off('mouseup', stopPropagation);\n _$ccLanguageSelectEl.off('change', onCCLanguageControlChange);\n _$playerSettingsButton.off('click', onPlayerSettingsButtonClick);\n _$settingsCloseButton.off('click', close);\n _$audioDescriptionToggle.off('change', onAudioDescriptionToggleChange);\n _$closedCaptionToggle.off('change', onClosedCaptionToggleChange);\n if (mediaElement.removeEventListener) {\n mediaElement.removeEventListener('ratechange', onPlaybackRateValueChange);\n } else if (mediaElement.off) {\n mediaElement.off('ratechange', onPlaybackRateValueChange);\n }\n $container.off(events.Controls.Disable, disableControl);\n $container.off(events.Controls.Enable, enableControl);\n $container.off('keydown', onKeyboardShortCut);\n $container.off(events.AudioDescription.Changed, onAudioDescriptionChange);\n $container.off(events.Captions.Toggled, onCaptionsToggled);\n $container.off(events.Controls.DisplayCaptionControl, onDisplayCaptionControl);\n };\n var open = function open() {\n if (!_isOpen) {\n showView();\n }\n };\n var close = function close() {\n if (_isOpen) {\n hideView();\n }\n };\n loadSavedSettings();\n initializeHandlers();\n hideView();\n return Object.defineProperties({\n open: open,\n close: close,\n destroy: destroy\n }, {\n isOpen: {\n get: function get() {\n return _isOpen;\n }\n },\n playbackRate: {\n get: function get() {\n return _currentPlaybackRate;\n },\n set: setPlaybackRate\n }\n });\n};\nvar PlayerSettingsView$1 = {\n /**\n * Factory method that returns a new PlayerSettingsView object.\n * @function create\n * @memberof TSC.PlayerSettingsView\n * @static\n * @param {Object} $container - jQuery element that contains a .settings-button element and a .player-settings-wrapper element where the player settings controls will be injected\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n * @param {Array} playbackRates - optional - a list of available playback rates\n * @param {TSC.xmp} xmp - optional - xmp data model\n * @param {string} audioDescriptionMediaSrc - optional - string containing media source to determine if Audio Description button is needed\n * @return new PlayerSettingsView instance\n */\n create: PlayerSettingsView,\n /**\n * Method that hides the settings button within a container.\n * @function hideButton\n * @memberof TSC.PlayerSettingsView\n * @static\n * @param {Object} $container - jQuery element that contains a .settings-button element to be hidden\n */\n hideButton: hideButton\n};\n\n/**\n * @memberof TSC\n * @class nullPipController\n * @classdesc Null controller when PIP feature is not available\n */\nvar noop = function noop() {}; // eslint-disable-line\n\nvar nullPipController = Object.defineProperties({\n enter: noop,\n exit: noop,\n bindChangeEvent: noop,\n unbindChangeEvent: noop\n}, {\n inPip: {\n get: function get() {\n return false;\n }\n },\n isSupported: {\n get: function get() {\n return false;\n }\n }\n});\n\nvar ENTER_PIP_EVENT = 'enterpictureinpicture';\nvar LEAVE_PIP_EVENT = 'leavepictureinpicture';\n\n/**\n * @memberof TSC\n * @class StandardsPipController\n * @classdesc Controller to interface with standards PIP api.\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n */\nvar StandardsPipController = function StandardsPipController(mediaElement) {\n var documentRef = documentWrapper.getDocument();\n var enter = function enter() {\n mediaElement.requestPictureInPicture();\n };\n var exit = function exit() {\n documentRef.exitPictureInPicture();\n };\n var bindChangeEvent = function bindChangeEvent(onChangeHandler) {\n mediaElement.addEventListener(ENTER_PIP_EVENT, onChangeHandler);\n mediaElement.addEventListener(LEAVE_PIP_EVENT, onChangeHandler);\n };\n var unbindChangeEvent = function unbindChangeEvent(onChangeHandler) {\n mediaElement.removeEventListener(ENTER_PIP_EVENT, onChangeHandler);\n mediaElement.removeEventListener(LEAVE_PIP_EVENT, onChangeHandler);\n };\n return Object.defineProperties({\n enter: enter,\n exit: exit,\n bindChangeEvent: bindChangeEvent,\n unbindChangeEvent: unbindChangeEvent\n }, {\n inPip: {\n get: function get() {\n return mediaElement === documentRef.pictureInPictureElement;\n }\n },\n isSupported: {\n get: function get() {\n return true;\n }\n }\n });\n};\nvar isControllerSupported$1 = function isControllerSupported() {\n var documentRef = documentWrapper.getDocument();\n return 'pictureInPictureEnabled' in documentRef && documentRef.pictureInPictureEnabled;\n};\nvar StandardsPipController$1 = {\n /**\n * Factory method that returns a new StandardsPipController object\n * @function create\n * @memberof TSC.StandardsPipController\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n * @static\n * @return new StandardsPipController instance\n */\n create: StandardsPipController,\n /**\n * Check to see if StandardsPipController is supported for platform being run on\n * @function isControllerSupported\n * @memberof TSC.StandardsPipController\n * @static\n * @return {Boolean} is controller supported on platform\n */\n isControllerSupported: isControllerSupported$1\n};\n\nvar CHANGED_PIP_MODE_SAFARI_EVENT = 'webkitpresentationmodechanged';\nvar SAFARI_INLINE_MODE = 'inline';\nvar SAFARI_PIP_MODE = 'picture-in-picture';\n\n/**\n * @memberof TSC\n * @class LegacySafariPipController\n * @classdesc Controller to interface with Safari PIP api. This API is supported before Safari 14.\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n */\nvar LegacySafariPipController = function LegacySafariPipController(mediaElement) {\n var enter = function enter() {\n mediaElement.webkitSetPresentationMode(SAFARI_PIP_MODE);\n };\n var exit = function exit() {\n mediaElement.webkitSetPresentationMode(SAFARI_INLINE_MODE);\n };\n var bindChangeEvent = function bindChangeEvent(onChangeHandler) {\n mediaElement.addEventListener(CHANGED_PIP_MODE_SAFARI_EVENT, onChangeHandler);\n };\n var unbindChangeEvent = function unbindChangeEvent(onChangeHandler) {\n mediaElement.removeEventListener(CHANGED_PIP_MODE_SAFARI_EVENT, onChangeHandler);\n };\n return Object.defineProperties({\n enter: enter,\n exit: exit,\n bindChangeEvent: bindChangeEvent,\n unbindChangeEvent: unbindChangeEvent\n }, {\n inPip: {\n get: function get() {\n return mediaElement.webkitPresentationMode === SAFARI_PIP_MODE;\n }\n },\n isSupported: {\n get: function get() {\n return true;\n }\n }\n });\n};\nvar isControllerSupported = function isControllerSupported(mediaElement) {\n return mediaElement && typeof mediaElement.webkitSetPresentationMode === 'function' && typeof mediaElement.webkitSupportsPresentationMode === 'function' && mediaElement.webkitSupportsPresentationMode(SAFARI_PIP_MODE);\n};\nvar LegacySafariPipController$1 = {\n /**\n * Factory method that returns a new LegacySafariPipController object\n * @function create\n * @memberof TSC.LegacySafariPipController\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n * @static\n * @return new LegacySafariPipController instance\n */\n create: LegacySafariPipController,\n /**\n * Check to see if LegacySafariPipController is supported for platform being run on\n * @function isControllerSupported\n * @memberof TSC.LegacySafariPipController\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n * @static\n * @return {Boolean} is controller supported on platform\n */\n isControllerSupported: isControllerSupported\n};\n\nvar getPipController = function getPipController(mediaElement) {\n if (!playerConfiguration.disablePictureInPicture && StandardsPipController$1.isControllerSupported()) {\n return StandardsPipController$1.create(mediaElement);\n } else if (!playerConfiguration.disablePictureInPicture && LegacySafariPipController$1.isControllerSupported(mediaElement)) {\n return LegacySafariPipController$1.create(mediaElement);\n }\n return nullPipController;\n};\nvar pipControllerFactory = {\n getPipController: getPipController\n};\n\n/**\n * @memberof TSC\n * @class PipControlView\n * @classdesc PIP View Control\n * @param {Object} $container - jQuery element that contains a .settings-button element and a .player-settings-wrapper element where the player settings controls will be injected\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n */\nvar PipControlView = function PipControlView($container, mediaElement) {\n var _$pipButton = null;\n var _pipApiController = null;\n var onPresentationModeChange = function onPresentationModeChange() {\n $container.trigger(events.Controls.PipChanged, {\n pipViewActive: _pipApiController.inPip\n });\n };\n var onPipControlClick = function onPipControlClick(e) {\n e.preventDefault();\n _pipApiController.enter();\n };\n var handleSmartPlayerActionEvents = function handleSmartPlayerActionEvents() {\n if (_pipApiController && _pipApiController.inPip) {\n _pipApiController.exit();\n }\n };\n var disableControl = function disableControl() {\n _$pipButton.attr('tabindex', tabIndex.Disabled);\n };\n var enableControl = function enableControl() {\n _$pipButton.attr('tabindex', tabIndex.DomOrder);\n };\n var createView = function createView() {\n var buttonTitle = localizationStrings.getPlayerString(playerStringNames.accessBtnPip);\n var _markup = templateGenerator.generatePipControlMarkup(buttonTitle);\n $container.find('.pip-wrapper').html(_markup);\n _$pipButton = $container.find('.pip-button');\n };\n var initializeHandlers = function initializeHandlers() {\n _pipApiController.bindChangeEvent(onPresentationModeChange);\n _$pipButton.on('click', onPipControlClick);\n $container.on(events.Hotspots.Paused, handleSmartPlayerActionEvents);\n $container.on(events.Quizzing.Paused, handleSmartPlayerActionEvents);\n $container.on(events.Media.End, handleSmartPlayerActionEvents);\n $container.on(events.Controls.Disable, disableControl);\n $container.on(events.Controls.Enable, enableControl);\n };\n var initialize = function initialize() {\n _pipApiController = pipControllerFactory.getPipController(mediaElement);\n if (_pipApiController.isSupported) {\n createView();\n initializeHandlers();\n }\n };\n var destroy = function destroy() {\n if (_pipApiController && _pipApiController.isSupported) {\n _pipApiController.unbindChangeEvent(onPresentationModeChange);\n _$pipButton.off('click', onPipControlClick);\n $container.off(events.Hotspots.Paused, handleSmartPlayerActionEvents);\n $container.off(events.Quizzing.Paused, handleSmartPlayerActionEvents);\n $container.off(events.Media.End, handleSmartPlayerActionEvents);\n $container.off(events.Controls.Disable, disableControl);\n $container.off(events.Controls.Enable, enableControl);\n }\n };\n return Object.defineProperties({\n initialize: initialize,\n destroy: destroy\n }, {});\n};\nvar PipControlView$1 = {\n /**\n * Factory method that returns a new PipControlView object.\n * @function create\n * @memberof TSC.PipControlView\n * @param {Object} $container - jQuery element that contains a .settings-button element and a .player-settings-wrapper element where the player settings controls will be injected\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n * @static\n * @return new PipControlView instance\n */\n create: PipControlView\n};\n\nvar DisplayModes = {\n Normal: 'normal',\n Theater: 'theater',\n Fullscreen: 'fullscreen',\n PictureInPicture: 'picture-in-picture'\n};\n\nvar LOCAL_STORAGE_DISPLAY_MODE_KEY = 'tscSmartPlayerDisplayMode';\n\n/**\n * @memberof TSC\n * @class TheaterModeControlView\n * @classdesc Theater Mode View Control\n * @param {Object} $container - jQuery element that contains a wrapper element where the theater mode control will be injected\n */\nvar TheaterModeControlView = function TheaterModeControlView($container) {\n var _theaterModeEnabled = false;\n var _$theaterModeButton;\n var _$theaterModeGlyph;\n var disableControl = function disableControl() {\n _$theaterModeButton.attr('tabindex', tabIndex.Disabled);\n };\n var enableControl = function enableControl() {\n _$theaterModeButton.attr('tabindex', tabIndex.DomOrder);\n };\n var sendTheaterModeChangedEvent = function sendTheaterModeChangedEvent() {\n $container.trigger(events.Controls.TheaterModeChanged, {\n displayMode: _theaterModeEnabled ? DisplayModes.Theater : DisplayModes.Normal\n });\n };\n var setDisplayMode = function setDisplayMode(enabled) {\n _theaterModeEnabled = enabled;\n $container.playerState.displayMode = _theaterModeEnabled ? DisplayModes.Theater : DisplayModes.Normal;\n localStorageWrapper.setItem(LOCAL_STORAGE_DISPLAY_MODE_KEY, $container.playerState.displayMode);\n if (_theaterModeEnabled) {\n _$theaterModeButton.attr('title', localizationStrings.getPlayerString(playerStringNames.accessBtnExitTheaterMode));\n _$theaterModeButton.attr('aria-pressed', true);\n _$theaterModeGlyph.removeClass(cssClasses.theaterModeButtonGlyph).addClass(cssClasses.theaterModeButtonActiveGlyph);\n _$theaterModeButton.removeClass(cssClasses.tertiaryButton).addClass(cssClasses.tertiaryButtonActive);\n } else {\n _$theaterModeButton.attr('title', localizationStrings.getPlayerString(playerStringNames.accessBtnTheaterMode));\n _$theaterModeButton.attr('aria-pressed', false);\n _$theaterModeGlyph.removeClass(cssClasses.theaterModeButtonActiveGlyph).addClass(cssClasses.theaterModeButtonGlyph);\n _$theaterModeButton.removeClass(cssClasses.tertiaryButtonActive).addClass(cssClasses.tertiaryButton);\n }\n };\n var loadSavedSettings = function loadSavedSettings() {\n var savedDisplayStateStorage = localStorageWrapper.getItem(LOCAL_STORAGE_DISPLAY_MODE_KEY);\n if (savedDisplayStateStorage) {\n setDisplayMode(savedDisplayStateStorage === DisplayModes.Theater);\n sendTheaterModeChangedEvent();\n } else {\n setDisplayMode(_theaterModeEnabled);\n }\n };\n var onFullscreenChange = function onFullscreenChange(e, eventData) {\n if (eventData.inFullScreen) {\n _$theaterModeButton.hide();\n } else {\n _$theaterModeButton.show();\n }\n };\n var onButtonClick = function onButtonClick(e) {\n e.preventDefault();\n setDisplayMode(!_theaterModeEnabled);\n sendTheaterModeChangedEvent();\n };\n var createView = function createView() {\n var markup = templateGenerator.generateTheaterModeButtonMarkup();\n $container.find('.theater-mode-wrapper').html(markup);\n _$theaterModeButton = $container.find('.theater-mode-button');\n _$theaterModeGlyph = $container.find('.theater-mode-button-glyph');\n };\n var initializeHandlers = function initializeHandlers() {\n _$theaterModeButton.on('click', onButtonClick);\n $container.on(events.Controls.PlayerInitialized, loadSavedSettings);\n $container.on(events.Controls.FullScreenChange, onFullscreenChange);\n $container.on(events.Controls.Disable, disableControl);\n $container.on(events.Controls.Enable, enableControl);\n };\n var destroy = function destroy() {\n _$theaterModeButton.off('click', onButtonClick);\n $container.off(events.Controls.PlayerInitialized, loadSavedSettings);\n $container.off(events.Controls.FullScreenChange, onFullscreenChange);\n $container.off(events.Controls.Disable, disableControl);\n $container.off(events.Controls.Enable, enableControl);\n };\n createView();\n initializeHandlers();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar TheaterModeControlView$1 = {\n create: TheaterModeControlView\n};\n\nvar FULL_SCREEN_BUTTON_MODE = 'fullScreenMode';\nvar FULL_FRAME_BUTTON_MODE = 'fullFrameMode';\nvar EXPAND_BUTTON_MODE = 'expandMode';\nvar HIDDEN_BUTTON_MODE = 'hiddenMode';\n\n/**\n * @memberof TSC\n * @class FullscreenControlView\n * @classdesc Full Screen Control View\n * @param {jQuery} $container - top level Smart Player container\n * @param {HTMLVideoElement} videoElement\n */\nvar FullscreenControlView = function FullscreenControlView($container, videoElement) {\n var _inFullScreen = false;\n var _inFullFrame = false;\n var _$document = $(window.document);\n var _$fullScreenButton;\n var _$fullScreenGlyph;\n var _fullScreenDomElement = playerConfiguration.customFullScreenDomElement ? playerConfiguration.customFullScreenDomElement : $container.get(0);\n var _elementToFullscreen;\n var _buttonMode = null;\n var _legacyIOSFullScreenMode = false;\n var findButtonMode = function findButtonMode(canSupportExpandVideoMode) {\n if (deviceInfo.supportsFullScreen()) {\n _legacyIOSFullScreenMode = false;\n _elementToFullscreen = _fullScreenDomElement;\n _buttonMode = FULL_SCREEN_BUTTON_MODE;\n } else if (deviceInfo.supportsLegacyIOSFullScreen(videoElement)) {\n _legacyIOSFullScreenMode = true;\n _elementToFullscreen = videoElement;\n _buttonMode = FULL_SCREEN_BUTTON_MODE;\n } else if (iFrameBridge.isInIframe() && canSupportExpandVideoMode) {\n _buttonMode = playerConfiguration.getDisableFullframeMode() ? EXPAND_BUTTON_MODE : FULL_FRAME_BUTTON_MODE;\n } else {\n _buttonMode = HIDDEN_BUTTON_MODE;\n }\n };\n var updateButtonTitle = function updateButtonTitle() {\n var buttonTitle = localizationStrings.getPlayerString(playerStringNames.accessBtnFullScreen);\n if (_buttonMode === EXPAND_BUTTON_MODE) {\n buttonTitle = localizationStrings.getPlayerString(playerStringNames.accessBtnFullScreenExpand);\n }\n _$fullScreenButton.attr('title', buttonTitle);\n };\n var setButtonDisplay = function setButtonDisplay() {\n if (_buttonMode === HIDDEN_BUTTON_MODE) {\n _$fullScreenButton.hide();\n } else {\n _$fullScreenButton.show();\n }\n };\n var createView = function createView() {\n var buttonTitle = localizationStrings.getPlayerString(playerStringNames.accessBtnFullScreen);\n if (_buttonMode === EXPAND_BUTTON_MODE) {\n buttonTitle = localizationStrings.getPlayerString(playerStringNames.accessBtnFullScreenExpand);\n }\n var _markup = templateGenerator.generateFullscreenControlMarkup(buttonTitle);\n $container.find('.fullscreen-wrapper').html(_markup);\n _$fullScreenButton = $container.find('.fullscreen-button');\n _$fullScreenGlyph = $container.find('.fullscreen-button-glyph');\n };\n var onFullScreenChange = function onFullScreenChange() {\n _inFullScreen = !_inFullScreen;\n if (_inFullScreen) {\n _$fullScreenGlyph.removeClass(cssClasses.fullscreenButtonGlyph);\n _$fullScreenGlyph.addClass(cssClasses.fullscreenButtonActiveGlyph);\n _$fullScreenButton.attr('aria-pressed', true);\n _$fullScreenButton.focus();\n $container.addClass(cssClasses.fullscreenMode);\n } else {\n _$fullScreenGlyph.removeClass(cssClasses.fullscreenButtonActiveGlyph);\n _$fullScreenGlyph.addClass(cssClasses.fullscreenButtonGlyph);\n _$fullScreenButton.attr('aria-pressed', false);\n $container.removeClass(cssClasses.fullscreenMode);\n }\n $container.trigger(events.Controls.FullScreenChange, {\n inFullScreen: _inFullScreen\n });\n };\n var initializeFullScreenSupport = function initializeFullScreenSupport(canSupportExpandVideoMode) {\n findButtonMode(canSupportExpandVideoMode);\n updateButtonTitle();\n setButtonDisplay();\n initializeHandlers();\n };\n var cancelFullScreen = function cancelFullScreen() {\n _$fullScreenButton.attr('aria-pressed', false);\n fullscreenHelper.exitFullscreenMode(videoElement);\n };\n var switchToFullScreenMode = function switchToFullScreenMode() {\n _$fullScreenButton.attr('aria-pressed', true);\n fullscreenHelper.switchToFullscreenMode(_elementToFullscreen);\n };\n var switchFromFullScreenMode = function switchFromFullScreenMode() {\n cancelFullScreen();\n };\n var toggleFullScreenMode = function toggleFullScreenMode() {\n if (!_inFullScreen) {\n switchToFullScreenMode();\n } else {\n switchFromFullScreenMode();\n }\n };\n var toggleFullFrameMode = function toggleFullFrameMode() {\n _inFullFrame = !_inFullFrame;\n if (_inFullFrame) {\n _$fullScreenGlyph.removeClass(cssClasses.fullFrameButtonGlyph);\n _$fullScreenGlyph.addClass(cssClasses.fullFrameButtonActiveGlyph);\n _$fullScreenButton.attr('aria-pressed', true);\n iFrameBridge.postMessage(events.IFrame.EnterFullFrame, '*');\n } else {\n _$fullScreenGlyph.removeClass(cssClasses.fullFrameButtonActiveGlyph);\n _$fullScreenGlyph.addClass(cssClasses.fullFrameButtonGlyph);\n iFrameBridge.postMessage(events.IFrame.ExitFullFrame, '*');\n _$fullScreenButton.attr('aria-pressed', false);\n }\n };\n var expandVideo = function expandVideo() {\n $container.trigger(events.Controls.ExpandVideo);\n urlService.openUrl(urlService.generateCurrentUrlWithExtraQueryParam('theme', playerConfiguration.getTheme()), '_blank');\n };\n var onFullScreenClick = function onFullScreenClick() {\n switch (_buttonMode) {\n case FULL_SCREEN_BUTTON_MODE:\n toggleFullScreenMode();\n break;\n case FULL_FRAME_BUTTON_MODE:\n toggleFullFrameMode();\n break;\n case EXPAND_BUTTON_MODE:\n expandVideo();\n break;\n }\n };\n var onDoubleClick = function onDoubleClick() {\n switch (_buttonMode) {\n case FULL_SCREEN_BUTTON_MODE:\n toggleFullScreenMode();\n break;\n case FULL_FRAME_BUTTON_MODE:\n toggleFullFrameMode();\n break;\n }\n };\n var disableControl = function disableControl() {\n _$fullScreenButton.attr('tabindex', tabIndex.Disabled);\n };\n var enableControl = function enableControl() {\n _$fullScreenButton.attr('tabindex', tabIndex.DomOrder);\n };\n var checkToExitFullScreen = function checkToExitFullScreen() {\n if (_legacyIOSFullScreenMode) {\n switchFromFullScreenMode();\n }\n };\n var onFullButtonClick = function onFullButtonClick(e) {\n onFullScreenClick();\n e.preventDefault();\n };\n var initializeHandlers = function initializeHandlers() {\n _$fullScreenButton.on('click', onFullButtonClick);\n $container.on(events.Controls.Disable, disableControl);\n $container.on(events.Controls.Enable, enableControl);\n $container.on(events.Quizzing.Paused, checkToExitFullScreen);\n $container.on(events.Hotspots.Paused, checkToExitFullScreen);\n $container.on(events.Media.End, checkToExitFullScreen);\n $container.on(events.Controls.ToggleFullScreen, toggleFullScreenMode);\n switch (_buttonMode) {\n case FULL_SCREEN_BUTTON_MODE:\n if (_legacyIOSFullScreenMode) {\n videoElement.addEventListener('webkitbeginfullscreen', onFullScreenChange);\n videoElement.addEventListener('webkitendfullscreen', onFullScreenChange);\n } else {\n var fullScreenEventNames = deviceInfo.getFullScreenChangeEventNames();\n _$document.off(fullScreenEventNames, onFullScreenChange);\n _$document.on(fullScreenEventNames, onFullScreenChange);\n }\n break;\n case FULL_FRAME_BUTTON_MODE:\n _$fullScreenGlyph.removeClass(cssClasses.fullscreenButtonGlyph);\n _$fullScreenGlyph.addClass(cssClasses.fullFrameButtonGlyph);\n break;\n case EXPAND_BUTTON_MODE:\n _$fullScreenGlyph.removeClass(cssClasses.fullscreenButtonGlyph);\n _$fullScreenGlyph.addClass(cssClasses.expandButtonGlyph);\n break;\n }\n };\n var onVideoEnd = function onVideoEnd() {\n // must kick them out of full screen to get the replay button to show\n if (_inFullScreen) {\n cancelFullScreen();\n }\n };\n var destroy = function destroy() {\n _$fullScreenButton.off('click', onFullButtonClick);\n videoElement.removeEventListener('webkitbeginfullscreen', onFullScreenChange);\n videoElement.removeEventListener('webkitendfullscreen', onFullScreenChange);\n $container.off(events.Controls.Disable, disableControl);\n $container.off(events.Controls.Enable, enableControl);\n $container.off(events.Quizzing.Paused, checkToExitFullScreen);\n $container.off(events.Hotspots.Paused, checkToExitFullScreen);\n $container.off(events.Media.End, checkToExitFullScreen);\n $container.off(events.Controls.ToggleFullScreen, toggleFullScreenMode);\n };\n findButtonMode(false);\n createView();\n setButtonDisplay();\n return Object.defineProperties({\n initializeFullScreenSupport: initializeFullScreenSupport,\n onVideoEnd: onVideoEnd,\n onDoubleClick: onDoubleClick,\n destroy: destroy\n }, {\n isFullScreen: {\n get: function get() {\n return _inFullScreen;\n }\n },\n isFullFrame: {\n get: function get() {\n return _inFullFrame;\n }\n },\n controlElement: {\n get: function get() {\n return _$fullScreenButton;\n }\n }\n });\n};\nvar FullscreenControlView$1 = {\n /**\n * Factory method that returns a new FullscreenControlView object.\n * @function create\n * @memberof TSC.FullscreenControlView\n * @static\n * @param {Object} $container - jQuery element that contains a .fullscreen-wrapper element where the fullscreen controls will be injected\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n * @return new FullscreenControlView instance\n */\n create: FullscreenControlView\n};\n\nvar DEFAULT_DOUBLE_CLICK_DELAY = 300;\nvar SINGLE_CLICK_COUNT = 1;\nvar DOUBLE_CLICK_COUNT = 2;\n\n/**\n * @memberof TSC\n * @class ClickControlsView\n * @classdesc Control that allows uer to click on video area to toggle play / pause and full screen mode.\n * @param {jQuery} $container - root Smart Player dom element\n * @param {HTMLVideoElement} mediaElement\n * @param {TSC.FullscreenControlView} fullscreenControlView\n * @param {TSC.ProgressBarControlView} progressBarControlView\n * @param {TSC.playerConfiguration} playerConfiguration\n * @param {Number} [doubleClickDelay] - time delay to track double clicks\n */\nvar ClickControlsView = function ClickControlsView($container, mediaElement, fullscreenControlView, progressBarControlView, playerConfiguration, doubleClickDelay) {\n var _$clickControls = $container.find('.click-controls');\n var _$playPauseStateContainer = $container.find('.play-pause-state');\n var _$playPauseStateIndicator = $container.find('.play-pause-state-indicator');\n var _clicks = 0;\n var _doubleClickTimer = null;\n var _enabled = true;\n var _draggingCaption = false;\n var _mediaPluginInteractionActive = false;\n var _doubleClickDelay = doubleClickDelay || DEFAULT_DOUBLE_CLICK_DELAY;\n var onClickPlay = function onClickPlay() {\n if (mediaElement.ended) {\n $container.trigger(events.Media.Replay);\n } else {\n mediaElement.play();\n }\n _$playPauseStateIndicator.removeClass('pause-button-background-glyph').addClass('play-button-background-glyph');\n _$playPauseStateContainer.show().fadeOut('slow');\n };\n var onClickPause = function onClickPause() {\n if (mediaElement.currentTime !== mediaElement.duration) {\n mediaElement.pause();\n _$playPauseStateIndicator.removeClass('play-button-background-glyph').addClass('pause-button-background-glyph');\n _$playPauseStateContainer.show().fadeOut('slow');\n }\n };\n var processHotspotActiveChange = function processHotspotActiveChange(e, eventData) {\n if (e.type === events.Hotspots.Paused && eventData && eventData.hasTimeChangeAction) {\n disable();\n } else if (e.type === events.Hotspots.Resume) {\n enable();\n }\n };\n var onControlClick = function onControlClick(e) {\n if (_mediaPluginInteractionActive || !_enabled || _draggingCaption || e.button !== mouseButtons.mainButton) {\n _mediaPluginInteractionActive = false;\n return;\n }\n _clicks++;\n clearTimeout(_doubleClickTimer);\n if (_clicks === SINGLE_CLICK_COUNT) {\n var mediaPaused = mediaElement.paused;\n _doubleClickTimer = setTimeout(function () {\n _clicks = 0;\n if (!playerConfiguration.getEnableSingleClickControl()) {\n return;\n }\n if (mediaElement.paused === mediaPaused && !progressBarControlView.scrubbing) {\n mediaElement.paused ? onClickPlay() : onClickPause();\n }\n }, _doubleClickDelay);\n } else if (_clicks === DOUBLE_CLICK_COUNT) {\n _clicks = 0;\n if (!playerConfiguration.getEnableDoubleClickControl()) {\n return;\n }\n fullscreenControlView.onDoubleClick();\n }\n };\n var onCaptionDragStart = function onCaptionDragStart() {\n _draggingCaption = true;\n };\n var onCaptionDragEnd = function onCaptionDragEnd() {\n _draggingCaption = false;\n };\n var processMediaAreaPluginInteractiveHandler = function processMediaAreaPluginInteractiveHandler() {\n _mediaPluginInteractionActive = true;\n };\n var bindEvents = function bindEvents() {\n $container.on(events.Captions.DragStart, onCaptionDragStart);\n $container.on(events.Captions.DragEnd, onCaptionDragEnd);\n $container.on(events.Hotspots.Paused, processHotspotActiveChange);\n $container.on(events.Hotspots.Resume, processHotspotActiveChange);\n $container.on(events.Plugin.MediaAreaPluginMouseDown, processMediaAreaPluginInteractiveHandler);\n $container.on(events.Plugin.MediaAreaPluginKeyDown, processMediaAreaPluginInteractiveHandler);\n _$clickControls.on('click', onControlClick);\n };\n var enable = function enable() {\n _enabled = true;\n };\n var disable = function disable() {\n _enabled = false;\n };\n var destroy = function destroy() {\n $container.off(events.Captions.DragStart, onCaptionDragStart);\n $container.off(events.Captions.DragEnd, onCaptionDragEnd);\n $container.off(events.Hotspots.Paused, processHotspotActiveChange);\n $container.off(events.Hotspots.Resume, processHotspotActiveChange);\n $container.off(events.Plugin.MediaAreaPluginMouseDown, processMediaAreaPluginInteractiveHandler);\n $container.off(events.Plugin.MediaAreaPluginKeyDown, processMediaAreaPluginInteractiveHandler);\n _$clickControls.off('click', onControlClick);\n };\n bindEvents();\n return Object.defineProperties({\n enable: enable,\n disable: disable,\n destroy: destroy\n }, {});\n};\nvar ClickControlsView$1 = {\n /**\n * Factory method that returns a new ClickControlsView object\n * @function create\n * @memberof TSC.ClickControlsView\n * @param {jQuery} $container - root Smart Player dom element\n * @param {HTMLVideoElement} mediaElement\n * @param {TSC.FullscreenControlView} fullscreenControlView\n * @param {TSC.ProgressBarControlView} progressBarControlView\n * @param {TSC.playerConfiguration} playerConfiguration\n * @param {Number} [doubleClickDelay] - time delay to track double clicks\n * @static\n * @return new ClickControlsView instance\n */\n create: ClickControlsView\n};\n\nvar ANIMATION_SPEED = 300;\nvar AUTO_HIDE_TIME_OUT_IN_MILLISECONDS = 5000;\nvar MOUSE_MOVE_TOLERANCE = 5;\nvar SURFACE_CLICK_LEAVE_DELAY = 100;\n\n/**\n * @memberof TSC\n * @class VideoControlsController\n * @classdesc Video controls controller - binds all the controls used for a video in Smart Player\n * @param {jQuery} $rootSmartPlayerElement\n * @param {MediaView} mediaView\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.Quiz} quizModel\n * @param {TSC.playerConfiguration} playerConfiguration\n */\nvar VideoControlsController = function VideoControlsController($rootSmartPlayerElement, mediaView, xmpModel, quizModel, playerConfiguration) {\n // eslint-disable-line\n var _windowRef = windowWrapper.getWindow();\n var _displayStartScreenOnPlaybackError = false;\n var _$videoControlsContainer;\n var _beforeAfterPlayControlsView;\n var _progressBarControlView;\n var _playRewindControlsView;\n var _prevNextControlsView;\n var _volumeControlView;\n var _audioDescriptionControlView;\n var _captionsControlView;\n var _tocControlView;\n var _playerSettingsView;\n var _pipControlView;\n var _theaterModeControlView;\n var _fullScreenControlView;\n var _clickControlsView;\n var _mediaIsSeeking = false;\n var _timeToSeekAfterCurrentSeekOperation = -1;\n var _displayMode = mediaInterfaceConstants.controls.autohide;\n var _playbackInitialized = false;\n var _userNeedToClickHeroPlayControl = false;\n var _lastClickTime;\n var _controlsHidden = true;\n var _autoHideControlsTimeoutId = -1;\n var _lastMouseMoveCoords = {\n x: 0,\n y: 0\n };\n var onPlayPromiseError = function onPlayPromiseError() {\n // safari fires an abort error when playback is started and document is hidden\n // in this case we do not want to assume user interaction is needed to play\n if (window.document.hidden || !_displayStartScreenOnPlaybackError) {\n return;\n }\n // Assume user interaction is needed to play\n _playbackInitialized = false;\n _displayStartScreenOnPlaybackError = false;\n setControlsDisplayMode(mediaInterfaceConstants.controls[\"false\"]);\n _beforeAfterPlayControlsView.showVideoClickToPlayLink();\n };\n var isScrubbingVideo = function isScrubbingVideo() {\n return _progressBarControlView ? _progressBarControlView.scrubbing : false;\n };\n var hideControls = function hideControls(forceHide, hideElementAfterFadeOut) {\n if (_displayMode === mediaInterfaceConstants.controls[\"true\"]) {\n return;\n }\n var controlsAreBusy = isScrubbingVideo() || _playerSettingsView && _playerSettingsView.isOpen;\n if (!forceHide && controlsAreBusy) {\n return;\n }\n _controlsHidden = true;\n _$videoControlsContainer.stop(true, true);\n _$videoControlsContainer.fadeTo(ANIMATION_SPEED, 0, function () {\n if (hideElementAfterFadeOut) {\n _$videoControlsContainer.hide();\n }\n });\n _volumeControlView.hideControls();\n $rootSmartPlayerElement.removeClass(cssClasses.playerControlsVisible);\n $rootSmartPlayerElement.trigger(events.Controls.VideoControlsHidden);\n };\n var hideControlsOnTimeout = function hideControlsOnTimeout(forceHide) {\n hideControls(forceHide, false);\n if (_controlsHidden) {\n _clickControlsView && _clickControlsView.disable();\n }\n };\n var clearHideControlsTimeout = function clearHideControlsTimeout() {\n _windowRef.clearTimeout(_autoHideControlsTimeoutId);\n };\n var resetHideControlsTimeout = function resetHideControlsTimeout() {\n clearHideControlsTimeout();\n if (playerConfiguration.getAutoHideControls()) {\n _autoHideControlsTimeoutId = _windowRef.setTimeout(hideControlsOnTimeout, AUTO_HIDE_TIME_OUT_IN_MILLISECONDS);\n }\n };\n var enableClickControlsIfNotPausedForHotspot = function enableClickControlsIfNotPausedForHotspot() {\n if (!$rootSmartPlayerElement.playerState.oneOrMoreHotspotsWithTimeActionArePaused && _clickControlsView) {\n if (deviceInfo.isTouchInterface()) {\n setTimeout(_clickControlsView.enable, ANIMATION_SPEED);\n } else {\n _clickControlsView.enable();\n }\n }\n };\n var showControls = function showControls(autoHideControls) {\n if (_controlsHidden) {\n _controlsHidden = false;\n _$videoControlsContainer.removeClass(cssClasses.hide);\n _$videoControlsContainer.stop(true, true);\n _$videoControlsContainer.show();\n _$videoControlsContainer.fadeTo(ANIMATION_SPEED, 1);\n enableClickControlsIfNotPausedForHotspot();\n $rootSmartPlayerElement.addClass(cssClasses.playerControlsVisible);\n $rootSmartPlayerElement.trigger(events.Controls.VideoControlsVisible);\n }\n if (autoHideControls) {\n resetHideControlsTimeout();\n }\n };\n var showControlsWithAutoHide = function showControlsWithAutoHide() {\n showControls(true);\n };\n var onContainerClick = function onContainerClick() {\n _lastClickTime = new Date().getTime();\n showControlsWithAutoHide();\n };\n var onContainerLeave = function onContainerLeave() {\n //Older Win touch devices emulate clicks with Enter -> Click -> Leave, so we need hax for them\n if (!_lastClickTime || new Date().getTime() - _lastClickTime > SURFACE_CLICK_LEAVE_DELAY) {\n hideControlsOnTimeout();\n }\n };\n var onContainerMousemove = function onContainerMousemove(e) {\n var x = e.pageX;\n var y = e.pageY;\n if (!x && x !== 0 || !y && y !== 0) {\n //Just in case values aren't assigned for some reason\n showControlsWithAutoHide();\n return;\n }\n var deltaX = Math.abs(x - _lastMouseMoveCoords.x);\n var deltaY = Math.abs(y - _lastMouseMoveCoords.y);\n if (deltaX + deltaY > MOUSE_MOVE_TOLERANCE) {\n _lastMouseMoveCoords.x = x;\n _lastMouseMoveCoords.y = y;\n showControlsWithAutoHide();\n }\n };\n var enableAutoHideControls = function enableAutoHideControls() {\n $rootSmartPlayerElement.on('mousemove', onContainerMousemove);\n $rootSmartPlayerElement.on('keydown', showControlsWithAutoHide);\n $rootSmartPlayerElement.on('click', onContainerClick);\n $rootSmartPlayerElement.on('mouseleave', onContainerLeave);\n resetHideControlsTimeout();\n };\n var disableAutoHideControls = function disableAutoHideControls() {\n clearHideControlsTimeout();\n $rootSmartPlayerElement.off('mousemove', onContainerMousemove);\n $rootSmartPlayerElement.off('keydown', showControlsWithAutoHide);\n $rootSmartPlayerElement.off('click', onContainerClick);\n $rootSmartPlayerElement.off('mouseleave', onContainerLeave);\n };\n var seekVideo = function seekVideo(timeInSeconds) {\n if (!mediaView.mediaElement || isNaN(mediaView.mediaElement.currentTime) || mediaView.mediaElement.currentTime === null || isNaN(timeInSeconds) || timeInSeconds === null) {\n return;\n }\n if (_mediaIsSeeking) {\n _timeToSeekAfterCurrentSeekOperation = timeInSeconds;\n return;\n }\n _timeToSeekAfterCurrentSeekOperation = -1;\n if (mediaView.mediaElement.currentTime.toFixed(4) === timeInSeconds.toFixed(4)) {\n return;\n }\n mediaView.mediaElement.currentTime = timeInSeconds;\n };\n var initCurrentMedia = function initCurrentMedia(e, eventData) {\n if (eventData.enablePreviousButton) {\n _prevNextControlsView.enablePreviousButton();\n } else {\n _prevNextControlsView.disablePreviousButton();\n }\n if (eventData.enableNextButton) {\n _prevNextControlsView.enableNextButton();\n } else {\n _prevNextControlsView.disableNextButton();\n }\n if (_progressBarControlView) {\n _progressBarControlView.durationHasChanged();\n }\n _displayStartScreenOnPlaybackError = true;\n\n // ensure current time starts at 0 for FireFox to record correct played time range\n if (deviceInfo.isFirefox()) {\n mediaView.mediaElement.currentTime = 0;\n }\n mediaView.mediaElement && play();\n\n // OSX Safari on some machines fast forwards videos when we call play with a quiz at frame 0.\n // Resetting the current time resolves this behavior. Ref https://github.com/TechSmith/SmartPlayer/issues/387\n if (deviceInfo.isSafari() && !deviceInfo.isIOS() && mediaView.mediaElement.readyState === 0) {\n mediaView.mediaElement.addEventListener('canplay', function resetTime() {\n mediaView.mediaElement.currentTime = 0;\n mediaView.mediaElement.removeEventListener('canplay', resetTime);\n });\n }\n };\n var onPlaybackInitialized = function onPlaybackInitialized() {\n if (!_playbackInitialized) {\n _playbackInitialized = true;\n $rootSmartPlayerElement.trigger(events.Controls.StartedPlayback);\n }\n };\n var play = function play() {\n var playPromise = mediaView.mediaElement.play();\n if (playPromise !== undefined) {\n playPromise.then(function () {\n onPlaybackInitialized();\n })[\"catch\"](function (error) {\n onPlayPromiseError();\n });\n }\n };\n var onSeekToTime = function onSeekToTime(e, eventData) {\n var time = eventData.time;\n seekVideo(time);\n setControlsDisplayMode(_displayMode);\n if (eventData.playAfterSeek) {\n mediaView.mediaElement && play();\n }\n };\n var onSetVolume = function onSetVolume(e, data) {\n if (_volumeControlView) {\n _volumeControlView.volume = data.volumeValue;\n }\n };\n var onSetMuted = function onSetMuted(e, data) {\n if (_volumeControlView) {\n _volumeControlView.muted = data.isMuted;\n }\n };\n var onSetPlaybackRate = function onSetPlaybackRate(e, data) {\n if (_playerSettingsView) {\n _playerSettingsView.playbackRate = data.playbackRate;\n }\n };\n var onVideoSeeking = function onVideoSeeking() {\n _mediaIsSeeking = true;\n };\n var onVideoSeeked = function onVideoSeeked() {\n _mediaIsSeeking = false;\n if (_timeToSeekAfterCurrentSeekOperation >= 0) {\n seekVideo(_timeToSeekAfterCurrentSeekOperation);\n }\n };\n var onVideoMetadataLoaded = function onVideoMetadataLoaded() {\n mediaView.mediaElement.removeEventListener(events.ExternalVideo.VideoLoadedMetadata, onVideoMetadataLoaded);\n var canSupportExpandVideoMode = !playerConfiguration.isScormLesson;\n _fullScreenControlView.initializeFullScreenSupport(canSupportExpandVideoMode);\n _pipControlView && _pipControlView.initialize();\n $rootSmartPlayerElement.trigger(events.Controls.HideLoadingMessage);\n seekToInitialTimeIfSet();\n };\n var teardownHideShowControls = function teardownHideShowControls() {\n if (_displayMode === mediaInterfaceConstants.controls.autohide) {\n disableAutoHideControls();\n }\n };\n var setControlsDisplayMode = function setControlsDisplayMode(displayMode) {\n teardownHideShowControls();\n _displayMode = displayMode;\n if (_displayMode === mediaInterfaceConstants.controls[\"false\"]) {\n disableAutoHideControls();\n hideControls(true, true);\n } else if (_displayMode === mediaInterfaceConstants.controls.autohide) {\n enableAutoHideControls();\n showControls(true);\n } else {\n showControls(false);\n }\n };\n var onDisplayCaptionControl = function onDisplayCaptionControl(e, eventData) {\n if (eventData.displayCaptionControl) {\n _captionsControlView = CaptionsControlView$1.create($rootSmartPlayerElement);\n }\n if (_captionsControlView) {\n _captionsControlView.setCaptionButtonVisible(eventData.displayCaptionControl);\n }\n };\n var onDisplayTocControl = function onDisplayTocControl() {\n _tocControlView = TocControlView$1.create($rootSmartPlayerElement, playerConfiguration);\n };\n var onTocScroll = function onTocScroll() {\n resetHideControlsTimeout();\n };\n var seekToInitialTimeIfSet = function seekToInitialTimeIfSet() {\n if (!playerConfiguration.isScormLesson && playerConfiguration.jumpToTime) {\n var timeToSeek = urlService.convertUrlTime(playerConfiguration.jumpToTime);\n if (timeToSeek < mediaView.duration) {\n seekVideo(timeToSeek);\n }\n }\n };\n var initializePlayback = function initializePlayback(playVideo) {\n if (playVideo) {\n play();\n } else {\n onPlaybackInitialized();\n }\n };\n var onFirstPlay = function onFirstPlay() {\n if (!_playbackInitialized) {\n initializePlayback(false);\n }\n };\n var onQuizSetupComplete = function onQuizSetupComplete() {\n $rootSmartPlayerElement.off(events.Quizzing.QuizSetupComplete, onQuizSetupComplete);\n initializePlayback(true);\n };\n var onHeroPlayControlClick = function onHeroPlayControlClick() {\n $rootSmartPlayerElement.off(events.Controls.HeroPlayControlClicked, onHeroPlayControlClick);\n $rootSmartPlayerElement.trigger(events.Player.MediaControlsReady);\n\n // do not run this if we are waiting on quiz input\n if (quizModel && quizModel.quizID && quizModel.requireUserId && !playerConfiguration.getIsUserIdentified()) {\n $rootSmartPlayerElement.on(events.Quizzing.QuizSetupComplete, onQuizSetupComplete);\n } else {\n initializePlayback(true);\n }\n };\n var onMediaError = function onMediaError() {\n _beforeAfterPlayControlsView.hideVideoClickToPlayLink();\n _beforeAfterPlayControlsView.setVideoClickToPlayErrorState(true);\n hideControls(true, true);\n };\n var onHotspotInactive = function onHotspotInactive() {\n enableClickControlsIfNotPausedForHotspot();\n };\n var onTryToAutoPlay = function onTryToAutoPlay() {\n _displayStartScreenOnPlaybackError = true;\n initializePlayback(true);\n };\n var setupControls = function setupControls() {\n _$videoControlsContainer = $rootSmartPlayerElement.find('.video-controls-container');\n mediaView.hotfixViewAndControlsCSS(_$videoControlsContainer);\n _beforeAfterPlayControlsView = BeforeAfterPlayControlsView$1.create($rootSmartPlayerElement, playerConfiguration);\n if (!mediaView.supportsClickToPlayControls) {\n _beforeAfterPlayControlsView.hideVideoClickToPlayLink();\n }\n _progressBarControlView = ProgressBarControlView$1.create($rootSmartPlayerElement, mediaView.mediaElement, quizModel);\n _playRewindControlsView = PlayRewindControlsView$1.create($rootSmartPlayerElement, mediaView.mediaElement);\n if (mediaView.playerControlType === playerControlsType.videoPlaylist) {\n _prevNextControlsView = PrevNextControlsView$1.create($rootSmartPlayerElement);\n }\n _volumeControlView = VolumeControlView$1.create($rootSmartPlayerElement, mediaView.mediaElement);\n if (playerConfiguration.audioDescriptionMediaSrc) {\n _audioDescriptionControlView = AudioDescriptionControlView$1.create($rootSmartPlayerElement);\n }\n _playerSettingsView = PlayerSettingsView$1.create($rootSmartPlayerElement, mediaView.mediaElement, xmpModel, null, playerConfiguration.audioDescriptionMediaSrc);\n if (mediaView.playerControlType !== playerControlsType.videoPlaylist) {\n _pipControlView = PipControlView$1.create($rootSmartPlayerElement, mediaView.mediaElement);\n }\n if (playerConfiguration.getEnableTheaterMode()) {\n _theaterModeControlView = TheaterModeControlView$1.create($rootSmartPlayerElement);\n }\n _fullScreenControlView = FullscreenControlView$1.create($rootSmartPlayerElement, mediaView.mediaElement);\n if (mediaView.supportsClickToPlayControls) {\n _clickControlsView = ClickControlsView$1.create($rootSmartPlayerElement, mediaView.mediaElement, _fullScreenControlView, _progressBarControlView, playerConfiguration);\n }\n };\n var initControls = function initControls() {\n if (playerConfiguration.getPreload() !== preloadOptions.metadata && mediaView.type !== mediaViewType.youtube) {\n _userNeedToClickHeroPlayControl = true;\n if (playerConfiguration.getPosterImageSrc()) {\n _beforeAfterPlayControlsView.addVideoClickToPlayBackground(playerConfiguration.getPosterImageSrc());\n }\n $rootSmartPlayerElement.on(events.Controls.HeroPlayControlClicked, onHeroPlayControlClick);\n } else {\n _beforeAfterPlayControlsView.hideVideoClickToPlayLink();\n _beforeAfterPlayControlsView.hideVideoClickToReplayLink();\n _userNeedToClickHeroPlayControl = false;\n }\n };\n var bindEvents = function bindEvents() {\n $rootSmartPlayerElement.on(events.Controls.DisplayCaptionControl, onDisplayCaptionControl);\n $rootSmartPlayerElement.on(events.Controls.DisplayTocControl, onDisplayTocControl);\n $rootSmartPlayerElement.on(events.Controls.TocScroll, onTocScroll);\n $rootSmartPlayerElement.on(events.Media.SeekToTime, onSeekToTime);\n $rootSmartPlayerElement.on(events.Media.SetVolume, onSetVolume);\n $rootSmartPlayerElement.on(events.Media.SetMutedState, onSetMuted);\n $rootSmartPlayerElement.on(events.Media.SetPlaybackRate, onSetPlaybackRate);\n $rootSmartPlayerElement.on(events.Media.InitializeCurrent, initCurrentMedia);\n $rootSmartPlayerElement.on(events.Media.TryToAutoPlay, onTryToAutoPlay);\n $rootSmartPlayerElement.on(events.Media.FirstPlay, onFirstPlay);\n $rootSmartPlayerElement.on(events.Media.Error, onMediaError);\n $rootSmartPlayerElement.on(events.Hotspots.AreaInactive, onHotspotInactive);\n mediaView.mediaElement.addEventListener(events.ExternalVideo.VideoLoadedMetadata, onVideoMetadataLoaded);\n mediaView.mediaElement.addEventListener(events.ExternalVideo.VideoSeeking, onVideoSeeking);\n mediaView.mediaElement.addEventListener(events.ExternalVideo.VideoSeeked, onVideoSeeked);\n };\n var destroy = function destroy() {\n teardownHideShowControls();\n mediaView.mediaElement.removeEventListener(events.ExternalVideo.VideoLoadedMetadata, onVideoMetadataLoaded);\n mediaView.mediaElement.removeEventListener(events.ExternalVideo.VideoSeeking, onVideoSeeking);\n mediaView.mediaElement.removeEventListener(events.ExternalVideo.VideoSeeked, onVideoSeeked);\n $rootSmartPlayerElement.off(events.Controls.DisplayCaptionControl, onDisplayCaptionControl);\n $rootSmartPlayerElement.off(events.Controls.DisplayTocControl, onDisplayTocControl);\n $rootSmartPlayerElement.off(events.Controls.TocScroll, onTocScroll);\n $rootSmartPlayerElement.off(events.Media.SeekToTime, onSeekToTime);\n $rootSmartPlayerElement.off(events.Media.SetVolume, onSetVolume);\n $rootSmartPlayerElement.off(events.Media.SetMutedState, onSetMuted);\n $rootSmartPlayerElement.off(events.Media.SetPlaybackRate, onSetPlaybackRate);\n $rootSmartPlayerElement.off(events.Controls.ShowToc, disableAutoHideControls);\n $rootSmartPlayerElement.off(events.Controls.HideToc, enableAutoHideControls);\n $rootSmartPlayerElement.off(events.Media.InitializeCurrent, initCurrentMedia);\n $rootSmartPlayerElement.off(events.Media.TryToAutoPlay, onTryToAutoPlay);\n $rootSmartPlayerElement.off(events.Media.FirstPlay, onFirstPlay);\n $rootSmartPlayerElement.off(events.Media.Error, onMediaError);\n $rootSmartPlayerElement.off(events.Hotspots.AreaInactive, onHotspotInactive);\n _beforeAfterPlayControlsView && _beforeAfterPlayControlsView.destroy();\n _progressBarControlView && _progressBarControlView.destroy();\n _playRewindControlsView && _playRewindControlsView.destroy();\n _prevNextControlsView && _prevNextControlsView.destroy();\n _volumeControlView && _volumeControlView.destroy();\n _audioDescriptionControlView && _audioDescriptionControlView.destroy();\n _captionsControlView && _captionsControlView.destroy();\n _tocControlView && _tocControlView.destroy();\n _playerSettingsView && _playerSettingsView.destroy();\n _pipControlView && _pipControlView.destroy();\n _theaterModeControlView && _theaterModeControlView.destroy();\n _fullScreenControlView && _fullScreenControlView.destroy();\n _clickControlsView && _clickControlsView.destroy();\n };\n setupControls();\n bindEvents();\n initControls();\n return Object.defineProperties({\n /**\n * Sets the display mode for the video controls\n * @memberof TSC.VideoControlsController\n * @function setControlsDisplayMode\n * @param displayMode - Mode the video controls should be displayed with\n */\n setDisplayMode: setControlsDisplayMode,\n /**\n * Tear downs the instance of video controls controller\n * @memberof TSC.VideoControlsController\n * @function destroy\n */\n destroy: destroy\n }, {\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoControlsController\n * @property {boolean} userNeedToClickHeroPlayControl - User needs to click hero play control to start playback\n */\n userNeedToClickHeroPlayControl: {\n get: function get() {\n return _userNeedToClickHeroPlayControl;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoControlsController\n * @property {boolean} playbackInitialized - Playback has been initialized\n */\n playbackInitialized: {\n get: function get() {\n return _playbackInitialized;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoControlsController\n * @property {TSC.ProgressBarControlView} progressBarControlView - progress bar view\n */\n progressBarControlView: {\n get: function get() {\n return _progressBarControlView;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoControlsController\n * @property {TSC.FullscreenControlView} fullscreenControlView - full screen control view\n */\n fullscreenControlView: {\n get: function get() {\n return _fullScreenControlView;\n }\n },\n /**\n * @public\n * @readonly\n * @memberof TSC.VideoControlsController\n * @property {TSC.BeforeAfterPlayControlsView} beforeAfterPlayControlsView - before after play controls view\n */\n beforeAfterPlayControlsView: {\n get: function get() {\n return _beforeAfterPlayControlsView;\n }\n }\n });\n};\nvar VideoControlsController$1 = {\n /**\n * Factory method that returns a new VideoControlsController object\n * @function create\n * @memberof TSC.VideoControlsController\n * @param {jQuery} $rootSmartPlayerElement\n * @param {MediaView} mediaView\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.Quiz} quizModel\n * @param {TSC.playerConfiguration} playerConfiguration\n * @static\n * @return new VideoControlsController instance\n */\n create: VideoControlsController\n};\n\nvar CAPTION_POSITION = {\n under: 'under'\n};\nvar CAPTION_ALIGNMENT = {\n top: 'top',\n left: 'left',\n right: 'right'\n};\n\n/**\n * @memberof TSC\n * @class VideoControlsDisplayModeController\n * @classdesc Video controls controller - binds all the controls used for a video in Smart Player\n * @param {jQuery} $rootSmartPlayerElement - jQuery wrapper of Top level dom element for Smart Player\n * @param {TSC.VideoControlsController} videoControlsController - Video Controls Controller\n * @param {TSC.playerConfiguration} playerConfiguration - Player configuration\n */\nvar VideoControlsDisplayModeController = function VideoControlsDisplayModeController($rootSmartPlayerElement, videoControlsController, playerConfiguration) {\n var _quizUIVisible = false;\n var _quizUIMinimized = false;\n var _pipViewActive = false;\n var _captionViewPosition = null;\n var _searchIsFocused = false;\n var _isScrubbing = false;\n var _externalLinkViewOpen = false;\n var _mediaError = false;\n var getDisplayMode = function getDisplayMode() {\n if (!videoControlsController.playbackInitialized && playerConfiguration.getPreload() !== preloadOptions.metadata) {\n return mediaInterfaceConstants.controls[\"false\"];\n } else if (_mediaError) {\n return mediaInterfaceConstants.controls[\"false\"];\n } else if (_externalLinkViewOpen) {\n return mediaInterfaceConstants.controls[\"false\"];\n } else if (_pipViewActive) {\n return mediaInterfaceConstants.controls[\"false\"];\n } else if (_quizUIVisible) {\n return _quizUIMinimized ? mediaInterfaceConstants.controls[\"false\"] : mediaInterfaceConstants.controls[\"true\"];\n } else if (videoControlsController.beforeAfterPlayControlsView.viewState !== playReplayControlStates.none || playerConfiguration.getDisableControls() || playerConfiguration.getDisableInteractions()) {\n return mediaInterfaceConstants.controls[\"false\"];\n } else if (_isScrubbing || _searchIsFocused || !playerConfiguration.getAutoHideControls() || _captionViewPosition === CAPTION_POSITION.under) {\n return mediaInterfaceConstants.controls[\"true\"];\n }\n return mediaInterfaceConstants.controls.autohide;\n };\n var updateVideoControlsDisplayMode = function updateVideoControlsDisplayMode() {\n videoControlsController.setDisplayMode(getDisplayMode());\n };\n var onDisplayCaptionControl = function onDisplayCaptionControl(e, eventData) {\n _captionViewPosition = eventData && eventData.captionViewPosition || null;\n updateVideoControlsDisplayMode();\n };\n var onPipChanged = function onPipChanged(e, eventData) {\n _pipViewActive = eventData.pipViewActive;\n updateVideoControlsDisplayMode();\n };\n var onQuizUIVisible = function onQuizUIVisible() {\n _quizUIVisible = true;\n updateVideoControlsDisplayMode();\n };\n var onQuizUIHidden = function onQuizUIHidden() {\n _quizUIVisible = false;\n updateVideoControlsDisplayMode();\n };\n var onMinimizeQuizUI = function onMinimizeQuizUI() {\n _quizUIMinimized = true;\n updateVideoControlsDisplayMode();\n };\n var onMaximizeQuizUI = function onMaximizeQuizUI() {\n _quizUIMinimized = false;\n updateVideoControlsDisplayMode();\n };\n var onShowQuizSetup = function onShowQuizSetup() {\n onMinimizeQuizUI();\n onQuizUIVisible();\n };\n var onQuizSetupComplete = function onQuizSetupComplete() {\n onQuizUIHidden();\n };\n var handleControlsUpdated = function handleControlsUpdated() {\n videoControlsController.setDisplayMode(getDisplayMode());\n };\n var onSearchFocusChange = function onSearchFocusChange(e, eventData) {\n _searchIsFocused = eventData.searchIsFocused;\n updateVideoControlsDisplayMode();\n };\n var onScrubbingStarted = function onScrubbingStarted() {\n _isScrubbing = true;\n updateVideoControlsDisplayMode();\n };\n var onScrubbingEnded = function onScrubbingEnded() {\n _isScrubbing = false;\n updateVideoControlsDisplayMode();\n };\n var onExternalLinkViewOpen = function onExternalLinkViewOpen() {\n _externalLinkViewOpen = true;\n updateVideoControlsDisplayMode();\n };\n var onExternalLinkViewClosed = function onExternalLinkViewClosed() {\n _externalLinkViewOpen = false;\n updateVideoControlsDisplayMode();\n };\n var onMediaError = function onMediaError() {\n _mediaError = true;\n updateVideoControlsDisplayMode();\n };\n var bindEvents = function bindEvents() {\n $rootSmartPlayerElement.on(events.Controls.StartedPlayback, updateVideoControlsDisplayMode);\n $rootSmartPlayerElement.on(events.Controls.HeroPlayControlVisible, updateVideoControlsDisplayMode);\n $rootSmartPlayerElement.on(events.Controls.HeroPlayControlHidden, updateVideoControlsDisplayMode);\n $rootSmartPlayerElement.on(events.Controls.ReplayControlVisible, updateVideoControlsDisplayMode);\n $rootSmartPlayerElement.on(events.Controls.ReplayControlHidden, updateVideoControlsDisplayMode);\n $rootSmartPlayerElement.on(events.Controls.DisplayCaptionControl, onDisplayCaptionControl);\n $rootSmartPlayerElement.on(events.Controls.PipChanged, onPipChanged);\n $rootSmartPlayerElement.on(events.Quizzing.UIVisible, onQuizUIVisible);\n $rootSmartPlayerElement.on(events.Quizzing.UIHidden, onQuizUIHidden);\n $rootSmartPlayerElement.on(events.Quizzing.ShowQuizSetup, onShowQuizSetup);\n $rootSmartPlayerElement.on(events.Quizzing.QuizSetupComplete, onQuizSetupComplete);\n $rootSmartPlayerElement.on(events.Quizzing.MinimizeUI, onMinimizeQuizUI);\n $rootSmartPlayerElement.on(events.Quizzing.MaximizeUI, onMaximizeQuizUI);\n $rootSmartPlayerElement.on(events.Controls.Updated, handleControlsUpdated);\n $rootSmartPlayerElement.on(events.Controls.SearchFocusChange, onSearchFocusChange);\n $rootSmartPlayerElement.on(events.Scrubbing.Started, onScrubbingStarted);\n $rootSmartPlayerElement.on(events.Scrubbing.Ended, onScrubbingEnded);\n $rootSmartPlayerElement.on(events.ExternalLinkView.Open, onExternalLinkViewOpen);\n $rootSmartPlayerElement.on(events.ExternalLinkView.Closed, onExternalLinkViewClosed);\n $rootSmartPlayerElement.on(events.Media.Error, onMediaError);\n };\n var destroy = function destroy() {\n $rootSmartPlayerElement.off(events.Controls.StartedPlayback, updateVideoControlsDisplayMode);\n $rootSmartPlayerElement.off(events.Controls.HeroPlayControlVisible, updateVideoControlsDisplayMode);\n $rootSmartPlayerElement.off(events.Controls.HeroPlayControlHidden, updateVideoControlsDisplayMode);\n $rootSmartPlayerElement.off(events.Controls.ReplayControlVisible, updateVideoControlsDisplayMode);\n $rootSmartPlayerElement.off(events.Controls.ReplayControlHidden, updateVideoControlsDisplayMode);\n $rootSmartPlayerElement.off(events.Controls.DisplayCaptionControl, onDisplayCaptionControl);\n $rootSmartPlayerElement.off(events.Controls.PipChanged, onPipChanged);\n $rootSmartPlayerElement.off(events.Quizzing.UIVisible, onQuizUIVisible);\n $rootSmartPlayerElement.off(events.Quizzing.UIHidden, onQuizUIHidden);\n $rootSmartPlayerElement.off(events.Quizzing.ShowQuizSetup, onShowQuizSetup);\n $rootSmartPlayerElement.off(events.Quizzing.QuizSetupComplete, onQuizSetupComplete);\n $rootSmartPlayerElement.off(events.Quizzing.MinimizeUI, onMinimizeQuizUI);\n $rootSmartPlayerElement.off(events.Quizzing.MaximizeUI, onMaximizeQuizUI);\n $rootSmartPlayerElement.off(events.Controls.Updated, handleControlsUpdated);\n $rootSmartPlayerElement.off(events.Controls.SearchFocusChange, onSearchFocusChange);\n $rootSmartPlayerElement.off(events.Scrubbing.Started, onScrubbingStarted);\n $rootSmartPlayerElement.off(events.Scrubbing.Ended, onScrubbingEnded);\n $rootSmartPlayerElement.off(events.ExternalLinkView.Open, onExternalLinkViewOpen);\n $rootSmartPlayerElement.off(events.ExternalLinkView.Closed, onExternalLinkViewClosed);\n $rootSmartPlayerElement.off(events.Media.Error, onMediaError);\n };\n bindEvents();\n updateVideoControlsDisplayMode();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar VideoControlsDisplayModeController$1 = {\n /**\n * Factory method that returns a new VideoControlsDisplayModeController object\n * @function create\n * @memberof TSC.VideoControlsDisplayModeController\n * @param {jQuery} $rootSmartPlayerElement - jQuery wrapper of Top level dom element for Smart Player\n * @param {TSC.VideoControlsController} videoControlsController - Video Controls Controller\n * @param {TSC.playerConfiguration} playerConfiguration - Player configuration\n * @static\n * @return new VideoControlsDisplayModeController instance\n */\n create: VideoControlsDisplayModeController\n};\n\nvar hotspotViewState = Object.freeze({\n hidden: 'hidden',\n firstVisible: 'firstVisible',\n visible: 'visible'\n});\n\n// time buffer value used to check if a media time is at the end of the hotspot\nvar endingTimeBufferSizeInMilliseconds = 1000;\nvar createHotspotDescription = function createHotspotDescription(hotspotXmpModel) {\n var hotspotText = localizationStrings.getPlayerString(playerStringNames.txtHotspot);\n var jumpMediaText = localizationStrings.getPlayerString(playerStringNames.txtJumpToMedia);\n var jumpTimeText = localizationStrings.getPlayerString(playerStringNames.txtJumpToTime);\n var openLinkText = localizationStrings.getPlayerString(playerStringNames.txtOpenLink);\n var playText = localizationStrings.getPlayerString(playerStringNames.accessBtnPlay);\n if (hotspotXmpModel.jumpFile !== undefined) {\n return hotspotText + ': ' + jumpMediaText + ': ' + hotspotXmpModel.jumpFile;\n } else if (hotspotXmpModel.jumpTime !== undefined && hotspotXmpModel.jumpTime !== '') {\n return hotspotText + ': ' + jumpTimeText + ': ' + timeFormatter.formatTimeForReadability(Number(hotspotXmpModel.jumpTime) / 1000);\n } else if (hotspotXmpModel.location !== undefined && hotspotXmpModel.location !== '') {\n return hotspotText + ': ' + openLinkText + ': ' + hotspotXmpModel.location;\n }\n return hotspotText + ': ' + playText;\n};\nvar getHotspotViewPoints = function getHotspotViewPoints(hotspotXmpModel, videoNativeWidth, videoNativeHeight) {\n var viewPoints = [];\n hotspotXmpModel.boundingPoly.coordinates.forEach(function (coordinate) {\n var hsViewData = {\n xOrig: Math.round(coordinate.x),\n yOrig: Math.round(coordinate.y),\n xScale: Math.round(coordinate.x) / videoNativeWidth,\n yScale: Math.round(coordinate.y) / videoNativeHeight\n };\n viewPoints.push(hsViewData);\n });\n return viewPoints;\n};\n\n/**\n * @memberof TSC\n * @class HotspotViewModel\n * @classdesc HotSpot View Model\n * @param {Object} hotspotXmpModel - Hotspot XMP model\n * @param {Number} index - index of hotspot within all hotspots\n * @param {Number} videoNativeWidth - original width of video\n * @param {Number} videoNativeHeight - original height of video\n */\nvar HotspotViewModel = function HotspotViewModel(hotspotXmpModel, index, videoNativeWidth, videoNativeHeight) {\n var _hotspotXmpModel = hotspotXmpModel;\n var _hotspotIndex = index;\n var _isActive = false;\n var _hasPausedAtEnd = false;\n var _viewPoints = getHotspotViewPoints(hotspotXmpModel, videoNativeWidth, videoNativeHeight);\n var _description = createHotspotDescription(hotspotXmpModel);\n var getCoordinates = function getCoordinates(hotspotViewWidth, hotspotViewHeight) {\n var coordinates = [];\n _viewPoints.forEach(function (viewPoint) {\n coordinates.push(viewPoint.xOrig >= 0 ? Math.round(viewPoint.xScale * hotspotViewWidth) : 0);\n coordinates.push(viewPoint.yOrig >= 0 ? Math.round(viewPoint.yScale * hotspotViewHeight) : 0);\n });\n return coordinates.join(',');\n };\n var isWithinTime = function isWithinTime(timeInMilliseconds) {\n return _hotspotXmpModel.startTime < timeInMilliseconds && timeInMilliseconds <= _hotspotXmpModel.endTime;\n };\n var isTimeNearEndOfHotspot = function isTimeNearEndOfHotspot(timeInMilliseconds) {\n return getTimeLeftUntilEnd(timeInMilliseconds) <= endingTimeBufferSizeInMilliseconds;\n };\n var shouldPauseAtTheEnd = function shouldPauseAtTheEnd(timeInMilliseconds) {\n return _hotspotXmpModel.pause === true && !_hasPausedAtEnd && isTimeNearEndOfHotspot(timeInMilliseconds);\n };\n var getTimeLeftUntilEnd = function getTimeLeftUntilEnd(timeInMilliseconds) {\n return _hotspotXmpModel.endTime - timeInMilliseconds;\n };\n return Object.defineProperties({\n getCoordinates: getCoordinates,\n isHotspotWithinTime: isWithinTime,\n isTimeNearEndOfHotspot: isTimeNearEndOfHotspot,\n shouldPauseAtTheEnd: shouldPauseAtTheEnd,\n getTimeLeftUntilEnd: getTimeLeftUntilEnd\n }, {\n index: {\n get: function get() {\n return _hotspotIndex;\n }\n },\n description: {\n get: function get() {\n return _description;\n }\n },\n isActive: {\n get: function get() {\n return _isActive;\n },\n set: function set(isActive) {\n _isActive = isActive;\n }\n },\n hasPausedAtEnd: {\n get: function get() {\n return _hasPausedAtEnd;\n },\n set: function set(hasPausedAtEnd) {\n _hasPausedAtEnd = hasPausedAtEnd;\n }\n },\n xmpModel: {\n get: function get() {\n return _hotspotXmpModel;\n }\n }\n });\n};\nvar HotspotViewModel$1 = {\n /**\n * Factory method that returns a new HotspotViewModel object.\n * @function create\n * @memberof TSC.HotspotViewModel\n * @static\n * @param {Object} hotspotXmpModel - Hotspot XMP model\n * @param {Number} index - index of hotspot within all hotspots\n * @param {Number} videoNativeWidth - original width of video\n * @param {Number} videoNativeHeight - original height of video\n * @return new HotspotViewModel instance\n */\n create: HotspotViewModel\n};\n\n/**\n * @memberof TSC\n * @class HotspotView\n * @classdesc Hotspot View\n * @param {Object} spContainer\n * @param {HTMLVideoElement} mediaElement\n * @param {jquery} $hotspotsContainerElement\n * @param {TSC.HotspotViewModel} hotspotViewModel\n * @param {Number} hotspotContainerWidth\n * @param {Number} hotspotContainerHeight\n */\nvar HotspotView = function HotspotView(spContainer, mediaElement, $hotspotsContainerElement, hotspotViewModel, hotspotContainerWidth, hotspotContainerHeight) {\n var _$hotspotSvgElement;\n var _$hotspotLinkElement;\n var _timerId;\n var enableTabbing = function enableTabbing() {\n _$hotspotLinkElement.attr('tabindex', tabIndex.DomOrder);\n _$hotspotLinkElement.attr('focusable', true);\n };\n var disableTabbing = function disableTabbing() {\n _$hotspotLinkElement.attr('tabindex', tabIndex.Disabled);\n _$hotspotLinkElement.attr('focusable', false);\n };\n var onQuizEventHandler = function onQuizEventHandler(e) {\n switch (e.type) {\n case events.Quizzing.Complete:\n case events.Quizzing.Review:\n enableTabbing();\n break;\n case events.Quizzing.Paused:\n disableTabbing();\n break;\n }\n };\n var onControlsUpdatedHandler = function onControlsUpdatedHandler() {\n if (playerConfiguration.disableInteractions) {\n hideHotspot();\n } else if (hotspotViewModel.isHotspotWithinTime(getCurrentTimeInMilliseconds())) {\n displayHotspot();\n }\n };\n var getCurrentTimeInMilliseconds = function getCurrentTimeInMilliseconds() {\n return mediaElement.currentTime > mediaElement.duration ? mediaElement.duration : mediaElement.currentTime * 1000;\n };\n var getSvgElementWithLowerIndex = function getSvgElementWithLowerIndex(hotspotIndex) {\n var $svgElementWithLowerIndex = null;\n var svgElements = $hotspotsContainerElement.find('svg');\n svgElements.each(function (index, element) {\n var $svg = $(element);\n if (hotspotIndex > Number($svg.attr('data-hotspot-index'))) {\n $svgElementWithLowerIndex = $svg;\n }\n });\n return $svgElementWithLowerIndex;\n };\n var addHotspotViewToDom = function addHotspotViewToDom($svgView) {\n var $svgElementWithLowerIndex = getSvgElementWithLowerIndex(hotspotViewModel.index);\n if ($svgElementWithLowerIndex !== null) {\n $svgElementWithLowerIndex.after($svgView);\n } else {\n $hotspotsContainerElement.prepend($svgView);\n }\n _$hotspotSvgElement = $hotspotsContainerElement.find('svg[data-hotspot-index=\"' + hotspotViewModel.index + '\"]');\n _$hotspotLinkElement = _$hotspotSvgElement.find('a');\n };\n var createView = function createView() {\n var hotspotCoordinates = hotspotViewModel.getCoordinates(hotspotContainerWidth, hotspotContainerHeight);\n var hotspotCoordinatesSeparationBySpace = hotspotCoordinates.replace(/,/g, ' ');\n var descriptionId = 'hotspot-description-' + hotspotViewModel.index;\n var hotspotLinkClassName = 'hotspot-link-' + hotspotViewModel.index;\n var svgViewMarkup = templateGenerator.generateHotspotMarkup(hotspotContainerWidth, hotspotContainerHeight, hotspotViewModel.index, descriptionId, hotspotViewModel.description, playerConfiguration.displayHotspotsShape, hotspotCoordinatesSeparationBySpace, hotspotLinkClassName);\n var $svgView = $(svgViewMarkup);\n addHotspotViewToDom($svgView);\n };\n var bindEvents = function bindEvents() {\n spContainer.on(events.Quizzing.Complete, onQuizEventHandler);\n spContainer.on(events.Quizzing.Review, onQuizEventHandler);\n spContainer.on(events.Quizzing.Paused, onQuizEventHandler);\n spContainer.on(events.Controls.Updated, onControlsUpdatedHandler);\n };\n var displayHotspot = function displayHotspot() {\n if (playerConfiguration.disableInteractions) {\n return;\n }\n _$hotspotSvgElement.addClass(cssClasses.hotspotVisible);\n enableTabbing();\n };\n var hideHotspot = function hideHotspot() {\n _$hotspotSvgElement.removeClass(cssClasses.hotspotVisible);\n disableTabbing();\n };\n var getTimeToHotspotEnd = function getTimeToHotspotEnd(timeInMilliseconds, mediaPlaybackRate) {\n var frameBuffer = 10 / (mediaPlaybackRate * 30) * 1000;\n return hotspotViewModel.getTimeLeftUntilEnd(timeInMilliseconds) / mediaPlaybackRate - frameBuffer;\n };\n var pauseOnHotspot = function pauseOnHotspot() {\n _timerId = null;\n hotspotViewModel.hasPausedAtEnd = true;\n mediaElement.pause();\n var eventData = {\n hasTimeChangeAction: !hotspotViewModel.xmpModel.location\n };\n spContainer.trigger(events.Hotspots.Paused, eventData);\n };\n var initPauseOnHotspot = function initPauseOnHotspot(timeInMilliseconds) {\n window.clearTimeout(_timerId);\n if (window.document.hidden) {\n //Can't use setTimeout if document is hidden\n pauseOnHotspot();\n } else {\n _timerId = setTimeout(pauseOnHotspot, getTimeToHotspotEnd(timeInMilliseconds, mediaElement.playbackRate));\n }\n };\n var update = function update(timeInMilliseconds) {\n var hotspotState = hotspotViewState.hidden;\n if (hotspotViewModel.isHotspotWithinTime(timeInMilliseconds)) {\n if (!hotspotViewModel.isActive) {\n hotspotState = hotspotViewState.firstVisible;\n hotspotViewModel.isActive = true;\n displayHotspot();\n } else {\n hotspotState = hotspotViewState.visible;\n }\n if (hotspotViewModel.shouldPauseAtTheEnd(timeInMilliseconds) && !mediaElement.paused) {\n initPauseOnHotspot(timeInMilliseconds);\n }\n } else if (hotspotViewModel.isActive) {\n hotspotViewModel.isActive = false;\n hideHotspot();\n if (!_timerId && !mediaElement.paused) {\n resetHasPaused();\n }\n }\n return hotspotState;\n };\n var resetHasPaused = function resetHasPaused() {\n hotspotViewModel.hasPausedAtEnd = false;\n };\n createView();\n bindEvents();\n hideHotspot();\n return Object.defineProperties({\n update: update,\n resetHasPaused: resetHasPaused\n }, {\n hotspotViewModel: {\n get: function get() {\n return hotspotViewModel;\n }\n },\n controlElement: {\n get: function get() {\n return _$hotspotLinkElement;\n }\n }\n });\n};\nvar HotspotView$1 = {\n create: HotspotView\n};\n\n/**\n * @memberof TSC\n * @class HotspotsView\n * @classdesc Hotspots View\n * @param {Object} spContainer - jQuery element that is the smartplayer top-level container\n * @param {TSC.Xmp} xmp - XMP model\n * @param {HTMLVideoElement} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n * @param {TSC.TabController} tabController - Tab controller instance\n */\nvar HotspotsView = function HotspotsView(spContainer, xmp, mediaElement, tabController) {\n var _xmp = xmp;\n var _eventContainer = spContainer;\n var _spContainerId = spContainer.attr('id');\n var _hotspotsContainerId = [_spContainerId, 'hotspots'].join('-');\n var _hotspotXmpModels = [];\n var _hotspotViews = [];\n var _$hotspots;\n var _mediaNativeWidth = null;\n var _mediaNativeHeight = null;\n var _oneOrMoreHotspotActive = false;\n var _currentFile;\n var createView = function createView() {\n var hotspotsMarkup = templateGenerator.generateHotspotsMarkup(_hotspotsContainerId);\n _$hotspots = $($.parseHTML(hotspotsMarkup));\n };\n var preventEvent = function preventEvent(e) {\n e.preventDefault();\n e.stopPropagation();\n };\n var bindEvents = function bindEvents() {\n _$hotspots.on('click', 'svg', onHotspotClick);\n _$hotspots.on('mousedown', preventEvent);\n _$hotspots.on('touchend', 'svg', onHotspotClick);\n _$hotspots.on('keydown', 'svg', function (e) {\n if (keys.isKeyOfType(e.key, keys.keyTypes.space)) {\n onHotspotClick(e);\n }\n });\n };\n var init = function init(videoNativeWidth, videoNativeHeight, currentFile) {\n _currentFile = currentFile;\n _mediaNativeWidth = videoNativeWidth;\n _mediaNativeHeight = videoNativeHeight;\n _oneOrMoreHotspotActive = false;\n\n // remove all current hotspots in the case we are loading consecutive video in a playlist\n _$hotspots.empty();\n _hotspotViews = [];\n _hotspotXmpModels = [];\n _xmp.hotspotItemArray.filter(function (hotspotXmpModel) {\n // only init hotspots for this video\n var isHotspotForADifferentFile = hotspotXmpModel.file !== undefined && hotspotXmpModel.file !== _currentFile;\n return !isHotspotForADifferentFile;\n }).forEach(function (hotspotXmpModel, index) {\n var hotspotViewModel = HotspotViewModel$1.create(hotspotXmpModel, index, _mediaNativeWidth, _mediaNativeHeight);\n var hotspotView = HotspotView$1.create(spContainer, mediaElement, _$hotspots, hotspotViewModel, _mediaNativeWidth, _mediaNativeHeight);\n _hotspotViews.push(hotspotView);\n _hotspotXmpModels.push(hotspotXmpModel);\n });\n };\n var removeScreenReaderAlert = function removeScreenReaderAlert() {\n _$hotspots.find('.' + cssClasses.screenReaderAlert).remove();\n };\n var addScreenReaderAlert = function addScreenReaderAlert(numberHotspotsJustDisplayed) {\n var hotspotAlertStringToken = '{{numberOfHotspots}}';\n var hotspotAlertText = localizationStrings.getPlayerString(playerStringNames.txtHotspotScreenReaderAlert);\n if (numberHotspotsJustDisplayed > 1) {\n hotspotAlertText = localizationStrings.getPlayerString(playerStringNames.txtHotspotScreenReaderAlertPlural);\n }\n hotspotAlertText = hotspotAlertText.replace(hotspotAlertStringToken, numberHotspotsJustDisplayed);\n var screenReaderAlertMarkup = templateGenerator.generateScreenReaderAlertMarkup(hotspotAlertText);\n var $screenReaderAlert = $(screenReaderAlertMarkup);\n _$hotspots.append($screenReaderAlert);\n };\n var getLastActiveHotspotView = function getLastActiveHotspotView() {\n for (var i = _hotspotViews.length - 1; i >= 0; i--) {\n if (_hotspotViews[i].hotspotViewModel.isActive) {\n return _hotspotViews[i];\n }\n }\n return null;\n };\n var onHotspotActiveChange = function onHotspotActiveChange(oneOrMoreHotspotActive, numberHotspotsJustDisplayed) {\n spContainer.playerState.oneOrMoreHotspotsWithTimeActionArePaused = isHotspotWithTimeActionPaused();\n if (_oneOrMoreHotspotActive !== oneOrMoreHotspotActive) {\n _oneOrMoreHotspotActive = oneOrMoreHotspotActive;\n var eventName = _oneOrMoreHotspotActive ? events.Hotspots.AreaActive : events.Hotspots.AreaInactive;\n _eventContainer.trigger(eventName);\n }\n if (_oneOrMoreHotspotActive) {\n var lastActiveHotspotView = getLastActiveHotspotView();\n if (lastActiveHotspotView) {\n tabController.lastTabEnabledElement = lastActiveHotspotView.controlElement;\n }\n if (numberHotspotsJustDisplayed > 0) {\n addScreenReaderAlert(numberHotspotsJustDisplayed);\n }\n } else {\n tabController.lastTabEnabledElement = null;\n removeScreenReaderAlert();\n }\n };\n var update = function update(currentMediaTimeInMilliseconds) {\n var oneOrMoreHotspotActive = false;\n var numberHotspotsJustDisplayed = 0;\n _hotspotViews.forEach(function (hotspotView) {\n var hotspotState = hotspotView.update(currentMediaTimeInMilliseconds);\n if (hotspotState === hotspotViewState.firstVisible) {\n numberHotspotsJustDisplayed++;\n }\n if (hotspotState === hotspotViewState.firstVisible || hotspotState === hotspotViewState.visible) {\n oneOrMoreHotspotActive = true;\n }\n });\n onHotspotActiveChange(oneOrMoreHotspotActive, numberHotspotsJustDisplayed);\n };\n var onHotspotClick = function onHotspotClick(event) {\n event.preventDefault();\n event.stopPropagation();\n var hotspotIndex = Number($(event.target).attr('data-hotspot-index'));\n var targetHotspotXmpModel = _hotspotXmpModels[hotspotIndex];\n var targetHotspotViewModel = _hotspotViews[hotspotIndex].hotspotViewModel;\n var eventData = {\n jumpFile: targetHotspotXmpModel.jumpFile,\n jumpTime: targetHotspotXmpModel.jumpTime,\n location: targetHotspotXmpModel.location,\n newWindow: targetHotspotXmpModel.newWindow\n };\n if (!eventData.location && targetHotspotViewModel.hasPausedAtEnd) {\n _eventContainer.trigger(events.Hotspots.Resume);\n }\n _eventContainer.trigger(events.Controls.HotspotClicked, eventData);\n };\n var resetHasPaused = function resetHasPaused() {\n _hotspotViews.forEach(function (hotspotView) {\n hotspotView.resetHasPaused();\n });\n };\n var isHotspotWithTimeActionPaused = function isHotspotWithTimeActionPaused() {\n for (var i = 0; i < _hotspotViews.length; i++) {\n if (_hotspotViews[i].hotspotViewModel.hasPausedAtEnd && !_hotspotViews[i].hotspotViewModel.xmpModel.location) {\n return true;\n }\n }\n return false;\n };\n createView();\n bindEvents();\n return Object.defineProperties({\n init: init,\n update: update,\n resetHasPaused: resetHasPaused\n }, {\n $hotspots: {\n get: function get() {\n return _$hotspots;\n }\n },\n oneOrMoreHotspotActive: {\n get: function get() {\n return _oneOrMoreHotspotActive;\n }\n },\n oneOrMoreHotspotsWithTimeActionArePaused: {\n get: isHotspotWithTimeActionPaused\n }\n });\n};\nvar HotspotsView$1 = {\n create: HotspotsView\n};\n\n/**\n * @memberof TSC\n * @class HotspotController\n * @classdesc Controller for managing XMP features\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.MediaList} mediaList\n * @param {TSC.TabController} tabController\n *\n */\nvar HotspotController = function HotspotController($container, mediaView, xmpModel, mediaList, tabController) {\n var _hotspotsView;\n var _$hotspotsContainer = $container.find('.hotspots-container');\n var setupXmpFeatures = function setupXmpFeatures() {\n _hotspotsView = HotspotsView$1.create($container, xmpModel, mediaView.mediaElement, tabController);\n _$hotspotsContainer.replaceWith(_hotspotsView.$hotspots);\n };\n var onLoadedMetadata = function onLoadedMetadata() {\n var currentFile = mediaList.isPlaylist ? mediaList.currentMedia.media : undefined;\n _hotspotsView.init(mediaView.mediaWidth, mediaView.mediaHeight, currentFile);\n };\n var onVideoTimeUpdate = function onVideoTimeUpdate() {\n _hotspotsView.update(mediaView.currentTimeInMilliseconds);\n };\n var updateHotSpotsViewTime = function updateHotSpotsViewTime() {\n _hotspotsView.update(mediaView.currentTimeInMilliseconds);\n };\n var processHotspotClick = function processHotspotClick(e, eventData) {\n if (eventData.jumpFile !== undefined) {\n mediaList.currentMediaIndex = mediaList.getMediaIndexByUri(eventData.jumpFile);\n $container.trigger(events.Media.SourceChanged);\n } else if (eventData.jumpTime !== undefined && eventData.jumpTime !== '') {\n var timeInSeconds = Number(eventData.jumpTime) / 1000;\n $container.trigger(events.Media.SeekToTime, {\n time: videoApiUtils.getSafeSeekTime(mediaView.mediaElement, timeInSeconds),\n playAfterSeek: true\n });\n } else if (eventData.location !== undefined && eventData.location !== '') {\n if (playerConfiguration.getTrackEvents()) {\n analyticsService.sendEvent(events.Analytics.HotspotAction, eventData.location);\n analyticsService.sendGA4Event(events.GA4.HotspotAction, {\n opened_url: eventData.location\n }); // eslint-disable-line\n }\n var targetWindow = '_parent';\n if (eventData.newWindow !== undefined && eventData.newWindow === true) {\n targetWindow = '_blank';\n }\n mediaView.mediaElement.pause();\n urlService.openUrl(eventData.location, targetWindow);\n } else {\n mediaView.mediaElement.play();\n }\n };\n var onSeeked = function onSeeked() {\n _hotspotsView.resetHasPaused();\n _hotspotsView.update(mediaView.currentTimeInMilliseconds);\n };\n var bindToEvents = function bindToEvents() {\n $container.on(events.Controls.HotspotClicked, processHotspotClick);\n mediaView.mediaWrapper.on('ratechange', updateHotSpotsViewTime, false);\n mediaView.mediaWrapper.on('play', updateHotSpotsViewTime, false);\n var eventsToBind = {\n loadedmetadata: onLoadedMetadata,\n timeupdate: onVideoTimeUpdate,\n seeked: onSeeked\n };\n mediaView.mediaWrapper.on(eventsToBind);\n };\n var unbindToEvents = function unbindToEvents() {\n $container.off(events.Controls.HotspotClicked, processHotspotClick);\n mediaView.mediaWrapper.off('ratechange', updateHotSpotsViewTime, false);\n mediaView.mediaWrapper.off('play', updateHotSpotsViewTime, false);\n var eventsToBind = {\n loadedmetadata: onLoadedMetadata,\n timeupdate: onVideoTimeUpdate,\n seeked: onSeeked\n };\n mediaView.mediaWrapper.off(eventsToBind);\n };\n var destroy = function destroy() {\n unbindToEvents();\n };\n var hasHotspots = xmpModel && xmpModel.hasHotspotItems;\n if (!hasHotspots) {\n throw new Error('Attempted to create hotspot controller with no hotspots in xmp');\n }\n setupXmpFeatures();\n bindToEvents();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar HotspotController$1 = {\n /**\n * Factory method that returns a new HotspotController.\n * @function create\n * @memberof TSC.HotspotController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.MediaList} mediaList\n * @param {TSC.TabController} tabController\n * @return new HotspotController instance\n */\n create: HotspotController\n};\n\nvar CAPTION_VIDEO_WIDTH_PERCENTAGE$1 = .75;\nvar LINE_HEIGHT_PADDING_UNDER_VIDEO$1 = 24;\nvar MAX_DISPLAYED_LINES$1 = 3;\nvar _scaledFontSize$1 = 16;\nvar _currentCaptionWidth$1 = 0;\nvar setStyle$1 = function setStyle(captionsService, $positionContainer, $textContainer) {\n $textContainer.css({\n 'font-family': captionsService.fontEnclosedWithQuotes,\n color: captionsService.textColor.toString()\n });\n $textContainer.find('span').css({\n background: captionsService.backgroundColor.toString()\n });\n $textContainer.addClass(cssClasses.captionXmpView);\n if (captionsService.position === CAPTION_POSITION.under) {\n // toHexString masks the alpha component so we get a non-transparent full bg\n $positionContainer.css('background', captionsService.backgroundColor.toHexString());\n $positionContainer.addClass(cssClasses.captionsUnderVideo);\n $positionContainer.removeClass(cssClasses.hide);\n }\n};\nvar setWidth$1 = function setWidth(scaledVideoWidth, $textContainer, captionPositionUnderVideo) {\n if (captionPositionUnderVideo) {\n $textContainer.css('width', \"\".concat(scaledVideoWidth, \"px\"));\n } else {\n _currentCaptionWidth$1 = Math.ceil(scaledVideoWidth * CAPTION_VIDEO_WIDTH_PERCENTAGE$1);\n $textContainer.css('width', _currentCaptionWidth$1 + 'px');\n }\n};\nvar setScale$1 = function setScale(captionsService, canvasScale, $positionContainer) {\n var fontSize = Math.round(captionsService.fontSize * canvasScale);\n fontSize = Math.min(Math.max(captionsService.fontSizeMin, fontSize), captionsService.fontSizeMax);\n _scaledFontSize$1 = fontSize;\n if (captionsService.position === CAPTION_POSITION.under) {\n var maxRequiredHeight = Math.ceil(_scaledFontSize$1 * MAX_DISPLAYED_LINES$1 + LINE_HEIGHT_PADDING_UNDER_VIDEO$1);\n $positionContainer.css('height', \"\".concat(maxRequiredHeight, \"px\"));\n }\n $positionContainer.css('font-size', \"\".concat(_scaledFontSize$1, \"px\"));\n};\nvar setText$1 = function setText(caption, $textContainer) {\n $textContainer.html('<span>' + caption.markupText.replace('¶', '&para') + '</span>');\n};\nvar xmpCaptionView = Object.defineProperties({\n setStyle: setStyle$1,\n setWidth: setWidth$1,\n setScale: setScale$1,\n setText: setText$1\n}, {\n scaledFontSize: {\n get: function get() {\n return _scaledFontSize$1;\n }\n },\n captionWidth: {\n get: function get() {\n return _currentCaptionWidth$1;\n }\n }\n});\n\nvar CAPTION_VIDEO_WIDTH_PERCENTAGE = .7;\nvar LINE_HEIGHT_PADDING_UNDER_VIDEO = 24;\nvar MAX_DISPLAYED_LINES = 3;\nvar _scaledFontSize = 16;\nvar _currentCaptionWidth = 0;\nvar setStyle = function setStyle(captionsService, $positionContainer, $textContainer) {\n $textContainer.css({\n 'font-family': CaptionService$1.defaults().captionFontFamily,\n color: CaptionService$1.defaults().captionTextColor\n });\n $textContainer.find('span').css({\n background: CaptionService$1.defaults().captionBgColor\n });\n $textContainer.addClass(cssClasses.captionAdaView);\n if (captionsService.position === CAPTION_POSITION.under) {\n // toHexString masks the alpha component so we get a non-transparent full bg\n $positionContainer.css('background', CaptionService$1.defaults().captionBgColor.toHexString());\n $positionContainer.addClass(cssClasses.captionsUnderVideo);\n $positionContainer.removeClass(cssClasses.hide);\n }\n};\nvar setWidth = function setWidth(scaledVideoWidth, $textContainer, captionPositionUnderVideo) {\n if (captionPositionUnderVideo) {\n $textContainer.css('width', \"\".concat(scaledVideoWidth, \"px\"));\n } else {\n _currentCaptionWidth = Math.ceil(scaledVideoWidth * CAPTION_VIDEO_WIDTH_PERCENTAGE);\n $textContainer.css('width', _currentCaptionWidth + 'px');\n }\n};\nvar setScale = function setScale(captionsService, canvasScale, $positionContainer) {\n _scaledFontSize = captionsService.fontSizeForPlayerDimensions;\n if (captionsService.position === CAPTION_POSITION.under) {\n var maxRequiredHeight = Math.ceil(_scaledFontSize * MAX_DISPLAYED_LINES + LINE_HEIGHT_PADDING_UNDER_VIDEO);\n $positionContainer.css('height', \"\".concat(maxRequiredHeight, \"px\"));\n }\n $positionContainer.css('font-size', \"\".concat(_scaledFontSize, \"px\"));\n};\nvar setText = function setText(caption, $textContainer) {\n $textContainer.html('<span>' + caption.markupText + '</span>');\n};\nvar adaCaptionView = Object.defineProperties({\n setStyle: setStyle,\n setWidth: setWidth,\n setScale: setScale,\n setText: setText\n}, {\n scaledFontSize: {\n get: function get() {\n return _scaledFontSize;\n }\n },\n captionWidth: {\n get: function get() {\n return _currentCaptionWidth;\n }\n }\n});\n\nvar getCaptionView = function getCaptionView() {\n if (playerConfiguration.showADACompliantCaptions) {\n return adaCaptionView;\n }\n return xmpCaptionView;\n};\nvar captionViewFactory = {\n getCaptionView: getCaptionView\n};\n\nvar MAX_TOP_CAPTION_PERCENTAGE = 95;\nvar PERCENTAGE_MULTIPLICATION_DENOMINATOR = 100;\nvar DRAG_END_EVENT_TRIGGER_DELAY = 100;\n\n/**\n * @memberof TSC\n * @class CaptionsView\n * @classdesc Captions View\n *\n * @param {jQuery} $container - Root Smart Player dom element\n * @param {CaptionService} captionsService - Caption service instance\n * @param {TSC.VideoElementView} videoElementView - Video element view for MP4 video, this is null for YouTube video.\n * @param {boolean} canDragCaptions - Captions can be dragged to a new location by the user.\n */\nvar CaptionsView = function CaptionsView($container, captionsService, videoElementView, canDragCaptions) {\n var _window = windowWrapper.getWindow();\n var _$document = $(_window.document);\n var _$positionContainer = $container.find('.caption');\n var _$textContainer = $container.find('.caption > p');\n var _canvasScale = 1.0;\n // if position is 'under' captions start as visible and the user cannot hide, else it is from config option\n var _visible = captionsService.position === CAPTION_POSITION.under ? true : playerConfiguration.getCaptionsEnabled();\n var _currentCaptionIndex = -1;\n var _lastUpdateCurrentTime = 0;\n var _lastUpdateCurrentFile;\n var _draggingCaption = false;\n var _initDragClientPosition = {\n x: 0,\n y: 0\n };\n var _onStartDragCaptionContainerSize = {\n width: 0,\n height: 0\n };\n var _initCaptionTextPosition = {\n top: 0,\n left: 0\n };\n var _customCaptionPosition = {\n top: 0,\n left: 0\n };\n var onCaptionLanguageChanged = function onCaptionLanguageChanged() {\n _currentCaptionIndex = -1;\n updateCaption(_lastUpdateCurrentTime, _lastUpdateCurrentFile);\n };\n var onDragAnimationFrame = function onDragAnimationFrame() {\n _$textContainer.css({\n top: _customCaptionPosition.top + '%',\n left: _customCaptionPosition.left + '%'\n });\n if (_draggingCaption) {\n _window.requestAnimationFrame(onDragAnimationFrame);\n }\n };\n var getInteractionPointFromEvent = function getInteractionPointFromEvent(event) {\n if (event.targetTouches && event.targetTouches.length === 1) {\n return {\n x: event.targetTouches[0].pageX,\n y: event.targetTouches[0].pageY\n };\n }\n return {\n x: event.clientX,\n y: event.clientY\n };\n };\n var onCaptionDragEnd = function onCaptionDragEnd(e) {\n e.preventDefault();\n e.stopImmediatePropagation();\n _draggingCaption = false;\n _$textContainer.removeClass(cssClasses.captionsCaptionSelected);\n _$document.off('pointermove touchmove', onCaptionDrag);\n _$document.off('pointerup mouseup touchend mouseleave', onCaptionDragEnd);\n setTimeout(function () {\n $container.trigger(events.Captions.DragEnd);\n }, DRAG_END_EVENT_TRIGGER_DELAY);\n };\n var onCaptionDrag = function onCaptionDrag(e) {\n e.preventDefault();\n var point = getInteractionPointFromEvent(e.originalEvent);\n var dragXOffset = point.x - _initDragClientPosition.x;\n var dragYOffset = point.y - _initDragClientPosition.y;\n var offsetXPercent = dragXOffset / _onStartDragCaptionContainerSize.width * PERCENTAGE_MULTIPLICATION_DENOMINATOR;\n var offsetYPercent = dragYOffset / _onStartDragCaptionContainerSize.height * PERCENTAGE_MULTIPLICATION_DENOMINATOR;\n _customCaptionPosition.top = _initCaptionTextPosition.top + offsetYPercent;\n _customCaptionPosition.left = _initCaptionTextPosition.left + offsetXPercent;\n var maxWidthPercentOffset = captionViewFactory.getCaptionView().captionWidth / _onStartDragCaptionContainerSize.width * PERCENTAGE_MULTIPLICATION_DENOMINATOR;\n var maxWidthPercentage = PERCENTAGE_MULTIPLICATION_DENOMINATOR - maxWidthPercentOffset;\n _customCaptionPosition.top = _customCaptionPosition.top < 0 ? 0 : _customCaptionPosition.top;\n _customCaptionPosition.top = _customCaptionPosition.top > MAX_TOP_CAPTION_PERCENTAGE ? MAX_TOP_CAPTION_PERCENTAGE : _customCaptionPosition.top;\n _customCaptionPosition.left = _customCaptionPosition.left < 0 ? 0 : _customCaptionPosition.left;\n _customCaptionPosition.left = _customCaptionPosition.left > maxWidthPercentage ? maxWidthPercentage : _customCaptionPosition.left;\n };\n var onCaptionDragStart = function onCaptionDragStart(e) {\n e.preventDefault();\n e.stopImmediatePropagation();\n $container.trigger(events.Captions.DragStart);\n _$textContainer.addClass(cssClasses.captionsCaptionSelected);\n _$positionContainer.addClass(cssClasses.captionsCustomPosition);\n var currentCaptionWidth = _$positionContainer.innerWidth();\n var currentCaptionHeight = _$positionContainer.innerHeight();\n var currentCaptionOffset = _$positionContainer.offset();\n var currentTextOffset = _$textContainer.offset();\n var point = getInteractionPointFromEvent(e.originalEvent);\n _initDragClientPosition.x = point.x;\n _initDragClientPosition.y = point.y;\n _onStartDragCaptionContainerSize.width = currentCaptionWidth;\n _onStartDragCaptionContainerSize.height = currentCaptionHeight;\n var topPercent = (currentTextOffset.top - currentCaptionOffset.top) / currentCaptionHeight * PERCENTAGE_MULTIPLICATION_DENOMINATOR;\n var leftPercent = (currentTextOffset.left - currentCaptionOffset.left) / currentCaptionWidth * PERCENTAGE_MULTIPLICATION_DENOMINATOR;\n _initCaptionTextPosition.top = topPercent;\n _initCaptionTextPosition.left = leftPercent;\n _customCaptionPosition.top = topPercent;\n _customCaptionPosition.left = leftPercent;\n _$document.on('pointermove touchmove', onCaptionDrag);\n // Safari needs mouseup, Safari reports wrong event.buttons code after user\n // right clicks on player. This causes pepjs to report pointerup event as pointermove event\n _$document.on('pointerup mouseup touchend mouseleave', onCaptionDragEnd);\n _draggingCaption = true;\n onDragAnimationFrame();\n };\n var onCaptionsToggle = function onCaptionsToggle(e, eventData) {\n e.preventDefault();\n setVisible(eventData.captionsEnabled);\n handleDisplayCaptions();\n };\n var resizeCaptionsContainer = function resizeCaptionsContainer() {\n // it's possible we can tie this function into sequential logic for internal sizeChange management, but this was moved to this file at\n // end of large refactor work where it was known to work when triggered off the Captions.Resized logic as it is done here. so, that event-driven\n // trigger was just left in place for now\n if (captionsService.position === CAPTION_POSITION.under) {\n $container[0].style.setProperty(cssVariables.reservedSizeCaptions, \"\".concat(Math.round(_$positionContainer.height()), \"px\"));\n }\n };\n var setupDomStructure = function setupDomStructure() {\n if (captionsService.position === CAPTION_POSITION.under) {\n var mediaWrapper = $container.find('.media-wrapper').first();\n _$positionContainer.insertAfter(mediaWrapper);\n }\n };\n var setupEvents = function setupEvents() {\n $container.on(events.Captions.Toggled, onCaptionsToggle);\n $container.on(events.Captions.LanguageChanged, onCaptionLanguageChanged);\n $container.on(events.Captions.Resized, resizeCaptionsContainer);\n if (canDragCaptions && captionsService.position !== CAPTION_POSITION.under) {\n _$textContainer.on('mousedown touchstart', onCaptionDragStart);\n }\n };\n var destroy = function destroy() {\n $container.off(events.Captions.Toggled, onCaptionsToggle);\n $container.off(events.Captions.LanguageChanged, onCaptionLanguageChanged);\n $container.off(events.Captions.Resized, resizeCaptionsContainer);\n _$textContainer.off();\n };\n var removeCustomCaptionPosition = function removeCustomCaptionPosition() {\n _initDragClientPosition.x = _initDragClientPosition.y = 0;\n _onStartDragCaptionContainerSize.width = _onStartDragCaptionContainerSize.height = 0;\n _initCaptionTextPosition.top = _initCaptionTextPosition.left = 0;\n _customCaptionPosition.top = _customCaptionPosition.left = 0;\n _$positionContainer.removeClass(cssClasses.captionsCustomPosition);\n _$textContainer.css({\n top: '',\n left: ''\n });\n };\n var setVisible = function setVisible(value) {\n if (value === true && captionsService.hasCaptions) {\n updateView();\n removeCustomCaptionPosition();\n _$positionContainer.removeClass(cssClasses.hide);\n } else {\n _$positionContainer.addClass(cssClasses.hide);\n }\n _visible = value;\n };\n var getVerticalAlignmentClass = function getVerticalAlignmentClass(verticalAlignment) {\n return verticalAlignment === CAPTION_ALIGNMENT.top ? cssClasses.captionsVerticalAlignTop : cssClasses.captionsVerticalAlignBottom;\n };\n var getHorizontalAlignmentClass = function getHorizontalAlignmentClass(horizontalAlignment) {\n switch (horizontalAlignment) {\n case CAPTION_ALIGNMENT.left:\n return cssClasses.captionsHorizontalAlignLeft;\n case CAPTION_ALIGNMENT.right:\n return cssClasses.captionsHorizontalAlignRight;\n default:\n return cssClasses.captionsHorizontalAlignCenter;\n }\n };\n var handleDisplayCaptions = function handleDisplayCaptions(captionStylesHaveChanged) {\n if (captionsService.hasCaptions) {\n if (captionStylesHaveChanged === true) {\n updateView();\n }\n // deal with setting up captions 'under' video, causes us to restructure DOM elements a little =(\n if (captionsService.position === CAPTION_POSITION.under) {\n _$textContainer.off();\n }\n }\n };\n var updateView = function updateView() {\n _$textContainer.removeClass([cssClasses.captionXmpView, cssClasses.captionAdaView]);\n captionViewFactory.getCaptionView().setStyle(captionsService, _$positionContainer, _$textContainer);\n };\n var onSizeChange = function onSizeChange() {\n if (videoElementView === null) {\n return;\n }\n captionViewFactory.getCaptionView().setScale(captionsService, _canvasScale, _$positionContainer);\n captionViewFactory.getCaptionView().setWidth(videoElementView.mediaWidth * _canvasScale, _$textContainer, captionsService.position === CAPTION_POSITION.under);\n $container.trigger(events.Captions.Resized);\n };\n var updateCaption = function updateCaption(currentTime, currentFile, forceActiveCaptionUpdate) {\n if (!captionsService.hasCaptions) {\n _$textContainer.html('');\n return;\n }\n _lastUpdateCurrentTime = currentTime;\n _lastUpdateCurrentFile = currentFile;\n var newCaptionIndex = -1;\n $.each(captionsService.captionController.activeCaptionTrack.captionCollection.captions, function (i, caption) {\n // this check is for playlist config, single media player use doesn't match here\n if (caption.file !== undefined && caption.file !== currentFile) {\n return;\n }\n if (caption.startTime <= currentTime && currentTime <= caption.endTime) {\n newCaptionIndex = i;\n }\n });\n if (newCaptionIndex === -1) {\n _$textContainer.addClass(cssClasses.hide);\n _$textContainer.html('');\n _currentCaptionIndex = -1;\n return;\n }\n if (forceActiveCaptionUpdate || newCaptionIndex !== _currentCaptionIndex) {\n _currentCaptionIndex = newCaptionIndex;\n var newCaption = captionsService.captionController.activeCaptionTrack.captionCollection.captions[newCaptionIndex];\n if (!(newCaption && newCaption.markupText)) {\n _$textContainer.addClass(cssClasses.hide);\n _$textContainer.html('');\n return;\n }\n _$textContainer.removeClass(cssClasses.hide);\n _$positionContainer.removeClass(cssClasses.captionsHorizontalAlignLeft + ' ' + cssClasses.captionsHorizontalAlignCenter + ' ' + cssClasses.captionsHorizontalAlignRight);\n _$positionContainer.addClass(getHorizontalAlignmentClass(newCaption.horizontalAlignment));\n if (captionsService.position !== CAPTION_POSITION.under) {\n _$positionContainer.removeClass(cssClasses.captionsVerticalAlignTop + ' ' + cssClasses.captionsVerticalAlignBottom);\n _$positionContainer.addClass(getVerticalAlignmentClass(newCaption.verticalAlignment));\n }\n captionViewFactory.getCaptionView().setText(newCaption, _$textContainer);\n updateView();\n onSizeChange();\n $container.trigger(events.Captions.Changed, newCaption);\n }\n };\n var showVideoTrackCaptions = function showVideoTrackCaptions() {\n if (videoElementView === null) {\n return;\n }\n if (videoElementView.containsWebTrackCaptions) {\n _$positionContainer.addClass(cssClasses.hide);\n videoElementView.showCaptionTrack(captionsService.captionController.getActiveLanguageIdentifier());\n }\n };\n var hideVideoTrackCaptions = function hideVideoTrackCaptions() {\n if (videoElementView === null) {\n return;\n }\n if (videoElementView.containsWebTrackCaptions) {\n _$positionContainer.removeClass(cssClasses.hide);\n videoElementView.hideCaptionTrack(captionsService.captionController.getActiveLanguageIdentifier());\n }\n };\n setupDomStructure();\n setupEvents();\n updateView();\n if (!canDragCaptions) {\n _$positionContainer.addClass(cssClasses.captionsPreventCaptionDrag);\n }\n return Object.defineProperties({\n updateCaption: updateCaption,\n handleDisplayCaptions: handleDisplayCaptions,\n showVideoTrackCaptions: showVideoTrackCaptions,\n hideVideoTrackCaptions: hideVideoTrackCaptions,\n destroy: destroy\n }, {\n visible: {\n get: function get() {\n return _visible;\n },\n set: setVisible\n },\n scale: {\n get: function get() {\n return _canvasScale;\n },\n set: function set(canvasScale) {\n _canvasScale = canvasScale;\n onSizeChange();\n }\n }\n });\n};\nvar CaptionsView$1 = {\n /**\n * Factory method that returns a new CaptionsView object.\n * @function create\n * @memberof TSC.CaptionsView\n * @static\n * @param {jQuery} $container - Root Smart Player dom element\n * @param {CaptionService} captionsService - Caption service instance\n * @param {TSC.VideoElementView} videoElementView - Video element view for MP4 video, this is null for YouTube video.\n * @param {boolean} canDragCaptions - Captions can be dragged to a new location by the user.\n * @return new CaptionView instance\n */\n create: CaptionsView\n};\n\nvar DEFAULT_CAPTION_STATE = false;\n\n/**\n * @memberof TSC\n * @class CaptionController\n * @classdesc Controller for managing XMP features\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.MediaList} mediaList\n * @param {TSC.CaptionService} captionService\n *\n */\nvar CaptionController = function CaptionController($container, mediaView, xmpModel, mediaList, captionService) {\n var hasCaptions = xmpModel && xmpModel.hasCaptionItems || captionService.captionTrack;\n if (!hasCaptions) {\n throw new Error('Attempted to create caption controller with no captions in xmp');\n }\n var LOCAL_STORAGE_CAPTIONS_STATE_KEY = 'captionEnabled';\n var _captionsView;\n var _$controls = $container.find('.video-controls-container');\n var setupCaptionView = function setupCaptionView(captionPosition) {\n _captionsView = CaptionsView$1.create($container, captionService, mediaView, mediaView.canDragContentOnVideo);\n _captionsView.handleDisplayCaptions(true);\n if (captionPosition === CAPTION_POSITION.under) {\n _$controls.addClass(cssClasses.captionsUnderVideo);\n }\n $container.trigger(events.Controls.DisplayCaptionControl, {\n displayCaptionControl: captionPosition !== CAPTION_POSITION.under,\n captionViewPosition: captionPosition\n });\n };\n var setupNonXmpFeatures = function setupNonXmpFeatures() {\n captionService.initDefaults();\n setupCaptionView(captionService.position);\n };\n var setupXmpFeatures = function setupXmpFeatures() {\n captionService.initFromXmp(xmpModel);\n setupCaptionView(xmpModel.captionPosition);\n };\n var isNotNullOrUndefined = function isNotNullOrUndefined(input) {\n return input !== null && input !== undefined;\n };\n var loadInitialState = function loadInitialState() {\n var savedCaptionsStateFromLocalStorage = localStorageWrapper.getItem(LOCAL_STORAGE_CAPTIONS_STATE_KEY);\n savedCaptionsStateFromLocalStorage = savedCaptionsStateFromLocalStorage ? savedCaptionsStateFromLocalStorage === 'true' : undefined;\n var videoCaptionsSetting = playerConfiguration.getCaptionsEnabled();\n var initialState;\n if (playerConfiguration.getIgnoreStoredCaptionVisibleSetting()) {\n initialState = isNotNullOrUndefined(videoCaptionsSetting) ? videoCaptionsSetting : DEFAULT_CAPTION_STATE;\n } else if (isNotNullOrUndefined(savedCaptionsStateFromLocalStorage)) {\n initialState = savedCaptionsStateFromLocalStorage;\n } else if (isNotNullOrUndefined(videoCaptionsSetting)) {\n initialState = videoCaptionsSetting;\n } else {\n initialState = DEFAULT_CAPTION_STATE;\n }\n $container.trigger(events.Captions.StateLoaded, {\n captionsEnabled: initialState\n });\n };\n var onCaptionsToggle = function onCaptionsToggle(e, eventData) {\n e.preventDefault();\n eventData.savePreference && localStorageWrapper.setItem(LOCAL_STORAGE_CAPTIONS_STATE_KEY, eventData.captionsEnabled);\n };\n var resizeCaptions = function resizeCaptions() {\n if (!mediaView || mediaView.mediaWrapper === undefined || mediaView.mediaHeight <= 0) {\n return;\n }\n captionService.setFontSizeForPlayerDimensions($container.width(), $container.height());\n if (_captionsView) {\n // if caption-position under we use the top-level container for scaling\n var scaleContainer = captionService.captionPosition === CAPTION_POSITION.under ? $container : mediaView.mediaWrapper;\n _captionsView.scale = videoApiUtils.calculateCanvasScale(mediaView, scaleContainer.width(), scaleContainer.height());\n }\n };\n var updateCaptions = function updateCaptions(currentTimeInMilliseconds, forceActiveCaptionUpdate) {\n var currentFile = mediaList.isPlaylist ? mediaList.currentMedia.media : null;\n _captionsView.updateCaption(currentTimeInMilliseconds, currentFile, forceActiveCaptionUpdate);\n };\n var onPlayerResize = function onPlayerResize() {\n resizeCaptions();\n };\n var onFullScreenChange = function onFullScreenChange() {\n resizeCaptions();\n };\n var onLoadedMetadata = function onLoadedMetadata() {\n resizeCaptions();\n };\n var onVideoTimeUpdate = function onVideoTimeUpdate() {\n updateCaptions(mediaView.currentTimeInMilliseconds, false);\n };\n var onSeeked = function onSeeked() {\n updateCaptions(mediaView.currentTimeInMilliseconds, false);\n };\n var onPipChanged = function onPipChanged(event, eventData) {\n if (_captionsView && _captionsView.visible) {\n if (eventData.pipViewActive) {\n _captionsView.showVideoTrackCaptions();\n } else {\n _captionsView.hideVideoTrackCaptions();\n }\n }\n };\n var onNewCaptionTrack = function onNewCaptionTrack() {\n if (_captionsView) {\n _captionsView.handleDisplayCaptions();\n }\n };\n var bindToEvents = function bindToEvents() {\n captionService.addEventListener(events.CaptionService.NewCaptionTrack, onNewCaptionTrack);\n $container.on(events.Controls.FullScreenChange, onFullScreenChange);\n $container.on(events.Controls.MediaResize, onPlayerResize);\n $container.on(events.Controls.PipChanged, onPipChanged);\n $container.on(events.Captions.Toggled, onCaptionsToggle);\n mediaView.mediaWrapper.on('ratechange', onVideoTimeUpdate, false);\n mediaView.mediaWrapper.on('play', onVideoTimeUpdate, false);\n var eventsToBind = {\n loadedmetadata: onLoadedMetadata,\n timeupdate: onVideoTimeUpdate,\n seeked: onSeeked\n };\n mediaView.mediaWrapper.on(eventsToBind);\n };\n var unbindToEvents = function unbindToEvents() {\n captionService.removeEventListener(events.CaptionService.NewCaptionTrack, onNewCaptionTrack);\n $container.off(events.Controls.FullScreenChange, onFullScreenChange);\n $container.off(events.Controls.MediaResize, onPlayerResize);\n $container.off(events.Controls.PipChanged, onPipChanged);\n $container.off(events.Captions.Toggled, onCaptionsToggle);\n mediaView.mediaWrapper.off('ratechange', onVideoTimeUpdate, false);\n mediaView.mediaWrapper.off('play', onVideoTimeUpdate, false);\n var eventsToBind = {\n loadedmetadata: onLoadedMetadata,\n timeupdate: onVideoTimeUpdate,\n seeked: onSeeked\n };\n mediaView.mediaWrapper.off(eventsToBind);\n };\n var getCaptionCollection = function getCaptionCollection() {\n return captionService.captionTrack.captionCollection;\n };\n var getCaptionTrack = function getCaptionTrack() {\n return captionService.captionTrack;\n };\n var setCaptionTrack = function setCaptionTrack(value) {\n captionService.captionTrack = value;\n if (_captionsView) {\n _captionsView.handleDisplayCaptions();\n }\n };\n var getCaptionsVisible = function getCaptionsVisible() {\n return _captionsView ? _captionsView.visible : playerConfiguration.getCaptionsEnabled();\n };\n var setCaptionsVisible = function setCaptionsVisible(value) {\n if (_captionsView) {\n _captionsView.visible = value;\n _captionsView.handleDisplayCaptions();\n updateCaptions(mediaView.currentTimeInMilliseconds, true);\n } else {\n playerConfiguration.setCaptionsEnabled(value);\n }\n var showCaptionControls = value && captionService.hasCaptions;\n $container.trigger(events.Controls.DisplayCaptionControl, {\n displayCaptionControl: showCaptionControls && captionService.captionPosition !== CAPTION_POSITION.under,\n captionViewPosition: captionService.captionPosition\n });\n $container.trigger(events.Captions.StateLoaded, {\n captionsEnabled: showCaptionControls\n });\n };\n var destroy = function destroy() {\n unbindToEvents();\n _captionsView && _captionsView.destroy();\n };\n if (xmpModel) {\n setupXmpFeatures();\n } else {\n setupNonXmpFeatures();\n }\n bindToEvents();\n loadInitialState();\n return Object.defineProperties({\n destroy: destroy,\n getCaptionCollection: getCaptionCollection,\n getCaptionTrack: getCaptionTrack,\n setCaptionTrack: setCaptionTrack,\n getCaptionsVisible: getCaptionsVisible,\n setCaptionsVisible: setCaptionsVisible\n }, {});\n};\nvar CaptionController$1 = {\n /**\n * Factory method that returns a new CaptionController.\n * @function create\n * @memberof TSC.CaptionController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.MediaList} mediaList\n * @param {TSC.CaptionService} captionService\n * @return new CaptionController instance\n */\n create: CaptionController\n};\n\nvar EMAIL_REGEX = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\nvar htmlEncode = function htmlEncode(text) {\n if (typeof text === 'string') {\n return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n }\n return text;\n};\nvar isValidEmail = function isValidEmail(email) {\n return EMAIL_REGEX.test(email);\n};\nvar textSanitizer = {\n htmlEncode: htmlEncode,\n isValidEmail: isValidEmail\n};\n\nvar TIME_SALT = new Date().getMilliseconds();\nvar UNIQUE_TOKEN_1 = 'MJB_!_1_@__#_' + TIME_SALT;\nvar UNIQUE_TOKEN_2 = 'MJB_!_2_@__#_' + TIME_SALT;\nvar REGEX_REPLACEMENT_STRING = UNIQUE_TOKEN_1 + '$1' + UNIQUE_TOKEN_2;\nvar TOKEN_1_REGEX = new RegExp(UNIQUE_TOKEN_1, 'g');\nvar TOKEN_2_REGEX = new RegExp(UNIQUE_TOKEN_2, 'g');\nvar REGEX_ESCAPE = /[.*+?^${}()|[\\]\\\\]/g;\nvar createHighlightedText = function createHighlightedText(text, searchRegex) {\n var textWithSearchMatchPlaceholders = text.replace(searchRegex, REGEX_REPLACEMENT_STRING);\n var sanitizedText = textSanitizer.htmlEncode(textWithSearchMatchPlaceholders);\n return sanitizedText.replace(TOKEN_1_REGEX, '<span class=\"found-search-text\">').replace(TOKEN_2_REGEX, '</span>');\n};\nvar simpleSearch = function simpleSearch(items, searchString) {\n var matches = [];\n if (!searchString) {\n return matches;\n }\n var searchRegex = new RegExp('(' + searchString.replace(REGEX_ESCAPE, '\\\\$&') + ')', 'gi');\n items.forEach(function (item) {\n var itemText = item.plainText || item.text || item.name || '';\n if (itemText.toLowerCase().indexOf(searchString) !== -1) {\n matches.push({\n rawText: itemText,\n text: createHighlightedText(itemText, searchRegex),\n startTime: item.startTime,\n file: item.file,\n imageRef: item.image,\n imageRect: item.imageRectangle\n });\n }\n });\n return matches;\n};\nvar searchXmpForString = function searchXmpForString(xmp, searchString) {\n searchString = searchString.toLowerCase();\n var itemsToSearch = xmp.tocItemArray.concat(xmp.captionItems).concat(xmp.screenTextItemArray);\n\n // captions are speech to text converted\n if (xmp.captionItems.length < 1 && xmp.speechTextItemArray.length > 0) {\n itemsToSearch = itemsToSearch.concat(xmp.speechTextItemArray);\n }\n return simpleSearch(itemsToSearch, searchString);\n};\nvar searchTool = {\n searchXmpForString: searchXmpForString\n};\n\nvar TOC_WIDTH = 250;\nvar TOC_MAX_HEIGHT = 80;\nvar POINTER_MOVE_DETECTED_PIXEL_DELTA = 2;\n\n/**\n * @memberof TSC\n * @class TocView\n * @classdesc Table of Contents View\n * @param {JQuery}} $container - jQuery top-level smartplayer container\n * @param {TSC.Xmp} xmpModel - Xmp Model\n */\nvar TocView = function TocView($container, xmpModel) {\n var _viewVisible = false;\n var _viewIsOpen = false;\n var _searchFocus = false;\n var _scrolledToc = false;\n var _eventHandlers = {};\n var _keysEnabled = true;\n var _inputSearchClassName = '.toc-search-input';\n var _$tocHeadContainer = null;\n var _$searchContainer = null;\n var _$searchInput = null;\n var _$titleHeader = null;\n var _$clearSearchButton = null;\n var _$tocPipImageContainer = null;\n var _$searchInputDisabled = null;\n var _$tocContentScrollContainer = null;\n var _$tocContent = null;\n var _$tocContentScreenReaderLabel = null;\n var _$tocItemDomList = null;\n var _$tocContainer = null;\n var _$noSearchResultsAlert = null;\n var _xmp = xmpModel;\n var _tocThumbsImage = null;\n var _tocPipImage = null;\n var _pointerDownClientPoint = {\n x: 0,\n y: 0\n };\n var createView = function createView() {\n _$tocContainer = $container.find('.toc-container');\n var tocMarkup = templateGenerator.generateTocMarkup();\n _$tocContainer.html(tocMarkup);\n _$tocHeadContainer = _$tocContainer.find('.toc-head-container');\n _$searchInput = _$tocContainer.find(_inputSearchClassName);\n _$titleHeader = _$tocContainer.find('.toc-media-title');\n _$searchContainer = _$tocContainer.find('.toc-search-container');\n _$clearSearchButton = _$tocContainer.find('.clear-search-button');\n _$tocPipImageContainer = _$tocContainer.find('.toc-pip-image-container');\n _$searchInputDisabled = _$tocContainer.find('.toc-full-screen-search-alert');\n _$tocContentScrollContainer = _$tocContainer.find('.toc-content-scroll-container');\n _$tocContent = _$tocContainer.find('.toc-content-container');\n _$tocContentScreenReaderLabel = _$tocContainer.find('#tocContentScreenReaderLabel');\n _$noSearchResultsAlert = $('<div class=\"sr-only alert-only\" role=\"alert\">' + localizationStrings.getPlayerString(playerStringNames.accessListNoSearchResults) + '</div>');\n };\n var tocContainsActiveElement = function tocContainsActiveElement() {\n var activeElement = viewHelper.getActiveElement();\n return activeElement && (_$tocContainer[0] === activeElement || $.contains(_$tocContainer[0], activeElement));\n };\n var showView = function showView(animationSpeed) {\n if (animationSpeed) {\n _$tocContainer.stop(true, true).fadeIn(animationSpeed);\n } else {\n _$tocContainer.show();\n }\n _viewVisible = true;\n };\n var hideView = function hideView(animationSpeed) {\n if (animationSpeed) {\n _$tocContainer.stop(true, true).fadeOut(animationSpeed);\n } else {\n _$tocContainer.hide();\n }\n _viewVisible = false;\n };\n var openView = function openView() {\n _viewIsOpen = true;\n showView();\n resizeView();\n };\n var closeView = function closeView() {\n _viewIsOpen = false;\n hideView();\n };\n var blurSearchInput = function blurSearchInput() {\n _$searchInput.blur();\n };\n var resizeView = function resizeView() {\n var headerHeight = _$tocHeadContainer.height();\n var containerHeight = $container.height();\n var playerControlHeight = $container.find('.video-controls-container').height();\n var tocTopPosition = containerHeight - playerControlHeight;\n $container[0].style.setProperty(cssVariables.tocTopOffset, \"-\".concat(Math.round(tocTopPosition), \"px\"));\n _$tocContentScrollContainer.css('top', headerHeight + 'px');\n };\n var addEventListener = function addEventListener(eventName, eventCallback) {\n if (typeof eventCallback !== 'function') {\n throw Error('Toc View : addEventListener expects eventCallback to be a function.');\n }\n _eventHandlers[eventName] = eventCallback;\n };\n var removeEventListener = function removeEventListener(eventName) {\n delete _eventHandlers[eventName];\n };\n var loadTocPipImage = function loadTocPipImage() {\n return new Promise$1(function (resolve, reject) {\n _tocPipImage = new Image();\n _tocPipImage.onerror = function () {\n reject();\n };\n _tocPipImage.onload = function () {\n resolve();\n };\n _tocPipImage.src = _xmp.tocImageSrc;\n });\n };\n var displayTocPipImage = function displayTocPipImage() {\n var imageWidth = _tocPipImage.width;\n var imageHeight = _tocPipImage.height;\n var scale = 1;\n var targetWidth;\n var targetHeight;\n var scaledReduction = .60;\n var padding = 20;\n if (imageHeight <= imageWidth) {\n if (imageWidth > TOC_WIDTH - padding) {\n scale = (TOC_WIDTH - padding) / imageWidth;\n targetWidth = TOC_WIDTH - padding;\n targetHeight = imageHeight * scale;\n } else {\n targetWidth = imageWidth;\n targetHeight = imageHeight;\n }\n } else if (imageHeight > TOC_WIDTH - padding) {\n scale = (imageWidth * scaledReduction - padding) / imageHeight;\n targetHeight = TOC_WIDTH * scaledReduction - padding;\n targetWidth = imageWidth * scale;\n } else {\n targetHeight = imageHeight;\n targetWidth = imageWidth;\n }\n var pipImageBackgroundStyle = 'background: url(' + _xmp.tocImageSrc + ') no-repeat;' + 'width: ' + targetWidth + 'px;' + 'height: ' + targetHeight + 'px;' + 'margin-left: ' + (TOC_WIDTH - targetWidth) / 2 + 'px;' + 'margin-right:' + (TOC_WIDTH - targetWidth) / 2 + 'px;';\n var pipImageBackground = $('<div />', {\n \"class\": 'toc-pip-image-background',\n style: pipImageBackgroundStyle\n });\n _$tocPipImageContainer.append(pipImageBackground);\n _$tocPipImageContainer.show();\n };\n var loadTocThumbnailImage = function loadTocThumbnailImage(tocThumbnailImageSrc) {\n return new Promise$1(function (resolve) {\n if (_xmp.tocContainsThumbs) {\n _tocThumbsImage = new Image();\n _tocThumbsImage.onload = function () {\n resolve();\n };\n _tocThumbsImage.onerror = function () {\n _tocThumbsImage.onload = undefined;\n _tocThumbsImage.onerror = undefined;\n _tocThumbsImage = null;\n resolve();\n };\n _tocThumbsImage.src = tocThumbnailImageSrc;\n } else {\n resolve();\n }\n });\n };\n var setupTocPosition = function setupTocPosition() {\n _$tocContainer.toggleClass('right', playerConfiguration.getSidebarLocation() === 'right');\n };\n var setupSearch = function setupSearch() {\n if (!playerConfiguration.getIsSearchable()) {\n _$searchContainer.hide();\n }\n };\n var setupTocHeader = function setupTocHeader() {\n if (_xmp.tocImageSrc) {\n loadTocPipImage().then(displayTocPipImage)[\"catch\"](function () {\n console.warn('Failed to load toc pip image ', _xmp.tocImageSrc);\n });\n }\n _$titleHeader.text(playerConfiguration.tocTitle || localizationStrings.getPlayerString(playerStringNames.accessListTableOfContents));\n };\n var clearTocContent = function clearTocContent() {\n _$tocContent.empty();\n };\n var generateTocItemThumbnail = function generateTocItemThumbnail(tocItemThumbnailCanvasEl, imageThumbRect) {\n var defaultBgColor = '#000';\n var tocCellPadding = 20;\n var xPos = Number(imageThumbRect.x);\n var yPos = Number(imageThumbRect.y);\n var imageWidth = Number(imageThumbRect.width);\n var imageHeight = Number(imageThumbRect.height);\n var thumbScale = 1;\n if (imageWidth > TOC_WIDTH / 2 - tocCellPadding) {\n thumbScale = (TOC_WIDTH / 2 - tocCellPadding) / imageWidth;\n imageWidth = TOC_WIDTH / 2 - tocCellPadding;\n }\n if (imageHeight > TOC_MAX_HEIGHT - tocCellPadding) {\n var verticalThumbScale = (TOC_MAX_HEIGHT - tocCellPadding) / imageHeight;\n thumbScale = Math.min(thumbScale, verticalThumbScale);\n }\n var ctx = tocItemThumbnailCanvasEl.getContext('2d');\n tocItemThumbnailCanvasEl.width = imageWidth * thumbScale;\n tocItemThumbnailCanvasEl.height = imageHeight * thumbScale;\n ctx.scale(thumbScale, thumbScale);\n if (_tocThumbsImage) {\n ctx.drawImage(_tocThumbsImage, xPos, yPos, imageWidth, imageHeight, 0, 0, imageWidth, imageHeight);\n } else {\n ctx.fillStyle = defaultBgColor;\n ctx.fillRect(0, 0, imageWidth, imageHeight);\n }\n };\n var createTocItem = function createTocItem(tocText, tocRawText, tocTime, tocFile, tocItemThumbnailCanvasEl, imageThumbRect, showText, showThumbnail) {\n var dataTocTime = 'data-time=' + tocTime;\n var dataFileText = tocFile ? 'data-file=' + tocFile : '';\n var centerContent = !showText;\n var tocItemMarkup = templateGenerator.generateTocItemMarkup(dataTocTime, dataFileText, showThumbnail, centerContent, showText, tocText, tocRawText);\n var $tocItem = $($.parseHTML(tocItemMarkup));\n if (showThumbnail) {\n generateTocItemThumbnail(tocItemThumbnailCanvasEl, imageThumbRect);\n tocItemThumbnailCanvasEl.classList.add('toc-item-thumbnail');\n $tocItem.find('.thumbnail-placeholder').replaceWith(tocItemThumbnailCanvasEl);\n }\n return $tocItem;\n };\n var createTocItems = function createTocItems() {\n _$tocItemDomList = [];\n var tocItems = _xmp.tocItemArray;\n tocItems.forEach(function (tocItem) {\n var thumbnailCanvasEl = tocItem.imageRectangle ? document.createElement('canvas') : undefined;\n var showThumbnail = !!thumbnailCanvasEl;\n var showText = _xmp.tocCellLayoutType !== 'imageOnly' || !showThumbnail;\n _$tocItemDomList.push(createTocItem(textSanitizer.htmlEncode(tocItem.name), tocItem.name, tocItem.startTime, tocItem.file, thumbnailCanvasEl, tocItem.imageRectangle, showText, showThumbnail));\n });\n };\n var displayTocItems = function displayTocItems() {\n clearTocContent();\n if (_$tocItemDomList === null) {\n createTocItems();\n }\n _$tocContentScreenReaderLabel.html(localizationStrings.getPlayerString(playerStringNames.accessListTableOfContents));\n _$tocContent.append(_$tocItemDomList);\n };\n var setupView = function setupView() {\n setupTocPosition();\n setupSearch();\n setupTocHeader();\n loadTocThumbnailImage(_xmp.tocThumbImageSrc).then(displayTocItems);\n if (playerConfiguration.getSidebarEnabled()) {\n openView();\n }\n _$tocContainer.click(function (e) {\n e.stopPropagation();\n });\n };\n var tocItemClickHandler = function tocItemClickHandler(e) {\n e.stopImmediatePropagation();\n e.preventDefault();\n if (deviceInfo.isTouchInterface() && _scrolledToc) {\n return;\n }\n seekToTocItem(e.currentTarget);\n };\n var seekToTocItem = function seekToTocItem(target) {\n if (_eventHandlers.clickTocItem) {\n var $currentTarget = $(target);\n var timeToSeekTo = Number($currentTarget.attr('data-time')) / 1000;\n var fileToSeekTo = $currentTarget.attr('data-file');\n _eventHandlers.clickTocItem(timeToSeekTo, fileToSeekTo);\n }\n };\n var onTocItemPointerDown = function onTocItemPointerDown(e) {\n _pointerDownClientPoint.x = e.originalEvent.clientX;\n _pointerDownClientPoint.y = e.originalEvent.clientY;\n _scrolledToc = false;\n };\n var onTocItemPointerMove = function onTocItemPointerMove(e) {\n // this event fires a lot when the browser natively implements pointer-events. We need to actual check for movement between events.\n if (Math.abs(e.originalEvent.clientX - _pointerDownClientPoint.x) <= POINTER_MOVE_DETECTED_PIXEL_DELTA && Math.abs(e.originalEvent.clientY - _pointerDownClientPoint.y) <= POINTER_MOVE_DETECTED_PIXEL_DELTA) {\n return;\n }\n if (!deviceInfo.isTouchIEInterface()) {\n _scrolledToc = true;\n }\n };\n var onSearchTextInput = function onSearchTextInput(e) {\n updateSearchResults();\n if (keys.isKeyOfType(e.key, keys.keyTypes.enter)) {\n var $tocButtons = _$tocContent.find('button');\n if ($tocButtons.length > 0) {\n $tocButtons.first().focus();\n } else {\n _$tocContent.after(_$noSearchResultsAlert);\n }\n }\n };\n var updateSearchResults = function updateSearchResults() {\n if (_$searchInput.val() !== '') {\n clearTocContent();\n var searchResults = searchTool.searchXmpForString(_xmp, _$searchInput.val());\n var searchResultsTocItems = [];\n searchResults.forEach(function (result) {\n var thumbnailCanvasEl = result.imageRect ? document.createElement('canvas') : undefined;\n var showThumbnail = !!thumbnailCanvasEl;\n var showText = true;\n searchResultsTocItems.push(createTocItem(result.text, result.rawText, result.startTime, result.file, thumbnailCanvasEl, result.imageRect, showText, showThumbnail));\n });\n _$tocContentScreenReaderLabel.html(localizationStrings.getPlayerString(playerStringNames.accessListSearchResults));\n _$tocContent.append(searchResultsTocItems);\n var updateSearchAlertStringToken = '{{number}}';\n var updatedSearchAlertText = localizationStrings.getPlayerString(playerStringNames.searchResultsUpdated);\n updatedSearchAlertText = updatedSearchAlertText.replace(updateSearchAlertStringToken, searchResultsTocItems.length);\n alertScreenReader(updatedSearchAlertText);\n } else {\n _$noSearchResultsAlert.remove();\n displayTocItems();\n }\n };\n var alertScreenReader = function alertScreenReader(alertText) {\n var screenReaderAlertMarkup = templateGenerator.generateScreenReaderAlertMarkup(alertText);\n var $screenReaderAlert = $(screenReaderAlertMarkup);\n $container.append($screenReaderAlert);\n setTimeout(function () {\n $screenReaderAlert.remove();\n }, 1000);\n };\n var clearSearch = function clearSearch() {\n _$searchInput.val('');\n _$noSearchResultsAlert.remove();\n displayTocItems();\n var clearSearchAlertText = localizationStrings.getPlayerString(playerStringNames.searchTextCleared);\n alertScreenReader(clearSearchAlertText);\n };\n var disableSearch = function disableSearch() {\n _$searchContainer.hide();\n _$searchInputDisabled.show();\n };\n var enableSearch = function enableSearch() {\n if (playerConfiguration.getIsSearchable()) {\n _$searchContainer.show();\n _$searchInputDisabled.hide();\n }\n };\n var onSearchInputFocus = function onSearchInputFocus() {\n _searchFocus = true;\n $container.trigger(events.Controls.Disable);\n $container.trigger(events.Controls.SearchFocusChange, {\n searchIsFocused: true\n });\n };\n var onSearchInputBlur = function onSearchInputBlur() {\n _searchFocus = false;\n $container.trigger(events.Controls.Enable);\n $container.trigger(events.Controls.SearchFocusChange, {\n searchIsFocused: false\n });\n };\n var onTocItemKeyUp = function onTocItemKeyUp(e) {\n if (!_keysEnabled) {\n return;\n }\n if (keys.isKeyOfType(e.key, keys.keyTypes.space, keys.keyTypes.enter)) {\n e.stopImmediatePropagation();\n e.preventDefault();\n seekToTocItem(e.currentTarget);\n }\n };\n var onTocItemKeyDown = function onTocItemKeyDown(e) {\n if (!_keysEnabled) {\n return;\n }\n if (keys.isKeyOfType(e.key, keys.keyTypes.space)) {\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n };\n var onTocContentScrollHandler = function onTocContentScrollHandler() {\n $container.trigger(events.Controls.TocScroll);\n };\n var onKeyDownHandler = function onKeyDownHandler(e) {\n if (!hotkeyService.areHotkeysEnabled()) {\n return;\n }\n if (keys.isKeyOfType(e.key, keys.keyTypes.escape)) {\n if (_viewIsOpen) {\n if (_$tocContainer.is(':focus') || _$tocContainer.has(e.target).length > 0) {\n $container.trigger(events.Controls.FocusTocButton);\n }\n alertScreenReader(localizationStrings.getPlayerString(playerStringNames.tableOfContentsHidden));\n $container.trigger(events.Controls.HideToc);\n }\n }\n };\n var disableKeyListeners = function disableKeyListeners() {\n _$tocContainer.attr('tabindex', tabIndex.Disabled);\n _keysEnabled = false;\n };\n var enableKeyListeners = function enableKeyListeners() {\n _$tocContainer.attr('tabindex', tabIndex.DomOrder);\n _keysEnabled = true;\n };\n var bindEvents = function bindEvents() {\n _$tocContent.on('pointerup', '.toc-item', tocItemClickHandler);\n _$tocContent.on('keyup', '.toc-item', onTocItemKeyUp);\n _$tocContent.on('keydown', '.toc-item', onTocItemKeyDown);\n _$tocContent.on('pointerdown', '.toc-item', onTocItemPointerDown);\n _$tocContent.on('pointermove', '.toc-item', onTocItemPointerMove);\n _$tocContentScrollContainer.on('scroll', onTocContentScrollHandler);\n $container.on('keydown', onKeyDownHandler);\n $container.on(events.Controls.Disable, disableKeyListeners);\n $container.on(events.Controls.Enable, enableKeyListeners);\n if (playerConfiguration.getIsSearchable()) {\n _$searchInput.on('keyup', onSearchTextInput);\n _$searchInput.on('focus', onSearchInputFocus);\n _$clearSearchButton.on('click', clearSearch);\n $container.on('blur', _inputSearchClassName, onSearchInputBlur); // need to use delegate for blur to consistently fire\n $container.on(events.Captions.LanguageChanged, updateSearchResults);\n }\n };\n var destroy = function destroy() {\n _$tocContent.off('pointerup', '.toc-item', tocItemClickHandler);\n _$tocContent.off('keyup', '.toc-item', onTocItemKeyUp);\n _$tocContent.off('keydown', '.toc-item', onTocItemKeyDown);\n _$tocContent.off('pointerdown', '.toc-item', onTocItemPointerDown);\n _$tocContent.off('pointermove', '.toc-item', onTocItemPointerMove);\n _$tocContentScrollContainer.off('scroll', onTocContentScrollHandler);\n $container.off('keydown', onKeyDownHandler);\n $container.off(events.Controls.Disable, disableKeyListeners);\n $container.off(events.Controls.Enable, enableKeyListeners);\n if (playerConfiguration.getIsSearchable()) {\n _$searchInput.off('keyup', onSearchTextInput);\n _$searchInput.off('focus', onSearchInputFocus);\n $container.off('blur', _inputSearchClassName, onSearchInputBlur);\n _$clearSearchButton.off('click', clearSearch);\n $container.off(events.Captions.LanguageChanged, updateSearchResults);\n }\n };\n createView();\n setupView();\n bindEvents();\n return Object.defineProperties({\n open: openView,\n close: closeView,\n show: showView,\n hide: hideView,\n blurSearchInput: blurSearchInput,\n disableSearch: disableSearch,\n enableSearch: enableSearch,\n resize: resizeView,\n addEventListener: addEventListener,\n removeEventListener: removeEventListener,\n destroy: destroy\n }, {\n isOpen: {\n get: function get() {\n return _viewIsOpen;\n }\n },\n visible: {\n get: function get() {\n return _viewVisible;\n }\n },\n searchIsFocused: {\n get: function get() {\n return _searchFocus;\n }\n },\n tocContainsActiveElement: {\n get: tocContainsActiveElement\n }\n });\n};\nvar TocView$1 = {\n /**\n * Factory method that returns a new TocView object.\n * @function create\n * @memberof TSC.TocView\n * @static\n * @param {Object} $container - jQuery element that contains a .toc-container element where ToC view will be injected\n * @param {TSC.Xmp} xmpModel - Xmp Model\n * @return new TocView instance\n */\n create: TocView\n};\n\n/**\n * @memberof TSC\n * @class TableOfContentsController\n * @classdesc Controller for managing XMP features\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.MediaList} mediaList\n * @param {TSC.ProgressBarControlView} progressBarControlView\n * @param {TSC.playerConfiguration} playerConfiguration\n *\n */\nvar TableOfContentsController = function TableOfContentsController($container, mediaView, xmpModel, mediaList, progressBarControlView, playerConfiguration) {\n var hasTableOfContents = xmpModel && xmpModel.hasSearchableItems;\n if (!hasTableOfContents) {\n throw new Error('Attempted to create table of contents controller with no table of contents or searchable items in xmp');\n }\n var _animationSpeed = 300;\n var _tocView;\n var _inFullScreen;\n var _controlsHidden;\n var setupXmpFeatures = function setupXmpFeatures() {\n _tocView = TocView$1.create($container, xmpModel);\n $container.trigger(events.Controls.DisplayTocControl);\n };\n var resizeTableOfContents = function resizeTableOfContents() {\n if (_tocView.isOpen) {\n _tocView.resize();\n }\n };\n var onPlayerResize = function onPlayerResize() {\n resizeTableOfContents();\n };\n var onFullScreenChange = function onFullScreenChange(e, eventData) {\n _inFullScreen = eventData.inFullScreen;\n resizeTableOfContents();\n };\n var onLoadedMetadata = function onLoadedMetadata() {\n mediaView.mediaWrapper.off('loadedmetadata', onLoadedMetadata);\n if (xmpModel.hasTocItems && mediaView.type !== mediaViewType.playlist) {\n progressBarControlView.createTocChapters(xmpModel.tocItemArray);\n }\n resizeTableOfContents();\n if (_tocView.isOpen) {\n $container.trigger(events.Controls.ShowToc);\n }\n };\n var onTocItemClicked = function onTocItemClicked(timeToSeekTo, fileToSeekTo) {\n if (fileToSeekTo !== undefined) {\n var videoIndex = mediaList.getMediaIndexByUri(fileToSeekTo);\n if (videoIndex === mediaList.currentMediaIndex) {\n $container.trigger(events.Media.SeekToTime, {\n time: timeToSeekTo\n });\n } else {\n mediaList.currentMediaIndex = videoIndex;\n $container.trigger(events.Media.SourceChanged);\n }\n } else if (playerConfiguration.allowFastForward || timeToSeekTo < mediaView.currentTime) {\n $container.trigger(events.Media.SeekToTime, {\n time: timeToSeekTo\n });\n }\n };\n var displayToc = function displayToc() {\n _tocView.open();\n };\n var hideToc = function hideToc() {\n _tocView.close();\n };\n var mobileOrientationChange = function mobileOrientationChange() {\n if (_inFullScreen) {\n // when keyboard is up on ipad, the size of screen\n // is reported wrong until we get rid of it\n if (_tocView.searchIsFocused) {\n _tocView.blurSearchInput();\n setTimeout(resizeTableOfContents, 500);\n } else {\n resizeTableOfContents();\n }\n }\n };\n var hideControls = function hideControls() {\n if (_tocView.tocContainsActiveElement) {\n return;\n }\n _controlsHidden = true;\n if (_tocView.isOpen) {\n _tocView.hide(_animationSpeed);\n }\n };\n var showControls = function showControls() {\n if (_controlsHidden) {\n _controlsHidden = false;\n if (_tocView.isOpen) {\n _tocView.show(_animationSpeed);\n }\n }\n };\n var onQuizMinimizeUI = function onQuizMinimizeUI() {\n if (_tocView.isOpen) {\n _tocView.close();\n }\n hideControls();\n };\n var onQuizMaximizeUI = function onQuizMaximizeUI() {\n showControls();\n };\n var onQuizReview = function onQuizReview() {\n if (_tocView.isOpen) {\n _tocView.show(_animationSpeed);\n }\n };\n var onQuizPaused = function onQuizPaused() {\n if (_tocView.isOpen) {\n _tocView.hide(_animationSpeed);\n }\n };\n var onTocDisplayToggled = function onTocDisplayToggled(e, data) {\n if (data.displayToc) {\n displayToc();\n } else {\n hideToc();\n }\n };\n var bindToEvents = function bindToEvents() {\n _tocView.addEventListener('clickTocItem', onTocItemClicked);\n $container.on(events.Controls.ShowToc, displayToc);\n $container.on(events.Controls.HideToc, hideToc);\n $container.on(events.Controls.TocDisplayToggled, onTocDisplayToggled);\n if (deviceInfo.isIOS() || deviceInfo.isAndroid()) {\n window.addEventListener('orientationchange', mobileOrientationChange);\n }\n $container.on(events.Quizzing.MinimizeUI, onQuizMinimizeUI);\n $container.on(events.Quizzing.MaximizeUI, onQuizMaximizeUI);\n $container.on(events.Quizzing.Review, onQuizReview);\n $container.on(events.Quizzing.Paused, onQuizPaused);\n $container.on(events.Controls.FullScreenChange, onFullScreenChange);\n $container.on(events.Controls.PlayerResize, onPlayerResize);\n var eventsToBind = {\n loadedmetadata: onLoadedMetadata\n };\n mediaView.mediaWrapper.on(eventsToBind);\n };\n var unbindToEvents = function unbindToEvents() {\n _tocView.removeEventListener('clickTocItem', onTocItemClicked);\n $container.off(events.Controls.ShowToc, displayToc);\n $container.off(events.Controls.HideToc, hideToc);\n $container.off(events.Controls.TocDisplayToggled, onTocDisplayToggled);\n if (deviceInfo.isIOS() || deviceInfo.isAndroid()) {\n window.removeEventListener('orientationchange', mobileOrientationChange);\n }\n $container.off(events.Quizzing.MinimizeUI, onQuizMinimizeUI);\n $container.off(events.Quizzing.MaximizeUI, onQuizMaximizeUI);\n $container.off(events.Quizzing.Review, onQuizReview);\n $container.on(events.Quizzing.Paused, onQuizPaused);\n $container.off(events.Controls.FullScreenChange, onFullScreenChange);\n $container.off(events.Controls.PlayerResize, onPlayerResize);\n var eventsToBind = {\n loadedmetadata: onLoadedMetadata\n };\n mediaView.mediaWrapper.off(eventsToBind);\n };\n var destroy = function destroy() {\n unbindToEvents();\n _tocView && _tocView.destroy();\n };\n setupXmpFeatures();\n bindToEvents();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar TableOfContentsController$1 = {\n /**\n * Factory method that returns a new TableOfContentsController.\n * @function create\n * @memberof TSC.TableOfContentsController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.MediaList} mediaList\n * @param {TSC.ProgressBarControlView} progressBarControlView\n * @param {TSC.playerConfiguration} playerConfiguration\n * @return new TableOfContentsController instance\n */\n create: TableOfContentsController\n};\n\nvar SYNC_TOLERANCE_TIME_IN_SECONDS = .5;\nvar BUFFER_TIME_OFFSET_IN_SECONDS = 1;\n\n/**\n * @memberof TSC\n * @class AudioDescriptionTrackView\n * @classdesc Audio Description Track\n * @param {Object} $container - jQuery element to add audio description track audio dom.\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n * @param {String} audioDescriptionMediaSrc - Audio source string\n */\nvar AudioDescriptionTrackView = function AudioDescriptionTrackView($container, mediaElement, audioDescriptionMediaSrc) {\n var _audioDescriptionAudioEl = null;\n var _audioTrackEnabled = false;\n var _videoIsSeeking = false;\n var _videoIsBuffering = false;\n var _lastBufferedVideoTime = 0;\n var onAudioError = function onAudioError() {\n destroy();\n $container.trigger(events.AudioDescription.Failed);\n };\n var createView = function createView() {\n var _markup = templateGenerator.generateAudioDescriptionTrackMarkup(audioDescriptionMediaSrc);\n $container.find('.audio-description-track-wrapper').html(_markup);\n _audioDescriptionAudioEl = $container.find('.audio-description-track')[0];\n };\n var syncAudioTimeWithVideoTime = function syncAudioTimeWithVideoTime() {\n if (!isNaN(_audioDescriptionAudioEl.duration)) {\n _audioDescriptionAudioEl.currentTime = mediaElement.currentTime;\n }\n };\n var syncAudioVolumeWithVideoVolume = function syncAudioVolumeWithVideoVolume() {\n _audioDescriptionAudioEl.volume = mediaElement.muted ? 0 : mediaElement.volume;\n };\n var syncAudioPlaybackRateWithVideoPlaybackRate = function syncAudioPlaybackRateWithVideoPlaybackRate() {\n _audioDescriptionAudioEl.playbackRate = mediaElement.playbackRate;\n _audioDescriptionAudioEl.defaultPlaybackRate = mediaElement.playbackRate;\n };\n var pauseAudioDescription = function pauseAudioDescription() {\n _audioDescriptionAudioEl.pause();\n };\n var onVideoPlaying = function onVideoPlaying() {\n syncAudioTimeWithVideoTime();\n };\n var onVideoStartSeeking = function onVideoStartSeeking() {\n _videoIsSeeking = true;\n\n // some browsers do not fire 'waiting' event when seeking and no data is buffered\n // manually fire this to make sure player pauses audio and checks for video buffering\n onWaiting();\n _audioDescriptionAudioEl.volume = 0;\n pauseAudioDescription();\n };\n var onVideoSeeked = function onVideoSeeked() {\n _videoIsSeeking = false;\n syncAudioTimeWithVideoTime();\n };\n var playAudioDescriptionIfVideoIsPlaying = function playAudioDescriptionIfVideoIsPlaying() {\n if (mediaElement.paused || _videoIsBuffering) {\n return;\n }\n var promise = _audioDescriptionAudioEl.play();\n if (promise !== undefined) {\n promise[\"catch\"](function () {}); // eslint-disable-line\n }\n };\n var onRateChange = function onRateChange() {\n syncAudioPlaybackRateWithVideoPlaybackRate();\n syncAudioTimeWithVideoTime();\n };\n var onAudioTrackSeeked = function onAudioTrackSeeked() {\n if (_videoIsSeeking) {\n return;\n }\n var mediaTimeDelta = Math.abs(mediaElement.currentTime - _audioDescriptionAudioEl.currentTime);\n if (mediaTimeDelta >= SYNC_TOLERANCE_TIME_IN_SECONDS) {\n syncAudioTimeWithVideoTime();\n } else {\n syncAudioVolumeWithVideoVolume();\n playAudioDescriptionIfVideoIsPlaying();\n }\n };\n var onAudioDescriptionControlChange = function onAudioDescriptionControlChange(e, eventData) {\n e.preventDefault();\n _audioTrackEnabled = eventData.audioDescriptionEnabled;\n _audioDescriptionAudioEl.muted = !_audioTrackEnabled;\n syncAudioTimeWithVideoTime();\n playAudioDescriptionIfVideoIsPlaying();\n };\n var onWaiting = function onWaiting() {\n _videoIsBuffering = true;\n if (!_audioDescriptionAudioEl.paused) {\n pauseAudioDescription();\n }\n };\n var onTimeUpdate = function onTimeUpdate() {\n if (_videoIsBuffering) {\n var timeDiff = Math.abs(mediaElement.currentTime - _lastBufferedVideoTime);\n if (timeDiff > BUFFER_TIME_OFFSET_IN_SECONDS) {\n _videoIsBuffering = false;\n syncAudioTimeWithVideoTime();\n }\n } else {\n _lastBufferedVideoTime = mediaElement.currentTime;\n }\n };\n var initializeHandlers = function initializeHandlers() {\n _audioDescriptionAudioEl.addEventListener('error', onAudioError);\n _audioDescriptionAudioEl.addEventListener('seeked', onAudioTrackSeeked);\n _audioDescriptionAudioEl.addEventListener('pause', syncAudioTimeWithVideoTime);\n $container.on(events.AudioDescription.Changed, onAudioDescriptionControlChange);\n mediaElement.addEventListener('playing', onVideoPlaying);\n mediaElement.addEventListener('seeking', onVideoStartSeeking);\n mediaElement.addEventListener('seeked', onVideoSeeked);\n mediaElement.addEventListener('pause', pauseAudioDescription);\n mediaElement.addEventListener('volumechange', syncAudioVolumeWithVideoVolume);\n mediaElement.addEventListener('ratechange', onRateChange);\n mediaElement.addEventListener('ended', pauseAudioDescription);\n mediaElement.addEventListener('waiting', onWaiting);\n mediaElement.addEventListener('timeupdate', onTimeUpdate);\n };\n var destroy = function destroy() {\n _audioDescriptionAudioEl.removeEventListener('error', onAudioError);\n _audioDescriptionAudioEl.removeEventListener('seeked', onAudioTrackSeeked);\n _audioDescriptionAudioEl.removeEventListener('pause', syncAudioTimeWithVideoTime);\n $container.off(events.AudioDescription.Changed, onAudioDescriptionControlChange);\n mediaElement.removeEventListener('playing', onVideoPlaying);\n mediaElement.removeEventListener('seeking', onVideoStartSeeking);\n mediaElement.removeEventListener('seeked', syncAudioTimeWithVideoTime);\n mediaElement.removeEventListener('pause', pauseAudioDescription);\n mediaElement.removeEventListener('volumechange', syncAudioVolumeWithVideoVolume);\n mediaElement.removeEventListener('ratechange', onRateChange);\n mediaElement.removeEventListener('ended', pauseAudioDescription);\n mediaElement.removeEventListener('waiting', onWaiting);\n mediaElement.removeEventListener('timeupdate', onTimeUpdate);\n };\n createView();\n initializeHandlers();\n syncAudioVolumeWithVideoVolume();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar AudioDescriptionTrackView$1 = {\n /**\n * Factory method that returns a new AudioDescriptionTrackView object.\n * @function create\n * @memberof TSC.AudioDescriptionTrackView\n * @param {Object} $container - jQuery element to add audio description track audio dom.\n * @param {Object} mediaElement - html5 media DOM element (or wrapper presenting same interface)\n * @param {String} audioDescriptionMediaSrc - Audio source string\n * @static\n * @return new AudioDescriptionTrackView instance\n */\n create: AudioDescriptionTrackView\n};\n\n/**\n * @memberof TSC\n * @class AudioDescriptionController\n * @classdesc Controller for managing XMP features\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {string} audioDescriptionMediaSrc - The source url for the audio description track\n *\n */\nvar AudioDescriptionController = function AudioDescriptionController($container, mediaView, audioDescriptionMediaSrc) {\n var hasAudioDescription = !!audioDescriptionMediaSrc;\n if (!hasAudioDescription) {\n throw new Error('Attempted to create audio description controller with no audio description');\n }\n var _audioDescriptionControlView;\n var _audioDescriptionTrackView;\n var setupFeatures = function setupFeatures() {\n _audioDescriptionControlView = AudioDescriptionControlView$1.create($container);\n _audioDescriptionTrackView = AudioDescriptionTrackView$1.create($container, mediaView.mediaElement, audioDescriptionMediaSrc);\n };\n var destroy = function destroy() {\n _audioDescriptionControlView && _audioDescriptionControlView.destroy();\n _audioDescriptionTrackView && _audioDescriptionTrackView.destroy();\n };\n setupFeatures();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar AudioDescriptionController$1 = {\n /**\n * Factory method that returns a new AudioDescriptionController.\n * @function create\n * @memberof TSC.AudioDescriptionController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {string} audioDescriptionMediaSrc - The source url for the audio description track\n * @return new AudioDescriptionController instance\n */\n create: AudioDescriptionController\n};\n\nvar ConfirmOpenUrlView = function ConfirmOpenUrlView($container, url, newWindow) {\n var _$view;\n var _$externalLinkReplayButton;\n var _$externalLinkVisitButton;\n var onConfirmHandler = function onConfirmHandler() {\n $container.trigger(events.ExternalLinkView.Clicked);\n var windowTarget = newWindow === true ? '_blank' : '_top';\n windowWrapper.open(url, windowTarget);\n };\n var onReplay = function onReplay() {\n $container.trigger(events.ExternalLinkView.Closed);\n $container.trigger(events.Modals.Closed);\n $container.trigger(events.Media.Replay);\n destroy();\n };\n var createView = function createView() {\n _$view = $container.find('.open-external-link');\n _$view.html(templateGenerator.generateOpenExternalLinkMarkup(url));\n _$externalLinkReplayButton = _$view.find('.open-external-link-replay');\n _$externalLinkVisitButton = _$view.find('.open-external-link-open');\n bindEvents();\n $container.trigger(events.Modals.Open);\n $container.trigger(events.ExternalLinkView.Open);\n _$view.show();\n };\n var bindEvents = function bindEvents() {\n _$externalLinkReplayButton.on('click', onReplay);\n _$externalLinkVisitButton.on('click', onConfirmHandler);\n };\n var destroy = function destroy() {\n _$externalLinkReplayButton.off('click', onReplay);\n _$externalLinkVisitButton.off('click', onConfirmHandler);\n _$view.empty();\n _$view.hide();\n };\n createView();\n};\n\n/**\n * Factory method that returns a new ConfirmOpenUrlView object.\n * @function create\n * @memberof TSC.ConfirmOpenUrlView\n * @static\n * @param {Object} $container - jQuery element that contains a .open-external-link where the view will be injected\n * @param {String} url - URL to open if confirmed\n * @param {Boolean} newWindow - Open URL in new window\n * @return new ConfirmOpenUrlView instance\n */\nvar ConfirmOpenUrlView$1 = {\n create: ConfirmOpenUrlView\n};\n\nvar endActionType = Object.freeze({\n notAvailable: 'notAvailable',\n loop: 'loop',\n jumpToTimeAndPlay: 'jumpToTime',\n jumpToTImeAndStop: 'jumpToTimeAndStop',\n showReplayControls: 'showReplayControls',\n hideReplayControls: 'hideReplayControls',\n openUrl: 'openUrl',\n openUrlInNewWindow: 'openUrlInNewWindow'\n});\n\n/**\n * @memberof TSC\n * @class EndActionsController\n * @classdesc Controller for managing XMP features\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.ProgressBarControlView} progressBarControlView\n * @param {TSC.BeforeAfterPlayControlsView} beforeAfterPlayControlsView\n *\n */\nvar EndActionsController = function EndActionsController($container, mediaView, progressBarControlView, beforeAfterPlayControlsView) {\n var _processingEndOfVideo = false;\n var getScrubbing = function getScrubbing() {\n return progressBarControlView ? progressBarControlView.scrubbing : false;\n };\n var pause = function pause() {\n mediaView.mediaElement && mediaView.mediaElement.pause();\n };\n var replayVideo = function replayVideo(time, playAfterSeek) {\n if (mediaView.type === mediaViewType.playlist) {\n mediaView.reshowVideoAfterClickToReplay();\n } else {\n $container.trigger(events.Media.SeekToTime, {\n time: time,\n playAfterSeek: playAfterSeek\n });\n }\n };\n var showClickToReplay = function showClickToReplay() {\n beforeAfterPlayControlsView.showVideoClickToReplayLink();\n };\n var onVideoReplayHandler = function onVideoReplayHandler(e, eventData) {\n var replayTime = eventData && eventData.time || 0;\n var playAfterSeek = eventData && eventData.playAfterSeek !== undefined ? eventData.playAfterSeek : true;\n replayVideo(replayTime, playAfterSeek);\n };\n var onVideoEnd = function onVideoEnd() {\n var isPlaybackEnded = !mediaView || mediaView.processVideoEnd();\n $container.trigger(events.Media.End, {\n isPlaybackEnded: isPlaybackEnded\n });\n if (isPlaybackEnded) {\n pause();\n executeEndAction($container, replayVideo, showClickToReplay);\n }\n };\n var processEndOfMedia = function processEndOfMedia() {\n _processingEndOfVideo = true;\n progressBarControlView.updateQuizMarkers();\n pause();\n onVideoEnd();\n _processingEndOfVideo = false;\n };\n var onVideoTimeUpdate = function onVideoTimeUpdate() {\n // check for duration equal zero to fix issue seen on some Android devices\n if (mediaView.mediaElement.duration === 0) {\n return;\n }\n var atVideoEndTime = Number(mediaView.mediaElement.currentTime.toFixed(2)) >= Number(mediaView.mediaElement.duration.toFixed(2));\n if (!getScrubbing() && atVideoEndTime && !_processingEndOfVideo) {\n processEndOfMedia();\n }\n };\n var bindToEvents = function bindToEvents() {\n $container.on(events.Scrubbing.Ended, onVideoTimeUpdate);\n $container.on(events.Media.Replay, onVideoReplayHandler);\n var eventsToBind = {\n timeupdate: onVideoTimeUpdate\n };\n mediaView.mediaWrapper.on(eventsToBind);\n };\n var unbindToEvents = function unbindToEvents() {\n $container.off(events.Scrubbing.Ended, onVideoTimeUpdate);\n $container.off(events.Media.Replay, onVideoReplayHandler);\n var eventsToBind = {\n timeupdate: onVideoTimeUpdate\n };\n mediaView.mediaWrapper.off(eventsToBind);\n };\n var destroy = function destroy() {\n unbindToEvents();\n };\n bindToEvents();\n onVideoTimeUpdate();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar getEndActionType = function getEndActionType() {\n var xmpEndActionType = playerConfiguration.getEndActionType();\n if (xmpEndActionType !== undefined) {\n var xmpEndActionTypeLowerCase = xmpEndActionType.toLowerCase();\n var endActionParam = playerConfiguration.getEndActionParam();\n switch (xmpEndActionTypeLowerCase) {\n case 'loop':\n {\n return endActionType.loop;\n }\n case 'stop':\n {\n if (endActionParam === 'false' || endActionParam === '0') {\n return endActionType.hideReplayControls;\n }\n return endActionType.showReplayControls;\n }\n case 'jumptotime':\n {\n return endActionType.jumpToTimeAndPlay;\n }\n case 'jumptotimeandstop':\n {\n return endActionType.jumpToTImeAndStop;\n }\n case 'jumptourl':\n {\n return endActionType.openUrl;\n }\n case 'jumptourlnew':\n {\n return endActionType.openUrlInNewWindow;\n }\n default:\n {\n return endActionType.notAvailable;\n }\n }\n }\n return endActionType.notAvailable;\n};\nvar executeSeekAction = function executeSeekAction(onReplayHandler, playAfterSeek) {\n var seekTime = parseFloat(playerConfiguration.getEndActionParam());\n var seekTimeInSeconds = !seekTime ? 0 : seekTime / 1000;\n onReplayHandler(seekTimeInSeconds, playAfterSeek);\n};\nvar displayConfirmOpenUrlView = function displayConfirmOpenUrlView($localContainer, inNewWindow) {\n var urlString = '' + playerConfiguration.getEndActionParam();\n ConfirmOpenUrlView$1.create($localContainer, urlString, inNewWindow);\n};\nvar executeEndAction = function executeEndAction($localContainer, replayVideoHandler, showReplayControlsHandler) {\n var type = getEndActionType();\n if (type === endActionType.notAvailable) {\n return;\n }\n switch (type) {\n case endActionType.loop:\n {\n executeSeekAction(replayVideoHandler, true);\n break;\n }\n case endActionType.jumpToTimeAndPlay:\n {\n executeSeekAction(replayVideoHandler, true);\n break;\n }\n case endActionType.jumpToTImeAndStop:\n {\n executeSeekAction(replayVideoHandler, false);\n break;\n }\n case endActionType.showReplayControls:\n {\n showReplayControlsHandler();\n break;\n }\n case endActionType.openUrl:\n {\n displayConfirmOpenUrlView($localContainer, false);\n break;\n }\n case endActionType.openUrlInNewWindow:\n {\n displayConfirmOpenUrlView($localContainer, true);\n break;\n }\n }\n};\nvar EndActionsController$1 = {\n /**\n * Factory method that returns a new EndActionsController.\n * @function create\n * @memberof TSC.EndActionsController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.ProgressBarControlView} progressBarControlView\n * @param {TSC.BeforeAfterPlayControlsView} beforeAfterPlayControlsView\n * @return new EndActionsController instance\n */\n create: EndActionsController,\n getEndActionType: getEndActionType,\n executeEndAction: executeEndAction\n};\n\nvar OVERLAY_TRANSPARENCY = 0.7;\n\n/**\n * @memberof TSC\n * @class BubbleView\n * @classdesc Bubble View\n * @param {String} containerId - id for container element\n */\nvar BubbleView = function BubbleView(containerId) {\n var _viewIsMinimized = false;\n var _windowPadding = 2;\n var _viewBottom = 48;\n var _minArrowDistanceFromEdge = 9;\n var _ignoreBreakpoints = false;\n var _containerId = containerId;\n var _overlayId = '.tsc_overlay';\n var _arrowBubbleClass = '.chat-bubble-arrow';\n var _overlayMarkup = '<div class=\"tsc_overlay\"></div>';\n var _topContainer = null;\n var _$container = null;\n var _$overlay = null;\n var _$arrowBubble = null;\n var clickCapture = function clickCapture(event) {\n event.stopPropagation();\n };\n var isDesktopBreakpoint = function isDesktopBreakpoint() {\n return _topContainer.hasClass('small-desktop-width') && _topContainer.hasClass('small-desktop-height');\n };\n var cacheElements = function cacheElements() {\n _topContainer = _topContainer || $(_containerId).parents('.' + cssClasses.smartPlayerNamespace);\n _$container = _$container || $(_containerId);\n _$overlay = _$overlay || $(_overlayId);\n _$arrowBubble = _$arrowBubble || $(_arrowBubbleClass);\n };\n var minimizeView = function minimizeView() {\n _viewIsMinimized = true;\n _$overlay.css('opacity', 0.0);\n };\n var maximizeView = function maximizeView() {\n _viewIsMinimized = false;\n _$overlay.css('opacity', OVERLAY_TRANSPARENCY);\n };\n var showView = function showView(ignoreBreakpoints) {\n _ignoreBreakpoints = ignoreBreakpoints === undefined ? false : ignoreBreakpoints;\n cacheElements();\n _$container.css('opacity', 1);\n _$overlay.css('opacity', OVERLAY_TRANSPARENCY);\n _$container.on('click', clickCapture);\n };\n var hideView = function hideView() {\n _$container.css('opacity', 0);\n _$overlay.css('opacity', 0);\n _$container.off('click', clickCapture);\n };\n var updateViewPosition = function updateViewPosition() {\n cacheElements();\n if (_ignoreBreakpoints || isDesktopBreakpoint()) {\n _$container.css('bottom', _viewBottom + 'px');\n } else {\n _$container.css('bottom', '0px');\n }\n };\n var removeView = function removeView(destroyOverlay) {\n if (destroyOverlay) {\n _$overlay.remove();\n }\n _$container.remove();\n _topContainer = null;\n _$container = null;\n _$overlay = null;\n _$arrowBubble = null;\n };\n var getOverlayMarkup = function getOverlayMarkup() {\n return _overlayMarkup;\n };\n var setBottomOffset = function setBottomOffset(bottom) {\n _viewBottom = bottom;\n };\n var pointAt = function pointAt(xPos) {\n if (_$container === null) {\n return;\n }\n var playerWidth = _topContainer.outerWidth(true);\n var viewWidth = _$container.outerWidth(true);\n var halfViewWidth = viewWidth / 2;\n var borderWidth = _$arrowBubble.css('border-left-width').replace(/px/, '');\n var arrowWidth = borderWidth * 2;\n var quizXPos;\n var arrowPos;\n\n // left bounds\n if (!_ignoreBreakpoints && !isDesktopBreakpoint()) {\n quizXPos = 0;\n arrowPos = 0;\n } else if (xPos - (halfViewWidth + _windowPadding) < 0) {\n quizXPos = _windowPadding;\n arrowPos = xPos - _windowPadding - borderWidth;\n // right bounds\n } else if (xPos + halfViewWidth + _windowPadding > playerWidth) {\n quizXPos = playerWidth - (viewWidth + _windowPadding);\n arrowPos = xPos - quizXPos - borderWidth;\n // center on point\n } else {\n quizXPos = xPos - halfViewWidth;\n arrowPos = halfViewWidth - borderWidth;\n }\n _$container.css('left', quizXPos);\n _$arrowBubble.css('left', arrowPos);\n if (arrowPos < _minArrowDistanceFromEdge || viewWidth - arrowPos - arrowWidth < _minArrowDistanceFromEdge) {\n _$arrowBubble.hide();\n } else {\n _$arrowBubble.show();\n }\n };\n return Object.defineProperties({\n showView: showView,\n hideView: hideView,\n maximizeView: maximizeView,\n minimizeView: minimizeView,\n updateViewPosition: updateViewPosition,\n removeView: removeView,\n getOverlayMarkup: getOverlayMarkup,\n setBottomOffset: setBottomOffset,\n pointAt: pointAt\n }, {\n viewIsMinimized: {\n get: function get() {\n return _viewIsMinimized;\n }\n }\n });\n};\nvar BubbleView$1 = {\n /**\n * Factory method that returns a new BubbleView object.\n * @function create\n * @memberof TSC.BubbleView\n * @param {String} containerId - id for container element\n * @static\n * @return new BubbleView instance\n */\n create: BubbleView\n};\n\n/**\n * @memberof TSC\n * @class rationaleActionType\n * @classdesc Rationale Action Types\n */\nvar rationaleActionType = Object.defineProperties({}, {\n /**\n * @public\n * @readonly\n * @static\n * @memberof TSC.rationaleActionType\n * @property {String} CONTINUE - continue type\n */\n CONTINUE: {\n value: 'continue'\n },\n /**\n * @public\n * @readonly\n * @static\n * @memberof TSC.rationaleActionType\n * @property {String} LOCATION - location type\n */\n LOCATION: {\n value: 'location'\n },\n /**\n * @public\n * @readonly\n * @static\n * @memberof TSC.rationaleActionType\n * @property {String} JUMP_TO_TIME - jump to time type\n */\n JUMP_TO_TIME: {\n value: 'jumpToTIme'\n }\n});\n\nvar CHECK_SVG = '<svg id=\"Correct\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 42 42\"><style>.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#97C93D;} .st1{fill:#82AD40;} .st2{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}</style><path class=\"st0\" d=\"M21 39c-9.9 0-18-8.1-18-18S11.1 3 21 3s18 8.1 18 18-8.1 18-18 18z\"/><path class=\"st1\" d=\"M21 5c8.8 0 16 7.2 16 16s-7.2 16-16 16S5 29.8 5 21 12.2 5 21 5m0-4C10 1 1 10 1 21s9 20 20 20 20-9 20-20S32 1 21 1z\"/><path class=\"st2\" d=\"M30 16.6l-11.2 12c-.8.8-1.8.3-2.3-.2l-4.8-5.9c-.5-.7-.4-1.6.3-2.2.7-.5 1.6-.4 2.1.3l3.7 4.5 10-10.8c.6-.6 1.5-.6 2.1 0 .7.7.7 1.7.1 2.3z\"/></svg>';\nvar INCORRECT_SVG = '<svg id=\"Wrong\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 42 42\"><style>.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#EF4546;} .st1{fill:#B93130;} .st2{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}</style><path class=\"st0\" d=\"M21 39c-9.9 0-18-8.1-18-18S11.1 3 21 3s18 8.1 18 18-8.1 18-18 18z\"/><path class=\"st1\" d=\"M21 5c8.8 0 16 7.2 16 16s-7.2 16-16 16S5 29.8 5 21 12.2 5 21 5m0-4C10 1 1 10 1 21s9 20 20 20 20-9 20-20S32 1 21 1z\"/><path class=\"st2\" d=\"M24.2 21l4.1 4.1c.9.9.9 2.4 0 3.3-.9.9-2.4.9-3.3 0l-4-4.2-4 4c-.9.9-2.3.9-3.2 0s-.9-2.3 0-3.2l4-4-4.1-4.1c-.9-.9-.9-2.4 0-3.3.9-.9 2.4-.9 3.3 0l4.1 4.1 4-4c.9-.9 2.3-.9 3.2 0 .9.9.9 2.3 0 3.2L24.2 21z\"/></svg>';\nvar CORRECT_GLYPH_DATA_URL = 'data:image/svg+xml,' + window.encodeURIComponent(CHECK_SVG);\nvar INCORRECT_GLYPH_DATA_URL = 'data:image/svg+xml,' + window.encodeURIComponent(INCORRECT_SVG);\nvar ACTIVE_QUESTION_CLASS = 'active-question-item';\nvar ACTIVE_FEEDBACK_CLASS = 'active-feedback-item';\nvar CORRECT_ANSWER_TEXT = localizationStrings.getPlayerString(playerStringNames.txtCorrectAnswer);\nvar YOUR_ANSWER_TEXT = localizationStrings.getPlayerString(playerStringNames.txtYourAnswer);\n\n/**\n * @memberof TSC\n * @class AnswersView\n * @classdesc Answers View\n */\nvar AnswersView = function AnswersView($container, question, showResults) {\n var _$window = $(window);\n var _$textInput = null;\n var getUserResponse = function getUserResponse() {\n switch (question.type) {\n case questionType.CHOICE:\n return $container.find('input[name=multiple-choice]:checked').val();\n case questionType.FILL_IN:\n return $container.find('input').val();\n case questionType.SHORT:\n return $container.find('textarea').val().replace(/^[ \\t]+|[ \\t]+$/, '');\n }\n };\n var displayResponseFillInResults = function displayResponseFillInResults() {\n if (!question.isGraded) {\n return;\n }\n var $correctImage = $('<img src=\\'' + CORRECT_GLYPH_DATA_URL + '\\' class=\\'image-fill-in-the-blank-feedback\\' alt=\\'' + localizationStrings.getPlayerString(playerStringNames.txtCorrectString) + '\\' />');\n var $incorrectImage = $('<img src=\\'' + INCORRECT_GLYPH_DATA_URL + '\\' class=\\'image-fill-in-the-blank-feedback\\' alt=\\'' + localizationStrings.getPlayerString(playerStringNames.txtIncorrectString) + '\\' />');\n if (question.isResponseCorrect) {\n $container.find('img.feedback-placeholder').replaceWith($correctImage);\n } else {\n $container.find('img.feedback-placeholder').replaceWith($incorrectImage);\n }\n };\n var getCorrectAnswerIndex = function getCorrectAnswerIndex() {\n var numberAnswers = question.answers.length;\n var correctAnswerBitshifted = question.correctAnswer;\n for (var i = 0; i < numberAnswers; i++) {\n /*eslint no-bitwise: \"off\"*/\n if (1 << i === Number(correctAnswerBitshifted)) {\n return i;\n }\n }\n return -1;\n };\n var displayChoiceResults = function displayChoiceResults() {\n var correctAnswerIndex;\n var $placeHolderImgEls;\n var $userResponseInputImageEl;\n var $correctResponseInputImageEl;\n var $correctImage;\n var $incorrectImage;\n var answerIndex = question.userResponse;\n var $labelEls = $container.find('label');\n $labelEls.removeClass(ACTIVE_QUESTION_CLASS);\n $labelEls.addClass(ACTIVE_FEEDBACK_CLASS);\n if (showResults && question.isGraded) {\n correctAnswerIndex = getCorrectAnswerIndex();\n $placeHolderImgEls = $container.find('label img');\n $userResponseInputImageEl = $container.find('label:eq(' + answerIndex + ') img');\n $correctResponseInputImageEl = $container.find('label:eq(' + correctAnswerIndex + ') img');\n $correctImage = $('<img src=\\'' + CORRECT_GLYPH_DATA_URL + '\\' class=\\'image-feedback\\' alt=\\'' + localizationStrings.getPlayerString(playerStringNames.txtCorrectString) + '\\' />');\n $incorrectImage = $('<img src=\\'' + INCORRECT_GLYPH_DATA_URL + '\\' class=\\'image-feedback\\' alt=\\'' + localizationStrings.getPlayerString(playerStringNames.txtIncorrectString) + '\\' />');\n $placeHolderImgEls.removeClass('feedback-placeholder');\n if (answerIndex === correctAnswerIndex) {\n $userResponseInputImageEl.replaceWith($correctImage);\n $correctImage.css('opacity', 0);\n $correctImage.animate({\n opacity: 1\n }, 200);\n } else {\n $correctResponseInputImageEl.replaceWith($correctImage);\n $correctImage.css('opacity', 0);\n $correctImage.animate({\n opacity: 1\n }, 200);\n $userResponseInputImageEl.replaceWith($incorrectImage);\n $incorrectImage.css('opacity', 0);\n $incorrectImage.animate({\n opacity: 1\n }, 200);\n }\n }\n $container.find('input').hide();\n if (answerIndex !== undefined) {\n $container.find('label:eq(' + answerIndex + ')').addClass('picked-quiz-item');\n }\n };\n var disableInput = function disableInput() {\n var $inputEls = null;\n switch (question.type) {\n case questionType.CHOICE:\n case questionType.FILL_IN:\n $inputEls = $container.find('input');\n break;\n case questionType.SHORT:\n $inputEls = $container.find('textarea');\n break;\n }\n if ($inputEls) {\n $inputEls.attr('disabled', true);\n }\n };\n var focusFirstInput = function focusFirstInput() {\n $container.find(\".\".concat(cssClasses.focusableAnswerInput)).focus();\n };\n var displayResults = function displayResults() {\n switch (question.type) {\n case questionType.CHOICE:\n displayChoiceResults();\n break;\n case questionType.FILL_IN:\n displayResponseFillInResults();\n break;\n }\n disableInput();\n };\n var getAnswersMarkup = function getAnswersMarkup(autoFocus) {\n if (deviceInfo.isIOS() || deviceInfo.isAndroid()) {\n autoFocus = false;\n }\n switch (question.type) {\n case questionType.CHOICE:\n return templateGenerator.generateChoiceAnswersMarkup(question.text, question.answers, question.userResponse);\n case questionType.FILL_IN:\n return templateGenerator.generateFillInTheBlankAnswerMarkup(question.text, question.userResponse, autoFocus);\n case questionType.SHORT:\n return templateGenerator.generateShortAnswerMarkup(question.text, question.userResponse, autoFocus);\n default:\n log.logException('Answers-view: unsupported question type (' + question.type + ')');\n }\n };\n var destroy = function destroy() {\n if (!showResults && deviceInfo.isIPhoneOrIPod() || deviceInfo.isAndroid()) {\n _$window.off('resize', viewHelper.scrollActiveElementIntoView);\n }\n if (_$textInput && (question.type === questionType.FILL_IN || question.type === questionType.SHORT) && (deviceInfo.isIPhoneOrIPod() || deviceInfo.isAndroid())) {\n _$textInput.off('focus keydown', viewHelper.scrollIntoView);\n }\n };\n var getTextResponseSuffix = function getTextResponseSuffix(userAnsweredQuestion) {\n if (question.isGraded) {\n if (!userAnsweredQuestion) {\n return localizationStrings.getPlayerString(playerStringNames.accessResultsLabelNoResponseGradedSuffix);\n } else if (question.isResponseCorrect) {\n return localizationStrings.getPlayerString(playerStringNames.accessResultsLabelCorrectSuffix);\n }\n return localizationStrings.getPlayerString(playerStringNames.accessResultsLabelIncorrectSuffix);\n } else if (!userAnsweredQuestion) {\n return localizationStrings.getPlayerString(playerStringNames.accessResultsLabelNoResponseSuffix);\n }\n return '';\n };\n var getUsersAnswer = function getUsersAnswer(userAnsweredQuestion) {\n if (question.type === questionType.CHOICE) {\n return userAnsweredQuestion && question.answers[question.userResponse].text;\n }\n return question.userResponse;\n };\n var getCorrectAnswerOrEmptyString = function getCorrectAnswerOrEmptyString() {\n if (question.isGraded && question.type === questionType.CHOICE) {\n return question.answers[getCorrectAnswerIndex()].text;\n }\n return '';\n };\n var getCorrectAnswerText = function getCorrectAnswerText() {\n var userAnsweredQuestion = !(question.userResponse === null || typeof question.userResponse === 'undefined');\n var responseSuffix = getTextResponseSuffix(userAnsweredQuestion);\n var usersAnswer = getUsersAnswer(userAnsweredQuestion);\n var correctAnswer = getCorrectAnswerOrEmptyString();\n var fullAnswerText = '';\n if (correctAnswer) {\n fullAnswerText = CORRECT_ANSWER_TEXT + correctAnswer;\n }\n if (userAnsweredQuestion) {\n fullAnswerText += correctAnswer ? ' - ' : '';\n fullAnswerText += YOUR_ANSWER_TEXT + usersAnswer;\n }\n fullAnswerText += fullAnswerText && responseSuffix ? ' - ' : '';\n fullAnswerText += responseSuffix;\n return fullAnswerText;\n };\n var setupAnswers = function setupAnswers() {\n if (showResults) {\n displayResults();\n } else {\n if (deviceInfo.isIPhoneOrIPod() || deviceInfo.isAndroid()) {\n _$window.on('resize', viewHelper.scrollActiveElementIntoView);\n }\n\n // remove hover css when device is touch screen\n if (question.type === questionType.CHOICE && deviceInfo.isTouchInterface()) {\n $container.find('.multiple-choice').removeClass(ACTIVE_QUESTION_CLASS);\n }\n _$textInput = $container.find('input[type=text], textarea');\n if (_$textInput && (question.type === questionType.FILL_IN || question.type === questionType.SHORT)) {\n if (deviceInfo.isIPhoneOrIPod() || deviceInfo.isAndroid()) {\n _$textInput.on('focus keydown', viewHelper.scrollIntoView);\n }\n }\n }\n };\n var isTextInputOrAreaFocused = function isTextInputOrAreaFocused() {\n return _$textInput && _$textInput.length > 0 && _$textInput.is(':focus');\n };\n var createView = function createView() {\n var answersMarkup = getAnswersMarkup();\n if (answersMarkup) {\n $container.html(answersMarkup);\n }\n $container.find('.multiple-choice > input').focus(function () {\n $(this).parent().addClass('highlight-background');\n }).blur(function () {\n $(this).parent().removeClass('highlight-background');\n });\n };\n createView();\n setupAnswers();\n focusFirstInput();\n return {\n getUserResponse: getUserResponse,\n destroy: destroy,\n getCorrectAnswerText: getCorrectAnswerText,\n isTextInputOrAreaFocused: isTextInputOrAreaFocused\n };\n};\nvar AnswersView$1 = {\n /**\n * Factory method that returns a new QuestionView object.\n * @function create\n * @memberof TSC.AnswersView\n * @static\n * @return new AnswersView instance\n */\n create: AnswersView\n};\n\nvar QUESTION_CORRECT_TEXT_CLASS = '.question-correct-text';\nvar QUESTION_INCORRECT_TEXT_CLASS = '.question-incorrect-text';\n\n/**\n * @memberof TSC\n * @class QuestionView\n * @classdesc Question View\n * @params {Object} $questionTextContainer - jquery wrapper for question text container element\n * @params {Object} $questionGradedStatusContainer - jquery wrapper for question graded status container element\n * @params {Object} $feedbackContainer - jquery wrapper for feedback text container element\n * @params {Object} $answersContainer - jquery wrapper for answers container element\n * @params {TSC.Question} question - Question model for this view.\n * @params {Boolean} showResults - show results for question.\n */\nvar QuestionView = function QuestionView($questionTextContainer, $questionGradedStatusContainer, $feedbackContainer, $answersContainer, question, showResults) {\n var _answersView;\n var _feedbackContextMarkup = templateGenerator.generateQuestionFeedbackContextMarkup(localizationStrings.getPlayerString(playerStringNames.accessQuestionFeedbackContext));\n var createView = function createView() {\n _answersView = AnswersView$1.create($answersContainer, question, showResults);\n $feedbackContainer.addClass('hide-element');\n var correctAnswerText = showResults ? _answersView.getCorrectAnswerText() : '';\n var questionTextMarkup = templateGenerator.generateQuestionTextMarkup(question.text, correctAnswerText);\n $questionTextContainer.html(questionTextMarkup);\n var questionGradedStatusMarkup = templateGenerator.generateQuestionGradedStatusMarkup();\n $questionGradedStatusContainer.html(questionGradedStatusMarkup);\n };\n var showFeedbackTextIfAvailable = function showFeedbackTextIfAvailable() {\n var feedbackMarkup = null;\n question.feedback.forEach(function (feedback) {\n if (question.isResponseCorrect && feedback.reason === 'correct') {\n feedbackMarkup = feedback.markupText;\n } else if (!question.isResponseCorrect && feedback.reason === 'incorrect') {\n feedbackMarkup = feedback.markupText;\n }\n });\n if (feedbackMarkup) {\n $feedbackContainer.html(_feedbackContextMarkup + feedbackMarkup);\n $feedbackContainer.removeClass('hide-element');\n }\n };\n var setupView = function setupView() {\n if (showResults && question.isGraded) {\n showFeedbackTextIfAvailable();\n if (question.isResponseCorrect) {\n $questionGradedStatusContainer.find(QUESTION_CORRECT_TEXT_CLASS).removeClass('hide-element');\n } else {\n $questionGradedStatusContainer.find(QUESTION_INCORRECT_TEXT_CLASS).removeClass('hide-element');\n }\n }\n };\n createView();\n setupView();\n return {\n isTextInputOrAreaFocused: _answersView.isTextInputOrAreaFocused,\n destroy: _answersView.destroy,\n getUserResponse: _answersView.getUserResponse\n };\n};\nvar QuestionView$1 = {\n /**\n * Factory method that returns a new QuestionView object.\n * @function create\n * @memberof TSC.QuestionView\n * @static\n * @return new QuestionView instance\n */\n create: QuestionView\n};\n\nvar SCREEN_READER_ALERT_REMOVAL_TIMEOUT = 1000;\nvar INIT_QUESTION_SET_TIMEOUT = 10;\nvar PEEK_AT_VIDEO_SHORT_CUT_KEYCODE = 72; // h key\nvar CONTAINER_CLASS = '.question-set-container';\nvar QUESTION_SET_CONTENT_CLASS = '.question-set-content';\nvar HIDE_CONTROL_CLASS = '.hide-quiz-button';\nvar SHOW_CONTROL_CLASS = '.show-quiz-button';\nvar PREV_CONTROL_CLASS = '.previous-button';\nvar NEXT_CONTROL_CLASS = '.next-button';\nvar SUBMIT_CONTROL_CLASS = '.submit-button';\nvar CONTINUE_CONTROL_CLASS = '.continue-button';\nvar QUESTION_COUNT_CLASS = '.question-count';\nvar QUESTION_GRADED_STATUS_CLASS = '.question-graded-status';\nvar QUESTION_CLASS = '.question-text';\nvar ANSWERS_CLASS = '.question-answers';\nvar FEEDBACK_CLASS = '.question-feedback';\nvar MINIMIZED_VIEW_CLASS = '.minimized-question-set-container';\n\n/**\n * @memberof TSC\n * @class QuestionSetView\n * @param {Object} $container -- Container to add question set view.\n * @param {TSC.QuestionSet} questionSet -- Question Set model for view.\n * @param {Boolean} displayOverlay -- Display overlay.\n * @param {Boolean} mediaIsImage -- Media is an image.\n * @param {Boolean} showQuestionSetResults -- Show user results for question set.\n * @classdesc View for Question sets.\n */\nvar QuestionSetView = function QuestionSetView($container, questionSet, displayOverlay, mediaIsImage, showQuestionSetResults, quizTime) {\n var _$document = windowWrapper.getDocument(true);\n var _currentQuestionIndex = 0;\n var _$container = $container;\n var _startTimeForQuestion = 0;\n var _endTimeForQuestion = 0;\n var _currentQuestionView = null;\n var _initTimeoutId = null;\n var _alertScreenReaderTimeoutId = null;\n var _$questionSetContainer = null;\n var _$questionSetContent = null;\n var _$questionTextContainer = null;\n var _$answersContainer = null;\n var _$feedbackContainer = null;\n var _$questionCountContainer = null;\n var _$questionGradedStatusContainer = null;\n var _$hideControl = null;\n var _$showControl = null;\n var _$prevControl = null;\n var _$nextControl = null;\n var _$continueControl = null;\n var _$submitControl = null;\n var _$minimizedContainer = null;\n var _minimizedByKeyboardShortcut = false;\n var _superView = BubbleView$1.create(CONTAINER_CLASS);\n var _resolveInitPromise;\n var initPromise = new Promise$1(function (resolve) {\n _resolveInitPromise = resolve;\n });\n var alertScreenReader = function alertScreenReader(message) {\n var screenReaderAlertMarkup = templateGenerator.generateScreenReaderAlertMarkup(message);\n var $screenReaderAlert = $(screenReaderAlertMarkup);\n _$container.append($screenReaderAlert);\n _alertScreenReaderTimeoutId = setTimeout(function () {\n $screenReaderAlert.remove();\n }, SCREEN_READER_ALERT_REMOVAL_TIMEOUT);\n };\n var onHideQuizClick = function onHideQuizClick() {\n minimizeView();\n };\n var onShowQuizHandler = function onShowQuizHandler() {\n maximizeView();\n };\n var onKeyDownHandler = function onKeyDownHandler(e) {\n if (e && e.keyCode === PEEK_AT_VIDEO_SHORT_CUT_KEYCODE && !_currentQuestionView.isTextInputOrAreaFocused() && !_superView.viewIsMinimized) {\n _minimizedByKeyboardShortcut = true;\n _$document.on('keyup', onKeyUpHandler);\n minimizeView();\n }\n };\n var onKeyUpHandler = function onKeyUpHandler() {\n _minimizedByKeyboardShortcut = false;\n _$document.off('keyup', onKeyUpHandler);\n maximizeView();\n };\n var minimizeView = function minimizeView() {\n if (!_superView.viewIsMinimized) {\n $container.trigger(events.Quizzing.MinimizeUI);\n _$questionSetContent.addClass(cssClasses.hideElement);\n if (!_minimizedByKeyboardShortcut) {\n _$minimizedContainer.removeClass(cssClasses.hideElement);\n }\n viewHelper.removeFocusTrap();\n alertScreenReader(localizationStrings.getPlayerString(playerStringNames.accessQuizHidden));\n _superView.minimizeView();\n }\n };\n var maximizeView = function maximizeView() {\n if (_superView.viewIsMinimized) {\n $container.trigger(events.Quizzing.MaximizeUI);\n _$questionSetContent.removeClass(cssClasses.hideElement);\n _$minimizedContainer.addClass(cssClasses.hideElement);\n _superView.maximizeView();\n alertScreenReader(localizationStrings.getPlayerString(playerStringNames.accessQuizShown));\n $container.focus();\n viewHelper.trapFocus(_$questionSetContent);\n }\n };\n var isOnFirstQuestion = function isOnFirstQuestion() {\n return _currentQuestionIndex === 0;\n };\n var isOnLastQuestion = function isOnLastQuestion() {\n return _currentQuestionIndex === questionSet.questions.length - 1;\n };\n var showView = function showView() {\n _$questionSetContainer.removeClass('minimized');\n _superView.showView();\n };\n var hideView = function hideView() {\n _$questionSetContainer.addClass('minimized');\n _superView.hideView();\n };\n var startTrackingQuestionTime = function startTrackingQuestionTime() {\n _startTimeForQuestion = new Date().getTime();\n };\n var recordDurationOnQuestion = function recordDurationOnQuestion() {\n _endTimeForQuestion = new Date().getTime();\n var timeBetween = _endTimeForQuestion - _startTimeForQuestion;\n questionSet.questions[_currentQuestionIndex].attemptDuration += timeBetween;\n };\n var storeUserResponse = function storeUserResponse() {\n var userResponse = _currentQuestionView.getUserResponse();\n if (userResponse !== undefined && userResponse !== '') {\n questionSet.questions[_currentQuestionIndex].userResponse = userResponse;\n }\n };\n var saveQuestionUserInput = function saveQuestionUserInput() {\n if (showQuestionSetResults) {\n return;\n }\n storeUserResponse();\n recordDurationOnQuestion();\n };\n var lockResponses = function lockResponses() {\n if (questionSet.usesRationale) {\n questionSet.questions[_currentQuestionIndex].responseLocked = true;\n } else {\n questionSet.questions.forEach(function (question) {\n question.responseLocked = true;\n });\n }\n };\n var getFeedbackInfoForCurrentQuestion = function getFeedbackInfoForCurrentQuestion() {\n var actionType = rationaleActionType.CONTINUE;\n var feedback;\n if (questionSet.questions[_currentQuestionIndex].isGraded) {\n var feedbackReason = questionSet.questions[_currentQuestionIndex].isResponseCorrect ? 'correct' : 'incorrect';\n feedback = questionSet.questions[_currentQuestionIndex].getFeedbackForReason(feedbackReason);\n if (feedback !== null) {\n if (feedback.location !== undefined) {\n actionType = rationaleActionType.LOCATION;\n } else if (feedback.jumpToTime !== undefined) {\n actionType = rationaleActionType.JUMP_TO_TIME;\n }\n }\n }\n return {\n feedback: feedback,\n actionType: actionType\n };\n };\n var executeContinueAction = function executeContinueAction() {\n if (isOnLastQuestion()) {\n $container.trigger(events.Quizzing.CloseQuestionSetView);\n } else {\n displayNextQuestion();\n }\n };\n var executeRationaleAction = function executeRationaleAction() {\n var feedbackInfo;\n if (questionSet.questions[_currentQuestionIndex].feedbackActionExecuted) {\n feedbackInfo = {\n actionType: rationaleActionType.CONTINUE\n };\n } else {\n feedbackInfo = getFeedbackInfoForCurrentQuestion();\n questionSet.questions[_currentQuestionIndex].feedbackActionExecuted = true;\n }\n switch (feedbackInfo.actionType) {\n case rationaleActionType.CONTINUE:\n executeContinueAction();\n break;\n case rationaleActionType.LOCATION:\n $container.trigger(events.Quizzing.RationaleActionLocation, {\n location: feedbackInfo.feedback.location\n });\n executeContinueAction();\n break;\n case rationaleActionType.JUMP_TO_TIME:\n if (questionSet.startTime !== feedbackInfo.feedback.jumpToTime) {\n $container.trigger(events.Quizzing.RationaleActionJumpToTime, {\n jumpToTime: feedbackInfo.feedback.jumpToTime\n });\n } else {\n executeContinueAction();\n }\n break;\n }\n };\n var displayNextQuestion = function displayNextQuestion() {\n saveQuestionUserInput();\n _currentQuestionIndex++;\n displayQuestion();\n };\n var onPreviousQuestion = function onPreviousQuestion(e) {\n e.preventDefault();\n saveQuestionUserInput();\n _currentQuestionIndex--;\n displayQuestion();\n };\n var onNextQuestion = function onNextQuestion(e) {\n e.preventDefault();\n displayNextQuestion();\n };\n var onContinue = function onContinue(e) {\n e.preventDefault();\n if (questionSet.usesRationale && !showQuestionSetResults) {\n executeRationaleAction();\n } else {\n $container.trigger(events.Quizzing.CloseQuestionSetView);\n }\n };\n var onSubmit = function onSubmit(e) {\n e.preventDefault();\n _$submitControl.attr('disabled', 'disabled');\n saveQuestionUserInput();\n lockResponses();\n $container.trigger(events.Quizzing.SubmitQuestionSet);\n };\n\n //This is a fix for iPhones whipping users back to the top of the page if there is a focused input.\n var onIphoneTouchstart = function onIphoneTouchstart() {\n _$questionSetContainer.find('.fill-in-the-blank-input').blur();\n };\n var getControlsConfig = function getControlsConfig() {\n var currentQuestion = questionSet.questions[_currentQuestionIndex];\n var onFirstQuestion = isOnFirstQuestion();\n var onLastQuestion = isOnLastQuestion();\n var hasOneQuestion = onFirstQuestion && onLastQuestion;\n var controlsConfig = {\n showSubmitNav: false,\n showContinueNav: false,\n showPrevNav: false,\n showNextNav: false,\n prevDisabled: false,\n nextDisabled: false\n };\n if (questionSet.usesRationale && !showQuestionSetResults) {\n if (currentQuestion.responseLocked) {\n if (currentQuestion.feedbackActionExecuted && !onLastQuestion) {\n controlsConfig.showNextNav = true;\n } else {\n controlsConfig.showContinueNav = true;\n }\n } else {\n controlsConfig.showSubmitNav = true;\n }\n controlsConfig.showPrevNav = !hasOneQuestion && !onFirstQuestion;\n } else {\n controlsConfig.showSubmitNav = !showQuestionSetResults && onLastQuestion;\n controlsConfig.showContinueNav = showQuestionSetResults && onLastQuestion && !mediaIsImage;\n controlsConfig.showPrevNav = !hasOneQuestion;\n controlsConfig.showNextNav = !hasOneQuestion && !controlsConfig.showSubmitNav && !controlsConfig.showContinueNav;\n controlsConfig.prevDisabled = _currentQuestionIndex === 0;\n controlsConfig.nextDisabled = onLastQuestion;\n }\n return controlsConfig;\n };\n var updateControls = function updateControls() {\n var controlsConfig = getControlsConfig();\n _$prevControl.css('display', 'none');\n _$nextControl.css('display', 'none');\n _$submitControl.css('display', 'none');\n _$continueControl.css('display', 'none');\n if (controlsConfig.showPrevNav) {\n _$prevControl.css('display', 'inline');\n if (controlsConfig.prevDisabled) {\n _$prevControl.attr('disabled', 'disabled');\n } else {\n _$prevControl.removeAttr('disabled');\n }\n }\n if (controlsConfig.showNextNav) {\n _$nextControl.css('display', 'inline');\n if (controlsConfig.nextDisabled) {\n _$nextControl.attr('disabled', 'disabled');\n } else {\n _$nextControl.removeAttr('disabled');\n }\n }\n if (controlsConfig.showSubmitNav) {\n _$submitControl.removeAttr('disabled');\n _$submitControl.css('display', 'inline');\n }\n if (controlsConfig.showContinueNav) {\n _$continueControl.removeAttr('disabled');\n _$continueControl.css('display', 'inline');\n }\n };\n var displayQuestion = function displayQuestion() {\n var showResults = showQuestionSetResults;\n if (questionSet.usesRationale && questionSet.questions[_currentQuestionIndex].responseLocked) {\n showResults = true;\n }\n if (_currentQuestionView !== null) {\n _currentQuestionView.destroy();\n }\n _currentQuestionView = QuestionView$1.create(_$questionTextContainer, _$questionGradedStatusContainer, _$feedbackContainer, _$answersContainer, questionSet.questions[_currentQuestionIndex], showResults);\n updateQuestionCount();\n updateControls();\n startTrackingQuestionTime();\n viewHelper.trapFocus(_$questionSetContent);\n };\n var updateQuestionCount = function updateQuestionCount() {\n var questionCountMarkup = templateGenerator.generateQuestionSetQuestionCountMarkup(_currentQuestionIndex + 1, questionSet.questions.length);\n _$questionCountContainer.html(questionCountMarkup);\n };\n var showFeedbackForCurrentQuestion = function showFeedbackForCurrentQuestion() {\n displayQuestion();\n updateControls();\n };\n var createView = function createView() {\n var questionSetViewMarkup = templateGenerator.generateQuestionSetMarkup(quizTime);\n if (displayOverlay) {\n questionSetViewMarkup += _superView.getOverlayMarkup();\n }\n _$container.append(questionSetViewMarkup);\n _$questionSetContainer = _$container.find(CONTAINER_CLASS);\n _$questionSetContent = _$container.find(QUESTION_SET_CONTENT_CLASS);\n _$questionTextContainer = _$container.find(QUESTION_CLASS);\n _$answersContainer = _$container.find(ANSWERS_CLASS);\n _$feedbackContainer = _$container.find(FEEDBACK_CLASS);\n _$questionCountContainer = _$container.find(QUESTION_COUNT_CLASS);\n _$questionGradedStatusContainer = _$container.find(QUESTION_GRADED_STATUS_CLASS);\n _$hideControl = _$container.find(HIDE_CONTROL_CLASS);\n _$showControl = _$container.find(SHOW_CONTROL_CLASS);\n _$prevControl = _$container.find(PREV_CONTROL_CLASS);\n _$nextControl = _$container.find(NEXT_CONTROL_CLASS);\n _$continueControl = _$container.find(CONTINUE_CONTROL_CLASS);\n _$submitControl = _$container.find(SUBMIT_CONTROL_CLASS);\n _$minimizedContainer = _$container.find(MINIMIZED_VIEW_CLASS);\n };\n var removeEvents = function removeEvents() {\n _$hideControl.off('click', onHideQuizClick);\n _$showControl.off('click', onShowQuizHandler);\n _$prevControl.off('click', onPreviousQuestion);\n _$nextControl.off('click', onNextQuestion);\n _$submitControl.off('click', onSubmit);\n _$continueControl.off('click', onContinue);\n $container.off('keydown', onKeyDownHandler);\n viewHelper.removeFocusTrap();\n if (deviceInfo.isIPhoneOrIPod()) {\n _$questionSetContainer.off('touchstart', onIphoneTouchstart);\n }\n };\n var setupEvents = function setupEvents() {\n _$hideControl.on('click', onHideQuizClick);\n _$showControl.on('click', onShowQuizHandler);\n _$prevControl.on('click', onPreviousQuestion);\n _$nextControl.on('click', onNextQuestion);\n _$submitControl.on('click', onSubmit);\n _$continueControl.on('click', onContinue);\n $container.on('keydown', onKeyDownHandler);\n if (deviceInfo.isIPhoneOrIPod()) {\n _$questionSetContainer.on('touchstart', onIphoneTouchstart);\n }\n };\n var checkQuestionSetProgress = function checkQuestionSetProgress() {\n if (showQuestionSetResults) {\n return;\n }\n for (var i = 0; i < questionSet.questions.length; i++) {\n if (!questionSet.questions[i].responseLocked) {\n _currentQuestionIndex = i;\n break;\n }\n }\n };\n var removeView = function removeView(completeCallback, destroyOverlay) {\n _initTimeoutId && clearTimeout(_initTimeoutId);\n _alertScreenReaderTimeoutId && clearTimeout(_alertScreenReaderTimeoutId);\n removeEvents();\n _currentQuestionView.destroy();\n _superView.removeView(completeCallback, destroyOverlay);\n };\n createView();\n checkQuestionSetProgress();\n setupEvents();\n\n // need to delay displaying first question for NVDA screen reader to pick up text.\n _initTimeoutId = setTimeout(function () {\n displayQuestion();\n _resolveInitPromise();\n }, INIT_QUESTION_SET_TIMEOUT);\n return Object.defineProperties({\n showView: showView,\n hideView: hideView,\n removeView: removeView,\n showFeedbackForCurrentQuestion: showFeedbackForCurrentQuestion\n }, {\n viewInitializedPromise: {\n get: function get() {\n return initPromise;\n }\n }\n });\n};\nvar QuestionSetView$1 = {\n create: QuestionSetView\n};\n\nvar _containerId$2 = '.start-question-set-confirmation-container';\nvar _superView$2 = BubbleView$1.create(_containerId$2);\nvar _reviewControlId = '.review-button';\nvar _confirmControlId = '.confirm-button';\nvar questionSetConfirmationView = {\n getViewMarkup: function getViewMarkup(reviewText, confirmationText) {\n return templateGenerator.generateQuestionSetConfirmationMarkup(reviewText, confirmationText) + _superView$2.getOverlayMarkup();\n },\n getReviewControlRef: function getReviewControlRef() {\n return _reviewControlId;\n },\n getConfirmControlRef: function getConfirmControlRef() {\n return _confirmControlId;\n },\n hideView: function hideView() {\n _superView$2.hideView();\n },\n showView: function showView() {\n _superView$2.showView(true);\n var $confirmControl = $(_containerId$2).find(_confirmControlId);\n $confirmControl.focus();\n highlightDisabler.disableHighlights($confirmControl);\n },\n removeView: _superView$2.removeView,\n updateViewPosition: _superView$2.updateViewPosition,\n setBottomOffset: _superView$2.setBottomOffset,\n pointAt: _superView$2.pointAt\n};\n\nvar setItem = function setItem(key, value) {\n try {\n window.sessionStorage.setItem(key, value);\n } catch (e) {\n // We want this to fail silently\n }\n};\nvar getItem = function getItem(key) {\n try {\n return window.sessionStorage.getItem(key);\n } catch (e) {\n return null;\n }\n};\nvar sessionStorageWrapper = {\n /**\n * Wraps native session storage setItem with a try/catch.\n * @function setItem\n * @memberof TSC.sessionStorageWrapper\n * @static\n * @param {String} key - the key of the value to set in session storage\n * @param {String} value - the value to set in session storage\n */\n setItem: setItem,\n /**\n * Wraps native session storage getItem.\n * @function getItem\n * @memberof TSC.sessionStorageWrapper\n * @static\n * @param {String} key - the key of the value to retrieve in session storage\n * @returns {String} value from session storage (could be null or undefined)\n */\n getItem: getItem\n};\n\nvar _$window = $(window);\nvar FIRST_NAME_CLASS = 'first_name';\nvar LAST_NAME_CLASS = 'last_name';\nvar rightParenRegex = /\\)/gi;\nvar leftParenRegex = /\\(/gi;\n\n/**\n * @memberof TSC\n * @class QuizSetupView\n * @classdesc Quiz Setup View\n * @param {JQuery} $rootContainer - Smart player container element.\n */\nvar QuizSetupView = function QuizSetupView($rootContainer) {\n var _$rootContainer = $rootContainer;\n var _$quizSetupView = null;\n var _$firstNameInput = null;\n var _$lastNameInput = null;\n var _$emailInput = null;\n var _$beginButton = null;\n var _$skipButton = null;\n var createView = function createView() {\n var quizSetupMarkup = templateGenerator.generateQuizSetupMarkup();\n _$quizSetupView = $($.parseHTML(quizSetupMarkup));\n _$firstNameInput = _$quizSetupView.find('.' + FIRST_NAME_CLASS);\n _$lastNameInput = _$quizSetupView.find('.' + LAST_NAME_CLASS);\n _$emailInput = _$quizSetupView.find('.email_address');\n _$beginButton = _$quizSetupView.find('.tsc_begin_button');\n _$skipButton = _$quizSetupView.find('.skip_control');\n _$rootContainer.trigger(events.Modals.Open);\n };\n var getKeys = function getKeys() {\n var hostname = windowWrapper.getLocation().hostname;\n return {\n first: hostname + '-first',\n last: hostname + '-last',\n email: hostname + '-email'\n };\n };\n var getUserInfo = function getUserInfo() {\n var keys = getKeys();\n var firstName = playerConfiguration.userInfo && playerConfiguration.userInfo.firstName;\n var lastName = playerConfiguration.userInfo && playerConfiguration.userInfo.lastName;\n var email = playerConfiguration.userInfo && playerConfiguration.userInfo.email;\n if (playerConfiguration.rememberUserInfo) {\n firstName = firstName || sessionStorageWrapper.getItem(keys.first);\n lastName = lastName || sessionStorageWrapper.getItem(keys.last);\n email = email || sessionStorageWrapper.getItem(keys.email);\n }\n return {\n firstName: firstName,\n lastName: lastName,\n email: email\n };\n };\n var cacheSelfIdentity = function cacheSelfIdentity(eventData) {\n var keys = getKeys();\n sessionStorageWrapper.setItem(keys.first, eventData.firstName);\n sessionStorageWrapper.setItem(keys.last, eventData.lastName);\n sessionStorageWrapper.setItem(keys.email, eventData.email);\n };\n var setupInitialValues = function setupInitialValues() {\n var userInfo = getUserInfo();\n _$firstNameInput.val(userInfo.firstName);\n _$lastNameInput.val(userInfo.lastName);\n _$emailInput.val(userInfo.email);\n if (userInfo.firstName && userInfo.lastName && userInfo.email) {\n validateInput();\n }\n };\n var addPosterImageToBackground = function addPosterImageToBackground(posterSrc) {\n posterSrc = posterSrc.replace(rightParenRegex, '\\\\\\)');\n posterSrc = posterSrc.replace(leftParenRegex, '\\\\\\(');\n var url = 'url(' + posterSrc + ')';\n _$quizSetupView.css('background-image', url);\n };\n var validateInput = function validateInput() {\n var firstName = _$firstNameInput.val().replace(/ /g, '');\n var lastName = _$lastNameInput.val().replace(/ /g, '');\n var email = _$emailInput.val().replace(/ /g, '');\n if (firstName !== '' && lastName !== '' && email !== '' && textSanitizer.isValidEmail(email)) {\n _$beginButton.removeAttr('disabled');\n viewHelper.trapFocus(_$quizSetupView);\n } else {\n _$beginButton.attr('disabled', 'disabled');\n }\n };\n var destroy = function destroy() {\n if (deviceInfo.isIPhoneOrIPod() || deviceInfo.isAndroid()) {\n _$window.off('resize', viewHelper.scrollActiveElementIntoView);\n _$firstNameInput.off('focus keydown', viewHelper.scrollIntoView);\n _$lastNameInput.off('focus keydown', viewHelper.scrollIntoView);\n _$emailInput.off('focus keydown', viewHelper.scrollIntoView);\n }\n _$quizSetupView.css('background-image', '');\n _$firstNameInput.off('keyup', validateInput);\n _$firstNameInput.off('change', validateInput);\n _$lastNameInput.off('keyup', validateInput);\n _$lastNameInput.off('change', validateInput);\n _$emailInput.off('keyup', validateInput);\n _$emailInput.off('change', validateInput);\n _$beginButton.off('click', beginQuiz);\n _$skipButton.off('click', skipQuiz);\n _$rootContainer.trigger(events.Modals.Closed);\n viewHelper.removeFocusTrap();\n };\n var hideSkipButton = function hideSkipButton() {\n _$skipButton.attr('disabled', 'disabled');\n _$skipButton.hide();\n viewHelper.trapFocus(_$quizSetupView);\n };\n var beginQuiz = function beginQuiz(event) {\n event.preventDefault();\n var eventData = {\n firstName: _$firstNameInput.val().replace(/ /g, ''),\n lastName: _$lastNameInput.val().replace(/ /g, ''),\n email: _$emailInput.val().replace(/ /g, '')\n };\n if (playerConfiguration.rememberUserInfo) {\n cacheSelfIdentity(eventData);\n }\n _$rootContainer.trigger(events.Quizzing.BeginClicked, eventData);\n };\n var skipQuiz = function skipQuiz(event) {\n event.preventDefault();\n _$rootContainer.trigger(events.Quizzing.SkipClicked, {});\n };\n var bindEvents = function bindEvents() {\n if (deviceInfo.isIPhoneOrIPod() || deviceInfo.isAndroid()) {\n _$window.on('resize', viewHelper.scrollActiveElementIntoView);\n _$firstNameInput.on('focus keydown', viewHelper.scrollIntoView);\n _$lastNameInput.on('focus keydown', viewHelper.scrollIntoView);\n _$emailInput.on('focus keydown', viewHelper.scrollIntoView);\n }\n _$firstNameInput.on('keyup', validateInput);\n _$firstNameInput.on('change', validateInput);\n _$lastNameInput.on('keyup', validateInput);\n _$lastNameInput.on('change', validateInput);\n _$emailInput.on('keyup', validateInput);\n _$emailInput.on('change', validateInput);\n _$beginButton.on('click', beginQuiz);\n _$skipButton.on('click', skipQuiz);\n _$rootContainer.append(_$quizSetupView);\n viewHelper.trapFocus(_$quizSetupView);\n if (viewHelper.elementOrChildHasFocus($rootContainer)) {\n _$firstNameInput.focus();\n }\n };\n createView();\n setupInitialValues();\n bindEvents();\n if (playerConfiguration.getPosterImageSrc()) {\n addPosterImageToBackground(playerConfiguration.getPosterImageSrc());\n }\n return Object.defineProperties({\n hideSkipButton: hideSkipButton,\n destroy: destroy\n }, {\n $view: {\n get: function get() {\n return _$quizSetupView;\n }\n }\n });\n};\nvar QuizSetupView$1 = {\n /**\n * Factory method that returns a new QuizSetupView object.\n * @function create\n * @memberof TSC.QuizSetupView\n * @param {JQuery} $rootContainer - Smart player container element.\n * @static\n * @return QuizSetupView instance\n */\n create: QuizSetupView\n};\n\nvar _superView$1 = BubbleView$1.create('.review-confirmation-container');\nvar _containerId$1 = '.controls-container';\nvar _continueControlId = '.continue-video-button';\nvar _reviewAnswersControlId = '.review-answers-button';\nvar reviewAnswersConfirmationView = {\n getViewMarkup: function getViewMarkup(numberCorrectText, percentCorrectText, numberInCorrectText, percentInCorrectText, continueText, reviewText) {\n return templateGenerator.generateQuestionSetReviewConfirmationMarkup(numberCorrectText, percentCorrectText, numberInCorrectText, percentInCorrectText, continueText, reviewText);\n },\n getContinueControlRef: function getContinueControlRef() {\n return _continueControlId;\n },\n getReviewControlRef: function getReviewControlRef() {\n return _reviewAnswersControlId;\n },\n hideView: function hideView() {\n _superView$1.hideView();\n },\n showView: function showView() {\n _superView$1.showView(true);\n var $reviewControl = $(_containerId$1).find(_reviewAnswersControlId);\n $reviewControl.focus();\n highlightDisabler.disableHighlights($reviewControl);\n },\n removeView: _superView$1.removeView,\n updateViewPosition: _superView$1.updateViewPosition,\n setBottomOffset: _superView$1.setBottomOffset,\n pointAt: _superView$1.pointAt\n};\n\nvar DEFAULT_RETRY_LIMIT = 2;\nvar DEFAULT_BACKOFF = 2000;\nvar DEFAULT_MAX_DELAY_BETWEEN_RETRIES = 20000;\nvar BackoffStrategy = function BackoffStrategy(retryLimit, backoffTime, maxDelay) {\n if (typeof retryLimit === 'undefined') {\n retryLimit = DEFAULT_RETRY_LIMIT;\n }\n if (typeof backoffTime === 'undefined') {\n backoffTime = DEFAULT_BACKOFF;\n }\n if (typeof maxDelay === 'undefined') {\n maxDelay = DEFAULT_MAX_DELAY_BETWEEN_RETRIES;\n }\n var create = function create() {\n var tries = 0;\n var backoff = function backoff() {\n tries++;\n if (tries > retryLimit) {\n return Promise$1.reject();\n }\n var delay = Math.min(backoffTime * tries, maxDelay);\n return new Promise$1(function (resolve) {\n window.setTimeout(resolve, delay);\n });\n };\n return {\n backoff: backoff\n };\n };\n return {\n create: create\n };\n};\nvar BackoffStrategyWithUnlimitedRetries = function BackoffStrategyWithUnlimitedRetries(backoffTime, maxDelay) {\n if (typeof backoffTime === 'undefined') {\n backoffTime = DEFAULT_BACKOFF;\n }\n if (typeof maxDelay === 'undefined') {\n maxDelay = DEFAULT_MAX_DELAY_BETWEEN_RETRIES;\n }\n var create = function create() {\n var tries = 0;\n var backoff = function backoff() {\n tries++;\n var delay = Math.min(backoffTime * tries, maxDelay);\n return new Promise$1(function (resolve) {\n window.setTimeout(resolve, delay);\n });\n };\n return {\n backoff: backoff\n };\n };\n return {\n create: create\n };\n};\nvar BackoffStrategyFactory = {\n create: BackoffStrategy,\n createWithUnlimitedRetries: BackoffStrategyWithUnlimitedRetries\n};\n\nvar statusCodes = Object.freeze({\n Unauthorized: 401,\n UnprocessableEntity: 422\n});\n\n$.support.cors = true;\nvar REQUEST_TIMEOUT = 10000;\nvar NO_RETRY_STATUS_CODES = [statusCodes.UnprocessableEntity];\nvar HttpService = function HttpService(retryStrategyFactory, logFailures) {\n retryStrategyFactory = retryStrategyFactory || BackoffStrategyFactory.create();\n if (typeof logFailures === 'undefined') {\n logFailures = true;\n }\n var _eventHandlers = {};\n var _pendingRequestPromises = {};\n var removePendingRequestPromise = function removePendingRequestPromise(requestPromise) {\n if (requestPromise.UUID) {\n delete _pendingRequestPromises[requestPromise.UUID];\n }\n };\n var addRequestToPendingList = function addRequestToPendingList(requestPromise) {\n var requestUUID = uuidGenerator$1.getUUID();\n requestPromise.UUID = requestUUID;\n _pendingRequestPromises[requestUUID] = requestPromise;\n };\n var get = function get(url) {\n var request = {\n url: url,\n type: 'GET',\n contentType: 'application/json',\n crossDomain: true,\n timeout: REQUEST_TIMEOUT\n };\n var requestPromise = $.ajax(request);\n addRequestToPendingList(requestPromise);\n return Promise$1.resolve(requestPromise).then(function (data) {\n removePendingRequestPromise(requestPromise);\n return data;\n })[\"catch\"](function (response) {\n removePendingRequestPromise(requestPromise);\n if (logFailures && response && response.statusText !== 'timeout') {\n var errorString = '';\n try {\n errorString = 'Error: ' + window.JSON.stringify(response, null, 2) + ' Url: ' + url;\n } catch (error) {\n errorString = '(response failed conversion into a JSON string.)';\n }\n log.logException(errorString);\n return Promise$1.reject(errorString);\n }\n });\n };\n var sendFormDataPost = function sendFormDataPost(url, data) {\n return sendRequest(url, $.param(data), 'application/x-www-form-urlencoded; charset=UTF-8', 'POST');\n };\n var canRetryFromStatusCode = function canRetryFromStatusCode(response) {\n if (!response) {\n return true;\n }\n for (var i = 0; i < NO_RETRY_STATUS_CODES.length; i++) {\n if (response.status === NO_RETRY_STATUS_CODES[i]) {\n return false;\n }\n }\n return true;\n };\n var sendRequest = function sendRequest(url, data, contentType, httpVerb) {\n var retryStrategy = retryStrategyFactory.create();\n var request = {\n url: url,\n type: httpVerb,\n data: data,\n contentType: contentType,\n crossDomain: true,\n timeout: REQUEST_TIMEOUT\n };\n var send = function send(retries) {\n return new Promise$1(function (resolve, reject) {\n var requestPromise = $.ajax(request);\n addRequestToPendingList(requestPromise);\n Promise$1.resolve(requestPromise).then(function (responseData) {\n removePendingRequestPromise(requestPromise);\n resolve(responseData);\n })[\"catch\"](function (response) {\n removePendingRequestPromise(requestPromise);\n if (logFailures && response && response.statusText !== 'timeout') {\n var errorString = '';\n try {\n errorString = 'Error: ' + window.JSON.stringify(response, null, 2) + ' Url: ' + url + ' Data: ' + window.JSON.stringify(data, null, 2);\n } catch (error) {\n errorString = '(response failed conversion into a JSON string.)';\n }\n log.logException(errorString);\n }\n if (canRetryFromStatusCode(response)) {\n retryStrategy.backoff().then(function () {\n retries++;\n if (_eventHandlers[events.Network.Retrying]) {\n _eventHandlers[events.Network.Retrying].forEach(function (eventCallback) {\n eventCallback(retries);\n });\n }\n send(retries).then(resolve)[\"catch\"](reject);\n })[\"catch\"](function (retryResponse) {\n log.logException('Call to ' + url + ' failed after ' + retries + ' retries.');\n reject(retryResponse);\n });\n } else {\n log.logException('Call ' + url + ' failed with no retry status of ' + response.status + '.');\n reject(response);\n }\n });\n });\n };\n return send(0);\n };\n var abortPendingRequests = function abortPendingRequests() {\n Object.keys(_pendingRequestPromises).forEach(function (requestPromise) {\n requestPromise && requestPromise.abort && requestPromise.abort();\n });\n _pendingRequestPromises = {};\n };\n var addEventListener = function addEventListener(eventName, eventCallback) {\n if (!_eventHandlers[eventName]) {\n _eventHandlers[eventName] = [];\n }\n _eventHandlers[eventName].push(eventCallback);\n };\n var removeEventListener = function removeEventListener(eventName, eventCallback) {\n if (!_eventHandlers[eventName]) {\n return;\n }\n for (var i = _eventHandlers[eventName].length - 1; i >= 0; i--) {\n if (_eventHandlers[eventName][i] === eventCallback) {\n _eventHandlers[eventName].splice(i, 1);\n break;\n }\n }\n if (_eventHandlers[eventName].length === 0) {\n delete _eventHandlers[eventName];\n }\n };\n return {\n get: get,\n sendFormDataPost: sendFormDataPost,\n abortPendingRequests: abortPendingRequests,\n addEventListener: addEventListener,\n removeEventListener: removeEventListener\n };\n};\nvar HttpService$1 = {\n create: HttpService\n};\n\nvar VERSION = 1;\nvar questionSetToXml = function questionSetToXml(questionSet, quizInstanceId) {\n var xmlStr = '<?xml version=\"1.0\" encoding=\"UTF-8\" ?>';\n xmlStr += '<UserResponse instance=\"' + quizInstanceId + '\" quiz=\"' + questionSet.quizId + '\" order=\"' + questionSet.order + '\" version=\"' + VERSION + '\">';\n questionSet.questions.forEach(function (question) {\n xmlStr += '<Question type=\"' + question.type + '\" id=\"' + question.id + '\">';\n xmlStr += '<Duration>' + question.duration + '</Duration>';\n xmlStr += '<Response>' + textSanitizer.htmlEncode(question.response) + '</Response>';\n if (question.type !== questionType.SHORT && question.correct !== undefined) {\n xmlStr += '<Correct>' + (question.correct ? 'True' : 'False') + '</Correct>';\n }\n xmlStr += '<SegmentWatched>' + question.segmentWatched + '</SegmentWatched>';\n xmlStr += '</Question>';\n });\n xmlStr += '</UserResponse>';\n return xmlStr;\n};\nvar quizDefinitionToXml = function quizDefinitionToXml(quizDefinition) {\n var xmlStr = '<?xml version=\"1.0\" encoding=\"UTF-8\" ?>';\n xmlStr += '<QuizDefinition version=\"' + VERSION + '\" quiz=\"' + quizDefinition.quizId + '\" locale=\"' + quizDefinition.lang + '\">';\n xmlStr += '<ProjectName>' + textSanitizer.htmlEncode(quizDefinition.projectName) + '</ProjectName>';\n xmlStr += '<ProductionName>' + quizDefinition.productionName + '</ProductionName>';\n xmlStr += '<OriginId>' + quizDefinition.originId + '</OriginId>';\n xmlStr += '<MediaDuration>' + quizDefinition.mediaDuration + '</MediaDuration>';\n xmlStr += '<ReportRecipients>';\n quizDefinition.reportRecipients.forEach(function (recipient) {\n xmlStr += '<Email>' + recipient + '</Email>';\n });\n xmlStr += '</ReportRecipients>';\n xmlStr += '<QuestionSets>';\n quizDefinition.questionSets.forEach(function (questionSet) {\n xmlStr += '<QuestionSet name=\"' + textSanitizer.htmlEncode(questionSet.name) + '\" mediaTimePosition=\"' + questionSet.mediaTimePosition + '\" order=\"' + questionSet.order + '\">';\n questionSet.questions.forEach(function (question) {\n xmlStr += '<Question type=\"' + question.type + '\" id=\"' + question.id + '\">';\n xmlStr += '<QuestionText>' + textSanitizer.htmlEncode(question.questionText, true) + '</QuestionText>';\n if (question.type === questionType.CHOICE) {\n xmlStr += '<Choices>';\n question.choices.forEach(function (choice) {\n xmlStr += '<Answer>' + textSanitizer.htmlEncode(choice, true) + '</Answer>';\n });\n xmlStr += '</Choices>';\n xmlStr += '<CorrectAnswer>' + question.correctAnswer + '</CorrectAnswer>';\n } else if (question.type === questionType.FILL_IN) {\n xmlStr += '<Answers>';\n question.choices.forEach(function (choice) {\n xmlStr += '<Answer>' + textSanitizer.htmlEncode(choice, true) + '</Answer>';\n });\n xmlStr += '</Answers>';\n }\n xmlStr += '</Question>';\n });\n xmlStr += '</QuestionSet>';\n });\n xmlStr += '</QuestionSets>';\n xmlStr += '</QuizDefinition>';\n return xmlStr;\n};\nvar quizDataXmlConverter = {\n questionSetToXml: questionSetToXml,\n quizDefinitionToXml: quizDefinitionToXml\n};\n\nvar httpService$1 = HttpService$1.create();\nvar getTechSmithAccessToken = function getTechSmithAccessToken(playerConfiguration) {\n var accessTokenEndpoint = playerConfiguration.getTechSmithAccessTokenEndpoint();\n if (accessTokenEndpoint) {\n return httpService$1.get(accessTokenEndpoint).then(function (data) {\n return data.AccessToken;\n });\n }\n return Promise$1.resolve();\n};\nvar abortPendingRequests$1 = function abortPendingRequests() {\n httpService$1.abortPendingRequests();\n};\nvar tokenService = {\n getTechSmithAccessToken: getTechSmithAccessToken,\n abortPendingRequests: abortPendingRequests$1\n};\n\nvar DEFAULT_PROGRESS_INTERVAL_TIME_MILLISECONDS = 10000;\nvar _definitionEndPoint = 'v/1/quiz/definition';\nvar _instanceEndPoint = 'v/1/quiz/instance?noop=1';\nvar _responseEndPoint = 'v/1/quiz/response?noop=1';\nvar _progressEndPoint = 'v/1/quiz/progress?noop=1';\nvar _baseURL = 'https://quiz.cloud.techsmith.com/';\nvar _quizCreateInstanceUrl = null;\nvar _quizInstanceDataPromiseResolve;\nvar _quizInstanceDataPromiseReject;\nvar _quizInstanceDataPromise = new Promise$1(function (resolve, reject) {\n _quizInstanceDataPromiseResolve = resolve;\n _quizInstanceDataPromiseReject = reject;\n});\nvar httpService = HttpService$1.create();\nvar httpServiceWithUnlimitedRetries = HttpService$1.create(BackoffStrategyFactory.createWithUnlimitedRetries());\nvar httpServiceWithNoLogging = HttpService$1.create(BackoffStrategyFactory.create(), false);\nvar getBaseURL = function getBaseURL() {\n if (playerConfiguration.getQuizServiceBaseUrl()) {\n return playerConfiguration.getQuizServiceBaseUrl();\n }\n return _baseURL;\n};\n\n//should only be used for the purposes of unit tests!\nvar reset = function reset() {\n abortPendingRequests();\n httpServiceWithUnlimitedRetries = HttpService$1.create(BackoffStrategyFactory.createWithUnlimitedRetries());\n httpService = HttpService$1.create();\n httpServiceWithNoLogging = HttpService$1.create(BackoffStrategyFactory.create(), false);\n _quizInstanceDataPromise = new Promise$1(function (resolve, reject) {\n _quizInstanceDataPromiseResolve = resolve;\n _quizInstanceDataPromiseReject = reject;\n });\n};\nvar submitQuizDefinition = function submitQuizDefinition(quizJsonData, hash, clientId) {\n if (!quizJsonData) {\n return Promise$1.resolve();\n }\n if (typeof quizJsonData === 'string') {\n quizJsonData = JSON.parse(quizJsonData);\n }\n var quizDefinitionXml = quizDataXmlConverter.quizDefinitionToXml(quizJsonData);\n var url = getBaseURL() + _definitionEndPoint + '?Quiz-Checksum=' + hash + '&Quiz-ClientId=' + clientId + '&noop=1';\n var data = {\n DefinitionText: quizDefinitionXml\n };\n return httpService.sendFormDataPost(url, data).then(function () {\n return quizDefinitionXml;\n });\n};\nvar getInstanceFormData = function getInstanceFormData(quizModel, firstName, lastName, email, playerConfig) {\n var data = {\n QuizId: quizModel.quizID,\n CheckForQuizDefinition: playerConfig.getFathomId() === undefined\n };\n if (playerConfig.getTechSmithAccessTokenEndpoint()) {\n return tokenService.getTechSmithAccessToken(playerConfig).then(function (token) {\n data.AccessToken = token;\n return data;\n });\n }\n data.FirstName = !firstName ? '' : firstName;\n data.LastName = !lastName ? '' : lastName;\n data.Email = !email ? '' : email;\n return Promise$1.resolve(data);\n};\nvar startQuizInstance = function startQuizInstance(quizModel, firstName, lastName, email, playerConfig) {\n var url = _quizCreateInstanceUrl || getBaseURL() + _instanceEndPoint;\n getInstanceFormData(quizModel, firstName, lastName, email, playerConfig).then(function (data) {\n httpService.sendFormDataPost(url, data).then(function (response) {\n if (response.DefinitionRequired) {\n return submitQuizDefinition(quizModel.quizDefinition, quizModel.quizHash, quizModel.clientId).then(function () {\n return response;\n });\n }\n return response;\n }).then(function (response) {\n _quizInstanceDataPromiseResolve({\n analyticsSampleRate: response.SampleRate,\n reportingRate: response.ReportingRate || DEFAULT_PROGRESS_INTERVAL_TIME_MILLISECONDS,\n quizInstanceId: response.Id\n });\n })[\"catch\"](_quizInstanceDataPromiseReject);\n });\n return _quizInstanceDataPromise;\n};\nvar sendProgress = function sendProgress(sampleRateInMilliseconds, completedSamples) {\n if (completedSamples && completedSamples.length > 0) {\n return _quizInstanceDataPromise.then(function (quizInstanceData) {\n var url = getBaseURL() + _progressEndPoint;\n var data = {\n InstanceId: quizInstanceData.quizInstanceId,\n Interval: sampleRateInMilliseconds,\n ViewedSegments: completedSamples\n };\n return httpServiceWithNoLogging.sendFormDataPost(url, data, 0);\n });\n }\n};\nvar setQuizCreateInstanceUrl$1 = function setQuizCreateInstanceUrl(quizCreateInstanceUrl) {\n _quizCreateInstanceUrl = quizCreateInstanceUrl;\n};\nvar getQuizCreateInstanceUrl$1 = function getQuizCreateInstanceUrl() {\n return _quizCreateInstanceUrl;\n};\nvar submitQuestionSet = function submitQuestionSet(questionSetData) {\n return _quizInstanceDataPromise.then(function (quizInstanceData) {\n if (!quizInstanceData.quizInstanceId) {\n return Promise$1.reject('No quiz instance ID found');\n }\n if (typeof questionSetData === 'string') {\n questionSetData = JSON.parse(questionSetData);\n }\n var questionSetXml = quizDataXmlConverter.questionSetToXml(questionSetData, quizInstanceData.quizInstanceId);\n var url = getBaseURL() + _responseEndPoint;\n var data = {\n ResponseText: questionSetXml\n };\n return httpServiceWithUnlimitedRetries.sendFormDataPost(url, data).then(function (response) {\n return response.results;\n });\n });\n};\nvar getAnalyticsRate = function getAnalyticsRate() {\n return _quizInstanceDataPromise.then(function (response) {\n return {\n analyticsSampleRate: response.analyticsSampleRate,\n reportingRate: response.reportingRate\n };\n });\n};\nvar abortPendingRequests = function abortPendingRequests() {\n httpService.abortPendingRequests();\n httpServiceWithUnlimitedRetries.abortPendingRequests();\n httpServiceWithNoLogging.abortPendingRequests();\n tokenService.abortPendingRequests();\n};\nvar addEventListener$2 = function addEventListener(eventName, eventCallback) {\n httpService.addEventListener(eventName, eventCallback);\n httpServiceWithUnlimitedRetries.addEventListener(eventName, eventCallback);\n httpServiceWithNoLogging.addEventListener(eventName, eventCallback);\n};\nvar removeEventListener$2 = function removeEventListener(eventName, eventCallback) {\n httpService.removeEventListener(eventName, eventCallback);\n httpServiceWithUnlimitedRetries.removeEventListener(eventName, eventCallback);\n httpServiceWithNoLogging.removeEventListener(eventName, eventCallback);\n};\nvar quizService = {\n setQuizCreateInstanceUrl: setQuizCreateInstanceUrl$1,\n getQuizCreateInstanceUrl: getQuizCreateInstanceUrl$1,\n startQuizInstance: startQuizInstance,\n submitQuestionSet: submitQuestionSet,\n sendProgress: sendProgress,\n getAnalyticsRate: getAnalyticsRate,\n reset: reset,\n abortPendingRequests: abortPendingRequests,\n addEventListener: addEventListener$2,\n removeEventListener: removeEventListener$2\n};\n\n/**\n * @memberof TSC\n * @class QuizProgressTracker\n * @classdesc Quiz progress tracker manages quiz progress and processing played segments\n * @param {HTMLVideoElement} videoToTrack - The video element to monitor for progress.\n * @param {int} sampleRateInMilliseconds\n * @param {int} reportingRateInMilliseconds\n *\n */\nvar QuizProgressTracker = function QuizProgressTracker(videoToTrack, sampleRateInMilliseconds, reportingRateInMilliseconds) {\n var _didAttachToEndedEvent = false;\n var _didAttachToPlayEvent = false;\n var _intervalId;\n var _playCallbackFunction;\n var _mergeToleranceInMilliseconds = 500;\n var _videoEndToleranceInMilliseconds = 1000;\n var processPlayedSegments = function processPlayedSegments(played) {\n var numberPlayedSegments = played.length;\n if (numberPlayedSegments < 1) {\n return [];\n }\n var mergedPlayedInMilliseconds = [{\n start: played.start(0) * 1000,\n end: played.end(0) * 1000\n }];\n var mergedPlayedIndex = 0;\n var i;\n for (i = 1; i < numberPlayedSegments; i++) {\n if (mergedPlayedInMilliseconds[mergedPlayedIndex].end >= played.start(i) * 1000 - _mergeToleranceInMilliseconds) {\n mergedPlayedInMilliseconds[mergedPlayedIndex].end = played.end(i) * 1000;\n } else {\n mergedPlayedInMilliseconds.push({\n start: played.start(i) * 1000,\n end: played.end(i) * 1000\n });\n mergedPlayedIndex++;\n }\n }\n return mergedPlayedInMilliseconds;\n };\n var computePercentageViewed = function computePercentageViewed(video) {\n var completedSamples = [];\n var i;\n var j;\n var videoStartMilliseconds;\n var videoEndMilliseconds;\n var isEndOfVideo;\n var firstSample;\n var lastSample;\n var entireVideoWasWatched;\n var mergedPlayedInMilliseconds;\n var videoDurationInMilliseconds = video.duration * 1000;\n mergedPlayedInMilliseconds = processPlayedSegments(video.played);\n for (i = 0; i < mergedPlayedInMilliseconds.length; i++) {\n videoStartMilliseconds = mergedPlayedInMilliseconds[i].start;\n videoEndMilliseconds = mergedPlayedInMilliseconds[i].end;\n isEndOfVideo = videoDurationInMilliseconds - video.currentTime * 1000 < _videoEndToleranceInMilliseconds;\n if (!isEndOfVideo && videoEndMilliseconds - videoStartMilliseconds < sampleRateInMilliseconds) {\n continue;\n }\n firstSample = Math.floor(videoStartMilliseconds / sampleRateInMilliseconds);\n if (videoStartMilliseconds % sampleRateInMilliseconds !== 0) {\n firstSample += 1;\n }\n lastSample = Math.floor(videoEndMilliseconds / sampleRateInMilliseconds);\n if (!isEndOfVideo) {\n lastSample -= 1;\n }\n if (lastSample < firstSample) {\n continue;\n }\n for (j = firstSample; j <= lastSample; j++) {\n completedSamples.push(j);\n }\n }\n quizService.sendProgress(sampleRateInMilliseconds, completedSamples);\n entireVideoWasWatched = completedSamples.length === Math.ceil(videoDurationInMilliseconds / sampleRateInMilliseconds);\n if (entireVideoWasWatched) {\n stopInterval();\n video.removeEventListener('play', _playCallbackFunction, false);\n }\n };\n var attachToEndedEvent = function attachToEndedEvent(video) {\n var endedCallbackFunction = function endedCallbackFunction() {\n sendProgress(video);\n stopInterval();\n };\n video.addEventListener('ended', endedCallbackFunction, false);\n _didAttachToEndedEvent = true;\n };\n var attachToPlayEvent = function attachToPlayEvent(video) {\n _playCallbackFunction = function _playCallbackFunction() {\n if (_intervalId !== -1) {\n return;\n }\n setupProgressInterval(video);\n };\n video.addEventListener('play', _playCallbackFunction, false);\n _didAttachToPlayEvent = true;\n };\n var sendProgress = function sendProgress(video) {\n if (!video || video.duration === 0) {\n return;\n }\n if (!_didAttachToEndedEvent) {\n attachToEndedEvent(video);\n }\n if (!_didAttachToPlayEvent) {\n attachToPlayEvent(video);\n }\n computePercentageViewed(video);\n };\n var stopInterval = function stopInterval() {\n if (_intervalId !== -1) {\n window.clearInterval(_intervalId);\n _intervalId = -1;\n }\n };\n var destroy = function destroy() {\n stopInterval();\n };\n var setupProgressInterval = function setupProgressInterval(video) {\n var intervalFunction = function intervalFunction() {\n sendProgress(video);\n if (video.paused) {\n window.clearInterval(_intervalId);\n _intervalId = -1;\n }\n };\n _intervalId = window.setInterval(intervalFunction, reportingRateInMilliseconds);\n };\n stopInterval();\n setupProgressInterval(videoToTrack);\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar QuizProgressTracker$1 = {\n /**\n * Factory method that returns a new QuizProgressTracker.\n * @function create\n * @memberof TSC.QuizProgressTracker\n * @static\n * @param {HTMLVideoElement} videoToTrack - The video element to monitor for progress.\n * @param {int} sampleRateInMilliseconds\n * @param {int} reportingRateInMilliseconds\n * @return new QuizProgressTracker instance\n */\n create: QuizProgressTracker\n};\n\nvar questionGrader = Object.freeze({\n FATHOM: 'FATHOM',\n XMP: 'XMP'\n});\n\n/**\n * @memberof TSC\n * @class fathomGrader\n * @classdesc Grader for fathom quiz service\n */\n\nvar processQuestionResults = function processQuestionResults(question, results) {\n var questionApiId = question.id;\n var questionResult = results[questionApiId];\n if (questionResult !== undefined) {\n question.isResponseCorrect = questionResult.isCorrect;\n question.correctAnswer = questionResult.correctAnswer;\n question.isGraded = questionResult.isGraded;\n }\n};\nvar processQuestionSetResults = function processQuestionSetResults(questionSet, results) {\n questionSet.questions.forEach(function (question) {\n processQuestionResults(question, results);\n });\n questionSet.cacheQuestionDetails();\n};\nvar fathomGrader = Object.defineProperties({\n processQuestionSetResults: processQuestionSetResults\n}, {\n doesLocalGrading: {\n value: false\n }\n});\n\n/**\n * @memberof TSC\n * @class xmpGrader\n * @classdesc Xmp Grader question sets\n */\nvar gradeChoiceQuestion = function gradeChoiceQuestion(question, response) {\n var correctAnswer = question.correctAnswer;\n var isCorrect;\n var responseNumber = parseInt(response, 10);\n if (isNaN(responseNumber)) {\n isCorrect = false;\n } else {\n /*eslint no-bitwise: \"off\"*/\n isCorrect = 1 << responseNumber === correctAnswer;\n }\n question.isResponseCorrect = isCorrect;\n question.isGraded = correctAnswer !== undefined && correctAnswer > 0;\n};\nvar gradeFillInTheBlankQuestion = function gradeFillInTheBlankQuestion(question, response) {\n var responseLowerCase = response !== undefined ? response.toLowerCase() : '';\n var possibleAnswers = question.answers;\n var numberPossibleAnswers = possibleAnswers ? possibleAnswers.length : 0;\n question.isGraded = numberPossibleAnswers > 0;\n if (question.isGraded) {\n question.isResponseCorrect = false;\n for (var i = 0; i < numberPossibleAnswers; i++) {\n if (responseLowerCase === possibleAnswers[i].text.toLowerCase()) {\n question.isResponseCorrect = true;\n break;\n }\n }\n }\n};\nvar gradeQuestion = function gradeQuestion(question) {\n if (question.type === questionType.CHOICE) {\n gradeChoiceQuestion(question, question.userResponse);\n } else if (question.type === questionType.FILL_IN) {\n gradeFillInTheBlankQuestion(question, question.userResponse);\n }\n};\nvar gradeQuestionSet = function gradeQuestionSet(questionSet) {\n questionSet.questions.forEach(function (question) {\n if (question.responseLocked) {\n gradeQuestion(question);\n }\n });\n};\nvar xmpGrader = Object.defineProperties({\n gradeQuestionSet: gradeQuestionSet\n}, {\n doesLocalGrading: {\n value: true\n }\n});\n\nvar _containerId = '.question-set-container';\nvar _superView = BubbleView$1.create(_containerId);\nvar _showAnswersId = '.view-answers-button';\nvar _hideAnswersId = '.hide-answers-button';\nvar _gradeableDetails;\nvar _unGradeableDetails;\nvar _readingSelector = '.question-set-results';\nvar questionSetReviewStatusView = {\n setGradeableDetails: function setGradeableDetails(text) {\n _gradeableDetails = text;\n },\n setUngradeableDetails: function setUngradeableDetails(text) {\n _unGradeableDetails = text;\n },\n getViewMarkup: function getViewMarkup() {\n return templateGenerator.generateQuestionSetReviewStatusMarkup(_gradeableDetails, _unGradeableDetails) + _superView.getOverlayMarkup();\n },\n getHideAnswersControlRef: function getHideAnswersControlRef() {\n return _hideAnswersId;\n },\n getShowAnswersControlRef: function getShowAnswersControlRef() {\n return _showAnswersId;\n },\n showView: function showView() {\n var $container = $(_containerId);\n $container.removeClass('minimized');\n _superView.showView();\n var $readableElement = $container.find(_readingSelector);\n $readableElement.focus();\n highlightDisabler.disableHighlights($readableElement);\n },\n hideView: function hideView() {\n $(_containerId).addClass('minimized');\n _superView.hideView();\n },\n removeView: _superView.removeView,\n updateViewPosition: _superView.updateViewPosition,\n setBottomOffset: _superView.setBottomOffset,\n pointAt: _superView.pointAt\n};\n\nvar scormConstants = Object.freeze({\n fn: {\n initialize: 'initialize',\n terminate: 'terminate',\n getValue: 'getValue',\n setValue: 'setValue',\n commit: 'commit'\n },\n dataModelID: {\n cmiExit: 'cmiExit',\n cmiLocation: 'cmiLocation',\n cmiSuspendData: 'cmiSuspendData',\n cmiProgressMeasure: 'cmiProgressMeasure',\n cmiScaledPassingScore: 'cmiScaledPassingScore',\n cmiScoreMin: 'cmiScoreMin',\n cmiScoreMax: 'cmiScoreMax',\n cmiScoreRaw: 'cmiScoreRaw',\n cmiScoreScaled: 'cmiScoreScaled',\n cmiSuccessStatus: 'cmiSuccessStatus',\n cmiCompletionStatus: 'cmiCompletionStatus',\n cmiSessionTime: 'cmiSessionTime',\n adlNavRequest: 'adlNavRequest'\n },\n scorm1Dot2DataModel: {\n cmiExit: 'cmi.core.exit',\n cmiLocation: 'cmi.core.lesson_location',\n cmiSuspendData: 'cmi.suspend_data',\n cmiProgressMeasure: null,\n cmiScaledPassingScore: 'cmi.student_data.mastery_score',\n cmiScoreMin: 'cmi.core.score.min',\n cmiScoreMax: 'cmi.core.score.max',\n cmiScoreRaw: 'cmi.core.score.raw',\n cmiScoreScaled: null,\n cmiSuccessStatus: null,\n cmiCompletionStatus: 'cmi.core.lesson_status',\n cmiSessionTime: 'cmi.core.session_time',\n adlNavRequest: null\n },\n scorm2004DataModel: {\n cmiExit: 'cmi.exit',\n cmiLocation: 'cmi.location',\n cmiSuspendData: 'cmi.suspend_data',\n cmiProgressMeasure: 'cmi.progress_measure',\n cmiScaledPassingScore: 'cmi.scaled_passing_score',\n cmiScoreMin: 'cmi.score.min',\n cmiScoreMax: 'cmi.score.max',\n cmiScoreRaw: 'cmi.score.raw',\n cmiScoreScaled: 'cmi.score.scaled',\n cmiSuccessStatus: 'cmi.success_status',\n cmiCompletionStatus: 'cmi.completion_status',\n cmiSessionTime: 'cmi.session_time',\n adlNavRequest: 'adl.nav.request'\n },\n status: {\n completed: 'completed',\n incomplete: 'incomplete',\n notAttempted: 'not attempted',\n unknown: 'unknown',\n passed: 'passed',\n failed: 'failed',\n browsed: 'browsed'\n },\n exitStates: {\n suspend: 'suspend',\n logout: 'logout',\n complete: ''\n },\n navRequestStates: {\n exitAll: 'exitAll',\n suspendAll: 'suspendAll'\n },\n versions: {\n NOT_DETECTED: -1,\n SCORM_1_2: 0,\n SCORM_2004: 1\n },\n assessment: {\n minScore: 0,\n maxScore: 100,\n scoreNormalizationDivider: 100\n }\n});\n\nvar V1_SUSPENDED_DATA_KEY = 'tscsp1';\nvar V2_SUSPENDED_DATA_KEY = 'tscsp2';\n\n/**\n * @memberof TSC\n * @class ScormDataModel\n * @classdesc Data modal for smart player suspended scorm data\n */\nvar ScormDataModel = function ScormDataModel() {\n var _percentageComplete = 0;\n var _quizPercentageCorrect = 0;\n var _quizCompletionStatus = scormConstants.status.unknown;\n var _quizModelSnapshot = '';\n var _videoAnalyticsSnapshot = '';\n var _videoTimeInSecondsSnapshot = 0;\n var _videoTimeInSeconds = 0;\n var _completionStatus = scormConstants.status.notAttempted;\n var _passingStatus = scormConstants.status.unknown;\n\n /**\n * @methodOf TSC.ScormDataModel\n * @method parseSuspendedDataString\n * @param {String} suspendedDataString - string containing suspended scorm data\n */\n var parseSuspendedDataString = function parseSuspendedDataString(suspendedDataString) {\n if (!suspendedDataString) {\n return;\n }\n try {\n var suspendedData = window.JSON.parse(suspendedDataString);\n if (suspendedData[V1_SUSPENDED_DATA_KEY]) {\n _percentageComplete = parseFloat(suspendedData[V1_SUSPENDED_DATA_KEY].pc);\n _videoAnalyticsSnapshot = suspendedData[V1_SUSPENDED_DATA_KEY].vas;\n _videoTimeInSecondsSnapshot = parseFloat(suspendedData[V1_SUSPENDED_DATA_KEY].cvt);\n } else if (suspendedData[V2_SUSPENDED_DATA_KEY]) {\n _percentageComplete = parseFloat(suspendedData[V2_SUSPENDED_DATA_KEY].pc);\n _videoAnalyticsSnapshot = suspendedData[V2_SUSPENDED_DATA_KEY].vas;\n _videoTimeInSecondsSnapshot = parseFloat(suspendedData[V2_SUSPENDED_DATA_KEY].cvt);\n _quizModelSnapshot = suspendedData[V2_SUSPENDED_DATA_KEY].qs;\n }\n } catch (e) {} // eslint-disable-line\n };\n\n /**\n * @methodOf TSC.ScormDataModel\n * @method getSuspendedDataString\n * Return string of suspended data\n * @returns {String} string containing suspended scorm data\n */\n var getSuspendedDataString = function getSuspendedDataString() {\n var suspendedData = {};\n suspendedData[V2_SUSPENDED_DATA_KEY] = {\n pc: _percentageComplete,\n vas: _videoAnalyticsSnapshot,\n cvt: _videoTimeInSeconds,\n qs: _quizModelSnapshot\n };\n return window.JSON.stringify(suspendedData);\n };\n return Object.defineProperties({\n parseSuspendedDataString: parseSuspendedDataString,\n getSuspendedDataString: getSuspendedDataString\n }, {\n percentageComplete: {\n get: function get() {\n return _percentageComplete;\n },\n set: function set(percentageComplete) {\n _percentageComplete = percentageComplete;\n }\n },\n quizPercentageCorrect: {\n get: function get() {\n return _quizPercentageCorrect;\n },\n set: function set(quizPercentageCorrect) {\n _quizPercentageCorrect = quizPercentageCorrect;\n }\n },\n quizPercentageCorrectAsString: {\n get: function get() {\n return _quizPercentageCorrect.toString();\n }\n },\n quizCompletionStatus: {\n get: function get() {\n return _quizCompletionStatus;\n },\n set: function set(quizCompletionStatus) {\n _quizCompletionStatus = quizCompletionStatus;\n }\n },\n quizModelSnapshot: {\n get: function get() {\n return _quizModelSnapshot;\n },\n set: function set(quizModelSnapshot) {\n _quizModelSnapshot = quizModelSnapshot;\n }\n },\n videoAnalyticsSnapshot: {\n get: function get() {\n return _videoAnalyticsSnapshot;\n },\n set: function set(snapshot) {\n _videoAnalyticsSnapshot = snapshot;\n }\n },\n videoTimeInSecondsSnapshot: {\n get: function get() {\n return _videoTimeInSecondsSnapshot;\n }\n },\n videoTimeInSeconds: {\n get: function get() {\n return _videoTimeInSeconds;\n },\n set: function set(timeInSeconds) {\n _videoTimeInSeconds = timeInSeconds;\n }\n },\n completionStatus: {\n get: function get() {\n return _completionStatus;\n },\n set: function set(completionStatus) {\n _completionStatus = completionStatus;\n }\n },\n passingStatus: {\n get: function get() {\n return _passingStatus;\n },\n set: function set(passingStatus) {\n _passingStatus = passingStatus;\n }\n }\n });\n};\nvar ScormDataModel$1 = {\n create: ScormDataModel\n};\n\nvar DEFAULT_TITLE_TEXT = '';\nvar MAX_PARENTS_TO_SEARCH = 500;\nvar SCORM_MANIFEST_FILE_NAME = 'imsmanifest.xml';\nvar CAMTASIA_SCORM_1_2_MANIFEST_STRING = '<metadatascheme>ADL SCORM 1.2</metadatascheme>';\n\n/**\n * @memberof TSC\n * @class ScormApiWrapper\n * @classdesc Wrapper around Scorm API that handles Scorm 1.2 and 2004\n */\nvar ScormApiWrapper = function ScormApiWrapper() {\n var scormApi = null;\n var noAPIFound = false;\n var apiVersion = scormConstants.versions.NOT_DETECTED;\n var scormManifestDocString = null;\n\n /**\n * Get last error message\n * @function getLastError\n * @return {String} - An error string that contains error number, string and diagnostic information.\n */\n var getLastError = function getLastError() {\n var errorNumber;\n var errorString;\n var diagnostic;\n if (!scormApi) {\n return 'SCORM API not found';\n }\n if (apiVersion >= scormConstants.versions.SCORM_2004) {\n errorNumber = scormApi.GetLastError();\n errorString = scormApi.GetErrorString(errorNumber);\n diagnostic = scormApi.GetDiagnostic(errorNumber);\n } else {\n errorNumber = scormApi.LMSGetLastError();\n errorString = scormApi.LMSGetErrorString(errorNumber);\n diagnostic = scormApi.LMSGetDiagnostic(errorNumber);\n }\n return 'Number: ' + errorNumber + '\\nDescription: ' + errorString + '\\nDiagnostic: ' + diagnostic;\n };\n\n /**\n * This function is used to communicate with the API, if it is found.\n * @memberof TSC.ScormApiWrapper\n * @function apiCall\n * @param {string} scormFunctionName - Name of the api function to call\n * @param {string} [dataModalID] - Name of the data model id defined in scorm constants object.\n * @param [dmeValue] - Value to write to data model\n * @return {string} - Value returned from the api call.\n */\n var apiCall = function apiCall(scormFunctionName, dataModalID, dmeValue) {\n var dataModel;\n var result;\n if (scormApi) {\n switch (scormFunctionName) {\n case scormConstants.fn.initialize:\n var initializedResult;\n if (apiVersion >= scormConstants.versions.SCORM_2004) {\n initializedResult = scormApi.Initialize('');\n } else {\n initializedResult = scormApi.LMSInitialize('');\n }\n if (initializedResult === 'true') {\n if (apiVersion >= scormConstants.versions.SCORM_2004) {\n result = scormApi.GetValue(scormConstants.scorm2004DataModel.cmiCompletionStatus);\n } else {\n result = scormApi.LMSGetValue(scormConstants.scorm1Dot2DataModel.cmiCompletionStatus);\n }\n }\n break;\n case scormConstants.fn.terminate:\n if (apiVersion >= scormConstants.versions.SCORM_2004) {\n result = scormApi.Terminate('');\n } else {\n result = scormApi.LMSFinish('');\n }\n break;\n case scormConstants.fn.getValue:\n if (apiVersion >= scormConstants.versions.SCORM_2004) {\n dataModel = scormConstants.scorm2004DataModel[dataModalID];\n if (dataModel) {\n result = scormApi.GetValue(dataModel);\n }\n } else {\n dataModel = scormConstants.scorm1Dot2DataModel[dataModalID];\n if (dataModel) {\n result = scormApi.LMSGetValue(dataModel);\n }\n }\n break;\n case scormConstants.fn.setValue:\n if (apiVersion >= scormConstants.versions.SCORM_2004) {\n dataModel = scormConstants.scorm2004DataModel[dataModalID];\n if (dataModel) {\n result = scormApi.SetValue(dataModel, dmeValue);\n }\n } else {\n // In 1.2, lesson_status hold both complete/incomplete and pass/fail.\n // So if we've already used it for pass/fail, we don't want to\n // overwrite with 'completed'\n dataModel = scormConstants.scorm1Dot2DataModel[dataModalID];\n var canSetValue = !!dataModel;\n if (dataModalID === scormConstants.dataModelID.cmiCompletionStatus) {\n var lessonStatus = scormApi.LMSGetValue(scormConstants.scorm1Dot2DataModel.cmiCompletionStatus);\n if (dmeValue !== scormConstants.status.passed && dmeValue !== scormConstants.status.failed) {\n canSetValue = lessonStatus !== scormConstants.status.failed && lessonStatus !== scormConstants.status.passed;\n }\n }\n if (canSetValue) {\n result = scormApi.LMSSetValue(dataModel, dmeValue);\n }\n }\n break;\n case scormConstants.fn.commit:\n if (apiVersion >= scormConstants.versions.SCORM_2004) {\n result = scormApi.Commit('');\n } else {\n result = scormApi.LMSCommit('');\n }\n break;\n }\n if (playerConfiguration.logScormApiCalls) {\n console.info('SCORM apiCall - ', scormFunctionName, dataModalID, dmeValue, ' returned ', result); // eslint-disable-line\n }\n return result;\n }\n };\n var loadScormManifest = function loadScormManifest() {\n return $.ajax({\n type: 'GET',\n url: SCORM_MANIFEST_FILE_NAME,\n dataType: 'text'\n });\n };\n var getScormManifestDoc = function getScormManifestDoc() {\n if (scormManifestDocString === null) {\n return new Promise$1(function (resolve, reject) {\n loadScormManifest().done(function (data) {\n scormManifestDocString = data;\n resolve(scormManifestDocString);\n }).fail(function () {\n reject();\n });\n });\n }\n return Promise$1.resolve(scormManifestDocString);\n };\n var getScormVersionFromManifestDoc = function getScormVersionFromManifestDoc() {\n return getScormManifestDoc().then(function (manifestDocAsString) {\n // manifest doc will contain a specific string only with SCORM version 1.2 produced with Camtasia\n if (manifestDocAsString.indexOf(CAMTASIA_SCORM_1_2_MANIFEST_STRING) !== -1) {\n return scormConstants.versions.SCORM_1_2;\n }\n return scormConstants.versions.SCORM_2004;\n });\n };\n var getScormApiOnWindow = function getScormApiOnWindow(windowRef) {\n // scorm 1.2 and 2004 api are defined on window\n if (windowRef.API && windowRef.API_1484_11) {\n return getScormVersionFromManifestDoc().then(function (scormApiVersion) {\n apiVersion = scormApiVersion;\n if (scormApiVersion === scormConstants.versions.SCORM_1_2) {\n return windowRef.API;\n }\n return windowRef.API_1484_11;\n });\n // look for scorm 1.2 api\n } else if (windowRef.API) {\n apiVersion = scormConstants.versions.SCORM_1_2;\n return Promise$1.resolve(windowRef.API);\n // look for scorm 2004 api\n } else if (windowRef.API_1484_11) {\n apiVersion = scormConstants.versions.SCORM_2004;\n return Promise$1.resolve(windowRef.API_1484_11);\n }\n return Promise$1.reject();\n };\n\n /**\n * Searches all the parents of a given window until it finds an object named \"API_1484_11\" or \"API\".\n * If an object of that name is found, a reference to it is returned. Otherwise, this function returns null.\n * @function findAPI\n * @param {window} win - Window object\n * @return {object} - If the API object is found, it's returned, otherwise null is returned\n */\n var findAPI = function findAPI(win) {\n var findAPITries = 0;\n\n // Search each parent window until we find the API, encounter a window with no parent / the\n // same as the current window, or have reached our MAX_PARENTS_TO_SEARCH to search threshold\n while (!win.API && !win.API_1484_11 && win.parent !== win && findAPITries <= MAX_PARENTS_TO_SEARCH) {\n findAPITries++;\n win = win.parent;\n }\n return getScormApiOnWindow(win);\n };\n var lookForApiOnParentWindow = function lookForApiOnParentWindow() {\n try {\n if (window.parent !== window) {\n return findAPI(window.parent);\n }\n return Promise$1.reject();\n } catch (e) {\n return Promise$1.reject(e);\n }\n };\n var lookForApiOnWindowTopOpener = function lookForApiOnWindowTopOpener() {\n if (window.top.opener !== null) {\n return findAPI(window.top.opener);\n }\n return Promise$1.reject();\n };\n\n /**\n * This function looks for an object named API, first in the current window's\n * frame hierarchy and then, if necessary, in the current window's opener window\n * hierarchy (if there is an opener window).\n * @function getAPI\n * @return {Promise} - A Promise that will resolve with API object if found or promise is rejected.\n */\n var getAPI = function getAPI() {\n return lookForApiOnParentWindow()[\"catch\"](lookForApiOnWindowTopOpener);\n };\n\n /**\n * Returns the handle to API object if it was previously set, otherwise it returns null\n * @function getAPIHandle\n * @return {Promise} - A Promise that will resolve with the available SCORM api.\n */\n var getAPIHandle = function getAPIHandle() {\n if (noAPIFound) {\n return Promise$1.reject();\n }\n if (!scormApi) {\n return getAPI();\n }\n return Promise$1.resolve(scormApi);\n };\n var getTitleFromManifestDoc = function getTitleFromManifestDoc() {\n try {\n var manifestXml = $.parseXML(scormManifestDocString);\n var $manifestXml = $(manifestXml);\n var $item = $manifestXml.find('item');\n var $title = $item.find('title');\n return $title.text();\n } catch (e) {\n return DEFAULT_TITLE_TEXT;\n }\n };\n\n /**\n * Get title for SCORM module\n * @function getTitle\n * @return {Promise} - A Promise that will resolve with the title found in the SCORM manifest file or empty string.\n */\n var getTitle = function getTitle() {\n if (!scormManifestDocString) {\n return getScormManifestDoc().then(getTitleFromManifestDoc)[\"catch\"](function () {\n return DEFAULT_TITLE_TEXT;\n });\n }\n return Promise$1.resolve(getTitleFromManifestDoc());\n };\n\n /**\n * Initialize SCORM module\n * @function init\n * @return {Promise} - A Promise that will resolve with the state of initialize.\n */\n var init = function init() {\n return getAPIHandle().then(function (api) {\n scormApi = api;\n if (playerConfiguration.logScormApiCalls) {\n console.info('SCORM initialized with version: ', apiVersion); // eslint-disable-line\n }\n return apiCall(scormConstants.fn.initialize);\n })[\"catch\"](function () {\n noAPIFound = true;\n return 'false';\n });\n };\n return Object.defineProperties({\n init: init,\n apiCall: apiCall,\n getTitle: getTitle,\n getLastError: getLastError\n }, {\n apiVersion: {\n get: function get() {\n return apiVersion;\n }\n }\n });\n};\n\n/**\n * Factory method that returns a new Scorm Api Wrapper object.\n * @function create\n * @memberof TSC.ScormApiWrapper\n * @static\n * @return new ScormApiWrapper instance\n */\nvar ScormApiWrapper$1 = {\n create: ScormApiWrapper\n};\n\nvar ScormNavigationBarView = function ScormNavigationBarView($container) {\n var _$scormNavigationBarContainer = $container.find('.scorm-module-navigation-container');\n var _$scormHeaderElement = null;\n var _$scormCompleteSessionButton = null;\n var _scoObjectiveHasBeenCompleted = false;\n var onCompleteSessionHandler = function onCompleteSessionHandler(e) {\n e.preventDefault();\n $container.trigger(events.SCORM.ExitSession);\n };\n var getButtonLabel = function getButtonLabel() {\n if (_scoObjectiveHasBeenCompleted) {\n return playerConfiguration.completeScormOnRequirementsComplete ? localizationStrings.getPlayerString(playerStringNames.scormExitVideo) : localizationStrings.getPlayerString(playerStringNames.scormCompleteVideo);\n }\n return localizationStrings.getPlayerString(playerStringNames.scormCompleteVideoLater);\n };\n var createView = function createView() {\n var buttonLabel = getButtonLabel();\n var isPrimaryButton = _scoObjectiveHasBeenCompleted;\n var scormNavigationBarMarkup = templateGenerator.generateScormNavigationBarMarkup(buttonLabel, isPrimaryButton);\n _$scormNavigationBarContainer.html(scormNavigationBarMarkup);\n _$scormHeaderElement = _$scormNavigationBarContainer.find('.scorm-module-title');\n _$scormCompleteSessionButton = _$scormNavigationBarContainer.find('.complete-scorm-session-button');\n };\n var disableControls = function disableControls() {\n _$scormCompleteSessionButton && _$scormCompleteSessionButton.attr('tabindex', tabIndex.Disabled);\n };\n var enableControls = function enableControls() {\n _$scormCompleteSessionButton && _$scormCompleteSessionButton.attr('tabindex', tabIndex.DomOrder);\n };\n var setupEvents = function setupEvents() {\n $container.on(events.Modals.Open, disableControls);\n $container.on(events.Modals.Closed, enableControls);\n _$scormCompleteSessionButton.on('click', onCompleteSessionHandler);\n };\n var setTitle = function setTitle(scormTitle) {\n if (_$scormHeaderElement) {\n _$scormHeaderElement.html(scormTitle);\n }\n };\n var destroy = function destroy() {\n if (_$scormCompleteSessionButton) {\n _$scormCompleteSessionButton.off();\n }\n $container.off(events.Modals.Open, disableControls);\n $container.off(events.Modals.Closed, enableControls);\n };\n var init = function init() {\n createView();\n setupEvents();\n };\n var updateView = function updateView(scoObjectiveHasBeenCompleted) {\n _scoObjectiveHasBeenCompleted = scoObjectiveHasBeenCompleted;\n destroy();\n init();\n };\n return Object.defineProperties({\n setTitle: setTitle,\n updateView: updateView\n }, {});\n};\nvar ScormNavigationBarView$1 = {\n create: ScormNavigationBarView\n};\n\n/**\n * Options for the ScormConfirmCompleteModal\n * @typedef {Object} ScormModalOptions\n * @property {boolean} canResumeVideo - Can the SCORM module be resumed\n * @property {boolean} failedToSaveSuspendedData - Indicates whether the player could not save the current state to the suspended data api.\n */\n\n/**\n * @memberof TSC\n * @class ScormConfirmCompleteModalView\n * @classdesc Confirmation modal used with SCORM operations\n * @param {jQuery} $container - jQuery wrapped element to add modal to.\n * @param {ScormModalOptions} options - Options to use when displaying modal.\n */\nvar ScormConfirmCompleteModalView = function ScormConfirmCompleteModalView($container, options) {\n var _$scormConfirmCompleteModalWrapper = $container.find('.scorm-confirm-complete-modal-wrapper');\n var _$confirmButton;\n var _$dismissButton;\n var createView = function createView() {\n var finalConfirmText;\n if (options.failedToSaveSuspendedData) {\n finalConfirmText = localizationStrings.getPlayerString(playerStringNames.scormConfirmCompleteModalFailedToSaveProgressText);\n } else {\n var confirmText = localizationStrings.getPlayerString(playerStringNames.scormConfirmCompleteModalText);\n var confirmWarningText = options.canResumeVideo ? localizationStrings.getPlayerString(playerStringNames.scormConfirmCompleteModalResumeVideoText) : localizationStrings.getPlayerString(playerStringNames.scormConfirmCompleteModalRestartVideoText);\n finalConfirmText = confirmText + ' ' + confirmWarningText;\n }\n var screenReaderAlertText = finalConfirmText;\n var dismissButtonText = localizationStrings.getPlayerString(playerStringNames.scormConfirmCompleteModalDismissButtonText);\n var dismissButtonScreenReaderText = localizationStrings.getPlayerString(playerStringNames.scormConfirmCompleteModalDismissButtonScreenReaderText);\n var confirmButtonText = localizationStrings.getPlayerString(playerStringNames.scormConfirmCompleteModalConfirmButtonText);\n var confirmButtonScreenReaderText = localizationStrings.getPlayerString(playerStringNames.scormConfirmCompleteModalConfirmButtonScreenReaderText);\n var scormConfirmCompleteModalMarkup = templateGenerator.generateScormConfirmCompleteModalMarkup(screenReaderAlertText, finalConfirmText, dismissButtonText, dismissButtonScreenReaderText, confirmButtonText, confirmButtonScreenReaderText, options.failedToSaveSuspendedData);\n _$scormConfirmCompleteModalWrapper.html(scormConfirmCompleteModalMarkup);\n _$dismissButton = _$scormConfirmCompleteModalWrapper.find('.dismiss-complete-button');\n _$confirmButton = _$scormConfirmCompleteModalWrapper.find('.confirm-complete-button');\n };\n var onDismissClickHandler = function onDismissClickHandler(e) {\n e.preventDefault();\n destroy();\n };\n var onCompleteClickHandler = function onCompleteClickHandler(e) {\n e.preventDefault();\n if (options.failedToSaveSuspendedData) {\n $container.trigger(events.SCORM.ExitSessionWithOutProgressConfirmed);\n } else {\n $container.trigger(events.SCORM.ExitSessionConfirmed);\n }\n };\n var setupEvents = function setupEvents() {\n _$confirmButton.on('click', onCompleteClickHandler);\n _$dismissButton.on('click', onDismissClickHandler);\n };\n var destroy = function destroy() {\n $container.trigger(events.Modals.Closed);\n _$confirmButton && _$confirmButton.off();\n _$dismissButton && _$dismissButton.off();\n _$scormConfirmCompleteModalWrapper.html('');\n };\n createView();\n setupEvents();\n $container.trigger(events.Modals.Open);\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar ScormConfirmCompleteModalView$1 = {\n create: ScormConfirmCompleteModalView\n};\n\nvar ScormSessionEndedView = function ScormSessionEndedView($container) {\n var _$scormSessionEndedWrapper = $container.find('.scorm-session-ended-wrapper');\n var scormSessionEndedMarkup = templateGenerator.generateScormSessionEndedMarkup(localizationStrings.getPlayerString(playerStringNames.scormSessionEndedText));\n _$scormSessionEndedWrapper.html(scormSessionEndedMarkup);\n $container.trigger(events.Modals.Open);\n};\nvar ScormSessionEndedView$1 = {\n create: ScormSessionEndedView\n};\n\nvar DEFAULT_PASSING_SCORE = 80;\nvar DEFAULT_VIDEO_WATCH_PERCENT_FOR_COMPLETE = 1;\nvar SCORM_NAV_CONTAINER_HEIGHT = '44px'; // note this should match the LESS var @scorm-ui-bar-height\n\n/**\n * @memberof TSC\n * @class scormController\n * @static\n * @classdesc Scorm Controller\n */\nvar scormController = function scormController() {\n var _$container = null;\n var _scormNavigationBarView = null;\n var _scormConfirmCompleteModalView = null;\n var _minimumScoreToPass = DEFAULT_PASSING_SCORE;\n var _minimumViewPercentageToCompleteLesson = DEFAULT_VIDEO_WATCH_PERCENT_FOR_COMPLETE;\n var _scormApiWrapper;\n var _isDisposed;\n var _initialized;\n var _scormModel;\n var _quizModel = null;\n var _sessionStartTimeInMilliseconds = 0;\n var _preventWindowClose = true;\n var _ignoreFailedToSuspendError = false;\n var _pendingScoExitValue = null;\n var _scoSessionHasEnded = false;\n var initializeInternalState = function initializeInternalState() {\n _$container = null;\n _scormNavigationBarView = null;\n _scormConfirmCompleteModalView = null;\n _scormApiWrapper = ScormApiWrapper$1.create();\n _isDisposed = false;\n _initialized = false;\n _scormModel = ScormDataModel$1.create();\n _sessionStartTimeInMilliseconds = 0;\n _preventWindowClose = true;\n _ignoreFailedToSuspendError = false;\n _pendingScoExitValue = null;\n _scoSessionHasEnded = false;\n };\n var scoHasQuiz = function scoHasQuiz() {\n return _quizModel !== null;\n };\n var scormSessionHasUnfinishedQuiz = function scormSessionHasUnfinishedQuiz() {\n return scoHasQuiz() && _scormModel.passingStatus === scormConstants.status.unknown;\n };\n var canSuspendScormSession = function canSuspendScormSession() {\n return !scoHasQuiz() || _quizModel.reportMethod === reportType.NONE || _quizModel.reportMethod === reportType.SCORM;\n };\n var submitMinMaxScoreValuesToScormApi = function submitMinMaxScoreValuesToScormApi() {\n if (_scormApiWrapper.apiVersion === scormConstants.versions.SCORM_1_2) {\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiScoreMin, scormConstants.assessment.minScore.toString());\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiScoreMax, scormConstants.assessment.maxScore.toString());\n } else {\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiScoreMin, scormConstants.assessment.minScore);\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiScoreMax, scormConstants.assessment.maxScore);\n }\n _scormApiWrapper.apiCall(scormConstants.fn.commit);\n };\n var submitScoreToScormApi = function submitScoreToScormApi() {\n if (_scormApiWrapper.apiVersion === scormConstants.versions.SCORM_1_2) {\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiScoreRaw, _scormModel.quizPercentageCorrectAsString);\n } else {\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiScoreRaw, _scormModel.quizPercentageCorrect);\n }\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiScoreScaled, _scormModel.quizPercentageCorrect / scormConstants.assessment.scoreNormalizationDivider);\n _scormApiWrapper.apiCall(scormConstants.fn.commit);\n };\n var getSuspendedDataFromAPI = function getSuspendedDataFromAPI() {\n var suspendedData = _scormApiWrapper.apiCall(scormConstants.fn.getValue, scormConstants.dataModelID.cmiSuspendData);\n _scormModel.parseSuspendedDataString(suspendedData);\n };\n var getSuspendData = function getSuspendData() {\n if (_quizModel) {\n _scormModel.quizModelSnapshot = _quizModel.getSnapShot();\n }\n _scormModel.videoAnalyticsSnapshot = videoAnalytics.getVideoSegmentSnapShot();\n return _scormModel.getSuspendedDataString();\n };\n var getSessionTimeValueByApiVersion = function getSessionTimeValueByApiVersion() {\n var sessionTimeInMilliseconds = window.performance.now() - _sessionStartTimeInMilliseconds;\n var sessionTimeInSeconds = Math.round(sessionTimeInMilliseconds / 1000);\n if (_scormApiWrapper.apiVersion === scormConstants.versions.SCORM_1_2) {\n return timeFormatter.formatTimeForCmiTimespan(sessionTimeInSeconds);\n }\n return timeFormatter.formatTimeAsTimeInterval(sessionTimeInSeconds);\n };\n var scoObjectiveHasBeenCompleted = function scoObjectiveHasBeenCompleted() {\n return _scormModel.percentageComplete >= _minimumViewPercentageToCompleteLesson && !scormSessionHasUnfinishedQuiz();\n };\n var shouldSubmitQuizScoreToApi = function shouldSubmitQuizScoreToApi() {\n return _quizModel && _scormModel.completionStatus === scormConstants.status.completed && _scormModel.quizCompletionStatus === scormConstants.status.completed && _quizModel.totalNumberOfGradedQuestionSets > 0;\n };\n var endScormSession = function endScormSession() {\n if (!_scoSessionHasEnded) {\n // need to mark this ended upfront\n _scoSessionHasEnded = true;\n if (_scormModel.percentageComplete >= _minimumViewPercentageToCompleteLesson) {\n _scormModel.completionStatus = scormConstants.status.completed;\n }\n var timeInSecondsAsString = videoAnalytics.getCurrentPlayTime().toString();\n _pendingScoExitValue = scormConstants.exitStates.complete;\n var scoCompletionStatusValue = _scormModel.completionStatus;\n var scoSuccessStatusValue;\n\n // SCORM 1.2 when video has quiz and not answered all questions complete status will be 'incomplete'\n // This is because SCORM 1.2 does not have a separate api value for pass / fail success\n if (_scormApiWrapper.apiVersion === scormConstants.versions.SCORM_1_2 && scormSessionHasUnfinishedQuiz()) {\n scoCompletionStatusValue = scormConstants.status.incomplete;\n }\n\n // Suspend SCO (Enables bookmarking feature) when viewer has not watched all the required video or they have not answered all the quiz questions if they exist\n if (canSuspendScormSession() && (_scormModel.completionStatus !== scormConstants.status.completed || scormSessionHasUnfinishedQuiz())) {\n _pendingScoExitValue = scormConstants.exitStates.suspend;\n }\n\n // If SCO attempt is complete and there is a quiz make sure we write the score out regardless if viewer has finished quiz\n if (_pendingScoExitValue === scormConstants.exitStates.complete) {\n if (scoHasQuiz()) {\n submitScore(_scormModel.quizPercentageCorrect, true);\n } else {\n _scormModel.passingStatus = scormConstants.status.passed;\n }\n }\n\n // SCORM 1.2 completionStatus value can be 'incomplete', 'passed' or 'failed'\n // SCORM 1.2 does not have a key to store an independent success status.\n if (_scormApiWrapper.apiVersion === scormConstants.versions.SCORM_1_2 && scoHasQuiz() && _scormModel.passingStatus !== scormConstants.status.unknown && scoCompletionStatusValue === scormConstants.status.completed) {\n scoCompletionStatusValue = _scormModel.passingStatus;\n scoSuccessStatusValue = '';\n } else {\n scoSuccessStatusValue = _scormModel.passingStatus;\n }\n var suspendedData = _pendingScoExitValue === scormConstants.exitStates.suspend ? getSuspendData() : '';\n var suspendSuccess = _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiSuspendData, suspendedData);\n\n // SCORM spec says boolean is returned, but in testing it is a boolean as a string. So testing for both in case a LMS returns a boolean.\n if (typeof suspendSuccess === 'string' && suspendSuccess.toLowerCase() === 'false' || suspendSuccess === false) {\n _pendingScoExitValue = scormConstants.exitStates.complete;\n if (!_ignoreFailedToSuspendError) {\n _scormConfirmCompleteModalView = ScormConfirmCompleteModalView$1.create(_$container, {\n canResumeVideo: true,\n failedToSaveSuspendedData: true\n });\n _scoSessionHasEnded = false;\n return false;\n }\n }\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiSessionTime, getSessionTimeValueByApiVersion());\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiProgressMeasure, _scormModel.percentageComplete);\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiLocation, timeInSecondsAsString);\n if (shouldSubmitQuizScoreToApi()) {\n submitScoreToScormApi();\n }\n if (_scormModel.passingStatus !== scormConstants.status.completed) {\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiSuccessStatus, scoSuccessStatusValue);\n }\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiCompletionStatus, scoCompletionStatusValue);\n _scormApiWrapper.apiCall(scormConstants.fn.commit);\n }\n return true;\n };\n var terminateScormSession = function terminateScormSession() {\n _initialized = false;\n _isDisposed = true;\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiExit, _pendingScoExitValue);\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.adlNavRequest, scormConstants.navRequestStates.exitAll);\n _scormApiWrapper.apiCall(scormConstants.fn.terminate);\n ScormSessionEndedView$1.create(_$container);\n };\n var createNavigationBarView = function createNavigationBarView() {\n _scormNavigationBarView = ScormNavigationBarView$1.create(_$container);\n _scormNavigationBarView.updateView(scoObjectiveHasBeenCompleted());\n _scormApiWrapper.getTitle().then(function (scormTitle) {\n _scormNavigationBarView.setTitle(scormTitle);\n });\n _$container[0].style.setProperty(cssVariables.reservedSizeScorm, SCORM_NAV_CONTAINER_HEIGHT);\n };\n var onExitSessionHandler = function onExitSessionHandler() {\n if (!scoObjectiveHasBeenCompleted()) {\n _scormConfirmCompleteModalView = ScormConfirmCompleteModalView$1.create(_$container, {\n canResumeVideo: canSuspendScormSession(),\n failedToSaveSuspendedData: false\n });\n } else {\n exitScormSession();\n }\n };\n var onExitSessionConfirmedHandler = function onExitSessionConfirmedHandler() {\n _scormConfirmCompleteModalView && _scormConfirmCompleteModalView.destroy();\n _scormConfirmCompleteModalView = null;\n exitScormSession();\n };\n var onExitSessionWithOutProgressConfirmed = function onExitSessionWithOutProgressConfirmed() {\n _ignoreFailedToSuspendError = true;\n onExitSessionConfirmedHandler();\n };\n var initView = function initView($container) {\n _$container = $container;\n if (_scormApiWrapper.apiVersion === scormConstants.versions.NOT_DETECTED) {\n _$container.trigger(events.SCORM.FailedToFindApi);\n return;\n }\n _$container.addClass(cssClasses.scormModule);\n _$container.on(events.SCORM.ExitSession, onExitSessionHandler);\n _$container.on(events.SCORM.ExitSessionConfirmed, onExitSessionConfirmedHandler);\n _$container.on(events.SCORM.ExitSessionWithOutProgressConfirmed, onExitSessionWithOutProgressConfirmed);\n createNavigationBarView();\n };\n var exitScormSession = function exitScormSession() {\n var endedSuccessStatus = endScormSession();\n if (endedSuccessStatus || _ignoreFailedToSuspendError) {\n terminateScormSession();\n _preventWindowClose = false;\n }\n };\n var preventPopUpWindowClose = function preventPopUpWindowClose() {\n try {\n if (window.top && window.top.opener) {\n window.top.onbeforeunload = function () {\n if (_preventWindowClose) {\n return '';\n }\n };\n }\n } catch (e) {\n // eslint-disable-line\n }\n };\n var initializeCompletionStatus = function initializeCompletionStatus() {\n var completionStatus = _scormApiWrapper.apiCall(scormConstants.fn.getValue, scormConstants.dataModelID.cmiCompletionStatus, true);\n if (completionStatus === scormConstants.status.unknown || completionStatus === scormConstants.status.notAttempted) {\n _scormModel.completionStatus = scormConstants.status.incomplete;\n _scormApiWrapper.apiCall(scormConstants.fn.setValue, scormConstants.dataModelID.cmiCompletionStatus, scormConstants.status.incomplete);\n } else {\n _scormModel.completionStatus = completionStatus;\n }\n };\n\n // as a backup, try and terminate the SCORM session if the user did not do it.\n // most likely this will not work with some browsers with some LMSs\n var tryAndTerminateSessionOnPageUnloadIfNeeded = function tryAndTerminateSessionOnPageUnloadIfNeeded() {\n if (!_isDisposed) {\n exitScormSession();\n }\n };\n var init = function init() {\n initializeInternalState();\n _sessionStartTimeInMilliseconds = window.performance.now();\n return _scormApiWrapper.init().then(function (apiResult) {\n if (apiResult === 'false') {\n console.error(_scormApiWrapper.getLastError());\n return;\n }\n preventPopUpWindowClose();\n getSuspendedDataFromAPI();\n initializeCompletionStatus();\n if (_quizModel !== null) {\n submitMinMaxScoreValuesToScormApi();\n }\n window.addEventListener('unload', tryAndTerminateSessionOnPageUnloadIfNeeded);\n _initialized = true;\n });\n };\n\n /**\n * Submit percentage of video watched to SCORM api\n * @function submitVideoWatchedPercentage\n * @memberof TSC.scormController\n * @param {Number} percentageWatched - Percentage of video watched from 0 - 1\n * @param {Number} timeInSeconds - Current time of video in seconds\n */\n var submitVideoWatchedPercentage = function submitVideoWatchedPercentage(percentageWatched, timeInSeconds) {\n if (!_initialized) {\n return;\n }\n // Note: the percentage reported via value reports how much was actually watched\n // and not the percentage of the timeline that the playhead is at.\n // So, for example, if you started up a video and then immediately seeked to\n // the 75% pt, the values reported here would still start from zero.\n _scormModel.percentageComplete = Math.max(0, Math.min(1, percentageWatched));\n _scormModel.videoTimeInSeconds = timeInSeconds;\n if (_scormModel.percentageComplete >= _minimumViewPercentageToCompleteLesson) {\n _scormModel.completionStatus = scormConstants.status.completed;\n }\n if (scoObjectiveHasBeenCompleted()) {\n if (_scormNavigationBarView) {\n _scormNavigationBarView.updateView(true);\n }\n if (playerConfiguration.completeScormOnRequirementsComplete) {\n endScormSession();\n }\n }\n };\n\n /**\n * Submit a score to the SCORM api\n * @memberof TSC.scormController\n * @function submitScore\n * @param {Number} currentScore - Score to report to Scorm\n * @param {Boolean} allQuestionsAnswered - Are all questions answered\n */\n var submitScore = function submitScore(currentScore, allQuestionsAnswered) {\n if (!_initialized) {\n return;\n }\n var scoreNeededToPass = _minimumScoreToPass;\n if (!isNaN(currentScore)) {\n var scoreNeededMultiplier = null;\n var maxPassingScoreValue = null;\n if (_scormApiWrapper.apiVersion === scormConstants.versions.SCORM_2004) {\n scoreNeededMultiplier = 100;\n maxPassingScoreValue = 1;\n } else if (_scormApiWrapper.apiVersion === scormConstants.versions.SCORM_1_2) {\n scoreNeededMultiplier = 1;\n maxPassingScoreValue = 100;\n }\n\n // lms defined mastery level will take precedence over sco defined mastery level\n var lmsPassingScore = _scormApiWrapper.apiCall(scormConstants.fn.getValue, scormConstants.dataModelID.cmiScaledPassingScore);\n if (lmsPassingScore !== null && lmsPassingScore !== '' && lmsPassingScore >= 0 && lmsPassingScore <= maxPassingScoreValue) {\n scoreNeededToPass = lmsPassingScore * scoreNeededMultiplier;\n }\n _scormModel.quizPercentageCorrect = currentScore;\n _scormModel.quizCompletionStatus = allQuestionsAnswered ? scormConstants.status.completed : scormConstants.status.incomplete;\n if (allQuestionsAnswered) {\n if (_quizModel.totalNumberOfGradedQuestionSets === 0) {\n _scormModel.passingStatus = scormConstants.status.completed;\n } else if (currentScore >= scoreNeededToPass) {\n _scormModel.passingStatus = scormConstants.status.passed;\n } else {\n _scormModel.passingStatus = scormConstants.status.failed;\n }\n } else {\n _scormModel.passingStatus = scormConstants.status.unknown;\n }\n if (scoObjectiveHasBeenCompleted()) {\n if (_scormNavigationBarView) {\n _scormNavigationBarView.updateView(true);\n }\n if (playerConfiguration.completeScormOnRequirementsComplete) {\n endScormSession();\n }\n }\n }\n };\n return Object.defineProperties({\n init: init,\n initView: initView,\n submitVideoWatchedPercentage: submitVideoWatchedPercentage,\n submitScore: submitScore\n }, {\n initialized: {\n get: function get() {\n return _initialized;\n }\n },\n initialPercentageComplete: {\n get: function get() {\n return _scormModel.percentageComplete;\n }\n },\n initialVideoAnalyticsSnapshot: {\n get: function get() {\n return _scormModel.videoAnalyticsSnapshot;\n }\n },\n initialQuizModelSnapshot: {\n get: function get() {\n return _scormModel.quizModelSnapshot;\n }\n },\n initialVideoTimeInSeconds: {\n get: function get() {\n return _scormModel.videoTimeInSecondsSnapshot;\n }\n },\n minScoreToPassLesson: {\n get: function get() {\n return _minimumScoreToPass;\n },\n set: function set(minimumScoreToPass) {\n _minimumScoreToPass = minimumScoreToPass;\n }\n },\n minViewPercentageToCompleteLesson: {\n get: function get() {\n return _minimumViewPercentageToCompleteLesson;\n },\n set: function set(minimumViewPercentageToCompleteLesson) {\n _minimumViewPercentageToCompleteLesson = minimumViewPercentageToCompleteLesson;\n }\n },\n quizModel: {\n get: function get() {\n return _quizModel;\n },\n set: function set(quizModel) {\n _quizModel = quizModel;\n }\n },\n scoObjectiveHasBeenCompleted: {\n get: scoObjectiveHasBeenCompleted\n },\n supportsResumeSession: {\n get: canSuspendScormSession\n }\n });\n};\nvar scormController$1 = scormController();\n\nvar quizServiceErrorIds = Object.freeze({\n badDefinition: 'bad_quiz_definition'\n});\n\nvar CONTROL_BAR_HEIGHT = 48;\nvar BOTTOM_PADDING = 14;\n\n/**\n * @memberof TSC\n * @class QuizController\n * @classdesc Quiz Controller manages questions state and views.\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.Quiz} quizModel\n * @param {TSC.BeforeAfterPlayControlsView} beforeAfterPlayControlsView\n * @param {boolean} enforceLinearAssessment\n *\n */\nvar QuizController = function QuizController($container, mediaView, quizModel, beforeAfterPlayControlsView, enforceLinearAssessment) {\n var hasQuiz = !!quizModel;\n if (!hasQuiz) {\n throw new Error('Attempted to create quiz controller with no quiz model');\n }\n var _quizSetupView = null;\n var _currentView = null;\n var _quizModel = null;\n var _retrySubmissionMessageDisplayBar = null;\n var _quizOutOfDateMessageView = null;\n var _quizBadDefinitionMessageView = null;\n var _progressTracker = null;\n var _numberQuestionSets = 0;\n var _currentQuestionSetIndex = 0;\n var _bottomOffset = 0;\n var _pointAt = null;\n var _quizEnabled = true;\n var _quizReady = false;\n var _mediaIsImage = mediaView.type === mediaViewType.image;\n var _lastStatusMessage = '';\n var _questionGrader;\n var _quizUserDetails;\n var _shouldReportViewedOnPageLoad = mediaView.type === mediaViewType.image;\n var _quizSetupPromise;\n var _resolveQuizSetup;\n var getMediaElement = function getMediaElement() {\n return mediaView.mediaElement;\n };\n var submitScoreToScormController = function submitScoreToScormController() {\n if (_quizModel.useScorm) {\n // Built in Scorm support\n if (scormController$1.initialized) {\n scormController$1.submitScore(_quizModel.getScormScore(), _quizModel.isLastQuestionComplete());\n // Legacy Scorm support\n } else if (typeof window.userSubmitToLMS !== 'undefined') {\n window.userSubmitToLMS(_quizModel.getScormScore());\n }\n }\n };\n var onNetworkRetryEvent = function onNetworkRetryEvent() {\n $container.trigger(events.Quizzing.ShowSubmissionRetryMessage);\n };\n var completeQuestionSetEventDispatch = function completeQuestionSetEventDispatch() {\n $container.trigger(events.Quizzing.Complete);\n hotkeyService.enableHotkeys();\n };\n var questionSetCompleteHandler = function questionSetCompleteHandler() {\n _currentQuestionSetIndex = -1;\n _currentView.removeView(true);\n _currentView = null;\n completeQuestionSetEventDispatch();\n };\n var dispatchStatusEvent = function dispatchStatusEvent(ioMessage) {\n _lastStatusMessage = ioMessage;\n $container.trigger(events.Quizzing.Status, {\n message: ioMessage\n });\n };\n var onContinueHandler = function onContinueHandler() {\n $container.off(events.Quizzing.CloseQuestionSetView, onContinueHandler);\n questionSetCompleteHandler();\n };\n var createQuestionSetFeedbackView = function createQuestionSetFeedbackView(needOverlay) {\n var questionSetView = QuestionSetView$1.create($container, _quizModel.questionSets[_currentQuestionSetIndex], needOverlay, _mediaIsImage, true, mediaView.currentTime);\n $container.on(events.Quizzing.CloseQuestionSetView, onContinueHandler);\n _currentView = questionSetView;\n _currentView.showView();\n };\n var continueVideoHandler = function continueVideoHandler() {\n $(reviewAnswersConfirmationView.getContinueControlRef()).off('click', continueVideoHandler);\n $(reviewAnswersConfirmationView.getReviewControlRef()).off('click', initQuestionSetFeedback);\n reviewAnswersConfirmationView.removeView(true);\n _currentView = null;\n completeQuestionSetEventDispatch();\n };\n var initQuestionSetFeedback = function initQuestionSetFeedback() {\n $(reviewAnswersConfirmationView.getContinueControlRef()).off('click', continueVideoHandler);\n $(reviewAnswersConfirmationView.getReviewControlRef()).off('click', initQuestionSetFeedback);\n reviewAnswersConfirmationView.removeView(false);\n _currentView = null;\n createQuestionSetFeedbackView();\n };\n var createReviewAnswersConfirmationView = function createReviewAnswersConfirmationView() {\n var numberCorrectText = null;\n var percentCorrectText = null;\n var numberIncorrectText = null;\n var percentIncorrectText = null;\n var numberCorrect = 0;\n var numberIncorrect = 0;\n var numberUngradable = 0;\n var possibleCorrect = _quizModel.questionSets[_currentQuestionSetIndex].numberGradedQuestions;\n if (possibleCorrect > 0) {\n numberCorrect = _quizModel.questionSets[_currentQuestionSetIndex].numberCorrectQuestions;\n numberIncorrect = possibleCorrect - numberCorrect;\n numberUngradable = _quizModel.questionSets[_currentQuestionSetIndex].numberUngradedQuestions;\n numberCorrectText = localizationStrings.getPlayerString(playerStringNames.txtCorrect).replace('{{numberCorrect}}', numberCorrect);\n percentCorrectText = Math.round(100 * (numberCorrect / possibleCorrect)) + '%';\n numberIncorrectText = localizationStrings.getPlayerString(playerStringNames.txtIncorrect).replace('{{numberIncorrect}}', numberIncorrect);\n percentIncorrectText = Math.round(100 * (numberIncorrect / possibleCorrect)) + '%';\n }\n if (numberUngradable === 1) {\n questionSetReviewStatusView.setUngradeableDetails(numberUngradable + localizationStrings.getPlayerString(playerStringNames.accessBtnWasNotGraded));\n } else {\n questionSetReviewStatusView.setUngradeableDetails(numberUngradable + localizationStrings.getPlayerString(playerStringNames.accessBtnWereNotGraded));\n }\n var markup = reviewAnswersConfirmationView.getViewMarkup(numberCorrectText, percentCorrectText, numberIncorrectText, percentIncorrectText, localizationStrings.getPlayerString(playerStringNames.txtContinue), localizationStrings.getPlayerString(playerStringNames.txtReviewAnswer));\n\n // add view template\n $container.append(markup);\n _currentView = reviewAnswersConfirmationView;\n $(_currentView.getContinueControlRef()).on('click', continueVideoHandler);\n $(_currentView.getReviewControlRef()).on('click', initQuestionSetFeedback);\n\n // fade in view\n _currentView.showView();\n updateViewBottom();\n if (_pointAt !== null) {\n _currentView.pointAt(_pointAt);\n }\n };\n var createQuestionSetReviewStatusView = function createQuestionSetReviewStatusView() {\n var numberCorrect = _quizModel.questionSets[_currentQuestionSetIndex].numberCorrectQuestions;\n var possibleCorrect = _quizModel.questionSets[_currentQuestionSetIndex].numberGradedQuestions;\n var numberUngradable = _quizModel.questionSets[_currentQuestionSetIndex].numberUngradedQuestions;\n questionSetReviewStatusView.setGradeableDetails(numberCorrect + localizationStrings.getPlayerString(playerStringNames.accessBtnCorrectOutOf) + possibleCorrect + localizationStrings.getPlayerString(playerStringNames.accessBtnGradedQuestions));\n if (numberUngradable === 1) {\n questionSetReviewStatusView.setUngradeableDetails(numberUngradable + localizationStrings.getPlayerString(playerStringNames.accessBtnWasNotGraded));\n } else {\n questionSetReviewStatusView.setUngradeableDetails(numberUngradable + localizationStrings.getPlayerString(playerStringNames.accessBtnWereNotGraded));\n }\n var markup = questionSetReviewStatusView.getViewMarkup();\n $container.append(markup);\n _currentView = questionSetReviewStatusView;\n $(questionSetReviewStatusView.getHideAnswersControlRef()).on('click', hideQuizStatus);\n $(questionSetReviewStatusView.getShowAnswersControlRef()).on('click', initFeedbackFromReviewStatusView);\n questionSetReviewStatusView.showView();\n _currentView.updateViewPosition();\n };\n var initFeedbackFromReviewStatusView = function initFeedbackFromReviewStatusView() {\n $(questionSetReviewStatusView.getHideAnswersControlRef()).off('click', hideQuizStatus);\n $(questionSetReviewStatusView.getShowAnswersControlRef()).off('click', initFeedbackFromReviewStatusView);\n questionSetReviewStatusView.removeView(false);\n _currentView = null;\n createQuestionSetFeedbackView();\n };\n var hideQuizStatus = function hideQuizStatus() {\n $container.trigger(events.Quizzing.HideQuiz);\n _currentView.hideView();\n };\n var onRationaleActionHandler = function onRationaleActionHandler(e, data) {\n if (e.type === events.Quizzing.RationaleActionLocation) {\n urlService.openUrl(data.location, '_blank');\n } else if (e.type === events.Quizzing.RationaleActionJumpToTime) {\n $container.off(events.Quizzing.CloseQuestionSetView, onCloseQuestionSetView);\n $container.off(events.Quizzing.SubmitQuestionSet, onSubmit);\n $container.off(events.Quizzing.RationaleActionLocation, onRationaleActionHandler);\n $container.off(events.Quizzing.RationaleActionJumpToTime, onRationaleActionHandler);\n questionSetCompleteHandler();\n }\n };\n var onCloseQuestionSetView = function onCloseQuestionSetView() {\n $container.off(events.Quizzing.CloseQuestionSetView, onCloseQuestionSetView);\n $container.off(events.Quizzing.SubmitQuestionSet, onSubmit);\n $container.off(events.Quizzing.RationaleActionLocation, onRationaleActionHandler);\n $container.off(events.Quizzing.RationaleActionJumpToTime, onRationaleActionHandler);\n $container.trigger(events.Quizzing.Submitted);\n if (_quizModel.questionSets[_currentQuestionSetIndex].displayFeedback) {\n if (_mediaIsImage) {\n $container.trigger(events.Quizzing.TransitionImageQuizToAnswers);\n _currentView.removeView(true);\n createQuestionSetReviewStatusView();\n } else {\n _currentView.removeView(false);\n createReviewAnswersConfirmationView();\n }\n } else {\n questionSetCompleteHandler();\n }\n };\n var submitResults = function submitResults() {\n dispatchStatusEvent(localizationStrings.getPlayerString(playerStringNames.txtSubmittingAnswers));\n quizService.addEventListener(events.Network.Retrying, onNetworkRetryEvent);\n if (_quizModel.useQuizApi) {\n var data = _quizModel.getApiDataForQuestionSet(_currentQuestionSetIndex);\n return quizService.submitQuestionSet(data).then(function (results) {\n quizService.removeEventListener(events.Network.Retrying, onNetworkRetryEvent);\n $container.trigger(events.Quizzing.HideSubmissionRetryMessage);\n if (!_questionGrader.doesLocalGrading && results === undefined) {\n return Promise$1.reject('Failed to get results for question set submission');\n }\n return results;\n });\n }\n return Promise$1.resolve();\n };\n var gradeResults = function gradeResults(results) {\n if (!_questionGrader.doesLocalGrading && results) {\n _questionGrader.processQuestionSetResults(_quizModel.questionSets[_currentQuestionSetIndex], results);\n } else {\n _questionGrader.gradeQuestionSet(_quizModel.questionSets[_currentQuestionSetIndex]);\n }\n return Promise$1.resolve();\n };\n var onGradingComplete = function onGradingComplete() {\n if (_quizModel.useScorm) {\n submitScoreToScormController();\n }\n if (_quizModel.questionSets[_currentQuestionSetIndex].usesRationale) {\n $container.trigger(events.Quizzing.HideLoadingMessage);\n _currentView.showFeedbackForCurrentQuestion();\n } else {\n onCloseQuestionSetView();\n }\n };\n var onSubmit = function onSubmit() {\n submitResults().then(gradeResults).then(onGradingComplete)[\"catch\"](apiErrorEventHandler);\n };\n var createQuestionSetView = function createQuestionSetView(needOverlay) {\n var questionSetView = QuestionSetView$1.create($container, _quizModel.questionSets[_currentQuestionSetIndex], needOverlay, _mediaIsImage, false, mediaView.currentTime);\n if (_quizModel.questionSets[_currentQuestionSetIndex].usesRationale) {\n $container.on(events.Quizzing.SubmitQuestionSet, onSubmit);\n $container.on(events.Quizzing.CloseQuestionSetView, onCloseQuestionSetView);\n $container.on(events.Quizzing.RationaleActionLocation, onRationaleActionHandler);\n $container.on(events.Quizzing.RationaleActionJumpToTime, onRationaleActionHandler);\n } else {\n $container.on(events.Quizzing.SubmitQuestionSet, onSubmit);\n }\n _currentView = questionSetView;\n _currentView.showView();\n $container.trigger(events.Quizzing.ShowQuestionSetView);\n return questionSetView;\n };\n var reviewHandler = function reviewHandler() {\n _currentView.removeView(true);\n _currentView = null;\n $container.trigger(events.Quizzing.Review);\n hotkeyService.enableHotkeys();\n };\n var onViewRemove = function onViewRemove() {\n if (_currentQuestionSetIndex < _numberQuestionSets) {\n createQuestionSetView(false);\n }\n };\n var confirmHandler = function confirmHandler() {\n _currentView.removeView();\n _currentView = null;\n onViewRemove();\n };\n var createConfirmView = function createConfirmView() {\n var reviewText;\n if (enforceLinearAssessment) {\n reviewText = localizationStrings.getPlayerString(playerStringNames.txtReview);\n } else {\n reviewText = localizationStrings.getPlayerString(playerStringNames.txtContinue);\n }\n var markup = questionSetConfirmationView.getViewMarkup(reviewText, localizationStrings.getPlayerString(playerStringNames.txtAnswerQuestion));\n $container.append(markup);\n _currentView = questionSetConfirmationView;\n updateViewBottom();\n if (_quizModel.hideReplay === true) {\n $(questionSetConfirmationView.getReviewControlRef()).hide();\n }\n $(questionSetConfirmationView.getReviewControlRef()).on('click', reviewHandler);\n $(questionSetConfirmationView.getConfirmControlRef()).on('click', confirmHandler);\n questionSetConfirmationView.showView();\n questionSetConfirmationView.updateViewPosition();\n $container.trigger(events.Quizzing.ShowStartQuizPrompt);\n };\n var destroyQuizSetupView = function destroyQuizSetupView() {\n if (_quizSetupView) {\n $container.off(events.Quizzing.BeginClicked, beginQuizHandler);\n $container.off(events.Quizzing.SkipClicked, skipQuizHandler);\n _quizSetupView.destroy();\n if (_quizSetupView.$view) {\n _quizSetupView.$view.remove();\n }\n _quizSetupView = null;\n }\n };\n var beginQuizHandler = function beginQuizHandler(e, eventData) {\n e.preventDefault();\n destroyQuizSetupView();\n hotkeyService.enableHotkeys();\n if (eventData && eventData.firstName) {\n _quizUserDetails = {\n firstName: eventData.firstName,\n lastName: eventData.lastName,\n email: eventData.email\n };\n }\n _resolveQuizSetup();\n if (_shouldReportViewedOnPageLoad) {\n init();\n } else {\n $container.trigger(events.Quizzing.Begin);\n }\n };\n var skipQuizHandler = function skipQuizHandler(e) {\n e.preventDefault();\n _quizEnabled = false;\n destroyQuizSetupView();\n _resolveQuizSetup();\n if (!_shouldReportViewedOnPageLoad) {\n $container.trigger(events.Quizzing.Skip);\n }\n };\n var createSetupView = function createSetupView() {\n beforeAfterPlayControlsView && beforeAfterPlayControlsView.hideVideoClickToPlayLink();\n\n // disable the TOC hotkey, it interferes\n hotkeyService.disableHotkeys();\n _quizSetupView = QuizSetupView$1.create($container);\n $container.on(events.Quizzing.BeginClicked, beginQuizHandler);\n if (_quizModel.allowSkipQuiz && !playerConfiguration.getDisableContinueWithoutQuestions()) {\n $container.on(events.Quizzing.SkipClicked, skipQuizHandler);\n } else {\n _quizSetupView.hideSkipButton();\n }\n $container.trigger(events.Quizzing.ShowQuizSetup);\n };\n var updateViewBottom = function updateViewBottom() {\n if (_currentView && _currentView.setBottomOffset) {\n _currentView.setBottomOffset(_bottomOffset);\n _currentView.updateViewPosition();\n }\n };\n var startQuizApiInstance = function startQuizApiInstance(firstName, lastName, email) {\n if (_quizModel) {\n $container.trigger(events.Quizzing.ShowQuizBar);\n return quizService.startQuizInstance(_quizModel, firstName, lastName, email, playerConfiguration).then(function (responseData) {\n _quizModel.quizInstanceID = responseData.quizInstanceId;\n $container.trigger(events.Quizzing.CreatedInstance);\n })[\"catch\"](function (data) {\n apiErrorEventHandler();\n return Promise$1.reject(data);\n });\n }\n return Promise$1.resolve();\n };\n var apiErrorEventHandler = function apiErrorEventHandler(response) {\n _quizEnabled = false;\n $container.trigger(events.Quizzing.HideLoadingMessage);\n if (response && response.status === statusCodes.UnprocessableEntity) {\n var errorID = response.responseJSON && response.responseJSON.errorId ? response.responseJSON.errorId : null;\n if (errorID && errorID === quizServiceErrorIds.badDefinition) {\n $container.trigger(events.Quizzing.QuizBadDefinition);\n } else {\n $container.trigger(events.Quizzing.QuizIsOutOfDate);\n }\n } else {\n $container.trigger(events.Quizzing.Error);\n }\n };\n var displaySetupView = function displaySetupView() {\n return _quizModel && _quizModel.quizID && !_mediaIsImage && _quizEnabled && _quizModel.requireUserId && !playerConfiguration.getIsUserIdentified();\n };\n var gatherSetupIfNeeded = function gatherSetupIfNeeded() {\n if (displaySetupView()) {\n createSetupView();\n }\n };\n var getLastStatusMessage = function getLastStatusMessage() {\n return _lastStatusMessage;\n };\n var removeSubmissionRetryMessage = function removeSubmissionRetryMessage() {\n if (_retrySubmissionMessageDisplayBar === null) {\n return;\n }\n _retrySubmissionMessageDisplayBar.remove();\n _retrySubmissionMessageDisplayBar = null;\n };\n var showSubmissionRetryMessage = function showSubmissionRetryMessage() {\n if (_retrySubmissionMessageDisplayBar !== null) {\n return;\n }\n _retrySubmissionMessageDisplayBar = MessageBarView$1.create($container, messageBarType.info, localizationStrings.getPlayerString(playerStringNames.txtQuizErrorMessage));\n };\n var showQuizIsOutOfDateMessage = function showQuizIsOutOfDateMessage() {\n _quizOutOfDateMessageView = MessageBarView$1.create($container, messageBarType.warning, localizationStrings.getPlayerString(playerStringNames.txtQuizOutOfDateMessage), localizationStrings.getPlayerString(playerStringNames.txtQuizOutOfDateRefreshButtonText), function () {\n window.location.reload();\n });\n };\n var showQuizBadDefinitionMessage = function showQuizBadDefinitionMessage() {\n _quizBadDefinitionMessageView = MessageBarView$1.create($container, messageBarType.warning, localizationStrings.getPlayerString(playerStringNames.txtQuizBadDefinitionMessage));\n };\n var displayNextQuestionSet = function displayNextQuestionSet() {\n if (_currentQuestionSetIndex < _numberQuestionSets) {\n return createQuestionSetView(true);\n }\n };\n var hasMultipleQuestionSets = function hasMultipleQuestionSets() {\n return _numberQuestionSets > 1;\n };\n var hasQuizQuestions = function hasQuizQuestions() {\n return _numberQuestionSets > 0;\n };\n var findQuestionSet = function findQuestionSet(time) {\n var activeQuestionSetId = -1;\n var markerTime = -1;\n if (!playerConfiguration.ignoreQuizQuestions) {\n var markers = _quizModel.questionSetMarkerTimes;\n var numberMarkers = markers.length;\n for (var i = 0; i < numberMarkers; i++) {\n if (!markers[i].completed && (enforceLinearAssessment && markers[i].startTime <= time && !markers[i].canSeekPast || markers[i].rangeStart <= time && time <= markers[i].rangeEnd)) {\n activeQuestionSetId = markers[i].questionSetIndex;\n markerTime = markers[i].startTime;\n break;\n }\n }\n }\n return {\n id: activeQuestionSetId,\n markerTime: markerTime\n };\n };\n var findPrevMarkerTimeForMarker = function findPrevMarkerTimeForMarker(questionSetIndex) {\n return _quizModel.getPreviousMarkerTimeForMarker(questionSetIndex);\n };\n var updatePercentWatchedForQuestionSet = function updatePercentWatchedForQuestionSet(questionSetId, percentWatched) {\n _quizModel.questionSets[questionSetId].percentOfVideoSegmentWatched = percentWatched;\n };\n var displayConfirm = function displayConfirm(questionSetIndex) {\n if (!_currentView) {\n _currentQuestionSetIndex = questionSetIndex;\n hotkeyService.disableHotkeys();\n\n // no need to display confirm view if we are in the beginning of the video and force linear is on or if we are in the middle of a rationale quiz\n if (enforceLinearAssessment && _quizModel.questionSets[questionSetIndex].startTime <= _quizModel.minMarkerTimeDiff || _quizModel.questionSets[questionSetIndex].inProgress) {\n createQuestionSetView(true);\n } else {\n createConfirmView();\n }\n }\n };\n var showQuiz = function showQuiz() {\n if (_currentView === null) {\n createQuestionSetView(true);\n } else {\n _currentView.showView();\n }\n };\n var hideQuiz = function hideQuiz() {\n _currentView.hideView();\n };\n var pointViewAt = function pointViewAt(xPos) {\n _pointAt = xPos;\n if (_currentView) {\n if (_currentView.pointAt) {\n _currentView.pointAt(_pointAt);\n }\n updateViewBottom();\n }\n };\n var setViewControlBarOffset = function setViewControlBarOffset(bottom) {\n _bottomOffset = bottom + BOTTOM_PADDING;\n updateViewBottom();\n };\n var setQuestionGrader = function setQuestionGrader(grader) {\n switch (grader) {\n case questionGrader.FATHOM:\n {\n _questionGrader = fathomGrader;\n break;\n }\n case questionGrader.XMP:\n {\n _questionGrader = xmpGrader;\n break;\n }\n default:\n throw new Error('Grader type not recognized');\n }\n };\n var startTrackingProgress = function startTrackingProgress() {\n if (_shouldReportViewedOnPageLoad) {\n return Promise$1.resolve();\n }\n return quizService.getAnalyticsRate().then(function (results) {\n _progressTracker = QuizProgressTracker$1.create(getMediaElement(), results.analyticsSampleRate, results.reportingRate);\n return Promise$1.resolve();\n });\n };\n var forceProgressUpdate = function forceProgressUpdate(sampleRateInMilliseconds, segmentsCompleted) {\n return quizService.sendProgress(sampleRateInMilliseconds, segmentsCompleted);\n };\n var onMediaFirstPlayerHandler = function onMediaFirstPlayerHandler() {\n init();\n };\n var onMediaControlsReady = function onMediaControlsReady() {\n // do not listen to another media controls ready event\n $container.off(events.Player.MediaControlsReady, onMediaControlsReady);\n setViewControlBarOffset(CONTROL_BAR_HEIGHT);\n if (!_shouldReportViewedOnPageLoad && !_mediaIsImage && _quizModel.useQuizApi && _quizModel.requireUserId && !playerConfiguration.getIsUserIdentified() && !playerConfiguration.ignoreQuizQuestions) {\n createSetupView();\n } else {\n _resolveQuizSetup();\n }\n };\n var bindToEvents = function bindToEvents() {\n $container.on(events.Media.FirstPlay, onMediaFirstPlayerHandler);\n $container.on(events.Player.MediaControlsReady, onMediaControlsReady);\n $container.on(events.Quizzing.ShowSubmissionRetryMessage, showSubmissionRetryMessage);\n $container.on(events.Quizzing.HideSubmissionRetryMessage, removeSubmissionRetryMessage);\n $container.on(events.Quizzing.QuizIsOutOfDate, showQuizIsOutOfDateMessage);\n $container.on(events.Quizzing.QuizBadDefinition, showQuizBadDefinitionMessage);\n };\n var destroy = function destroy() {\n destroyQuizSetupView();\n if (_currentView) {\n _currentView.removeView(true);\n _currentView = null;\n }\n quizService.abortPendingRequests();\n if ($container) {\n $container.off(events.Media.FirstPlay, onMediaFirstPlayerHandler);\n $container.off(events.Player.MediaControlsReady, onMediaControlsReady);\n $container.off(events.Quizzing.ShowSubmissionRetryMessage, showSubmissionRetryMessage);\n $container.off(events.Quizzing.HideSubmissionRetryMessage, removeSubmissionRetryMessage);\n $container.off(events.Quizzing.QuizIsOutOfDate, showQuizIsOutOfDateMessage);\n $container.off(events.Quizzing.QuizBadDefinition, showQuizBadDefinitionMessage);\n $container.off(events.Quizzing.SubmitQuestionSet, onSubmit);\n $container.off(events.Quizzing.CloseQuestionSetView, onCloseQuestionSetView);\n $container.off(events.Quizzing.RationaleActionLocation, onRationaleActionHandler);\n $container.off(events.Quizzing.RationaleActionJumpToTime, onRationaleActionHandler);\n }\n _progressTracker && _progressTracker.destroy();\n removeSubmissionRetryMessage();\n _quizOutOfDateMessageView && _quizOutOfDateMessageView.remove();\n _quizBadDefinitionMessageView && _quizBadDefinitionMessageView.remove();\n _quizModel = null;\n _numberQuestionSets = 0;\n _currentQuestionSetIndex = 0;\n _bottomOffset = 0;\n _pointAt = null;\n _quizEnabled = true;\n _quizReady = false;\n _mediaIsImage = false;\n _lastStatusMessage = '';\n _questionGrader = null;\n _quizSetupPromise = null;\n };\n var init = function init() {\n if (_quizModel.useQuizApi) {\n var startInstancePromise;\n if (_quizUserDetails) {\n startInstancePromise = startQuizApiInstance(_quizUserDetails.firstName, _quizUserDetails.lastName, _quizUserDetails.email);\n } else {\n startInstancePromise = startQuizApiInstance();\n }\n startInstancePromise[\"catch\"](function (e) {\n log.logException('Failed to initialize quiz - ' + e);\n });\n } else {\n $container.trigger(events.Quizzing.CreatedInstance);\n }\n _quizReady = true;\n };\n var simpleInit = function simpleInit() {\n if (!displaySetupView()) {\n startQuizApiInstance()[\"catch\"](function (e) {\n log.logException('Failed to initialize quiz - ' + e);\n });\n }\n };\n var populateQuizModel = function populateQuizModel(suspendedQuizData) {\n _quizModel.populateQuiz(suspendedQuizData);\n submitScoreToScormController();\n };\n var setQuizModel = function setQuizModel(newQuizModel) {\n _quizModel = newQuizModel;\n _numberQuestionSets = _quizModel.numberQuestionSets;\n scormController$1.quizModel = _quizModel;\n };\n\n // begin initialization of quiz controller\n _quizSetupPromise = new Promise$1(function (resolveQuizSetup) {\n _resolveQuizSetup = resolveQuizSetup;\n });\n setQuizModel(quizModel);\n bindToEvents();\n if (playerConfiguration.getFathomId()) {\n setQuestionGrader(questionGrader.FATHOM);\n } else {\n setQuestionGrader(questionGrader.XMP);\n }\n if (_shouldReportViewedOnPageLoad) {\n gatherSetupIfNeeded();\n simpleInit();\n forceProgressUpdate(100, [0]);\n }\n var fullControlsAreShownOnPageLoad = playerConfiguration.getPreload() === preloadOptions.metadata && mediaView.type !== mediaViewType.youtube;\n if (fullControlsAreShownOnPageLoad) {\n onMediaControlsReady();\n }\n return Object.defineProperties({\n destroy: destroy,\n hasMultipleQuestionSets: hasMultipleQuestionSets,\n getLastStatusMessage: getLastStatusMessage,\n displayNextQuestionSet: displayNextQuestionSet,\n findQuestionSet: findQuestionSet,\n findPrevMarkerTimeForMarker: findPrevMarkerTimeForMarker,\n updatePercentWatchedForQuestionSet: updatePercentWatchedForQuestionSet,\n displayConfirm: displayConfirm,\n showQuiz: showQuiz,\n hideQuiz: hideQuiz,\n pointViewAt: pointViewAt,\n startTrackingProgress: startTrackingProgress,\n forceProgressUpdate: forceProgressUpdate,\n populateQuizModel: populateQuizModel\n }, {\n quizIsSetupPromise: {\n get: function get() {\n return _quizSetupPromise;\n }\n },\n quizEnabled: {\n get: function get() {\n return _quizEnabled;\n },\n set: function set(value) {\n _quizEnabled = value;\n }\n },\n quizReady: {\n get: function get() {\n return _quizReady;\n }\n },\n hasQuiz: {\n get: function get() {\n return _quizModel && _quizModel.quizID;\n }\n },\n viewIsOpen: {\n get: function get() {\n return _currentView !== null;\n }\n },\n mediaIsImage: {\n set: function set(mediaIsImage) {\n _mediaIsImage = mediaIsImage;\n },\n get: function get() {\n return _mediaIsImage;\n }\n },\n quizModel: {\n get: function get() {\n return _quizModel;\n },\n set: setQuizModel\n },\n hasQuizQuestions: {\n get: hasQuizQuestions\n }\n });\n};\nvar QuizController$1 = {\n /**\n * Factory method that returns a new QuizController.\n * @function create\n * @memberof TSC.QuizController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.Quiz} quizModel\n * @param {TSC.BeforeAfterPlayControlsView} beforeAfterPlayControlsView\n * @param {boolean} enforceLinearAssessment\n * @return new QuizController instance\n */\n create: QuizController\n};\n\nvar SEEK_DELAY_IN_MILLISECONDS = 100;\n\n/**\n * @memberof TSC\n * @class QuizEventController\n * @classdesc Controller for managing quiz events\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.QuizController} quizController\n * @param {TSC.ProgressBarControlView} progressBarControlView\n * @param {boolean} enforceLinearAssessment\n * @param {TSC.IoOverlayView} ioOverlayView - IO Overlay View used to show the user messages\n *\n */\nvar QuizEventController = function QuizEventController($container, mediaView, quizController, progressBarControlView, enforceLinearAssessment, ioOverlayView) {\n if (!quizController) {\n throw new Error('Attempted to create quiz event controller with no quiz controller');\n }\n var _lastQuestionSetId;\n var _lastQuestionSetMarkerTime;\n var _quizzingErrorMessageBarView;\n var _isScrubbing = false;\n var updateQuizPointAtPosition = function updateQuizPointAtPosition() {\n if (!progressBarControlView) {\n return;\n }\n var playerXOffset = $container.offset().left;\n var markerXPosition = progressBarControlView.getXPositionForQuestionSetMarker(_lastQuestionSetId);\n var pointAtXPosition = markerXPosition - playerXOffset;\n quizController.pointViewAt(pointAtXPosition);\n };\n var seekToTime = function seekToTime(seekTime, playAfterSeek) {\n var safeSeekTime = videoApiUtils.getSafeSeekTime(mediaView.mediaElement, seekTime);\n $container.trigger(events.Media.SeekToTime, {\n time: safeSeekTime,\n playAfterSeek: playAfterSeek\n });\n };\n var updateQuizzing = function updateQuizzing(currentTimeInMilliseconds) {\n if (!quizController.quizEnabled || _isScrubbing) {\n return;\n }\n var numberMillisecondsInSecond = 1000;\n var qs = quizController.findQuestionSet(currentTimeInMilliseconds);\n if (qs.id < 0) {\n _lastQuestionSetId = -1;\n return;\n }\n if (_lastQuestionSetId !== qs.id) {\n viewHelper.saveActiveElement();\n // make sure control bar is shown up and auto hide is disabled.\n $container.trigger(events.Controls.Disable);\n $container.trigger(events.Controls.HideToc);\n _lastQuestionSetId = qs.id;\n _lastQuestionSetMarkerTime = qs.markerTime / numberMillisecondsInSecond;\n $container.playerState.pausedForQuiz = true;\n mediaView.mediaElement.pause();\n $container.trigger(events.Quizzing.Paused);\n\n // Try pausing and seeking YouTube until player confirms the video is in the correct position\n // Fixes issues with YouTube video playing in the background\n if (mediaView.type === mediaViewType.youtube) {\n var intervalId = setInterval(function () {\n mediaView.mediaElement.pause();\n seekToTime(_lastQuestionSetMarkerTime, false);\n if (mediaView.mediaElement.currentTime.toFixed(4) === _lastQuestionSetMarkerTime.toFixed(4) && mediaView.mediaElement.paused) {\n clearInterval(intervalId);\n }\n }, SEEK_DELAY_IN_MILLISECONDS);\n } else {\n setTimeout(function () {\n seekToTime(_lastQuestionSetMarkerTime, false);\n }, SEEK_DELAY_IN_MILLISECONDS);\n }\n quizController.displayConfirm(qs.id);\n updateQuizPointAtPosition();\n if (videoAnalytics.isEnabled()) {\n if (!isNaN(qs.markerTime) && videoAnalytics.isPercentWatchedInitialized()) {\n videoAnalytics.markTimeWatched(qs.markerTime);\n } else {\n log.logMessage('Player-view: videoAnalytics percent watched not initialized, or Quiz Marker time is NaN (' + qs.markerTime + ')');\n }\n var percentWatched = videoAnalytics.getPercentageWatchedForVideoSegment(quizController.findPrevMarkerTimeForMarker(qs.id), qs.markerTime);\n quizController.updatePercentWatchedForQuestionSet(_lastQuestionSetId, percentWatched);\n }\n }\n };\n var quizEventHandler = function quizEventHandler(event, data) {\n switch (event.type) {\n case events.Quizzing.ShowStartQuizPrompt:\n case events.Quizzing.ShowQuestionSetView:\n $container.trigger(events.Quizzing.MaximizeUI);\n $container.trigger(events.Quizzing.UIVisible);\n break;\n case events.Quizzing.Complete:\n case events.Quizzing.Review:\n $container.trigger(events.Quizzing.UIHidden);\n $container.trigger(events.Controls.Enable);\n viewHelper.focusPreviousElement();\n progressBarControlView.updateQuizMarkers();\n $container.playerState.pausedForQuiz = false;\n if (event.type === events.Quizzing.Review && enforceLinearAssessment) {\n var prevMarkerTimeInSeconds = quizController.findPrevMarkerTimeForMarker(_lastQuestionSetId) / 1000;\n _lastQuestionSetId = -1;\n seekToTime(prevMarkerTimeInSeconds, true);\n } else {\n mediaView.mediaElement.play();\n }\n break;\n case events.Quizzing.Begin:\n progressBarControlView.updateQuizMarkers();\n $container.trigger(events.Quizzing.QuizSetupComplete);\n break;\n case events.Quizzing.Skip:\n progressBarControlView.setShouldRespectQuizMarkers(false);\n $container.trigger(events.Quizzing.QuizSetupComplete);\n break;\n case events.Quizzing.Error:\n _quizzingErrorMessageBarView = MessageBarView$1.create($container, messageBarType.info, localizationStrings.getPlayerString(playerStringNames.txtVideoQuizNetworkErrorMessage), localizationStrings.getPlayerString(playerStringNames.close));\n break;\n case events.Quizzing.Status:\n ioOverlayView.displayMessage(data.message);\n break;\n case events.Quizzing.HideLoadingMessage:\n case events.Quizzing.Submitted:\n ioOverlayView.hideView();\n break;\n case events.Quizzing.CreatedInstance:\n progressBarControlView && progressBarControlView.updateQuizMarkers();\n if (quizController.hasQuiz && quizController.quizModel.quizInstanceID) {\n quizController.startTrackingProgress();\n var eventLabel = 'QIID_' + quizController.quizModel.quizInstanceID;\n mediaView.playbackQualityMetrics && mediaView.playbackQualityMetrics.setEventLabel(eventLabel);\n }\n $container.trigger(events.Quizzing.UIHidden);\n break;\n case events.Quizzing.RationaleActionJumpToTime:\n var jumpToTimeInSeconds = data.jumpToTime / 1000;\n progressBarControlView.allowSkipQuestionSetMarkersBeforeTime(jumpToTimeInSeconds);\n seekToTime(jumpToTimeInSeconds);\n break;\n }\n };\n var onLoadedMetadata = function onLoadedMetadata() {\n // check to see if quiz exists and it is ready to rumble\n if (!quizController.hasQuiz || quizController.hasQuiz && (!quizController.quizEnabled || quizController.quizReady)) {\n ioOverlayView.hideView();\n } else {\n // update overlay with status of quiz code\n var lastStatusMessage = quizController.getLastStatusMessage();\n if (lastStatusMessage) {\n mediaView.mediaElement.pause();\n ioOverlayView.displayMessage(lastStatusMessage);\n }\n }\n };\n var onVideoTimeUpdate = function onVideoTimeUpdate() {\n updateQuizzing(mediaView.currentTimeInMilliseconds);\n };\n var onSeeked = function onSeeked() {\n updateQuizzing(mediaView.currentTimeInMilliseconds);\n };\n var onVideoControlsVisible = function onVideoControlsVisible() {\n progressBarControlView.updateQuizMarkers();\n };\n var onScrubbingStarted = function onScrubbingStarted() {\n _isScrubbing = true;\n };\n var onScrubbingEnded = function onScrubbingEnded() {\n _isScrubbing = false;\n onVideoTimeUpdate();\n };\n var bindToEvents = function bindToEvents() {\n mediaView.mediaWrapper.on('ratechange', onVideoTimeUpdate, false);\n mediaView.mediaWrapper.on('play', onVideoTimeUpdate, false);\n var eventsToBind = {\n loadedmetadata: onLoadedMetadata,\n timeupdate: onVideoTimeUpdate,\n seeked: onSeeked\n };\n mediaView.mediaWrapper.on(eventsToBind);\n $container.on(events.Controls.VideoControlsVisible, onVideoControlsVisible);\n $container.on(events.Controls.PlayerResize, updateQuizPointAtPosition);\n $container.on(events.Quizzing.Complete, quizEventHandler);\n $container.on(events.Quizzing.Review, quizEventHandler);\n $container.on(events.Quizzing.Begin, quizEventHandler);\n $container.on(events.Quizzing.Skip, quizEventHandler);\n $container.on(events.Quizzing.Error, quizEventHandler);\n $container.on(events.Quizzing.Status, quizEventHandler);\n $container.on(events.Quizzing.SubmittingInstance, quizEventHandler);\n $container.on(events.Quizzing.Submitted, quizEventHandler);\n $container.on(events.Quizzing.CreatedInstance, quizEventHandler);\n $container.on(events.Quizzing.RationaleActionJumpToTime, quizEventHandler);\n $container.on(events.Quizzing.HideLoadingMessage, quizEventHandler);\n $container.on(events.Quizzing.ShowStartQuizPrompt, quizEventHandler);\n $container.on(events.Quizzing.ShowQuestionSetView, quizEventHandler);\n $container.on(events.Scrubbing.Started, onScrubbingStarted);\n $container.on(events.Scrubbing.Ended, onScrubbingEnded);\n };\n var unbindToEvents = function unbindToEvents() {\n mediaView.mediaWrapper.off('ratechange', onVideoTimeUpdate, false);\n mediaView.mediaWrapper.off('play', onVideoTimeUpdate, false);\n var eventsToBind = {\n loadedmetadata: onLoadedMetadata,\n timeupdate: onVideoTimeUpdate,\n seeked: onSeeked\n };\n mediaView.mediaWrapper.off(eventsToBind);\n $container.off(events.Controls.VideoControlsVisible, onVideoControlsVisible);\n $container.off(events.Controls.PlayerResize, updateQuizPointAtPosition);\n $container.off(events.Quizzing.Complete, quizEventHandler);\n $container.off(events.Quizzing.Review, quizEventHandler);\n $container.off(events.Quizzing.Begin, quizEventHandler);\n $container.off(events.Quizzing.Skip, quizEventHandler);\n $container.off(events.Quizzing.Error, quizEventHandler);\n $container.off(events.Quizzing.Status, quizEventHandler);\n $container.off(events.Quizzing.SubmittingInstance, quizEventHandler);\n $container.off(events.Quizzing.Submitted, quizEventHandler);\n $container.off(events.Quizzing.CreatedInstance, quizEventHandler);\n $container.off(events.Quizzing.RationaleActionJumpToTime, quizEventHandler);\n $container.off(events.Quizzing.HideLoadingMessage, quizEventHandler);\n $container.off(events.Quizzing.ShowStartQuizPrompt, quizEventHandler);\n $container.off(events.Quizzing.ShowQuestionSetView, quizEventHandler);\n $container.off(events.Scrubbing.Started, onScrubbingStarted);\n $container.off(events.Scrubbing.Ended, onScrubbingEnded);\n };\n var destroy = function destroy() {\n unbindToEvents();\n _quizzingErrorMessageBarView && _quizzingErrorMessageBarView.remove();\n };\n videoApiUtils.setQuizController(quizController);\n progressBarControlView && progressBarControlView.setShouldRespectQuizMarkers(quizController.quizModel && quizController.quizEnabled && !playerConfiguration.ignoreQuizQuestions);\n quizController.mediaIsImage = mediaView.type === mediaViewType.image;\n bindToEvents();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar QuizEventController$1 = {\n /**\n * Factory method that returns a new QuizEventController.\n * @function create\n * @memberof TSC.QuizEventController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.QuizController} quizController\n * @param {TSC.ProgressBarControlView} progressBarControlView\n * @param {boolean} enforceLinearAssessment\n * @param {TSC.IoOverlayView} ioOverlayView - IO Overlay View used to show the user messages\n * @return new QuizEventController instance\n */\n create: QuizEventController\n};\n\nvar EVENT_PERCENT_WATCH_INC = 10;\nvar MAX_PERCENT = 100;\n\n/**\n * @memberof TSC\n * @class MediaAnalyticsController\n * @classdesc Controller for managing media analytics\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.MediaList} mediaList\n * @param {TSC.QuizController} quizController\n * @param {TSC.playerConfiguration} playerConfiguration\n */\nvar MediaAnalyticsController = function MediaAnalyticsController($container, mediaView, mediaList, quizController, playerConfiguration) {\n var _eventPlayTracking = true;\n var _eventLastPercentReported = 0;\n var doesSCORMModuleNeedToResumeLastTime = function doesSCORMModuleNeedToResumeLastTime() {\n return mediaView.supportsSCORM && playerConfiguration.isScormLesson && scormController$1.supportsResumeSession && scormController$1.initialVideoTimeInSeconds > 0;\n };\n var initVideoAnalytics = function initVideoAnalytics() {\n videoAnalytics.initPercentWatched(mediaView.mediaElement.duration * 1000);\n if (doesSCORMModuleNeedToResumeLastTime()) {\n resumeSCORMSession(scormController$1.initialVideoTimeInSeconds, scormController$1.initialVideoAnalyticsSnapshot);\n $container.trigger(events.Media.SeekToTime, {\n time: scormController$1.initialVideoTimeInSeconds,\n playAfterSeek: true\n });\n }\n };\n var updateAnalytics = function updateAnalytics(currentTimeInMilliseconds) {\n if (!mediaView.mediaElement.duration) {\n return;\n }\n if (!videoAnalytics.isEnabled()) {\n return;\n }\n if (!videoAnalytics.isPercentWatchedInitialized()) {\n initVideoAnalytics();\n }\n if (!isNaN(currentTimeInMilliseconds)) {\n videoAnalytics.markTimeWatched(currentTimeInMilliseconds);\n } else {\n log.logMessage('Player-view: currentTime is NaN (' + currentTimeInMilliseconds + ')');\n }\n var percentWatched = Math.round(videoAnalytics.getPercentageWatched() * 100);\n if (scormController$1.initialized) {\n scormController$1.submitVideoWatchedPercentage(0.01 * percentWatched, videoAnalytics.getCurrentPlayTime());\n }\n if (playerConfiguration.getTrackEvents()) {\n if (percentWatched >= _eventLastPercentReported + EVENT_PERCENT_WATCH_INC) {\n while (_eventLastPercentReported + EVENT_PERCENT_WATCH_INC <= percentWatched) {\n _eventLastPercentReported += EVENT_PERCENT_WATCH_INC;\n if (_eventLastPercentReported > MAX_PERCENT) {\n _eventLastPercentReported = MAX_PERCENT;\n }\n analyticsService.sendEvent(events.Analytics.VideoPercentViewed, 'Viewed: ' + _eventLastPercentReported + ' Percent');\n analyticsService.sendGA4Event(events.GA4.VideoPercentViewed, {\n percent_viewed: _eventLastPercentReported\n }); // eslint-disable-line\n }\n }\n }\n };\n var handleTimeUpdate = function handleTimeUpdate(currentTimeInMilliseconds) {\n if (videoAnalytics.isEnabled()) {\n updateAnalytics(currentTimeInMilliseconds);\n }\n };\n var onVideoTimeUpdate = function onVideoTimeUpdate() {\n handleTimeUpdate(mediaView.currentTimeInMilliseconds);\n };\n var onSeeked = function onSeeked() {\n handleTimeUpdate(mediaView.currentTimeInMilliseconds);\n };\n var onCanPlayVideo = function onCanPlayVideo() {\n if (videoAnalytics.isEnabled()) {\n videoAnalytics.setVideoLoadEndTime(new Date().getTime());\n if (playerConfiguration.getTrackEvents()) {\n var eventAction = playerConfiguration.getAltEventCategoryAsFilename() ? analyticsService.getCategory() : mediaList.currentMedia.uri;\n if (playerConfiguration.getAltLoadTimeAsSeconds()) {\n analyticsService.sendEvent(events.Analytics.VideoLoadingTimeInSeconds, eventAction, videoAnalytics.getVideoLoadTime() / 1000);\n analyticsService.sendGA4Event(events.GA4.VideoLoadingTimeInSeconds, {\n loading_duration: videoAnalytics.getVideoLoadTime() / 1000\n }); // eslint-disable-line\n } else {\n analyticsService.sendEvent(events.Analytics.VideoLoadingTime, eventAction, videoAnalytics.getVideoLoadTime());\n analyticsService.sendGA4Event(events.GA4.VideoLoadingTime, {\n loading_duration: videoAnalytics.getVideoLoadTime()\n }); // eslint-disable-line\n }\n }\n }\n mediaView.mediaWrapper.off('canplay', onCanPlayVideo);\n };\n var resetPlayStartAnalytics = function resetPlayStartAnalytics() {\n if (videoAnalytics.isEnabled()) {\n videoAnalytics.setVideoLoadStartTime(new Date().getTime());\n }\n if (playerConfiguration.getTrackEvents() && _eventPlayTracking) {\n _eventPlayTracking = false;\n var videoStartedEventAction = playerConfiguration.getAltEventCategoryAsFilename() ? analyticsService.getCategory() : mediaList.currentMedia.uri;\n analyticsService.sendEvent(events.Analytics.VideoStarted, videoStartedEventAction);\n analyticsService.sendEvent(events.Analytics.VideoPercentViewed, 'Viewed: 0 Percent');\n analyticsService.sendGA4Event(events.GA4.VideoStarted, null);\n analyticsService.sendGA4Event(events.GA4.VideoPercentViewed, {\n percent_viewed: 0\n }); // eslint-disable-line\n }\n };\n var onMediaEnd = function onMediaEnd(e, eventData) {\n if (eventData.isPlaybackEnded && playerConfiguration.getTrackEvents()) {\n analyticsService.sendEvent(events.Analytics.VideoFinishedAction, playerConfiguration.getEndActionParam());\n analyticsService.sendGA4Event(events.GA4.VideoFinishedAction, {\n finished_action: playerConfiguration.getEndActionParam()\n }); // eslint-disable-line\n }\n };\n var onVideoReplayHandler = function onVideoReplayHandler() {\n if (playerConfiguration.getTrackEvents()) {\n var eventAction = playerConfiguration.getAltEventCategoryAsFilename() ? analyticsService.getCategory() : mediaList.currentMedia.uri;\n analyticsService.sendEvent(events.Analytics.VideoReplay, eventAction);\n analyticsService.sendGA4Event(events.GA4.VideoReplay, null);\n }\n };\n var onMediaWrapperMediaEnd = function onMediaWrapperMediaEnd() {\n if (playerConfiguration.getTrackEvents()) {\n var eventAction = playerConfiguration.getAltEventCategoryAsFilename() ? analyticsService.getCategory() : mediaList.currentMedia.uri;\n analyticsService.sendEvent(events.Analytics.VideoFinished, eventAction);\n analyticsService.sendGA4Event(events.GA4.VideoFinished, null);\n }\n };\n var onOpenExternalLink = function onOpenExternalLink() {\n var eventAction = playerConfiguration.getAltEventCategoryAsFilename() ? analyticsService.getCategory() : mediaList.currentMedia.uri;\n analyticsService.sendEvent(events.Analytics.OpenExternalLinkView, eventAction);\n analyticsService.sendGA4Event(events.GA4.OpenExternalLinkView, null);\n };\n var onClickExternalLink = function onClickExternalLink() {\n var eventAction = playerConfiguration.getAltEventCategoryAsFilename() ? analyticsService.getCategory() : mediaList.currentMedia.uri;\n analyticsService.sendEvent(events.Analytics.OpenExternalLinkClick, eventAction);\n analyticsService.sendGA4Event(events.GA4.OpenExternalLinkClick, null);\n };\n var resumeSCORMSession = function resumeSCORMSession(initialVideoTimeInSeconds, initialVideoAnalyticsSnapshot) {\n videoAnalytics.populateVideoSegmentsWatch(initialVideoAnalyticsSnapshot);\n videoAnalytics.markTimeWatched(initialVideoTimeInSeconds * 1000);\n };\n var onStartedPlayback = function onStartedPlayback() {\n var quizRequiresAnalytics = quizController && quizController.hasQuiz && quizController.quizEnabled;\n var playerConfigurationRequiresAnalytics = playerConfiguration.getTrackEvents() || playerConfiguration.isScormLesson || playerConfiguration.getReportScormComplete() || quizRequiresAnalytics;\n var shouldTrackVideoAnalytics = !mediaList.isPlaylist && playerConfigurationRequiresAnalytics;\n if (shouldTrackVideoAnalytics) {\n videoAnalytics.setEnabled(true);\n }\n };\n var onPlayerInitialized = function onPlayerInitialized() {\n performanceWrapper.createMeasure(events.Timing.PlayerLoaded, events.Timing.PlayerLoaded);\n performanceWrapper.createMeasure(events.Timing.PlayerInitialized, events.Timing.PlayerInitialized);\n analyticsService.sendEvent(events.Analytics.ContentLoaded, mediaList.currentMedia.uri);\n analyticsService.sendGA4Event(events.GA4.PlayerInitialized, null);\n };\n var bindToEvents = function bindToEvents() {\n $container.on(events.Controls.StartedPlayback, onStartedPlayback);\n $container.on(events.Controls.PlayerInitialized, onPlayerInitialized);\n $container.on(events.Media.End, onMediaEnd);\n $container.on(events.Media.Replay, onVideoReplayHandler);\n $container.on(events.ExternalLinkView.Open, onOpenExternalLink);\n $container.on(events.ExternalLinkView.Clicked, onClickExternalLink);\n mediaView.mediaWrapper.on('ratechange', onVideoTimeUpdate, false);\n mediaView.mediaWrapper.on('play', onVideoTimeUpdate, false);\n var eventsToBind = {\n timeupdate: onVideoTimeUpdate,\n canplay: onCanPlayVideo,\n seeked: onSeeked,\n ended: onMediaWrapperMediaEnd\n };\n mediaView.mediaWrapper.on(eventsToBind);\n mediaView.mediaElement.addEventListener(events.Media.Play, resetPlayStartAnalytics);\n };\n var unbindToEvents = function unbindToEvents() {\n $container.off(events.Controls.StartedPlayback, onStartedPlayback);\n $container.off(events.Controls.PlayerInitialized, onPlayerInitialized);\n $container.off(events.Media.End, onMediaEnd);\n $container.on(events.Media.Replay, onVideoReplayHandler);\n $container.on(events.ExternalLinkView.Open, onOpenExternalLink);\n $container.on(events.ExternalLinkView.Clicked, onClickExternalLink);\n mediaView.mediaWrapper.off('ratechange', onVideoTimeUpdate, false);\n mediaView.mediaWrapper.off('play', onVideoTimeUpdate, false);\n var eventsToBind = {\n timeupdate: onVideoTimeUpdate,\n canplay: onCanPlayVideo,\n seeked: onSeeked,\n ended: onMediaWrapperMediaEnd\n };\n mediaView.mediaWrapper.off(eventsToBind);\n mediaView.mediaElement.removeEventListener(events.Media.Play, resetPlayStartAnalytics);\n };\n var destroy = function destroy() {\n unbindToEvents();\n };\n bindToEvents();\n if (mediaView.mediaWrapper.metadataReady) {\n mediaView.mediaWrapper.metadataReady.then(function () {\n return mediaView.mediaWrapper.canPlayReady.then(function () {\n onCanPlayVideo();\n });\n });\n }\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar MediaAnalyticsController$1 = {\n /**\n * Factory method that returns a new MediaAnalyticsController.\n * @function create\n * @memberof TSC.MediaAnalyticsController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.MediaList} mediaList\n * @param {TSC.QuizController} quizController\n * @param {TSC.playerConfiguration} playerConfiguration\n * @return new MediaAnalyticsController instance\n */\n create: MediaAnalyticsController\n};\n\nvar enterKeyCode = 13;\nvar spacebarKeyCode = 32;\n\n/**\n * @memberof TSC\n * @class PluginEventsController\n * @classdesc Controller for managing XMP features\n * @param {jQuery} $container - Smart Player main container jquery element\n *\n */\nvar PluginEventsController = function PluginEventsController($container) {\n var _$mediaPluginContainer = $container.find('.media-plugin-container');\n _$mediaPluginContainer.hide();\n var onMediaPluginContainerKeyHandler = function onMediaPluginContainerKeyHandler(e) {\n if (e.type === 'keydown' && (e.keyCode === enterKeyCode || e.keyCode === spacebarKeyCode)) {\n $container.trigger(events.Plugin.MediaAreaPluginKeyDown);\n } else if (e.type === 'keyup' && (e.keyCode === enterKeyCode || e.keyCode === spacebarKeyCode)) {\n $container.trigger(events.Plugin.MediaAreaPluginKeyUp);\n }\n };\n var onMediaPluginContainerMouseHandler = function onMediaPluginContainerMouseHandler(e) {\n if (e.type === 'mousedown') {\n $container.trigger(events.Plugin.MediaAreaPluginMouseDown);\n } else if (e.type === 'mouseup') {\n $container.trigger(events.Plugin.MediaAreaPluginMouseUp);\n }\n };\n var initMediaPlugins = function initMediaPlugins() {\n var pluginController = playerConfiguration.getPluginController();\n if (!pluginController) {\n return;\n }\n _$mediaPluginContainer.show();\n pluginController.initializePluginsForViewElement(supportedPluginViewElements.MEDIA, _$mediaPluginContainer);\n };\n var onPluginAdded = function onPluginAdded(eventName, data) {\n if (data.viewElementType === supportedPluginViewElements.MEDIA) {\n initMediaPlugins();\n }\n };\n var bindToEvents = function bindToEvents() {\n $container.on(events.Plugin.Added, onPluginAdded);\n _$mediaPluginContainer.on('mousedown', onMediaPluginContainerMouseHandler);\n _$mediaPluginContainer.on('mouseup', onMediaPluginContainerMouseHandler);\n _$mediaPluginContainer.on('keydown', onMediaPluginContainerKeyHandler);\n _$mediaPluginContainer.on('keyup', onMediaPluginContainerKeyHandler);\n };\n var unbindToEvents = function unbindToEvents() {\n $container.off(events.Plugin.Added, onPluginAdded);\n _$mediaPluginContainer.off('mousedown', onMediaPluginContainerMouseHandler);\n _$mediaPluginContainer.off('mouseup', onMediaPluginContainerMouseHandler);\n _$mediaPluginContainer.off('keydown', onMediaPluginContainerKeyHandler);\n _$mediaPluginContainer.off('keyup', onMediaPluginContainerKeyHandler);\n };\n var destroy = function destroy() {\n unbindToEvents();\n };\n bindToEvents();\n initMediaPlugins();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar PluginEventsController$1 = {\n /**\n * Factory method that returns a new PluginEventsController.\n * @function create\n * @memberof TSC.PluginEventsController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @return new PluginEventsController instance\n */\n create: PluginEventsController\n};\n\n/**\n * @memberof TSC\n * @class MediaSessionController\n * @classdesc Media Session controller will interface media with system controls\n * @param {jQuery} $rootSmartPlayerElement\n * @param {HTMLVideoElement} mediaElement\n * @param {string} mediaTitle\n * @param {string} mediaPosterImageSrc\n */\nvar MediaSessionController = function MediaSessionController($rootSmartPlayerElement, mediaElement, mediaTitle, mediaPosterImageSrc) {\n var _windowRef = windowWrapper.getWindow();\n var _navigatorRef = windowWrapper.getNavigator();\n // This prevents unnecessary errors when Media Session API is not available.\n var _mediaSessionRef = _navigatorRef.mediaSession || {};\n _mediaSessionRef.setActionHandler = _navigatorRef.mediaSession.setActionHandler || function () {}; // eslint-disable-line\n _windowRef.MediaMetadata = _windowRef.MediaMetadata || function () {}; // eslint-disable-line\n\n var _metaDataSet = false;\n var setMetaData = function setMetaData() {\n _mediaSessionRef.metadata = new _windowRef.MediaMetadata({\n title: mediaTitle,\n artwork: [{\n src: mediaPosterImageSrc\n }]\n });\n _metaDataSet = true;\n updateMediaSessionState();\n };\n var updateMediaSessionState = function updateMediaSessionState() {\n if (!_metaDataSet) {\n return;\n }\n _mediaSessionRef.playbackState = mediaElement.paused ? 'paused' : 'playing';\n _mediaSessionRef.setPositionState({\n duration: mediaElement.duration,\n playbackRate: mediaElement.playbackRate,\n position: mediaElement.currentTime\n });\n };\n var onPlayAction = function onPlayAction() {\n if ($rootSmartPlayerElement.playerState.pausedForQuiz) {\n return;\n }\n mediaElement.play();\n };\n var onPauseAction = function onPauseAction() {\n if ($rootSmartPlayerElement.playerState.pausedForQuiz) {\n return;\n }\n mediaElement.pause();\n };\n var onSeekToAction = function onSeekToAction(details) {\n if ($rootSmartPlayerElement.playerState.pausedForQuiz) {\n return;\n }\n $rootSmartPlayerElement.trigger(events.Media.SeekToTime, {\n time: details.seekTime\n });\n };\n var bindEvents = function bindEvents() {\n mediaElement.addEventListener('loadedmetadata', setMetaData);\n mediaElement.addEventListener('playing', updateMediaSessionState);\n mediaElement.addEventListener('pause', updateMediaSessionState);\n mediaElement.addEventListener('durationchange', updateMediaSessionState);\n mediaElement.addEventListener('ratechange', updateMediaSessionState);\n mediaElement.addEventListener('timeupdate', updateMediaSessionState);\n _mediaSessionRef.setActionHandler('play', onPlayAction);\n _mediaSessionRef.setActionHandler('pause', onPauseAction);\n _mediaSessionRef.setActionHandler('seekto', onSeekToAction);\n };\n var destroy = function destroy() {\n mediaElement.removeEventListener('loadedmetadata', setMetaData);\n mediaElement.removeEventListener('playing', updateMediaSessionState);\n mediaElement.removeEventListener('pause', updateMediaSessionState);\n mediaElement.removeEventListener('durationchange', updateMediaSessionState);\n mediaElement.removeEventListener('ratechange', updateMediaSessionState);\n mediaElement.removeEventListener('timeupdate', updateMediaSessionState);\n };\n bindEvents();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar isSupported = function isSupported() {\n return !!windowWrapper.getNavigator().mediaSession;\n};\nvar MediaSessionController$1 = {\n /**\n * Factory method that returns a new MediaSessionController object\n * @function create\n * @memberof TSC.MediaSessionController\n * @param {jQuery} $rootSmartPlayerElement\n * @param {HTMLVideoElement} mediaElement\n * @param {string} mediaTitle\n * @param {string} mediaPosterImageSrc\n * @static\n * @return MediaSessionController instance\n */\n create: MediaSessionController,\n /**\n * Is the Media Session api supported\n * @function isSupported\n * @memberof TSC.MediaSessionController\n * @static\n * @return {boolean} Is the api supported\n */\n isSupported: isSupported\n};\n\n/**\n * @memberof TSC\n * @class MediaExtensionsController\n * @classdesc Controller for managing XMP features\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.Quiz} quizModel\n * @param {TSC.MediaList} mediaList\n * @param {TSC.CaptionService} captionService\n * @param {TSC.playerConfiguration} playerConfiguration\n * @param {TSC.ResponsiveController} responsiveController\n * @param {TSC.TabController} tabController\n * @param {TSC.ProgressBarControlView} progressBarControlView\n * @param {TSC.BeforeAfterPlayControlsView} beforeAfterPlayControlsView\n * @param {TSC.IoOverlayView} ioOverlayView\n *\n */\nvar MediaExtensionsController = function MediaExtensionsController($container, mediaView, xmpModel, quizModel, mediaList, captionService, playerConfiguration, responsiveController, tabController, progressBarControlView, beforeAfterPlayControlsView, ioOverlayView) {\n var _hotspotController;\n var _captionController;\n var _tableOfContentsController;\n var _audioDescriptionController;\n var _endActionsController;\n var _quizController;\n var _quizEventController;\n var _mediaAnalyticsController;\n var _pluginEventsController;\n var _mediaSessionController;\n var modifyPlayerConfigurationBasedOnDevice = function modifyPlayerConfigurationBasedOnDevice() {\n // ignore auto play if this is an iOS device that plays video inline or there is a quiz present\n // may want to move this out of the view at some point.\n var hasAnEnabledQuiz = _quizController && _quizController.hasQuiz && _quizController.quizEnabled;\n if ((deviceInfo.isIOS() || deviceInfo.isAndroid() || hasAnEnabledQuiz) && !playerConfiguration.getMobileWebViewCanAutoPlay()) {\n playerConfiguration.setAutoPlayMedia(false);\n }\n };\n var setupImageControllers = function setupImageControllers() {\n if (quizModel) {\n _quizController = QuizController$1.create($container, mediaView, quizModel, beforeAfterPlayControlsView, playerConfiguration.enforceLinearAssessment);\n _quizEventController = QuizEventController$1.create($container, mediaView, _quizController, progressBarControlView, playerConfiguration.enforceLinearAssessment, ioOverlayView);\n }\n _mediaAnalyticsController = MediaAnalyticsController$1.create($container, mediaView, mediaList, _quizController, playerConfiguration);\n };\n var getMediaTitle = function getMediaTitle() {\n if (playerConfiguration.mediaTitle) {\n return playerConfiguration.mediaTitle;\n } else if (playerConfiguration.tocTitle) {\n return playerConfiguration.tocTitle;\n } else if (xmpModel && xmpModel.title) {\n return xmpModel.title;\n }\n return localizationStrings.getPlayerString(playerStringNames.defaultMediaTitle);\n };\n var getMediaPosterSrc = function getMediaPosterSrc() {\n return playerConfiguration.getPosterImageSrc() || '';\n };\n var setupVideoControllers = function setupVideoControllers() {\n _endActionsController = EndActionsController$1.create($container, mediaView, progressBarControlView, beforeAfterPlayControlsView);\n if (playerConfiguration.audioDescriptionMediaSrc) {\n _audioDescriptionController = AudioDescriptionController$1.create($container, mediaView, playerConfiguration.audioDescriptionMediaSrc);\n }\n if (quizModel) {\n _quizController = QuizController$1.create($container, mediaView, quizModel, beforeAfterPlayControlsView, playerConfiguration.enforceLinearAssessment);\n _quizEventController = QuizEventController$1.create($container, mediaView, _quizController, progressBarControlView, playerConfiguration.enforceLinearAssessment, ioOverlayView);\n }\n _mediaAnalyticsController = MediaAnalyticsController$1.create($container, mediaView, mediaList, _quizController, playerConfiguration);\n if (MediaSessionController$1.isSupported()) {\n _mediaSessionController = MediaSessionController$1.create($container, mediaView.mediaElement, getMediaTitle(), getMediaPosterSrc());\n }\n if (mediaView.supportsSCORM && playerConfiguration.isScormLesson) {\n if (_quizController && _quizController.quizModel !== null && (_quizController.quizModel.reportMethod === reportType.SCORM || _quizController.quizModel.reportMethod === reportType.APIANDSCORM)) {\n scormController$1.submitScore(0, false);\n }\n\n // restore quizzing model state and seek video if not using TechSmith Quiz Service (it can not resume a quiz)\n if (_quizController && _quizController.quizModel && _quizController.quizModel.reportMethod === reportType.SCORM && scormController$1.initialQuizModelSnapshot) {\n _quizController.populateQuizModel(scormController$1.initialQuizModelSnapshot);\n progressBarControlView.updateQuizMarkers();\n }\n scormController$1.initView($container);\n }\n var hasCaptionItems = xmpModel && xmpModel.hasCaptionItems || captionService.captionTrack;\n if (hasCaptionItems) {\n _captionController = CaptionController$1.create($container, mediaView, xmpModel, mediaList, captionService);\n }\n var hasHotspotItems = xmpModel && xmpModel.hasHotspotItems;\n if (hasHotspotItems) {\n _hotspotController = HotspotController$1.create($container, mediaView, xmpModel, mediaList, tabController);\n }\n var hasTableOfContents = xmpModel && xmpModel.hasSearchableItems;\n if (hasTableOfContents) {\n _tableOfContentsController = TableOfContentsController$1.create($container, mediaView, xmpModel, mediaList, progressBarControlView, playerConfiguration);\n }\n };\n var setupControllers = function setupControllers() {\n _pluginEventsController = PluginEventsController$1.create($container);\n if (mediaView.type === mediaViewType.image) {\n setupImageControllers();\n } else {\n setupVideoControllers();\n }\n };\n var preventEvent = function preventEvent(e) {\n e.stopImmediatePropagation();\n e.preventDefault();\n return false;\n };\n var disableHighlightOnMouseDown = function disableHighlightOnMouseDown() {\n highlightDisabler.disableHighlights($(this));\n };\n var activateHighlightDisabler = function activateHighlightDisabler() {\n $container.on('mousedown', '*', disableHighlightOnMouseDown);\n };\n var applyCustomBackgroundColor = function applyCustomBackgroundColor() {\n $container.css('background-color', playerConfiguration.getBackgroundColor());\n };\n var disableContextMenuIfNeeded = function disableContextMenuIfNeeded() {\n if (playerConfiguration.getDisableContextMenuForVideo()) {\n $container.on('contextmenu', preventEvent);\n }\n };\n var configurePlayer = function configurePlayer() {\n modifyPlayerConfigurationBasedOnDevice();\n activateHighlightDisabler();\n applyCustomBackgroundColor();\n disableContextMenuIfNeeded();\n responsiveController.monitorContainerSize();\n if (!_quizController) {\n $container.trigger(events.Player.MediaExtensionsReady);\n } else {\n _quizController.quizIsSetupPromise.then(function () {\n $container.trigger(events.Player.MediaExtensionsReady);\n });\n }\n };\n var destroy = function destroy() {\n _hotspotController && _hotspotController.destroy();\n _captionController && _captionController.destroy();\n _tableOfContentsController && _tableOfContentsController.destroy();\n _audioDescriptionController && _audioDescriptionController.destroy();\n _endActionsController && _endActionsController.destroy();\n _quizController && _quizController.destroy();\n _quizEventController && _quizEventController.destroy();\n _mediaAnalyticsController && _mediaAnalyticsController.destroy();\n _pluginEventsController && _pluginEventsController.destroy();\n _mediaSessionController && _mediaSessionController.destroy();\n $container.off('mousedown', '*', disableHighlightOnMouseDown);\n $container.off('contextmenu', preventEvent);\n responsiveController.clearContainerMonitors();\n };\n setupControllers();\n configurePlayer();\n return Object.defineProperties({\n destroy: destroy\n }, {\n /**\n * @public\n * @readonly\n * @memberof TSC.MediaExtensionsController\n * @property {TSC.CaptionController} captionController - the caption controller\n */\n captionController: {\n get: function get() {\n return _captionController;\n }\n }\n });\n};\nvar MediaExtensionsController$1 = {\n /**\n * Factory method that returns a new MediaExtensionsController.\n * @function create\n * @memberof TSC.MediaExtensionsController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.Quiz} quizModel\n * @param {TSC.MediaList} mediaList\n * @param {TSC.CaptionService} captionService\n * @param {TSC.playerConfiguration} playerConfiguration\n * @param {TSC.TabController} tabController\n * @param {TSC.ResponsiveController} responsiveController\n * @param {TSC.ProgressBarControlView} progressBarControlView\n * @param {TSC.BeforeAfterPlayControlsView} beforeAfterPlayControlsView\n * @param {TSC.IoOverlayView} ioOverlayView\n * @return new MediaExtensionsController instance\n */\n create: MediaExtensionsController\n};\n\n/**\n * @memberof TSC\n * @class TabController\n * @classdesc Controller for tabs\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {jQuery} $defaultFirstTabEnabledElement - The default first tab that should be enabled\n * @param {jQuery} $defaultLastTabEnabledElement - The default last tab that should be enabled\n *\n */\nvar TabController = function TabController($container, $defaultFirstTabEnabledElement, $defaultLastTabEnabledElement) {\n var _defaultFirstTabEnabledElement = $defaultFirstTabEnabledElement;\n var _defaultLastTabEnabledElement = $defaultLastTabEnabledElement;\n var _firstTabEnabledElement = null;\n var _lastTabEnabledElement = null;\n var _playerInFullScreenMode = false;\n var onFullScreenChange = function onFullScreenChange(event, eventData) {\n _playerInFullScreenMode = eventData.inFullScreen;\n };\n var unbindEventsToTabEnabledElement = function unbindEventsToTabEnabledElement(element) {\n if (element) {\n element.off('keydown');\n }\n };\n var setFirstTabEnabledElement = function setFirstTabEnabledElement(firstTabEnabledElement) {\n if (_firstTabEnabledElement) {\n unbindEventsToTabEnabledElement(_firstTabEnabledElement);\n }\n if (firstTabEnabledElement === null) {\n _firstTabEnabledElement = _defaultFirstTabEnabledElement;\n } else {\n _firstTabEnabledElement = firstTabEnabledElement;\n }\n _firstTabEnabledElement.on('keydown', function (e) {\n if (_playerInFullScreenMode && keys.isKeyOfType(e.key, keys.keyTypes.tab) && e.shiftKey === true) {\n e.preventDefault();\n _lastTabEnabledElement.focus();\n }\n });\n };\n var setLastTabEnabledElement = function setLastTabEnabledElement(lastTabEnabledElement) {\n if (_lastTabEnabledElement) {\n unbindEventsToTabEnabledElement(_lastTabEnabledElement);\n }\n if (lastTabEnabledElement === null) {\n _lastTabEnabledElement = _defaultLastTabEnabledElement;\n } else {\n _lastTabEnabledElement = lastTabEnabledElement;\n }\n _lastTabEnabledElement.on('keydown', function (e) {\n if (_playerInFullScreenMode && keys.isKeyOfType(e.key, keys.keyTypes.tab) && e.shiftKey === false) {\n e.preventDefault();\n _firstTabEnabledElement.focus();\n }\n });\n };\n var initController = function initController() {\n if (!_defaultFirstTabEnabledElement || !_defaultLastTabEnabledElement) {\n throw new Error('Tab controller is missing a default tab enabled element');\n }\n setFirstTabEnabledElement(_defaultFirstTabEnabledElement);\n setLastTabEnabledElement(_defaultLastTabEnabledElement);\n $container.on(events.Controls.FullScreenChange, onFullScreenChange);\n };\n var destroy = function destroy() {\n unbindEventsToTabEnabledElement(_firstTabEnabledElement);\n unbindEventsToTabEnabledElement(_lastTabEnabledElement);\n $container.off(events.Controls.FullScreenChange, onFullScreenChange);\n };\n initController();\n return Object.defineProperties({\n destroy: destroy\n }, {\n firstTabEnabledElement: {\n get: function get() {\n return _firstTabEnabledElement;\n },\n set: setFirstTabEnabledElement\n },\n lastTabEnabledElement: {\n get: function get() {\n return _lastTabEnabledElement;\n },\n set: setLastTabEnabledElement\n }\n });\n};\nvar TabController$1 = {\n create: TabController\n};\n\n/**\n * @memberof TSC\n * @class ExternalEventsController\n * @classdesc Controller for managing external events\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.MediaList} mediaList\n * @param {Object} playerViewEventCallbacks\n *\n */\nvar ExternalEventsController = function ExternalEventsController($container, mediaView, mediaList, playerViewEventCallbacks) {\n var onLoadedMetadata = function onLoadedMetadata() {\n playerViewEventCallbacks[events.External.MediaReady].forEach(function (callback) {\n callback();\n });\n };\n var onFullScreenChange = function onFullScreenChange() {\n playerViewEventCallbacks[events.External.PlayerFullScreenModeChanged].forEach(function (callback) {\n callback();\n });\n };\n var onTheaterModeChanged = function onTheaterModeChanged(e, eventData) {\n var newDisplayMode = eventData && eventData.displayMode;\n playerViewEventCallbacks[events.External.DisplayModeChanged].forEach(function (callback) {\n callback(newDisplayMode);\n });\n };\n var onCanPlayVideo = function onCanPlayVideo() {\n playerViewEventCallbacks[events.External.VideoStart].forEach(function (callback) {\n callback();\n });\n mediaView.mediaWrapper.off('canplay', onCanPlayVideo);\n };\n var onMediaEnd = function onMediaEnd(e, eventData) {\n if (eventData.isPlaybackEnded) {\n playerViewEventCallbacks[events.External.VideoEnd].forEach(function (callback) {\n callback();\n });\n }\n };\n var onVideoReplayHandler = function onVideoReplayHandler() {\n playerViewEventCallbacks[events.External.VideoReplay].forEach(function (callback) {\n callback();\n });\n };\n var onVideoError = function onVideoError() {\n playerViewEventCallbacks[events.External.MediaError].forEach(function (callback) {\n callback();\n });\n };\n var onPlayingEvent = function onPlayingEvent() {\n mediaView.mediaWrapper.off('playing', onPlayingEvent);\n\n // send a playing/streaming confirmation if applicable\n playerViewEventCallbacks[events.External.VideoPlay].forEach(function (callback) {\n callback();\n });\n };\n var onStartedPlaybackHandler = function onStartedPlaybackHandler() {\n playerViewEventCallbacks[events.External.VideoStartInitiated].forEach(function (callback) {\n callback();\n });\n };\n var triggerQuizVisible = function triggerQuizVisible() {\n playerViewEventCallbacks[events.External.QuizVisible].forEach(function (callback) {\n callback();\n });\n };\n var triggerQuizHidden = function triggerQuizHidden() {\n playerViewEventCallbacks[events.External.QuizHidden].forEach(function (callback) {\n callback();\n });\n };\n var triggerQuizPromptVisible = function triggerQuizPromptVisible() {\n playerViewEventCallbacks[events.External.ShowStartQuizPrompt].forEach(function (callback) {\n callback();\n });\n };\n var triggerQuizPromptHidden = function triggerQuizPromptHidden() {\n playerViewEventCallbacks[events.External.HideStartQuizPrompt].forEach(function (callback) {\n callback();\n });\n };\n var processCaptionChanged = function processCaptionChanged(e, eventData) {\n if (eventData) {\n playerViewEventCallbacks[events.External.CaptionChange].forEach(function (callback) {\n callback(eventData.plainText);\n });\n }\n };\n var processCaptionToggled = function processCaptionToggled(e, eventData) {\n if (eventData) {\n var externalCaptionEvent = eventData.captionsEnabled ? events.External.CaptionsVisible : events.External.CaptionsHidden;\n playerViewEventCallbacks[externalCaptionEvent].forEach(function (callback) {\n callback();\n });\n }\n };\n var onCaptionsReadyHandler = function onCaptionsReadyHandler() {\n playerViewEventCallbacks[events.External.CaptionsReady].forEach(function (callback) {\n callback();\n });\n };\n var triggerPlayerSettingsOpen = function triggerPlayerSettingsOpen() {\n playerViewEventCallbacks[events.External.PlayerSettingsOpen].forEach(function (callback) {\n callback();\n });\n };\n var triggerPlayerSettingsClose = function triggerPlayerSettingsClose() {\n playerViewEventCallbacks[events.External.PlayerSettingsClose].forEach(function (callback) {\n callback();\n });\n };\n var triggerVideoControlsHidden = function triggerVideoControlsHidden() {\n playerViewEventCallbacks[events.External.PlayerControlsHidden].forEach(function (callback) {\n callback();\n });\n };\n var triggerVideoControlsVisible = function triggerVideoControlsVisible() {\n playerViewEventCallbacks[events.External.PlayerControlsVisible].forEach(function (callback) {\n callback();\n });\n };\n var triggerExternalPlayerResize = function triggerExternalPlayerResize() {\n playerViewEventCallbacks[events.External.PlayerResize].forEach(function (callback) {\n callback();\n });\n };\n var triggerHeroControlHidden = function triggerHeroControlHidden() {\n playerViewEventCallbacks[events.External.HeroControlHidden].forEach(function (callback) {\n callback();\n });\n };\n var triggerImagePointerOver = function triggerImagePointerOver() {\n playerViewEventCallbacks[events.External.ImagePointerOver].forEach(function (callback) {\n callback();\n });\n };\n var triggerImagePointerLeave = function triggerImagePointerLeave() {\n playerViewEventCallbacks[events.External.ImagePointerLeave].forEach(function (callback) {\n callback();\n });\n };\n var bindToEvents = function bindToEvents() {\n $container.on(events.Controls.StartedPlayback, onStartedPlaybackHandler);\n $container.on(events.Controls.FullScreenChange, onFullScreenChange);\n $container.on(events.Controls.TheaterModeChanged, onTheaterModeChanged);\n $container.on(events.Media.End, onMediaEnd);\n $container.on(events.Media.Replay, onVideoReplayHandler);\n $container.on(events.Media.Error, onVideoError);\n $container.on(events.Quizzing.ShowStartQuizPrompt, triggerQuizVisible);\n $container.on(events.Quizzing.Review, triggerQuizHidden);\n $container.on(events.Quizzing.ShowQuestionSetView, triggerQuizVisible);\n $container.on(events.Quizzing.Complete, triggerQuizHidden);\n $container.on(events.Quizzing.ShowQuizSetup, triggerQuizPromptVisible);\n $container.on(events.Quizzing.BeginClicked, triggerQuizPromptHidden);\n $container.on(events.Quizzing.SkipClicked, triggerQuizPromptHidden);\n $container.on(events.Captions.Changed, processCaptionChanged);\n $container.on(events.Captions.Toggled, processCaptionToggled);\n $container.on(events.Captions.StateLoaded, onCaptionsReadyHandler);\n $container.on(events.Controls.PlayerSettingsOpen, triggerPlayerSettingsOpen);\n $container.on(events.Controls.PlayerSettingsClose, triggerPlayerSettingsClose);\n $container.on(events.Controls.VideoControlsHidden, triggerVideoControlsHidden);\n $container.on(events.Controls.VideoControlsVisible, triggerVideoControlsVisible);\n $container.on(events.Controls.PlayerResize, triggerExternalPlayerResize);\n $container.on(events.Controls.HeroPlayControlClicked, triggerHeroControlHidden);\n $container.on(events.Images.PointerOver, triggerImagePointerOver);\n $container.on(events.Images.PointerLeave, triggerImagePointerLeave);\n var eventsToBind = {\n loadedmetadata: onLoadedMetadata,\n canplay: onCanPlayVideo,\n playing: onPlayingEvent\n };\n mediaView.mediaWrapper.on(eventsToBind);\n };\n var unbindToEvents = function unbindToEvents() {\n $container.off(events.Controls.StartedPlayback, onStartedPlaybackHandler);\n $container.off(events.Controls.FullScreenChange, onFullScreenChange);\n $container.off(events.Controls.TheaterModeChanged, onTheaterModeChanged);\n $container.off(events.Media.End, onMediaEnd);\n $container.off(events.Media.Replay, onVideoReplayHandler);\n $container.off(events.Media.Error, onVideoError);\n $container.off(events.Quizzing.ShowStartQuizPrompt, triggerQuizVisible);\n $container.off(events.Quizzing.Review, triggerQuizHidden);\n $container.off(events.Quizzing.ShowQuestionSetView, triggerQuizVisible);\n $container.off(events.Quizzing.Complete, triggerQuizHidden);\n $container.off(events.Quizzing.ShowQuizSetup, triggerQuizPromptVisible);\n $container.off(events.Quizzing.BeginClicked, triggerQuizPromptHidden);\n $container.off(events.Quizzing.SkipClicked, triggerQuizPromptHidden);\n $container.off(events.Captions.Changed, processCaptionChanged);\n $container.off(events.Captions.Toggled, processCaptionToggled);\n $container.off(events.Captions.StateLoaded, onCaptionsReadyHandler);\n $container.off(events.Controls.PlayerSettingsOpen, triggerPlayerSettingsOpen);\n $container.off(events.Controls.PlayerSettingsClose, triggerPlayerSettingsClose);\n $container.off(events.Controls.VideoControlsHidden, triggerVideoControlsHidden);\n $container.off(events.Controls.VideoControlsVisible, triggerVideoControlsVisible);\n $container.off(events.Controls.PlayerResize, triggerExternalPlayerResize);\n $container.off(events.Controls.HeroPlayControlClicked, triggerHeroControlHidden);\n $container.off(events.Images.PointerOver, triggerImagePointerOver);\n $container.off(events.Images.PointerLeave, triggerImagePointerLeave);\n var eventsToBind = {\n loadedmetadata: onLoadedMetadata,\n canplay: onCanPlayVideo,\n playing: onPlayingEvent\n };\n mediaView.mediaWrapper.off(eventsToBind);\n };\n var destroy = function destroy() {\n unbindToEvents();\n };\n bindToEvents();\n return Object.defineProperties({\n destroy: destroy\n }, {});\n};\nvar ExternalEventsController$1 = {\n /**\n * Factory method that returns a new ExternalEventsController.\n * @function create\n * @memberof TSC.ExternalEventsController\n * @static\n * @param {jQuery} $container - Smart Player main container jquery element\n * @param {MediaView} mediaView - Media view for current media. Created by MediaViewFactory.\n * @param {TSC.MediaList} mediaList\n * @param {Object} playerViewEventCallbacks\n * @return new ExternalEventsController instance\n */\n create: ExternalEventsController\n};\n\n/**\n * @memberof TSC\n * @class PlayerState\n * @classdesc State object used for player instance player state.\n */\nvar PlayerState = function PlayerState() {\n var _oneOrMoreHotspotsWithTimeActionArePaused = false;\n var _videoHasQuizQuestions = false;\n var _pausedForQuiz = false;\n var _displayMode = DisplayModes.Normal;\n return Object.defineProperties({}, {\n oneOrMoreHotspotsWithTimeActionArePaused: {\n get: function get() {\n return _oneOrMoreHotspotsWithTimeActionArePaused;\n },\n set: function set(oneOrMoreHotspotsWithTimeActionArePaused) {\n _oneOrMoreHotspotsWithTimeActionArePaused = oneOrMoreHotspotsWithTimeActionArePaused;\n }\n },\n mediaHasQuizQuestions: {\n get: function get() {\n return _videoHasQuizQuestions;\n },\n set: function set(videoHasQuizQuestions) {\n _videoHasQuizQuestions = videoHasQuizQuestions;\n }\n },\n pausedForQuiz: {\n get: function get() {\n return _pausedForQuiz;\n },\n set: function set(pausedForQuiz) {\n _pausedForQuiz = pausedForQuiz;\n }\n },\n displayMode: {\n get: function get() {\n return _displayMode;\n },\n set: function set(displayMode) {\n _displayMode = displayMode;\n }\n }\n });\n};\nvar PlayerState$1 = {\n /**\n * Factory method that returns a new PlayerState object\n * @function create\n * @memberof TSC.PlayerState\n * @static\n * @return new PlayerState instance\n */\n create: PlayerState\n};\n\n/**\n * @memberof TSC.IoOverlayView\n * @class IoOverlayView\n * @classdesc IoOverlay View\n */\nvar IoOverlayView = function IoOverlayView($container) {\n var _viewOpen = false;\n var markup = templateGenerator.generateIoOverlayMarkup();\n $container.append(markup);\n var _$ioContainer = $container.find('.tsc-io-container');\n var _$ioMessage = _$ioContainer.find('span');\n var _$ioImg = _$ioContainer.find('img');\n var setViewMessage = function setViewMessage(message) {\n _$ioMessage.html(message);\n };\n var hideLoadingGraphic = function hideLoadingGraphic() {\n _$ioImg.hide();\n };\n var showLoadingGraphic = function showLoadingGraphic() {\n _$ioImg.show();\n };\n var showView = function showView() {\n _$ioContainer.stop().css('opacity', 0).show().animate({\n opacity: 1\n }, 300);\n _viewOpen = true;\n };\n var hideView = function hideView(completeCallback) {\n if (_viewOpen) {\n _viewOpen = false;\n _$ioContainer.stop().animate({\n opacity: 0\n }, 200, function () {\n if (completeCallback) {\n completeCallback.call();\n }\n _$ioContainer.hide();\n });\n }\n };\n var displayMessage = function displayMessage(message, shouldHideLoadingGraphic) {\n setViewMessage(message);\n if (shouldHideLoadingGraphic) {\n hideLoadingGraphic();\n } else {\n showLoadingGraphic();\n }\n if (!_viewOpen) {\n showView();\n }\n };\n var destroy = function destroy() {\n $container.off(events.Controls.HideIOOverlay, hideView);\n };\n var bindEvents = function bindEvents() {\n $container.on(events.Controls.HideIOOverlay, hideView);\n };\n bindEvents();\n return Object.defineProperties({\n hideView: hideView,\n displayMessage: displayMessage,\n destroy: destroy\n }, {});\n};\nvar IoOverlayView$1 = {\n /**\n * Factory method that returns a new IoOverlayView object.\n * @function create\n * @memberof TSC.IoOverlayView\n * @static\n * @param {Object} $container - jQuery element that is the smartplayer top-level container\n * @return new IoOverlayView instance\n */\n create: IoOverlayView\n};\n\nvar VIDEO_TIME_COMPARE_PRECISION = 2;\n\n/**\n * @memberof TSC\n * @class SmartPlayerView\n * @classdesc Smart Player view\n * @param {String} playerInstanceUUID\n * @param {JQuery} $rootContainer\n * @param {TSC.MediaList} mediaList\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.Quiz} quizModel\n * @param {TSC.CaptionService} captionService\n * @param {TSC.playerConfiguration} playerConfiguration\n * @param {TSC.ResponsiveController} responsiveController\n * @param {Boolean} xmpInErrorState\n */\nvar SmartPlayerView = function SmartPlayerView(playerInstanceUUID, $rootContainer, mediaList, xmpModel, quizModel, captionService, playerConfiguration, responsiveController, xmpInErrorState) {\n // eslint-disable-line\n var _mediaElementUniqueID = [$rootContainer.attr('id').replace(/^[#]/, ''), playerInstanceUUID].join('-');\n var _mediaViewReady;\n var _viewHasBeenInitialized;\n var _mediaExtensionsController;\n var _tabController;\n var _externalEventsController;\n var _scormErrorMessageBarView;\n var _$playerPluginContainer;\n var _viewInitializedPromise = new Promise$1(function (resolve, reject) {\n _viewHasBeenInitialized = resolve; // eslint-disable-line\n });\n var _playerViewEventCallbacks = {};\n var _queuedMediaBinds = {};\n var _mediaView = null;\n var _ioOverlayView = null;\n var _videoControlsController = null;\n var _videoControlsDisplayModeController = null;\n var _controlsReady = false;\n var _mediaExtensionsReady = false;\n var _mediaHasBeenLoaded = false;\n var _playerState = PlayerState$1.create();\n _playerState.mediaHasQuizQuestions = quizModel && quizModel.questionSets.length > 0;\n $rootContainer.playerState = _playerState;\n var _$mediaViewPortContainer = null;\n var _$mediaContainer = null;\n var _$playerLayoutControlsContainer = null;\n var displayXmpErrorMessage = function displayXmpErrorMessage() {\n if (deviceInfo.isLocal()) {\n MessageBarView$1.create($rootContainer, messageBarType.info, localizationStrings.getPlayerString(playerStringNames.xmpSecurity), localizationStrings.getPlayerString(playerStringNames.close));\n } else {\n MessageBarView$1.create($rootContainer, messageBarType.info, localizationStrings.getPlayerString(playerStringNames.xmpError));\n }\n };\n var onFirstPlayHandler = function onFirstPlayHandler() {\n $rootContainer.trigger(events.Media.FirstPlay);\n };\n var triggerRumDataEvent = function triggerRumDataEvent(timingMeasureList, eventCategorySuffix) {\n var eventData = {\n categorySuffix: eventCategorySuffix,\n rum: performanceWrapper.getRumEventData(timingMeasureList)\n };\n _playerViewEventCallbacks[events.External.PlayerRumData].forEach(function (callback) {\n callback(eventData);\n });\n };\n var externalEventIsSupported = function externalEventIsSupported(eventName) {\n return Object.keys(events.External).some(function (eventKey) {\n return events.External[eventKey] === eventName;\n });\n };\n var setupExternalEventCallbackHarness = function setupExternalEventCallbackHarness() {\n Object.keys(events.External).forEach(function (eventKey) {\n var eventName = events.External[eventKey];\n _playerViewEventCallbacks[eventName] = [];\n });\n };\n var getCaptionsVisible = function getCaptionsVisible() {\n return _mediaExtensionsController.captionController ? _mediaExtensionsController.captionController.getCaptionsVisible() : false;\n };\n var setCaptionsVisible = function setCaptionsVisible(value) {\n if (_mediaExtensionsController.captionController) {\n _mediaExtensionsController.captionController.setCaptionsVisible(value);\n }\n };\n var addEventListener = function addEventListener(type, listener) {\n if (externalEventIsSupported(type)) {\n _playerViewEventCallbacks[type].push(listener);\n }\n };\n var removeEventListener = function removeEventListener(type, listener) {\n if (externalEventIsSupported(type)) {\n // just in case the same listener pointer is bound more than once?\n while (_playerViewEventCallbacks[type].indexOf(listener) !== -1) {\n _playerViewEventCallbacks[type].splice(_playerViewEventCallbacks[type].indexOf(listener), 1);\n }\n }\n };\n var addMediaEventListener = function addMediaEventListener(event, handler) {\n if (_mediaView && _mediaView.mediaWrapper) {\n _mediaView.mediaWrapper.on(event, handler);\n } else {\n if (_typeof$1(_queuedMediaBinds[event]) !== 'object') {\n _queuedMediaBinds[event] = [];\n }\n _queuedMediaBinds[event].push(handler);\n }\n };\n var removeMediaEventListener = function removeMediaEventListener(event, handler) {\n if (_mediaView.mediaWrapper) {\n _mediaView.mediaWrapper.off(event, handler);\n } else {\n if (_typeof$1(_queuedMediaBinds[event]) !== 'object') {\n return;\n }\n // if the same handler is bound multiple times?\n while (_queuedMediaBinds[event].indexOf(handler) !== -1) {\n _queuedMediaBinds[event].splice(_queuedMediaBinds[event].indexOf(handler), 1);\n }\n }\n };\n var processQueuedMediaBinds = function processQueuedMediaBinds() {\n Object.keys(_queuedMediaBinds).forEach(function (event) {\n if (_typeof$1(_queuedMediaBinds[event]) === 'object') {\n _queuedMediaBinds[event].forEach(function (callback) {\n _mediaView.mediaWrapper.on(event, callback);\n });\n }\n });\n _queuedMediaBinds = {};\n };\n var triggerVideoStartEventCallbacks = function triggerVideoStartEventCallbacks() {\n // dispatch callback for media started event (note: after _mediaWrapper and _mediaElement are set)\n _playerViewEventCallbacks[events.External.VideoStart].forEach(function (callback) {\n callback();\n });\n };\n var createPlayerLayout = function createPlayerLayout() {\n $rootContainer.html(templateGenerator.generatePlayerLayoutMarkup());\n _$mediaViewPortContainer = $rootContainer.find('.media-wrapper').first();\n _$playerLayoutControlsContainer = $rootContainer.find('.video-controls-container').first();\n _$playerPluginContainer = $rootContainer.find('.player-plugin-container').first();\n };\n var createMediaView = function createMediaView() {\n return MediaViewFactory$1.createView($rootContainer, _$mediaViewPortContainer, _mediaElementUniqueID, mediaList, onFirstPlayHandler, triggerRumDataEvent);\n };\n var onMediaError = function onMediaError(e, data) {\n _ioOverlayView.hideView();\n _ioOverlayView.displayMessage(data.errorString, true);\n };\n var showVideoLoadingMessage = function showVideoLoadingMessage() {\n if (_mediaView.type !== mediaViewType.youtube && _mediaView.type !== mediaViewType.image) {\n _ioOverlayView.displayMessage(localizationStrings.getPlayerString(playerStringNames.videoLoading));\n }\n };\n var onHideLoadingMessage = function onHideLoadingMessage() {\n _ioOverlayView.hideView();\n };\n var loadMediaWhenComponentsAreReady = function loadMediaWhenComponentsAreReady() {\n if (_controlsReady && _mediaExtensionsReady && !_mediaHasBeenLoaded) {\n showVideoLoadingMessage();\n loadMedia();\n }\n };\n var onControlsVisible = function onControlsVisible() {\n if (_$playerLayoutControlsContainer.length > 0 && captionService.position === CAPTION_POSITION.under) {\n $rootContainer[0].style.setProperty(cssVariables.reservedSizeControls, \"\".concat(Math.round(_$playerLayoutControlsContainer.height()), \"px\"));\n }\n };\n var onControlsReady = function onControlsReady() {\n _controlsReady = true;\n loadMediaWhenComponentsAreReady();\n };\n var onMediaExtensionsReady = function onMediaExtensionsReady() {\n _mediaExtensionsReady = true;\n loadMediaWhenComponentsAreReady();\n };\n var onFailedToFindSCORMApi = function onFailedToFindSCORMApi() {\n _ioOverlayView.hideView();\n _scormErrorMessageBarView = MessageBarView$1.create($rootContainer, messageBarType.info, localizationStrings.getPlayerString(playerStringNames.scormApiNotFoundMessage), localizationStrings.getPlayerString(playerStringNames.close));\n };\n var onShowQuizSetup = function onShowQuizSetup() {\n $rootContainer.find('.video-wrapper').removeClass(cssClasses.hide);\n };\n var startViewPortObserver = function startViewPortObserver() {\n _mediaView.mediaWrapper.off(events.ExternalVideo.VideoLoadedMetadata, startViewPortObserver);\n // at this point, these should have been initialized\n _$mediaContainer = $rootContainer.find('.media-container');\n responsiveController.monitorMediaViewPortSize(_$mediaViewPortContainer, _$mediaContainer, _mediaView.mediaWidth, _mediaView.mediaHeight);\n };\n var onImagePointerOver = function onImagePointerOver() {\n $rootContainer.trigger(events.Images.PointerOver);\n };\n var onImagePointerLeave = function onImagePointerLeave() {\n $rootContainer.trigger(events.Images.PointerLeave);\n };\n var onMediaViewInitialized = function onMediaViewInitialized(mediaView) {\n _mediaView = mediaView;\n _ioOverlayView = IoOverlayView$1.create($rootContainer);\n $rootContainer.on(events.Media.Error, onMediaError);\n $rootContainer.on(events.Player.MediaControlsReady, onControlsReady);\n $rootContainer.on(events.Controls.VideoControlsVisible, onControlsVisible);\n $rootContainer.on(events.Player.MediaExtensionsReady, onMediaExtensionsReady);\n $rootContainer.on(events.Controls.HideLoadingMessage, onHideLoadingMessage);\n $rootContainer.on(events.SCORM.FailedToFindApi, onFailedToFindSCORMApi);\n $rootContainer.on(events.Quizzing.ShowQuizSetup, onShowQuizSetup);\n $rootContainer.on(events.Plugin.Added, initPlugins);\n _mediaView.mediaWrapper.on(events.ExternalVideo.VideoLoadedMetadata, startViewPortObserver);\n if (_mediaView.playerControlType === playerControlsType.video || _mediaView.playerControlType === playerControlsType.videoPlaylist) {\n _videoControlsController = VideoControlsController$1.create($rootContainer, _mediaView, xmpModel, quizModel, playerConfiguration);\n _videoControlsDisplayModeController = VideoControlsDisplayModeController$1.create($rootContainer, _videoControlsController, playerConfiguration);\n _tabController = TabController$1.create($rootContainer, _videoControlsController.progressBarControlView.controlElement, _videoControlsController.fullscreenControlView.controlElement);\n } else {\n // if not creating videoControls just yank the dom structure, perhaps this should be its own template\n $rootContainer.find('.video-controls-container').remove();\n if (_mediaView.type === mediaViewType.image && !deviceInfo.isTouchInterface()) {\n $rootContainer.on('pointerover', onImagePointerOver);\n $rootContainer.on('pointerleave', onImagePointerLeave);\n }\n }\n var progressBarControlView = _videoControlsController ? _videoControlsController.progressBarControlView : null;\n var beforeAfterPlayControlsView = _videoControlsController ? _videoControlsController.beforeAfterPlayControlsView : null;\n _externalEventsController = ExternalEventsController$1.create($rootContainer, mediaView, mediaList, _playerViewEventCallbacks);\n processQueuedMediaBinds();\n _mediaExtensionsController = MediaExtensionsController$1.create($rootContainer, mediaView, xmpModel, quizModel, mediaList, captionService, playerConfiguration, responsiveController, _tabController, progressBarControlView, beforeAfterPlayControlsView, _ioOverlayView);\n if (!_videoControlsController || !_videoControlsController.userNeedToClickHeroPlayControl) {\n $rootContainer.trigger(events.Player.MediaControlsReady);\n }\n $rootContainer.trigger(events.Controls.PlayerInitialized);\n triggerRumDataEvent([events.Timing.PlayerLoaded, events.Timing.PlayerInitialized], AnalyticsRumVideoCategorySuffix);\n _viewHasBeenInitialized();\n };\n var destroy = function destroy() {\n $rootContainer.off(events.Media.Error, onMediaError);\n $rootContainer.off(events.Player.MediaControlsReady, onControlsReady);\n $rootContainer.off(events.Controls.VideoControlsVisible, onControlsVisible);\n $rootContainer.off(events.Player.MediaExtensionsReady, onMediaExtensionsReady);\n $rootContainer.off(events.Controls.HideLoadingMessage, onHideLoadingMessage);\n $rootContainer.off(events.SCORM.FailedToFindApi, onFailedToFindSCORMApi);\n $rootContainer.off(events.Quizzing.ShowQuizSetup, onShowQuizSetup);\n $rootContainer.off(events.Plugin.Added, initPlugins);\n $rootContainer.off('pointerover', onImagePointerOver);\n $rootContainer.off('pointerleave', onImagePointerLeave);\n _mediaView.mediaWrapper.off(events.ExternalVideo.VideoLoadedMetadata, startViewPortObserver);\n _videoControlsController && _videoControlsController.destroy();\n _videoControlsDisplayModeController && _videoControlsDisplayModeController.destroy();\n _mediaView && _mediaView.destroy();\n _ioOverlayView && _ioOverlayView.destroy();\n _mediaExtensionsController && _mediaExtensionsController.destroy();\n _tabController && _tabController.destroy();\n _externalEventsController && _externalEventsController.destroy();\n _scormErrorMessageBarView && _scormErrorMessageBarView.remove();\n };\n var playVideo = function playVideo() {\n if (_mediaView && _mediaView.mediaElement && _mediaView.type !== mediaViewType.image) {\n if (_mediaView.mediaElement.ended) {\n $rootContainer.trigger(events.Media.Replay);\n } else {\n _mediaView.mediaElement.play();\n }\n }\n return Promise$1.reject('Media Element not yet initialized');\n };\n var pauseVideo = function pauseVideo() {\n if (_mediaView && _mediaView.mediaElement && _mediaView.type !== mediaViewType.image) {\n _mediaView.mediaElement.pause();\n }\n };\n var isInFullScreenMode = function isInFullScreenMode() {\n if (_videoControlsController && _videoControlsController.fullscreenControlView) {\n return _videoControlsController.fullscreenControlView.isFullScreen;\n }\n return false;\n };\n var getIsScrubbing = function getIsScrubbing() {\n if (_videoControlsController && _videoControlsController.progressBarControlView) {\n return _videoControlsController.progressBarControlView.scrubbing;\n }\n return false;\n };\n var setIsScrubbing = function setIsScrubbing(isScrubbingVideo) {\n if (_videoControlsController && _videoControlsController.progressBarControlView) {\n _videoControlsController.progressBarControlView.scrubbing = isScrubbingVideo;\n }\n };\n var getSafeSeekTime = function getSafeSeekTime(time) {\n if (!_mediaView && _mediaView.type === mediaViewType.image && !_mediaView.mediaElement) {\n return 0;\n }\n return videoApiUtils.getSafeSeekTime(_mediaView.mediaElement, time);\n };\n var loadMedia = function loadMedia() {\n if (_mediaHasBeenLoaded) {\n return;\n }\n _mediaHasBeenLoaded = true;\n $rootContainer.find('.video-wrapper').removeClass(cssClasses.hide);\n _mediaView.loadMedia();\n if (playerConfiguration.getAutoPlayMedia() || playerConfiguration.getForceAutoPlayMedia()) {\n $rootContainer.trigger(events.Media.TryToAutoPlay);\n }\n };\n var setExternalCurrentTime = function setExternalCurrentTime(timeInSeconds) {\n var safeSeekTime = videoApiUtils.getSafeSeekTime(_mediaView.mediaElement, timeInSeconds);\n if (_videoControlsController && _mediaView.mediaElement.currentTime.toFixed(VIDEO_TIME_COMPARE_PRECISION) !== safeSeekTime.toFixed(VIDEO_TIME_COMPARE_PRECISION)) {\n _videoControlsController.beforeAfterPlayControlsView.hideVideoClickToReplayLink();\n }\n if (_mediaView.mediaElement.ended) {\n $rootContainer.trigger(events.Media.Replay, {\n time: safeSeekTime,\n playAfterSeek: false\n });\n } else {\n $rootContainer.trigger(events.Media.SeekToTime, {\n time: safeSeekTime\n });\n }\n };\n var initPlugins = function initPlugins(event, data) {\n var pluginController = playerConfiguration.getPluginController();\n if (pluginController && data.viewElementType === supportedPluginViewElements.PLAYER) {\n pluginController.initializePluginsForViewElement(supportedPluginViewElements.PLAYER, _$playerPluginContainer);\n }\n };\n setupExternalEventCallbackHarness();\n createPlayerLayout();\n if (xmpInErrorState) {\n displayXmpErrorMessage();\n }\n _mediaViewReady = createMediaView();\n _mediaViewReady.then(onMediaViewInitialized)[\"catch\"](function (error) {\n log.logException(error);\n });\n return Object.defineProperties({\n loadMedia: loadMedia,\n destroy: destroy,\n play: playVideo,\n pause: pauseVideo,\n // custom view stuff\n isInFullScreenMode: isInFullScreenMode,\n addEventListener: addEventListener,\n removeEventListener: removeEventListener,\n addMediaEventListener: addMediaEventListener,\n removeMediaEventListener: removeMediaEventListener,\n // controls state internal to smart-player-view\n getCaptionsVisible: getCaptionsVisible,\n setCaptionsVisible: setCaptionsVisible,\n getScrubbing: getIsScrubbing,\n setScrubbing: setIsScrubbing,\n // events\n triggerVideoStartEventCallbacks: triggerVideoStartEventCallbacks,\n // util methods\n getSafeSeekTime: getSafeSeekTime\n }, {\n initializedPromise: {\n get: function get() {\n return _viewInitializedPromise;\n }\n },\n currentSrc: {\n get: function get() {\n return _mediaView ? _mediaView.currentSrc : '';\n }\n },\n currentTime: {\n get: function get() {\n return _mediaView ? _mediaView.currentTime : 0;\n },\n set: setExternalCurrentTime\n },\n duration: {\n get: function get() {\n return _mediaView ? _mediaView.duration : 0;\n }\n },\n paused: {\n get: function get() {\n return _mediaView ? _mediaView.paused : false;\n }\n },\n ended: {\n get: function get() {\n return _mediaView ? _mediaView.ended : false;\n }\n },\n seeking: {\n get: function get() {\n return _mediaView ? _mediaView.seeking : false;\n }\n },\n buffered: {\n get: function get() {\n return _mediaView ? _mediaView.buffered : [];\n }\n },\n played: {\n get: function get() {\n return _mediaView ? _mediaView.played : [];\n }\n },\n seekable: {\n get: function get() {\n return _mediaView ? _mediaView.seekable : [];\n }\n },\n volume: {\n get: function get() {\n return _mediaView ? _mediaView.volume : 1;\n },\n set: function set(volumeValue) {\n $rootContainer.trigger(events.Media.SetVolume, {\n volumeValue: volumeValue\n });\n }\n },\n muted: {\n get: function get() {\n return _mediaView ? _mediaView.muted : false;\n },\n set: function set(isMuted) {\n $rootContainer.trigger(events.Media.SetMutedState, {\n isMuted: isMuted\n });\n }\n },\n playbackRate: {\n get: function get() {\n return _mediaView ? _mediaView.playbackRate : 1;\n },\n set: function set(playbackRate) {\n $rootContainer.trigger(events.Media.SetPlaybackRate, {\n playbackRate: playbackRate\n });\n }\n },\n progressBarDisplayWidth: {\n get: function get() {\n return _videoControlsController ? _videoControlsController.progressBarControlView.displayWidth : 0;\n }\n },\n currentDisplayMode: {\n get: function get() {\n return _playerState.displayMode;\n }\n }\n });\n};\nvar SmartPlayerView$1 = {\n /**\n * Factory method that returns a new SmartPlayerView object\n * @function create\n * @memberof TSC.SmartPlayerView\n * @param {String} playerInstanceUUID\n * @param {jQuery} $rootContainer\n * @param {TSC.MediaList} mediaList\n * @param {TSC.XmpModel} xmpModel\n * @param {TSC.Quiz} quizModel\n * @param {TSC.CaptionService} captionService\n * @param {Object} playerConfiguration\n * @static\n * @return new SmartPlayerView instance\n */\n create: SmartPlayerView\n};\n\nvar smartPlayerPreRollEventConstants = Object.freeze({\n PRE_ROLL_STARTED: 'preRollStarted',\n PRE_ROLL_FINISHED: 'preRollFinished',\n PRE_ROLL_FINISHED_ACTIONS: {\n REMOVE_NOW: 'removeNow'\n }\n});\n\nvar preRollView = {\n render: function render(preRollSrc) {\n return templateGenerator.generatePreRollMarkup(preRollSrc);\n }\n};\n\nvar _onPreRollStartedCallback;\nvar $preRollView;\nvar $window = $(window);\nvar preRollMessage = function preRollMessage(e) {\n e = e.originalEvent;\n // filter out non smart player events\n if (!e.data || typeof e.data.indexOf !== 'function' || e.data.indexOf('smartPlayerEventName') === -1) {\n return;\n }\n var message = window.JSON.parse(e.data);\n switch (message.smartPlayerEventName) {\n case smartPlayerPreRollEventConstants.PRE_ROLL_STARTED:\n {\n if (_onPreRollStartedCallback) {\n _onPreRollStartedCallback();\n }\n break;\n }\n case smartPlayerPreRollEventConstants.PRE_ROLL_FINISHED:\n {\n switch (message.data.action) {\n case smartPlayerPreRollEventConstants.PRE_ROLL_FINISHED_ACTIONS.REMOVE_NOW:\n {\n destroyView();\n break;\n }\n }\n break;\n }\n }\n};\nvar onIFrameContentLoaded = function onIFrameContentLoaded() {\n $preRollView.removeClass('preRollHidden');\n};\nvar destroyView = function destroyView() {\n if ($preRollView) {\n $window.off('message', preRollMessage);\n $preRollView.off('load', onIFrameContentLoaded);\n $preRollView.remove();\n $preRollView = undefined;\n _onPreRollStartedCallback = undefined;\n }\n};\nvar preRollController = {\n createView: function createView(preRollSrc, onPreRollStartedCallback) {\n $preRollView = $(preRollView.render(preRollSrc)).appendTo('body');\n $preRollView.on('load', onIFrameContentLoaded);\n _onPreRollStartedCallback = onPreRollStartedCallback;\n $window.on('message', preRollMessage);\n },\n viewExists: function viewExists() {\n return $preRollView !== undefined;\n },\n destroyView: destroyView\n};\n\nvar _$spElement = null;\nvar setTheme$1 = function setTheme(themeName) {\n playerConfiguration.setTheme(themeName);\n applyTheme();\n};\nvar registerCallback = function registerCallback() {\n externalMessageController.addCallback('SET_THEME', setTheme$1);\n};\nvar setSmartPlayerContainerElement = function setSmartPlayerContainerElement($element) {\n _$spElement = $element;\n applyTheme();\n};\nvar getClassNameForTheme = function getClassNameForTheme(theme) {\n return 'smartplayer-' + theme + '-theme';\n};\nvar applyTheme = function applyTheme() {\n if (_$spElement) {\n var themeClassNameAsString = Object.keys(themeNames).reduce(function (accumulator, currentValue) {\n return accumulator + getClassNameForTheme(themeNames[currentValue]) + ' ';\n }, '');\n var currentThemeClassName = getClassNameForTheme(playerConfiguration.getTheme());\n _$spElement.removeClass(themeClassNameAsString);\n _$spElement.addClass(currentThemeClassName);\n }\n};\nregisterCallback();\nvar themeController = {\n setTheme: setTheme$1,\n setSmartPlayerContainerElement: setSmartPlayerContainerElement\n};\n\nvar externalVideoEventIsSupported = function externalVideoEventIsSupported(eventName) {\n return Object.keys(events.ExternalVideo).some(function (eventKey) {\n return events.ExternalVideo[eventKey] === eventName;\n });\n};\n\n// major, minor, build\nvar PLAYER_VERSION = 'x.x.x';\nvar INIT_DEFAULT_WIDTH = 1920;\nvar INIT_DEFAULT_HEIGHT = 1080;\nvar _$rootSmartPlayerElement = null;\nvar _responsiveController = null;\nvar _currentPlayerType = null;\nvar _mediaList = null;\nvar _xmp = null;\nvar _quizModel = null;\nvar _captionService = null;\nvar _smartPlayerView = NullSmartPlayerView$1.create();\nvar _viewCreated = false;\nvar _viewInitialized = false;\nvar _queuedEvents = {};\nvar _queuedExternalConfiguration = {};\nvar _playerInstanceUUID = null;\nvar _xmpInErrorState = false;\nvar mediaListError = function mediaListError() {\n MessageBarView$1.create(_$rootSmartPlayerElement, messageBarType.warning, localizationStrings.getPlayerString(playerStringNames.mediaNotFound));\n};\nvar onPreRollStart = function onPreRollStart() {\n continueInit();\n};\nvar initPlayer = function initPlayer(currentInstanceUUID) {\n _captionService = CaptionService$1.create();\n deviceInfo.lookAtDevice();\n queryParamsStripper.strip();\n themeController.setSmartPlayerContainerElement(_$rootSmartPlayerElement);\n if (playerConfiguration.getPreRollSrc()) {\n preRollController.createView(playerConfiguration.getPreRollSrc(), onPreRollStart);\n } else {\n continueInit(currentInstanceUUID);\n }\n};\nvar continueInit = function continueInit(currentInstanceUUID) {\n var mediaSources = playerConfiguration.getMediaSources();\n _mediaList = MediaList$1.create(mediaSources);\n _mediaList.ready.then(function () {\n if (_playerInstanceUUID === currentInstanceUUID) {\n mediaListReady(currentInstanceUUID);\n }\n }, mediaListError);\n};\nvar playbackInitiatedHandler = function playbackInitiatedHandler() {\n _smartPlayerView.removeEventListener(events.External.VideoStartInitiated, playbackInitiatedHandler);\n if (preRollController && preRollController.viewExists()) {\n preRollController.destroyView();\n }\n};\nvar mediaListReady = function mediaListReady(currentInstanceUUID) {\n _currentPlayerType = mediaPlayerController.getPlayerType(_mediaList);\n _responsiveController = ResponsiveController$1.create(_$rootSmartPlayerElement);\n switch (_currentPlayerType) {\n case playerType.YOUTUBE:\n {\n youTube.addApi();\n analyticsService.setCategory(AnalyticsYouTubeEventCategory);\n // we dont have any info on youtube media, so just default to 1080p, it tends to look right\n _responsiveController.initializeIntrinsicSizing(INIT_DEFAULT_WIDTH, INIT_DEFAULT_HEIGHT);\n processMediaAssets(currentInstanceUUID);\n break;\n }\n case playerType.HTML5_VIDEO:\n {\n analyticsService.setCategory(AnalyticsVideoEventCategory);\n if (playerConfiguration.getPosterImageSrc()) {\n // assumption that quick load of posterUrl will have sizing (or at least aspect ratio to match video)\n initIntrinsicSizingFromImageUrl(playerConfiguration.getPosterImageSrc());\n } else {\n _responsiveController.initializeIntrinsicSizing(INIT_DEFAULT_WIDTH, INIT_DEFAULT_HEIGHT);\n }\n processMediaAssets(currentInstanceUUID);\n break;\n }\n case playerType.IMAGE:\n {\n analyticsService.setCategory(AnalyticsImageEventCategory);\n initIntrinsicSizingFromImageUrl(_mediaList.currentMedia.uri);\n processMediaAssets(currentInstanceUUID);\n break;\n }\n case playerType.NOT_SUPPORTED:\n {\n if (_mediaList.currentMediaType === mediaType.WEBM) {\n MessageBarView$1.create(_$rootSmartPlayerElement, messageBarType.warning, localizationStrings.getPlayerString(playerStringNames.noWebMSupport));\n } else {\n MessageBarView$1.create(_$rootSmartPlayerElement, messageBarType.warning, localizationStrings.getPlayerString(playerStringNames.videoNotSupported));\n }\n break;\n }\n }\n};\nvar setQuizModel = function setQuizModel(xmpModel) {\n if (xmpModel && xmpModel.hasQuiz) {\n _quizModel = Quiz$1.create(xmpModel);\n }\n};\nvar initIntrinsicSizingFromImageUrl = function initIntrinsicSizingFromImageUrl(imgUrl) {\n var img = new Image();\n img.onload = function () {\n _responsiveController.initializeIntrinsicSizing(img.naturalWidth, img.naturalHeight);\n };\n img.onerror = function () {\n _responsiveController.initializeIntrinsicSizing(INIT_DEFAULT_WIDTH, INIT_DEFAULT_HEIGHT);\n };\n img.src = imgUrl;\n};\nvar processQuizzing = function processQuizzing() {\n return new Promise$1(function (resolve) {\n if (playerConfiguration.fathomId) {\n fathomService.addEventListener(events.Fathom.GetComplete, function (xmpModel) {\n resolve(xmpModel);\n });\n fathomService.addEventListener(events.Fathom.Error, function () {\n _xmpInErrorState = true;\n resolve();\n });\n fathomService.getFathom(playerConfiguration.fathomId);\n } else {\n resolve(_xmp);\n }\n });\n};\nvar processCaptionSrc = function processCaptionSrc() {\n if (playerConfiguration.captionSrcList.length > 0) {\n if (_xmp === null) {\n _xmp = Xmp.create();\n }\n return _xmp.importCaptionsFromFile(playerConfiguration.captionSrcList);\n }\n return Promise$1.resolve();\n};\nvar processXMP = function processXMP() {\n return new Promise$1(function (resolve) {\n if (playerConfiguration.xmpSrc) {\n _xmp = Xmp.create();\n if (window.TSC && typeof window.TSC.embedded_config_xml === 'string') {\n _xmp.parse(window.TSC.embedded_config_xml);\n } else {\n _xmp.load(playerConfiguration.xmpSrc, false);\n }\n _xmp.ready.then(resolve)[\"catch\"](function () {\n _xmpInErrorState = true;\n _xmp.abortPendingRequests();\n _xmp = null;\n resolve();\n });\n } else {\n if (playerConfiguration.getTocModelFromDescription()) {\n _xmp = Xmp.create();\n }\n resolve();\n }\n });\n};\nvar processMediaAssets = function processMediaAssets(currentInstanceUUID) {\n if (playerConfiguration.getGoogleAnalyticsID()) {\n analyticsService.initGoogleAnalytics();\n }\n processXMP().then(function () {\n if (_playerInstanceUUID === currentInstanceUUID) {\n if (_xmp) {\n playerConfiguration.configureFromXmp(_xmp);\n localizationStrings.configureFromXmp(_xmp);\n }\n processCaptionSrc().then(function () {\n if (_playerInstanceUUID === currentInstanceUUID) {\n processQuizzing().then(function (xmpModel) {\n if (_playerInstanceUUID === currentInstanceUUID) {\n if (xmpModel) {\n setQuizModel(xmpModel);\n }\n setupPlayer(currentInstanceUUID);\n }\n });\n }\n });\n }\n });\n};\nvar captionChangeHandler = function captionChangeHandler(text) {\n if (iFrameBridge.isInIframe()) {\n iFrameBridge.postMessage('CAPTION-CHANGED', '*', text);\n }\n};\nvar setupBasicCss = function setupBasicCss() {\n _$rootSmartPlayerElement.addClass(cssClasses.smartPlayerNamespace);\n _$rootSmartPlayerElement.addClass(cssClasses.playerControlsVisible);\n if (playerConfiguration.getUseLargerProgressBar()) {\n _$rootSmartPlayerElement.addClass(cssClasses.largerProgressBar);\n }\n\n // mainly for backwards compat for pre-version 3.38.0 traverse parent-chain and set height/pad/etc if default\n if (playerConfiguration.getFullViewPort()) {\n _$rootSmartPlayerElement.parents().each(function (index, parentNode) {\n var $parentNode = $(parentNode);\n $parentNode.height('100%');\n if ($parentNode.prop('tagName').toLowerCase() === 'body') {\n $parentNode.css({\n margin: 0,\n padding: 0,\n border: 0,\n overflow: 'hidden'\n });\n }\n });\n }\n};\nvar addQueuedEventsToSmartPlayerView = function addQueuedEventsToSmartPlayerView() {\n Object.keys(_queuedEvents).forEach(function (eventName) {\n _queuedEvents[eventName].forEach(function (eventCallback) {\n addEventListener$1(eventName, eventCallback);\n });\n });\n};\nvar setQueuedConfigurationValuesToSmartPlayerView = function setQueuedConfigurationValuesToSmartPlayerView() {\n if (_queuedExternalConfiguration.volume !== undefined) {\n _smartPlayerView.volume = _queuedExternalConfiguration.volume;\n }\n if (_queuedExternalConfiguration.muted !== undefined) {\n _smartPlayerView.muted = _queuedExternalConfiguration.muted;\n }\n if (_queuedExternalConfiguration.playbackRate !== undefined) {\n _smartPlayerView.playbackRate = _queuedExternalConfiguration.playbackRate;\n }\n};\nvar initPlayerView = function initPlayerView(currentInstanceUUID, displayLocalWarning) {\n _smartPlayerView = SmartPlayerView$1.create(currentInstanceUUID, _$rootSmartPlayerElement, _mediaList, _xmp, _quizModel, _captionService, playerConfiguration, _responsiveController, _xmpInErrorState);\n _viewCreated = true;\n addQueuedEventsToSmartPlayerView();\n _smartPlayerView.initializedPromise.then(function () {\n if (_playerInstanceUUID === currentInstanceUUID) {\n _viewInitialized = true;\n setQueuedConfigurationValuesToSmartPlayerView();\n _smartPlayerView.addEventListener(events.External.VideoStartInitiated, playbackInitiatedHandler);\n _smartPlayerView.addEventListener(events.External.CaptionChange, captionChangeHandler);\n if (playerConfiguration.getAutoPlayMedia() || playerConfiguration.getForceAutoPlayMedia()) {\n _smartPlayerView.loadMedia();\n }\n if (displayLocalWarning) {\n MessageBarView$1.create(_$rootSmartPlayerElement, messageBarType.info, localizationStrings.getPlayerString(playerStringNames.xmpSecurity), localizationStrings.getPlayerString(playerStringNames.close));\n }\n }\n });\n};\nvar setupPlayer = function setupPlayer(currentInstanceUUID) {\n var displayLocalWarning = false;\n if (_currentPlayerType === playerType.IMAGE) {\n _$rootSmartPlayerElement.addClass('image-view');\n } else {\n _$rootSmartPlayerElement.addClass('video-view');\n }\n if (_xmp) {\n if (_xmp.hasCaptionItems) {\n if (iFrameBridge.isInIframe()) {\n iFrameBridge.postMessage('HAS-CAPTIONS', '*');\n }\n }\n }\n if (_quizModel && _quizModel.hasQuiz) {\n if (deviceInfo.isLocal() && _quizModel.reportMethod !== reportType.NONE) {\n displayLocalWarning = true;\n _quizModel.reportMethod = reportType.NONE;\n } else if (_quizModel.useScorm && _quizModel.totalNumberOfGradedQuestionSets === 0) {\n playerConfiguration.isScormLesson = true;\n }\n }\n if (playerConfiguration.isScormLesson) {\n scormController$1.init().then(function () {\n initPlayerView(currentInstanceUUID, displayLocalWarning);\n });\n } else {\n initPlayerView(currentInstanceUUID, displayLocalWarning);\n }\n};\nvar triggerEvent = function triggerEvent(eventName, data) {\n if (_$rootSmartPlayerElement) {\n _$rootSmartPlayerElement.trigger(eventName, data);\n }\n};\nvar init = function init(rootElementID) {\n _playerInstanceUUID = uuidGenerator$1.getUUID();\n performanceWrapper.createMarker(events.Timing.PlayerInitialized);\n _$rootSmartPlayerElement = $(rootElementID);\n setupBasicCss();\n initPlayer(_playerInstanceUUID);\n};\nvar getSmartPlayerRootElement = function getSmartPlayerRootElement() {\n return _$rootSmartPlayerElement;\n};\nvar destroy$1 = function destroy() {\n _playerInstanceUUID = null;\n _currentPlayerType = null;\n _mediaList = null;\n _xmp && _xmp.abortPendingRequests();\n _xmp = null;\n _quizModel = null;\n _viewCreated = false;\n _viewInitialized = false;\n _captionService = null;\n _queuedEvents = {};\n _queuedExternalConfiguration = {};\n _xmpInErrorState = false;\n fathomService.abortPendingRequests();\n localizationStrings.reset();\n if (_$rootSmartPlayerElement) {\n _smartPlayerView.removeEventListener(events.External.VideoStartInitiated, playbackInitiatedHandler);\n _smartPlayerView.removeEventListener(events.External.CaptionChange, captionChangeHandler);\n _smartPlayerView.destroy();\n _smartPlayerView = NullSmartPlayerView$1.create();\n _$rootSmartPlayerElement.removeClass(cssClasses.smartPlayerNamespace + ' ' + cssClasses.largerProgressBar + ' video-view image-view');\n _$rootSmartPlayerElement = null;\n }\n};\nvar getVersion = function getVersion() {\n return PLAYER_VERSION;\n};\nvar playMedia = function playMedia() {\n _smartPlayerView.play();\n};\nvar pauseMedia = function pauseMedia() {\n _smartPlayerView.pause();\n};\nvar queueEventHandler = function queueEventHandler(eventName, callback) {\n if (!_queuedEvents[eventName]) {\n _queuedEvents[eventName] = [];\n }\n _queuedEvents[eventName].push(callback);\n};\nvar dequeueEventHandler = function dequeueEventHandler(eventName, callback) {\n var eventEntry = _queuedEvents[eventName];\n if (eventEntry) {\n for (var i = 0; i < eventEntry.length; i++) {\n if (eventEntry[i] === callback) {\n eventEntry.splice(i, 1);\n break;\n }\n }\n if (eventEntry.length === 0) {\n _queuedEvents[eventName] = undefined;\n }\n }\n};\nvar addEventListener$1 = function addEventListener(eventName, callback) {\n if (!_viewCreated) {\n queueEventHandler(eventName, callback);\n } else if (externalVideoEventIsSupported(eventName)) {\n _smartPlayerView.addMediaEventListener(eventName, callback);\n } else {\n _smartPlayerView.addEventListener(eventName, callback);\n }\n};\nvar removeEventListener$1 = function removeEventListener(eventName, callback) {\n if (!_viewInitialized) {\n dequeueEventHandler(eventName, callback);\n } else if (externalVideoEventIsSupported(eventName)) {\n _smartPlayerView.removeMediaEventListener(eventName, callback);\n } else {\n _smartPlayerView.removeEventListener(eventName, callback);\n }\n};\nvar getCurrentSrc = function getCurrentSrc() {\n return _viewInitialized ? _smartPlayerView.currentSrc : playerConfiguration.getMediaSrc();\n};\nvar getCurrentTime = function getCurrentTime() {\n return _smartPlayerView.currentTime;\n};\nvar setCurrentTime = function setCurrentTime(timeInSeconds) {\n _smartPlayerView.currentTime = timeInSeconds;\n};\nvar getDuration = function getDuration() {\n return _smartPlayerView.duration;\n};\nvar getEnded = function getEnded() {\n return _smartPlayerView.ended;\n};\nvar getPaused = function getPaused() {\n return _smartPlayerView.paused;\n};\nvar getPlaybackRate = function getPlaybackRate() {\n return _smartPlayerView.playbackRate;\n};\nvar setPlaybackRate = function setPlaybackRate(playbackRate) {\n if (_viewInitialized) {\n _smartPlayerView.playbackRate = playbackRate;\n } else {\n _queuedExternalConfiguration.playbackRate = playbackRate;\n }\n};\nvar getBuffered = function getBuffered() {\n return _smartPlayerView.buffered;\n};\nvar getPlayed = function getPlayed() {\n return _smartPlayerView.played;\n};\nvar getSeekable = function getSeekable() {\n return _smartPlayerView.seekable;\n};\nvar getSeeking = function getSeeking() {\n return _smartPlayerView.seeking;\n};\nvar getVolume = function getVolume() {\n return _smartPlayerView.volume;\n};\nvar setVolume = function setVolume(volumeValue) {\n if (_viewInitialized) {\n _smartPlayerView.volume = volumeValue;\n } else {\n _queuedExternalConfiguration.volume = volumeValue;\n }\n};\nvar getMuted = function getMuted() {\n return _viewInitialized ? _smartPlayerView.muted : _queuedExternalConfiguration.muted;\n};\nvar setMuted$1 = function setMuted(isMuted) {\n if (_viewInitialized) {\n _smartPlayerView.muted = isMuted;\n } else {\n _queuedExternalConfiguration.muted = isMuted;\n }\n};\nvar isInFullScreenMode = function isInFullScreenMode() {\n return _smartPlayerView.isInFullScreenMode();\n};\nvar getScrubbing = function getScrubbing() {\n return _smartPlayerView.getScrubbing();\n};\nvar setScrubbing = function setScrubbing(isScrubbing) {\n _smartPlayerView.setScrubbing(isScrubbing);\n};\nvar getSafeSeekTime = function getSafeSeekTime(time) {\n return _smartPlayerView.getSafeSeekTime(time);\n};\nvar getCaptionsVisible = function getCaptionsVisible() {\n return _smartPlayerView.getCaptionsVisible();\n};\nvar setCaptionsVisible = function setCaptionsVisible(isVisible) {\n _smartPlayerView.setCaptionsVisible(isVisible);\n};\nvar getIsYouTube = function getIsYouTube() {\n return _mediaList ? mediaPlayerController.getPlayerType(_mediaList) === playerType.YOUTUBE : false;\n};\nvar getCaptionCollection = function getCaptionCollection() {\n return _captionService && _captionService.captionTrack && _captionService.captionTrack.captionCollection ? _captionService.captionTrack.captionCollection : null;\n};\nvar getCaptionTrack = function getCaptionTrack() {\n return _captionService.captionTrack;\n};\nvar setCaptionTrack = function setCaptionTrack(value) {\n _captionService.captionTrack = value;\n};\nvar getTocChapters = function getTocChapters() {\n if (!_xmp || !_xmp.hasTocItems) {\n return [];\n }\n return _xmp.tocItemArray;\n};\nvar getProgressBarDisplayWidth = function getProgressBarDisplayWidth() {\n return _smartPlayerView ? _smartPlayerView.progressBarDisplayWidth : 0;\n};\nvar getCurrentDisplayMode = function getCurrentDisplayMode() {\n return _smartPlayerView && _smartPlayerView.currentDisplayMode;\n};\nvar mediaPlayer = Object.defineProperties({\n init: init,\n destroy: destroy$1,\n getSmartPlayerRootElement: getSmartPlayerRootElement,\n getVersion: getVersion,\n jsSeekTime: setCurrentTime,\n jsPlay: playMedia,\n play: playMedia,\n pause: pauseMedia,\n getCurrentSrc: getCurrentSrc,\n getCurrentTime: getCurrentTime,\n setCurrentTime: setCurrentTime,\n getDuration: getDuration,\n getEnded: getEnded,\n getPaused: getPaused,\n getPlaybackRate: getPlaybackRate,\n setPlaybackRate: setPlaybackRate,\n getBuffered: getBuffered,\n getPlayed: getPlayed,\n getSeekable: getSeekable,\n getSeeking: getSeeking,\n getVolume: getVolume,\n setVolume: setVolume,\n getMuted: getMuted,\n setMuted: setMuted$1,\n isInFullScreenMode: isInFullScreenMode,\n getScrubbing: getScrubbing,\n setScrubbing: setScrubbing,\n getSafeSeekTime: getSafeSeekTime,\n addEventListener: addEventListener$1,\n removeEventListener: removeEventListener$1,\n triggerEvent: triggerEvent,\n getCaptionsVisible: getCaptionsVisible,\n setCaptionsVisible: setCaptionsVisible,\n getIsYouTube: getIsYouTube,\n getCaptionCollection: getCaptionCollection,\n getCaptionTrack: getCaptionTrack,\n setCaptionTrack: setCaptionTrack,\n getTocChapters: getTocChapters,\n getProgressBarDisplayWidth: getProgressBarDisplayWidth,\n getCurrentDisplayMode: getCurrentDisplayMode\n}, {});\n\n/**\n * @memberof TSC\n * @class Plugin\n * @classdesc Plugin Object\n * @param {String} pluginName - name of plugin\n * @param {String} viewElementType - view element type to install plugin into\n */\nvar Plugin = function Plugin(pluginName, viewElementType) {\n var _initialized = false;\n var _initializedPromiseResolve;\n var _initializedPromise = new Promise$1(function (resolve) {\n _initializedPromiseResolve = resolve;\n });\n var _pluginName = pluginName;\n var _viewElementType = viewElementType;\n\n /**\n * @function init\n * @memberOf TSC.Plugin\n * Initialize plugin with dom element container that will resolve initialized promise.\n * @param {HTMLElement} pluginContainerElement - dom element that will be the container for plugin UI\n */\n var init = function init(pluginContainerElement) {\n if (_initialized) {\n return;\n }\n _initialized = true;\n _initializedPromiseResolve({\n pluginContainerElement: pluginContainerElement\n });\n };\n return Object.defineProperties({\n init: init\n }, {\n initialized: {\n get: function get() {\n return _initialized;\n }\n },\n initializedPromise: {\n get: function get() {\n return _initializedPromise;\n }\n },\n pluginName: {\n get: function get() {\n return _pluginName;\n }\n },\n viewElementType: {\n get: function get() {\n return _viewElementType;\n }\n }\n });\n};\nvar Plugin$1 = {\n /**\n * Factory method that returns a new Plugin object.\n * @function create\n * @memberof TSC.Plugin\n * @static\n * @return new Plugin instance\n */\n create: Plugin\n};\n\nvar REMOVE_SPACES_REGEX = /\\s+/g;\n\n/**\n * @memberof TSC\n * @class PluginController\n * @classdesc Plugin Controller to wire up external plugins\n */\nvar PluginController = function PluginController() {\n var _plugins = {};\n\n /**\n * @function isViewElementTypeSupported\n * Check to see if a viewElementType is supported.\n * @param {String} viewElementType - view element type for plugin\n * @return {Boolean} return if passed in viewElementType is supported.\n */\n var isViewElementTypeSupported = function isViewElementTypeSupported(viewElementType) {\n return Object.keys(supportedPluginViewElements).some(function (key) {\n return supportedPluginViewElements[key] === viewElementType;\n });\n };\n\n /**\n * @function getPluginsForViewElementType\n * Get a list of plugin objects for the passed in view element type.\n * @param {String} viewElementType - view element type for plugin\n * @return {Array} return an array of supported plugins for the passed in view element type\n */\n var getPluginsForViewElementType = function getPluginsForViewElementType(viewElementType) {\n return Object.keys(_plugins).filter(function (key) {\n return _plugins[key].viewElementType === viewElementType;\n }).map(function (key) {\n return _plugins[key];\n });\n };\n\n /**\n * @function getPluginContainerElement\n * Get a new div element setup for a plugin to append elements to.\n * @param {String} pluginName - name of plugin\n * @return {Element} return a new div element setup for old plugin dom\n */\n var getPluginContainerElement = function getPluginContainerElement(pluginName) {\n var pluginNameNoSpaces = pluginName.replace(REMOVE_SPACES_REGEX, '');\n var pluginNamedContainerClassName = cssClasses.pluginNamedContainerPrefix + pluginNameNoSpaces;\n var pluginContainerElement = document.createElement('div');\n pluginContainerElement.classList.add(cssClasses.generatedPluginContainer);\n pluginContainerElement.classList.add(pluginNamedContainerClassName);\n return pluginContainerElement;\n };\n\n /**\n * @function registerPlugin\n * @methodOf TSC.PluginController\n * @param {String} pluginName - name of plugin\n * @param {String} viewElementType - view element type to install plugin into\n * @return {Promise} return a promise that resolves when the specified view element has initialized the plugin\n */\n var registerPlugin = function registerPlugin(pluginName, viewElementType) {\n if (_plugins[pluginName]) {\n var pluginSameNameMessage = 'Plugin with name [' + pluginName + '] is already registered with the player.';\n log.logMessage(pluginSameNameMessage);\n return Promise$1.reject(pluginSameNameMessage);\n }\n if (!isViewElementTypeSupported(viewElementType)) {\n var pluginUnsupportedViewElementMessage = 'Plugin with name [' + pluginName + '] is registering with an unsupported view element [' + viewElementType + '].';\n log.logMessage(pluginUnsupportedViewElementMessage);\n return Promise$1.reject(pluginUnsupportedViewElementMessage);\n }\n var plugin = Plugin$1.create(pluginName, viewElementType);\n _plugins[pluginName] = plugin;\n return plugin.initializedPromise;\n };\n\n /**\n * @function initializePluginsForViewElement\n * @methodOf TSC.PluginController\n * Initialize all registered plugins for the passed in view element type\n * @param {String} viewElementType - view element type\n * @param {jQuery} $viewElementPluginContainer - jQuery element to add plugin dom elements into.\n */\n var initializePluginsForViewElement = function initializePluginsForViewElement(viewElementType, $viewElementPluginContainer) {\n if (!isViewElementTypeSupported(viewElementType)) {\n log.logMessage('Tried to initialize plugin with unsupported view element type [' + viewElementType + ']');\n return;\n }\n var elementTypePlugins = getPluginsForViewElementType(viewElementType);\n elementTypePlugins.forEach(function (plugin) {\n if (plugin.initialized) {\n return;\n }\n var pluginContainerElement = getPluginContainerElement(plugin.pluginName);\n $viewElementPluginContainer.append(pluginContainerElement);\n plugin.init(pluginContainerElement);\n });\n if (elementTypePlugins.length === 0) {\n $viewElementPluginContainer.hide();\n } else {\n $viewElementPluginContainer.show();\n }\n };\n return Object.defineProperties({\n registerPlugin: registerPlugin,\n initializePluginsForViewElement: initializePluginsForViewElement\n }, {});\n};\nvar PluginController$1 = {\n /**\n * Factory method that returns a new PluginController object.\n * @function create\n * @memberof TSC.PluginController\n * @static\n * @return new PluginController instance\n */\n create: PluginController\n};\n\nvar CamtasiaQuizPreviewView = function CamtasiaQuizPreviewView($container, xmpString) {\n var xmpModel = Xmp.create();\n xmpModel.parse(xmpString);\n return xmpModel.ready.then(function () {\n playerConfiguration.configureFromXmp(xmpModel);\n localizationStrings.configureFromXmp(xmpModel);\n var beforeAfterPlayControlsView = BeforeAfterPlayControlsView$1.create($container, playerConfiguration);\n var noOp = function noOp() {}; // eslint-disable-line\n var playerMarkup = templateGenerator.generateVideoViewMarkup('quiz-preview-' + new Date().getTime());\n $container.html(playerMarkup);\n var ioOverlayView = IoOverlayView$1.create($container);\n var mediaView = VideoElementView$1.create($container, $container.find('.media-container'), ['video.mp4'], true, noOp, noOp, ioOverlayView);\n\n // hack Camtasia quiz preview template to display preview correctly\n var previewElement = document.getElementsByClassName('video-view');\n if (previewElement.length > 0) {\n previewElement[0].style.height = '100%';\n }\n mediaView.mediaElement.style.display = 'none';\n var quizModel = Quiz$1.create(xmpModel);\n var quizController = QuizController$1.create($container, mediaView, quizModel, beforeAfterPlayControlsView, true);\n quizController.displayNextQuestionSet();\n });\n};\nvar CamtasiaQuizPreviewView$1 = {\n create: CamtasiaQuizPreviewView\n};\n\nvar dependencies = {\n\t\"@techsmith/tsc-cloud-style-guide\": \"^24.0.0\",\n\t\"@techsmith/tsc-media-extensions-js\": \"10.7.2\",\n\tjquery: \"^3.5.1\",\n\tpepjs: \"0.4.3\",\n\t\"promise-polyfill\": \"^8.1.0\",\n\ttinycolor2: \"^1.4.1\"\n};\nvar devDependencies = {\n\t\"@babel/core\": \"^7.20.12\",\n\t\"@babel/preset-env\": \"^7.12.13\",\n\t\"@rollup/plugin-alias\": \"^5.1.0\",\n\t\"@rollup/plugin-babel\": \"^6.0.4\",\n\t\"@rollup/plugin-commonjs\": \"^25.0.7\",\n\t\"@rollup/plugin-json\": \"^6.1.0\",\n\t\"@rollup/plugin-node-resolve\": \"^15.2.3\",\n\t\"@rollup/plugin-terser\": \"^0.4.4\",\n\tautoprefixer: \"^6.3.5\",\n\t\"axe-core\": \"^3.2.2\",\n\tcommander: \"^12.0.0\",\n\tcompressing: \"^1.5.0\",\n\tcssnano: \"^3.5.2\",\n\tcypress: \"^10.6.0\",\n\t\"cypress-axe\": \"^1.0.0\",\n\t\"cypress-intellij-reporter\": \"^0.0.7\",\n\tesbuild: \"^0.17.4\",\n\teslint: \"^7.5.0\",\n\t\"eslint-config-techsmith\": \"^1.1.0\",\n\tgrunt: \"~1.6.1\",\n\t\"grunt-banner\": \"^0.6.0\",\n\t\"grunt-cdnify\": \"~1.0.2\",\n\t\"grunt-cli\": \"~1.4.3\",\n\t\"grunt-contrib-clean\": \"~2.0.0\",\n\t\"grunt-contrib-concat\": \"^1.0.1\",\n\t\"grunt-contrib-connect\": \"~2.0.0\",\n\t\"grunt-contrib-copy\": \"~1.0.0\",\n\t\"grunt-contrib-less\": \"^2.0.0\",\n\t\"grunt-contrib-watch\": \"~1.1.0\",\n\t\"grunt-downloadfile\": \"^2.1.1\",\n\t\"grunt-htmlrefs\": \"~0.5.0\",\n\t\"grunt-md2html\": \"~0.3.1\",\n\t\"grunt-newer\": \"~1.3.0\",\n\t\"grunt-open\": \"~0.2.4\",\n\t\"grunt-postcss\": \"^0.9.0\",\n\t\"grunt-replace\": \"~1.0.1\",\n\t\"grunt-shell\": \"^3.0.1\",\n\t\"jasmine-core\": \"^2.5.2\",\n\tkarma: \"^6.3.20\",\n\t\"karma-chrome-launcher\": \"^2.2.0\",\n\t\"karma-jasmine\": \"^1.1.2\",\n\t\"karma-mocha-reporter\": \"^2.2.5\",\n\t\"karma-rollup-preprocessor\": \"^7.0.0\",\n\t\"load-grunt-tasks\": \"^0.4.0\",\n\tlodash: \"^4.17.19\",\n\tmarkdown: \"^0.5.0\",\n\t\"postcss-assets\": \"^4.0.1\",\n\t\"postcss-svg\": \"^1.0.6\",\n\trollup: \"^4.14.0\",\n\t\"rollup-plugin-filesize\": \"^10.0.0\",\n\t\"rollup-plugin-glob-import\": \"^0.5.0\",\n\t\"rollup-plugin-license\": \"^3.3.1\",\n\t\"time-grunt\": \"^2.0.0\",\n\tyamljs: \"^0.2.4\"\n};\nvar license = \"UNLICENSED\";\nvar main = \"dist/techsmith-smart-player.js\";\nvar module$1 = \"dist/techsmith-smart-player.esm.js\";\nvar name = \"@techsmith/techsmith-smartplayer\";\nvar preferGlobal = false;\nvar repository = {\n\ttype: \"git\",\n\turl: \"https://github.com/TechSmith/SmartPlayer.git\"\n};\nvar scripts = {\n\tbuildSmartPlayerIife: \"npx rollup --config rollup.config.mjs --config-env production --config-package smartplayer --config-format iife\",\n\tbuildEmbedIife: \"npx rollup --config rollup.config.mjs --config-env production --config-package embed --config-format iife\",\n\tbuildSmartPlayerEsm: \"npx rollup --config rollup.config.mjs --config-env production --config-package smartplayer --config-format esm\",\n\tbuildPreRollIife: \"npx rollup --config rollup.config.mjs --config-env production --config-package preroll --config-format iife\",\n\tdevSmartPlayerIife: \"npx rollup --config rollup.config.mjs --config-env development --config-package smartplayer --config-format iife\",\n\tdevSmartPlayerEsm: \"npx rollup --config rollup.config.mjs --config-env development --config-package smartplayer --config-format esm\",\n\tdevEmbedIife: \"npx rollup --config rollup.config.mjs --config-env development --config-package embed --config-format iife\",\n\tdevPreRollIife: \"npx rollup --config rollup.config.mjs --config-env development --config-package preroll --config-format iife\",\n\tdevESBIife: \"node ./esbuild.config.js --config-env development --config-package smartplayer --config-format iife\",\n\tdevESBEmbedIife: \"node ./esbuild.config.js --config-env development --config-package embed --config-format iife\",\n\tdevESBPrerollIife: \"node ./esbuild.config.js --config-env development --config-package preroll --config-format iife\",\n\tdevESBIEsm: \"node ./esbuild.config.js --config-env development --config-package smartplayer --config-format esm\",\n\t\"integration-release\": \"grunt integration --rs='bin/integration'\",\n\tlint: \"npx eslint html5/**/*.js\",\n\t\"lint-fix\": \"npx eslint html5/**/*.js --fix\",\n\ttest: \"npx karma start ./karma.config.js --single-run\",\n\t\"test-watch\": \"npx karma start ./karma.config.js\"\n};\nvar version = \"5.121.0\";\nvar packageJson = {\n\tdependencies: dependencies,\n\tdevDependencies: devDependencies,\n\tlicense: license,\n\tmain: main,\n\tmodule: module$1,\n\tname: name,\n\tpreferGlobal: preferGlobal,\n\trepository: repository,\n\tscripts: scripts,\n\tversion: version\n};\n\nvar timeCodeRegex = /^((0?[0-9]:)?[0-5]?[0-9]):([0-5][0-9]) /;\nvar newlineRegex = /\\r?\\n/g;\nvar milliseconds = 1000;\nvar defaultStartTime = 0;\nvar defaultChapterName = localizationStrings.getPlayerString(playerStringNames.defaultFirstChapterName);\nvar getChapterNameFromLineString = function getChapterNameFromLineString(lineString) {\n return lineString.indexOf(' ') === -1 ? defaultChapterName : lineString.substring(lineString.indexOf(' '), lineString.length).trim();\n};\nvar createTocItem = function createTocItem(chapterName, startTime) {\n var chapterParams = {\n name: chapterName,\n startTime: startTime\n };\n if (playerConfiguration.videoThumbnailsSrc) {\n chapterParams.image = playerConfiguration.videoThumbnailsSrc;\n var rect = getThumbnailRectangleByTime(startTime / milliseconds, playerConfiguration.videoThumbnailInterval, playerConfiguration.videoThumbnailColumns, playerConfiguration.videoThumbnailWidth, playerConfiguration.videoThumbnailHeight);\n chapterParams.imageRectangle = ImageRectangle$1.create({\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height\n });\n }\n return TableOfContentsItem$1.create(chapterParams);\n};\nvar parseTableOfContentsItemFromString = function parseTableOfContentsItemFromString(lineString) {\n var timecodes = lineString.match(timeCodeRegex);\n if (timecodes) {\n var chapterName = getChapterNameFromLineString(lineString);\n var chapterStartTime = timeFormatter.convertTimecodeToMilliseconds(timecodes[0]);\n return createTocItem(chapterName, chapterStartTime);\n }\n};\n\n/**\n * Utility function will take a block of text as a string and parse it looking for chapter information to convert to a TOC Model.\n * @function textToTocModel\n * @param {String} textString - A string of text to search to see if it contains chapter information to convert to a TOC model.\n * @returns {TableOfContentsTrack} Table of Contents Track object from TSC media extensions lib.\n */\nvar textToTocModel = function textToTocModel(textString) {\n if (!textString || typeof textString !== 'string') {\n return null;\n }\n var textSplitNewlines = textString.split(newlineRegex);\n var chapterItems = [];\n var previousTocItemStartTime = -1;\n textSplitNewlines.forEach(function (textLine) {\n if (timeCodeRegex.test(textLine)) {\n var tocItem = parseTableOfContentsItemFromString(textLine);\n if (tocItem && tocItem.startTime > previousTocItemStartTime) {\n previousTocItemStartTime = tocItem.startTime;\n chapterItems.push(tocItem);\n }\n }\n });\n\n // insert a default chapter at time 0 if the input did not specify one\n if (chapterItems.length && chapterItems[0].startTime !== 0) {\n chapterItems.unshift(createTocItem(defaultChapterName, defaultStartTime));\n }\n return chapterItems.length ? TableOfContentsTrack$1.create({\n items: chapterItems\n }) : null;\n};\n\nvar deprecatedConfigSetter = function deprecatedConfigSetter(deprecatedName) {\n console.info(\"[SmartPlayer] \".concat(deprecatedName, \" setter is deprecated.\")); // eslint-disable-line no-console\n};\nvar deprecatedConfigGetter = function deprecatedConfigGetter(deprecatedName, returnValue) {\n console.info(\"[SmartPlayer] \".concat(deprecatedName, \" getter is deprecated.\")); // eslint-disable-line no-console\n return returnValue;\n};\n\nvar _started = false;\nvar _controls = mediaInterfaceConstants.controls.autohide;\nvar _authInfo = {};\nvar _lastError = null;\nvar _pluginController = null;\nvar addEventListener = function addEventListener(eventName, callback) {\n if (eventName === events.External.AnalyticsEvent || eventName === events.External.GoogleAnalyticsCustomEvent) {\n playerConfiguration.useCustomEventTracking(true, callback);\n } else if (eventName === events.External.GoogleAnalytics4Event) {\n playerConfiguration.setGA4EventCallback(callback);\n } else {\n mediaPlayer.addEventListener(eventName, callback);\n }\n};\nvar removeEventListener = function removeEventListener(eventName, callback) {\n if (eventName === events.External.AnalyticsEvent || eventName === events.External.GoogleAnalyticsCustomEvent) {\n playerConfiguration.useCustomEventTracking(false, callback);\n } else if (eventName === events.External.GoogleAnalytics4Event) {\n playerConfiguration.setGA4EventCallback(null);\n } else {\n mediaPlayer.removeEventListener(eventName, callback);\n }\n};\nvar setAutoPlay = function setAutoPlay(value) {\n playerConfiguration.setAutoPlayMedia(String(value).toLowerCase() === 'true');\n};\nvar getControls = function getControls() {\n return _controls;\n};\nvar setControls = function setControls(value) {\n var lowerCaseValue = String(value).toLowerCase();\n if (lowerCaseValue === mediaInterfaceConstants.controls[\"false\"]) {\n _controls = mediaInterfaceConstants.controls[\"false\"];\n playerConfiguration.setDisableControls(true);\n playerConfiguration.setAutoHideControls(false);\n playerConfiguration.setDisableYouTubeControls(true);\n } else if (lowerCaseValue === mediaInterfaceConstants.controls[\"true\"]) {\n _controls = mediaInterfaceConstants.controls[\"true\"];\n playerConfiguration.setDisableControls(false);\n playerConfiguration.setAutoHideControls(false);\n playerConfiguration.setDisableYouTubeControls(true);\n } else if (lowerCaseValue === mediaInterfaceConstants.controls.youtube) {\n _controls = mediaInterfaceConstants.controls.youtube;\n playerConfiguration.setDisableControls(true);\n playerConfiguration.setAutoHideControls(false);\n playerConfiguration.setDisableYouTubeControls(false);\n } else {\n // default 'autohide'\n _controls = mediaInterfaceConstants.controls.autohide;\n playerConfiguration.setDisableControls(false);\n playerConfiguration.setAutoHideControls(true);\n playerConfiguration.setDisableYouTubeControls(true);\n }\n mediaPlayer.triggerEvent(events.Controls.Updated);\n};\nvar setDisableInteractions = function setDisableInteractions(disableInteractions) {\n playerConfiguration.setDisableInteractions(disableInteractions);\n mediaPlayer.triggerEvent(events.Controls.Updated);\n};\nvar getLoop = function getLoop() {\n var endActionParam = playerConfiguration.getEndActionParam();\n return playerConfiguration.getEndActionType().toLowerCase() === 'loop' && (endActionParam === 'true' || endActionParam === '1');\n};\nvar setLoop = function setLoop(value) {\n if (String(value).toLowerCase() === 'true') {\n playerConfiguration.setEndActionType('loop');\n playerConfiguration.setEndActionParam('true');\n } else {\n playerConfiguration.setEndActionType('stop');\n playerConfiguration.setEndActionParam('true');\n }\n};\nvar getError = function getError() {\n return _lastError;\n};\nvar setMuted = function setMuted(value) {\n mediaPlayer.setMuted(String(value).toLowerCase() === 'true');\n};\nvar getContextMenuEnabled = function getContextMenuEnabled() {\n return !playerConfiguration.getDisableContextMenuForVideo();\n};\nvar setContextMenuEnabled = function setContextMenuEnabled(value) {\n playerConfiguration.setDisableContextMenuForVideo(!value);\n};\nvar getQuizCreateInstanceUrl = function getQuizCreateInstanceUrl() {\n return quizService.getQuizCreateInstanceUrl();\n};\nvar setQuizCreateInstanceUrl = function setQuizCreateInstanceUrl(value) {\n quizService.setQuizCreateInstanceUrl(value);\n};\nvar getAuthInfo = function getAuthInfo() {\n return _authInfo;\n};\nvar setAuthInfo = function setAuthInfo(value) {\n if (_typeof$1(value) === 'object') {\n _authInfo = $.extend(_authInfo, value);\n }\n};\nvar addMediaSrc = function addMediaSrc(src) {\n playerConfiguration.addMediaSrc(src);\n};\nvar generalErrorHandler = function generalErrorHandler(event) {\n _lastError = event.data;\n};\nvar run = function run(containerId) {\n if (_started) {\n return;\n }\n deviceInfo.lookAtDevice();\n if (_authInfo.accessTokenEndpoint) {\n playerConfiguration.setTechSmithAccessTokenEndpoint(_authInfo.accessTokenEndpoint);\n }\n playerConfiguration.setDisableFullframeMode(true);\n playerConfiguration.setFullViewPort(false);\n mediaPlayer.init('#' + containerId);\n addEventListener('error', generalErrorHandler);\n _started = true;\n};\nvar destroy = function destroy() {\n if (!_started) {\n return;\n }\n var $spElement = mediaPlayer.getSmartPlayerRootElement();\n removeEventListener('error', generalErrorHandler);\n mediaPlayer.destroy();\n if ($spElement) {\n $spElement.removeClass();\n $spElement.empty();\n }\n playerConfiguration.clearConfiguration();\n _started = false;\n _controls = mediaInterfaceConstants.controls.autohide;\n _authInfo = {};\n _lastError = null;\n _pluginController = null;\n};\nvar setTheme = function setTheme(themeName) {\n themeController.setTheme(themeName);\n};\nvar setupPluginController = function setupPluginController() {\n _pluginController = PluginController$1.create();\n playerConfiguration.setPluginController(_pluginController);\n};\nvar registerPlugin = function registerPlugin(pluginName, viewElementType) {\n if (!_pluginController) {\n setupPluginController();\n }\n var pluginInitPromise = _pluginController.registerPlugin(pluginName, viewElementType);\n mediaPlayer.triggerEvent(events.Plugin.Added, {\n viewElementType: viewElementType\n });\n return pluginInitPromise;\n};\nvar displayQuizPreview = function displayQuizPreview(containerElement, xmpString) {\n var $container = $(containerElement);\n CamtasiaQuizPreviewView$1.create($container, xmpString);\n};\nvar displayImageFullscreen = function displayImageFullscreen() {\n mediaPlayer.triggerEvent(events.External.SwitchToFullscreen);\n};\nvar exitImageFullscreen = function exitImageFullscreen() {\n mediaPlayer.triggerEvent(events.External.ExitFullscreen);\n};\nvar createTocFromDescription = function createTocFromDescription(descriptionText) {\n if (descriptionText && typeof descriptionText === 'string') {\n var tocModel = textToTocModel(decodeURIComponent(descriptionText));\n if (tocModel) {\n playerConfiguration.tocModelFromDescription = tocModel;\n }\n }\n};\nvar mediaInterfaceController = Object.defineProperties({\n play: mediaPlayer.play,\n pause: mediaPlayer.pause,\n addEventListener: addEventListener,\n removeEventListener: removeEventListener,\n addSrc: addMediaSrc,\n addCaptionSrc: playerConfiguration.addCaptionSrc,\n run: run,\n destroy: destroy,\n setTheme: setTheme,\n registerPlugin: registerPlugin,\n displayQuizPreview: displayQuizPreview,\n displayImageFullscreen: displayImageFullscreen,\n exitImageFullscreen: exitImageFullscreen,\n getSafeSeekTime: mediaPlayer.getSafeSeekTime,\n createTocFromDescription: createTocFromDescription\n}, {\n version: {\n get: function get() {\n return packageJson.version;\n }\n },\n autoplay: {\n get: playerConfiguration.getAutoPlayMedia,\n set: setAutoPlay\n },\n controls: {\n get: getControls,\n set: setControls\n },\n disableInteractions: {\n get: playerConfiguration.getDisableInteractions,\n set: setDisableInteractions\n },\n currentSrc: {\n get: mediaPlayer.getCurrentSrc\n },\n currentTime: {\n get: mediaPlayer.getCurrentTime,\n set: mediaPlayer.setCurrentTime\n },\n duration: {\n get: mediaPlayer.getDuration\n },\n error: {\n get: getError\n },\n ended: {\n get: mediaPlayer.getEnded\n },\n loop: {\n get: getLoop,\n set: setLoop\n },\n muted: {\n get: mediaPlayer.getMuted,\n set: setMuted\n },\n paused: {\n get: mediaPlayer.getPaused\n },\n playbackRate: {\n get: mediaPlayer.getPlaybackRate,\n set: mediaPlayer.setPlaybackRate\n },\n buffered: {\n get: mediaPlayer.getBuffered\n },\n played: {\n get: mediaPlayer.getPlayed\n },\n seekable: {\n get: mediaPlayer.getSeekable\n },\n preload: {\n get: playerConfiguration.getPreload,\n set: playerConfiguration.setPreload\n },\n seeking: {\n get: mediaPlayer.getSeeking\n },\n volume: {\n get: mediaPlayer.getVolume,\n set: mediaPlayer.setVolume\n },\n src: {\n get: playerConfiguration.getMediaSrc,\n set: playerConfiguration.setMediaSrc\n },\n // these are the SP extended interface options\n posterSrc: {\n get: playerConfiguration.getPosterImageSrc,\n set: playerConfiguration.setPosterImageSrc\n },\n xmpSrc: {\n get: playerConfiguration.getXMPSrc,\n set: playerConfiguration.setXMPSrc\n },\n tocSrc: {\n get: playerConfiguration.getTOCSpriteSrc,\n set: playerConfiguration.setTOCSpriteSrc\n },\n mediaTitle: {\n get: playerConfiguration.getMediaTitle,\n set: playerConfiguration.setMediaTitle\n },\n tocTitle: {\n get: playerConfiguration.getTOCTitle,\n set: playerConfiguration.setTOCTitle\n },\n tocChapters: {\n get: mediaPlayer.getTocChapters\n },\n prerollSrc: {\n get: playerConfiguration.getPreRollSrc,\n set: playerConfiguration.setPreRollSrc\n },\n audioDescriptionMediaSrc: {\n get: playerConfiguration.getAudioDescriptionMediaSrc,\n set: playerConfiguration.setAudioDescriptionMediaSrc\n },\n quizId: {\n get: playerConfiguration.getFathomId,\n set: playerConfiguration.setFathomId\n },\n quizCreateInstanceUrl: {\n get: getQuizCreateInstanceUrl,\n set: setQuizCreateInstanceUrl\n },\n background: {\n get: playerConfiguration.getBackgroundColor,\n set: playerConfiguration.setBackgroundColor\n },\n captions: {\n get: mediaPlayer.getCaptionCollection\n },\n captionTrack: {\n get: mediaPlayer.getCaptionTrack,\n set: mediaPlayer.setCaptionTrack\n },\n captionsVisible: {\n get: mediaPlayer.getCaptionsVisible,\n set: mediaPlayer.setCaptionsVisible\n },\n ignoreStoredCaptionVisible: {\n get: playerConfiguration.getIgnoreStoredCaptionVisibleSetting,\n set: playerConfiguration.setIgnoreStoredCaptionVisibleSetting\n },\n rotation: {\n get: playerConfiguration.getMediaRotation,\n set: playerConfiguration.setMediaRotation\n },\n scrubbing: {\n get: mediaPlayer.getScrubbing,\n set: mediaPlayer.setScrubbing\n },\n isYouTube: {\n get: mediaPlayer.getIsYouTube\n },\n isInFullScreenMode: {\n get: mediaPlayer.isInFullScreenMode\n },\n authInfo: {\n get: getAuthInfo,\n set: setAuthInfo\n },\n // debug layer flags\n contextMenu: {\n get: getContextMenuEnabled,\n set: setContextMenuEnabled\n },\n isIphoneOrIpod: {\n get: deviceInfo.isIPhoneOrIPod\n },\n endActionType: {\n get: playerConfiguration.getEndActionType,\n set: playerConfiguration.setEndActionType\n },\n endActionParam: {\n get: playerConfiguration.getEndActionParam,\n set: playerConfiguration.setEndActionParam\n },\n ignoreXmpControllerParameters: {\n get: playerConfiguration.getIgnoreXmpControllerParameters,\n set: playerConfiguration.setIgnoreXmpControllerParameters\n },\n ignoreQuizQuestions: {\n get: playerConfiguration.getIgnoreQuizQuestions,\n set: playerConfiguration.setIgnoreQuizQuestions\n },\n singleClickControlEnabled: {\n get: playerConfiguration.getEnableSingleClickControl,\n set: playerConfiguration.setEnableSingleClickControl\n },\n doubleClickControlEnabled: {\n get: playerConfiguration.getEnableDoubleClickControl,\n set: playerConfiguration.setEnableDoubleClickControl\n },\n useLargerProgressBar: {\n get: playerConfiguration.getUseLargerProgressBar,\n set: playerConfiguration.setUseLargerProgressBar\n },\n displayHotspotsShape: {\n get: playerConfiguration.getDisplayHotspotsShape,\n set: playerConfiguration.setDisplayHotspotsShape\n },\n disablePictureInPicture: {\n get: playerConfiguration.getDisablePictureInPicture,\n set: playerConfiguration.setDisablePictureInPicture\n },\n contentBase: {\n get: playerConfiguration.getContentBase,\n set: playerConfiguration.setContentBase\n },\n skipVideoControlsEnabled: {\n get: playerConfiguration.getSkipVideoControlsEnabled,\n set: playerConfiguration.setSkipVideoControlsEnabled\n },\n skipVideoDuration: {\n get: playerConfiguration.getSkipVideoDuration,\n set: playerConfiguration.setSkipVideoDuration\n },\n allowFastForward: {\n get: playerConfiguration.getAllowFastForward,\n set: playerConfiguration.setAllowFastForward\n },\n showADACompliantCaptions: {\n get: playerConfiguration.getShowADACompliantCaptions,\n set: playerConfiguration.setShowADACompliantCaptions\n },\n rememberUserInfo: {\n get: playerConfiguration.getRememberUserInfo,\n set: playerConfiguration.setRememberUserInfo\n },\n userInfo: {\n get: playerConfiguration.getUserInfo,\n set: playerConfiguration.setUserInfo\n },\n userSignedIn: {\n get: playerConfiguration.getUserSignedIn,\n set: playerConfiguration.setUserSignedIn\n },\n disableContinueWithoutQuestions: {\n get: playerConfiguration.getDisableContinueWithoutQuestions,\n set: playerConfiguration.setDisableContinueWithoutQuestions\n },\n logScormApiCalls: {\n get: playerConfiguration.getLogScormApiCalls,\n set: playerConfiguration.setLogScormApiCalls\n },\n videoThumbnailsSrc: {\n get: playerConfiguration.getVideoThumbnailSrc,\n set: playerConfiguration.setVideoThumbnailSrc\n },\n videoThumbnailWidth: {\n get: playerConfiguration.getVideoThumbnailWidth,\n set: playerConfiguration.setVideoThumbnailWidth\n },\n videoThumbnailHeight: {\n get: playerConfiguration.getVideoThumbnailHeight,\n set: playerConfiguration.setVideoThumbnailHeight\n },\n videoThumbnailInterval: {\n get: playerConfiguration.getVideoThumbnailInterval,\n set: playerConfiguration.setVideoThumbnailInterval\n },\n videoThumbnailColumns: {\n get: playerConfiguration.getVideoThumbnailColumns,\n set: playerConfiguration.setVideoThumbnailColumns\n },\n completeScormOnRequirementsComplete: {\n get: playerConfiguration.getCompleteScormOnRequirementsComplete,\n set: playerConfiguration.setCompleteScormOnRequirementsComplete\n },\n progressBarWidth: {\n get: mediaPlayer.getProgressBarDisplayWidth\n },\n quizServiceBaseUrl: {\n get: playerConfiguration.getQuizServiceBaseUrl,\n set: playerConfiguration.setQuizServiceBaseUrl\n },\n resultsServiceBaseUrl: {\n get: playerConfiguration.getResultsServiceBaseUrl,\n set: playerConfiguration.setResultsServiceBaseUrl\n },\n customFullScreenDomElement: {\n get: playerConfiguration.getCustomFullScreenDomElement,\n set: playerConfiguration.setCustomFullScreenDomElement\n },\n enableTheaterMode: {\n get: playerConfiguration.getEnableTheaterMode,\n set: playerConfiguration.setEnableTheaterMode\n },\n currentDisplayMode: {\n get: function get() {\n return mediaPlayer.getCurrentDisplayMode() || DisplayModes.Normal;\n }\n },\n ga4EventCallback: {\n get: playerConfiguration.getGA4EventCallback,\n set: playerConfiguration.setGA4EventCallback\n },\n showAcknowledgementLink: {\n get: playerConfiguration.getShowAcknowledgementLink,\n set: playerConfiguration.setShowAcknowledgementLink\n },\n // deprecated\n environment: {\n get: function get() {\n return deprecatedConfigGetter('mediaInterface.environment', 0);\n },\n set: function set() {\n deprecatedConfigSetter('mediaInterface.environment');\n }\n }\n});\n\nexport { deviceInfo, DisplayModes as displayModes, events, fathomService, languageCodes, localizationStrings, log, mediaInterfaceController as mediaInterface, mediaInterfaceConstants, mediaPlayer, playerConfiguration, preloadOptions, quizService, scormController$1 as scormController, supportedPluginViewElements, themeNames };\n//# sourceMappingURL=techsmith-smart-player.esm.js.map\n"],"names":["commonjsGlobal","globalThis","window","g","self","getDefaultExportFromCjs","x","__esModule","Object","prototype","hasOwnProperty","call","module","exports","MOUSE_PROPS","MOUSE_DEFAULTS","PointerEvent","inType","inDict","create","e","document","createEvent","initEvent","bubbles","cancelable","p","i","length","buttons","pressure","clientX","y","clientY","pointerId","width","height","tiltX","tiltY","twist","tangentialPressure","pointerType","hwTimestamp","isPrimary","PointerMap","Map","forEach","SparseArrayMap","this","array","size","set","k","v","undefined","has","get","clear","callback","thisArg","CLONE_PROPS","CLONE_DEFAULTS","BOUNDARY_EVENTS","HAS_SVG_INSTANCE","SVGElementInstance","dispatcher","pointermap","eventMap","captureInfo","eventSources","eventSourceList","registerSource","name","source","s","newEvents","events","bind","push","register","element","es","l","unregister","contains","container","contained","ex","down","inEvent","fireEvent","move","up","enter","leave","over","out","cancel","leaveOut","event","propagate","enterOver","eventHandler","_handledByPE","type","fn","listen","target","addEvent","unlisten","removeEvent","eventName","addEventListener","boundHandler","removeEventListener","makeEvent","relatedTarget","preventDefault","_target","dispatchEvent","cloneEvent","eventCopy","correspondingUseElement","getTarget","capture","propagateDown","targets","parentNode","reverse","setCapture","inPointerId","inTarget","skipDispatch","releaseCapture","implicitRelease","asyncDispatchEvent","t","requestAnimationFrame","targeting","shadow","inEl","shadowRoot","webkitShadowRoot","canTarget","Boolean","elementFromPoint","targetingShadow","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","shadows","searchRoot","inRoot","st","sr","ssr","owner","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","Array","map","toArray","slice","filter","MO","MutationObserver","WebKitMutationObserver","SELECTOR","OBSERVER_INIT","subtree","childList","attributes","attributeOldValue","attributeFilter","Installer","add","remove","changed","binder","addCallback","removeCallback","changedCallback","observer","mutationWatcher","shadowSelector","selector","rule","watchSubtree","observe","enableOnSubtree","readyState","installOnLoad","installNewSubtree","findElements","addElement","querySelectorAll","removeElement","el","elementChanged","oldValue","concatLists","accum","list","concat","isElement","n","ELEMENT_NODE","flattenMutationTree","inNodes","tree","reduce","mutations","mutationHandler","m","addedNodes","removedNodes","attrib2css","selectors","styles","hasNativePE","MSPointerEvent","hasShadowRoot","ShadowDOMPolyfill","head","createShadowRoot","applyAttributeStyles","r","String","createElement","textContent","appendChild","DEDUP_DIST","BUTTON_TO_BUTTONS","HAS_BUTTONS","MouseEvent","INSTALLER","mouseEvents","POINTER_ID","POINTER_TYPE","lastTouches","isEventSimulatedFromTouch","lts","dx","Math","abs","dy","prepareEvent","pd","prepareButtonsForMove","which","mousedown","button","mousemove","mouseup","mouseover","mouseout","deactivateMouse","pointermap$1","DEDUP_TIMEOUT","CLICK_COUNT_TIMEOUT","ATTRIB","touchEvents","elementAdded","a","getAttribute","touchActionToScrollType","_scrollType","elementRemoved","oldSt","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","SCROLLER","touchAction","exec","firstTouch","isPrimaryTouch","inTouch","identifier","setPrimaryTouch","firstXY","X","Y","scrolling","cancelResetClickCount","removePrimaryPointer","inPointer","resetClickCount","clickCount","resetId","setTimeout","clearTimeout","typeToButtons","ret","touchToPointer","cte","currentTouchEvent","id","detail","radiusX","webkitRadiusX","radiusY","webkitRadiusY","force","webkitForce","altKey","ctrlKey","metaKey","shiftKey","processTouches","inFunction","tl","changedTouches","shouldScroll","scrollAxis","currentTarget","oa","findTouch","inTL","inId","vacuumTouches","touches","d","value","key","cancelOut","touchstart","dedupSynthMouse","overDown","outTarget","touchmove","touchcancel","moveOverOut","pointer","outEvent","touchend","upOut","cleanUpPointer","lt","indexOf","splice","h","pointermap$2","HAS_BITMAP_TYPE","MSPOINTER_TYPE_MOUSE","msEvents","POINTER_TYPES","cleanup","MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSLostPointerCapture","MSGotPointerCapture","applyPolyfill","navigator","msPointerEnabled","tp","msMaxTouchPoints","defineProperty","enumerable","ontouchstart","assertActive","error","Error","assertConnected","elem","parent","ownerDocument","inActiveButtonState","applyPolyfill$1","Element","setPointerCapture","defineProperties","msSetPointerCapture","msReleasePointerCapture","targetFinding","factory","freeze","External","VideoStartInitiated","VideoStart","VideoEnd","VideoReplay","MediaError","MediaReady","CaptionChange","Ready","VideoPlay","PlayerFullScreenModeChanged","PlayerRumData","GoogleAnalyticsCustomEvent","AnalyticsEvent","GoogleAnalytics4Event","QuizVisible","QuizHidden","ShowStartQuizPrompt","HideStartQuizPrompt","SwitchToFullscreen","ExitFullscreen","PlayerSettingsOpen","PlayerSettingsClose","PlayerControlsHidden","PlayerControlsVisible","PlayerResize","HeroControlHidden","ImagePointerOver","ImagePointerLeave","DisplayModeChanged","CaptionsHidden","CaptionsVisible","CaptionsReady","ExternalVideo","VideoLoadStart","VideoLoadedMetadata","VideoLoadedData","VideoCanPlay","VideoCanPlayThrough","VideoPlaying","VideoWaiting","VideoSeeking","VideoSeeked","VideoEnded","VideoPause","VideoResize","VideoError","VideoVolumeChange","VideoDurationChange","VideoRateChange","VideoTimeUpdate","VideoProgress","Player","MediaControlsReady","MediaExtensionsReady","Controls","ClickPrev","ClickNext","FullScreenChange","ToggleFullScreen","ExpandVideo","ShowToc","HideToc","TocScroll","Disable","Enable","Updated","HotspotClicked","PipChanged","TheaterModeChanged","MediaResize","PlayerInitialized","ShowVideoBufferingView","HideVideoBufferingView","VideoControlsHidden","HideVideoControls","VideoControlsVisible","ShowVideoControls","DisplayCaptionControl","DisplayTocControl","TocDisplayToggled","FocusTocButton","HeroPlayControlClicked","HeroPlayControlVisible","HeroPlayControlHidden","ReplayControlVisible","ReplayControlHidden","StartedPlayback","HideIOOverlay","SearchFocusChange","HideLoadingMessage","Hotspots","Paused","Resume","AreaActive","AreaInactive","Media","Play","Playing","Pause","SeekToTime","Replay","End","Abort","Suspend","Emptied","Stalled","Progress","InitializeCurrent","SourceChanged","TryToAutoPlay","SetVolume","SetMutedState","SetPlaybackRate","FirstPlay","IFrame","EnterFullFrame","ExitFullFrame","Update","QuizMarkers","PlayProgress","LoadProgress","NextQuestionPosition","Scrubbing","Started","Ended","Quizzing","QuizSetupComplete","Complete","Review","Begin","BeginClicked","Skip","SkipClicked","Status","SubmittingInstance","CreatedInstance","Submitted","ShowSubmissionRetryMessage","HideSubmissionRetryMessage","TransitionImageQuizToAnswers","HideQuiz","ShowQuizBar","ShowQuizSetup","ShowQuestionSetView","CloseQuestionSetView","SubmitQuestionSet","RationaleActionLocation","RationaleActionJumpToTime","QuizIsOutOfDate","QuizBadDefinition","MinimizeUI","MaximizeUI","UIVisible","UIHidden","Captions","Toggled","StateLoaded","Changed","LanguageChanged","DragStart","DragEnd","Resized","CaptionService","NewCaptionTrack","AudioDescription","Failed","Timing","PlayerLoaded","VideoMetadataLoaded","VideoHasEnoughData","GA4","VideoStarted","VideoLoadingTimeInSeconds","VideoLoadingTime","VideoPercentViewed","VideoFinishedAction","VideoFinished","OpenExternalLinkView","OpenExternalLinkClick","HotspotAction","CouldNotPlaySmoothlyIn20Secs","PlaybackWasStoppedToBuffer","Analytics","ContentLoaded","Plugin","Added","MediaAreaPluginMouseDown","MediaAreaPluginMouseUp","MediaAreaPluginKeyDown","MediaAreaPluginKeyUp","Network","Retrying","Fathom","GetComplete","Modals","Open","Closed","ExternalLinkView","Clicked","SCORM","ExitSession","ExitSessionConfirmed","ExitSessionWithOutProgressConfirmed","ResumeSession","FailedToFindApi","Images","PointerOver","PointerLeave","supportedPluginViewElements","PROGRESS_BAR","MEDIA","BEFORE_AFTER_PLAY_CONTROLS","PLAYER","_supportedLanguages","languageCodes","ENGLISH","GERMAN","JAPANESE","FRENCH","SPANISH","CHINESE","PORTUGUESE","ENU","DEU","JPN","FRA","SP","ZH","PT","isValid","language","some","supportedLanguage","mediaInterfaceConstants","controls","autohide","youtube","_typeof$1","o","Symbol","iterator","constructor","arrayMap","iteratee","index","result","eq","other","assocIndexOf","ListCache","entries","entry","__data__","data","pop","freeGlobal","freeSelf","root","Function","_Symbol","objectProto","nativeObjectToString","toString","symToStringTag","toStringTag","nativeObjectToString$1","symToStringTag$1","baseGetTag","isOwn","tag","unmasked","getRawTag","objectToString","isObject","isFunction","uid","coreJsData","maskSrcKey","keys","IE_PROTO","funcToString","toSource","func","reIsHostCtor","funcProto$1","objectProto$2","funcToString$1","hasOwnProperty$1","reIsNative","RegExp","replace","baseIsNative","test","getNative","object","getValue","Map$1","nativeCreate","hasOwnProperty$2","hasOwnProperty$3","Hash","getMapData","MapCache","Stack","pairs","LARGE_ARRAY_SIZE","SetCache","values","arraySome","predicate","equalArrays","bitmask","customizer","equalFunc","stack","isPartial","arrLength","othLength","stacked","seen","arrValue","othValue","compared","othIndex","Uint8Array","mapToArray","setToArray","symbolProto","symbolValueOf","valueOf","arrayPush","offset","isArray$1","isArray","baseGetAllKeys","keysFunc","symbolsFunc","arrayFilter","resIndex","stubArray","propertyIsEnumerable","nativeGetSymbols","getOwnPropertySymbols","getSymbols","symbol","isObjectLike","baseIsArguments","objectProto$6","hasOwnProperty$4","propertyIsEnumerable$1","isArguments","arguments","freeExports","freeModule","Buffer","isBuffer","reIsUint","isIndex","isLength","typedArrayTags","baseUnary","freeExports$1","freeModule$1","freeProcess","process","nodeUtil","types","require","binding","nodeIsTypedArray","isTypedArray","hasOwnProperty$5","arrayLikeKeys","inherited","isArr","isArg","isBuff","isType","skipIndexes","baseTimes","objectProto$8","isPrototype","Ctor","overArg","transform","arg","nativeKeys","hasOwnProperty$6","isArrayLike","keys$1","baseKeys","getAllKeys","hasOwnProperty$7","DataView","Promise$2","Set","WeakMap","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","getTag","ArrayBuffer","resolve","ctorString","getTag$1","hasOwnProperty$8","baseIsEqualDeep","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","byteLength","byteOffset","buffer","message","convert","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","skipCtor","objValue","objCtor","othCtor","equalObjects","baseIsEqual","isStrictComparable","matchesStrictComparable","srcValue","baseMatches","matchData","getMatchData","noCustomizer","COMPARE_PARTIAL_FLAG$4","baseIsMatch","isSymbol","reIsDeepProp","reIsPlainProp","isKey","memoize","resolver","TypeError","memoized","args","apply","cache","Cache","rePropName","reEscapeChar","stringToPath","string","charCodeAt","match","number","quote","subString","symbolProto$1","symbolToString","baseToString","castPath","toKey","baseGet","path","baseHasIn","hasPath","hasFunc","baseMatchesProperty","defaultValue","hasIn","COMPARE_PARTIAL_FLAG$5","identity","property","basePropertyDeep","baseIteratee","fromRight","baseFor","iterable","props","baseEach","eachFunc","collection","createBaseEach","baseMap","arrayEach","baseFindIndex","fromIndex","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","toFinite","isBinary","toNumber","toInteger","remainder","nativeMax","max","findIndex","findIndexFunc","find","baseFilter","reject$1","negate","last","baseSlice","start","end","nativeMax$1","baseSetToString","nativeNow","Date","now","shortOut","count","lastCalled","stamp","remaining","setToString","baseRest","otherArgs","overRest","invokeMap","isFunc","baseInvoke","splice$1","indexes","lastIndex","previous","basePullAt","parseXml","wellKnownNamespaces","xml","rdf","dc","exif","stDim","stFnt","tsc","tscDM","tscHS","tscIQ","xmp","xmpDM","xmpG","xmpMM","namespaceResolver","prefix","isString","isNil","DOMParser","canParseHtmlNatively","DOMParserProto","realParseFromString","parseFromString","markup","firstElement","doc","implementation","createHTMLDocument","docElement","documentElement","innerHTML","firstElementChild","childElementCount","localName","toLowerCase","replaceChild","xmlStr","contentType","ActiveXObject","xmlDoc","async","loadXML","getElementText","getElementsByTagName","getElementsByTagNameNS","getFirstElementByTagName","childElements","XmlUtility","xmlDocFragmentToString","XMLSerializer","serializeToString","xmlDocToString","hasAttribute","attributeName","hasAttributeWithValue","createDocument","createElementWithValue","createTextNode","getFirstChildElementTextByTagName","childElement","createElementNS","ns","getNSInfo","tagName","nameParts","split","nsUrl","nsPrefix","tagShortName","NamespaceXmlUtility","getFirstElementByTagNameNSPrefix","docOrElement","evaluate","isDocument","XPathResult","FIRST_ORDERED_NODE_TYPE","singleNodeValue","getElementsByTagNameNSPrefix","tokens","getFirstChildElementTextByTagNameNSPrefix","createDocumentNS","createElementFromObject","tagInfo","that","toXmp","nsInfo","newElement","atts","attrVal","attrName","attNsInfo","setAttributeNS","setAttribute","children","child","text","createElementNSWithValue","LanguageIdentifier$1","languageIdentifier","languageIdentifierParts","_identifier","_language","_region","join","toPOJO","region","_identifiers","af","displayName","regions","za","sq","al","ar","dz","bh","eg","iq","jo","kw","lb","ly","ma","om","qa","sa","sy","tn","ae","ye","hy","am","az","eu","be","by","bg","ca","zh","cn","hk","mo","sg","tw","chs","cht","hr","cs","cz","da","dk","div","mv","nl","en","au","bz","cb","ie","jm","nz","ph","tt","gb","us","zw","et","ee","fo","fa","ir","fi","fr","lu","mc","ch","gl","ka","ge","de","at","li","gr","gu","he","il","hi","hu","is","it","ja","jp","kn","kk","kz","kok","ko","kr","ky","lv","mk","ms","bn","my","mr","mn","nb","no","nn","pl","pt","br","pa","ro","ru","sp","sk","sl","si","bo","cl","co","cr","ec","sv","gt","hn","mx","ni","py","pe","pr","uy","ve","sw","ke","syr","ta","te","th","tr","uk","ua","ur","pk","uz","vi","vn","languageIdentifiers","isSupportedLanguage","languageIdentifierString","identifiers","setTimeoutFunc$1","noop$2","Promise$1$1","_state","_handled","_value","_deferreds","doResolve$1","handle$1","deferred","_immediateFn","onFulfilled","onRejected","reject$1$1","promise","resolve$1","newValue","then","finale$1","_unhandledRejectionFn","len","Handler$1","done","reason","prom","reject","all","arr","res","val","race","setImmediate","err","console","warn","UndoAction","undoFunc","undoParams","redoFunc","redoParams","execute","UndoAction$1","ImageRectangle$1","propertyInfo","_x","_y","_width","_height","Number","_public","toXmpAtt","ImageRectangle","isBlacklistedTag","strTag","findNextTag","strTextToSearch","nStartPoint","nPosition","nCode","getTagAt","strText","nTagPosition","nEnd","substring","findNextTagNotBlacklisted","getTextToCloseTag","arrStack","strCloseTags","arrOpenTags","strCloseTagNeeded","matchingTag","strOpenTagNeeded","isClosingTag","strToMatch","strMatch","removeTag","strToFix","nTagEnd","trimString","charAt","Rtf","str","removeLastBracket","strFixed","nCountCorrectedThisLoop","nNextPosition","strAlternateTag","strNextTag","nStringBetweenBegin","strBetween","removeEmptyTags","arrTagStack","nestTags","CaptionText","params","_text","_plainText","_markupText","_languageIdentifier","_additionalParamProperties","_xmlUtility","setLanguageIdentifier","previousLanguageIdentifierString","setText","plainText","markupText","treeDesc","pojo","validateParams","CaptionText$1","textElement","rtfText","decoratorFunctions","nullCaptionText","Caption","_startTime","_duration","_horizontalAlignment","_verticalAlignment","_file","_image","_imageIndex","_imageOffset","_imageRectangle","_captionTextList","_activeLanguageIdentifier","setStartTime","startTime","floor","setDuration","duration","addOrReplaceCaptionText","newCaptionText","existingCaptionItemIndex","captionItem","oldCaptionItem","removeCaptionText","captionText","removedCaptionItems","captionTextItem","removedCaptionItem","setHorizontalAlignment","horizontalAlignment","setVerticalAlignment","verticalAlignment","setFile","file","setImage","image","setImageIndex","imageIndex","setImageOffset","imageOffset","setImageRectangle","imageRectangle","getCaptionText","preferredCaptionText","endTime","captionTextList","activeLanguageIdentifier","getAvailableLanguages","Caption$1","captionElement","tinycolor$1","createCommonjsModule","trimLeft","trimRight","tinyCounter","mathRound","round","mathMin","min","mathMax","mathRandom","random","tinycolor","color","opts","rgb","b","ok","format","named","names","matchers","rgba","hsl","hsla","hsv","hsva","hex8","parseIntFromHex","convertHexToDecimal","hex6","hex4","hex3","stringInputToObject","isValidCSSUnit","bound01","substr","convertToPercentage","f","q","mod","hsvToRgb","hue2rgb","hslToRgb","boundAlpha","inputToRGB","_originalInput","_r","_g","_b","_a","_roundA","_format","_gradientType","gradientType","_ok","_tc_id","rgbToHsl","rgbToHsv","rgbToHex","allow3Char","hex","pad2","rgbaToArgbHex","convertDecimalToHex","_desaturate","amount","toHsl","clamp01","_saturate","_greyscale","desaturate","_lighten","_brighten","toRgb","_darken","_spin","hue","_complement","_triad","_tetrad","_splitcomplement","_analogous","results","slices","part","_monochromatic","toHsv","modification","isDark","getBrightness","isLight","getOriginalInput","getFormat","getAlpha","getLuminance","RsRGB","GsRGB","BsRGB","pow","setAlpha","toHsvString","toHslString","toHex","toHexString","toHex8","allow4Char","rgbaToHex","toHex8String","toRgbString","toPercentageRgb","toPercentageRgbString","toName","hexNames","toFilter","secondColor","hex8String","secondHex8String","formatSet","formattedString","hasAlpha","clone","_applyModification","lighten","brighten","darken","saturate","greyscale","spin","_applyCombination","analogous","complement","monochromatic","splitcomplement","triad","tetrad","fromRatio","newColor","equals","color1","color2","mix","rgb1","rgb2","readability","c1","c2","isReadable","wcag2","wcag2Parms","parms","level","toUpperCase","validateWCAG2Parms","mostReadable","baseColor","colorList","includeFallbackColors","bestColor","bestScore","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","burntsienna","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","flipped","flip","parseFloat","isNaN","isOnePointZero","processPercent","isPercentage","c","CSS_UNIT","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","nativeFloor","nativeMin","sortedIndexBy","retHighest","low","high","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","mid","computed","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","MAX_ARRAY_LENGTH","baseSortedIndexBy","baseAssignValue","hasOwnProperty$9","assignValue","copyObject","isNew","hasOwnProperty$a","baseKeysIn","nativeKeysIn","isProto","keysIn$1","freeExports$2","freeModule$2","Buffer$1","allocUnsafe","copyArray","getPrototype","getPrototypeOf","getSymbolsIn","getAllKeysIn","hasOwnProperty$b","cloneArrayBuffer","arrayBuffer","reFlags","symbolProto$2","symbolValueOf$1","initCloneByTag","isDeep","dataView","cloneDataView","typedArray","cloneTypedArray","regexp","cloneRegExp","objectCreate","baseCreate","proto","nodeIsMap","isMap","nodeIsSet","isSet","cloneableTags","baseClone","isFlat","isFull","input","initCloneArray","copy","cloneBuffer","initCloneObject","copySymbolsIn","baseAssignIn","copySymbols","baseAssign","subValue","keysIn","spreadableSymbol","isConcatSpreadable","isFlattenable","baseFlatten","depth","isStrict","compareAscending","valIsDefined","valIsReflexive","baseOrderBy","iteratees","orders","comparer","sort","baseSortBy","objCriteria","criteria","othCriteria","ordersLength","compareMultiple","isIterateeCall","sortBy","CaptionCollection","_captions","_captionLanguages","addCaptionFromLanguageCodeCache","caption","addCaption","removeCaption","removeCaptionFromLanguageCodeCache","setCaptions","captions","setActiveLanguageIdentifier","previousActiveLanguageIdentifierString","getActiveLanguageIdentifier","mergeCaptions","captionsToMerge","captionToMerge","matchingCaption","existingCaption","captionsClone","CaptionCollection$1","_defaults$1","fontFamily","fontSize","fgColor","bgColor","CaptionTrack","_fgColor","_bgColor","_fontFamily","_fontSize","parseFontSize","_position","position","_barHeight","barHeight","_captionCollection","attsFromColor","tinycolorToSimpleRgb","tinycolorObj","rgbaColorObj","fgHexColor","bgOpacity","bgHexColor","bgRGBACssColor","captionCollection","getRGBColor","defaultFontSize","parsedFontSize","CaptionTrack$1","captionTrackElement","captionTrack","fgColorElement","bgColorElement","CaptionController$2","_activeCaptionTrack","_captionTracks","cacheActiveCaptionTrack","preferredCaptionTrack","addCaptionTrack","storeCaptionLanguage","removeCaptionTrack","captionTrackToRemove","removedCaptionTracks","removedCaptionTrack","getMergedCaptionTrack","captionTrackParams","mergedCaptionTrack","activeCaptionTrackIsDefinedWithCaptions","activeCaptionTrack","numberCaptionTracks","containsCaptions","captionsContainsTocThumbnails","clearCaptions","addCaptionTrackFromXmpElement","parsedCaptionTrack","availableLanguages","filteredCaptionTextList","captionParams","newCaption","getActiveCaptionsTocThumbnailImage","CaptionController$1$1","TableOfContentsItem","_name","TableOfContentsItem$1","tableOfContentsItemElement","TableOfContentsTrack","_items","items","cellLayout","TableOfContentsTrack$1","tableOfContentsTrackElement","tableOfContentsTrack","tableOfContentsItemElements","BoundingPoly$1","coordinatesString","_coordinates","coordinateTokens","compact","coordinateString","coordinates","coord","BoundingPoly","Hotspot","_label","_boundingPoly","_rotate","_pause","_jumpTime","_location","_newWindow","_jumpFile","label","boundingPoly","rotate","pause","jumpTime","location","newWindow","jumpFile","Hotspot$1","hotspotElement","HotspotTrack","_hotspots","hotspots","HotspotTrack$1","hotspotTrackElement","hotspotTrack","Answer","_orderId","orderId","Answer$1","answerElement","answerText","Feedback","_reason","_jumpToTime","jumpToTime","Feedback$1","feedbackElement","feedbackText","Question$2","_id","_type","_correctAnswer","_answers","_feedback","correctAnswer","answers","feedback","Question$1$1","questionElement","correctAnswerText","descriptionElements","QuestionSet$2","_questions","questions","QuestionSet$1$1","questionSetElement","QuizTrack","_quizGuid","_authoredEmail","_requireUserId","_locale","_reportMethod","_clientId","_quizHash","_hideReplay","_allowSkipQuiz","_parameters","_questionSets","quizGuid","authoredEmail","requireUserId","locale","reportMethod","clientId","quizHash","hideReplay","allowSkipQuiz","parameters","questionSets","param","parseParameter","parameterElement","parseParameters","quizParametersElement","xmlUtility","QuizTrack$1","quizTrackElement","quizTrack","SpeechMarker","_probability","probability","SpeechMarker$1","speechMarkerElement","SpeechTrack","_markers","markers","SpeechTrack$1","speechTrackElement","speechTrack","ScreenTextMarker","_tableOfContentsEntry","tableOfContentsEntry","ScreenTextMarker$1","screenTextMarkerElement","ScreenTextTrack","ScreenTextTrack$1","screenTextTrackElement","screenTextTrack","getXmlUtility","Controller","_controllerTextItems","controllerTextItems","localizedTextTree","item","localizedTexts","localizedText","lang","parseParameter$1","parseParameters$1","parametersElement","parseLocalizedTextItem","parseControllerText","controllerTextItemElement","textElements","parseControllerTextItems","controllerTextElement","Controller$1","controllerElement","descriptionElement","ContentList","parseContentListItems","contentListItemElements","itemElement","ContentList$1","contentListElement","castSlice","baseIsNaN","baseIndexOf","strictIndexOf","charsStartIndex","strSymbols","chrSymbols","reHasUnicode","hasUnicode","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsSeq","rsSymbol","reUnicode","stringToArray","unicodeToArray","asciiToArray","reTrimStart","baseValues","nativeMax$2","_parsers","trimLeadingDot","extension","chars","guard","trimStart","captionParsers","supportedExtensions","parserCreator","extensions","parser","theParser","includes","captionImporter","captionController","fileName","fileContents","deserialize","Xmp$1","xmpXml","_version","_title","_date","_creator","_presenterEmail","_description","_source","_about","_keywords","_thumbnail","_firstFrame","_project","_originId","_iPodExplicit","_documentId","_videoFrameSize","_controller","_contentList","_captionController","_hotspotTrack","_tableOfContentsTrack","_quizTrack","_speechTrack","_screenTextTrack","_languages","_containsTocThumbnails","_containsToc","_containsCaptions","_containsHotspots","_containsQuiz","_containsQuizQuestions","_containsScreenText","_containsSpeechText","tracksContainer","track","langName","langValue","unit","scale","version","title","date","creator","presenterEmail","description","about","keywords","thumbnail","firstFrame","project","originId","iPodExplicit","documentId","videoFrameSize","tocThumbnailImageSrc","containsTocThumbnails","containsToc","containsHotspots","containsQuiz","containsQuizQuestions","containsScreenText","containsSpeechText","controller","contentList","parseLanguageName","languageNameElement","parseProductionDetails","rootDescriptionElement","videoFrameSizeElement","langNameElement","parseLanguages","durationElement","getElementForTrackType","elements","trackType","parseTracks","tracksElement","tracksDescriptionElements","parseCaptionTrack","parseHotspotTrack","parseTableOfContentsTrack","parseQuizTrack","parseSpeechTrack","parseScreenTextTrack","recordXmpContentFlags","nsElement","rdfElement","importCaptionsFromFile","languages","hasOwnProperty$c","baseHas","nativeJoin","reTrim$1","trim","charsEndIndex","methodName","upperFirst","chr","trailing","arrayReduce","accumulator","initAccum","baseReduce","metaMap","baseSetData","createCtor","thisBinding","nativeMax$3","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","nativeMax$4","composeArgsRight","holdersIndex","rightIndex","rightLength","baseLodash","LazyWrapper","__wrapped__","__actions__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","getData","realNames","hasOwnProperty$d","LodashWrapper","chainAll","__chain__","__index__","__values__","hasOwnProperty$e","lodash","wrapper","wrapperClone","isLaziable","funcName","otherFunc","getFuncName","setData","reWrapDetails","reSplitDetails","reWrapComment","wrapFlags","updateWrapDetails","details","pair","arrayIncludes","setWrapToString","reference","insertWrapDetails","getWrapDetails","createRecurry","wrapFunc","placeholder","argPos","ary","arity","isCurry","newData","getHolder","nativeMin$1","replaceHolders","createHybrid","partialsRight","holdersRight","isAry","isBind","isBindKey","isFlip","holdersCount","countHolders","newHolders","oldArray","reorder","nativeMin$2","nativeMax$5","createWrap","srcBitmask","newBitmask","isCommon","isCombo","mergeData","createCurry","createPartial","createBind","curry","toSeconds","timeIn","nextNonEmptyLine","linesArray","idx","_readCaptionsFromString","timeDelimiter","hasIdRow","lines","time","endIndex","timeSplitRegex","SSATagRegex","lessThanRegex","greaterThanRegex","newlinePlaceholderRegex","lastNonEmptyLine","padWithZero","inputNumber","formatMillisecondsToTimeCode","inputMilliseconds","options","hoursPadding","hours","getUTCHours","minutes","getUTCMinutes","seconds","getUTCSeconds","milliseconds","getUTCMilliseconds","toFixed","millisecondDelimiter","baseNewlineParser","readCaptionsFromStringWithIdRow","readCaptionsFromString","captionsToString","output","DEFAULT_CAPTION_LANGUAGE_IDENTIFIER_STRING","samiParser","nonBreakingSpace","fromCharCode","getSyncTagText","separator","elementsText","parseSyncTagToCaption","createParams","cssColorToRGB","cssColorValue","getCaptionTrackCreateParams","styleElements","styleElement","body","sheet","cssRules","parseStyle","captionStyle","selectorText","style","backgroundColor","textAlign","captionToString","nextCaption","getTextAlignment","allAlignments","alignments","alignment","syncElements","createCaptionTrackParams","currentCaption","assignCaptionDurationsByFillingCaptionStartTimeGaps","serialize","sbvParser","srtParser","ttmlParser","rWhitespace","rLineBreak","rBreakTag","parseChildren","node","timeOffset","newOffset","currNode","firstChild","currRegion","getNodeRegion","retVal","nodeName","parseNode","nextSibling","defaultTo","sub","MAX_VALUE","subtitle","timeStr","framerate","digitPairs","lastPair","firstPair","frameInfo","frameTime","toTimelineSeconds","getMetricIndex","xmlDocument","vttParser","parseCueHeader","line","lineSegments","skipWhitespace","skipNonWhitespace","skipToCueHeader","breakTagRegex","_registeredExceptionListeners","_registeredMessageListeners","removeValueFromArray","log","logException","logMessage","listener","throwError","removeAllEventListeners","playerStringNames","accessBtnAnswersSubmitted","accessBtnAudioDescription","accessBtnClearSearch","accessBtnClickToReplayLink","accessBtnClosedCaption","accessBtnCorrectOutOf","accessResultsLabelCorrectSuffix","accessResultsLabelIncorrectSuffix","accessResultsLabelNoResponseSuffix","accessResultsLabelNoResponseGradedSuffix","accessBtnFullScreen","accessBtnFullScreenExpand","accessBtnGradedQuestions","accessBtnHideAnswer","accessBtnHideQuiz","accessBtnPreviousQuestion","accessBtnNextQuestion","accessBtnNext","accessBtnPip","accessBtnPlay","accessBtnPrevious","accessBtnProgressBar","accessBtnRewind","accessBtnForward","accessBtnSettings","accessBtnShowAnswer","accessBtnShowQuiz","accessBtnTableOfContents","accessBtnTakeQuiz","accessBtnVolume","accessBtnWasNotGraded","accessBtnWereNotGraded","accessListNoSearchResults","accessListSearchResults","accessListTableOfContents","accessQuestionSetConfirmationTitle","accessQuizResults","accessQuestionFeedbackContext","accessTxtVolume","accessVideoPausedForQuiz","accessQuizHidden","accessQuizShown","accessProgressBarTimeConjunction","accessPlayerSettingsClose","accessBtnTheaterMode","accessBtnExitTheaterMode","ccLanguageText","close","mediaNotFound","noWebMSupport","playerRateOptionsText","playerRateText","scormApiNotFoundMessage","search","searchDisabledFullScreen","searchPlaceholder","txtAnswerQuestion","txtBadImageQuiz","txtBegin","txtContinue","txtCorrect","txtCorrectAnswer","txtCorrectString","txtEnterEmail","txtEnterFirstName","txtEnterLastName","txtHotspot","txtHotspotScreenReaderAlert","txtHotspotScreenReaderAlertPlural","txtImageQuizNetworkErrorMessage","txtIncorrect","txtIncorrectString","txtJumpToMedia","txtJumpToTime","txtLoaderMessageDefinition","txtNext","txtHideQuiz","txtOpenLink","txtOpenLinkHeader","txtOpenLinkSubHeader","txtPrev","txtQuestionCount","txtQuizBadDefinitionMessage","txtQuizErrorMessage","txtQuizOutOfDateMessage","txtQuizOutOfDateRefreshButtonText","txtReplayVideo","txtRequiredMessage","txtResults","txtReview","txtReviewAnswer","txtSkip","txtSubmit","txtSubmittingAnswers","txtVideoQuizNetworkErrorMessage","txtVisitSite","txtYourAnswer","videoLoading","videoNotSupported","xmpSecurity","xmpError","confirmOpenUrlModalScreenReaderAlertText","confirmOpenUrlConfirmButtonScreenReaderText","fastForwardDisabledScreenReaderText","scormCompleteVideoLater","scormCompleteVideo","scormExitVideo","scormConfirmCompleteModalText","scormConfirmCompleteModalRestartVideoText","scormConfirmCompleteModalResumeVideoText","scormConfirmCompleteModalFailedToSaveProgressText","scormConfirmCompleteModalDismissButtonText","scormConfirmCompleteModalDismissButtonScreenReaderText","scormConfirmCompleteModalConfirmButtonText","scormConfirmCompleteModalConfirmButtonScreenReaderText","scormSessionEndedText","searchOrJumpTo","searchTextCleared","searchResultsUpdated","tableOfContentsDisplayed","tableOfContentsHidden","defaultMediaTitle","hideThumbnailDueToQuiz","defaultFirstChapterName","acknowledgementLinkName","strings$7","quizAtTimeHeading","enUsLocale","getReadableTimeByLocale","timeStringList","hoursReadableString","minutesReadableString","secondsReadableString","strings","strings$6","deDeLocale","strings$5","jaJpLocale","strings$4","frFrLocale","strings$3","esEsLocale","strings$2","zhCnLocale","strings$1","ptBrLocale","localeFactory","getLocaleByLanguageCode","languageCode","customStrings","setString","stringKey","clearStrings","_currentLocale","setLanguage","getPlayerString","stringName","localizationStrings","getLanguage","getLanguageNameFromIdentifierString","configureFromXmp","controllerParameters","controllerParameter","configureLanguageFromXmp","quizParameters","quizParameter","configureCustomStringsFromXmp","getQuestionCountString","currentQuestionNumber","totalNumberQuestions","questionCountString","reset","mediaMimeType","JSON","M3U","MP4","WEBM","OGV","JPEG","PNG","GIF","UNKNOWN","jquery","global","noGlobal","getProto","_slice","flat","class2type","hasOwn","fnToString","ObjectFunctionString","support","obj","isWindow","preservedScriptAttributes","src","nonce","noModule","DOMEval","code","script","removeChild","toType","rhtmlSuffix","jQuery","context","init","num","pushStack","elems","merge","prevObject","each","first","even","grep","_elem","odd","j","extend","copyIsArray","deep","isPlainObject","expando","isReady","msg","noop","isEmptyObject","globalEval","nodeValue","makeArray","inArray","isXMLDoc","namespace","namespaceURI","docElem","second","invert","matches","callbackExpect","guid","_i","whitespace","rtrimCSS","bup","compareDocumentPosition","rcssescape","fcssescape","asCodePoint","escapeSelector","sel","preferredDoc","pushNative","Expr","outermostContext","sortInput","hasDuplicate","documentIsHTML","rbuggyQSA","dirruns","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","booleans","pseudos","rwhitespace","rcomma","rleadingCombinator","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rquickExpr","rsibling","runescape","funescape","escape","nonHex","unloadHandler","setDocument","inDisabledFieldset","addCombinator","disabled","dir","next","childNodes","els","seed","nid","groups","newSelector","newContext","getElementById","getElementsByClassName","testContext","scope","tokenize","toSelector","qsaError","removeAttribute","select","cacheLength","shift","markFunction","assert","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","subWindow","webkitMatchesSelector","msMatchesSelector","defaultView","top","getById","getElementsByName","disconnectedMatch","cssHas","attrId","getAttributeNode","className","compare","sortDetached","expr","matchesSelector","attr","attrHandle","uniqueSort","duplicates","sortStable","createPseudo","relative","preFilter","excess","unquoted","nodeNameSelector","expectedNodeName","pattern","operator","check","what","_argument","simple","forward","ofType","_context","outerCache","nodeIndex","useCache","diff","lastChild","pseudo","setFilters","matched","not","matcher","compile","unmatched","elemLang","hash","focus","activeElement","safeActiveElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","_matchIndexes","nth","radio","checkbox","password","submit","parseOnly","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","matcherOut","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","setMatchers","elementMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","matcherFromGroupMatchers","token","compiled","filters","unique","getText","isXML","_dir","until","truncate","_siblings","rneedsContext","rsingleTag","winnow","qualifier","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","contents","prev","sibling","cur","closest","prevAll","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","contentDocument","content","rnothtmlwhite","Identity","Thrower","adoptValue","noValue","method","fail","Callbacks","_","flag","createOptions","firing","memory","_fired","_locked","queue","firingIndex","fire","once","stopOnFalse","disable","lock","locked","fireWith","fired","Deferred","tuples","_promise","state","always","pipe","fns","newDefer","tuple","returned","progress","notify","onProgress","maxDepth","handler","special","mightThrow","notifyWith","resolveWith","exceptionHook","rejectWith","getErrorHook","getStackHook","stateString","when","singleValue","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","asyncError","readyException","readyList","completed","readyWait","wait","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","camelCase","acceptData","Data","configurable","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","parse","_data","removeData","_removeData","attrs","dequeue","startLength","hooks","_queueHooks","unshift","stop","setter","clearQueue","tmp","defer","pnum","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","display","css","adjustCSS","valueParts","tween","adjusted","maxIterations","currentValue","initial","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","showHide","show","hide","toggle","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","optgroup","rhtml","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","rtypenamespace","returnTrue","returnFalse","_on","one","origFn","off","leverageNative","isSetup","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","trigger","isImmediatePropagationStopped","handleObjIn","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","rnamespace","postDispatch","_handlers","matchedHandlers","matchedSelectors","addProp","hook","Event","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","isDefaultPrevented","defaultPrevented","timeStamp","isSimulated","eventPhase","pageX","pageY","view","charCode","keyCode","offsetX","offsetY","screenX","screenY","targetTouches","toElement","blur","focusMappedHandler","documentMode","simulate","attaches","dataHolder","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","on","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","fixInput","domManip","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","_remove","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","rcustomProp","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","minWidth","maxWidth","isCustomProp","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","scrollboxSizeVal","offsetWidth","measure","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","_final","cssProps","capName","vendorPropName","rdisplayswap","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","boxModelAdjustment","dimension","box","isBorderBox","computedVal","extra","delta","marginDelta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","aspectRatio","borderImageSlice","columnCount","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeMiterlimit","strokeOpacity","origName","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","suffix","expand","expanded","parts","propHooks","run","percent","eased","pos","step","fx","scrollTop","scrollLeft","linear","swing","cos","PI","fxNow","inProgress","rfxtypes","rrun","schedule","hidden","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","tweens","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","complete","timer","anim","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","timeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","addClass","classNames","curValue","finalValue","removeClass","toggleClass","stateVal","isValidValue","hasClass","rreturn","valHooks","optionSet","rquery","parseXML","parserErrorElem","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","triggerHandler","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","valueOrFunction","encodeURIComponent","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","accepts","json","responseFields","converters","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","_statusCode","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","ajaxConvert","getJSON","getScript","wrapAll","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","xhrSupported","cors","_callback","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","_callback2","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","animated","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","unbind","delegate","undelegate","hover","fnOver","fnOut","rtrim","proxy","holdReady","hold","parseJSON","isNumeric","_jQuery","_$","$","noConflict","w","_xmpSrc","_posterImageSrc","_tocSpriteSrc","_googleAnalyticsID","_customEventCallback","_ga4EventCallback","_techSmithAccessTokenEndpoint","_fathomId$1","_embedIFrameId","_preRollSrc","_webConnector","jqueryExports","windowWrapper","wrapInJQuery","features","documentWrapper","_supportsHTML5","_supportsMP4","_supportOgg","_supportWebM","_isIE","_isEdge","_ieVersion","_safariMajorVersion","_isFirefox","_isChrome","_isIPad","_isIPhone","_isIPod","_isIOS","_isAndroid","_isSafari","_isRetinaDisplay","_isSmallScreen","isTouchIEInterface","isTouchInterface","deviceInfo","isSmallScreen","isRetinaDisplay","isIPad","isIPhoneOrIPod","isIOS","isIE","isEdge","getIEVersion","getSafariMajorVersion","isFirefox","isChrome","isSafari","isAndroid","canPlayHTML5Video","canPlayMP4","canPlayOgg","canPlayWebM","getFullScreenChangeEventNames","documentRef","onfullscreenchange","onwebkitfullscreenchange","requiresManualPreload","supportsFullScreen","fullscreenEnabled","webkitFullscreenEnabled","supportsLegacyIOSFullScreen","videoElement","webkitSupportsFullscreen","mediaLocation","baseindex","lastIndexOf","basex","encodeURI","checkLocationProtocol","lookAtDevice","detect","canPlayType","OGG","userAgent","appName","iOSChromeMatchExp","appVersion","$1","matchExp","safariVersion","screen","availWidth","availHeight","devicePixelRatio","_lookAtDevice","themeNames","DAWN","DUSK","preloadOptions","none","metadata","auto","endsWithSlashRegex","_mediaSources","_mediaTitle","_tocTitle","_mediaRotation","_endActionType","_endActionParam","_ignoreXmpControllerParameters","_ignoreQuizQuestions","_isSearchable","_autoPlayMedia","_forceAutoPlayMedia","_skipVideoDuration","_skipVideoControlsEnabled","_captionsEnabled","_ignoreStoredCaptionVisibleSetting","_sidebarEnabled","_sidebarLocation","_backgroundColor","_useUnicode","_autoHideControls","_reportScormComplete","_isScormLesson","_enforceLinearAssessment","_disableFullframeMode","_disableControls","_disableYouTubeControls","_disablePictureInPicture","_disableContinueWithoutQuestions","_mobileWebViewCanAutoPlay","_gaPageViewTrack","_gaEventTrack","_customEventTracking","_altEventCategoryAsFilename","_altLoadTimeAsSeconds","_isUserIdentified","_additionalAppQueryString","_useSlimAppSplashScreen","_showYouTubeAnnotations","_contentType","_preload","_fullViewPort","_contentBasePath","_disableContextMenuForVideo","_theme","_enableSingleClickControl","_enableDoubleClickControl","_pluginController$1","_useLargerProgressBar","_displayHotspotsShape","_audioDescriptionMediaSrc","_captionSrcList","_disableInteractions","_allowFastForward","_showADACompliantCaptions","_rememberUserInfo","_logScormApiCalls","_userInfo","_videoThumbnailsSrc","_videoThumbnailWidth","_videoThumbnailHeight","_videoThumbnailInterval","_videoThumbnailColumns","_tocModelFromDescription","_completeScormOnRequirementsComplete","_customFullScreenDomElement","_quizServiceBaseUrl","_resultsServiceBaseUrl","_enableTheaterMode","_showAcknowledgementLink","isValidTheme","themeName","themeKey","decodedApostrophe","runOnServer","getUnicodeSafeString","decodeURI","getGA4EventCallback","setGA4EventCallback","ga4EventCallback","getIsUserIdentified","isParamBeingIgnored","shouldLoadXmpParam","param1","param2","getMediaSrc","setMediaSrc","mediaSrc","getXMPSrc","setXMPSrc","xmpSrc","getDisableInteractions","setDisableInteractions$1","disableInteractions","getPosterImageSrc","setPosterImageSrc","posterImageSrc","getTOCSpriteSrc","setTOCSpriteSrc","tocSpriteSrc","getMediaTitle","setMediaTitle","mediaTitle","getTOCTitle","setTOCTitle","tocTitle","getMediaRotation","setMediaRotation","rotation","getEndActionType$1","setEndActionType","endActionType","getEndActionParam","setEndActionParam","endActionParam","getIgnoreXmpControllerParameters","setIgnoreXmpControllerParameters","ignoreXmpControllerParameters","upperCasedIgnores","getIgnoreQuizQuestions","setIgnoreQuizQuestions","ignoreQuizQuestions","getIsSearchable","setIsSearchable","isSearchable","getAutoPlayMedia","setAutoPlayMedia","autoPlayMedia","getForceAutoPlayMedia","setForceAutoPlayMedia","forceAutoPlayMedia","getCaptionsEnabled","setCaptionsEnabled","captionsEnabled","getIgnoreStoredCaptionVisibleSetting","setIgnoreStoredCaptionVisibleSetting","ignoreStored","getSidebarEnabled","setSidebarEnabled","sidebarEnabled","getSidebarLocation","setSidebarLocation","sidebarLocation","getBackgroundColor","setBackgroundColor","getAutoHideControls","setAutoHideControls","autoHideControls","getProcessUnicodeNames","setProcessUnicodeNames","useUnicode","getEnforceLinearAssessment","setEnforceLinearAssessment","enforceLinearAssessment","getDisableFullframeMode","setDisableFullframeMode","disableFullframeMode","getDisableControls","setDisableControls","disableControls","getDisableYouTubeControls","setDisableYouTubeControls","disableYouTubeControls","getDisablePictureInPicture","setDisablePictureInPicture","disablePictureInPicture","getDisableContinueWithoutQuestions","setDisableContinueWithoutQuestions","disableContinueWithoutQuestions","getMobileWebViewCanAutoPlay","setMobileWebViewCanAutoPlay","canAutoPlay","getGoogleAnalyticsID","setGoogleAnalyticsID","getGAPageViewTracking","setGAPageViewTracking","gaPageViewTrack","getGAEventTracking","setGAEventTracking","gaEventTrack","getAltEventCategoryAsFilename","setAltEventCategoryAsFilename","altEventCategoryAsFilename","getAltLoadTimeAsSeconds","setAltLoadTimeAsSeconds","altLoadTimeAsSeconds","getTechSmithAccessTokenEndpoint","setTechSmithAccessTokenEndpoint","accessTokenEndpoint","setUserSignedIn","getJumpToTime","setJumpToTime","getFathomId","setFathomId","fathomId","getEmbedIFrameId","setEmbedIFrameId","embedIFrameId","getUseSlimAppSplashScreen","setUseSlimAppSplashScreen","useSlimAppSplashScreen","setDisableContextMenuForVideo","disableContextMenuForVideo","getShowYouTubeAnnotations","setShowYouTubeAnnotations","showAnnotations","getPreRollSrc","setPreRollSrc","preRollSrc","getContentBase","setContentBase","getContentType","setContentType","getPreload","setPreload","preloadOption","isValidPreloadOption","getFullViewPort","setFullViewPort","getWebConnector","setWebConnector","getTheme","setTheme$2","getEnableSingleClickControl","setEnableSingleClickControl","getEnableDoubleClickControl","setEnableDoubleClickControl","getPluginController","setPluginController","pluginController","getUseLargerProgressBar","setUseLargerProgressBar","useLargerProgressBar","getDisplayHotspotsShape","setDisplayHotspotsShape","displayHotspotsShape","getAudioDescriptionMediaSrc","setAudioDescriptionMediaSrc","audioDescriptionMediaSrc","getSkipVideoControlsEnabled","setSkipVideoControlsEnabled","skipVideoControlsEnabled","getSkipVideoDuration","setSkipVideoDuration","skipVideoDuration","getAllowFastForward","setAllowFastForward","allowFastForward","getShowADACompliantCaptions","setShowADACompliantCaptions","showADACompliantCaptions","getRememberUserInfo","setRememberUserInfo","rememberUserInfo","getLogScormApiCalls","setLogScormApiCalls","logScormApiCalls","getUserInfo","setUserInfo","userInfo","userSignedIn","getVideoThumbnailSrc","setVideoThumbnailSrc","videoThumbnailSrc","getVideoThumbnailWidth","setVideoThumbnailWidth","videoThumbnailWidth","getVideoThumbnailHeight","setVideoThumbnailHeight","videoThumbnailHeight","getVideoThumbnailInterval","setVideoThumbnailInterval","videoThumbnailInterval","getVideoThumbnailColumns","setVideoThumbnailColumns","videoThumbnailColumns","getTocModelFromDescription","setTocModelFromDescription","tocModelFromDescription","getCompleteScormOnRequirementsComplete","setCompleteScormOnRequirementsComplete","completeScormOnRequirementsComplete","getCustomFullScreenDomElement","setCustomFullScreenDomElement","customFullScreenDomElement","getEnableTheaterMode","setEnableTheaterMode","getShowAcknowledgementLink","setShowAcknowledgementLink","showAcknowledgementLink","deprecatedNoOp","playerConfiguration","clearConfiguration","addMediaSrc","getMediaSources","addCaptionSrc","captionSrc","getMediaFileName","mediaSource","splitEl","getUnableToDisplayContentString","useCustomEventTracking","customEventTracking","customEventCallback","getTrackEvents","getCustomEventTracking","getCustomEventCallback","setAdditionalAppQueryParamsFromJson","queryString","getAdditionalAppQueryString","saveConfigurationFromQueryString","configParams","numberParams","getEndActionType","setDisableInteractions","getReportScormComplete","setReportScormComplete","reportScorm","getDisableContextMenuForVideo","setTheme","getUserSignedIn","getQuizServiceBaseUrl","setQuizServiceBaseUrl","quizServiceBaseUrl","getResultsServiceBaseUrl","setResultsServiceBaseUrl","resultsServiceBaseUrl","setSwfBase","isIEOnServerWithUnicode","setFlashUpdateBootstrapSwf","getAdvancedSeeking","setAdvancedSeeking","getDebugUIMode","setDebugUIMode","getPlayerWidth","setPlayerWidth","getPlayerHeight","setPlayerHeight","setFlashPlayerSwf","setForceFlashPlayer","setForceHtml5Player","setConfigurationSrc","setPrioritizeFullScreen","getDisableYouTubeFullscreen","setDisableYouTubeFullscreen","setAllowRewind","mediaRotation","ignoreStoredCaptionVisibleSetting","processUnicodeNames","mobileWebViewCanAutoPlay","googleAnalyticsID","googleAnalyticsPageViewTracking","googleAnalyticsEventTracking","techSmithAccessTokenEndpoint","showYouTubeAnnotations","contentBase","preload","fullViewPort","webConnector","theme","enableSingleClickControl","enableDoubleClickControl","isScormLesson","captionSrcList","videoThumbnailsSrc","enableTheaterMode","AggregateError","errors","setTimeoutFunc","noop$1","Promise$1","doResolve","finale","Handler","any","P","rejectionReasons","allSettled","_currentPlayerType$1","_performanceApiSupported","performance","mark","getEntriesByType","performanceWrapper","markerName","measureName","startMark","endMark","measureNames","rumData","measureDuration","measures","getMeasureDuration","registeredEvents","listeningToWindowMessageEvent","onExternalMessage","smartPlayerEventName","removeWindowMessageListener","externalMessageController","callbackFunction","attachEvent","iFrameBridge","domain","iFrameId","postMessage","stringify","parsePlayerURLParams","playerUrlParams","parseEmbeddedURLParams","queryParamsStripper","mediaType","YOUTUBE","JPG","PLAYLIST","NOT_AVAILABLE","MULTIPLE_TYPES","Media$1","media","uri","_media","_mimeType","_uri","getFileExtension","mediaTypeFromMimeType","MediaListParser$1","mediaSources","_ready","_mediaList","_mediaProcessedPromises","parsePlaylistSource","playlistMediaSource","playlistSrc","jHxr","playlistData","playListMediaPromises","playListMedia","parseMediaUrl","playlistMedia","mediaList","inferredMimeType","ext","inferMimeTypeFromFileExtension","textStatus","findMediaMimeTypeByRequestHeader","parseMedia","youTubeMediaSource","parseYouTubeMedia","MediaList$1","_readyPromiseResolve","_readyPromiseReject","_mediaListParser","_readyPromise","_currentMediaIndex","getMediaIndexByUri","mediaIndex","isMediaTypeAvailable","currentMedia","currentMediaIndex","mediaPosition","currentMediaType","onFirstMedia","onLastMedia","hasImage","isPlaylist","playerType","HTML5_VIDEO","IMAGE","NOT_SUPPORTED","mediaPlayerController","haveImage","haveWebMAndCanPlay","haveMP4AndCanPlay","haveOGGAndCanPlay","haveYoutubeEmbedUrl","_getPlayerType","cssClasses","smartPlayerNamespace","videoWrapper","scormModule","scormModuleNavigationContainer","playerControlsVisible","largerProgressBar","hideElement","volumeSliderHidden","hideSecondaryControls","fullscreenMode","volumeMutedButtonGlyph","volumeLowButtonGlyph","volumeMediumButtonGlyph","volumeHighButtonGlyph","playButtonGlyph","pauseButtonGlyph","fullscreenButtonGlyph","fullscreenButtonActiveGlyph","fullFrameButtonGlyph","fullFrameButtonActiveGlyph","expandButtonGlyph","audioDescriptionButtonGlyph","audioDescriptionButtonActiveGlyph","closedCaptionButtonGlyph","closedCaptionNonEnglishButtonGlyph","closedCaptionButtonActiveGlyph","closedCaptionNonEnglishButtonActiveGlyph","tocButtonGlyph","tocButtonActiveGlyph","settingsButtonGlyph","settingsButtonActiveGlyph","tertiaryButton","tertiaryButtonActive","generatedPluginContainer","pluginNamedContainerPrefix","hotspotVisible","screenReaderAlert","imageViewAnimateTransitions","safariPipIssueFix","captionsUnderVideo","captionsVerticalAlignTop","captionsVerticalAlignBottom","captionsHorizontalAlignLeft","captionsHorizontalAlignCenter","captionsHorizontalAlignRight","captionsCustomPosition","captionsCaptionSelected","captionsPreventCaptionDrag","captionXmpView","captionAdaView","progressBarTrackPreventSeeking","hideBubbleArrow","hiddenVideoThumbnailVisible","scrubPreviewHasThumbnail","focusableAnswerInput","constrainMediaHeight","constrainMediaWidth","mediaTypeYouTube","theaterModeButtonGlyph","theaterModeButtonActiveGlyph","cssVariables","playerWidth","playerHeight","mediaIntrinsicWidth","mediaIntrinsicHeight","mediaIntrinsicAspectRatio","mediaIntrinsicAspectRatioNumber","mediaViewPortWidth","mediaViewPortHeight","mediaViewPortAspectRatio","mediaViewPortAspectRatioNumber","reservedSizeScorm","reservedSizeCaptions","reservedSizeControls","tocTopOffset","ResponsiveController$1","$rootContainer","_$rootContainer","_$mediaViewPortContainer","_$mediaSizingContainer","_currentViewPortWidth","_currentViewPortHeight","_currentViewPortAspectRatio","_intrinsicWidth","_intrinsicHeight","_intrinsicAspectRatio","_rootContainerResizeObserver","_viewPortContainerResizeObserver","_initialCheck","isApproximatelySameSize","newDimensionDouble","existingCssVarName","ResizeObserver","manageResponsiveClasses","calculateMediaViewPortDimensions","setCssVariables","_responsiveBreakpoints","viewPortWidth","viewPortHeight","domContainer","containerWidth","containerHeight","breakpoint","widthClassName","heightClassName","monitorContainerSize","monitorMediaViewPortSize","$mediaViewPortContainer","$mediaSizingContainer","intrinsicWidth","intrinsicHeight","initializeIntrinsicSizing","clearContainerMonitors","disconnect","responsiveBreakpoints","currentMediaWidth","currentMediaHeight","intrinsicMediaWidth","intrinsicMediaHeight","intrinsicMediaAspectRatio","currentViewPortWidth","currentViewPortHeight","currentViewPortAspectRatio","reportType","NONE","API","APIANDSCORM","QuestionSetMarker$1","questionSetIndex","questionSet","_questionSetIndex","_rangeStart","_rangeEnd","_canSeekPast","questionSetId","rangeStart","rangeEnd","canSeekPast","questionType","FILL_IN","CHOICE","SHORT","Question$1","tscmeQuestionModel","_userResponse","_isResponseCorrect","_isGraded","_attemptDuration","_responseLocked","_feedbackActionExecuted","toJSON","questionText","choices","answer","getSnapShot","snapshotUserResponse","rl","ad","irc","populateQuestion","questionSnapShot","getQuizServiceData","percentOfVideoSegmentWatched","questionData","correct","segmentWatched","getFeedbackForReason","feedbackItem","isGraded","userResponse","isResponseCorrect","attemptDuration","responseLocked","feedbackActionExecuted","QuestionSet$1","tscmeQuestionSetModel","_percentOfVideoSegmentWatched","_numberGradedQuestions","_numberUngradedQuestions","cacheQuestionDetails","question","tscmeQuestion","mediaTimePosition","vsw","populateQuestionSet","questionSetSnapShot","quizId","questionSetData","displayFeedback","every","numberGradedQuestions","numberUngradedQuestions","numberCorrectQuestions","usesRationale","Quiz$1","xmpModel","_productionName","_projectName","_quizTitle","_quizId","_quizInstanceId","_questionSetMarkers","_mediaDuration","setReportMethod","quizLocale","quizRequireUserId","quizHideReplay","quizAuthoredEmail","quizClientId","mediaDuration","quizReportMethod","quizAllowSkipQuiz","quizQuestionSetArray","tscmeQuestionSet","getApiDataForQuestionSet","getScormScore","scormScore","totalGradableQuestions","totalCorrectQuestions","isLastQuestionComplete","considerQuestionSetCompleteId","getPreviousMarkerTimeForMarker","markerTime","qs","populateQuiz","quizModelSnapshot","questionSetSnapshot","quizDefinition","quizDef","projectName","productionName","reportRecipients","useQuizApi","useScorm","quizTitle","quizID","quizInstanceID","quizInstanceId","questionSetMarkerTimes","numberQuestionSets","minMarkerTimeDiff","totalNumberOfGradedQuestionSets","totalGradableQuestionSets","urlService","ensureUrlHasValidScheme","paramName","paramValue","kvp","query","generateQueryStringWithExtraParam","windowLocation","port","hostname","pathname","hrs","sec","strTime","hrsPattern","minPattern","secPattern","numPattern","hrsTest","minTest","secTest","numTest","_typeof","polyad","_fathomId","_getCompleteCallback","_errorHandlerCallback","_xmpModel","_videoId","_playbackReadyPromiseResolve","_videoLoadStartTime","_videoLoadEndTime","_previousActiveElement","_previousActiveElementWasHighlighted","_defaultTextColorObject","_defaultBgColorObject","_defaults","captionFontFamily","captionFontSize","captionFontSizeMin","captionFontSizeMax","captionTextColor","captionBgColor","captionPosition","captionBarHeight","_font","_fontSizeForPlayerDimensions","_fontSizeMin","_fontSizeMax","_textColor","_eventHandlers","setFontSize","initFromXmp","minCaptionFontSize","maxCaptionFontSize","captionBg","initDefaults","setFontSizeForPlayerDimensions","scaleX","scaleY","eventEntry","font","fontEnclosedWithQuotes","fontSizeForPlayerDimensions","fontSizeMin","fontSizeMax","textColor","backgroundOpacity","newCaptionTrack","eventCallback","hasCaptions","CaptionService$1","Xmp","_groupedScreenTextItems","_captionDefaults","_xmpAjaxPromise","_captionFileAjaxPromiseList","loadXmpWithRetry","retrylimit","crossDomainRequest","parseXmp","imageExistsForTocFromDescription","captionsSrcList","loadedCaptionData","captionSrcItem","captionAjaxPromise","captionData","abortPendingRequests","hasAdvancedFeatures","hasTocItems","hasCaptionItems","hasHotspotItems","hasQuiz","hasScreenTextItems","hasSpeechTextItems","hasSearchableItems","hasAnySearchableItems","tocImageSrc","tocCellLayoutType","tocItemArray","speechTextItemArray","screenTextItemArray","itemStartTime","groupIndex","groupedItem","previousItemName","currentItemName","hotspotItemArray","captionsHasMultipleLanguages","captionItems","captionBgOpacity","tocContainsThumbs","tocThumbImageSrc","_getFathom","xmlModel","onFathomLoad","fathomService","getFathom","NullSmartPlayerView$1","noOp","loadMedia","destroy","play","isInFullScreenMode","addMediaEventListener","removeMediaEventListener","getCaptionsVisible","setCaptionsVisible","getScrubbing","setScrubbing","triggerVideoStartEventCallbacks","getSafeSeekTime","initializedPromise","Promise","currentSrc","paused","volume","muted","playbackRate","ended","seeking","buffered","played","seekable","uuidGenerator$1","_p8","_analyticsCategory","analyticsService","analyticsCategory","action","category","eventParams","readyStates","VideoPlaybackQualityMetrics$1","videoElementView","triggerRumDataEventCallback","eventLabelSuffixRetriever","playerState","_readyStateHasAtLeastEnoughDataOnce","_readyStateHasEnoughDataAfterSeeked","_timeToReachFirstHaveEnoughData","_videoLoadStartTimeInMilliseconds","_uniqueID","_mediaLocation","_eventListeners","_currentReadyState","_isSeeking","_playingEventShouldFireAfterStalled","_mediaElement","mediaElement","_eventLabel","_queuedEvents","_sendEventsDelayID","getEventLabel","triggerShowVideoBufferingViewEvent","triggerHideVideoBufferingView","sendQueuedEvents","queuedEvent","ga4Event","checkVideoReadyState","currentReadyState","previousReadyState","pausedForQuiz","eventLabel","eventTime","video_session_id","onStalledEventHandler","onProgressEventHandler","removeStoppedToBufferEventIfNeeded","onVideoSeekingHandler","onVideoSeekedHandler","onVideoWaitingHandler","onVideoTimeUpdateHandler","onVideoLoadStartHandler","onVideoMetadataLoadedHandler","onVideoLoadedDataHandler","onVideoCanPlayHandler","onVideoDurationChange","onMediaPlayingEventHandler","setEventLabel","Disabled","DomOrder","escaped","padIfNecessary","getHourMinuteSecondsFromTimeInSeconds","timeInSeconds","secondsWithoutHours","timeFormatter","timeComponents","timeInterval","timecode","multiplier","timecodeParts","lowTimeBounds","timePartAsNumber","PLACEHOLDER_GLYPH_DATA_URL","templateGenerator","_ref","fullscreenIndex","audioDescriptionIndex","audioDescriptionTrackSrc","playButtonIndex","playIndex","accessBtnClickToPlay","replayButtonIndex","replayIndex","accessBtnClickToReplay","templateContext","closedCaptionIndex","questionAnswers","placeHolderImg","answerIndex","isChecked","_ref2","choiceAnswerTemplate","autoFocus","inputLabel","inputId","inputName","useAutofocus","fillAnswerTemplate","buttonTitle","hotspotContainerWidth","hotspotContainerHeight","hotspotIndex","descriptionId","hotspotDescription","hotspotShape","hotspotCoordinatesSeparationBySpace","hotspotLinkClassName","hotspotDescriptionId","hotspotViewTemplate","screenReaderAlertText","screenReaderAlertTemplate","hotspotsContainerId","hotspotsTemplate","hotspotsAltText","videoTagUniqueId","videoViewTemplate","mediaTagUniqueId","imageViewTemplate","loaderImg","loaderAltText","messageText","primaryActionButtonText","messageBarViewTemplate","link","headerText","subHeaderText","replayText","openButtonScreenReaderText","visitSiteText","openExternalLinkTemplate","pipButtonIndex","skipDuration","rewindIndex","forwardIndex","videoWrapperIndex","preRollSizeClass","preRollContainerTemplate","previousIndex","nextIndex","progressIndex","chapterIndex","progressBarChapterSegmentTemplate","questionTextTemplate","questionFeedbackContextText","questionFeedbackContextTextTemplate","correctTextString","incorrectTextString","questionGradedStatusContext","reviewText","confirmationText","alertText","questionSetConfirmationTemplate","totalQuestions","questionCountText","questionCountContext","quizTime","submittingImg","submittingImgAltText","previousQuestionButtonA11yText","previousButtonName","nextQuestionButtonA11yText","nextButtonName","submitButtonName","continueButtonName","hideQuizA11yText","hideQuizText","showQuizText","videoId","questionSetTemplate","numberCorrectText","percentCorrectText","numberInCorrectText","percentInCorrectText","continueText","numberCorrect","percentCorrect","numberInCorrect","percentInCorrect","reviewAnswerText","questionSetReviewConfirmationTemplate","gradableDetails","unGradeableDetails","questionSetResultsTabIndex","txtAnswersSubmitted","gradeableDetails","txtViewAnswers","txtHideAnswers","questionSetReviewStatusTemplate","enterName1","enterName2","name1Class","name2Class","reverseNames","setupMessage","enterEmail","beginButtonText","skipControlText","quizSetupTemplate","hasMultipleLanguages","playbackRatesList","ccLanguageList","captionsExist","settingsIndex","speedSettingIndex","playbackRates","ccLanguageSettingIndex","ccLanguages","acknowledgmentUrl","languageValue","languageLabel","_ref3","rateValue","rateLabel","settingsViewTemplate","shortAnswerTemplate","tocIndex","dataTocTime","dataFileText","showThumbnail","centerContent","showText","tocText","tocRawText","tocItemRawText","tocItemIndex","tocItemText","tocItemTemplate","searchLabel","msgSearch","msgSearchIsDisabledInFS","tocSearchIndex","tocEraseIndex","cachedVolume","volumeIndex","accessVolumeSlider","minVolume","maxVolume","currentVolume","buttonLabel","isPrimaryButton","completeSessionButtonLabel","scormNavigationBarTemplate","confirmText","dismissButtonText","dismissButtonScreenReaderText","confirmButtonText","confirmButtonScreenReaderText","isDestructiveButton","scormConfirmCompleteModalTemplate","sessionEndedText","theaterModeIndex","VideoSeekingSpinnerView$1","$container","_viewOpen","_displayTimeoutId","_$seekingSpinnerContainer","showViewAfterDelay","hideView","showView","quizController","videoApiUtils","questionSetMarker","timeInMilliseconds","quizModel","quizEnabled","newQuizController","mediaView","wrapperWidth","wrapperHeight","mediaWidth","mediaHeight","ratioOfWidth","ratioOfHeight","playerControlsType","video","videoPlaylist","mediaViewType","playlist","VideoElementView$1","$mediaContainer","includeControls","triggerRumDataEvent","firstPlayCallback","includePosterIfAvailable","_view","_mediaWrapper","_videoSeekingSpinnerView","_videoPlaybackQualityMetrics","_containsWebTrackCaptions","_videoFirstPlayTriggered","_$videoAndVideoSources","_captionTrackElements","showVideoBufferingView","hideVideoBufferingView","onVideoErrorHandler","errorString","onFirstPlayHandler","unbindVideoEvents","bindVideoSourceEvents","videoElementMarkup","languageDisplayName","$videoElementContainer","createView","captionTrackElements","textTracks","numberTracks","captionLanguage","cacheCaptionTrackElements","hotfixViewAndControlsCSS","$controlsView","showCaptionTrack","mode","hideCaptionTrack","onEventHandler","reshowVideoAfterClickToReplay","processVideoEnd","numberMediaSource","mediaWrapper","containsWebTrackCaptions","videoWidth","videoHeight","currentTimeInMilliseconds","currentTimeInSeconds","canDragContentOnVideo","playerControlType","supportsClickToPlayControls","supportsSCORM","playbackQualityMetrics","timingMeasureList","messageBarType","info","warning","MessageBarView$1","customActionButtonHandler","_$messageBarContainer","_$actionButton","onActionClick","playedTracker","tracker","internalPlayed","currentMediaSegmentIndex","lastTimeUpdate","segmentIndex","createNewPlayedMediaSegment","newIndex","numberPlayedSegments","PlayedMediaSegment","onMediaSeekEnd","mediaSegmentIndexForTime","getPlayedMediaSegmentIndexByTime","mergeOverlappingMediaSegments","numberSegments","areMediaSegmentsOverlapping","mergeMediaSegments","segmentOneIndex","segmentTwoIndex","mergedIndex","notMergedIndex","timeChangeSinceLastUpdate","recordTime","segment1","segment2","startInOuterSegment","endInOuterSegment","segment","youtubeIdParser","videoUrl","videoIdMatch","_playbackReadyPromise","youTube","onFirstPlay","onError","startTimeInSeconds","disableFullScreen","loadedPercent","supportPlaybackRate","availableRateSettings","displayAnnotations","heartbeatIntervalId","playbackReadyPromise","handlerIndex","arg1","arg2","firstPlay","player","getDuration","YT","playerVars","wmode","loop","autoplay","disablekb","rel","showsearch","showinfo","iv_load_policy","playsinline","fs","modestbranding","onReady","playerIFrame","getAvailablePlaybackRates","onStateChange","PlayerState","PAUSED","ENDED","PLAYING","BUFFERING","onPlaybackRateChange","eventHandlers","_playedTracker","getCurrentTime","seekTo","setPlaybackRate","scaledValue","setVolume","mute","unMute","playVideo","pauseVideo","cueVideoById","onYouTubeIframeAPIReady","clearInterval","setInterval","getPlayerState","videoLoadedFraction","getVideoLoadedFraction","percentLoaded","queued","youTubeApiFound","YoutubeElementView$1","containerElementUniqueId","_youtubePlayer","_errorMessageBarView","_$youtubePointerEventWorkaround","internalFirstPlayCallback","onControlsHidden","onControlsVisible","bindToEvents","youtubeElementViewObject","mediaHasQuizQuestions","SEGMENT_CHOICES","segmentLength","_videoDuration","_segmentLength","_numberSegments","_videoSegments","_numberVideoSegmentWatched","_currentPlayTime","_enabled","videoAnalytics","loadTime","videoDurationInMilliseconds","videoTimeInMilliseconds","startTimeInMilliseconds","endTimeInMilliseconds","percentageWatched","startSegmentIndex","endSegmentIndex","numberSegmentsWatched","totalSegmentsInRange","segmentValue","videoSegmentSnapshot","videoSegmentSnapshotList","PlaylistElementView$1","_videoElementView","initCurrentMedia","enablePreviousButton","enableNextButton","clickPrevHandler","clickNextHandler","wasPlaylistLastMediaItem","fullscreenHelper","elementToFullScreen","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","fullScreenElement","exitFullscreen","webkitExitFullscreen","ImageView$1","imageSrc","_$imageEl","imageViewMarkup","_imageTapActive","_$document","onImageError","switchToFullscreenMode","exitFullscreenMode","onFullscreenChange","fullscreenElement","onImageTouchToggle","naturalWidth","naturalHeight","MediaViewFactory$1","playerMarkup","disableHighlights","$element","highlightDisabler","highlightState","_keyTypes","space","leftArrow","upArrow","rightArrow","downArrow","tab","tableOfContents","isKeyPassedOfSameType","isKeyOfLanguageSpecificType","isKeyOfEnglishSpecificType","isKeyOfGermanSpecificType","isKeyOfJapaneseSpecificType","isKeyOfType","keyTypes","_$focusTrapElement","_firstFocusableEl","_lastFocusableEl","_$window$1","scrollIntoView","scrollParent","scrollIntoViewIfNeeded","elementFitsInsideContainer","innerHeight","saveActiveElement","disableHighlightsOnPreviousActiveElement","$previousActiveElement","onFocusTrapTab","removeFocusTrap","viewHelper","trapFocus","focusableEls","scrollActiveElementIntoView","focusPreviousElement","elementOrChildHasFocus","getActiveElement","iframes","focused","contentWindow","rightParenRegex$1","leftParenRegex$1","playReplayControlStates","playVideoDisplayed","replayVideoDisplayed","BeforeAfterPlayControlsView$1","_markup","_$videoClickToPlayLink","_$videoClickToReplayLink","_$videoClickToPlayGraphic","_$videoClickToReplayGraphic","_$pluginContainer","_viewState","onPlayHandler","hideVideoClickToPlayLink","hideVideoClickToReplayLink","replayHandler","enableControls","toggleFullscreen","initPlugins","viewElementType","initializePluginsForViewElement","showVideoClickToPlayLink","setVideoClickToPlayErrorState","showVideoClickToReplayLink","addVideoClickToPlayBackground","posterSrc","disableClickToPlayEvents","viewState","mouseButtons","mainButton","auxiliaryButton","secondaryButton","ProgressChapterModel$1","startAsPercent","endAsPercent","durationAsPercent","$chapterElement","_index","_startAsPercent","_endAsPercent","_durationAsPercent","_$chapterElement","_$loadProgressElement","_$seekHintProgressElement","_$playProgressElement","$loadProgressElement","$seekHintProgressElement","$playProgressElement","getThumbnailRectangleByTime","timeIndex","row","ProgressBarControlView$1","_videoThumbnailImage","_formattedDuration","_readableDuration","_documentRef","_windowRef","_requestAnimationId","_scrubbing","_lastScrubTime","_wasPlayingBeforeSeek","_playStatusAfterSeek","_quizModel","_$playTimeDisplay","_$scrubBar","_$scrubbarTrack","_$quizMarkers","_$scrubPreview","_$scrubVideoThumbnail","_$hiddenVideoThumbnail","_scrubVideoThumbnailCanvasCtx","_$scrubPreviewChapterName","_$scrubPreviewVideoTime","_keysEnabled","_durationDisplayInitialized","_markersCreated","_lastUpdatedFormattedMediaTime","_lastUpdatedScrubTime","_showSeekPreview","_lastSeekHintVideoPercent","_lastSeekPreviewDetails","hideThumbnail","videoTimeInSeconds","displayAtVideoPercent","chapterName","formattedVideoTime","_chaptersCache","_shouldRespectQuizMarkers","_updateBufferedTimeout","_hideSeekPreviewTimeoutId","_currentProgressBarWidth","shouldRespectQuizMarkers","getClickX","allowSkipQuestionSetMarkersBeforeTime","getChapterPercentageFromTotalPercentage","totalPercent","chapter","getVideoTimeFromXPosition","xPos","relativeXPos","scrubBarWidth","amountPlayedPercentage","pendingVideoTime","videoTime","closestRequiredQuizMarker","getClosestRequiredQuizMarkerTimeBeforeVideoTime","updateLoadProgress","onDownSeek","onMoveSeek","onUpSeek","setPlayProgress","setScrubPreviewDetailsAtTime","videoSeekTimes","unrestrictedVideoPercent","restrictedVideoPercent","getChapterNameAtVideoTime","onMouseMoveToPreview","clearHideScrubPreviewDelay","showScrubPreview","updateSeekHint","hideScrubPreview","onScrubBarMouseOut","atVideoEndTime","videoTimes","previewDisplayText","videoPercent","previewLeftPos","scrubPreviewWidth","thumbnailRect","drawImage","updateVideoThumbnail","videoPercentNormalized","drawSeekHint","updateUi","percentPlayed","updateTimeDisplay","formattedCurrentTime","progressDisplayText","ariaValueText","cacheProgressBarWidth","onPlayerResize","updateQuizMarkers","createQuizMarkers","updateMarkerVisibility","mediaDurationInMilliseconds","timePercent","quizMarkerContainerWidth","marker","markerSize","onselectstart","keyPressed","fastForwardDisabledText","screenReaderAlertMarkup","$screenReaderAlert","timeToSkip","onMousedown","disableKeyListeners","enableKeyListeners","onQuizzingCompleteHandler","onMediaSeekedEvent","resetSeekPastFlagForQuizMarkersPastTime","onLoadedMetadata","onVideoThumbnailLoaded","getContext","onAddPlugin","onVideoProgress","downloadedPercent","progressBarChapterSegmentMarkup","onRequestAnimationFrame","playAfterSeek","updatePlayProgress","Image","getXPositionForQuestionSetMarker","questionSetMarkerId","measuredContainerWidth","measuredQuizMarkerWidth","usedElementWidth","scrubBarLeftOffset","durationHasChanged","createTocChapters","xmpTocItems","lastStartTime","lastChapterDuration","nextChapterTimeOrDuration","chapterPercentage","cancelAnimationFrame","setShouldRespectQuizMarkers","newShouldRespectQuizMarkers","scrubbing","lastScrubTime","controlElement","displayWidth","PlayRewindControlsView$1","_disabled","_$playControl","_$rewindControl","_$forwardControl","_$playButtonGlyph","_$pauseButtonGlyph","pauseMedia","togglePlay","seekVideo","rewindVideo","skipVideoForward","setInitialFocus","PrevNextControlsView$1","_$previousControl","_$nextControl","disablePreviousButton","disableNextButton","localStorageWrapper","localStorage","setItem","getItem","VOLUME_STRING","VolumeControlView$1","cachedVolumeValue","_showVolumeSlider","_secondaryControlsHidden","_cachedVolume","_cachedMuted","_sliderShowTimeoutId","_$controlsContainer","_$primaryControlsContainer","_$secondaryControlsContainer","_$volumeContainer","_$volumeSliderContainer","_$volumeSlider","_$volumeSliderTrack","_$volumeControl","_initialVolume","_initialMuted","_sliderVolumeValue","_sliderActive","onKeyDownHandler","onKeyHandler","setSliderValue","updateVolumeSliderPositionByVolume","clampVolumePercentage","volumeAsPercent","volumePercentageValue","onSliderMouseDownHandler","volumeSliderLeftOffset","pendingVolumeValue","updateSliderValue","onMouseMove","onMouseUp","updateSliderOnAnimationFrame","volumeFromMedia","volumeConverted","volumeSliderLeftCssValue","volumeTrackWidthCssValue","showVolumeSlider","handleSecondaryControls","shouldHideSecondaryControls","setSecondaryControlsVisibility","isHidden","hideVolumeSlider","updateUI","volumeValue","setMuted","newVolumeAsPercent","startHideSliderTimeout","onContainerMouseOver","onContainerMouseLeave","hideVolumeSliderOnFocusOut","onVolumeButtonClick","onResize","onMediaVolumeChange","hideControls","AudioDescriptionControlView$1","_$audioDescriptionButton","_$audioDescriptionGlyph","_audioDescriptionEnabled","onButtonClick","audioDescriptionEnabled","onAudioDescriptionChange","eventData","audioDescriptionFailedToPlay","disableControl","enableControl","CaptionsControlView$1","_$closedCaptionButton","_$closedCaptionGlyph","_normalButtonClass","_activeButtonClass","savePreference","onCaptionsToggle","savedStateLoaded","setCaptionButtonVisible","captionButtonVisible","_hotkeysEnabled","hotkeyService","TocControlView$1","_$tocButton","_$tocGlyph","tocButtonMarkup","_tocDisplayed","setTocDisplayState","displayToc","classList","onHideToc","onShowToc","focusTocButton","_defaultAvailablePlaybackRates","PlayerSettingsView$1","_isOpen","_currentPlaybackRate","_availablePlaybackRates","_minPlaybackRate","_maxPlaybackRate","defaultPlaybackRate","playerSettingsViewMarkup","playerRateOptionsLocalizedStrings","rate","getPlaybackRates","selectedLanguageIdentifier","foundSelectedLanguageInAvailableList","languageShouldBeSelected","getClosedCaptionLanguages","_$playerSettingsWrapper","_$playerSettingsViewEl","_$playbackRateSelectEl","_$ccLanguageSelectEl","_$playerSettingsButton","_$playerSettingsButtonGlyph","_$closedCaptionToggleContainer","_$closedCaptionToggle","_$closedCaptionToggleElement","_$audioDescriptionToggle","_$audioDescriptionToggleElement","_$settingsCloseButton","_$settingsHeaderContainer","savedPlayBackSpeedFromLocalStorage","removeClickHandler","addClickHandler","trapFocusInModalView","hideSettingsViewOnClickOutside","playbackSpeed","onPlaybackRateControlChange","onCCLanguageControlChange","ccLanguageCode","onAudioDescriptionToggleChange","onClosedCaptionToggleChange","onCaptionsToggled","onPlaybackRateValueChange","realPlaybackRate","onKeyboardShortCut","indexOfCurrentRate","decrementPlaybackRate","onPlayerSettingsButtonClick","onDisplayCaptionControl","displayCaptionControl","isOpen","nullPipController","exit","bindChangeEvent","unbindChangeEvent","inPip","isSupported","StandardsPipController$1","requestPictureInPicture","exitPictureInPicture","onChangeHandler","pictureInPictureElement","pictureInPictureEnabled","LegacySafariPipController$1","webkitSetPresentationMode","webkitPresentationMode","webkitSupportsPresentationMode","pipControllerFactory","PipControlView$1","_$pipButton","_pipApiController","onPresentationModeChange","pipViewActive","onPipControlClick","handleSmartPlayerActionEvents","initialize","DisplayModes","Normal","Theater","Fullscreen","PictureInPicture","TheaterModeControlView$1","_$theaterModeButton","_$theaterModeGlyph","_theaterModeEnabled","sendTheaterModeChangedEvent","displayMode","setDisplayMode","loadSavedSettings","savedDisplayStateStorage","inFullScreen","FullscreenControlView$1","_$fullScreenButton","_$fullScreenGlyph","_elementToFullscreen","_inFullScreen","_inFullFrame","_fullScreenDomElement","_buttonMode","_legacyIOSFullScreenMode","findButtonMode","canSupportExpandVideoMode","setButtonDisplay","onFullScreenChange","cancelFullScreen","switchFromFullScreenMode","toggleFullScreenMode","toggleFullFrameMode","onFullScreenClick","checkToExitFullScreen","onFullButtonClick","initializeHandlers","fullScreenEventNames","initializeFullScreenSupport","onVideoEnd","onDoubleClick","isFullScreen","isFullFrame","ClickControlsView$1","fullscreenControlView","progressBarControlView","doubleClickDelay","_$clickControls","_$playPauseStateContainer","_$playPauseStateIndicator","_clicks","_doubleClickTimer","_draggingCaption","_mediaPluginInteractionActive","_doubleClickDelay","processHotspotActiveChange","hasTimeChangeAction","enable","onControlClick","mediaPaused","onCaptionDragStart","onCaptionDragEnd","processMediaAreaPluginInteractiveHandler","VideoControlsController$1","$rootSmartPlayerElement","_$videoControlsContainer","_beforeAfterPlayControlsView","_progressBarControlView","_playRewindControlsView","_prevNextControlsView","_volumeControlView","_audioDescriptionControlView","_captionsControlView","_tocControlView","_playerSettingsView","_pipControlView","_theaterModeControlView","_fullScreenControlView","_clickControlsView","_lastClickTime","_displayStartScreenOnPlaybackError","_mediaIsSeeking","_timeToSeekAfterCurrentSeekOperation","_displayMode","_playbackInitialized","_userNeedToClickHeroPlayControl","_controlsHidden","_autoHideControlsTimeoutId","_lastMouseMoveCoords","forceHide","hideElementAfterFadeOut","controlsAreBusy","hideControlsOnTimeout","clearHideControlsTimeout","resetHideControlsTimeout","enableClickControlsIfNotPausedForHotspot","oneOrMoreHotspotsWithTimeActionArePaused","showControls","showControlsWithAutoHide","onContainerClick","getTime","onContainerLeave","onContainerMousemove","enableAutoHideControls","disableAutoHideControls","resetTime","onPlaybackInitialized","playPromise","setControlsDisplayMode","onSeekToTime","onSetVolume","onSetMuted","isMuted","onSetPlaybackRate","onVideoSeeking","onVideoSeeked","onVideoMetadataLoaded","seekToInitialTimeIfSet","teardownHideShowControls","onDisplayTocControl","onTocScroll","timeToSeek","initializePlayback","onQuizSetupComplete","onHeroPlayControlClick","onMediaError","onHotspotInactive","onTryToAutoPlay","userNeedToClickHeroPlayControl","playbackInitialized","beforeAfterPlayControlsView","CAPTION_POSITION","CAPTION_ALIGNMENT","VideoControlsDisplayModeController$1","videoControlsController","_quizUIVisible","_quizUIMinimized","_pipViewActive","_captionViewPosition","_searchIsFocused","_isScrubbing","_externalLinkViewOpen","_mediaError","getDisplayMode","updateVideoControlsDisplayMode","captionViewPosition","onPipChanged","onQuizUIVisible","onQuizUIHidden","onMinimizeQuizUI","onMaximizeQuizUI","onShowQuizSetup","handleControlsUpdated","onSearchFocusChange","searchIsFocused","onScrubbingStarted","onScrubbingEnded","onExternalLinkViewOpen","onExternalLinkViewClosed","hotspotViewState","firstVisible","HotspotViewModel$1","hotspotXmpModel","videoNativeWidth","videoNativeHeight","_hotspotXmpModel","_hotspotIndex","_isActive","_hasPausedAtEnd","_viewPoints","viewPoints","coordinate","hsViewData","xOrig","yOrig","xScale","yScale","getHotspotViewPoints","hotspotText","jumpMediaText","jumpTimeText","openLinkText","playText","createHotspotDescription","isTimeNearEndOfHotspot","getTimeLeftUntilEnd","getCoordinates","hotspotViewWidth","hotspotViewHeight","viewPoint","isHotspotWithinTime","shouldPauseAtTheEnd","isActive","hasPausedAtEnd","HotspotView$1","spContainer","$hotspotsContainerElement","hotspotViewModel","_$hotspotSvgElement","_$hotspotLinkElement","_timerId","svgViewMarkup","$svgView","enableTabbing","disableTabbing","onQuizEventHandler","onControlsUpdatedHandler","hideHotspot","getCurrentTimeInMilliseconds","displayHotspot","addHotspotViewToDom","$svgElementWithLowerIndex","$svg","getSvgElementWithLowerIndex","pauseOnHotspot","initPauseOnHotspot","mediaPlaybackRate","frameBuffer","getTimeToHotspotEnd","resetHasPaused","update","hotspotState","HotspotsView$1","tabController","_$hotspots","_currentFile","hotspotsMarkup","_xmp","_eventContainer","_hotspotsContainerId","_hotspotXmpModels","_hotspotViews","_mediaNativeWidth","_mediaNativeHeight","_oneOrMoreHotspotActive","preventEvent","onHotspotActiveChange","oneOrMoreHotspotActive","numberHotspotsJustDisplayed","isHotspotWithTimeActionPaused","lastActiveHotspotView","getLastActiveHotspotView","lastTabEnabledElement","hotspotAlertText","addScreenReaderAlert","onHotspotClick","targetHotspotXmpModel","targetHotspotViewModel","currentFile","hotspotView","currentMediaTimeInMilliseconds","$hotspots","HotspotController$1","_hotspotsView","_$hotspotsContainer","onVideoTimeUpdate","updateHotSpotsViewTime","processHotspotClick","opened_url","targetWindow","onSeeked","eventsToBind","loadedmetadata","timeupdate","seeked","unbindToEvents","_scaledFontSize$1","_currentCaptionWidth$1","xmpCaptionView","setStyle","captionsService","$positionContainer","$textContainer","background","setWidth","scaledVideoWidth","captionPositionUnderVideo","setScale","canvasScale","maxRequiredHeight","scaledFontSize","captionWidth","_scaledFontSize","_currentCaptionWidth","adaCaptionView","captionViewFactory","CaptionsView$1","canDragCaptions","_lastUpdateCurrentFile","_window","_$positionContainer","_$textContainer","_canvasScale","_visible","_currentCaptionIndex","_lastUpdateCurrentTime","_initDragClientPosition","_onStartDragCaptionContainerSize","_initCaptionTextPosition","_customCaptionPosition","onCaptionLanguageChanged","updateCaption","onDragAnimationFrame","getInteractionPointFromEvent","onCaptionDrag","point","dragXOffset","dragYOffset","offsetXPercent","offsetYPercent","maxWidthPercentage","currentCaptionWidth","innerWidth","currentCaptionHeight","currentCaptionOffset","currentTextOffset","topPercent","leftPercent","setVisible","handleDisplayCaptions","resizeCaptionsContainer","updateView","captionStylesHaveChanged","onSizeChange","forceActiveCaptionUpdate","newCaptionIndex","getHorizontalAlignmentClass","setupDomStructure","showVideoTrackCaptions","hideVideoTrackCaptions","CaptionController$1","captionService","_captionsView","_$controls","setupCaptionView","isNotNullOrUndefined","resizeCaptions","scaleContainer","updateCaptions","onNewCaptionTrack","savedCaptionsStateFromLocalStorage","initialState","videoCaptionsSetting","loadInitialState","getCaptionCollection","getCaptionTrack","setCaptionTrack","showCaptionControls","EMAIL_REGEX","textSanitizer","email","TIME_SALT","getMilliseconds","UNIQUE_TOKEN_1","UNIQUE_TOKEN_2","REGEX_REPLACEMENT_STRING","TOKEN_1_REGEX","TOKEN_2_REGEX","REGEX_ESCAPE","createHighlightedText","searchRegex","textWithSearchMatchPlaceholders","searchTool","searchString","itemsToSearch","itemText","rawText","imageRef","imageRect","simpleSearch","TocView$1","_viewVisible","_viewIsOpen","_searchFocus","_scrolledToc","_$tocHeadContainer","_$searchContainer","_$searchInput","_$titleHeader","_$clearSearchButton","_$tocPipImageContainer","_$searchInputDisabled","_$tocContentScrollContainer","_$tocContent","_$tocContentScreenReaderLabel","_$tocItemDomList","_$tocContainer","_$noSearchResultsAlert","_tocThumbsImage","_tocPipImage","_pointerDownClientPoint","animationSpeed","openView","resizeView","headerHeight","tocTopPosition","displayTocPipImage","targetWidth","targetHeight","imageWidth","imageHeight","TOC_WIDTH","pipImageBackgroundStyle","pipImageBackground","setupTocHeader","clearTocContent","createTocItem","tocTime","tocFile","tocItemThumbnailCanvasEl","imageThumbRect","tocItemMarkup","$tocItem","yPos","thumbScale","TOC_MAX_HEIGHT","verticalThumbScale","ctx","fillStyle","fillRect","generateTocItemThumbnail","displayTocItems","tocItem","thumbnailCanvasEl","tocItemClickHandler","seekToTocItem","clickTocItem","$currentTarget","timeToSeekTo","fileToSeekTo","onTocItemPointerDown","onTocItemPointerMove","onSearchTextInput","updateSearchResults","$tocButtons","searchResults","searchResultsTocItems","updatedSearchAlertText","alertScreenReader","clearSearch","clearSearchAlertText","onSearchInputFocus","onSearchInputBlur","onTocItemKeyUp","onTocItemKeyDown","onTocContentScrollHandler","tocMarkup","blurSearchInput","disableSearch","enableSearch","resize","tocContainsActiveElement","TableOfContentsController$1","_tocView","resizeTableOfContents","onTocItemClicked","videoIndex","hideToc","mobileOrientationChange","onQuizMinimizeUI","onQuizMaximizeUI","onQuizReview","onQuizPaused","onTocDisplayToggled","AudioDescriptionTrackView$1","_audioDescriptionAudioEl","_audioTrackEnabled","_videoIsSeeking","_videoIsBuffering","_lastBufferedVideoTime","onAudioError","syncAudioTimeWithVideoTime","syncAudioVolumeWithVideoVolume","pauseAudioDescription","onVideoPlaying","onVideoStartSeeking","onWaiting","playAudioDescriptionIfVideoIsPlaying","onRateChange","onAudioTrackSeeked","onAudioDescriptionControlChange","onTimeUpdate","AudioDescriptionController$1","_audioDescriptionTrackView","ConfirmOpenUrlView$1","_$view","_$externalLinkReplayButton","_$externalLinkVisitButton","onConfirmHandler","onReplay","bindEvents","notAvailable","jumpToTimeAndPlay","jumpToTImeAndStop","showReplayControls","hideReplayControls","openUrl","openUrlInNewWindow","xmpEndActionType","xmpEndActionTypeLowerCase","executeSeekAction","onReplayHandler","seekTime","displayConfirmOpenUrlView","$localContainer","inNewWindow","urlString","executeEndAction","replayVideoHandler","showReplayControlsHandler","EndActionsController$1","_processingEndOfVideo","replayVideo","showClickToReplay","onVideoReplayHandler","replayTime","processEndOfMedia","isPlaybackEnded","BubbleView$1","containerId","_viewIsMinimized","_viewBottom","_ignoreBreakpoints","_containerId","_topContainer","_$container","_$overlay","_$arrowBubble","clickCapture","isDesktopBreakpoint","cacheElements","ignoreBreakpoints","maximizeView","minimizeView","updateViewPosition","removeView","destroyOverlay","getOverlayMarkup","setBottomOffset","bottom","pointAt","quizXPos","arrowPos","outerWidth","viewWidth","halfViewWidth","borderWidth","arrowWidth","viewIsMinimized","rationaleActionType","CONTINUE","LOCATION","JUMP_TO_TIME","CORRECT_GLYPH_DATA_URL","INCORRECT_GLYPH_DATA_URL","CORRECT_ANSWER_TEXT","YOUR_ANSWER_TEXT","AnswersView$1","showResults","answersMarkup","_$window","_$textInput","getCorrectAnswerIndex","numberAnswers","correctAnswerBitshifted","displayResults","$labelEls","correctAnswerIndex","$placeHolderImgEls","$userResponseInputImageEl","$correctResponseInputImageEl","$correctImage","$incorrectImage","displayResponseFillInResults","$inputEls","disableInput","getAnswersMarkup","getUserResponse","getCorrectAnswerText","userAnsweredQuestion","responseSuffix","getTextResponseSuffix","usersAnswer","getUsersAnswer","fullAnswerText","isTextInputOrAreaFocused","QuestionView$1","$questionTextContainer","$questionGradedStatusContainer","$feedbackContainer","$answersContainer","_answersView","feedbackMarkup","_feedbackContextMarkup","questionTextMarkup","questionGradedStatusMarkup","QuestionSetView$1","displayOverlay","mediaIsImage","showQuestionSetResults","_resolveInitPromise","questionSetViewMarkup","_currentQuestionIndex","_startTimeForQuestion","_currentQuestionView","_initTimeoutId","_alertScreenReaderTimeoutId","_$questionSetContainer","_$questionSetContent","_$questionTextContainer","_$answersContainer","_$feedbackContainer","_$questionCountContainer","_$questionGradedStatusContainer","_$hideControl","_$showControl","_$prevControl","_$continueControl","_$submitControl","_$minimizedContainer","_minimizedByKeyboardShortcut","_superView","initPromise","onHideQuizClick","onShowQuizHandler","onKeyUpHandler","isOnLastQuestion","saveQuestionUserInput","timeBetween","executeContinueAction","displayNextQuestion","executeRationaleAction","feedbackInfo","actionType","feedbackReason","getFeedbackInfoForCurrentQuestion","displayQuestion","onPreviousQuestion","onNextQuestion","onContinue","onSubmit","onIphoneTouchstart","getControlsConfig","currentQuestion","onFirstQuestion","onLastQuestion","hasOneQuestion","controlsConfig","showSubmitNav","showContinueNav","showPrevNav","showNextNav","prevDisabled","nextDisabled","updateControls","updateQuestionCount","questionCountMarkup","checkQuestionSetProgress","completeCallback","showFeedbackForCurrentQuestion","viewInitializedPromise","_superView$2","questionSetConfirmationView","getViewMarkup","getReviewControlRef","getConfirmControlRef","$confirmControl","sessionStorageWrapper","sessionStorage","rightParenRegex","leftParenRegex","QuizSetupView$1","quizSetupMarkup","_$quizSetupView","_$firstNameInput","_$lastNameInput","_$emailInput","_$beginButton","_$skipButton","getKeys","validateInput","firstName","lastName","beginQuiz","cacheSelfIdentity","skipQuiz","hideSkipButton","$view","_superView$1","reviewAnswersConfirmationView","getContinueControlRef","$reviewControl","BackoffStrategyFactory","retryLimit","backoffTime","maxDelay","tries","backoff","statusCodes","Unauthorized","UnprocessableEntity","_quizInstanceDataPromiseResolve","_quizInstanceDataPromiseReject","_gradeableDetails","_unGradeableDetails","_onPreRollStartedCallback","$preRollView","NO_RETRY_STATUS_CODES","HttpService$1","retryStrategyFactory","logFailures","_pendingRequestPromises","removePendingRequestPromise","requestPromise","UUID","addRequestToPendingList","requestUUID","sendRequest","httpVerb","retryStrategy","request","retries","responseData","canRetryFromStatusCode","retryResponse","sendFormDataPost","quizDataXmlConverter","recipient","choice","httpService$1","tokenService","AccessToken","_quizCreateInstanceUrl","_quizInstanceDataPromise","httpService","httpServiceWithUnlimitedRetries","httpServiceWithNoLogging","getBaseURL","quizService","setQuizCreateInstanceUrl","quizCreateInstanceUrl","getQuizCreateInstanceUrl","startQuizInstance","playerConfig","QuizId","CheckForQuizDefinition","FirstName","LastName","Email","getInstanceFormData","DefinitionRequired","quizJsonData","quizDefinitionXml","DefinitionText","submitQuizDefinition","analyticsSampleRate","SampleRate","reportingRate","ReportingRate","Id","submitQuestionSet","quizInstanceData","questionSetXml","ResponseText","sendProgress","sampleRateInMilliseconds","completedSamples","InstanceId","Interval","ViewedSegments","getAnalyticsRate","QuizProgressTracker$1","videoToTrack","reportingRateInMilliseconds","_intervalId","_playCallbackFunction","_didAttachToEndedEvent","_didAttachToPlayEvent","attachToEndedEvent","stopInterval","setupProgressInterval","attachToPlayEvent","videoStartMilliseconds","videoEndMilliseconds","isEndOfVideo","firstSample","lastSample","mergedPlayedInMilliseconds","mergedPlayedIndex","processPlayedSegments","computePercentageViewed","questionGrader","FATHOM","XMP","fathomGrader","processQuestionSetResults","questionResult","isCorrect","processQuestionResults","doesLocalGrading","gradeQuestion","responseNumber","gradeChoiceQuestion","responseLowerCase","possibleAnswers","numberPossibleAnswers","gradeFillInTheBlankQuestion","xmpGrader","gradeQuestionSet","questionSetReviewStatusView","setGradeableDetails","setUngradeableDetails","getHideAnswersControlRef","getShowAnswersControlRef","$readableElement","scormConstants","terminate","setValue","commit","dataModelID","cmiExit","cmiLocation","cmiSuspendData","cmiProgressMeasure","cmiScaledPassingScore","cmiScoreMin","cmiScoreMax","cmiScoreRaw","cmiScoreScaled","cmiSuccessStatus","cmiCompletionStatus","cmiSessionTime","adlNavRequest","scorm1Dot2DataModel","scorm2004DataModel","incomplete","notAttempted","unknown","passed","failed","browsed","exitStates","suspend","logout","navRequestStates","exitAll","suspendAll","versions","NOT_DETECTED","SCORM_1_2","SCORM_2004","assessment","minScore","maxScore","scoreNormalizationDivider","ScormDataModel$1","_percentageComplete","_quizPercentageCorrect","_quizCompletionStatus","_quizModelSnapshot","_videoAnalyticsSnapshot","_videoTimeInSecondsSnapshot","_videoTimeInSeconds","_completionStatus","_passingStatus","parseSuspendedDataString","suspendedDataString","suspendedData","pc","vas","cvt","getSuspendedDataString","percentageComplete","quizPercentageCorrect","quizPercentageCorrectAsString","quizCompletionStatus","videoAnalyticsSnapshot","snapshot","videoTimeInSecondsSnapshot","completionStatus","passingStatus","ScormApiWrapper$1","scormApi","noAPIFound","apiVersion","scormManifestDocString","apiCall","scormFunctionName","dataModalID","dmeValue","dataModel","Initialize","LMSInitialize","GetValue","LMSGetValue","Terminate","LMSFinish","SetValue","canSetValue","lessonStatus","LMSSetValue","Commit","LMSCommit","getScormManifestDoc","getScormApiOnWindow","windowRef","API_1484_11","manifestDocAsString","scormApiVersion","findAPI","findAPITries","lookForApiOnWindowTopOpener","getAPI","lookForApiOnParentWindow","getTitleFromManifestDoc","manifestXml","api","getTitle","getLastError","errorNumber","diagnostic","GetLastError","GetErrorString","GetDiagnostic","LMSGetLastError","LMSGetErrorString","LMSGetDiagnostic","ScormNavigationBarView$1","_$scormNavigationBarContainer","_$scormHeaderElement","_$scormCompleteSessionButton","_scoObjectiveHasBeenCompleted","onCompleteSessionHandler","scormNavigationBarMarkup","setTitle","scormTitle","scoObjectiveHasBeenCompleted","ScormConfirmCompleteModalView$1","_$confirmButton","_$dismissButton","_$scormConfirmCompleteModalWrapper","onDismissClickHandler","onCompleteClickHandler","failedToSaveSuspendedData","finalConfirmText","canResumeVideo","scormConfirmCompleteModalMarkup","ScormSessionEndedView$1","_$scormSessionEndedWrapper","scormSessionEndedMarkup","scormController$1","_scormApiWrapper","_isDisposed","_initialized","_scormModel","_scormNavigationBarView","_scormConfirmCompleteModalView","_minimumScoreToPass","_minimumViewPercentageToCompleteLesson","_sessionStartTimeInMilliseconds","_preventWindowClose","_ignoreFailedToSuspendError","_pendingScoExitValue","_scoSessionHasEnded","scoHasQuiz","scormSessionHasUnfinishedQuiz","canSuspendScormSession","endScormSession","timeInSecondsAsString","scoSuccessStatusValue","scoCompletionStatusValue","submitScore","suspendSuccess","sessionTimeInMilliseconds","sessionTimeInSeconds","onExitSessionHandler","exitScormSession","onExitSessionConfirmedHandler","onExitSessionWithOutProgressConfirmed","tryAndTerminateSessionOnPageUnloadIfNeeded","currentScore","allQuestionsAnswered","scoreNeededToPass","scoreNeededMultiplier","maxPassingScoreValue","lmsPassingScore","apiResult","onbeforeunload","preventPopUpWindowClose","initView","submitVideoWatchedPercentage","initialized","initialPercentageComplete","initialVideoAnalyticsSnapshot","initialQuizModelSnapshot","initialVideoTimeInSeconds","minScoreToPassLesson","minimumScoreToPass","minViewPercentageToCompleteLesson","minimumViewPercentageToCompleteLesson","supportsResumeSession","scormController","quizServiceErrorIds","badDefinition","QuizController$1","_questionGrader","_quizUserDetails","_quizSetupPromise","_resolveQuizSetup","_quizSetupView","_currentView","_retrySubmissionMessageDisplayBar","_quizOutOfDateMessageView","_quizBadDefinitionMessageView","_progressTracker","_numberQuestionSets","_currentQuestionSetIndex","_bottomOffset","_pointAt","_quizEnabled","_quizReady","_mediaIsImage","_lastStatusMessage","_shouldReportViewedOnPageLoad","submitScoreToScormController","userSubmitToLMS","onNetworkRetryEvent","completeQuestionSetEventDispatch","questionSetCompleteHandler","onContinueHandler","createQuestionSetFeedbackView","needOverlay","questionSetView","continueVideoHandler","initQuestionSetFeedback","initFeedbackFromReviewStatusView","hideQuizStatus","onRationaleActionHandler","onCloseQuestionSetView","possibleCorrect","numberUngradable","createQuestionSetReviewStatusView","numberIncorrectText","percentIncorrectText","numberIncorrect","updateViewBottom","createReviewAnswersConfirmationView","submitResults","ioMessage","gradeResults","onGradingComplete","apiErrorEventHandler","createQuestionSetView","reviewHandler","confirmHandler","destroyQuizSetupView","beginQuizHandler","skipQuizHandler","createSetupView","startQuizApiInstance","errorID","responseJSON","errorId","displaySetupView","removeSubmissionRetryMessage","showSubmissionRetryMessage","showQuizIsOutOfDateMessage","reload","showQuizBadDefinitionMessage","setQuestionGrader","grader","forceProgressUpdate","segmentsCompleted","onMediaFirstPlayerHandler","onMediaControlsReady","setQuizModel","newQuizModel","resolveQuizSetup","hasMultipleQuestionSets","getLastStatusMessage","displayNextQuestionSet","findQuestionSet","activeQuestionSetId","numberMarkers","findPrevMarkerTimeForMarker","updatePercentWatchedForQuestionSet","percentWatched","displayConfirm","createConfirmView","showQuiz","hideQuiz","pointViewAt","startTrackingProgress","populateQuizModel","suspendedQuizData","quizIsSetupPromise","quizReady","viewIsOpen","hasQuizQuestions","QuizEventController$1","ioOverlayView","_lastQuestionSetId","_lastQuestionSetMarkerTime","_quizzingErrorMessageBarView","updateQuizPointAtPosition","playerXOffset","pointAtXPosition","seekToTime","safeSeekTime","updateQuizzing","intervalId","quizEventHandler","prevMarkerTimeInSeconds","displayMessage","jumpToTimeInSeconds","lastStatusMessage","onVideoControlsVisible","MediaAnalyticsController$1","_eventPlayTracking","_eventLastPercentReported","initVideoAnalytics","resumeSCORMSession","handleTimeUpdate","percent_viewed","updateAnalytics","onCanPlayVideo","eventAction","loading_duration","resetPlayStartAnalytics","videoStartedEventAction","onMediaEnd","finished_action","onMediaWrapperMediaEnd","onOpenExternalLink","onClickExternalLink","onStartedPlayback","quizRequiresAnalytics","playerConfigurationRequiresAnalytics","onPlayerInitialized","canplay","metadataReady","canPlayReady","PluginEventsController$1","_$mediaPluginContainer","onMediaPluginContainerKeyHandler","onMediaPluginContainerMouseHandler","initMediaPlugins","onPluginAdded","MediaSessionController$1","mediaPosterImageSrc","_navigatorRef","_mediaSessionRef","mediaSession","setActionHandler","MediaMetadata","_metaDataSet","setMetaData","artwork","updateMediaSessionState","playbackState","setPositionState","onPlayAction","onPauseAction","onSeekToAction","MediaExtensionsController$1","responsiveController","_hotspotController","_tableOfContentsController","_audioDescriptionController","_endActionsController","_quizController","_quizEventController","_mediaAnalyticsController","_pluginEventsController","_mediaSessionController","hasAnEnabledQuiz","setupVideoControllers","disableHighlightOnMouseDown","TabController$1","$defaultFirstTabEnabledElement","$defaultLastTabEnabledElement","_defaultFirstTabEnabledElement","_defaultLastTabEnabledElement","_firstTabEnabledElement","_lastTabEnabledElement","_playerInFullScreenMode","unbindEventsToTabEnabledElement","setFirstTabEnabledElement","firstTabEnabledElement","setLastTabEnabledElement","initController","ExternalEventsController$1","playerViewEventCallbacks","onTheaterModeChanged","newDisplayMode","onVideoError","onPlayingEvent","onStartedPlaybackHandler","triggerQuizVisible","triggerQuizHidden","triggerQuizPromptVisible","triggerQuizPromptHidden","processCaptionChanged","processCaptionToggled","externalCaptionEvent","onCaptionsReadyHandler","triggerPlayerSettingsOpen","triggerPlayerSettingsClose","triggerVideoControlsHidden","triggerVideoControlsVisible","triggerExternalPlayerResize","triggerHeroControlHidden","triggerImagePointerOver","triggerImagePointerLeave","playing","PlayerState$1","_oneOrMoreHotspotsWithTimeActionArePaused","_videoHasQuizQuestions","_pausedForQuiz","videoHasQuizQuestions","IoOverlayView$1","_$ioContainer","_$ioMessage","_$ioImg","shouldHideLoadingGraphic","setViewMessage","SmartPlayerView$1","playerInstanceUUID","xmpInErrorState","_viewHasBeenInitialized","_mediaExtensionsController","_tabController","_externalEventsController","_scormErrorMessageBarView","_$playerPluginContainer","_mediaElementUniqueID","_viewInitializedPromise","_playerViewEventCallbacks","_queuedMediaBinds","_mediaView","_ioOverlayView","_videoControlsController","_videoControlsDisplayModeController","_controlsReady","_mediaExtensionsReady","_mediaHasBeenLoaded","_playerState","_$mediaContainer","_$playerLayoutControlsContainer","eventCategorySuffix","categorySuffix","rum","externalEventIsSupported","eventKey","onHideLoadingMessage","loadMediaWhenComponentsAreReady","onControlsReady","onMediaExtensionsReady","onFailedToFindSCORMApi","startViewPortObserver","onImagePointerOver","onImagePointerLeave","isScrubbingVideo","progressBarDisplayWidth","currentDisplayMode","smartPlayerPreRollEventConstants","PRE_ROLL_STARTED","PRE_ROLL_FINISHED","PRE_ROLL_FINISHED_ACTIONS","REMOVE_NOW","preRollView","$window","preRollMessage","destroyView","onIFrameContentLoaded","preRollController","onPreRollStartedCallback","viewExists","_$spElement","setTheme$1","applyTheme","getClassNameForTheme","themeClassNameAsString","currentThemeClassName","themeController","externalVideoEventIsSupported","_$rootSmartPlayerElement","_responsiveController","_currentPlayerType","_captionService","_smartPlayerView","_viewCreated","_viewInitialized","_queuedExternalConfiguration","_playerInstanceUUID","_xmpInErrorState","mediaListError","onPreRollStart","continueInit","currentInstanceUUID","mediaListReady","playbackInitiatedHandler","processMediaAssets","initIntrinsicSizingFromImageUrl","imgUrl","img","TSC","embedded_config_xml","setupPlayer","captionChangeHandler","initPlayerView","displayLocalWarning","addEventListener$1","playMedia","queueEventHandler","setCurrentTime","mediaPlayer","rootElementID","$parentNode","getSmartPlayerRootElement","getVersion","jsSeekTime","jsPlay","getCurrentSrc","getEnded","getPaused","getPlaybackRate","getBuffered","getPlayed","getSeekable","getSeeking","getVolume","getMuted","isScrubbing","dequeueEventHandler","triggerEvent","isVisible","getIsYouTube","getTocChapters","getProgressBarDisplayWidth","getCurrentDisplayMode","Plugin$1","pluginName","_initializedPromiseResolve","_initializedPromise","_pluginName","_viewElementType","pluginContainerElement","REMOVE_SPACES_REGEX","PluginController$1","_plugins","isViewElementTypeSupported","registerPlugin","pluginSameNameMessage","pluginUnsupportedViewElementMessage","plugin","$viewElementPluginContainer","elementTypePlugins","getPluginsForViewElementType","pluginNameNoSpaces","pluginNamedContainerClassName","getPluginContainerElement","CamtasiaQuizPreviewView$1","xmpString","previewElement","packageJson","timeCodeRegex","newlineRegex","defaultChapterName","chapterParams","parseTableOfContentsItemFromString","lineString","timecodes","getChapterNameFromLineString","chapterStartTime","_started","_controls","_authInfo","_lastError","_pluginController","generalErrorHandler","mediaInterfaceController","addSrc","$spElement","pluginInitPromise","displayQuizPreview","containerElement","displayImageFullscreen","exitImageFullscreen","createTocFromDescription","descriptionText","tocModel","textString","textSplitNewlines","chapterItems","previousTocItemStartTime","textLine","textToTocModel","decodeURIComponent","lowerCaseValue","tocSrc","tocChapters","prerollSrc","captionsVisible","ignoreStoredCaptionVisible","isYouTube","authInfo","contextMenu","isIphoneOrIpod","singleClickControlEnabled","doubleClickControlEnabled","progressBarWidth","environment","deprecatedName"],"sourceRoot":""}