{"version":3,"file":"919.js","mappings":"0JAkBe,MAAMA,UAAuB,IACxC,WAAAC,CAAYC,GACRC,MAAMD,GAEN,IAAIE,GADJF,EAAOA,GAAQ,CAAC,GACAE,KAChBC,KAAKC,SAAWF,EAChBC,KAAKE,qBAAuBL,EAAKK,qBACjCF,KAAKG,iBAAkB,EACvBH,KAAKI,MAAQL,EAAKM,IAC+B,IAA7CC,EAAEN,KAAKC,UAAUM,KAAK,qBACtBP,KAAKG,iBAAkB,GAE3BH,KAAKQ,SAAWR,KAAKC,SAASQ,WAC9BT,KAAKU,QAAS,EACVJ,EAAEN,KAAKC,UAAUU,GAAG,mBACpBX,KAAKU,QAAS,GAElBV,KAAKY,QAAU,KACfZ,KAAKa,WAAa,GAClBb,KAAKc,YAAc,GACnBd,KAAKe,iBAAmB,GACxBf,KAAKgB,aAAe,GACpBhB,KAAKiB,SAAW,KAChBjB,KAAKkB,QAAU,kBACflB,KAAKmB,cACLnB,KAAKoB,eACLpB,KAAKqB,gBACLrB,KAAKsB,oBACLtB,KAAKuB,eACLvB,KAAKwB,WAAW,aAChBxB,KAAKyB,YAAY,WAAW,GAI5BzB,KAAK0B,aAAa1B,KAAK2B,cACF,oBAAVC,OACPA,MAAMC,kBAAkB7B,KAAK2B,aAErC,CAMA,YAAAP,GAEI,IADA,IAAIU,EACKC,EAAI,EAAGA,EAAI/B,KAAKC,SAASQ,WAAWuB,OAAQD,IACjD,GAA6C,OAAzC/B,KAAKC,SAASQ,WAAWsB,GAAGE,SAAmB,CAC/CH,EAAY9B,KAAKC,SAASQ,WAAWsB,GAAGG,UACxC,KACJ,CAEJ,IACIC,EADW7B,EAAEN,KAAKC,UAAUmC,OACZC,MAAMP,GAC1B9B,KAAKiB,SAAWkB,EAAK,EACzB,CAEA,WAAAhB,GAII,IADA,IAAImB,EAAkB,GACbP,EAAI,EAAGA,EAAI/B,KAAKQ,SAASwB,OAAQD,IAClCzB,EAAEN,KAAKQ,SAASuB,IAAIpB,GAAG,4BACvB2B,EAAgBC,KAAKvC,KAAKQ,SAASuB,IAG3C,IAAK,IAAIS,EAAI,EAAGA,EAAIF,EAAgBN,OAAQQ,IAAK,CAC7C,IAAIC,EAAYnC,EAAEgC,EAAgBE,IAAIE,KAAK,MACvCC,GAAa,EACbrC,EAAEgC,EAAgBE,IAAI7B,GAAG,oBAEzBgC,GAAa,GAEjB,IACIC,EAAgB,CAChBvC,GAAIoC,EACJ7B,QAAS+B,EACTE,QAJcvC,EAAEgC,EAAgBE,IAAIJ,QAMxCpC,KAAKa,WAAW0B,KAAKK,EACzB,CACJ,CAEA,aAAAvB,GACI,IAAK,IAAIU,EAAI,EAAGA,EAAI/B,KAAKQ,SAASwB,OAAQD,IAClCzB,EAAEN,KAAKQ,SAASuB,IAAIpB,GAAG,8BACvBX,KAAKgB,aAAauB,KAAKvC,KAAKQ,SAASuB,GAAGe,UAGpD,CAEA,iBAAAxB,GAGI,IAAK,IAAIS,EAAI,EAAGA,EAAI/B,KAAKa,WAAWmB,OAAQD,IACpC/B,KAAKa,WAAWkB,GAAGnB,UACnBZ,KAAKc,YAAYyB,KAAKvC,KAAKa,WAAWkB,GAAG1B,IACzCL,KAAKe,iBAAiBwB,KAAKR,GAGvC,CAKA,YAAAR,GACIvB,KAAK+C,oBACL/C,KAAKgD,eACLhD,KAAKiD,sBAEL3C,EAAEN,KAAKC,UAAUiD,YAAYlD,KAAK2B,aACtC,CAEA,iBAAAoB,GACI/C,KAAK2B,aAAewB,SAASC,cAAc,OAC3C9C,EAAEN,KAAK2B,cAAcS,KAAKpC,KAAKiB,UAC/BX,EAAEN,KAAK2B,cAAc0B,SAASrD,KAAKC,SAASqD,aAAa,UACzDtD,KAAK2B,aAAatB,GAAKL,KAAKI,KAChC,CAEA,YAAA4C,GACIhD,KAAKuD,SAAWJ,SAASC,cAAc,QACvCpD,KAAKuD,SAASlD,GAAKL,KAAKI,MAAQ,QAChCE,EAAEN,KAAKuD,UAAUb,KAAK,CAClBc,OAAQ,MACRC,OAAQ,GACRC,SAAU,kBAGd1D,KAAK2D,aAAeR,SAASC,cAAc,YAC3CpD,KAAKuD,SAASK,YAAY5D,KAAK2D,cAE/B3D,KAAK6D,mBACL7D,KAAK8D,sBAEL,IAAIC,EAASZ,SAASC,cAAc,UAChCpD,KAAKG,gBACL4D,EAAOC,YAAc,wBAErBD,EAAOC,YAAc,aAEzBhE,KAAK2D,aAAaC,YAAYG,GAC9B/D,KAAK2B,aAAaiC,YAAY5D,KAAKuD,SACvC,CAEA,gBAAAM,GAEI7D,KAAKiE,YAAc,GACnB,IAAIC,EAAa,QACblE,KAAKG,kBACL+D,EAAa,YAIjBlE,KAAKmE,WAAa,GAClB,IAAK,IAAIpC,EAAI,EAAGA,EAAI/B,KAAKa,WAAWmB,OAAQD,IACxC/B,KAAKmE,WAAW5B,KAAKR,GAErB/B,KAAKU,QACLV,KAAKoE,mBAET,IAAIC,EAAOrE,KACPsE,EAAa,WACbD,EAAKE,YAAa,CACtB,EACA,IAAK,IAAI/B,EAAI,EAAGA,EAAIxC,KAAKa,WAAWmB,OAAQQ,IAAK,CAC7C,IAAIgC,EAAIxE,KAAKmE,WAAW3B,GACpBiC,EAAQzE,KAAKI,MAAQ,QAAUoE,EAE/BE,EAAQvB,SAASC,cAAc,SAE/BP,EAAU7C,KAAKa,WAAW2D,GAAG3B,QAC7B8B,EAAS,GACT9B,EAAQ+B,WAAW,SACnBD,EAAS,MACT9B,EAAUA,EAAQgC,MAAM,IAE5BvE,EAAEoE,GAAOtC,KACL,GAAGuC,iBAAsBT,0BAAmCM,QAAQC,KAASK,OAAOC,aAChF,IAAIC,WAAW,GAAKxC,OAClBK,KAGV,IAAIoC,EAAS,CACTC,MAAO5E,EAAEoE,GAAOS,KAAK,SAAS,GAC9BT,MAAOA,GAEXO,EAAOC,MAAME,QAAUd,EAEvBtE,KAAKiE,YAAY1B,KAAK0C,GAEtBjF,KAAK2D,aAAaC,YAAYc,GAC9B1E,KAAK2D,aAAaC,YAAYT,SAASC,cAAc,MACzD,CACJ,CAEA,mBAAAU,GAGI9D,KAAKqF,aAAelC,SAASC,cAAc,UAC3CpD,KAAKqF,aAAarB,YAAc,WAChC1D,EAAEN,KAAKqF,cAAc3C,KAAK,CACtB4C,MAAO,kBACPC,KAAM,YACNC,KAAM,WAENxF,KAAKG,gBACLH,KAAKqF,aAAaI,iBACd,QACA,WACIzF,KAAK0F,uBAAsB,EAC/B,EAAEC,KAAK3F,OACP,GAGJA,KAAKqF,aAAaI,iBACd,QACA,SAAUG,GACNA,EAAGC,iBACH7F,KAAK8F,uBAAsB,EAC/B,EAAEH,KAAK3F,OACP,GAGRA,KAAKuD,SAASK,YAAY5D,KAAKqF,cAE3BrF,KAAKE,uBAAyB6F,YAAYC,OAC1ChG,KAAKiG,cAAgB9C,SAASC,cAAc,UAC5C9C,EAAEN,KAAKiG,eAAevD,KAAK,CACvB4C,MAAO,kBACPjF,GAAIL,KAAKI,MAAQ,SACjB8F,SAAU,GACVX,KAAM,YAEVvF,KAAKiG,cAAcjC,YAAc,aACjChE,KAAKiG,cAAcR,iBACf,QACA,WACIzF,KAAKmG,eAAenG,KAAKI,MAC7B,EAAEuF,KAAK3F,OACP,GAEJA,KAAKuD,SAASK,YAAY5D,KAAKiG,eAEvC,CAEA,mBAAAhD,GACIjD,KAAKoG,YAAcjD,SAASC,cAAc,OAC1CpD,KAAKoG,YAAY/F,GAAKL,KAAKI,MAAQ,YACnCJ,KAAKoG,YAAYC,aAAa,YAAa,UAC3CrG,KAAKoG,YAAYC,aAAa,OAAQ,UACtCrG,KAAK2B,aAAaiC,YAAYT,SAASC,cAAc,OACrDpD,KAAK2B,aAAaiC,YAAY5D,KAAKoG,YACvC,CAEA,gBAAAhC,GAMI,IAJA,IACIkC,EACAC,EAFAC,EAAexG,KAAKmE,WAAWnC,OAIX,IAAjBwE,GAAoB,CAEvBD,EAAcE,KAAKC,MAAMD,KAAK/F,SAAW8F,GACzCA,GAAgB,EAEhBF,EAAiBtG,KAAKmE,WAAWqC,GACjCxG,KAAKmE,WAAWqC,GAAgBxG,KAAKmE,WAAWoC,GAChDvG,KAAKmE,WAAWoC,GAAeD,EAC/B,IAAIK,EAAoB3G,KAAKgB,aAAawF,GAC1CxG,KAAKgB,aAAawF,GAAgBxG,KAAKgB,aAAauF,GACpDvG,KAAKgB,aAAauF,GAAeI,CACrC,CACJ,CAKA,cAAAC,CAAerG,GAGNA,EAAKsG,SACNtG,EAAKsG,OAAS,IAGlB,IADA,IAAIC,EAAUvG,EAAKsG,OAAOxE,MAAM,KACvB0E,EAAI,EAAGA,EAAID,EAAQ9E,OAAQ+E,IAEhC,IADA,IAAIC,EAAQF,EAAQC,GACXE,EAAI,EAAGA,EAAIjH,KAAKiE,YAAYjC,OAAQiF,IACrCjH,KAAKiE,YAAYgD,GAAG/B,MAAMgC,OAASF,GACnC1G,EAAEN,KAAKiE,YAAYgD,GAAG/B,OAAOxC,KAAK,UAAW,QAIrD1C,KAAKG,gBACLH,KAAK0F,uBAAsB,GAE3B1F,KAAK8F,uBAAsB,EAEnC,CAEA,iBAAAqB,GAGI,IACIL,EACJ,IAAI9G,KAAKoH,cAGCC,aAAarF,OACb,EAAG,CACT,IAAIsF,EAAKD,aAAaE,QAAQvH,KAAKwH,mBACnC,GAAW,OAAPF,EAAa,CACb,IAEIR,EADaW,KAAKC,MAAMJ,GACHT,OAAOxE,MAAM,IACtC,CAAE,MAAOsF,GAIL,OAFAC,QAAQC,IAAIF,EAAIG,cAChBT,aAAaU,WAAW/H,KAAKwH,kBAEjC,CACA,IAAK,IAAIT,EAAI,EAAGA,EAAID,EAAQ9E,OAAQ+E,IAEhC,IADA,IAAIC,EAAQF,EAAQC,GACXE,EAAI,EAAGA,EAAIjH,KAAKiE,YAAYjC,OAAQiF,IACrCjH,KAAKiE,YAAYgD,GAAG/B,MAAMgC,OAASF,GACnC1G,EAAEN,KAAKiE,YAAYgD,GAAG/B,OAAOxC,KACzB,UACA,QAKZ1C,KAAKE,uBACLF,KAAKgI,qBACLhI,KAAKiI,mBACDjI,KAAKG,gBACLH,KAAKkI,oBAELlI,KAAKmI,oBAGjB,CACJ,CACJ,CAEA,eAAAC,CAAgB7H,GACZ,IAAI8H,EAAY,IAAIC,KAChBC,EAAa,CACb1B,OAAQtG,EAAKsG,OACb2B,UAAWH,EACXzH,QAASL,EAAKK,SAElByG,aAAaoB,QACTzI,KAAKwH,kBACLC,KAAKiB,UAAUH,GAEvB,CAKA,qBAAA7C,CAAsBiD,GAElB3I,KAAKiI,mBACLjI,KAAK4I,sBACL5I,KAAKoI,gBAAgB,CACjBxH,QAASZ,KAAKY,QAAU,IAAM,IAC9BiG,OAAQ7G,KAAK6I,WAAWC,KAAK,OAE7BH,GACA3I,KAAKkI,qBAEJnC,YAAYC,MAAQD,YAAYgD,cACjC/I,KAAKgJ,qBACDhJ,KAAKE,sBACLF,KAAKgI,sBAILjC,YAAYC,MACa,UAAzBD,YAAYkD,UACgB,oBAArBC,kBACPA,iBAAmB,EACnBlJ,KAAKgJ,sBAEL1I,EAAEN,KAAKoG,aAAahE,KAAK,wCACzB9B,EAAEN,KAAKoG,aAAa1D,KAAK,QAAS,oBAG9C,CAEA,gBAAAuF,GACI,IAAIkB,EACJnJ,KAAKoJ,eAAiB,GACtBpJ,KAAKqJ,eAAiB,GACtBrJ,KAAK6I,WAAa,GAClB7I,KAAKsJ,SAAW,GAEhB,IADA,IAAIC,EAAavJ,KAAKuD,SAASiG,SAASC,OAC/B1H,EAAI,EAAGA,EAAIwH,EAAWvH,OAAQD,IAC/BwH,EAAWxH,GAAG2H,UACdP,EAAQI,EAAWxH,GAAGmF,MACtBlH,KAAK6I,WAAWtG,KAAK4G,GACrBnJ,KAAKqJ,gBAAkB,cAActH,EAAI,MAAM/B,KAAKgB,aAAae,UAEjE/B,KAAKsJ,UAAYH,EAAQ,IACzBnJ,KAAKoJ,eAAiBpJ,KAAKgB,aAAae,IAGhD/B,KAAK6I,WAAWc,MACpB,CAEA,kBAAAC,GACI5J,KAAKiI,mBACDjI,KAAKG,gBACLH,KAAK4I,sBAEL5I,KAAK6J,qBAEb,CAEA,sBAAMC,CAAiBC,GACf/J,KAAKG,sBACCH,KAAKkI,kBAAkB6B,SAEvB/J,KAAKmI,kBAAkB4B,EAErC,CAEA,cAAAC,GACQhK,KAAKG,gBACLH,KAAKgJ,qBAELhJ,KAAKiK,oBAEb,CACA,mBAAArB,GACI5I,KAAKkK,aAAe,EAGpB,IAFA,IAAIC,EAAe,EACfC,EAAa,EAEbD,EAAenK,KAAKe,iBAAiBiB,QACrCoI,EAAapK,KAAK6I,WAAW7G,QAGzBhC,KAAK6I,WAAWuB,GAChBpK,KAAKe,iBAAiBoJ,GAEtBC,IAEApK,KAAK6I,WAAWuB,IAChBpK,KAAKe,iBAAiBoJ,IAEtBnK,KAAKkK,eACLE,IACAD,KAEAA,IAGR,IAAIE,EAAWrK,KAAK6I,WAAW7G,OAC3BsI,EAAatK,KAAKkK,aAClBK,EAAYvK,KAAKc,YAAYkB,OACjChC,KAAK6G,OAAS7G,KAAK6I,WAAWC,KAAK,KACnC9I,KAAKY,QAAU0J,IAAeC,GAAaA,IAAcF,EAErDrK,KAAKwK,QADLH,IAAaE,EACED,EAAaC,EAEbD,EAAa7D,KAAKgE,IAAIJ,EAAUE,EAEvD,CAEA,uBAAMrC,CAAkB6B,GACpB,IAAIlD,EAAS7G,KAAK6G,QAAU,GACxBjG,EAAUZ,KAAKY,SAAW,IAG9B,IAAIL,EAAO,CACPmK,MAAO,UACPC,IAHA,UAAY9D,EAAS,KAAkB,KAAXjG,EAAiB,UAAY,MAIzDiG,OAAQA,EACRjG,QAASA,EACTgK,OAAQ5K,KAAKI,OAEb2F,YAAYC,MAAoC,oBAArBkD,mBAC3B3I,EAAKoK,IAAMpK,EAAKoK,IAAM,QAAQzB,yBAEf,IAARa,IACPxJ,EAAKwJ,IAAMA,SAET/J,KAAK6K,aAAatK,EAC5B,CAEA,kBAAAyI,GACI,IAAI8B,EAAY,UACZT,EAAWrK,KAAK6I,WAAW7G,OACd,IAAbqI,IACAS,EAAY,UAEhB,IAAIR,EAAatK,KAAKkK,aAClBK,EAAYvK,KAAKc,YAAYkB,OAC7B+I,EAAe/K,KAAKqJ,eACpBrJ,KAAKY,SACLN,EAAEN,KAAKoG,aAAahE,KAAK,mBAAmB2I,UAC5CzK,EAAEN,KAAKoG,aAAa1D,KAAK,QAAS,sBAElCpC,EAAEN,KAAKoG,aAAahE,KAChB,eAAeiI,KAAYS,aAAqBR,gBAAyBC,yBAAiCQ,UAE9GzK,EAAEN,KAAKoG,aAAa1D,KAAK,QAAS,sBAE1C,CAEA,qBAAAoD,CAAsB6C,GAElB3I,KAAKiI,mBACLjI,KAAK6J,sBACL7J,KAAKoI,gBAAgB,CACjBxH,QAASZ,KAAKY,QAAU,IAAM,IAC9BiG,OAAQ7G,KAAK6I,WAAWC,KAAK,OAE7BH,GACA3I,KAAKmI,qBAEJpC,YAAYC,MAAQD,YAAYgD,cACjC/I,KAAKiK,qBACDjK,KAAKE,sBACLF,KAAKgI,sBAGLjC,YAAYC,MACa,UAAzBD,YAAYkD,UACgB,oBAArBC,kBACPA,iBAAmB,EACnBlJ,KAAKgJ,sBAEL1I,EAAEN,KAAKoG,aAAahE,KAAK,wCACzB9B,EAAEN,KAAKoG,aAAa1D,KAAK,QAAS,oBAG9C,CAEA,mBAAAmH,GACI7J,KAAK6G,OAAS7G,KAAK6I,WAAW,GAC1B7I,KAAK6I,WAAW,IAAM7I,KAAKe,iBAAiB,IAC5Cf,KAAKY,SAAU,EACfZ,KAAKwK,QAAU,GACc,MAAtBxK,KAAK6I,WAAW,KAEvB7I,KAAKY,SAAU,EACfZ,KAAKwK,QAAU,EAEvB,CAEA,uBAAMrC,CAAkB4B,GAEpB,IAAIlD,EAAS7G,KAAK6I,WAAW,IAAM,GAC/BjI,EACAZ,KAAK6I,WAAW,IAAM7I,KAAKe,iBAAiB,GAAK,IAAM,IAG3D,IAAIR,EAAO,CACPmK,MAAO,UACPC,IAHA,UAAY9D,EAAS,KAAkB,KAAXjG,EAAiB,UAAY,MAIzDiG,OAAQA,EACRjG,QAASA,EACTgK,OAAQ5K,KAAKI,OAEb2F,YAAYC,MAAoC,oBAArBkD,mBAC3B3I,EAAKoK,IAAMpK,EAAKoK,IAAM,QAAQzB,yBAEf,IAARa,IACPxJ,EAAKwJ,IAAMA,SAET/J,KAAK6K,aAAatK,EAC5B,CAEA,kBAAA0J,GACI,IAAIrJ,EAAUZ,KAAK6I,WAAW,IAAM7I,KAAKe,iBAAiB,GACtDgK,EAAe/K,KAAKoJ,eAEpBxI,GACAN,EAAEN,KAAKoG,aAAahE,KAAK,MAAQ2I,GACjCzK,EAAEN,KAAKoG,aAAa1D,KAAK,QAAS,sBAEd,MAAhBqI,IACAA,EAAe,IAEnBzK,EAAEN,KAAKoG,aAAahE,KAAK,MAAQ2I,GACjCzK,EAAEN,KAAKoG,aAAa1D,KAAK,QAAS,sBAE1C,CACA,kBAAAsF,GACQjC,YAAYiF,kBACZhL,KAAKiG,cAAcC,UAAW,EAEtC,CACA,sBAAA+E,CAAuB1K,GAInB,IAAI2K,EAAM,qDACV,IAAK,IAAInJ,KAAKxB,EACV2K,GACI,WACA3K,EAAKwB,GAAG,GACR,YACAxB,EAAKwB,GAAG,GACR,aAGR,OADAmJ,EAAO,UAEX,CACA,YAAAC,CAAa5K,EAAM6K,EAAQC,GACvB,IAAIC,EAAW/K,EAAKgL,OAChBzE,EAAUwE,EAASE,WACnBC,EAAOH,EAASG,KAChBC,EAAKC,OAAOC,KAAK9E,GAAS6C,OAC1BkC,EAAO,UACXA,GAAQ,2CACR,IAAIC,EAAW,GACf,IAAK,IAAItH,KAAKkH,EAAI,CAEVI,EADAJ,EAAGlH,KAAOiH,EAAK7K,QACJ,UAEA,OAEfiL,GACI,WAAaH,EAAGlH,GAAK,wCACzB,IAAIuH,EAAMjF,EAAQ4E,EAAGlH,IAAM,IAC3BqH,GAAQ,yBACRA,GACI,6CACAC,EACA,kBACAC,EACA,MACAA,EACJF,GAAQ,aACRA,GAAQ,kBACZ,CACAA,GAAQ,WACa,gBAAjBJ,EAAKO,UACLH,GACI,qBACAJ,EAAKO,QACL,wCAEiBC,IAArBX,EAASY,UACTL,GAAQ7L,KAAKiL,uBAAuBK,EAASY,UAgBxC5L,EAbL,sXAQAuL,EARA,oDAcDM,OACP,CAEA,cAAAhG,GACI,IAAI5F,EAAO,CAAC,EACZA,EAAKqK,OAAS5K,KAAKI,MACnBG,EAAK6L,YAAcrG,YAAYsG,OAC/BC,OAAOC,IACH,GAAGxG,YAAYyG,mDACfjM,EACAP,KAAKmL,aAAaxF,KAAK3F,MAE/B,CAEA,kBAAAyM,GACI,IAAK,IAAI1K,EAAI,EAAGA,EAAI/B,KAAKiE,YAAYjC,OAAQD,IACzC/B,KAAKiE,YAAYlC,GAAGmD,MAAMgB,UAAW,CAE7C,CAEA,iBAAAwG,GACI,IAAK,IAAI3K,EAAI,EAAGA,EAAI/B,KAAKiE,YAAYjC,OAAQD,IACzC/B,KAAKiE,YAAYlC,GAAGmD,MAAMgB,UAAW,CAE7C,EAOJ5F,EAAE6C,UAAUwJ,GAAG,4BAA4B,WACvCrM,EAAE,mCAAmCsM,MAAK,SAAU5F,GAEhD,IAAInH,EAAO,CACPE,KAAMC,KACNE,qBAAsB6F,YAAY7F,sBAE4B,GAA9DI,EAAEN,MAAM6M,QAAQ,oCAAoC7K,SAEpD8K,OAAOC,aAAa/M,KAAKK,IAAM,IAAIV,EAAeE,GAE1D,GACJ,ICptBe,MAAMmN,UAAgBrN,EACjC,WAAAC,CAAYC,GACRC,MAAMD,GACNS,EAAEN,KAAK2B,cAAc0B,SAAS,aAC9BrD,KAAKiN,uBAAwB,EAC7BjN,KAAKkN,gBAAgBlN,KAAKmN,aAC1BnN,KAAKoN,aACT,CAEA,eAAAF,CAAgBG,GAGZ,IAAIC,EAAcnK,SAASC,cAAc,OACrCmK,EAAWpK,SAASC,cAAc,OACtC9C,EAAEiN,GAAU7K,KAAK,CACb8K,IAAK,uBACLC,MAAO,2BAEXH,EAAYI,UAAY,UACxBJ,EAAYK,MAAQ,GACpBL,EAAY1J,YAAY2J,GACxBjN,EAAE+M,GAAWO,QAAQN,EACzB,CACA,WAAAF,GAGI9M,EAAEN,KAAKqF,cAAc3C,KAAK,WAAY,QACtCpC,EAAEN,KAAKqF,cAAcwI,OACrBvN,EAAEN,KAAKiG,eAAe4H,MAC1B,CAIA,kBAAA7E,GACIhJ,KAAK8N,iBACT,CACA,kBAAA7D,CAAmBoB,EAAU0C,GACzB/N,KAAK8N,iBACT,CACA,eAAAA,GACI,IAAK,IAAI/L,EAAI,EAAGA,EAAI/B,KAAKmE,WAAWnC,OAAQD,IAAK,CAC7C,IAAIiM,EAAWhO,KAAKmE,WAAWpC,GAC/BzB,EAAEN,KAAKiO,kBAAkBlM,IAAIK,KACzB0C,OAAOC,aAAa,GAAKhD,GAAK,KAAO/B,KAAKgB,aAAae,IAE3D,IAAImM,EAAQlO,KAAKa,WAAWmN,GAAU3N,GAClCL,KAAKc,YAAYqN,QAAQD,IAAU,EACnClO,KAAKiO,kBAAkBlM,GAAGqM,UAAUC,IAChC,QACA,iBAGJrO,KAAKiO,kBAAkBlM,GAAGqM,UAAUC,IAChC,QACA,eAGZ,CACJ,CACA,gBAAAxK,GACI/D,MAAM+D,mBACN7D,KAAKiO,kBAAoB,GACzB,IAAK,IAAIzL,EAAI,EAAGA,EAAIxC,KAAKa,WAAWmB,OAAQQ,IAAK,CAC7C,IAAIgC,EAAIxE,KAAKmE,WAAW3B,GACpB8L,EAAenL,SAASC,cAAc,OAC1CkL,EAAajO,GAAKL,KAAKI,MAAQ,iBAAmBoE,EAClD8J,EAAaF,UAAUC,IAAI,gBAC3BrO,KAAKiO,kBAAkB1L,KAAK+L,GAC5BtO,KAAKuD,SAASK,YAAY0K,EAC9B,CACJ,CACA,qBAAAC,GAYI,OAVIvO,KAAKkK,eAAiBlK,KAAKc,YAAYkB,QACvChC,KAAKc,YAAYkB,SAAWhC,KAAK6I,WAAW7G,OAE5ChC,KAAKY,SAAU,EACmB,IAA3BZ,KAAK6I,WAAW7G,OACvBhC,KAAKY,SAAU,EAGfZ,KAAKY,QAAU,KAEXZ,KAAKY,SACT,KAAK,EACD,MAAO,IACX,KAAK,EACD,MAAO,IACX,QACI,OAAO,KAEnB,CACA,qBAAA4N,GAEI,OAAQxO,KAAKY,SACT,KAAK,EACD,MAAO,IACX,KAAK,EACD,MAAO,IACX,QACI,OAAO,KAEnB,CACA,iBAAA6N,GACI,OAAIzO,KAAKG,gBACEH,KAAKuO,wBAELvO,KAAKwO,uBAEpB,CACA,YAAAE,GACI,IAAK,IAAI3M,EAAI,EAAGA,EAAI/B,KAAKiO,kBAAkBjM,OAAQD,IAC/CzB,EAAEN,KAAKiO,kBAAkBlM,IAAI8L,MAErC,CAEA,qBAAAc,GACI,IAAItK,EAAOrE,KACPsE,EAAa,WACbD,EAAKE,YAAa,CACtB,EACA,IAAK,IAAIqK,KAAO5O,KAAKiE,YACjB2K,EAAI1J,MAAME,QAAUd,CAE5B,OAGoC,IAA7BwI,OAAO+B,oBACd/B,OAAO+B,kBAAoB,CAAC,GAGhC/B,OAAO+B,kBAAkBC,eAAiB,SAAUjP,GAChD,OAAIA,EAAKkP,MACE,IAAI/B,EAAQnN,GAEZ,IAAIF,EAAeE,EAElC,C","sources":["webpack://WebComponents/./runestone/mchoice/js/mchoice.js","webpack://WebComponents/./runestone/mchoice/js/timedmc.js"],"sourcesContent":["/*==========================================\n========      Master mchoice.js     =========\n============================================\n===  This file contains the JS for the   ===\n=== Runestone multiple choice component. ===\n============================================\n===              Created By              ===\n===           Isaiah Mayerchak           ===\n===                 and                  ===\n===             Kirby Olson              ===\n===                6/4/15                ===\n==========================================*/\n\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\n//import \"./../styles/runestone-custom-sphinx-bootstrap.css\";\nimport \"../css/mchoice.css\";\n\n// MC constructor\nexport default class MultipleChoice extends RunestoneBase {\n    constructor(opts) {\n        super(opts);\n        opts = opts || {};\n        var orig = opts.orig; // entire <ul> element\n        this.origElem = orig;\n        this.useRunestoneServices = opts.useRunestoneServices;\n        this.multipleanswers = false;\n        this.divid = orig.id;\n        if ($(this.origElem).data(\"multipleanswers\") === true) {\n            this.multipleanswers = true;\n        }\n        this.children = this.origElem.childNodes;\n        this.random = false;\n        if ($(this.origElem).is(\"[data-random]\")) {\n            this.random = true;\n        }\n        this.correct = null;\n        this.answerList = [];\n        this.correctList = [];\n        this.correctIndexList = [];\n        this.feedbackList = [];\n        this.question = null;\n        this.caption = \"Multiple Choice\";\n        this.findAnswers();\n        this.findQuestion();\n        this.findFeedbacks();\n        this.createCorrectList();\n        this.createMCForm();\n        this.addCaption(\"runestone\");\n        this.checkServer(\"mChoice\", true);\n        // https://docs.mathjax.org/en/latest/options/startup/startup.html\n        // https://docs.mathjax.org/en/latest/web/configuration.html#startup-action\n        // runestoneMathReady is defined in the preamble for all PTX authored books\n        this.queueMathJax(this.containerDiv);\n        if (typeof Prism !== \"undefined\") {\n            Prism.highlightAllUnder(this.containerDiv);\n        }\n    }\n\n    /*====================================\n    ==== Functions parsing variables  ====\n    ====  out of intermediate HTML    ====\n    ====================================*/\n    findQuestion() {\n        var delimiter;\n        for (var i = 0; i < this.origElem.childNodes.length; i++) {\n            if (this.origElem.childNodes[i].nodeName === \"LI\") {\n                delimiter = this.origElem.childNodes[i].outerHTML;\n                break;\n            }\n        }\n        var fulltext = $(this.origElem).html();\n        var temp = fulltext.split(delimiter);\n        this.question = temp[0];\n    }\n\n    findAnswers() {\n        // Creates answer objects and pushes them to answerList\n        // format: ID, Correct bool, Content (text)\n        var ChildAnswerList = [];\n        for (var i = 0; i < this.children.length; i++) {\n            if ($(this.children[i]).is(\"[data-component=answer]\")) {\n                ChildAnswerList.push(this.children[i]);\n            }\n        }\n        for (var j = 0; j < ChildAnswerList.length; j++) {\n            var answer_id = $(ChildAnswerList[j]).attr(\"id\");\n            var is_correct = false;\n            if ($(ChildAnswerList[j]).is(\"[data-correct]\")) {\n                // If data-correct attribute exists, answer is correct\n                is_correct = true;\n            }\n            var answer_text = $(ChildAnswerList[j]).html();\n            var answer_object = {\n                id: answer_id,\n                correct: is_correct,\n                content: answer_text,\n            };\n            this.answerList.push(answer_object);\n        }\n    }\n\n    findFeedbacks() {\n        for (var i = 0; i < this.children.length; i++) {\n            if ($(this.children[i]).is(\"[data-component=feedback]\")) {\n                this.feedbackList.push(this.children[i].innerHTML);\n            }\n        }\n    }\n\n    createCorrectList() {\n        // Creates array that holds the ID\"s of correct answers\n        // Also populates an array that holds the indeces of correct answers\n        for (var i = 0; i < this.answerList.length; i++) {\n            if (this.answerList[i].correct) {\n                this.correctList.push(this.answerList[i].id);\n                this.correctIndexList.push(i);\n            }\n        }\n    }\n\n    /*===========================================\n    ====   Functions generating final HTML   ====\n    ===========================================*/\n    createMCForm() {\n        this.renderMCContainer();\n        this.renderMCForm(); // renders the form with options and buttons\n        this.renderMCfeedbackDiv();\n        // replaces intermediate HTML with rendered HTML\n        $(this.origElem).replaceWith(this.containerDiv);\n    }\n\n    renderMCContainer() {\n        this.containerDiv = document.createElement(\"div\");\n        $(this.containerDiv).html(this.question);\n        $(this.containerDiv).addClass(this.origElem.getAttribute(\"class\"));\n        this.containerDiv.id = this.divid;\n    }\n\n    renderMCForm() {\n        this.optsForm = document.createElement(\"form\");\n        this.optsForm.id = this.divid + \"_form\";\n        $(this.optsForm).attr({\n            method: \"get\",\n            action: \"\",\n            onsubmit: \"return false;\",\n        });\n        // Add fieldset and legend for accessibility\n        this.optsFieldSet = document.createElement(\"fieldset\")\n        this.optsForm.appendChild(this.optsFieldSet);\n        // generate form options\n        this.renderMCFormOpts();\n        this.renderMCFormButtons();\n        // Append the form to the container\n        let legend = document.createElement(\"legend\");\n        if (this.multipleanswers) {\n            legend.textContent = \"Choose all that apply\";\n        } else {\n            legend.textContent = \"Choose one\";\n        }\n        this.optsFieldSet.appendChild(legend);\n        this.containerDiv.appendChild(this.optsForm);\n    }\n\n    renderMCFormOpts() {\n        // creates input DOM elements\n        this.optionArray = []; // array with an object for each option containing the input and label for that option\n        var input_type = \"radio\";\n        if (this.multipleanswers) {\n            input_type = \"checkbox\";\n        }\n        // this.indexArray is used to index through the answers\n        // it is just 0-n normally, but the order is shuffled if the random option is present\n        this.indexArray = [];\n        for (var i = 0; i < this.answerList.length; i++) {\n            this.indexArray.push(i);\n        }\n        if (this.random) {\n            this.randomizeAnswers();\n        }\n        let self = this;\n        let answerFunc = function () {\n            self.isAnswered = true;\n        };\n        for (var j = 0; j < this.answerList.length; j++) {\n            var k = this.indexArray[j];\n            var optid = this.divid + \"_opt_\" + k;\n            // Create the label for the input\n            var label = document.createElement(\"label\");\n            // If the content begins with a ``<p>``, put the label inside of it. (Sphinx 2.0 puts all content in a ``<p>``, while Sphinx 1.8 doesn't).\n            var content = this.answerList[k].content;\n            var prefix = \"\";\n            if (content.startsWith(\"<p>\")) {\n                prefix = \"<p>\";\n                content = content.slice(3);\n            }\n            $(label).html(\n                `${prefix}<input type=\"${input_type}\" name=\"group1\" value=${k} id=${optid}>${String.fromCharCode(\n                    \"A\".charCodeAt(0) + j\n                )}. ${content}`\n            );\n            // create the object to store in optionArray\n            var optObj = {\n                input: $(label).find(\"input\")[0],\n                label: label,\n            };\n            optObj.input.onclick = answerFunc;\n\n            this.optionArray.push(optObj);\n            // add the option to the form\n            this.optsFieldSet.appendChild(label);\n            this.optsFieldSet.appendChild(document.createElement(\"br\"));\n        }\n    }\n\n    renderMCFormButtons() {\n        // submit and compare me buttons\n        // Create submit button\n        this.submitButton = document.createElement(\"button\");\n        this.submitButton.textContent = \"Check Me\";\n        $(this.submitButton).attr({\n            class: \"btn btn-success\",\n            name: \"do answer\",\n            type: \"button\",\n        });\n        if (this.multipleanswers) {\n            this.submitButton.addEventListener(\n                \"click\",\n                function () {\n                    this.processMCMASubmission(true);\n                }.bind(this),\n                false\n            );\n        } else {\n            this.submitButton.addEventListener(\n                \"click\",\n                function (ev) {\n                    ev.preventDefault();\n                    this.processMCMFSubmission(true);\n                }.bind(this),\n                false\n            );\n        } // end else\n        this.optsForm.appendChild(this.submitButton);\n        // Create compare button\n        if (this.useRunestoneServices && !eBookConfig.peer) {\n            this.compareButton = document.createElement(\"button\");\n            $(this.compareButton).attr({\n                class: \"btn btn-default\",\n                id: this.divid + \"_bcomp\",\n                disabled: \"\",\n                name: \"compare\",\n            });\n            this.compareButton.textContent = \"Compare me\";\n            this.compareButton.addEventListener(\n                \"click\",\n                function () {\n                    this.compareAnswers(this.divid);\n                }.bind(this),\n                false\n            );\n            this.optsForm.appendChild(this.compareButton);\n        }\n    }\n\n    renderMCfeedbackDiv() {\n        this.feedBackDiv = document.createElement(\"div\");\n        this.feedBackDiv.id = this.divid + \"_feedback\";\n        this.feedBackDiv.setAttribute(\"aria-live\", \"polite\");\n        this.feedBackDiv.setAttribute(\"role\", \"status\");\n        this.containerDiv.appendChild(document.createElement(\"br\"));\n        this.containerDiv.appendChild(this.feedBackDiv);\n    }\n\n    randomizeAnswers() {\n        // Makes the ordering of the answer choices random\n        var currentIndex = this.indexArray.length,\n            temporaryValue,\n            randomIndex;\n        // While there remain elements to shuffle...\n        while (currentIndex !== 0) {\n            // Pick a remaining element...\n            randomIndex = Math.floor(Math.random() * currentIndex);\n            currentIndex -= 1;\n            // And swap it with the current element.\n            temporaryValue = this.indexArray[currentIndex];\n            this.indexArray[currentIndex] = this.indexArray[randomIndex];\n            this.indexArray[randomIndex] = temporaryValue;\n            var temporaryFeedback = this.feedbackList[currentIndex];\n            this.feedbackList[currentIndex] = this.feedbackList[randomIndex];\n            this.feedbackList[randomIndex] = temporaryFeedback;\n        }\n    }\n\n    /*===================================\n    === Checking/loading from storage ===\n    ===================================*/\n    restoreAnswers(data) {\n        // Restore answers from storage retrieval done in RunestoneBase\n        // sometimes data.answer can be null\n        if (!data.answer) {\n            data.answer = \"\";\n        }\n        var answers = data.answer.split(\",\");\n        for (var a = 0; a < answers.length; a++) {\n            var index = answers[a];\n            for (var b = 0; b < this.optionArray.length; b++) {\n                if (this.optionArray[b].input.value == index) {\n                    $(this.optionArray[b].input).attr(\"checked\", \"true\");\n                }\n            }\n        }\n        if (this.multipleanswers) {\n            this.processMCMASubmission(false);\n        } else {\n            this.processMCMFSubmission(false);\n        }\n    }\n\n    checkLocalStorage() {\n        // Repopulates MCMA questions with a user's previous answers,\n        // which were stored into local storage.\n        var storedData;\n        var answers;\n        if (this.graderactive) {\n            return;\n        }\n        var len = localStorage.length;\n        if (len > 0) {\n            var ex = localStorage.getItem(this.localStorageKey());\n            if (ex !== null) {\n                try {\n                    storedData = JSON.parse(ex);\n                    answers = storedData.answer.split(\",\");\n                } catch (err) {\n                    // error while parsing; likely due to bad value stored in storage\n                    console.log(err.message);\n                    localStorage.removeItem(this.localStorageKey());\n                    return;\n                }\n                for (var a = 0; a < answers.length; a++) {\n                    var index = answers[a];\n                    for (var b = 0; b < this.optionArray.length; b++) {\n                        if (this.optionArray[b].input.value == index) {\n                            $(this.optionArray[b].input).attr(\n                                \"checked\",\n                                \"true\"\n                            );\n                        }\n                    }\n                }\n                if (this.useRunestoneServices) {\n                    this.enableMCComparison();\n                    this.getSubmittedOpts(); // to populate givenlog for logging\n                    if (this.multipleanswers) {\n                        this.logMCMAsubmission();\n                    } else {\n                        this.logMCMFsubmission();\n                    }\n                }\n            }\n        }\n    }\n\n    setLocalStorage(data) {\n        var timeStamp = new Date();\n        var storageObj = {\n            answer: data.answer,\n            timestamp: timeStamp,\n            correct: data.correct,\n        };\n        localStorage.setItem(\n            this.localStorageKey(),\n            JSON.stringify(storageObj)\n        );\n    }\n\n    /*===============================\n    === Processing MC Submissions ===\n    ===============================*/\n    processMCMASubmission(logFlag) {\n        // Called when the submit button is clicked\n        this.getSubmittedOpts(); // make sure this.givenArray is populated\n        this.scoreMCMASubmission();\n        this.setLocalStorage({\n            correct: this.correct ? \"T\" : \"F\",\n            answer: this.givenArray.join(\",\"),\n        });\n        if (logFlag) {\n            this.logMCMAsubmission();\n        }\n        if (!eBookConfig.peer || eBookConfig.isInstructor) {\n            this.renderMCMAFeedBack();\n            if (this.useRunestoneServices) {\n                this.enableMCComparison();\n            }\n        } else {\n            // acknowledge submission\n            if (eBookConfig.peer &&\n                eBookConfig.peerMode === \"async\" &&\n                typeof studentVoteCount !== \"undefined\" &&\n                studentVoteCount > 1) {\n                this.renderMCMAFeedBack();\n            } else {\n                $(this.feedBackDiv).html(\"<p>Your Answer has been recorded</p>\");\n                $(this.feedBackDiv).attr(\"class\", \"alert alert-info\");\n            }\n        }\n    }\n\n    getSubmittedOpts() {\n        var given;\n        this.singlefeedback = \"\"; // Used for MCMF questions\n        this.feedbackString = \"\"; // Used for MCMA questions\n        this.givenArray = [];\n        this.givenlog = \"\";\n        var buttonObjs = this.optsForm.elements.group1;\n        for (var i = 0; i < buttonObjs.length; i++) {\n            if (buttonObjs[i].checked) {\n                given = buttonObjs[i].value;\n                this.givenArray.push(given);\n                this.feedbackString += `<li value=\"${i + 1}\">${this.feedbackList[i]\n                    }</li>`;\n                this.givenlog += given + \",\";\n                this.singlefeedback = this.feedbackList[i];\n            }\n        }\n        this.givenArray.sort();\n    }\n\n    checkCurrentAnswer() {\n        this.getSubmittedOpts();\n        if (this.multipleanswers) {\n            this.scoreMCMASubmission();\n        } else {\n            this.scoreMCMFSubmission();\n        }\n    }\n\n    async logCurrentAnswer(sid) {\n        if (this.multipleanswers) {\n            await this.logMCMAsubmission(sid);\n        } else {\n            await this.logMCMFsubmission(sid);\n        }\n    }\n\n    renderFeedback() {\n        if (this.multipleanswers) {\n            this.renderMCMAFeedBack();\n        } else {\n            this.renderMCMFFeedback();\n        }\n    }\n    scoreMCMASubmission() {\n        this.correctCount = 0;\n        var correctIndex = 0;\n        var givenIndex = 0;\n        while (\n            correctIndex < this.correctIndexList.length &&\n            givenIndex < this.givenArray.length\n        ) {\n            if (\n                this.givenArray[givenIndex] <\n                this.correctIndexList[correctIndex]\n            ) {\n                givenIndex++;\n            } else if (\n                this.givenArray[givenIndex] ==\n                this.correctIndexList[correctIndex]\n            ) {\n                this.correctCount++;\n                givenIndex++;\n                correctIndex++;\n            } else {\n                correctIndex++;\n            }\n        }\n        var numGiven = this.givenArray.length;\n        var numCorrect = this.correctCount;\n        var numNeeded = this.correctList.length;\n        this.answer = this.givenArray.join(\",\");\n        this.correct = numCorrect === numNeeded && numNeeded === numGiven;\n        if (numGiven === numNeeded) {\n            this.percent = numCorrect / numNeeded;\n        } else {\n            this.percent = numCorrect / Math.max(numGiven, numNeeded);\n        }\n    }\n\n    async logMCMAsubmission(sid) {\n        var answer = this.answer || \"\";\n        var correct = this.correct || \"F\";\n        var logAnswer =\n            \"answer:\" + answer + \":\" + (correct == \"T\" ? \"correct\" : \"no\");\n        let data = {\n            event: \"mChoice\",\n            act: logAnswer,\n            answer: answer,\n            correct: correct,\n            div_id: this.divid,\n        };\n        if (eBookConfig.peer && typeof studentVoteCount !== \"undefined\") {\n            data.act = data.act + `:vote${studentVoteCount}`;\n        }\n        if (typeof sid !== \"undefined\") {\n            data.sid = sid;\n        }\n        await this.logBookEvent(data);\n    }\n\n    renderMCMAFeedBack() {\n        var answerStr = \"answers\";\n        var numGiven = this.givenArray.length;\n        if (numGiven === 1) {\n            answerStr = \"answer\";\n        }\n        var numCorrect = this.correctCount;\n        var numNeeded = this.correctList.length;\n        var feedbackText = this.feedbackString;\n        if (this.correct) {\n            $(this.feedBackDiv).html(`✔️ <ol type=\"A\">${feedbackText}</ul>`);\n            $(this.feedBackDiv).attr(\"class\", \"alert alert-info\");\n        } else {\n            $(this.feedBackDiv).html(\n                `✖️ You gave ${numGiven} ${answerStr} and got ${numCorrect} correct of ${numNeeded} needed.<ol type=\"A\">${feedbackText}</ul>`\n            );\n            $(this.feedBackDiv).attr(\"class\", \"alert alert-danger\");\n        }\n    }\n\n    processMCMFSubmission(logFlag) {\n        // Called when the submit button is clicked\n        this.getSubmittedOpts(); // make sure this.givenArray is populated\n        this.scoreMCMFSubmission();\n        this.setLocalStorage({\n            correct: this.correct ? \"T\" : \"F\",\n            answer: this.givenArray.join(\",\"),\n        });\n        if (logFlag) {\n            this.logMCMFsubmission();\n        }\n        if (!eBookConfig.peer || eBookConfig.isInstructor) {\n            this.renderMCMFFeedback();\n            if (this.useRunestoneServices) {\n                this.enableMCComparison();\n            }\n        } else {\n            if (eBookConfig.peer &&\n                eBookConfig.peerMode === \"async\" &&\n                typeof studentVoteCount !== \"undefined\" &&\n                studentVoteCount > 1) {\n                this.renderMCMAFeedBack();\n            } else {\n                $(this.feedBackDiv).html(\"<p>Your Answer has been recorded</p>\");\n                $(this.feedBackDiv).attr(\"class\", \"alert alert-info\");\n            }\n        }\n    }\n\n    scoreMCMFSubmission() {\n        this.answer = this.givenArray[0];\n        if (this.givenArray[0] == this.correctIndexList[0]) {\n            this.correct = true;\n            this.percent = 1.0;\n        } else if (this.givenArray[0] != null) {\n            // if given is null then the question wasn\"t answered and should be counted as skipped\n            this.correct = false;\n            this.percent = 0.0;\n        }\n    }\n\n    async logMCMFsubmission(sid) {\n        // If there's no answer provided (the array is empty), use a blank for the answer.\n        var answer = this.givenArray[0] || \"\";\n        var correct =\n            this.givenArray[0] == this.correctIndexList[0] ? \"T\" : \"F\";\n        var logAnswer =\n            \"answer:\" + answer + \":\" + (correct == \"T\" ? \"correct\" : \"no\"); // backward compatible\n        let data = {\n            event: \"mChoice\",\n            act: logAnswer,\n            answer: answer,\n            correct: correct,\n            div_id: this.divid,\n        };\n        if (eBookConfig.peer && typeof studentVoteCount !== \"undefined\") {\n            data.act = data.act + `:vote${studentVoteCount}`;\n        }\n        if (typeof sid !== \"undefined\") {\n            data.sid = sid;\n        }\n        await this.logBookEvent(data);\n    }\n\n    renderMCMFFeedback() {\n        let correct = this.givenArray[0] == this.correctIndexList[0];\n        let feedbackText = this.singlefeedback;\n\n        if (correct) {\n            $(this.feedBackDiv).html(\"✔️ \" + feedbackText);\n            $(this.feedBackDiv).attr(\"class\", \"alert alert-info\"); // use blue for better red/green blue color blindness\n        } else {\n            if (feedbackText == null) {\n                feedbackText = \"\";\n            }\n            $(this.feedBackDiv).html(\"✖️ \" + feedbackText);\n            $(this.feedBackDiv).attr(\"class\", \"alert alert-danger\");\n        }\n    }\n    enableMCComparison() {\n        if (eBookConfig.enableCompareMe) {\n            this.compareButton.disabled = false;\n        }\n    }\n    instructorMchoiceModal(data) {\n        // data.reslist -- student and their answers\n        // data.answerDict    -- answers and count\n        // data.correct - correct answer\n        var res = \"<table><tr><th>Student</th><th>Answer(s)</th></tr>\";\n        for (var i in data) {\n            res +=\n                \"<tr><td>\" +\n                data[i][0] +\n                \"</td><td>\" +\n                data[i][1] +\n                \"</td></tr>\";\n        }\n        res += \"</table>\";\n        return res;\n    }\n    compareModal(data, status, whatever) {\n        var datadict = data.detail;\n        var answers = datadict.answerDict;\n        var misc = datadict.misc;\n        var kl = Object.keys(answers).sort();\n        var body = \"<table>\";\n        body += \"<tr><th>Answer</th><th>Percent</th></tr>\";\n        var theClass = \"\";\n        for (var k in kl) {\n            if (kl[k] === misc.correct) {\n                theClass = \"success\";\n            } else {\n                theClass = \"info\";\n            }\n            body +=\n                \"<tr><td>\" + kl[k] + \"</td><td class='compare-me-progress'>\";\n            var pct = answers[kl[k]] + \"%\";\n            body += \"<div class='progress'>\";\n            body +=\n                \"    <div class='progress-bar progress-bar-\" +\n                theClass +\n                \"' style='width:\" +\n                pct +\n                \";'>\" +\n                pct;\n            body += \"    </div>\";\n            body += \"</div></td></tr>\";\n        }\n        body += \"</table>\";\n        if (misc.yourpct !== \"unavailable\") {\n            body +=\n                \"<br /><p>You have \" +\n                misc.yourpct +\n                \"% correct for all questions</p>\";\n        }\n        if (datadict.reslist !== undefined) {\n            body += this.instructorMchoiceModal(datadict.reslist);\n        }\n        var html =\n            \"<div class='modal fade'>\" +\n            \"    <div class='modal-dialog compare-modal'>\" +\n            \"        <div class='modal-content'>\" +\n            \"            <div class='modal-header'>\" +\n            \"                <button type='button' class='close' data-dismiss='modal' aria-hidden='true'>&times;</button>\" +\n            \"                <h4 class='modal-title'>Distribution of Answers</h4>\" +\n            \"            </div>\" +\n            \"            <div class='modal-body'>\" +\n            body +\n            \"            </div>\" +\n            \"        </div>\" +\n            \"    </div>\" +\n            \"</div>\";\n        var el = $(html);\n        el.modal();\n    }\n    // _`compareAnswers`\n    compareAnswers() {\n        var data = {};\n        data.div_id = this.divid;\n        data.course_name = eBookConfig.course;\n        jQuery.get(\n            `${eBookConfig.new_server_prefix}/assessment/getaggregateresults`,\n            data,\n            this.compareModal.bind(this)\n        );\n    }\n\n    disableInteraction() {\n        for (var i = 0; i < this.optionArray.length; i++) {\n            this.optionArray[i].input.disabled = true;\n        }\n    }\n\n    enableInteraction() {\n        for (var i = 0; i < this.optionArray.length; i++) {\n            this.optionArray[i].input.disabled = false;\n        }\n    }\n}\n\n/*=================================\n== Find the custom HTML tags and ==\n==   execute our code on them    ==\n=================================*/\n$(document).on(\"runestone:login-complete\", function () {\n    $(\"[data-component=multiplechoice]\").each(function (index) {\n        // MC\n        var opts = {\n            orig: this,\n            useRunestoneServices: eBookConfig.useRunestoneServices,\n        };\n        if ($(this).closest(\"[data-component=timedAssessment]\").length == 0) {\n            // If this element exists within a timed component, don't render it here\n            window.componentMap[this.id] = new MultipleChoice(opts);\n        }\n    });\n});\n","import MultipleChoice from \"./mchoice.js\";\n\nexport default class TimedMC extends MultipleChoice {\n    constructor(opts) {\n        super(opts);\n        $(this.containerDiv).addClass(\"runestone\");\n        this.needsReinitialization = true;\n        this.renderTimedIcon(this.MCContainer);\n        this.hideButtons(); // Don't show per-question buttons in a timed assessment\n    }\n\n    renderTimedIcon(component) {\n        // renders the clock icon on timed components.    The component parameter\n        // is the element that the icon should be appended to.\n        var timeIconDiv = document.createElement(\"div\");\n        var timeIcon = document.createElement(\"img\");\n        $(timeIcon).attr({\n            src: \"../_static/clock.png\",\n            style: \"width:15px;height:15px\",\n        });\n        timeIconDiv.className = \"timeTip\";\n        timeIconDiv.title = \"\";\n        timeIconDiv.appendChild(timeIcon);\n        $(component).prepend(timeIconDiv);\n    }\n    hideButtons() {\n        //Just hiding the buttons doesn't prevent submitting the form when entering is clicked\n        //We need to completely disable the buttons\n        $(this.submitButton).attr(\"disabled\", \"true\");\n        $(this.submitButton).hide();\n        $(this.compareButton).hide();\n    }\n\n    // These methods override the methods in the base class. Called from renderFeedback()\n    //\n    renderMCMAFeedBack() {\n        this.feedbackTimedMC();\n    }\n    renderMCMFFeedback(whatever, whateverr) {\n        this.feedbackTimedMC();\n    }\n    feedbackTimedMC() {\n        for (var i = 0; i < this.indexArray.length; i++) {\n            var tmpindex = this.indexArray[i];\n            $(this.feedBackEachArray[i]).html(\n                String.fromCharCode(65 + i) + \". \" + this.feedbackList[i]\n            );\n            var tmpid = this.answerList[tmpindex].id;\n            if (this.correctList.indexOf(tmpid) >= 0) {\n                this.feedBackEachArray[i].classList.add(\n                    \"alert\",\n                    \"alert-success\"\n                );\n            } else {\n                this.feedBackEachArray[i].classList.add(\n                    \"alert\",\n                    \"alert-danger\"\n                );\n            }\n        }\n    }\n    renderMCFormOpts() {\n        super.renderMCFormOpts();\n        this.feedBackEachArray = [];\n        for (var j = 0; j < this.answerList.length; j++) {\n            var k = this.indexArray[j];\n            var feedBackEach = document.createElement(\"div\");\n            feedBackEach.id = this.divid + \"_eachFeedback_\" + k;\n            feedBackEach.classList.add(\"eachFeedback\");\n            this.feedBackEachArray.push(feedBackEach);\n            this.optsForm.appendChild(feedBackEach);\n        }\n    }\n    checkCorrectTimedMCMA() {\n        if (\n            this.correctCount === this.correctList.length &&\n            this.correctList.length === this.givenArray.length\n        ) {\n            this.correct = true;\n        } else if (this.givenArray.length !== 0) {\n            this.correct = false;\n        } else {\n            // question was skipped\n            this.correct = null;\n        }\n        switch (this.correct) {\n            case true:\n                return \"T\";\n            case false:\n                return \"F\";\n            default:\n                return null;\n        }\n    }\n    checkCorrectTimedMCMF() {\n        // Returns if the question was correct, incorrect, or skipped (return null in the last case)\n        switch (this.correct) {\n            case true:\n                return \"T\";\n            case false:\n                return \"F\";\n            default:\n                return null;\n        }\n    }\n    checkCorrectTimed() {\n        if (this.multipleanswers) {\n            return this.checkCorrectTimedMCMA();\n        } else {\n            return this.checkCorrectTimedMCMF();\n        }\n    }\n    hideFeedback() {\n        for (var i = 0; i < this.feedBackEachArray.length; i++) {\n            $(this.feedBackEachArray[i]).hide();\n        }\n    }\n\n    reinitializeListeners() {\n        let self = this;\n        let answerFunc = function () {\n            self.isAnswered = true;\n        };\n        for (let opt of this.optionArray) {\n            opt.input.onclick = answerFunc;\n        }\n    }\n}\n\nif (typeof window.component_factory === \"undefined\") {\n    window.component_factory = {};\n}\n\nwindow.component_factory.multiplechoice = function (opts) {\n    if (opts.timed) {\n        return new TimedMC(opts);\n    } else {\n        return new MultipleChoice(opts);\n    }\n};\n"],"names":["MultipleChoice","constructor","opts","super","orig","this","origElem","useRunestoneServices","multipleanswers","divid","id","$","data","children","childNodes","random","is","correct","answerList","correctList","correctIndexList","feedbackList","question","caption","findAnswers","findQuestion","findFeedbacks","createCorrectList","createMCForm","addCaption","checkServer","queueMathJax","containerDiv","Prism","highlightAllUnder","delimiter","i","length","nodeName","outerHTML","temp","html","split","ChildAnswerList","push","j","answer_id","attr","is_correct","answer_object","content","innerHTML","renderMCContainer","renderMCForm","renderMCfeedbackDiv","replaceWith","document","createElement","addClass","getAttribute","optsForm","method","action","onsubmit","optsFieldSet","appendChild","renderMCFormOpts","renderMCFormButtons","legend","textContent","optionArray","input_type","indexArray","randomizeAnswers","self","answerFunc","isAnswered","k","optid","label","prefix","startsWith","slice","String","fromCharCode","charCodeAt","optObj","input","find","onclick","submitButton","class","name","type","addEventListener","processMCMASubmission","bind","ev","preventDefault","processMCMFSubmission","eBookConfig","peer","compareButton","disabled","compareAnswers","feedBackDiv","setAttribute","temporaryValue","randomIndex","currentIndex","Math","floor","temporaryFeedback","restoreAnswers","answer","answers","a","index","b","value","checkLocalStorage","graderactive","localStorage","ex","getItem","localStorageKey","JSON","parse","err","console","log","message","removeItem","enableMCComparison","getSubmittedOpts","logMCMAsubmission","logMCMFsubmission","setLocalStorage","timeStamp","Date","storageObj","timestamp","setItem","stringify","logFlag","scoreMCMASubmission","givenArray","join","isInstructor","renderMCMAFeedBack","peerMode","studentVoteCount","given","singlefeedback","feedbackString","givenlog","buttonObjs","elements","group1","checked","sort","checkCurrentAnswer","scoreMCMFSubmission","logCurrentAnswer","sid","renderFeedback","renderMCMFFeedback","correctCount","correctIndex","givenIndex","numGiven","numCorrect","numNeeded","percent","max","event","act","div_id","logBookEvent","answerStr","feedbackText","enableCompareMe","instructorMchoiceModal","res","compareModal","status","whatever","datadict","detail","answerDict","misc","kl","Object","keys","body","theClass","pct","yourpct","undefined","reslist","modal","course_name","course","jQuery","get","new_server_prefix","disableInteraction","enableInteraction","on","each","closest","window","componentMap","TimedMC","needsReinitialization","renderTimedIcon","MCContainer","hideButtons","component","timeIconDiv","timeIcon","src","style","className","title","prepend","hide","feedbackTimedMC","whateverr","tmpindex","feedBackEachArray","tmpid","indexOf","classList","add","feedBackEach","checkCorrectTimedMCMA","checkCorrectTimedMCMF","checkCorrectTimed","hideFeedback","reinitializeListeners","opt","component_factory","multiplechoice","timed"],"sourceRoot":""}