scorm-again 2.6.0 → 2.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/aicc.js +172 -166
  2. package/dist/aicc.js.map +1 -1
  3. package/dist/aicc.min.js +1 -1
  4. package/dist/aicc.min.js.map +1 -1
  5. package/dist/esm/aicc.js +173 -167
  6. package/dist/esm/aicc.js.map +1 -1
  7. package/dist/esm/aicc.min.js +1 -1
  8. package/dist/esm/aicc.min.js.map +1 -1
  9. package/dist/esm/scorm-again.js +194 -184
  10. package/dist/esm/scorm-again.js.map +1 -1
  11. package/dist/esm/scorm-again.min.js +1 -1
  12. package/dist/esm/scorm-again.min.js.map +1 -1
  13. package/dist/esm/scorm12.js +171 -165
  14. package/dist/esm/scorm12.js.map +1 -1
  15. package/dist/esm/scorm12.min.js +1 -1
  16. package/dist/esm/scorm12.min.js.map +1 -1
  17. package/dist/esm/scorm2004.js +65 -51
  18. package/dist/esm/scorm2004.js.map +1 -1
  19. package/dist/esm/scorm2004.min.js +1 -1
  20. package/dist/esm/scorm2004.min.js.map +1 -1
  21. package/dist/scorm-again.js +195 -185
  22. package/dist/scorm-again.js.map +1 -1
  23. package/dist/scorm-again.min.js +1 -1
  24. package/dist/scorm-again.min.js.map +1 -1
  25. package/dist/scorm12.js +170 -164
  26. package/dist/scorm12.js.map +1 -1
  27. package/dist/scorm12.min.js +1 -1
  28. package/dist/scorm12.min.js.map +1 -1
  29. package/dist/scorm2004.js +64 -50
  30. package/dist/scorm2004.js.map +1 -1
  31. package/dist/scorm2004.min.js +1 -1
  32. package/dist/scorm2004.min.js.map +1 -1
  33. package/dist/types/AICC.d.ts +13 -0
  34. package/dist/types/BaseAPI.d.ts +71 -0
  35. package/dist/types/Scorm12API.d.ts +39 -0
  36. package/dist/types/Scorm2004API.d.ts +52 -0
  37. package/dist/types/ScormAgain.d.ts +4 -0
  38. package/dist/types/cmi/aicc/attempts.d.ts +19 -0
  39. package/dist/types/cmi/aicc/cmi.d.ts +34 -0
  40. package/dist/types/cmi/aicc/core.d.ts +57 -0
  41. package/dist/types/cmi/aicc/evaluation.d.ts +33 -0
  42. package/dist/types/cmi/aicc/paths.d.ts +35 -0
  43. package/dist/types/cmi/aicc/student_data.d.ts +20 -0
  44. package/dist/types/cmi/aicc/student_demographics.d.ts +61 -0
  45. package/dist/types/cmi/aicc/student_preferences.d.ts +34 -0
  46. package/dist/types/cmi/aicc/tries.d.ts +23 -0
  47. package/dist/types/cmi/aicc/validation.d.ts +1 -0
  48. package/dist/types/cmi/common/array.d.ts +19 -0
  49. package/dist/types/cmi/common/base_cmi.d.ts +13 -0
  50. package/dist/types/cmi/common/score.d.ts +38 -0
  51. package/dist/types/cmi/common/validation.d.ts +3 -0
  52. package/dist/types/cmi/scorm12/cmi.d.ts +45 -0
  53. package/dist/types/cmi/scorm12/interactions.d.ts +64 -0
  54. package/dist/types/cmi/scorm12/nav.d.ts +11 -0
  55. package/dist/types/cmi/scorm12/objectives.d.ts +22 -0
  56. package/dist/types/cmi/scorm12/student_data.d.ts +22 -0
  57. package/dist/types/cmi/scorm12/student_preference.d.ts +26 -0
  58. package/dist/types/cmi/scorm12/validation.d.ts +2 -0
  59. package/dist/types/cmi/scorm2004/adl.d.ts +71 -0
  60. package/dist/types/cmi/scorm2004/cmi.d.ts +103 -0
  61. package/dist/types/cmi/scorm2004/comments.d.ts +27 -0
  62. package/dist/types/cmi/scorm2004/interactions.d.ts +68 -0
  63. package/dist/types/cmi/scorm2004/learner_preference.d.ts +26 -0
  64. package/dist/types/cmi/scorm2004/objectives.d.ts +38 -0
  65. package/dist/types/cmi/scorm2004/score.d.ts +14 -0
  66. package/dist/types/cmi/scorm2004/validation.d.ts +2 -0
  67. package/dist/types/constants/api_constants.d.ts +49 -0
  68. package/dist/types/constants/default_settings.d.ts +2 -0
  69. package/dist/types/constants/enums.d.ts +23 -0
  70. package/dist/types/constants/error_codes.d.ts +6 -0
  71. package/dist/types/constants/language_constants.d.ts +2 -0
  72. package/dist/types/constants/regex.d.ts +82 -0
  73. package/dist/types/constants/response_constants.d.ts +16 -0
  74. package/dist/types/exceptions/aicc_exceptions.d.ts +4 -0
  75. package/dist/types/exceptions/scorm12_exceptions.d.ts +4 -0
  76. package/dist/types/exceptions/scorm2004_exceptions.d.ts +4 -0
  77. package/dist/types/exceptions.d.ts +18 -0
  78. package/dist/types/helpers/scheduled_commit.d.ts +10 -0
  79. package/dist/types/interfaces/IBaseAPI.d.ts +22 -0
  80. package/dist/types/types/api_types.d.ts +73 -0
  81. package/dist/types/utilities.d.ts +19 -0
  82. package/dist_test.html +208 -0
  83. package/package.json +3 -2
  84. package/src/AICC.ts +3 -3
  85. package/src/BaseAPI.ts +32 -22
  86. package/src/Scorm12API.ts +4 -12
  87. package/src/Scorm2004API.ts +18 -23
  88. package/src/ScormAgain.ts +3 -7
  89. package/src/constants/default_settings.ts +2 -2
  90. package/src/types/api_types.ts +27 -2
  91. package/test/AICC.spec.ts +2 -2
  92. package/test/Scorm12API.spec.ts +26 -3
  93. package/test/Scorm2004API.spec.ts +20 -20
  94. package/tsconfig.json +19 -6
  95. package/webpack.config.js +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"scorm2004.min.js","mappings":"0JAOaA,EAA4B,CACvCC,YAAY,EACZC,kBAAmB,GACnBC,aAAa,EACbC,gBAAgB,EAChBC,cAAc,EACdC,iBAAkB,OAClBC,sBAAuB,iCACvBC,cAAc,EACdC,SAAU,EAAAC,aAAaC,MACvBC,uBAAuB,EACvBC,qBAAqB,EACrBC,0BAA0B,EAC1BC,eAAe,EACfC,WAAY,CAAC,EACbC,oBAAoB,EACpBC,UAAW,OACXC,gBAAiB,SAAgBC,G,0IACP,IAAbA,EAAP,MACmB,GAAMA,EAASC,Q,OAKpC,OALMC,EAAe,SACjBC,EAAa,KACbD,IACFC,EAAaC,KAAKC,MAAMH,IAGT,OAAfC,GACC,CAAC,EAAEG,eAAeC,KAAKJ,EAAY,UAc7B,CAAP,EAAO,CACLK,OAAQL,EAAWK,OACnBC,UAAWN,EAAWM,UAClBN,EAAWM,UACXN,EAAWK,SAAW,EAAAE,iBAAiBC,WACrC,EACA,MAlBgB,MAApBX,EAASY,OACJ,CAAP,EAAO,CACLJ,OAAQ,EAAAE,iBAAiBC,WACzBF,UAAW,IAGN,CAAP,EAAO,CACLD,OAAQ,EAAAE,iBAAiBG,YACzBJ,UAAW,M,OAcnB,MAAO,CAAP,EAAO,CACLD,OAAQ,EAAAE,iBAAiBG,YACzBJ,UAAW,M,QAGfK,eAAgB,SAAUC,GACxB,OAAOA,CACT,EACAC,aAAc,SAAUC,EAAwBC,GAC9C,OAAQD,GACN,IAAK,IACL,KAAK,EACL,IAAK,QACL,KAAK,EAAA3B,aAAaC,MAChB4B,QAAQC,MAAMF,GACd,MACF,IAAK,IACL,KAAK,EACL,IAAK,OACL,KAAK,EAAA5B,aAAa+B,KAChBF,QAAQG,KAAKJ,GACb,MACF,IAAK,IACL,KAAK,EACL,IAAK,OACL,KAAK,EAAA5B,aAAaiC,KAChBJ,QAAQK,KAAKN,GACb,MACF,IAAK,IACL,KAAK,EACL,IAAK,QACL,KAAK,EAAA5B,aAAamC,MACZN,QAAQO,MACVP,QAAQO,MAAMR,GAEdC,QAAQQ,IAAIT,GAIpB,EACAU,WAAY,GACZC,oBAAoB,EACpBC,mBAAoB,IC9FtB,aAYE,WAAYC,EAAcC,EAAcC,GAVhC,KAAAC,YAAa,EAWnBC,KAAKC,KAAOL,EACZI,KAAKE,SAAWC,WAAWH,KAAKI,QAAQC,KAAKL,MAAOH,GACpDG,KAAKM,UAAYR,CACnB,CAoBF,OAfE,YAAAS,OAAA,WACEP,KAAKD,YAAa,EACdC,KAAKE,UACPM,aAAaR,KAAKE,SAEtB,EAKA,YAAAE,QAAA,WACOJ,KAAKD,aACP,eAFL,UAEK,+D,uBAAY,SAAMC,KAAKC,KAAKQ,OAAOT,KAAKM,Y,OAA5B,mB,MAEjB,EACF,EApCA,GCiBA,aAWE,WAAsBI,EAAwBC,G,uBAC5C,GATM,KAAAC,UAAsBnE,EASxB,IAAeoE,EACjB,MAAM,IAAIC,UAAU,+CAEtBd,KAAKe,aAAe,EAAAxC,iBAAiByC,sBACrChB,KAAKiB,cAAgB,IACrBjB,KAAKkB,cAAgB,GAErBlB,KAAKmB,aAAeT,EAEhBC,IACFX,KAAKW,SAAWA,GAElBX,KAAKoB,YAAcpB,KAAKW,SAASzD,SACjC8C,KAAK3C,sBAAwB2C,KAAKW,SAAStD,2BAElBgE,IAArBrB,KAAKoB,cACPpB,KAAKoB,YAAc,EAAAjE,aAAamE,KAEpC,CAytCF,OAvsCE,YAAAC,YAAA,SAAYZ,GACVX,KAAKwB,OAAO,QAAS,SAAU,EAAArE,aAAaiC,MAE5CY,KAAKW,UAAW,gCAAKX,KAAKW,UAAaA,GAEvCX,KAAKyB,uBACLzB,KAAKe,aAAe,EAAAxC,iBAAiByC,sBACrChB,KAAKiB,cAAgB,IACrBjB,KAAKkB,cAAgB,GACrBlB,KAAK0B,kBAAeL,CACtB,EASA,YAAAM,WAAA,SACEC,EACAC,EACAC,GAEA,IAAIC,EAAc,EAAAxD,iBAAiBG,YAoBnC,OAlBIsB,KAAKgC,gBACPhC,KAAKiC,gBAAgBjC,KAAKmB,aAAae,YAAaL,GAC3C7B,KAAKmC,eACdnC,KAAKiC,gBAAgBjC,KAAKmB,aAAaiB,WAAYN,IAE/C9B,KAAK3C,uBACP2C,KAAKqC,IAAIC,eAGXtC,KAAKe,aAAe,EAAAxC,iBAAiBgE,kBACrCvC,KAAKiB,cAAgB,IACrBc,EAAc,EAAAxD,iBAAiBC,WAC/BwB,KAAKwC,iBAAiBZ,IAGxB5B,KAAKwB,OAAOI,EAAc,aAAeG,EAAa,EAAA5E,aAAaiC,MACnEY,KAAKyC,gBAAgBV,GAEdA,CACT,EA6EA,YAAAP,OAAA,SACEkB,EACA3D,EACAD,EACA6D,GAEA5D,GAAa,IAAA6D,eAAcF,EAAc3D,EAAY4D,GAEjD7D,GAAgBkB,KAAKoB,aACvBpB,KAAKW,SAAS9B,aAAaC,EAAcC,EAE7C,EAMA,sBAAI,0BAAW,C,IAAf,WACE,OAAOiB,KAAKmB,YACd,E,gCAMA,sBAAI,uBAAQ,C,IAAZ,WACE,OAAOnB,KAAKY,SACd,E,IAMA,SAAaD,GACXX,KAAKY,WAAY,gCAAKZ,KAAKY,WAAcD,EAC3C,E,gCAQM,YAAAkC,UAAN,SACEjB,EACAkB,G,qIAEIf,EAAc,EAAAxD,iBAAiBG,YAGjCsB,KAAK+C,WACHD,EACA9C,KAAKmB,aAAa6B,wBAClBhD,KAAKmB,aAAa8B,uBAGpBjD,KAAKe,aAAe,EAAAxC,iBAAiB2E,iBAER,GAAMlD,KAAKmD,WAAU,KARlD,M,YASgC,KAD1B9E,EAAuB,UACXC,WAA6BD,EAAOC,UAAY,GAChE0B,KAAKiC,gBAAgB5D,EAAOC,WAE9ByD,OACoB,IAAX1D,GAA0BA,EAAOA,OACpCA,EAAOA,OACP,EAAAE,iBAAiBG,YAEnBoE,IAAiB9C,KAAKiB,cAAgB,KAE1Cc,EAAc,EAAAxD,iBAAiBC,WAC/BwB,KAAKwC,iBAAiBZ,G,iBAMxB,OAHA5B,KAAKwB,OAAOI,EAAc,aAAeG,EAAa,EAAA5E,aAAaiC,MACnEY,KAAKyC,gBAAgBV,GAEd,CAAP,EAAOA,G,QAWT,YAAAqB,SAAA,SACExB,EACAkB,EACAH,GAEA,IAAIZ,EAAsB,GAE1B,GACE/B,KAAK+C,WACHD,EACA9C,KAAKmB,aAAakC,qBAClBrD,KAAKmB,aAAamC,qBAEpB,CACIR,IAAiB9C,KAAKiB,cAAgB,KAC1C,IACEc,EAAc/B,KAAKuD,YAAYZ,EACjC,CAAE,MAAOa,GACPzB,EAAc/B,KAAKyD,2BAA2BD,EAAGzB,EACnD,CACA/B,KAAKwC,iBAAiBZ,EAAce,EACtC,CASA,OAPA3C,KAAKwB,OACHI,EACA,eAAiBG,EACjB,EAAA5E,aAAaiC,KACbuD,QAGkBtB,IAAhBU,EACK,IAGT/B,KAAKyC,gBAAgBV,GAEdA,EACT,EAYA,YAAA2B,SAAA,SACE9B,EACA+B,EACAb,EACAH,EACAiB,QAEcvC,IAAVuC,IACFA,EAAQC,OAAOD,IAEjB,IAAI7B,EAAsB,EAAAxD,iBAAiBG,YAE3C,GACEsB,KAAK+C,WACHD,EACA9C,KAAKmB,aAAa2C,kBAClB9D,KAAKmB,aAAa4C,kBAEpB,CACIjB,IAAiB9C,KAAKiB,cAAgB,KAC1C,IACEc,EAAc/B,KAAKgE,YAAYrB,EAAYiB,EAC7C,CAAE,MAAOJ,GACPxD,KAAKyD,2BAA2BD,EAAGzB,EACrC,CACA/B,KAAKwC,iBAAiBZ,EAAce,EAAYiB,EAClD,CAyBA,YAvBoBvC,IAAhBU,IACFA,EAAc,EAAAxD,iBAAiBG,aAKE,MAA/BmF,OAAO7D,KAAKiB,gBACVjB,KAAKW,SAASjE,YAChBsD,KAAKiE,eAC+B,IAAlCjE,KAAKW,SAAShE,kBACdgH,GAKN3D,KAAKwB,OACHI,EACA,KAAOgC,EAAQ,aAAe7B,EAC9B,EAAA5E,aAAaiC,KACbuD,GAEF3C,KAAKyC,gBAAgBV,GAEdA,CACT,EAQM,YAAAtB,OAAN,Y,sDACEmB,EACAkB,G,oBAAA,IAAAA,IAAAA,GAAA,I,iEAEA9C,KAAKyB,uBAEDM,EAAc,EAAAxD,iBAAiBG,YAGjCsB,KAAK+C,WACHD,EACA9C,KAAKmB,aAAa+C,mBAClBlE,KAAKmB,aAAagD,mBAGL,GAAMnE,KAAKmD,WAAU,IANpC,M,QAMM9E,EAAS,UACJC,WAAaD,EAAOC,UAAY,GACzC0B,KAAKiC,gBAAgB5D,EAAOC,WAE9ByD,OACoB,IAAX1D,GAA0BA,EAAOA,OACpCA,EAAOA,OACP,EAAAE,iBAAiBG,YAEvBsB,KAAKwB,OACHI,EACA,YAAcG,EACd,EAAA5E,aAAamC,MACb,eAGEwD,IAAiB9C,KAAKiB,cAAgB,KAE1CjB,KAAKwC,iBAAiBZ,G,iBAMxB,OAHA5B,KAAKwB,OAAOI,EAAc,aAAeG,EAAa,EAAA5E,aAAaiC,MACnEY,KAAKyC,gBAAgBV,GAEd,CAAP,EAAOA,G,QAQT,YAAAqC,aAAA,SAAaxC,GACX,IAAMG,EAAc8B,OAAO7D,KAAKiB,eAMhC,OAJAjB,KAAKwC,iBAAiBZ,GAEtB5B,KAAKwB,OAAOI,EAAc,aAAeG,EAAa,EAAA5E,aAAaiC,MAE5D2C,CACT,EASA,YAAAsC,eAAA,SAAezC,EAAsB0C,GACnC,IAAIvC,EAAc,GASlB,OAPqB,OAAjBuC,GAA0C,KAAjBA,IAC3BvC,EAAc/B,KAAKuE,0BAA0BD,GAC7CtE,KAAKwC,iBAAiBZ,IAGxB5B,KAAKwB,OAAOI,EAAc,aAAeG,EAAa,EAAA5E,aAAaiC,MAE5D2C,CACT,EASA,YAAAyC,cAAA,SAAc5C,EAAsB0C,GAClC,IAAIvC,EAAc,GASlB,OAPqB,OAAjBuC,GAA0C,KAAjBA,IAC3BvC,EAAc/B,KAAKuE,0BAA0BD,GAAc,GAC3DtE,KAAKwC,iBAAiBZ,IAGxB5B,KAAKwB,OAAOI,EAAc,aAAeG,EAAa,EAAA5E,aAAaiC,MAE5D2C,CACT,EAUA,YAAAgB,WAAA,SACED,EACA2B,EACAC,GAEA,OAAI1E,KAAK2E,oBACP3E,KAAKiC,gBAAgBwC,IACd,IACE3B,IAAmB9C,KAAKmC,iBACjCnC,KAAKiC,gBAAgByC,IACd,EAIX,EAWA,YAAAH,0BAAA,SACEK,EACAC,GAEA,WAFA,IAAAA,IAAAA,GAAA,GAEM,IAAIC,MACR,gEAEJ,EAUA,YAAAvB,YAAA,SAAYwB,GACV,MAAM,IAAID,MAAM,kDAClB,EAWA,YAAAd,YAAA,SAAYe,EAAqBC,GAC/B,MAAM,IAAIF,MAAM,kDAClB,EAWA,YAAAG,mBAAA,SACEC,EACAC,EACAxC,EACAiB,GAEA,IAAKjB,GAA6B,KAAfA,EACjB,OAAO,EAAApE,iBAAiBG,YAa1B,IAVA,IAAM0G,EAAYzC,EAAW0C,MAAM,KAC/BC,EAAuBtF,KACvB+B,EAAc,EAAAxD,iBAAiBG,YAC/B6G,GAAkB,EAEhBC,EAAsB,2CAAoCN,EAAU,aAAKvC,EAAU,8CACnF8C,EAAmBN,EACrBnF,KAAKmB,aAAauE,qBAClB1F,KAAKmB,aAAawE,QAEbC,EAAM,EAAGA,EAAMR,EAAUS,OAAQD,IAAO,CAC/C,IAAME,EAAYV,EAAUQ,GAE5B,GAAIA,IAAQR,EAAUS,OAAS,EACzBV,GAA2C,aAA9BW,EAAUC,UAAU,EAAG,GAClC/F,KAAKgC,gBACPhC,KAAKiC,gBAAgBjC,KAAKmB,aAAa6E,mBAEvCV,GAAY,gCACPA,GAAS,CACZQ,UAAWlC,IAGL5D,KAAKiG,wBAAwBX,EAAWQ,KAIhD,IAAAI,eAAcvD,EAAY,gCAC1B3C,KAAKgC,iBAELhC,KAAKmG,wBAAwBxD,EAAYiB,GAGtCuB,GAAoC,MAAvBnF,KAAKiB,gBACrBqE,EAAUQ,GAAalC,EACvB7B,EAAc,EAAAxD,iBAAiBC,aAXjCwB,KAAKiC,gBAAgBwD,EAAkBD,OAcpC,CAEL,KADAF,EAAYA,EAAUQ,IACN,CACd9F,KAAKiC,gBAAgBwD,EAAkBD,GACvC,KACF,CAEA,GAAIF,aAAqB,EAAAc,SAAU,CACjC,IAAMC,EAAQC,SAASlB,EAAUQ,EAAM,GAAI,IAG3C,IAAKW,MAAMF,GAAQ,CACjB,IAAMG,EAAOlB,EAAUmB,WAAWJ,GAElC,GAAIG,EACFlB,EAAYkB,EACZjB,GAAkB,MACb,CACL,IAAMmB,EAAW1G,KAAK2G,gBACpBhE,EACAiB,EACA2B,GAEFA,GAAkB,EAEbmB,GAGCpB,EAAUsB,aAAaF,EAAS/E,aAEpC2D,EAAUmB,WAAWI,KAAKH,GAC1BpB,EAAYoB,GALZ1G,KAAKiC,gBAAgBwD,EAAkBD,EAO3C,CAGAI,GACF,CACF,CACF,CACF,CAUA,OARI7D,IAAgB,EAAAxD,iBAAiBG,aACnCsB,KAAKwB,OACH0D,EACA,oDAA6CvC,EAAU,uBAAeiB,GACtE,EAAAzG,aAAa+B,MAIV6C,CACT,EAUA,YAAA+E,mBAAA,SACE5B,EACAC,EACAxC,GAEA,IAAKA,GAA6B,KAAfA,EACjB,MAAO,GAaT,IAVA,IAAMyC,EAAYzC,EAAW0C,MAAM,KAC/BC,EAAuBtF,KACvB8F,EAAY,KAEViB,EAA4B,2CAAoC7B,EAAU,aAAKvC,EAAU,+BACzF6C,EAAsB,2CAAoCN,EAAU,aAAKvC,EAAU,8CACnF8C,EAAmBN,EACrBnF,KAAKmB,aAAauE,qBAClB1F,KAAKmB,aAAawE,QAEbC,EAAM,EAAGA,EAAMR,EAAUS,OAAQD,IAAO,CAG/C,GAFAE,EAAYV,EAAUQ,GAEjBT,EAOE,CACL,GACwC,aAAtCtB,OAAOiC,GAAWC,UAAU,EAAG,IACI,mBAA5BT,EAAU0B,eACjB,CACA,IAAMC,EAASpD,OAAOiC,GAAWC,UAC/B,EACAlC,OAAOiC,GAAWD,OAAS,GAE7B,OAAOP,EAAU0B,eAAeC,EAClC,CAAO,IAAKjH,KAAKiG,wBAAwBX,EAAWQ,GAElD,YADA9F,KAAKiC,gBAAgBwD,EAAkBD,EAG3C,MApBE,GAAII,IAAQR,EAAUS,OAAS,IACxB7F,KAAKiG,wBAAwBX,EAAWQ,GAE3C,YADA9F,KAAKiC,gBAAgBwD,EAAkBD,GAqB7C,QAAkBnE,KADlBiE,EAAYA,EAAUQ,IACO,CAC3B9F,KAAKiC,gBAAgBwD,EAAkBD,GACvC,KACF,CAEA,GAAIF,aAAqB,EAAAc,SAAU,CACjC,IAAMC,EAAQC,SAASlB,EAAUQ,EAAM,GAAI,IAG3C,IAAKW,MAAMF,GAAQ,CACjB,IAAMG,EAAOlB,EAAUmB,WAAWJ,GAElC,IAAIG,EAEG,CACLxG,KAAKiC,gBACHjC,KAAKmB,aAAa+F,sBAClBH,GAEF,KACF,CAPEzB,EAAYkB,EAUdZ,GACF,CACF,CACF,CAEA,GAAIN,QASF,OAAOA,EARFH,IACe,cAAdW,EACF9F,KAAKiC,gBAAgBjC,KAAKmB,aAAagG,gBAChB,WAAdrB,GACT9F,KAAKiC,gBAAgBjC,KAAKmB,aAAaiG,aAM/C,EAOA,YAAApF,cAAA,WACE,OAAOhC,KAAKe,eAAiB,EAAAxC,iBAAiBgE,iBAChD,EAOA,YAAAoC,iBAAA,WACE,OAAO3E,KAAKe,eAAiB,EAAAxC,iBAAiByC,qBAChD,EAOA,YAAAmB,aAAA,WACE,OAAOnC,KAAKe,eAAiB,EAAAxC,iBAAiB2E,gBAChD,EAQA,YAAAmE,GAAA,SAAGC,EAAsBxH,GACvB,GAAKA,EAGL,IADA,IAAMyH,EAAoBD,EAAajC,MAAM,KACpCmC,EAAI,EAAGA,EAAID,EAAkB1B,OAAQ2B,IAAK,CACjD,IAAMC,EAAgBF,EAAkBC,GAAGnC,MAAM,KACjD,GAA6B,IAAzBoC,EAAc5B,OAAc,OAEhC,IAAMnD,EAAe+E,EAAc,GAE/B9E,EAAa,KACb8E,EAAc5B,OAAS,IACzBlD,EAAa2E,EAAaI,QAAQhF,EAAe,IAAK,KAGxD1C,KAAKkB,cAAc2F,KAAK,CACtBnE,aAAcA,EACdC,WAAYA,EACZ7C,SAAUA,IAGZE,KAAKwB,OACH,KACA,gCAAyBxB,KAAKkB,cAAc2E,QAC5C,EAAA1I,aAAaiC,KACbsD,EAEJ,CACF,EAQA,YAAAiF,IAAA,SAAIL,EAAsBxH,GACxB,GAAKA,EAGL,IADA,IAAMyH,EAAoBD,EAAajC,MAAM,K,WACpCmC,GACP,IAAMC,EAAgBF,EAAkBC,GAAGnC,MAAM,KACjD,GAA6B,IAAzBoC,EAAc5B,O,qBAElB,IAAMnD,EAAe+E,EAAc,GAE/B9E,EAAa,KACb8E,EAAc5B,OAAS,IACzBlD,EAAa2E,EAAaI,QAAQhF,EAAe,IAAK,KAGxD,IAAMkF,EAAc,EAAK1G,cAAc2G,WACrC,SAACC,GACC,OAAAA,EAAIpF,eAAiBA,GACrBoF,EAAInF,aAAeA,GACnBmF,EAAIhI,WAAaA,CAFjB,KAIiB,IAAjB8H,IACF,EAAK1G,cAAc6G,OAAOH,EAAa,GACvC,EAAKpG,OACH,MACA,kCAA2B,EAAKN,cAAc2E,QAC9C,EAAA1I,aAAaiC,KACbsD,G,SAvBG8E,EAAI,EAAGA,EAAID,EAAkB1B,OAAQ2B,IAAK,C,QAA1CA,G,qCA2BX,EAOA,YAAAQ,MAAA,SAAMV,GAEJ,IADA,IAAMC,EAAoBD,EAAajC,MAAM,K,WACpCmC,GACP,IAAMC,EAAgBF,EAAkBC,GAAGnC,MAAM,KACjD,GAA6B,IAAzBoC,EAAc5B,O,qBAElB,IAAMnD,EAAe+E,EAAc,GAE/B9E,EAAa,KACb8E,EAAc5B,OAAS,IACzBlD,EAAa2E,EAAaI,QAAQhF,EAAe,IAAK,KAGxD,EAAKxB,cAAgB,EAAKA,cAAc+G,QACtC,SAACH,GACC,OAAAA,EAAIpF,eAAiBA,GAAgBoF,EAAInF,aAAeA,CAAxD,G,SAbG6E,EAAI,EAAGA,EAAID,EAAkB1B,OAAQ2B,IAAK,C,QAA1CA,G,qCAgBX,EASA,YAAAhF,iBAAA,SAAiBE,EAAsBC,EAAqBiB,GAC1D5D,KAAKwB,OAAOkB,EAAckB,EAAO,EAAAzG,aAAaiC,KAAMuD,GACpD,IAAK,IAAI6E,EAAI,EAAGA,EAAIxH,KAAKkB,cAAc2E,OAAQ2B,IAAK,CAClD,IAGIU,EAHEC,EAAWnI,KAAKkB,cAAcsG,GAC9BY,EAAiBD,EAASzF,eAAiBA,EAC3C2F,IAA0BF,EAASxF,WAOvCuF,EAJAvF,GACAwF,EAASxF,YACyD,MAAlEwF,EAASxF,WAAWoD,UAAUoC,EAASxF,WAAWkD,OAAS,GAKnD,IAFNlD,EAAW2F,QACTH,EAASxF,WAAWoD,UAAU,EAAGoC,EAASxF,WAAWkD,OAAS,IAG/CsC,EAASxF,aAAeA,GAGzCyF,GAAoBC,IAAyBH,IAC/ClI,KAAKwB,OACH,mBACA,+BAAwB2G,EAASzF,cACjC,EAAAvF,aAAaiC,KACbuD,GAEFwF,EAASrI,SAAS6C,EAAYiB,GAElC,CACF,EAQA,YAAA3B,gBAAA,SAAgBsG,EAAqBC,GAC9BA,IACHA,EAAUxI,KAAKuE,0BAA0BgE,IAG3CvI,KAAKwB,OACH,kBACA+G,EAAc,KAAOC,EACrB,EAAArL,aAAaC,OAGf4C,KAAKiB,cAAgB4C,OAAO0E,EAC9B,EAOA,YAAA9F,gBAAA,SAAgBgG,QACEpH,IAAZoH,GAAyBA,IAAY,EAAAlK,iBAAiBG,cACxDsB,KAAKiB,cAAgB,IAEzB,EAOA,YAAAyH,sBAAA,SAAsBC,EAAiBhG,GAAvC,WAKE,GAJKA,IAEHA,EAAa,IAEV3C,KAAK2E,mBAAV,CA6CA,IA0BImD,EA1BEc,EAAc,qCACdC,EAAc,mCAEdxK,EAASyK,OAAOC,KAAKJ,GAAMK,KAAI,SAAUC,GAC7C,MAAO,CAACpF,OAAOoF,GAAMN,EAAKM,GAC5B,IAGA5K,EAAO6K,MAAK,SAAU,EAAS,G,IACzBC,EADiBC,EAAC,KAAQC,GAAJ,KAAK,MAE/B,OAFmC,KAEa,QAA3CF,EAAOG,EAAYF,EAAGC,EAAGT,KAGkB,QAA3CO,EAAOG,EAAYF,EAAGC,EAAGR,IAFrBM,EAMLC,EAAIC,GACE,EAEND,EAAIC,EACC,EAEF,CACT,IAGAhL,EAAOkL,SAAQ,SAACC,IACd1B,EAAM,CAAC,GACH0B,EAAQ,IAAMA,EAAQ,GAC1B,EAAKC,cAAa,IAAAC,WAAU5B,GAAMnF,EACpC,GAvEA,MAJE3D,QAAQC,MACN,8EAaJ,SAASqK,EACPF,EACAC,EACAM,GAEA,IAEIC,EAFEC,EAAUT,EAAEU,MAAMH,GAGxB,GAAgB,OAAZE,GAAuD,QAAlCD,EAAUP,EAAES,MAAMH,IAAsB,CAC/D,IAAMI,EAAQC,OAAOH,EAAQ,IACvBI,EAAQD,OAAOJ,EAAQ,IAC7B,OAAIG,IAAUE,EACO,OAAfJ,EAAQ,IACF,EACgB,SAAfA,EAAQ,GACE,OAAfD,EAAQ,GACH,GAEC,EAGH,EAGJG,EAAQE,CACjB,CAEA,OAAO,IACT,CAkCF,EAQA,YAAAR,aAAA,SAAad,EAAiBhG,GAC5B,QAD4B,IAAAA,IAAAA,EAAA,IACvB3C,KAAK2E,oBAYV,IAAK,IAAMsE,KALXtG,OAA4BtB,IAAfsB,EAA2BA,EAAa,MAErD3C,KAAK0B,aAAeiH,EAGFA,EAChB,GAAI,CAAC,EAAExK,eAAeC,KAAKuK,EAAMM,IAAQN,EAAKM,GAAM,CAClD,IAAMiB,GAAqBvH,EAAaA,EAAa,IAAM,IAAMsG,EAC3DrF,EAAQ+E,EAAKM,GAEnB,GAAIrF,EAAkB,WACpB,IAAK,IAAI4D,EAAI,EAAGA,EAAI5D,EAAkB,WAAEiC,OAAQ2B,IAC9CxH,KAAKyJ,aACH7F,EAAkB,WAAE4D,GACpB0C,EAAoB,IAAM1C,QAGrB5D,EAAMuG,cAAgBrB,OAC/B9I,KAAKyJ,aAAa7F,EAAOsG,GAEzBlK,KAAKgE,YAAYkG,EAAmBtG,EAExC,OA5BA5E,QAAQC,MACN,oEA6BN,EAOA,YAAAmL,sBAAA,WACE,IAAM/H,EAAMrC,KAAKqC,IAEjB,OAAIrC,KAAKW,SAAS9D,eACToB,KAAKoM,UAAU,CAAEhI,IAAG,IAEtBpE,KAAKoM,UAAU,CAAEhI,IAAG,IAAI,SAACiI,EAAGC,GAAM,YAAOlJ,IAANkJ,EAAkB,KAAOA,CAA1B,GAA8B,EACzE,EAMA,YAAAC,sBAAA,WACE,OAAOvM,KAAKC,MAAM8B,KAAKoK,wBACzB,EASM,YAAAK,mBAAN,c,sDACEC,EACAC,EACAC,G,6BAAA,IAAAA,IAAAA,GAAA,I,0DAUA,OARMC,EAAM7K,KACN8K,EAA6B,CACjCzM,OAAQ,EAAAE,iBAAiBG,YACzBJ,UAAW0B,KAAKU,YAAYiF,SAK1BiF,GACF5K,KAAK+K,aAAaL,EAAKC,GAAQK,MAAK,SAAOnN,GAAQ,kD,iEACjD,SAAMmC,KAAKiL,kBAAkBpN,I,cAA7B,S,cAEK,CAAP,EAAO,CACLQ,OAAQ,EAAAE,iBAAiBC,WACzBF,UAAW,MAIT4M,EAAU,SACdR,EACAC,EACAhK,GAAkB,kD,yEAIC,O,sBADjBgK,EAAShK,EAAShC,eAAegM,GAChB,GAAM3K,KAAK+K,aAAaL,EAAKC,I,OAE9C,OAFM9M,EAAW,SAEV,CAAP,EAAOmC,KAAKiL,kBAAkBpN,I,OAI9B,O,WAFAmC,KAAKwB,OAAO,qBAAsB,EAAG,EAAArE,aAAaC,OAClDyN,EAAIrI,iBAAiB,eACd,CAAP,EAAOsI,G,yBAIJ,GAAMI,EAAQR,EAAKC,EAAQ3K,KAAKW,Y,OAAvC,MAAO,CAAP,EAAO,U,QAST,YAAAsD,eAAA,SAAepE,EAAcC,GACtBE,KAAKE,WACRF,KAAKE,SAAW,IAAIiL,EAAgBnL,KAAMH,EAAMC,GAChDE,KAAKwB,OAAO,iBAAkB,YAAa,EAAArE,aAAamC,MAAO,IAEnE,EAKA,YAAAmC,qBAAA,WACMzB,KAAKE,WACPF,KAAKE,SAASK,SACdP,KAAKE,cAAWmB,EAChBrB,KAAKwB,OAAO,uBAAwB,UAAW,EAAArE,aAAamC,MAAO,IAEvE,EASQ,YAAA2G,wBAAR,SACEX,EACAQ,GAEA,OACEgD,OAAO3K,eAAeC,KAAKkH,EAAWQ,IAIjC,MAHLgD,OAAOsC,yBACLtC,OAAOuC,eAAe/F,GACtBQ,IAEFA,KAAaR,CAEjB,EASQ,YAAA7B,2BAAR,SAAmCD,EAAQzB,GAYzC,OAXIyB,aAAa,EAAA8H,iBACftL,KAAKiB,cAAgB4C,OAAOL,EAAElF,WAC9ByD,EAAc,EAAAxD,iBAAiBG,cAE3B8E,aAAasB,OAAStB,EAAEgF,QAC1BxJ,QAAQC,MAAMuE,EAAEgF,SAEhBxJ,QAAQC,MAAMuE,GAEhBxD,KAAKiC,gBAAgBjC,KAAKmB,aAAawE,UAElC5D,CACT,EAQU,YAAAwJ,gBAAV,SACEC,GAEA,IAAMC,EACJD,GAAmBxL,KAAKW,SAASrD,oBAC7BsB,EAAeoB,KAAKW,SAASpD,yBAC/ByC,KAAK0L,mBAAmBD,GACxBzL,KAAK2L,gBAAgBF,GAQzB,MANI,CAAC,EAAAtO,aAAamC,MAAO,IAAK,EAAG,SAASsM,SAAS5L,KAAKoB,eACtDpC,QAAQO,MACN,wBAA0BiM,EAAkB,MAAQ,MAAQ,OAE9DxM,QAAQO,MAAMX,IAETA,CACT,EASc,YAAAmM,aAAd,SACEL,EACAC,G,+FAEA,MAAO,CAAP,EAAOkB,MAAMnB,EAAK,CAChBoB,OAAQ,OACRC,KAAM/L,KAAKW,SAAShD,UACpBqO,KAAMrB,aAAkBsB,MAAQtB,EAAOuB,KAAK,KAAOjO,KAAKoM,UAAUM,GAClEwB,SAAS,gCACJnM,KAAKW,SAASlD,YAAU,CAC3B,eAAgBuC,KAAKW,SAAS3D,wBAEhCoP,YAAapM,KAAKW,SAASjD,mBAAqB,eAAY2D,EAC5DgL,WAAW,I,QAUD,YAAApB,kBAAd,SAAgCpN,G,oIAEa,mBAAlCmC,KAAKW,SAAS/C,gBAArB,MACI,GAAMoC,KAAKW,SAAS/C,gBAAgBC,I,cAApC,W,aACA,SAAMA,EAAS8K,Q,OAAf,W,iBAWN,OAdMtK,EAAM,EAMVR,EAASY,QAAU,KACnBZ,EAASY,QAAU,OACA,IAAlBJ,EAAOA,QAAmBA,EAAOA,SAAW,EAAAE,iBAAiBC,YAE9DwB,KAAKwC,iBAAiB,iBAEtBxC,KAAKwC,iBAAiB,eAEjB,CAAP,EAAOnE,G,QAEX,EAvvCA,G,+GCfA,cAUE,WAAYsM,GAKV,QAAK,YAAE,K,OACP,EAAK2B,WAAa3B,EAAO4B,SACzB,EAAKC,WAAa7B,EAAOrM,WAAa,EAAAmO,eAAe9G,QACrD,EAAK+G,YAAc/B,EAAOgC,YAAc,EAAAC,yBACxC,EAAKnG,WAAa,G,CACpB,CA6DF,OAjF8B,oBAyB5B,YAAAoG,MAAA,SAAMC,GAEJ,QAFI,IAAAA,IAAAA,GAAA,GACJ9M,KAAK+M,cAAe,EAChBD,EACF9M,KAAKyG,WAAa,QAGlB,IAAK,IAAIe,EAAI,EAAGA,EAAIxH,KAAKyG,WAAWZ,OAAQ2B,IAC1CxH,KAAKyG,WAAWe,GAAGqF,OAGzB,EAKA,sBAAI,wBAAS,C,IAAb,WACE,OAAO7M,KAAKsM,UACd,E,IAMA,SAAcU,GACZ,MAAM,IAAIhN,KAAK0M,YAAY1M,KAAKwM,WAClC,E,gCAMA,sBAAI,qBAAM,C,IAAV,WACE,OAAOxM,KAAKyG,WAAWZ,MACzB,E,IAMA,SAAWoH,GACT,MAAM,IAAIjN,KAAK0M,YAAY1M,KAAKwM,WAClC,E,gCAMA,YAAAU,OAAA,WACElN,KAAKmN,YAAa,EAElB,IADA,IAAM9O,EAAiC,CAAC,EAC/BmJ,EAAI,EAAGA,EAAIxH,KAAKyG,WAAWZ,OAAQ2B,IAC1CnJ,EAAOmJ,EAAI,IAAMxH,KAAKyG,WAAWe,GAGnC,cADOxH,KAAKmN,WACL9O,CACT,EACF,EAjFA,CAA8B,EAAA+O,Q,iHCJ9B,0BACE,KAAAD,YAAc,EACJ,KAAAJ,cAAe,CAmC3B,QA5BE,sBAAI,0BAAW,C,IAAf,WACE,OAAO/M,KAAK+M,YACd,E,gCAMA,sBAAI,yBAAU,C,IAAd,WACE,OAAO/M,KAAKqN,WACd,E,gCAKA,YAAA1L,WAAA,WACE3B,KAAK+M,cAAe,CACtB,EAMA,YAAAzK,aAAA,WACEtC,KAAKqN,aAAc,IAAIC,MAAOC,SAChC,EAGF,EArCA,GA0CA,2B,8CAEA,QAF0C,oBAE1C,EAFA,CAA0CH,E,8HCnC1C,cAyBE,WAAYzC,GAUV,QAAK,YAAE,K,OA3BC,EAAA6C,KAAO,GACP,EAAAC,KAAO,GA4Bf,EAAKnB,WAAa3B,EAAO+C,gBAAkB,EAAAC,kBAAkBD,eAC7D,EAAKE,gBAAiBjD,EAAOkD,aAEzB,EAAAC,cAAcD,YAClB,EAAKE,KAAOpD,EAAOqD,KAAsB,KAAfrD,EAAOqD,IAAarD,EAAOqD,IAAM,MAC3D,EAAKC,qBACHtD,EAAOlF,kBAAoB,EAAAgH,eAAeyB,kBAC5C,EAAKC,oBACHxD,EAAOyD,iBAAmB,EAAA3B,eAAe4B,cAC3C,EAAKC,qBACH3D,EAAO4D,kBAAoB,EAAA9B,eAAe+B,mBAC5C,EAAKC,gBAAkB9D,EAAO+D,cAAgB,EAAAZ,cAAca,WAC5D,EAAKC,cAAgBjE,EAAOgC,W,CAC9B,CAiJF,OAnM8B,oBAuD5B,YAAAE,MAAA,WACE7M,KAAK+M,cAAe,CACtB,EAMA,sBAAI,wBAAS,C,IAAb,WACE,OAAO/M,KAAKsM,UACd,E,IAMA,SAAcU,GACZ,MAAM,IAAIhN,KAAK4O,cAAc5O,KAAKiO,qBACpC,E,gCAMA,sBAAI,kBAAG,C,IAAP,WACE,OAAOjO,KAAKwN,IACd,E,IAMA,SAAQqB,KAEJ,IAAAC,kBACED,EACA7O,KAAKyO,gBACLzO,KAAKmO,oBACLnO,KAAK4O,gBAEL5O,KAAK4N,iBACL,IAAAmB,iBACEF,EACA7O,KAAK4N,cACL5N,KAAKsO,qBACLtO,KAAK4O,iBAGT5O,KAAKwN,KAAOqB,EAEhB,E,gCAMA,sBAAI,kBAAG,C,IAAP,WACE,OAAO7O,KAAKyN,IACd,E,IAMA,SAAQuB,KAEJ,IAAAF,kBACEE,EACAhP,KAAKyO,gBACLzO,KAAKmO,oBACLnO,KAAK4O,gBAEL5O,KAAK4N,iBACL,IAAAmB,iBACEC,EACAhP,KAAK4N,cACL5N,KAAKsO,qBACLtO,KAAK4O,iBAGT5O,KAAKyN,KAAOuB,EAEhB,E,gCAMA,sBAAI,kBAAG,C,IAAP,WACE,OAAOhP,KAAK+N,IACd,E,IAMA,SAAQC,KAEJ,IAAAc,kBACEd,EACAhO,KAAKyO,gBACLzO,KAAKmO,oBACLnO,KAAK4O,gBAEL5O,KAAK4N,iBACL,IAAAmB,iBACEf,EACAhO,KAAK4N,cACL5N,KAAKsO,qBACLtO,KAAK4O,iBAGT5O,KAAK+N,KAAOC,EAEhB,E,gCAYA,YAAAd,OAAA,WAKElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbwQ,IAAK7O,KAAK6O,IACVG,IAAKhP,KAAKgP,IACVhB,IAAKhO,KAAKgO,KAGZ,cADOhO,KAAKmN,WACL9O,CACT,EACF,EAnMA,CAA8B,EAAA+O,Q,sBCEvB,SAAS0B,EACdlL,EACAqL,EACA3Q,EACAqO,EACAuC,GAEA,GAAqB,iBAAVtL,EACT,OAAO,EAET,IAAMuL,EAAc,IAAIC,OAAOH,GACzBI,EAAUzL,EAAMkG,MAAMqF,GAC5B,GAAID,GAA8B,KAAVtL,EACtB,OAAO,EAET,QAAcvC,IAAVuC,IAAwByL,GAA0B,KAAfA,EAAQ,GAC7C,MAAM,IAAI1C,EAAWrO,GAEvB,OAAO,CACT,CAWO,SAASyQ,EACdnL,EACA0L,EACAhR,EACAqO,GAEA,IAAM4C,EAASD,EAAajK,MAAM,KAElC,IADAzB,GAAgB,IACH2L,EAAO,GAAI,CACtB,GAAkB,MAAdA,EAAO,IAAc3L,GAAS2L,EAAO,GACvC,OAAO,EAEP,MAAM,IAAI5C,EAAWrO,EAEzB,CACE,MAAM,IAAIqO,EAAWrO,EAEzB,C,uSCTaC,EAAoC,CAC/CC,WAAY,OACZE,YAAa,QACbsC,sBAAuB,EACvBuB,kBAAmB,EACnBW,iBAAkB,GAGPyK,EAAoC,CAE/C6B,aACE,iGACFC,cACE,oHACF/B,eAAgB,cAChBgC,kBAAmB,wBACnBC,oBAAqB,kBACrBC,2BAA4B,UAC5BC,sBAAuB,mDACvBC,4BAA6B,4BAC7BC,sBACE,sFACFC,mBAAoB,CAClB,IAAO,CACLC,aAAc,oBACdC,cACE,kGAEJ,IAAO,CACLD,aAAc,yBACdC,cACE,kGAEJ,IAAO,CACLD,aAAc,+BACdC,cACE,wKAEJ,IAAO,CACLD,aAAc,2CACdC,cACE,kKAEJ,IAAO,CACLD,aAAc,kBACdC,cACE,yEAEJ,IAAO,CACLD,aAAc,wBACdC,cACE,qNAEJ,IAAO,CACLD,aAAc,0CACdC,cACE,4IAEJ,IAAO,CACLD,aAAc,uBACdC,cACE,2EAEJ,IAAO,CACLD,aAAc,wBACdC,cACE,+EAEJ,IAAO,CACLD,aAAc,sBACdC,cACE,uHAEJ,IAAO,CACLD,aAAc,6BACdC,cACE,iIAEJ,IAAO,CACLD,aAAc,wCACdC,cACE,6LAIKC,GAAc,gCACtBxC,GACA,CACD6B,aACE,4GACFM,4BACE,yFACFD,sBACE,wEACFO,8BACE,4IACFC,eAAgB,oBAChBC,yBAA0B,sBAC1BC,eAAgB,0DAIPC,EAA0C,CAErDhB,aACE,uTACFE,kBAAmB,6BACnBhC,eAAgB,qBAChBiC,oBACE,yEACFC,2BAA4B,UAC5BC,sBAAuB,mDACvBC,4BACE,uDACFC,sBACE,uGACFU,kBAAmB,WACnBT,mBAAoB,CAClB,EAAK,CACHC,aAAc,WACdC,cAAe,4DAEjB,IAAO,CACLD,aAAc,oBACdC,cACE,gGAEJ,IAAO,CACLD,aAAc,iCACdC,cAAe,oDAEjB,IAAO,CACLD,aAAc,sBACdC,cACE,oEAEJ,IAAO,CACLD,aAAc,8BACdC,cACE,mEAEJ,IAAO,CACLD,aAAc,8BACdC,cAAe,mDAEjB,IAAO,CACLD,aAAc,oCACdC,cACE,+EAEJ,IAAO,CACLD,aAAc,gCACdC,cACE,kEAEJ,IAAO,CACLD,aAAc,sCACdC,cACE,8EAEJ,IAAO,CACLD,aAAc,kCACdC,cACE,4EAEJ,IAAO,CACLD,aAAc,mCACdC,cACE,8EAEJ,IAAO,CACLD,aAAc,+BACdC,cACE,4EAEJ,IAAO,CACLD,aAAc,+BACdC,cACE,4EAEJ,IAAO,CACLD,aAAc,2BACdC,cACE,0EAEJ,IAAO,CACLD,aAAc,yBACdC,cACE,+JAEJ,IAAO,CACLD,aAAc,sBACdC,cACE,8HAEJ,IAAO,CACLD,aAAc,sBACdC,cACE,8HAEJ,IAAO,CACLD,aAAc,yBACdC,cACE,4HAEJ,IAAO,CACLD,aAAc,+BACdC,cACE,uGAEJ,IAAO,CACLD,aAAc,mCACdC,cACE,yMAEJ,IAAO,CACLD,aAAc,2CACdC,cACE,qLAEJ,IAAO,CACLD,aAAc,kCACdC,cACE,wEAEJ,IAAO,CACLD,aAAc,mCACdC,cACE,4EAEJ,IAAO,CACLD,aAAc,mCACdC,cACE,oHAEJ,IAAO,CACLD,aAAc,wCACdC,cACE,8HAEJ,IAAO,CACLD,aAAc,wCACdC,cACE,4L,qBCrSR,IAAYQ,EAMAC,EAMAC,EAMAzT,E,2JAlBZ,SAAYuT,GACV,oBACA,cACA,eACD,CAJD,CAAYA,IAAAA,EAAU,KAMtB,SAAYC,GACV,kBACA,kBACA,mBACD,CAJD,CAAYA,IAAAA,EAAa,KAMzB,SAAYC,GACV,wBACA,0BACA,mBACD,CAJD,CAAYA,IAAAA,EAAgB,KAM5B,SAAYzT,GACV,aACA,qBACA,mBACA,mBACA,qBACA,kBACD,CAPD,CAAYA,IAAAA,EAAY,I,gKCdX0T,EAA2B,CACtClL,QAAS,IACTmL,sBAAuB,IACvB5O,YAAa,IACbE,WAAY,IACZ2O,oBAAqB,IACrB/N,wBAAyB,IACzBC,qBAAsB,IACtBI,qBAAsB,IACtBC,oBAAqB,IACrBQ,kBAAmB,IACnBC,iBAAkB,IAClBG,mBAAoB,IACpBC,kBAAmB,IACnB6M,eAAgB,IAChB7J,eAAgB,IAChBC,YAAa,IACb6J,oBAAqB,IACrBC,oBAAqB,IACrBC,uBAAwB,IACxBzL,qBAAsB,IACtB0L,sBAAuB,IACvBlK,sBAAuB,IACvBgH,kBAAmB,IACnBlI,kBAAmB,IACnBqL,mBAAoB,IACpBhD,cAAe,IACfG,mBAAoB,IACpB8C,2BAA4B,KAGjB7E,GAAc,gCACtBoE,GAAa,CAChBxN,qBAAsB,IACtBS,kBAAmB,IACnBI,mBAAoB,IACpB8M,eAAgB,IAChB7J,eAAgB,IAChBC,YAAa,IACb1B,qBAAsB,IACtB0L,sBAAuB,IACvBlK,sBAAuB,IACvBgH,kBAAmB,IACnBlI,kBAAmB,IACnBqL,mBAAoB,IACpBhD,cAAe,IACfG,mBAAoB,IACpB8C,2BAA4B,MAGjBC,GAAgB,gCACxBV,GAAa,CAChBC,sBAAuB,IACvB5O,YAAa,IACbE,WAAY,IACZ2O,oBAAqB,IACrB/N,wBAAyB,IACzBwO,sBAAuB,IACvBnO,qBAAsB,IACtBC,oBAAqB,IACrBQ,kBAAmB,IACnBC,iBAAkB,IAClBG,mBAAoB,IACpBC,kBAAmB,IACnB6M,eAAgB,IAChBC,oBAAqB,IACrBC,oBAAqB,IACrBC,uBAAwB,IACxBzL,qBAAsB,IACtB0L,sBAAuB,IACvBlK,sBAAuB,IACvBlB,kBAAmB,IACnBqL,mBAAoB,IACpBhD,cAAe,IACfG,mBAAoB,IACpB8C,2BAA4B,K,2JC/EjBxD,EAAgB,CAC3B2D,aAAc,aACdC,cAAe,cACfC,QAAS,wDACTC,YAAa,oDAEbC,WAAY,SACZC,YAAa,eACbnD,WAAY,6BAEZoD,cAAe,gCACfC,YAAa,aAEbC,SAAU,cAEVC,UAAW,iDACXC,WAAY,+DACZC,QAAS,+BACTC,QACE,+EACFC,UACE,oEACFC,SAAU,wBAEV1E,YAAa,QACb2E,YAAa,SACbC,YAAa,WACbC,gBAAiB,WACjBC,WAAY,QAEDC,GAAa,gCACrB9E,GACA,CACDiE,cAAe,iBAGNc,EAAkB,CAC7BC,aAAc,6BACdC,aAAc,6BACdC,cAAe,8BACfC,cAAe,8BACfC,eAAgB,+BAChBC,QAAS,gDAETC,iBACE,2EAEFC,UAAW,8DAEXC,mBACE,sEAEFC,kBACE,4EAEF5B,QACE,2RACFC,YACE,6HACFC,WAAY,SACZC,YAAa,eACbnD,WAAY,oCACZoD,cAAe,0BACfyB,mBAAoB,0BACpBC,kBACE,yEAEFzB,YAAa,OAEbC,SAAU,cACVyB,cAAe,YAEfC,WAAY,iDACZC,WAAY,4BACZxB,QAAS,qCACTC,QACE,kGACFC,UACE,8EACFC,SACE,8LAEF7B,WAAY,yBACZmD,UAAW,mCAEXC,aAAc,OACdtB,YAAa,MACbC,YAAa,MACbE,WAAY,OACZoB,eAAgB,M,sICnFlB,cACE,WAAYzV,GACV,QAAK,UAACA,EAAU0V,aAAW,K,OAC3B,EAAKxH,WAAalO,EAClB,EAAK2V,KAAO,uB,CACd,CAWF,OAhB8C,oBAa5C,sBAAI,wBAAS,C,IAAb,WACE,OAAOjU,KAAKwM,UACd,E,gCACF,EAhBA,CAA8C1H,OAqB9C,cAUE,WACExG,EACA4V,EACAC,GAEA,QAAK,UAAC7V,IAAU,K,OASD,EAAA8V,iBAA2B,GAR1C,EAAK5L,QAAU0L,EACf,EAAKG,cAAgBH,EACjBC,IACF,EAAKC,iBAAmBD,G,CAE5B,CAoBF,OAxCU,oBA6BR,sBAAI,2BAAY,C,IAAhB,WACE,OAAOnU,KAAKqU,aACd,E,gCAMA,sBAAI,8BAAe,C,IAAnB,WACE,OAAOrU,KAAKoU,gBACd,E,gCACF,EAzCA,CACUxH,E,0lBC5BH,IAAM0H,EAAqB,EACrBC,EAAqB,GACrBC,EAAmB,GAAKD,EACxBE,EAAkB,GAAKD,EAU9BE,EAA4B,CAChCC,EAAGF,EACHG,EAAGJ,EACHK,EAAGN,EACHO,EAAGR,GASE,SAASS,EAAmBC,GAEjC,IAAKA,GAAgBA,GAAgB,EACnC,MAAO,WAGT,IAAMC,EAAQC,KAAKC,MAAMH,EAAeR,GAClCY,EAAU,IAAI9H,KAAoB,IAAf0H,GACnBK,EAAUD,EAAQE,gBAElBC,EAAUH,EAAQI,aAClBC,EAAKT,EAAe,EACtBU,EAAQ,GAYZ,OAVIC,EAAcF,GAAM,IAOtBC,EAAQ,KALNA,EADEC,EAAcF,GAAM,EACdA,EAAGG,QAAQ,GAEX/R,OAAO4R,IAGGpQ,MAAM,KAAK,KAI9B4P,EAAQ,IAAMI,EAAU,IAAME,GAAS7N,QAAQ,UAAW,OAASgO,CAExE,CAQO,SAASG,EAAwBN,GAEtC,IAAKA,GAAWA,GAAW,EACzB,MAAO,OAGT,IAAIO,EAAW,IACXC,EAAYR,EAChB,IAAK,IAAMS,KAAmBtB,EAAc,CAC1C,IAAMuB,EAAkBvB,EAAasB,GACjCpS,EAAQsR,KAAKC,MAAMY,EAAYE,GAG/BN,EAFJI,GAAwBE,GAEO,IAC7BF,EAAY/L,OAAOA,OAAO+L,GAAWH,QAAQ,KAKvB,MAApBI,GAA2BD,EAAY,IACzCnS,GAASmS,GAGPnS,KAECkS,EAASxN,QAAQ,KAAO,GACH,MAApB0N,GACoB,MAApBA,GACoB,MAApBA,KACyB,IAA3BF,EAASxN,QAAQ,OAEjBwN,GAAY,KAGdA,GAAY,UAAGlS,GAAK,OAAGoS,GAE3B,CACA,OAAOF,CACT,CASO,SAASI,EACdC,EACAC,GAQA,GAN0B,iBAAfD,GAAiD,kBAAfA,IAC3CA,EAAatS,OAAOsS,IAEG,iBAAdC,IACTA,EAAY,IAAIhH,OAAOgH,KAEpBD,IAAeA,EAAWrM,MAAMsM,GACnC,OAAO,EAGT,IAAMC,EAAQF,EAAW9Q,MAAM,KAI/B,OAAe,KAHD2E,OAAOqM,EAAM,IAGK,GAFhBrM,OAAOqM,EAAM,IACbrM,OAAOqM,EAAM,GAE/B,CASO,SAASC,EACdR,EACAS,GAMA,GAJ6B,iBAAlBA,IACTA,EAAgB,IAAInH,OAAOmH,KAGxBT,IAAaA,EAAShM,MAAMyM,GAC/B,OAAO,EAGH,MACJ,IAAInH,OAAOmH,GAAeC,KAAKV,IAAa,GADrCW,EAAK,KAAOC,GAAJ,KAAQ,MAAEzB,EAAK,KAAEI,EAAO,KAAEE,EAAO,KAE9ClX,EAAS,EAMb,OALAA,GAAU2L,OAAOuL,IAAY,EAC7BlX,GAA4B,GAAlB2L,OAAOqL,IAAmB,EACpChX,GAA0B,KAAhB2L,OAAOiL,IAAmB,GACpC5W,GAAyB,MAAf2L,OAAO0M,IAA4B,IACnB,QAAhB1M,OAAOyM,IAAmC,EAEtD,CAUO,SAASE,EACdC,EACAC,EACAN,GAEA,IAAMO,EACqB,iBAAlBP,EACH,IAAInH,OAAOmH,GACXA,EACN,OAAOV,EACLS,EAAqBM,EAAOE,GAASR,EAAqBO,EAAQC,GAEtE,CAUO,SAASC,EACdH,EACAC,EACAT,GAKA,MAHyB,iBAAdA,IACTA,EAAY,IAAIhH,OAAOgH,IAElBrB,EACLmB,EAAiBU,EAAOR,GAAaF,EAAiBW,EAAQT,GAElE,CAOO,SAASY,EAAQC,GACtB,IAAM5Y,EAAuB,CAAC,EA8B9B,OAvBA,SAAS6Y,EAAQC,EAAUC,GACzB,GAAItO,OAAOqO,KAASA,EAClB9Y,EAAO+Y,GAAQD,OACV,GAAIlL,MAAMoL,QAAQF,GACvB,IAAK,IAAI3P,EAAI,EAAG8P,EAAIH,EAAItR,OAAQ2B,EAAI8P,EAAG9P,IACrC0P,EAAQC,EAAI3P,GAAI4P,EAAO,IAAM5P,EAAI,KACvB,IAAN8P,IAASjZ,EAAO+Y,GAAQ,QAEzB,CACL,IAAIG,GAAU,EAEd,IAAK,IAAMC,KAAKL,GACV,CAAC,GAAEhZ,eAAeC,KAAK+Y,EAAKK,KAC9BD,GAAU,EACVL,EAAQC,EAAIK,GAAIJ,EAAOA,EAAO,IAAMI,EAAIA,IAIxCD,GAAWH,IAAM/Y,EAAO+Y,GAAQ,CAAC,EACvC,CACF,CAEAF,CAAQD,EAAM,IACP5Y,CACT,CAOO,SAASqL,EAAUuN,GAGxB,GAAInO,OAAOmO,KAAUA,GAAQhL,MAAMoL,QAAQJ,GAAO,OAAOA,EACzD,IAAMH,EAAQ,0BACRzY,EAAuB,CAAC,EAE9B,IAAK,IAAMmZ,KAAKP,EACd,GAAI,CAAC,EAAE9Y,eAAeC,KAAK6Y,EAAMO,GAAI,CAKnC,IAJA,IAAIL,EAAM9Y,EACN+Y,EAAO,GACPK,EAAIX,EAAMN,KAAKgB,GAEZC,GACLN,EAAMA,EAAIC,KAAUD,EAAIC,GAAQK,EAAE,GAAK,GAAK,CAAC,GAC7CL,EAAOK,EAAE,IAAMA,EAAE,GACjBA,EAAIX,EAAMN,KAAKgB,GAGjBL,EAAIC,GAAQH,EAAKO,EACnB,CAGF,OAAOnZ,EAAO,KAAOA,CACvB,CAOO,SAASsX,EAAc+B,GAC5B,OAAIxC,KAAKC,MAAMuC,KAASA,GAAO7T,OAAO6T,GAAKpP,QAAQ,KAAO,EAAU,EACtDoP,EAAI1D,WAAW3O,MAAM,KAAK,GAC3BQ,QAAU,CACzB,CAUO,SAASjD,EACdF,EACA8F,EACA7F,GASA,IAPA,IACIgV,EAAgB,GAIhBC,EALe,IAGnBD,GAAiBjV,GAE0BmD,OAElC2B,EAAI,EAAGA,EAAIoQ,EAAWpQ,IAC7BmQ,GAAiB,IAKnB,GAFAA,GAAiB,KAEbhV,EAAY,CAKdiV,EAJ6B,IAE7BD,GAAiBhV,GAEgCkD,OAEjD,IAAK,IAAIgS,EAAI,EAAGA,EAAID,EAAWC,IAC7BF,GAAiB,GAErB,CAMA,OAJInP,IACFmP,GAAiBnP,GAGZmP,CACT,CASO,SAASzR,EAAc4R,EAAaC,GACzC,OAA8B,QAAvBD,aAAG,EAAHA,EAAKhO,MAAMiO,GACpB,C,smCCjUA,IAAIC,EAAgB,SAASC,EAAGC,GAI9B,OAHAF,EAAgBlP,OAAOqP,gBAClB,CAAEC,UAAW,cAAgBnM,OAAS,SAAUgM,EAAGC,GAAKD,EAAEG,UAAYF,CAAG,GAC1E,SAAUD,EAAGC,GAAK,IAAK,IAAIV,KAAKU,EAAOpP,OAAOuP,UAAUla,eAAeC,KAAK8Z,EAAGV,KAAIS,EAAET,GAAKU,EAAEV,GAAI,EAC7FQ,EAAcC,EAAGC,EAC1B,EAEO,SAASI,EAAUL,EAAGC,GAC3B,GAAiB,mBAANA,GAA0B,OAANA,EAC3B,MAAM,IAAIpX,UAAU,uBAAyB+C,OAAOqU,GAAK,iCAE7D,SAASK,IAAOvY,KAAKmK,YAAc8N,CAAG,CADtCD,EAAcC,EAAGC,GAEjBD,EAAEI,UAAkB,OAANH,EAAapP,OAAO0P,OAAON,IAAMK,EAAGF,UAAYH,EAAEG,UAAW,IAAIE,EACjF,CAEO,IAAIE,EAAW,WAQpB,OAPAA,EAAW3P,OAAO4P,QAAU,SAAkBC,GAC1C,IAAK,IAAIC,EAAGpR,EAAI,EAAGqR,EAAIC,UAAUjT,OAAQ2B,EAAIqR,EAAGrR,IAE5C,IAAK,IAAIgQ,KADToB,EAAIE,UAAUtR,GACOsB,OAAOuP,UAAUla,eAAeC,KAAKwa,EAAGpB,KAAImB,EAAEnB,GAAKoB,EAAEpB,IAE9E,OAAOmB,CACX,EACOF,EAASM,MAAM/Y,KAAM8Y,UAC9B,EAEO,SAASE,EAAOJ,EAAGpV,GACxB,IAAImV,EAAI,CAAC,EACT,IAAK,IAAInB,KAAKoB,EAAO9P,OAAOuP,UAAUla,eAAeC,KAAKwa,EAAGpB,IAAMhU,EAAE8E,QAAQkP,GAAK,IAC9EmB,EAAEnB,GAAKoB,EAAEpB,IACb,GAAS,MAALoB,GAAqD,mBAAjC9P,OAAOmQ,sBACtB,KAAIzR,EAAI,EAAb,IAAgBgQ,EAAI1O,OAAOmQ,sBAAsBL,GAAIpR,EAAIgQ,EAAE3R,OAAQ2B,IAC3DhE,EAAE8E,QAAQkP,EAAEhQ,IAAM,GAAKsB,OAAOuP,UAAUa,qBAAqB9a,KAAKwa,EAAGpB,EAAEhQ,MACvEmR,EAAEnB,EAAEhQ,IAAMoR,EAAEpB,EAAEhQ,IAF4B,CAItD,OAAOmR,CACT,CAEO,SAASQ,EAAWC,EAAYnS,EAAQgC,EAAKoQ,GAClD,IAA2HpB,EAAvH5O,EAAIyP,UAAUjT,OAAQyT,EAAIjQ,EAAI,EAAIpC,EAAkB,OAAToS,EAAgBA,EAAOvQ,OAAOsC,yBAAyBnE,EAAQgC,GAAOoQ,EACrH,GAAuB,iBAAZE,SAAoD,mBAArBA,QAAQC,SAAyBF,EAAIC,QAAQC,SAASJ,EAAYnS,EAAQgC,EAAKoQ,QACpH,IAAK,IAAI7R,EAAI4R,EAAWvT,OAAS,EAAG2B,GAAK,EAAGA,KAASyQ,EAAImB,EAAW5R,MAAI8R,GAAKjQ,EAAI,EAAI4O,EAAEqB,GAAKjQ,EAAI,EAAI4O,EAAEhR,EAAQgC,EAAKqQ,GAAKrB,EAAEhR,EAAQgC,KAASqQ,GAChJ,OAAOjQ,EAAI,GAAKiQ,GAAKxQ,OAAO2Q,eAAexS,EAAQgC,EAAKqQ,GAAIA,CAC9D,CAEO,SAASI,EAAQC,EAAYC,GAClC,OAAO,SAAU3S,EAAQgC,GAAO2Q,EAAU3S,EAAQgC,EAAK0Q,EAAa,CACtE,CAEO,SAASE,EAAaC,EAAMC,EAAcX,EAAYY,EAAWC,EAAcC,GACpF,SAASC,EAAOC,GAAK,QAAU,IAANA,GAA6B,mBAANA,EAAkB,MAAM,IAAItZ,UAAU,qBAAsB,OAAOsZ,CAAG,CAKtH,IAJA,IAGIC,EAHAC,EAAON,EAAUM,KAAMrR,EAAe,WAATqR,EAAoB,MAAiB,WAATA,EAAoB,MAAQ,QACrFrT,GAAU8S,GAAgBD,EAAOE,EAAkB,OAAIF,EAAOA,EAAKzB,UAAY,KAC/EkC,EAAaR,IAAiB9S,EAAS6B,OAAOsC,yBAAyBnE,EAAQ+S,EAAU/F,MAAQ,CAAC,GAC/FuG,GAAO,EACLhT,EAAI4R,EAAWvT,OAAS,EAAG2B,GAAK,EAAGA,IAAK,CAC7C,IAAIiT,EAAU,CAAC,EACf,IAAK,IAAIjD,KAAKwC,EAAWS,EAAQjD,GAAW,WAANA,EAAiB,CAAC,EAAIwC,EAAUxC,GACtE,IAAK,IAAIA,KAAKwC,EAAUU,OAAQD,EAAQC,OAAOlD,GAAKwC,EAAUU,OAAOlD,GACrEiD,EAAQE,eAAiB,SAAUP,GAAK,GAAII,EAAM,MAAM,IAAI1Z,UAAU,0DAA2DoZ,EAAkBrT,KAAKsT,EAAOC,GAAK,MAAQ,EAC5K,IAAI/b,GAAS,EAAI+a,EAAW5R,IAAa,aAAT8S,EAAsB,CAAEM,IAAKL,EAAWK,IAAKC,IAAKN,EAAWM,KAAQN,EAAWtR,GAAMwR,GACtH,GAAa,aAATH,EAAqB,CACrB,QAAe,IAAXjc,EAAmB,SACvB,GAAe,OAAXA,GAAqC,iBAAXA,EAAqB,MAAM,IAAIyC,UAAU,oBACnEuZ,EAAIF,EAAO9b,EAAOuc,QAAML,EAAWK,IAAMP,IACzCA,EAAIF,EAAO9b,EAAOwc,QAAMN,EAAWM,IAAMR,IACzCA,EAAIF,EAAO9b,EAAOyc,QAAOb,EAAac,QAAQV,EACtD,MACSA,EAAIF,EAAO9b,MACH,UAATic,EAAkBL,EAAac,QAAQV,GACtCE,EAAWtR,GAAOoR,EAE/B,CACIpT,GAAQ6B,OAAO2Q,eAAexS,EAAQ+S,EAAU/F,KAAMsG,GAC1DC,GAAO,CACT,CAEO,SAASQ,EAAkBC,EAAShB,EAAcrW,GAEvD,IADA,IAAIsX,EAAWpC,UAAUjT,OAAS,EACzB2B,EAAI,EAAGA,EAAIyS,EAAapU,OAAQ2B,IACrC5D,EAAQsX,EAAWjB,EAAazS,GAAGpJ,KAAK6c,EAASrX,GAASqW,EAAazS,GAAGpJ,KAAK6c,GAEnF,OAAOC,EAAWtX,OAAQ,CAC5B,CAEO,SAASuX,EAAUC,GACxB,MAAoB,iBAANA,EAAiBA,EAAI,GAAGC,OAAOD,EAC/C,CAEO,SAASE,EAAkBlB,EAAGnG,EAAMsH,GAEzC,MADoB,iBAATtH,IAAmBA,EAAOA,EAAKuH,YAAc,IAAIH,OAAOpH,EAAKuH,YAAa,KAAO,IACrF1S,OAAO2Q,eAAeW,EAAG,OAAQ,CAAEqB,cAAc,EAAM7X,MAAO2X,EAAS,GAAGF,OAAOE,EAAQ,IAAKtH,GAAQA,GAC/G,CAEO,SAASyH,EAAWC,EAAaC,GACtC,GAAuB,iBAAZrC,SAAoD,mBAArBA,QAAQsC,SAAyB,OAAOtC,QAAQsC,SAASF,EAAaC,EAClH,CAEO,SAASE,EAAUb,EAASc,EAAYC,EAAGC,GAEhD,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUzY,GAAS,IAAM0Y,EAAKL,EAAUM,KAAK3Y,GAAS,CAAE,MAAOJ,GAAK4Y,EAAO5Y,EAAI,CAAE,CAC1F,SAASgZ,EAAS5Y,GAAS,IAAM0Y,EAAKL,EAAiB,MAAErY,GAAS,CAAE,MAAOJ,GAAK4Y,EAAO5Y,EAAI,CAAE,CAC7F,SAAS8Y,EAAKje,GAJlB,IAAeuF,EAIavF,EAAOmc,KAAO2B,EAAQ9d,EAAOuF,QAJ1CA,EAIyDvF,EAAOuF,MAJhDA,aAAiBoY,EAAIpY,EAAQ,IAAIoY,GAAE,SAAUG,GAAWA,EAAQvY,EAAQ,KAIjBoH,KAAKqR,EAAWG,EAAW,CAC7GF,GAAML,EAAYA,EAAUlD,MAAMkC,EAASc,GAAc,KAAKQ,OAClE,GACF,CAEO,SAASE,EAAYxB,EAASjP,GACnC,IAAsGoO,EAAGsC,EAAG/D,EAAxG0B,EAAI,CAAEsC,MAAO,EAAGC,KAAM,WAAa,GAAW,EAAPjE,EAAE,GAAQ,MAAMA,EAAE,GAAI,OAAOA,EAAE,EAAI,EAAGkE,KAAM,GAAIC,IAAK,IAAeC,EAAIjU,OAAO0P,QAA4B,mBAAbwE,SAA0BA,SAAWlU,QAAQuP,WACtL,OAAO0E,EAAER,KAAOU,EAAK,GAAIF,EAAS,MAAIE,EAAK,GAAIF,EAAU,OAAIE,EAAK,GAAsB,mBAAXC,SAA0BH,EAAEG,OAAOC,UAAY,WAAa,OAAOnd,IAAM,GAAI+c,EAC1J,SAASE,EAAKpE,GAAK,OAAO,SAAUtO,GAAK,OACzC,SAAc6S,GACV,GAAIhD,EAAG,MAAM,IAAItZ,UAAU,mCAC3B,KAAOic,IAAMA,EAAI,EAAGK,EAAG,KAAO/C,EAAI,IAAKA,OACnC,GAAID,EAAI,EAAGsC,IAAM/D,EAAY,EAARyE,EAAG,GAASV,EAAU,OAAIU,EAAG,GAAKV,EAAS,SAAO/D,EAAI+D,EAAU,SAAM/D,EAAEva,KAAKse,GAAI,GAAKA,EAAEH,SAAW5D,EAAIA,EAAEva,KAAKse,EAAGU,EAAG,KAAK5C,KAAM,OAAO7B,EAE3J,OADI+D,EAAI,EAAG/D,IAAGyE,EAAK,CAAS,EAARA,EAAG,GAAQzE,EAAE/U,QACzBwZ,EAAG,IACP,KAAK,EAAG,KAAK,EAAGzE,EAAIyE,EAAI,MACxB,KAAK,EAAc,OAAX/C,EAAEsC,QAAgB,CAAE/Y,MAAOwZ,EAAG,GAAI5C,MAAM,GAChD,KAAK,EAAGH,EAAEsC,QAASD,EAAIU,EAAG,GAAIA,EAAK,CAAC,GAAI,SACxC,KAAK,EAAGA,EAAK/C,EAAEyC,IAAIO,MAAOhD,EAAEwC,KAAKQ,MAAO,SACxC,QACI,MAAkB1E,GAAZA,EAAI0B,EAAEwC,MAAYhX,OAAS,GAAK8S,EAAEA,EAAE9S,OAAS,KAAkB,IAAVuX,EAAG,IAAsB,IAAVA,EAAG,IAAW,CAAE/C,EAAI,EAAG,QAAU,CAC3G,GAAc,IAAV+C,EAAG,MAAczE,GAAMyE,EAAG,GAAKzE,EAAE,IAAMyE,EAAG,GAAKzE,EAAE,IAAM,CAAE0B,EAAEsC,MAAQS,EAAG,GAAI,KAAO,CACrF,GAAc,IAAVA,EAAG,IAAY/C,EAAEsC,MAAQhE,EAAE,GAAI,CAAE0B,EAAEsC,MAAQhE,EAAE,GAAIA,EAAIyE,EAAI,KAAO,CACpE,GAAIzE,GAAK0B,EAAEsC,MAAQhE,EAAE,GAAI,CAAE0B,EAAEsC,MAAQhE,EAAE,GAAI0B,EAAEyC,IAAIjW,KAAKuW,GAAK,KAAO,CAC9DzE,EAAE,IAAI0B,EAAEyC,IAAIO,MAChBhD,EAAEwC,KAAKQ,MAAO,SAEtBD,EAAKpR,EAAK5N,KAAK6c,EAASZ,EAC5B,CAAE,MAAO7W,GAAK4Z,EAAK,CAAC,EAAG5Z,GAAIkZ,EAAI,CAAG,CAAE,QAAUtC,EAAIzB,EAAI,CAAG,CACzD,GAAY,EAARyE,EAAG,GAAQ,MAAMA,EAAG,GAAI,MAAO,CAAExZ,MAAOwZ,EAAG,GAAKA,EAAG,QAAK,EAAQ5C,MAAM,EAC9E,CAtBgD8B,CAAK,CAACzD,EAAGtO,GAAK,CAAG,CAuBnE,CAEO,IAAI+S,EAAkBxU,OAAO0P,OAAS,SAAU+E,EAAG9F,EAAGnN,EAAGkT,QACnDnc,IAAPmc,IAAkBA,EAAKlT,GAC3B,IAAI+O,EAAOvQ,OAAOsC,yBAAyBqM,EAAGnN,GACzC+O,KAAS,QAASA,GAAQ5B,EAAEgG,WAAapE,EAAKqE,UAAYrE,EAAKoC,gBAChEpC,EAAO,CAAEsE,YAAY,EAAM/C,IAAK,WAAa,OAAOnD,EAAEnN,EAAI,IAE9DxB,OAAO2Q,eAAe8D,EAAGC,EAAInE,EAC9B,EAAI,SAAUkE,EAAG9F,EAAGnN,EAAGkT,QACXnc,IAAPmc,IAAkBA,EAAKlT,GAC3BiT,EAAEC,GAAM/F,EAAEnN,EACX,EAEM,SAASsT,EAAanG,EAAG8F,GAC9B,IAAK,IAAI/F,KAAKC,EAAa,YAAND,GAAoB1O,OAAOuP,UAAUla,eAAeC,KAAKmf,EAAG/F,IAAI8F,EAAgBC,EAAG9F,EAAGD,EAC7G,CAEO,SAASqG,EAASN,GACvB,IAAI3E,EAAsB,mBAAXsE,QAAyBA,OAAOC,SAAU1F,EAAImB,GAAK2E,EAAE3E,GAAIpR,EAAI,EAC5E,GAAIiQ,EAAG,OAAOA,EAAErZ,KAAKmf,GACrB,GAAIA,GAAyB,iBAAbA,EAAE1X,OAAqB,MAAO,CAC1C0W,KAAM,WAEF,OADIgB,GAAK/V,GAAK+V,EAAE1X,SAAQ0X,OAAI,GACrB,CAAE3Z,MAAO2Z,GAAKA,EAAE/V,KAAMgT,MAAO+C,EACxC,GAEJ,MAAM,IAAIzc,UAAU8X,EAAI,0BAA4B,kCACtD,CAEO,SAASkF,EAAOP,EAAG1E,GACxB,IAAIpB,EAAsB,mBAAXyF,QAAyBK,EAAEL,OAAOC,UACjD,IAAK1F,EAAG,OAAO8F,EACf,IAAmBjE,EAAY9V,EAA3BgE,EAAIiQ,EAAErZ,KAAKmf,GAAOQ,EAAK,GAC3B,IACI,WAAc,IAANlF,GAAgBA,KAAM,MAAQS,EAAI9R,EAAE+U,QAAQ/B,MAAMuD,EAAGlX,KAAKyS,EAAE1V,MACxE,CACA,MAAO3E,GAASuE,EAAI,CAAEvE,MAAOA,EAAS,CACtC,QACI,IACQqa,IAAMA,EAAEkB,OAAS/C,EAAIjQ,EAAU,SAAIiQ,EAAErZ,KAAKoJ,EAClD,CACA,QAAU,GAAIhE,EAAG,MAAMA,EAAEvE,KAAO,CACpC,CACA,OAAO8e,CACT,CAGO,SAASC,IACd,IAAK,IAAID,EAAK,GAAIvW,EAAI,EAAGA,EAAIsR,UAAUjT,OAAQ2B,IAC3CuW,EAAKA,EAAG1C,OAAOyC,EAAOhF,UAAUtR,KACpC,OAAOuW,CACT,CAGO,SAASE,IACd,IAAK,IAAIrF,EAAI,EAAGpR,EAAI,EAAG0W,EAAKpF,UAAUjT,OAAQ2B,EAAI0W,EAAI1W,IAAKoR,GAAKE,UAAUtR,GAAG3B,OACxE,IAAIyT,EAAIrN,MAAM2M,GAAItO,EAAI,EAA3B,IAA8B9C,EAAI,EAAGA,EAAI0W,EAAI1W,IACzC,IAAK,IAAI4B,EAAI0P,UAAUtR,GAAIqQ,EAAI,EAAGsG,EAAK/U,EAAEvD,OAAQgS,EAAIsG,EAAItG,IAAKvN,IAC1DgP,EAAEhP,GAAKlB,EAAEyO,GACjB,OAAOyB,CACT,CAEO,SAAS8E,EAAcC,EAAIC,EAAMC,GACtC,GAAIA,GAA6B,IAArBzF,UAAUjT,OAAc,IAAK,IAA4BkY,EAAxBvW,EAAI,EAAG8P,EAAIgH,EAAKzY,OAAY2B,EAAI8P,EAAG9P,KACxEuW,GAAQvW,KAAK8W,IACRP,IAAIA,EAAK9R,MAAMoM,UAAUmG,MAAMpgB,KAAKkgB,EAAM,EAAG9W,IAClDuW,EAAGvW,GAAK8W,EAAK9W,IAGrB,OAAO6W,EAAGhD,OAAO0C,GAAM9R,MAAMoM,UAAUmG,MAAMpgB,KAAKkgB,GACpD,CAEO,SAASG,EAAQlU,GACtB,OAAOvK,gBAAgBye,GAAWze,KAAKuK,EAAIA,EAAGvK,MAAQ,IAAIye,EAAQlU,EACpE,CAEO,SAASmU,EAAiBzD,EAASc,EAAYE,GACpD,IAAKiB,OAAOyB,cAAe,MAAM,IAAI7d,UAAU,wCAC/C,IAAoD0G,EAAhDuV,EAAId,EAAUlD,MAAMkC,EAASc,GAAc,IAAQ6C,EAAI,GAC3D,OAAOpX,EAAIsB,OAAO0P,QAAiC,mBAAlBqG,cAA+BA,cAAgB/V,QAAQuP,WAAY4E,EAAK,QAASA,EAAK,SAAUA,EAAK,UACtI,SAAqB7C,GAAK,OAAO,SAAU7P,GAAK,OAAO2R,QAAQC,QAAQ5R,GAAGS,KAAKoP,EAAGgC,EAAS,CAAG,IADgE5U,EAAE0V,OAAOyB,eAAiB,WAAc,OAAO3e,IAAM,EAAGwH,EAEtN,SAASyV,EAAKpE,EAAGuB,GAAS2C,EAAElE,KAAMrR,EAAEqR,GAAK,SAAUtO,GAAK,OAAO,IAAI2R,SAAQ,SAAU9S,EAAG8O,GAAK0G,EAAE/X,KAAK,CAACgS,EAAGtO,EAAGnB,EAAG8O,IAAM,GAAK4G,EAAOjG,EAAGtO,EAAI,GAAI,EAAO6P,IAAG5S,EAAEqR,GAAKuB,EAAE5S,EAAEqR,KAAO,CACvK,SAASiG,EAAOjG,EAAGtO,GAAK,KACV+O,EADqByD,EAAElE,GAAGtO,IACnB3G,iBAAiB6a,EAAUvC,QAAQC,QAAQ7C,EAAE1V,MAAM2G,GAAGS,KAAK+T,EAAS3C,GAAU4C,EAAOJ,EAAE,GAAG,GAAItF,EADtE,CAAE,MAAO9V,GAAKwb,EAAOJ,EAAE,GAAG,GAAIpb,EAAI,CAC/E,IAAc8V,CADmE,CAEjF,SAASyF,EAAQnb,GAASkb,EAAO,OAAQlb,EAAQ,CACjD,SAASwY,EAAOxY,GAASkb,EAAO,QAASlb,EAAQ,CACjD,SAASob,EAAO5E,EAAG7P,GAAS6P,EAAE7P,GAAIqU,EAAEK,QAASL,EAAE/Y,QAAQiZ,EAAOF,EAAE,GAAG,GAAIA,EAAE,GAAG,GAAK,CACnF,CAEO,SAASM,EAAiB3B,GAC/B,IAAI/V,EAAGgQ,EACP,OAAOhQ,EAAI,CAAC,EAAGyV,EAAK,QAASA,EAAK,SAAS,SAAUzZ,GAAK,MAAMA,CAAG,IAAIyZ,EAAK,UAAWzV,EAAE0V,OAAOC,UAAY,WAAc,OAAOnd,IAAM,EAAGwH,EAC1I,SAASyV,EAAKpE,EAAGuB,GAAK5S,EAAEqR,GAAK0E,EAAE1E,GAAK,SAAUtO,GAAK,OAAQiN,GAAKA,GAAK,CAAE5T,MAAO6a,EAAQlB,EAAE1E,GAAGtO,IAAKiQ,MAAM,GAAUJ,EAAIA,EAAE7P,GAAKA,CAAG,EAAI6P,CAAG,CACvI,CAEO,SAAS+E,EAAc5B,GAC5B,IAAKL,OAAOyB,cAAe,MAAM,IAAI7d,UAAU,wCAC/C,IAAiC0G,EAA7BiQ,EAAI8F,EAAEL,OAAOyB,eACjB,OAAOlH,EAAIA,EAAErZ,KAAKmf,IAAMA,EAAqCM,EAASN,GAA2B/V,EAAI,CAAC,EAAGyV,EAAK,QAASA,EAAK,SAAUA,EAAK,UAAWzV,EAAE0V,OAAOyB,eAAiB,WAAc,OAAO3e,IAAM,EAAGwH,GAC9M,SAASyV,EAAKpE,GAAKrR,EAAEqR,GAAK0E,EAAE1E,IAAM,SAAUtO,GAAK,OAAO,IAAI2R,SAAQ,SAAUC,EAASC,IACvF,SAAgBD,EAASC,EAAQnE,EAAG1N,GAAK2R,QAAQC,QAAQ5R,GAAGS,MAAK,SAAST,GAAK4R,EAAQ,CAAEvY,MAAO2G,EAAGiQ,KAAMvC,GAAM,GAAGmE,EAAS,CADb4C,CAAO7C,EAASC,GAA7B7R,EAAIgT,EAAE1E,GAAGtO,IAA8BiQ,KAAMjQ,EAAE3G,MAAQ,GAAI,CAAG,CAEjK,CAEO,SAASwb,EAAqBC,EAAQxQ,GAE3C,OADI/F,OAAO2Q,eAAkB3Q,OAAO2Q,eAAe4F,EAAQ,MAAO,CAAEzb,MAAOiL,IAAiBwQ,EAAOxQ,IAAMA,EAClGwQ,CACT,CAEA,IAAIC,EAAqBxW,OAAO0P,OAAS,SAAU+E,EAAGhT,GACpDzB,OAAO2Q,eAAe8D,EAAG,UAAW,CAAEI,YAAY,EAAM/Z,MAAO2G,GAChE,EAAI,SAASgT,EAAGhT,GACfgT,EAAW,QAAIhT,CACjB,EAEO,SAASgV,EAAaC,GAC3B,GAAIA,GAAOA,EAAI/B,WAAY,OAAO+B,EAClC,IAAInhB,EAAS,CAAC,EACd,GAAW,MAAPmhB,EAAa,IAAK,IAAIlV,KAAKkV,EAAe,YAANlV,GAAmBxB,OAAOuP,UAAUla,eAAeC,KAAKohB,EAAKlV,IAAIgT,EAAgBjf,EAAQmhB,EAAKlV,GAEtI,OADAgV,EAAmBjhB,EAAQmhB,GACpBnhB,CACT,CAEO,SAASohB,EAAgBD,GAC9B,OAAQA,GAAOA,EAAI/B,WAAc+B,EAAM,CAAEE,QAASF,EACpD,CAEO,SAASG,EAAuBC,EAAUC,EAAOvF,EAAMF,GAC5D,GAAa,MAATE,IAAiBF,EAAG,MAAM,IAAItZ,UAAU,iDAC5C,GAAqB,mBAAV+e,EAAuBD,IAAaC,IAAUzF,GAAKyF,EAAMC,IAAIF,GAAW,MAAM,IAAI9e,UAAU,4EACvG,MAAgB,MAATwZ,EAAeF,EAAa,MAATE,EAAeF,EAAEhc,KAAKwhB,GAAYxF,EAAIA,EAAExW,MAAQic,EAAMjF,IAAIgF,EACtF,CAEO,SAASG,EAAuBH,EAAUC,EAAOjc,EAAO0W,EAAMF,GACnE,GAAa,MAATE,EAAc,MAAM,IAAIxZ,UAAU,kCACtC,GAAa,MAATwZ,IAAiBF,EAAG,MAAM,IAAItZ,UAAU,iDAC5C,GAAqB,mBAAV+e,EAAuBD,IAAaC,IAAUzF,GAAKyF,EAAMC,IAAIF,GAAW,MAAM,IAAI9e,UAAU,2EACvG,MAAiB,MAATwZ,EAAeF,EAAEhc,KAAKwhB,EAAUhc,GAASwW,EAAIA,EAAExW,MAAQA,EAAQic,EAAMhF,IAAI+E,EAAUhc,GAASA,CACtG,CAEO,SAASoc,EAAsBH,EAAOD,GAC3C,GAAiB,OAAbA,GAA0C,iBAAbA,GAA6C,mBAAbA,EAA0B,MAAM,IAAI9e,UAAU,0CAC/G,MAAwB,mBAAV+e,EAAuBD,IAAaC,EAAQA,EAAMC,IAAIF,EACtE,CAEO,SAASK,EAAwBC,EAAKtc,EAAOuc,GAClD,GAAIvc,QAAoC,CACtC,GAAqB,iBAAVA,GAAuC,mBAAVA,EAAsB,MAAM,IAAI9C,UAAU,oBAClF,IAAIsf,EAASC,EACb,GAAIF,EAAO,CACT,IAAKjD,OAAOoD,aAAc,MAAM,IAAIxf,UAAU,uCAC9Csf,EAAUxc,EAAMsZ,OAAOoD,aACzB,CACA,QAAgB,IAAZF,EAAoB,CACtB,IAAKlD,OAAOkD,QAAS,MAAM,IAAItf,UAAU,kCACzCsf,EAAUxc,EAAMsZ,OAAOkD,SACnBD,IAAOE,EAAQD,EACrB,CACA,GAAuB,mBAAZA,EAAwB,MAAM,IAAItf,UAAU,0BACnDuf,IAAOD,EAAU,WAAa,IAAMC,EAAMjiB,KAAK4B,KAAO,CAAE,MAAOwD,GAAK,OAAO0Y,QAAQE,OAAO5Y,EAAI,CAAE,GACpG0c,EAAIK,MAAM1Z,KAAK,CAAEjD,MAAOA,EAAOwc,QAASA,EAASD,MAAOA,GAC1D,MACSA,GACPD,EAAIK,MAAM1Z,KAAK,CAAEsZ,OAAO,IAE1B,OAAOvc,CACT,CAEA,IAAI4c,EAA8C,mBAApBC,gBAAiCA,gBAAkB,SAAUxhB,EAAOyhB,EAAYlY,GAC5G,IAAIhF,EAAI,IAAIsB,MAAM0D,GAClB,OAAOhF,EAAEyQ,KAAO,kBAAmBzQ,EAAEvE,MAAQA,EAAOuE,EAAEkd,WAAaA,EAAYld,CACjF,EAEO,SAASmd,EAAmBT,GACjC,SAASU,EAAKpd,GACZ0c,EAAIjhB,MAAQihB,EAAIW,SAAW,IAAIL,EAAiBhd,EAAG0c,EAAIjhB,MAAO,4CAA8CuE,EAC5G0c,EAAIW,UAAW,CACjB,CACA,IAAIvH,EAAGV,EAAI,EAkBX,OAjBA,SAAS2D,IACP,KAAOjD,EAAI4G,EAAIK,MAAMlD,OACnB,IACE,IAAK/D,EAAE6G,OAAe,IAANvH,EAAS,OAAOA,EAAI,EAAGsH,EAAIK,MAAM1Z,KAAKyS,GAAI4C,QAAQC,UAAUnR,KAAKuR,GACjF,GAAIjD,EAAE8G,QAAS,CACb,IAAI/hB,EAASib,EAAE8G,QAAQhiB,KAAKkb,EAAE1V,OAC9B,GAAI0V,EAAE6G,MAAO,OAAOvH,GAAK,EAAGsD,QAAQC,QAAQ9d,GAAQ2M,KAAKuR,GAAM,SAAS/Y,GAAc,OAATod,EAAKpd,GAAW+Y,GAAQ,GACvG,MACK3D,GAAK,CACZ,CACA,MAAOpV,GACLod,EAAKpd,EACP,CAEF,GAAU,IAANoV,EAAS,OAAOsH,EAAIW,SAAW3E,QAAQE,OAAO8D,EAAIjhB,OAASid,QAAQC,UACvE,GAAI+D,EAAIW,SAAU,MAAMX,EAAIjhB,KAC9B,CACOsd,EACT,CAEA,WACEjE,YACAG,WACAO,SACAG,aACAO,UACAgC,aACAI,YACAW,cACAa,kBACAM,eACAC,WACAC,SACAE,WACAC,iBACAG,gBACAK,UACAC,mBACAQ,mBACAC,gBACAC,uBACAG,eACAE,kBACAE,yBACAI,yBACAC,wBACAC,0BACAU,qB,GCvXEG,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB3f,IAAjB4f,EACH,OAAOA,EAAaC,QAGrB,IAAIC,EAASL,EAAyBE,GAAY,CAGjDE,QAAS,CAAC,GAOX,OAHAE,EAAoBJ,GAAUG,EAAQA,EAAOD,QAASH,GAG/CI,EAAOD,OACf,CCrBAH,EAAoB9I,EAAI,SAASiJ,EAASG,GACzC,IAAI,IAAIpY,KAAOoY,EACXN,EAAoBxD,EAAE8D,EAAYpY,KAAS8X,EAAoBxD,EAAE2D,EAASjY,IAC5EH,OAAO2Q,eAAeyH,EAASjY,EAAK,CAAE0U,YAAY,EAAM/C,IAAKyG,EAAWpY,IAG3E,ECPA8X,EAAoBxD,EAAI,SAASzV,EAAKsP,GAAQ,OAAOtO,OAAOuP,UAAUla,eAAeC,KAAK0J,EAAKsP,EAAO,ECCtG2J,EAAoBzH,EAAI,SAAS4H,GACX,oBAAXhE,QAA0BA,OAAOoE,aAC1CxY,OAAO2Q,eAAeyH,EAAShE,OAAOoE,YAAa,CAAE1d,MAAO,WAE7DkF,OAAO2Q,eAAeyH,EAAS,aAAc,CAAEtd,OAAO,GACvD,E,sHCHM2N,EAAmB,EAAAf,oBAAoBR,mBAK7C,cAKE,WAAY1R,G,MACN,CAAC,EAAEH,eAAeC,KAAKmT,EAAkB1N,OAAOvF,IAClD,EAAK,UACHA,EACAiT,EAAiB1N,OAAOvF,IAAY2R,aACpCsB,EAAiB1N,OAAOvF,IAAY4R,gBACrC,KAED,EAAK,UACH,IACAqB,EAAiB,KAAOtB,aACxBsB,EAAiB,KAAOrB,gBACzB,IAEL,CACF,OApB8C,oBAoB9C,EApBA,CAA8C,EAAA5E,iB,2BCGvC,SAASiW,EACd3d,EACAqL,EACAC,GAEA,OAAO,IAAAJ,kBACLlL,EACAqL,EACA,EAAAsC,iBAAiBlD,cACjBmT,EACAtS,EAEJ,CAQO,SAASuS,EACd7d,EACA0L,GAEA,OAAO,IAAAP,iBACLnL,EACA0L,EACA,EAAAiC,iBAAiB/C,mBACjBgT,EAEJ,CC/BA,kBAUE,aACE,QAAK,YAAE,K,OAVD,EAAAlV,WAAa,EAAAkE,oBAAoBV,4BACjC,EAAA4R,aAAe,IACf,EAAAC,UAAY,GACZ,EAAAC,gBAAkB,IAClB,EAAAC,kBAAoB,I,CAO5B,CAwIF,OApJ0C,oBAiB/B,YAAAhV,MAAT,WACE7M,KAAK+M,cAAe,CACtB,EAOA,sBAAI,wBAAS,C,IAAb,WACE,OAAO/M,KAAKsM,UACd,E,IAOA,SAAcU,GACZ,MAAM,IAAIwU,EAAyB,EAAAjQ,iBAAiBvL,kBACtD,E,gCAMA,sBAAI,0BAAW,C,IAAf,WACE,OAAOhG,KAAK0hB,YACd,E,IAMA,SAAgBI,GAEZP,EAAqBO,EAAa,EAAAjP,gBAAgBlE,aAClD8S,EAAoBK,EAAa,EAAAjP,gBAAgBL,eAEjDxS,KAAK0hB,aAAeI,EAExB,E,gCAMA,sBAAI,uBAAQ,C,IAAZ,WACE,OAAO9hB,KAAK2hB,SACd,E,IAMA,SAAaI,GACPR,EAAqBQ,EAAU,EAAAlP,gBAAgBM,WACjDnT,KAAK2hB,UAAYI,EAErB,E,gCAMA,sBAAI,6BAAc,C,IAAlB,WACE,OAAO/hB,KAAK4hB,eACd,E,IAMA,SAAmBI,GAEfT,EAAqBS,EAAgB,EAAAnP,gBAAgBlE,aACrD8S,EAAoBO,EAAgB,EAAAnP,gBAAgBJ,eAEpDzS,KAAK4hB,gBAAkBI,EAE3B,E,gCAMA,sBAAI,+BAAgB,C,IAApB,WACE,OAAOhiB,KAAK6hB,iBACd,E,IAMA,SAAqBI,GAEjBV,EAAqBU,EAAkB,EAAApP,gBAAgBf,cACvD2P,EAAoBQ,EAAkB,EAAApP,gBAAgBF,cAEtD3S,KAAK6hB,kBAAoBI,EAE7B,E,gCAcA,YAAA/U,OAAA,WAMElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbyjB,YAAa9hB,KAAK8hB,YAClBC,SAAU/hB,KAAK+hB,SACfC,eAAgBhiB,KAAKgiB,eACrBC,iBAAkBjiB,KAAKiiB,kBAGzB,cADOjiB,KAAKmN,WACL9O,CACT,EACF,EApJA,CAA0C,EAAA+O,S,SCR7B8U,EAA8B,CACzC,aAAc,CACZC,OAAQ,iBACRnU,IAAK,EACLoU,UAAW,GACXC,QAAQ,GAEVC,OAAQ,CACNH,OAAQ,EAAAtP,gBAAgBY,kBACxBzF,IAAK,GACLoU,UAAW,MACXC,QAAQ,GAEV,UAAW,CACTF,OAAQ,EAAAtP,gBAAgBO,iBACxBpF,IAAK,GACLoU,UAAW,MACXC,QAAQ,GAEV,eAAgB,CACdF,OAAQ,EAAAtP,gBAAgBU,kBACxBvF,IAAK,EACLoU,UAAW,GACXC,QAAQ,GAEVE,SAAU,CACRJ,OAAQ,EAAAtP,gBAAgBW,mBACxBgP,QAAS,EAAA3P,gBAAgBW,mBACzBxF,IAAK,GACLoU,UAAW,MACXK,WAAY,MACZJ,QAAQ,GAEVK,YAAa,CACXP,OAAQ,MAAQ,EAAAtP,gBAAgBW,mBAChCgP,QACE,EAAA3P,gBAAgBlE,WAAa,OAAS,EAAAkE,gBAAgBW,mBACxDxF,IAAK,IACLoU,UAAW,MACXK,WAAY,MACZJ,QAAQ,GAEVM,WAAY,CACVR,OAAQ,EAAAtP,gBAAgBW,mBACxBxF,IAAK,GACLoU,UAAW,MACXC,QAAQ,GAEVO,OAAQ,CACNT,OAAQ,EAAAtP,gBAAgBW,mBACxBxF,IAAK,EACLoU,UAAW,GACXC,QAAQ,GAEVQ,QAAS,CACPV,OAAQ,EAAAtP,gBAAgBlE,WACxBX,IAAK,EACLoU,UAAW,GACXC,QAAQ,GAEVS,MAAO,CACLX,OAAQ,EAAAtP,gBAAgBI,cACxBjF,IAAK,EACLoU,UAAW,GACXC,QAAQ,IAGCU,EAA8B,CACzC,aAAc,CACZ/U,IAAK,EACLoU,UAAW,GACXC,QAAQ,EACRW,WAAW,EACXb,OAAQ,iBACRc,MAAO,GAETX,OAAQ,CACNtU,IAAK,GACLoU,UAAW,MACXC,QAAQ,EACRW,WAAW,EACXb,OAAQ,EAAAtP,gBAAgBY,mBAE1B,UAAW,CACTzF,IAAK,GACLoU,UAAW,MACXC,QAAQ,EACRW,WAAW,EACXb,OAAQ,EAAAtP,gBAAgBS,oBAE1B,eAAgB,CACdtF,IAAK,EACLoU,UAAW,GACXC,QAAQ,EACRW,WAAW,EACXb,OAAQ,EAAAtP,gBAAgBU,mBAE1BgP,SAAU,CACRvU,IAAK,GACLoU,UAAW,MACXK,WAAY,MACZJ,QAAQ,EACRW,WAAW,EACXb,OAAQ,EAAAtP,gBAAgBW,mBACxBgP,QAAS,EAAA3P,gBAAgBW,oBAE3BkP,YAAa,CACX1U,IAAK,IACLoU,UAAW,MACXK,WAAY,MACZS,WAAY,MACZb,QAAQ,EACRW,WAAW,EACXb,OAAQ,MAAQ,EAAAtP,gBAAgBW,mBAChCgP,QACE,EAAA3P,gBAAgBlE,WAAa,OAAS,EAAAkE,gBAAgBW,oBAE1DmP,WAAY,CACV3U,IAAK,GACLoU,UAAW,MACXC,QAAQ,EACRW,WAAW,EACXb,OAAQ,EAAAtP,gBAAgBW,oBAE1BoP,OAAQ,CACN5U,IAAK,EACLoU,UAAW,GACXC,QAAQ,EACRW,WAAW,EACXb,OAAQ,EAAAtP,gBAAgBW,mBACxByP,MAAO,GAETJ,QAAS,CACP7U,IAAK,EACLoU,UAAW,MACXC,QAAQ,EACRW,WAAW,EACXb,OAAQ,EAAAtP,gBAAgBlE,WACxBsU,MAAO,GAETH,MAAO,CACL9U,IAAK,EACLoU,UAAW,GACXC,QAAQ,EACRW,WAAW,EACXb,OAAQ,EAAAtP,gBAAgBI,cACxBgQ,MAAO,ICxIX,cAIE,aACE,SAAK,UAAC,CACJ1W,SAAU,EAAAiE,oBAAoBT,sBAC9BzR,UAAW,EAAAiT,iBAAiBvL,kBAC5B2G,WAAY6U,KACZ,IACJ,CACF,OAXqC,oBAWrC,EAXA,CAAqC,EAAApb,UAiBrC,cAaE,aACE,QAAK,YAAE,K,OAbD,EAAA+c,IAAM,GACN,EAAAC,MAAQ,GACR,EAAAC,WAAa,GACb,EAAAC,WAAa,GACb,EAAAC,kBAAoB,GACpB,EAAAC,QAAU,GACV,EAAAC,SAAW,GACX,EAAAC,aAAe,GAOrB,EAAKC,WAAa,IAAI,EAAAvd,SAAS,CAC7B9H,UAAW,EAAAiT,iBAAiBvL,kBAC5B2G,WAAY6U,EACZjV,SAAU,EAAAiE,oBAAoBb,sBAEhC,EAAKiU,kBAAoB,IAAI,EAAAxd,SAAS,CACpC9H,UAAW,EAAAiT,iBAAiBvL,kBAC5B2G,WAAY6U,EACZjV,SAAU,EAAAiE,oBAAoBZ,6B,CAElC,CA8UF,OAvW2C,oBAiChC,YAAAjO,WAAT,W,QACE,YAAMA,WAAU,WACD,QAAf,EAAA3B,KAAK2jB,kBAAU,SAAEhiB,aACK,QAAtB,EAAA3B,KAAK4jB,yBAAiB,SAAEjiB,YAC1B,EAKS,YAAAkL,MAAT,WACE7M,KAAK+M,cAAe,EACpB/M,KAAKmjB,IAAM,GACXnjB,KAAKojB,MAAQ,GACbpjB,KAAKqjB,WAAa,GAClBrjB,KAAKsjB,WAAa,GAClBtjB,KAAKujB,kBAAoB,GACzBvjB,KAAKwjB,QAAU,GACfxjB,KAAKyjB,SAAW,GAChBzjB,KAAK0jB,aAAe,GACpB1jB,KAAK2jB,WAAa,IAAI,EAAAvd,SAAS,CAC7B9H,UAAW,EAAAiT,iBAAiBvL,kBAC5B2G,WAAY6U,EACZjV,SAAU,EAAAiE,oBAAoBb,sBAEhC3P,KAAK4jB,kBAAoB,IAAI,EAAAxd,SAAS,CACpC9H,UAAW,EAAAiT,iBAAiBvL,kBAC5B2G,WAAY6U,EACZjV,SAAU,EAAAiE,oBAAoBZ,4BAElC,EAMA,sBAAI,iBAAE,C,IAAN,WACE,OAAO5P,KAAKmjB,GACd,E,IAMA,SAAOU,GACDtC,EAAqBsC,EAAI,EAAAhR,gBAAgBY,qBAC3CzT,KAAKmjB,IAAMU,EAEf,E,gCAMA,sBAAI,mBAAI,C,IAAR,WACE,OAAO7jB,KAAKojB,KACd,E,IAMA,SAASU,GACP,GAAI9jB,KAAK4G,aAA4B,KAAb5G,KAAKmjB,IAC3B,MAAM,IAAI3B,EACR,EAAAjQ,iBAAiBD,4BAGfiQ,EAAqBuC,EAAM,EAAAjR,gBAAgBR,WAC7CrS,KAAKojB,MAAQU,EAGnB,E,gCAMA,sBAAI,wBAAS,C,IAAb,WACE,OAAO9jB,KAAKqjB,UACd,E,IAMA,SAAcU,GACZ,GAAI/jB,KAAK4G,aAA4B,KAAb5G,KAAKmjB,IAC3B,MAAM,IAAI3B,EACR,EAAAjQ,iBAAiBD,4BAGfiQ,EAAqBwC,EAAW,EAAAlR,gBAAgBlB,WAClD3R,KAAKqjB,WAAaU,EAGxB,E,gCAMA,sBAAI,wBAAS,C,IAAb,WACE,OAAO/jB,KAAKsjB,UACd,E,IAMA,SAAcU,GACZ,GAAIhkB,KAAK4G,aAA4B,KAAb5G,KAAKmjB,IAC3B,MAAM,IAAI3B,EACR,EAAAjQ,iBAAiBD,4BAGfiQ,EAAqByC,EAAW,EAAAnR,gBAAgBlE,cAClD3O,KAAKsjB,WAAaU,EAGxB,E,gCAMA,sBAAI,+BAAgB,C,IAApB,WACE,OAAOhkB,KAAKujB,iBACd,E,IAOA,SAAqBU,GACnB,GAAIjkB,KAAK4G,cAA+B,KAAf5G,KAAKojB,OAA6B,KAAbpjB,KAAKmjB,KACjD,MAAM,IAAI3B,EACR,EAAAjQ,iBAAiBD,4BAGnB,IAAI4S,EAAQ,GACNC,EAAgBjC,EAAiBliB,KAAK8jB,MAE5C,IAAIK,EA4DF,MAAM,IAAI3C,EAAyB,EAAAjQ,iBAAiBlD,eArDpD,IANI8V,aAAa,EAAbA,EAAe/B,WACjB8B,EAAQD,EAAiB5e,MAAM8e,EAAc/B,WAE7C8B,EAAM,GAAKD,IAGTC,EAAMre,OAAS,GAAKqe,EAAMre,QAAUse,EAAcnW,KA8CpD,MAAM,IAAIwT,EACR,EAAAjQ,iBAAiBL,qBA5CnB,IAFA,IAAM/B,EAAc,IAAIC,OAAO+U,EAAchC,QAEpC3a,EAAI,EAAGA,EAAI0c,EAAMre,OAAQ2B,IAChC,GAAI2c,aAAa,EAAbA,EAAe1B,WAAY,CAC7B,IAAM2B,EAASF,EAAM1c,GAAGnC,MAAM8e,EAAc1B,YAE5C,GAAsB,IAAlB2B,EAAOve,OAgBT,MAAM,IAAI2b,EACR,EAAAjQ,iBAAiBlD,eAhBnB,IAAK+V,EAAO,GAAGta,MAAMqF,GACnB,MAAM,IAAIqS,EACR,EAAAjQ,iBAAiBlD,eAGnB,IACG8V,EAAc3B,UACd4B,EAAO,GAAGta,MAAM,IAAIsF,OAAO+U,EAAc3B,UAE1C,MAAM,IAAIhB,EACR,EAAAjQ,iBAAiBlD,cAS3B,KAAO,CACL,IAAK6V,EAAM1c,GAAGsC,MAAMqF,GAClB,MAAM,IAAIqS,EACR,EAAAjQ,iBAAiBlD,eAGnB,GAAiB,KAAb6V,EAAM1c,IAAa2c,EAAc9B,OACnC,IAAK,IAAIxK,EAAI,EAAGA,EAAIrQ,EAAGqQ,IACrB,GAAIqM,EAAM1c,KAAO0c,EAAMrM,GACrB,MAAM,IAAI2J,EACR,EAAAjQ,iBAAiBlD,cAM7B,CAQJrO,KAAKujB,kBAAoBU,CAK/B,E,gCAMA,sBAAI,qBAAM,C,IAAV,WACE,OAAOjkB,KAAKwjB,OACd,E,IAMA,SAAWnlB,GACLkjB,EAAqBljB,EAAQ,EAAAwU,gBAAgBP,aAC/CtS,KAAKwjB,QAAUnlB,EAEnB,E,gCAMA,sBAAI,sBAAO,C,IAAX,WACE,OAAO2B,KAAKyjB,QACd,E,IAMA,SAAYY,GACV,GAAIrkB,KAAK4G,aAA4B,KAAb5G,KAAKmjB,IAC3B,MAAM,IAAI3B,EACR,EAAAjQ,iBAAiBD,4BAGfiQ,EAAqB8C,EAAS,EAAAxR,gBAAgBjB,eAChD5R,KAAKyjB,SAAWY,EAGtB,E,gCAMA,sBAAI,0BAAW,C,IAAf,WACE,OAAOrkB,KAAK0jB,YACd,E,IAMA,SAAgBlI,GACd,GAAIxb,KAAK4G,aAA4B,KAAb5G,KAAKmjB,IAC3B,MAAM,IAAI3B,EACR,EAAAjQ,iBAAiBD,4BAIjBiQ,EACE/F,EACA,EAAA3I,gBAAgBO,kBAChB,KAGFpT,KAAK0jB,aAAelI,EAG1B,E,gCAoBA,YAAAtO,OAAA,WAYElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbwlB,GAAI7jB,KAAK6jB,GACTC,KAAM9jB,KAAK8jB,KACXH,WAAY3jB,KAAK2jB,WACjBI,UAAW/jB,KAAK+jB,UAChBC,UAAWhkB,KAAKgkB,UAChBC,iBAAkBjkB,KAAKikB,iBACvB5lB,OAAQ2B,KAAK3B,OACbgmB,QAASrkB,KAAKqkB,QACd7I,YAAaxb,KAAKwb,YAClBoI,kBAAmB5jB,KAAK4jB,mBAG1B,cADO5jB,KAAKmN,WACL9O,CACT,EACF,EAvWA,CAA2C,EAAA+O,SA4W3C,cAME,aACE,QAAK,YAAE,K,OAND,EAAA+V,IAAM,G,CAOd,CA8CF,OAtDqD,oBAa1C,YAAAtW,MAAT,WACE7M,KAAK+M,cAAe,EACpB/M,KAAKmjB,IAAM,EACb,EAMA,sBAAI,iBAAE,C,IAAN,WACE,OAAOnjB,KAAKmjB,GACd,E,IAMA,SAAOU,GACDtC,EAAqBsC,EAAI,EAAAhR,gBAAgBY,qBAC3CzT,KAAKmjB,IAAMU,EAEf,E,gCAUA,YAAA3W,OAAA,WAGElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbwlB,GAAI7jB,KAAK6jB,IAGX,cADO7jB,KAAKmN,WACL9O,CACT,EACF,EAtDA,CAAqD,EAAA+O,SA2DrD,cAME,aACE,QAAK,YAAE,K,OAND,EAAAkX,SAAW,G,CAOnB,CA8CF,OAtD2D,oBAahD,YAAAzX,MAAT,WACE7M,KAAK+M,cAAe,EACpB/M,KAAKskB,SAAW,EAClB,EAMA,sBAAI,sBAAO,C,IAAX,WACE,OAAOtkB,KAAKskB,QACd,E,IAMA,SAAYC,GACNhD,EAAqBgD,EAAS,EAAA1R,gBAAgBb,eAChDhS,KAAKskB,SAAWC,EAEpB,E,gCAUA,YAAArX,OAAA,WAGElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbkmB,QAASvkB,KAAKukB,SAGhB,cADOvkB,KAAKmN,WACL9O,CACT,EACF,EAtDA,CAA2D,EAAA+O,SC1b3D,cAME,aACE,QAAK,UAAC,CACJM,eAAgB,EAAA8C,oBAAoB9C,eACpCM,IAAK,GACLvI,iBAAkB,EAAA8L,iBAAiBvL,kBACnCoI,gBAAiB,EAAAmD,iBAAiBlD,cAClCE,iBAAkB,EAAAgD,iBAAiB/C,mBACnCE,aAAc,EAAAmE,gBAAgBlE,WAC9BhC,WAAY6U,KACZ,K,OAdI,EAAAgD,QAAU,G,CAelB,CA8DF,OA9EuC,oBAqB5B,YAAA3X,MAAT,WACE7M,KAAK+M,cAAe,EACpB/M,KAAKwkB,QAAU,GACfxkB,KAAKwN,KAAO,GACZxN,KAAKyN,KAAO,GACZzN,KAAK+N,KAAO,EACd,EAMA,sBAAI,qBAAM,C,IAAV,WACE,OAAO/N,KAAKwkB,OACd,E,IAMA,SAAWC,GAEPlD,EAAqBkD,EAAQ,EAAA5R,gBAAgBlE,aAC7C8S,EAAoBgD,EAAQ,EAAA5R,gBAAgBiB,gBAE5C9T,KAAKwkB,QAAUC,EAEnB,E,gCAcS,YAAAvX,OAAT,WAMElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbomB,OAAQzkB,KAAKykB,OACb5V,IAAK7O,KAAK6O,IACVG,IAAKhP,KAAKgP,IACVhB,IAAKhO,KAAKgO,KAGZ,cADOhO,KAAKmN,WACL9O,CACT,EACF,EA9EA,C,OAAuCqmB,UCEvC,cAIE,aACE,SAAK,UAAC,CACJnY,SAAU,EAAAiE,oBAAoBd,kBAC9BpR,UAAW,EAAAiT,iBAAiBvL,kBAC5B2G,WAAY6U,KACZ,IACJ,CACF,OAXwC,oBAWxC,EAXA,CAAwC,EAAApb,UAiBxC,cAIE,aACE,SAAK,UAAC,CACJmG,SAAU,EAAAiE,oBAAoBd,kBAC9BpR,UAAW,EAAAiT,iBAAiBvL,kBAC5B2G,WAAY6U,KACZ,IACJ,CACF,OAX4C,oBAW5C,EAXA,CAA4C,EAAApb,UAiB5C,cAUE,WAAYue,QAAA,IAAAA,IAAAA,GAAA,GACV,QAAK,YAAE,K,OAVD,EAAAC,SAAW,GACX,EAAAC,UAAY,GACZ,EAAAxB,WAAa,GASnB,EAAKuB,SAAW,GAChB,EAAKC,UAAY,GACjB,EAAKxB,WAAa,GAClB,EAAKyB,mBAAqBH,E,CAC5B,CAqGF,OArHuC,oBAqBrC,YAAA9X,MAAA,WACE7M,KAAK+M,cAAe,CACtB,EAMA,sBAAI,sBAAO,C,IAAX,WACE,OAAO/M,KAAK4kB,QACd,E,IAMA,SAAYG,GACV,GAAI/kB,KAAK4G,aAAe5G,KAAK8kB,mBAC3B,MAAM,IAAItD,EAAyB,EAAAjQ,iBAAiBvL,mBAGlDub,EAAqBwD,EAAS,EAAAlS,gBAAgBU,mBAAmB,KAEjEvT,KAAK4kB,SAAWG,EAGtB,E,gCAMA,sBAAI,uBAAQ,C,IAAZ,WACE,OAAO/kB,KAAK6kB,SACd,E,IAMA,SAAaG,GACX,GAAIhlB,KAAK4G,aAAe5G,KAAK8kB,mBAC3B,MAAM,IAAItD,EAAyB,EAAAjQ,iBAAiBvL,mBAEhDub,EAAqByD,EAAU,EAAAnS,gBAAgBE,gBACjD/S,KAAK6kB,UAAYG,EAGvB,E,gCAMA,sBAAI,wBAAS,C,IAAb,WACE,OAAOhlB,KAAKqjB,UACd,E,IAMA,SAAcU,GACZ,GAAI/jB,KAAK4G,aAAe5G,KAAK8kB,mBAC3B,MAAM,IAAItD,EAAyB,EAAAjQ,iBAAiBvL,mBAEhDub,EAAqBwC,EAAW,EAAAlR,gBAAgBlB,WAClD3R,KAAKqjB,WAAaU,EAGxB,E,gCAYA,YAAA7W,OAAA,WAKElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACb0mB,QAAS/kB,KAAK+kB,QACdC,SAAUhlB,KAAKglB,SACfjB,UAAW/jB,KAAK+jB,WAGlB,cADO/jB,KAAKmN,WACL9O,CACT,EACF,EArHA,CAAuC,EAAA+O,SCjCvC,cAIE,aACE,SAAK,UAAC,CACJb,SAAU,EAAAiE,oBAAoBb,oBAC9BrR,UAAW,EAAAiT,iBAAiBvL,kBAC5B2G,WAAY6U,KACZ,IACJ,CAsBF,OAhCmC,oBAe1B,YAAAyD,kBAAP,SAAyBpB,GACvB,OAAO7jB,KAAKyG,WAAWye,MAAK,SAACC,GAAc,OAAAA,EAAUtB,KAAOA,CAAjB,GAC7C,EAKO,YAAAuB,qBAAP,SAA4B/e,GAC1B,OAAOrG,KAAKyG,WAAWJ,EACzB,EAKO,YAAAgf,oBAAP,SAA2Bhf,EAAe8e,GACxCnlB,KAAKyG,WAAWJ,GAAS8e,CAC3B,EACF,EAhCA,CAAmC,EAAA/e,UAqCnC,cAUE,aACE,QAAK,YAAE,K,OAVD,EAAA+c,IAAM,GACN,EAAAmC,gBAAkB,UAClB,EAAAC,mBAAqB,UACrB,EAAAC,kBAAoB,GACpB,EAAA9B,aAAe,GAOrB,EAAK+B,MAAQ,IAAIC,E,CACnB,CA6KF,OA1LyC,oBAe9B,YAAA7Y,MAAT,WACE7M,KAAK+M,cAAe,CACtB,EAOS,YAAApL,WAAT,W,MACE,YAAMA,WAAU,WACN,QAAV,EAAA3B,KAAKylB,aAAK,SAAE9jB,YACd,EAMA,sBAAI,iBAAE,C,IAAN,WACE,OAAO3B,KAAKmjB,GACd,E,IAMA,SAAOU,GACDtC,EAAqBsC,EAAI,EAAAhR,gBAAgBY,qBAC3CzT,KAAKmjB,IAAMU,EAEf,E,gCAMA,sBAAI,6BAAc,C,IAAlB,WACE,OAAO7jB,KAAKslB,eACd,E,IAMA,SAAmBK,GACjB,GAAI3lB,KAAK4G,aAA4B,KAAb5G,KAAKmjB,IAC3B,MAAM,IAAI3B,EACR,EAAAjQ,iBAAiBD,4BAGfiQ,EAAqBoE,EAAgB,EAAA9S,gBAAgBe,cACvD5T,KAAKslB,gBAAkBK,EAG7B,E,gCAMA,sBAAI,gCAAiB,C,IAArB,WACE,OAAO3lB,KAAKulB,kBACd,E,IAMA,SAAsBK,GACpB,GAAI5lB,KAAK4G,aAA4B,KAAb5G,KAAKmjB,IAC3B,MAAM,IAAI3B,EACR,EAAAjQ,iBAAiBD,4BAGfiQ,EAAqBqE,EAAmB,EAAA/S,gBAAgBc,cAC1D3T,KAAKulB,mBAAqBK,EAGhC,E,gCAMA,sBAAI,+BAAgB,C,IAApB,WACE,OAAO5lB,KAAKwlB,iBACd,E,IAMA,SAAqBK,GACnB,GAAI7lB,KAAK4G,aAA4B,KAAb5G,KAAKmjB,IAC3B,MAAM,IAAI3B,EACR,EAAAjQ,iBAAiBD,4BAIjBiQ,EAAqBsE,EAAkB,EAAAhT,gBAAgBlE,aACvD8S,EAAoBoE,EAAkB,EAAAhT,gBAAgBkB,kBAEtD/T,KAAKwlB,kBAAoBK,EAG/B,E,gCAMA,sBAAI,0BAAW,C,IAAf,WACE,OAAO7lB,KAAK0jB,YACd,E,IAMA,SAAgBlI,GACd,GAAIxb,KAAK4G,aAA4B,KAAb5G,KAAKmjB,IAC3B,MAAM,IAAI3B,EACR,EAAAjQ,iBAAiBD,4BAIjBiQ,EACE/F,EACA,EAAA3I,gBAAgBO,kBAChB,KAGFpT,KAAK0jB,aAAelI,EAG1B,E,gCAgBA,YAAAtO,OAAA,WAQElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbwlB,GAAI7jB,KAAK6jB,GACT8B,eAAgB3lB,KAAK2lB,eACrBC,kBAAmB5lB,KAAK4lB,kBACxBC,iBAAkB7lB,KAAK6lB,iBACvBrK,YAAaxb,KAAKwb,YAClBiK,MAAOzlB,KAAKylB,OAGd,cADOzlB,KAAKmN,WACL9O,CACT,EACF,EA1LA,CAAyC,EAAA+O,SClCzC,cAKE,WAAYxG,QAAA,IAAAA,IAAAA,GAAA,GACV,QAAK,YAAE,K,OAiBD,EAAAkf,UAAY,MACZ,EAAAxZ,WAAa,EAAAkE,oBAAoBhB,aACjC,EAAA+V,mBAAqB,UACrB,EAAAQ,sBAAwB,GACxB,EAAAC,QAAU,SACV,EAAAC,OAAS,GACT,EAAAC,MAAQ,GACR,EAAAC,aAAe,GACf,EAAAC,YAAc,GACd,EAAAC,cAAgB,GAChB,EAAAxB,UAAY,GACZ,EAAAyB,kBAAoB,GACpB,EAAAC,MAAQ,SACR,EAAAf,kBAAoB,GACpB,EAAAgB,sBAAwB,GACxB,EAAAC,cAAgB,WAChB,EAAAnB,gBAAkB,UAClB,EAAAoB,cAAgB,GAChB,EAAAC,mBAAqB,sBACrB,EAAAC,YAAc,GAnCpB,EAAKC,mBAAqB,IAAIC,EAC9B,EAAKrB,MAAQ,IAAIC,EACjB,EAAKqB,sBAAwB,IAAIC,EACjC,EAAKC,kBAAoB,IAAIC,EAC7B,EAAKC,aAAe,IAAIC,EACxB,EAAKzD,WAAa,IAAI0D,EAClBzgB,GAAa,EAAKjF,a,CACxB,CAmjBF,OAjkByB,oBA+Cd,YAAAA,WAAT,W,gBACE,YAAMA,WAAU,WACO,QAAvB,EAAA3B,KAAK6mB,0BAAkB,SAAEllB,aACf,QAAV,EAAA3B,KAAKylB,aAAK,SAAE9jB,aACc,QAA1B,EAAA3B,KAAK+mB,6BAAqB,SAAEplB,aACN,QAAtB,EAAA3B,KAAKinB,yBAAiB,SAAEtlB,aACP,QAAjB,EAAA3B,KAAKmnB,oBAAY,SAAExlB,aACJ,QAAf,EAAA3B,KAAK2jB,kBAAU,SAAEhiB,YACnB,EAKA,YAAAkL,MAAA,W,gBACE7M,KAAK+M,cAAe,EAEpB/M,KAAKulB,mBAAqB,aAC1BvlB,KAAKkmB,MAAQ,GACblmB,KAAKymB,cAAgB,WACrBzmB,KAAKwlB,kBAAoB,GACzBxlB,KAAK6kB,UAAY,GAEF,QAAf,EAAA7kB,KAAK2jB,kBAAU,SAAE9W,OAAM,GACN,QAAjB,EAAA7M,KAAKmnB,oBAAY,SAAEta,OAAM,GAEf,QAAV,EAAA7M,KAAKylB,aAAK,SAAE5Y,QACc,QAA1B,EAAA7M,KAAK+mB,6BAAqB,SAAEla,QACN,QAAtB,EAAA7M,KAAKinB,yBAAiB,SAAEpa,QACD,QAAvB,EAAA7M,KAAK6mB,0BAAkB,SAAEha,OAC3B,EAOA,sBAAI,uBAAQ,C,IAAZ,WACE,OAAO7M,KAAK8lB,SACd,E,IAOA,SAAawB,GACX,MAAM,IAAI9F,EAAyB,EAAAjQ,iBAAiBvL,kBACtD,E,gCAOA,sBAAI,wBAAS,C,IAAb,WACE,OAAOhG,KAAKsM,UACd,E,IAOA,SAAcU,GACZ,MAAM,IAAIwU,EAAyB,EAAAjQ,iBAAiBvL,kBACtD,E,gCAMA,sBAAI,gCAAiB,C,IAArB,WACE,OAAOhG,KAAKulB,kBACd,E,IAMA,SAAsBK,GAChBrE,EAAqBqE,EAAmB,EAAA/S,gBAAgBc,cAC1D3T,KAAKulB,mBAAqBK,EAE9B,E,gCAMA,sBAAI,mCAAoB,C,IAAxB,WACE,OAAO5lB,KAAK+lB,qBACd,E,IAMA,SAAyBwB,GACvB,GAAIvnB,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAK+lB,sBAAwBwB,CAEjC,E,gCAMA,sBAAI,qBAAM,C,IAAV,WACE,OAAOvnB,KAAKgmB,OACd,E,IAMA,SAAWwB,GACT,GAAIxnB,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAKgmB,QAAUwB,CAEnB,E,gCAMA,sBAAI,oBAAK,C,IAAT,WACE,OAAOxnB,KAAKimB,MACd,E,IAMA,SAAUwB,GACR,GAAIznB,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAKimB,OAASwB,CAElB,E,gCAMA,sBAAI,mBAAI,C,IAAR,WACE,IAAKznB,KAAKmN,WACR,MAAM,IAAIqU,EAAyB,EAAAjQ,iBAAiBF,oBAEtD,OAAOrR,KAAKkmB,KACd,E,IAMA,SAASwB,GACHnG,EAAqBmG,EAAM,EAAA7U,gBAAgBT,SAAS,KACtDpS,KAAKkmB,MAAQwB,EAEjB,E,gCAMA,sBAAI,0BAAW,C,IAAf,WACE,OAAO1nB,KAAKmmB,YACd,E,IAMA,SAAgBwB,GACd,GAAI3nB,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAKmmB,aAAewB,CAExB,E,gCAMA,sBAAI,yBAAU,C,IAAd,WACE,OAAO3nB,KAAKomB,WACd,E,IAMA,SAAewB,GACb,GAAI5nB,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAKomB,YAAcwB,CAEvB,E,gCAMA,sBAAI,2BAAY,C,IAAhB,WACE,OAAO5nB,KAAKqmB,aACd,E,IAMA,SAAiBwB,GACf,GAAI7nB,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAKqmB,cAAgBwB,CAEzB,E,gCAMA,sBAAI,uBAAQ,C,IAAZ,WACE,OAAO7nB,KAAK6kB,SACd,E,IAMA,SAAaG,GACPzD,EAAqByD,EAAU,EAAAnS,gBAAgBG,iBACjDhT,KAAK6kB,UAAYG,EAErB,E,gCAMA,sBAAI,+BAAgB,C,IAApB,WACE,OAAOhlB,KAAKsmB,iBACd,E,IAMA,SAAqBwB,GACnB,GAAI9nB,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAKsmB,kBAAoBwB,CAE7B,E,gCAMA,sBAAI,mBAAI,C,IAAR,WACE,OAAO9nB,KAAKumB,KACd,E,IAMA,SAASxa,GACP,GAAI/L,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAKumB,MAAQxa,CAEjB,E,gCAMA,sBAAI,+BAAgB,C,IAApB,WACE,OAAO/L,KAAKwlB,iBACd,E,IAMA,SAAqBK,GAEjBtE,EAAqBsE,EAAkB,EAAAhT,gBAAgBlE,aACvD8S,EAAoBoE,EAAkB,EAAAhT,gBAAgBkB,kBAEtD/T,KAAKwlB,kBAAoBK,EAE7B,E,gCAMA,sBAAI,mCAAoB,C,IAAxB,WACE,OAAO7lB,KAAKwmB,qBACd,E,IAMA,SAAyBuB,GACvB,GAAI/nB,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAKwmB,sBAAwBuB,CAEjC,E,gCAMA,sBAAI,2BAAY,C,IAAhB,WACE,IAAK/nB,KAAKmN,WACR,MAAM,IAAIqU,EAAyB,EAAAjQ,iBAAiBF,oBAEtD,OAAOrR,KAAKymB,aACd,E,IAMA,SAAiBuB,GACXzG,EAAqByG,EAAc,EAAAnV,gBAAgBjB,eACrD5R,KAAKymB,cAAgBuB,EAEzB,E,gCAMA,sBAAI,6BAAc,C,IAAlB,WACE,OAAOhoB,KAAKslB,eACd,E,IAMA,SAAmBK,GACbpE,EAAqBoE,EAAgB,EAAA9S,gBAAgBe,cACvD5T,KAAKslB,gBAAkBK,EAE3B,E,gCAMA,sBAAI,2BAAY,C,IAAhB,WACE,OAAO3lB,KAAK0mB,aACd,E,IAMA,SAAiBuB,GAEb1G,EAAqB0G,EAAc,EAAApV,gBAAgBK,gBAAgB,KAEnElT,KAAK0mB,cAAgBuB,EAEzB,E,gCAMA,sBAAI,gCAAiB,C,IAArB,WACE,OAAOjoB,KAAK2mB,kBACd,E,IAMA,SAAsBuB,GACpB,GAAIloB,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAK2mB,mBAAqBuB,CAE9B,E,gCAMA,sBAAI,yBAAU,C,IAAd,WACE,OAAOloB,KAAK4mB,WACd,E,IAMA,SAAeuB,GACb,GAAInoB,KAAK4G,YACP,MAAM,IAAI4a,EAAyB,EAAAjQ,iBAAiBvL,mBAEpDhG,KAAK4mB,YAAcuB,CAEvB,E,gCAOA,YAAAC,oBAAA,WACE,IAAIC,EAAcroB,KAAKymB,cACjB6B,EAAYtoB,KAAKuoB,WAEvB,GAAI,MAAOD,EAAiD,CAC1D,IAAM/S,GAAU,IAAIjI,MAAOC,UAAY+a,EACvCD,EAAc,0BAA6B9S,EAAU,IACvD,CAEA,OAAO,kBACLvV,KAAK4mB,YACLyB,EACA,EAAAxV,gBAAgBjB,YAEpB,EAiCA,YAAA1E,OAAA,WAyBElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACb0oB,sBAAuB/mB,KAAK+mB,sBAC5BE,kBAAmBjnB,KAAKinB,kBACxBrB,kBAAmB5lB,KAAK4lB,kBACxB2B,qBAAsBvnB,KAAKunB,qBAC3BC,OAAQxnB,KAAKwnB,OACbC,MAAOznB,KAAKynB,MACZC,KAAM1nB,KAAK0nB,KACXP,aAAcnnB,KAAKmnB,aACnBQ,YAAa3nB,KAAK2nB,YAClBC,WAAY5nB,KAAK4nB,WACjBC,aAAc7nB,KAAK6nB,aACnBhB,mBAAoB7mB,KAAK6mB,mBACzB7B,SAAUhlB,KAAKglB,SACf8C,iBAAkB9nB,KAAK8nB,iBACvB/b,KAAM/L,KAAK+L,KACX4X,WAAY3jB,KAAK2jB,WACjBkC,iBAAkB7lB,KAAK6lB,iBACvBkC,qBAAsB/nB,KAAK+nB,qBAC3BtC,MAAOzlB,KAAKylB,MACZuC,aAAchoB,KAAKgoB,aACnBrC,eAAgB3lB,KAAK2lB,eACrBsC,aAAcjoB,KAAKioB,aACnBC,kBAAmBloB,KAAKkoB,mBAG1B,cADOloB,KAAKmN,WACL9O,CACT,EACF,EAjkBA,CAAyB,EAAAmqB,aCyXzB,EAzYiC,CAC/B,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,O,QC3XF,cAIE,aACE,QAAK,YAAE,K,OAMF,EAAAvR,KAAO,IAAIwR,EALhB,EAAKC,IAAM,IAAIC,EACf,EAAK1R,KAAO,IAAIwR,E,CAClB,CA0CF,OAlDyB,oBAgBd,YAAA9mB,WAAT,W,MACE,YAAMA,WAAU,WACR,QAAR,EAAA3B,KAAK0oB,WAAG,SAAE/mB,YACZ,EAKA,YAAAkL,MAAA,W,MACE7M,KAAK+M,cAAe,EACZ,QAAR,EAAA/M,KAAK0oB,WAAG,SAAE7b,OACZ,EAWA,YAAAK,OAAA,WAIElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbqqB,IAAK1oB,KAAK0oB,IACVzR,KAAMjX,KAAKiX,MAGb,cADOjX,KAAKmN,WACL9O,CACT,EACF,EAlDA,CAAyB,EAAA+O,SAwDzB,cAME,aACE,QAAK,YAAE,K,OAND,EAAAwb,SAAW,SAOjB,EAAKC,cAAgB,IAAIC,E,CAC3B,CA0DF,OAnE4B,oBAgBjB,YAAAnnB,WAAT,W,MACE,YAAMA,WAAU,WACE,QAAlB,EAAA3B,KAAK6oB,qBAAa,SAAElnB,YACtB,EAKA,YAAAkL,MAAA,W,MACE7M,KAAK+M,cAAe,EACpB/M,KAAK4oB,SAAW,SACE,QAAlB,EAAA5oB,KAAK6oB,qBAAa,SAAEhc,OACtB,EAMA,sBAAI,sBAAO,C,IAAX,WACE,OAAO7M,KAAK4oB,QACd,E,IAMA,SAAYG,GACN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","sources":["webpack://scorm-again/./src/constants/default_settings.ts","webpack://scorm-again/./src/helpers/scheduled_commit.ts","webpack://scorm-again/./src/BaseAPI.ts","webpack://scorm-again/./src/cmi/common/array.ts","webpack://scorm-again/./src/cmi/common/base_cmi.ts","webpack://scorm-again/./src/cmi/common/score.ts","webpack://scorm-again/./src/cmi/common/validation.ts","webpack://scorm-again/./src/constants/api_constants.ts","webpack://scorm-again/./src/constants/enums.ts","webpack://scorm-again/./src/constants/error_codes.ts","webpack://scorm-again/./src/constants/regex.ts","webpack://scorm-again/./src/exceptions.ts","webpack://scorm-again/./src/utilities.ts","webpack://scorm-again/./node_modules/tslib/tslib.es6.mjs","webpack://scorm-again/webpack/bootstrap","webpack://scorm-again/webpack/runtime/define property getters","webpack://scorm-again/webpack/runtime/hasOwnProperty shorthand","webpack://scorm-again/webpack/runtime/make namespace object","webpack://scorm-again/./src/exceptions/scorm2004_exceptions.ts","webpack://scorm-again/./src/cmi/scorm2004/validation.ts","webpack://scorm-again/./src/cmi/scorm2004/learner_preference.ts","webpack://scorm-again/./src/constants/response_constants.ts","webpack://scorm-again/./src/cmi/scorm2004/interactions.ts","webpack://scorm-again/./src/cmi/scorm2004/score.ts","webpack://scorm-again/./src/cmi/scorm2004/comments.ts","webpack://scorm-again/./src/cmi/scorm2004/objectives.ts","webpack://scorm-again/./src/cmi/scorm2004/cmi.ts","webpack://scorm-again/./src/constants/language_constants.ts","webpack://scorm-again/./src/cmi/scorm2004/adl.ts","webpack://scorm-again/./src/Scorm2004API.ts"],"sourcesContent":["import { LogLevel, ResultObject, Settings } from \"../types/api_types\";\nimport { global_constants } from \"./api_constants\";\nimport { LogLevelEnum } from \"./enums\";\n\n/**\n * Default settings for the SCORM API\n */\nexport const DefaultSettings: Settings = {\n autocommit: false,\n autocommitSeconds: 10,\n asyncCommit: false,\n sendFullCommit: true,\n lmsCommitUrl: false,\n dataCommitFormat: \"json\",\n commitRequestDataType: \"application/json;charset=UTF-8\",\n autoProgress: false,\n logLevel: LogLevelEnum.ERROR,\n selfReportSessionTime: false,\n alwaysSendTotalTime: false,\n renderCommonCommitFields: false,\n strict_errors: true,\n xhrHeaders: {},\n xhrWithCredentials: false,\n fetchMode: \"cors\",\n responseHandler: async function (response: Response): Promise<ResultObject> {\n if (typeof response !== \"undefined\") {\n const responseText = await response.text();\n let httpResult = null;\n if (responseText) {\n httpResult = JSON.parse(responseText);\n }\n if (\n httpResult === null ||\n !{}.hasOwnProperty.call(httpResult, \"result\")\n ) {\n if (response.status === 200) {\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n } else {\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: 101,\n };\n }\n } else {\n return {\n result: httpResult.result,\n errorCode: httpResult.errorCode\n ? httpResult.errorCode\n : httpResult.result === global_constants.SCORM_TRUE\n ? 0\n : 101,\n };\n }\n }\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: 101,\n };\n },\n requestHandler: function (commitObject) {\n return commitObject;\n },\n onLogMessage: function (messageLevel: LogLevel, logMessage) {\n switch (messageLevel) {\n case \"4\":\n case 4:\n case \"ERROR\":\n case LogLevelEnum.ERROR:\n console.error(logMessage);\n break;\n case \"3\":\n case 3:\n case \"WARN\":\n case LogLevelEnum.WARN:\n console.warn(logMessage);\n break;\n case \"2\":\n case 2:\n case \"INFO\":\n case LogLevelEnum.INFO:\n console.info(logMessage);\n break;\n case \"1\":\n case 1:\n case \"DEBUG\":\n case LogLevelEnum.DEBUG:\n if (console.debug) {\n console.debug(logMessage);\n } else {\n console.log(logMessage);\n }\n break;\n }\n },\n scoItemIds: [],\n scoItemIdValidator: false,\n globalObjectiveIds: [],\n};\n","import BaseAPI from \"../BaseAPI\";\n\n/**\n * Private class that wraps a timeout call to the commit() function\n */\nexport class ScheduledCommit {\n private _API;\n private _cancelled = false;\n private readonly _timeout;\n private readonly _callback;\n\n /**\n * Constructor for ScheduledCommit\n * @param {BaseAPI} API\n * @param {number} when\n * @param {string} callback\n */\n constructor(API: BaseAPI, when: number, callback: string) {\n this._API = API;\n this._timeout = setTimeout(this.wrapper.bind(this), when);\n this._callback = callback;\n }\n\n /**\n * Cancel any currently scheduled commit\n */\n cancel() {\n this._cancelled = true;\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n }\n\n /**\n * Wrap the API commit call to check if the call has already been cancelled\n */\n wrapper() {\n if (!this._cancelled) {\n (async () => await this._API.commit(this._callback))();\n }\n }\n}\n","import { CMIArray } from \"./cmi/common/array\";\nimport { ValidationError } from \"./exceptions\";\nimport { ErrorCode } from \"./constants/error_codes\";\nimport { global_constants } from \"./constants/api_constants\";\nimport { formatMessage, stringMatches, unflatten } from \"./utilities\";\nimport { BaseCMI } from \"./cmi/common/base_cmi\";\nimport {\n CommitObject,\n LogLevel,\n RefObject,\n ResultObject,\n Settings,\n} from \"./types/api_types\";\nimport { DefaultSettings } from \"./constants/default_settings\";\nimport { IBaseAPI } from \"./interfaces/IBaseAPI\";\nimport { ScheduledCommit } from \"./helpers/scheduled_commit\";\nimport { LogLevelEnum } from \"./constants/enums\";\n\n/**\n * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered\n * abstract, and never initialized on its own.\n */\nexport default abstract class BaseAPI implements IBaseAPI {\n private _timeout?: ScheduledCommit;\n private readonly _error_codes: ErrorCode;\n private _settings: Settings = DefaultSettings;\n\n /**\n * Constructor for Base API class. Sets some shared API fields, as well as\n * sets up options for the API.\n * @param {ErrorCode} error_codes\n * @param {Settings} settings\n */\n protected constructor(error_codes: ErrorCode, settings?: Settings) {\n if (new.target === BaseAPI) {\n throw new TypeError(\"Cannot construct BaseAPI instances directly\");\n }\n this.currentState = global_constants.STATE_NOT_INITIALIZED;\n this.lastErrorCode = \"0\";\n this.listenerArray = [];\n\n this._error_codes = error_codes;\n\n if (settings) {\n this.settings = settings;\n }\n this.apiLogLevel = this.settings.logLevel;\n this.selfReportSessionTime = this.settings.selfReportSessionTime;\n\n if (this.apiLogLevel === undefined) {\n this.apiLogLevel = LogLevelEnum.NONE;\n }\n }\n\n public abstract cmi: BaseCMI;\n public startingData?: RefObject;\n\n public currentState: number;\n public lastErrorCode: string;\n public listenerArray: any[];\n public apiLogLevel: LogLevel;\n public selfReportSessionTime: boolean;\n\n abstract reset(settings?: Settings): void;\n\n /**\n * Common reset method for all APIs. New settings are merged with the existing settings.\n * @param {Settings} settings\n * @protected\n */\n commonReset(settings?: Settings): void {\n this.apiLog(\"reset\", \"Called\", LogLevelEnum.INFO);\n\n this.settings = { ...this.settings, ...settings };\n\n this.clearScheduledCommit();\n this.currentState = global_constants.STATE_NOT_INITIALIZED;\n this.lastErrorCode = \"0\";\n this.listenerArray = [];\n this.startingData = undefined;\n }\n\n /**\n * Initialize the API\n * @param {string} callbackName\n * @param {string} initializeMessage\n * @param {string} terminationMessage\n * @return {string}\n */\n initialize(\n callbackName: string,\n initializeMessage?: string,\n terminationMessage?: string,\n ): string {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.isInitialized()) {\n this.throwSCORMError(this._error_codes.INITIALIZED, initializeMessage);\n } else if (this.isTerminated()) {\n this.throwSCORMError(this._error_codes.TERMINATED, terminationMessage);\n } else {\n if (this.selfReportSessionTime) {\n this.cmi.setStartTime();\n }\n\n this.currentState = global_constants.STATE_INITIALIZED;\n this.lastErrorCode = \"0\";\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n abstract lmsInitialize(): string;\n\n abstract lmsFinish(): string;\n\n abstract lmsGetValue(CMIElement: string): string;\n\n abstract lmsSetValue(CMIElement: string, value: any): string;\n\n abstract lmsCommit(): string;\n\n abstract lmsGetLastError(): string;\n\n abstract lmsGetErrorString(CMIErrorCode: string | number): string;\n\n abstract lmsGetDiagnostic(CMIErrorCode: string | number): string;\n\n /**\n * Abstract method for validating that a response is correct.\n *\n * @param {string} _CMIElement\n * @param {any} _value\n */\n abstract validateCorrectResponse(_CMIElement: string, _value: any): void;\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {BaseCMI|null}\n * @abstract\n */\n abstract getChildElement(\n _CMIElement: string,\n _value: any,\n _foundFirstIndex: boolean,\n ): BaseCMI | null;\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {ResultObject}\n * @abstract\n */\n abstract storeData(_calculateTotalTime: boolean): Promise<ResultObject>;\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _terminateCommit\n * @return {RefObject|Array}\n * @abstract\n */\n abstract renderCommitCMI(_terminateCommit: boolean): RefObject | Array<any>;\n\n /**\n * Render the commit object to the shortened format for LMS commit\n * @param {boolean} _terminateCommit\n * @return {CommitObject}\n */\n abstract renderCommitObject(_terminateCommit: boolean): CommitObject;\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} logMessage\n * @param {number} messageLevel\n * @param {string} CMIElement\n */\n apiLog(\n functionName: string,\n logMessage: string,\n messageLevel: LogLevel,\n CMIElement?: string,\n ) {\n logMessage = formatMessage(functionName, logMessage, CMIElement);\n\n if (messageLevel >= this.apiLogLevel) {\n this.settings.onLogMessage(messageLevel, logMessage);\n }\n }\n\n /**\n * Getter for _error_codes\n * @return {ErrorCode}\n */\n get error_codes(): ErrorCode {\n return this._error_codes;\n }\n\n /**\n * Getter for _settings\n * @return {Settings}\n */\n get settings(): Settings {\n return this._settings;\n }\n\n /**\n * Setter for _settings\n * @param {Settings} settings\n */\n set settings(settings: Settings) {\n this._settings = { ...this._settings, ...settings };\n }\n\n /**\n * Terminates the current run of the API\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n async terminate(\n callbackName: string,\n checkTerminated: boolean,\n ): Promise<string> {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.TERMINATION_BEFORE_INIT,\n this._error_codes.MULTIPLE_TERMINATION,\n )\n ) {\n this.currentState = global_constants.STATE_TERMINATED;\n\n const result: ResultObject = await this.storeData(true);\n if (typeof result.errorCode !== \"undefined\" && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue =\n typeof result !== \"undefined\" && result.result\n ? result.result\n : global_constants.SCORM_FALSE;\n\n if (checkTerminated) this.lastErrorCode = \"0\";\n\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Get the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @return {string}\n */\n getValue(\n callbackName: string,\n checkTerminated: boolean,\n CMIElement: string,\n ): string {\n let returnValue: string = \"\";\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.RETRIEVE_BEFORE_INIT,\n this._error_codes.RETRIEVE_AFTER_TERM,\n )\n ) {\n if (checkTerminated) this.lastErrorCode = \"0\";\n try {\n returnValue = this.getCMIValue(CMIElement);\n } catch (e) {\n returnValue = this.handleValueAccessException(e, returnValue);\n }\n this.processListeners(callbackName, CMIElement);\n }\n\n this.apiLog(\n callbackName,\n \": returned: \" + returnValue,\n LogLevelEnum.INFO,\n CMIElement,\n );\n\n if (returnValue === undefined) {\n return \"\";\n }\n\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Sets the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {string} commitCallback\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setValue(\n callbackName: string,\n commitCallback: string,\n checkTerminated: boolean,\n CMIElement: string,\n value: any,\n ): string {\n if (value !== undefined) {\n value = String(value);\n }\n let returnValue: string = global_constants.SCORM_FALSE;\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.STORE_BEFORE_INIT,\n this._error_codes.STORE_AFTER_TERM,\n )\n ) {\n if (checkTerminated) this.lastErrorCode = \"0\";\n try {\n returnValue = this.setCMIValue(CMIElement, value);\n } catch (e) {\n this.handleValueAccessException(e, returnValue);\n }\n this.processListeners(callbackName, CMIElement, value);\n }\n\n if (returnValue === undefined) {\n returnValue = global_constants.SCORM_FALSE;\n }\n\n // If we didn't have any errors while setting the data, go ahead and\n // schedule a commit, if autocommit is turned on\n if (String(this.lastErrorCode) === \"0\") {\n if (this.settings.autocommit) {\n this.scheduleCommit(\n this.settings.autocommitSeconds * 1000,\n commitCallback,\n );\n }\n }\n\n this.apiLog(\n callbackName,\n \": \" + value + \": result: \" + returnValue,\n LogLevelEnum.INFO,\n CMIElement,\n );\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Orders LMS to store all content parameters\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n async commit(\n callbackName: string,\n checkTerminated: boolean = false,\n ): Promise<string> {\n this.clearScheduledCommit();\n\n let returnValue = global_constants.SCORM_FALSE;\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.COMMIT_BEFORE_INIT,\n this._error_codes.COMMIT_AFTER_TERM,\n )\n ) {\n const result = await this.storeData(false);\n if (result.errorCode && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue =\n typeof result !== \"undefined\" && result.result\n ? result.result\n : global_constants.SCORM_FALSE;\n\n this.apiLog(\n callbackName,\n \" Result: \" + returnValue,\n LogLevelEnum.DEBUG,\n \"HttpRequest\",\n );\n\n if (checkTerminated) this.lastErrorCode = \"0\";\n\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: string): string {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: string, CMIErrorCode: string | number): string {\n let returnValue = \"\";\n\n if (CMIErrorCode !== null && CMIErrorCode !== \"\") {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: string, CMIErrorCode: string | number): string {\n let returnValue = \"\";\n\n if (CMIErrorCode !== null && CMIErrorCode !== \"\") {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(\n checkTerminated: boolean,\n beforeInitError: number,\n afterTermError: number,\n ): boolean {\n if (this.isNotInitialized()) {\n this.throwSCORMError(beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(\n _errorNumber: string | number,\n _detail: boolean = false,\n ): string {\n throw new Error(\n \"The getLmsErrorMessageDetails method has not been implemented\",\n );\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement: string): string {\n throw new Error(\"The getCMIValue method has not been implemented\");\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement: string, _value: any): string {\n throw new Error(\"The setCMIValue method has not been implemented\");\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: string,\n scorm2004: boolean,\n CMIElement: string,\n value: any,\n ): string {\n if (!CMIElement || CMIElement === \"\") {\n return global_constants.SCORM_FALSE;\n }\n\n const structure = CMIElement.split(\".\");\n let refObject: RefObject = this;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004\n ? this._error_codes.UNDEFINED_DATA_MODEL\n : this._error_codes.GENERAL;\n\n for (let idx = 0; idx < structure.length; idx++) {\n const attribute = structure[idx];\n\n if (idx === structure.length - 1) {\n if (scorm2004 && attribute.substring(0, 8) === \"{target=\") {\n if (this.isInitialized()) {\n this.throwSCORMError(this._error_codes.READ_ONLY_ELEMENT);\n } else {\n refObject = {\n ...refObject,\n attribute: value,\n };\n }\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (\n stringMatches(CMIElement, \"\\\\.correct_responses\\\\.\\\\d+\") &&\n this.isInitialized()\n ) {\n this.validateCorrectResponse(CMIElement, value);\n }\n\n if (!scorm2004 || this.lastErrorCode === \"0\") {\n refObject[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[idx + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n foundFirstIndex = true;\n } else {\n const newChild = this.getChildElement(\n CMIElement,\n value,\n foundFirstIndex,\n );\n foundFirstIndex = true;\n\n if (!newChild) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (refObject.initialized) newChild.initialize();\n\n refObject.childArray.push(newChild);\n refObject = newChild;\n }\n }\n\n // Have to update idx value to skip the array position\n idx++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(\n methodName,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n LogLevelEnum.WARN,\n );\n }\n\n return returnValue;\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {any}\n */\n _commonGetCMIValue(\n methodName: string,\n scorm2004: boolean,\n CMIElement: string,\n ): any {\n if (!CMIElement || CMIElement === \"\") {\n return \"\";\n }\n\n const structure = CMIElement.split(\".\");\n let refObject: RefObject = this;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004\n ? this._error_codes.UNDEFINED_DATA_MODEL\n : this._error_codes.GENERAL;\n\n for (let idx = 0; idx < structure.length; idx++) {\n attribute = structure[idx];\n\n if (!scorm2004) {\n if (idx === structure.length - 1) {\n if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if (\n String(attribute).substring(0, 8) === \"{target=\" &&\n typeof refObject._isTargetValid == \"function\"\n ) {\n const target = String(attribute).substring(\n 8,\n String(attribute).length - 9,\n );\n return refObject._isTargetValid(target);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n refObject = refObject[attribute];\n if (refObject === undefined) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[idx + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(\n this._error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage,\n );\n break;\n }\n\n // Have to update idx value to skip the array position\n idx++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === \"_children\") {\n this.throwSCORMError(this._error_codes.CHILDREN_ERROR);\n } else if (attribute === \"_count\") {\n this.throwSCORMError(this._error_codes.COUNT_ERROR);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized(): boolean {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized(): boolean {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated(): boolean {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n on(listenerName: string, callback: Function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(\" \");\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split(\".\");\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + \".\", \"\");\n }\n\n this.listenerArray.push({\n functionName: functionName,\n CMIElement: CMIElement,\n callback: callback,\n });\n\n this.apiLog(\n \"on\",\n `Added event listener: ${this.listenerArray.length}`,\n LogLevelEnum.INFO,\n functionName,\n );\n }\n }\n\n /**\n * Provides a mechanism for detaching a specific SCORM event listener\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n off(listenerName: string, callback: Function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(\" \");\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split(\".\");\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + \".\", \"\");\n }\n\n const removeIndex = this.listenerArray.findIndex(\n (obj) =>\n obj.functionName === functionName &&\n obj.CMIElement === CMIElement &&\n obj.callback === callback,\n );\n if (removeIndex !== -1) {\n this.listenerArray.splice(removeIndex, 1);\n this.apiLog(\n \"off\",\n `Removed event listener: ${this.listenerArray.length}`,\n LogLevelEnum.INFO,\n functionName,\n );\n }\n }\n }\n\n /**\n * Provides a mechanism for clearing all listeners from a specific SCORM event\n *\n * @param {string} listenerName\n */\n clear(listenerName: string) {\n const listenerFunctions = listenerName.split(\" \");\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split(\".\");\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + \".\", \"\");\n }\n\n this.listenerArray = this.listenerArray.filter(\n (obj) =>\n obj.functionName !== functionName && obj.CMIElement !== CMIElement,\n );\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {any} value\n */\n processListeners(functionName: string, CMIElement?: string, value?: any) {\n this.apiLog(functionName, value, LogLevelEnum.INFO, CMIElement);\n for (let i = 0; i < this.listenerArray.length; i++) {\n const listener = this.listenerArray[i];\n const functionsMatch = listener.functionName === functionName;\n const listenerHasCMIElement = !!listener.CMIElement;\n let CMIElementsMatch = false;\n if (\n CMIElement &&\n listener.CMIElement &&\n listener.CMIElement.substring(listener.CMIElement.length - 1) === \"*\"\n ) {\n CMIElementsMatch =\n CMIElement.indexOf(\n listener.CMIElement.substring(0, listener.CMIElement.length - 1),\n ) === 0;\n } else {\n CMIElementsMatch = listener.CMIElement === CMIElement;\n }\n\n if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {\n this.apiLog(\n \"processListeners\",\n `Processing listener: ${listener.functionName}`,\n LogLevelEnum.INFO,\n CMIElement,\n );\n listener.callback(CMIElement, value);\n }\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} errorNumber\n * @param {string} message\n */\n throwSCORMError(errorNumber: number, message?: string) {\n if (!message) {\n message = this.getLmsErrorMessageDetails(errorNumber);\n }\n\n this.apiLog(\n \"throwSCORMError\",\n errorNumber + \": \" + message,\n LogLevelEnum.ERROR,\n );\n\n this.lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success\n */\n clearSCORMError(success: string) {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this.lastErrorCode = \"0\";\n }\n }\n\n /**\n * Load the CMI from a flattened JSON object\n * @param {RefObject} json\n * @param {string} CMIElement\n */\n loadFromFlattenedJSON(json: RefObject, CMIElement?: string) {\n if (!CMIElement) {\n // by default, we start from a blank string because we're expecting each element to start with `cmi`\n CMIElement = \"\";\n }\n if (!this.isNotInitialized()) {\n console.error(\n \"loadFromFlattenedJSON can only be called before the call to lmsInitialize.\",\n );\n return;\n }\n\n /**\n * Tests two strings against a given regular expression pattern and determines a numeric or null result based on the matching criterion.\n *\n * @param {string} a - The first string to be tested against the pattern.\n * @param {string} c - The second string to be tested against the pattern.\n * @param {RegExp} a_pattern - The regular expression pattern to test the strings against.\n * @return {number | null} A numeric result based on the matching criterion, or null if the strings do not match the pattern.\n */\n function testPattern(\n a: string,\n c: string,\n a_pattern: RegExp,\n ): number | null {\n const a_match = a.match(a_pattern);\n\n let c_match;\n if (a_match !== null && (c_match = c.match(a_pattern)) !== null) {\n const a_num = Number(a_match[2]);\n const c_num = Number(c_match[2]);\n if (a_num === c_num) {\n if (a_match[3] === \"id\") {\n return -1;\n } else if (a_match[3] === \"type\") {\n if (c_match[3] === \"id\") {\n return 1;\n } else {\n return -1;\n }\n } else {\n return 1;\n }\n }\n return a_num - c_num;\n }\n\n return null;\n }\n\n const int_pattern = /^(cmi\\.interactions\\.)(\\d+)\\.(.*)$/;\n const obj_pattern = /^(cmi\\.objectives\\.)(\\d+)\\.(.*)$/;\n\n const result = Object.keys(json).map(function (key) {\n return [String(key), json[key]];\n });\n\n // CMI interactions need to have id and type loaded before any other fields\n result.sort(function ([a, _b], [c, _d]) {\n let test;\n if ((test = testPattern(a, c, int_pattern)) !== null) {\n return test;\n }\n if ((test = testPattern(a, c, obj_pattern)) !== null) {\n return test;\n }\n\n if (a < c) {\n return -1;\n }\n if (a > c) {\n return 1;\n }\n return 0;\n });\n\n let obj: RefObject;\n result.forEach((element) => {\n obj = {};\n obj[element[0]] = element[1];\n this.loadFromJSON(unflatten(obj), CMIElement);\n });\n }\n\n /**\n * Loads CMI data from a JSON object.\n *\n * @param {RefObject} json\n * @param {string} CMIElement\n */\n loadFromJSON(json: RefObject, CMIElement: string = \"\") {\n if (!this.isNotInitialized()) {\n console.error(\n \"loadFromJSON can only be called before the call to lmsInitialize.\",\n );\n return;\n }\n\n CMIElement = CMIElement !== undefined ? CMIElement : \"cmi\";\n\n this.startingData = json;\n\n // could this be refactored down to flatten(json) then setCMIValue on each?\n for (const key in json) {\n if ({}.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = (CMIElement ? CMIElement + \".\" : \"\") + key;\n const value = json[key];\n\n if (value[\"childArray\"]) {\n for (let i = 0; i < value[\"childArray\"].length; i++) {\n this.loadFromJSON(\n value[\"childArray\"][i],\n currentCMIElement + \".\" + i,\n );\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(value, currentCMIElement);\n } else {\n this.setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @return {string}\n */\n renderCMIToJSONString(): string {\n const cmi = this.cmi;\n // Do we want/need to return fields that have no set value?\n if (this.settings.sendFullCommit) {\n return JSON.stringify({ cmi });\n }\n return JSON.stringify({ cmi }, (k, v) => (v === undefined ? null : v), 2);\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @return {object}\n */\n renderCMIToJSONObject(): object {\n return JSON.parse(this.renderCMIToJSONString());\n }\n\n /**\n * Send the request to the LMS\n * @param {string} url\n * @param {CommitObject|RefObject|Array} params\n * @param {boolean} immediate\n * @return {ResultObject}\n */\n async processHttpRequest(\n url: string,\n params: CommitObject | RefObject | Array<any>,\n immediate: boolean = false,\n ): Promise<ResultObject> {\n const api = this;\n const genericError: ResultObject = {\n result: global_constants.SCORM_FALSE,\n errorCode: this.error_codes.GENERAL,\n };\n\n // if we are terminating the module or closing the browser window/tab, we need to make this fetch ASAP.\n // Some browsers, especially Chrome, do not like synchronous requests to be made when the window is closing.\n if (immediate) {\n this.performFetch(url, params).then(async (response) => {\n await this.transformResponse(response);\n });\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n }\n\n const process = async (\n url: string,\n params: CommitObject | RefObject | Array<any>,\n settings: Settings,\n ): Promise<ResultObject> => {\n try {\n params = settings.requestHandler(params);\n const response = await this.performFetch(url, params);\n\n return this.transformResponse(response);\n } catch (e) {\n this.apiLog(\"processHttpRequest\", e, LogLevelEnum.ERROR);\n api.processListeners(\"CommitError\");\n return genericError;\n }\n };\n\n return await process(url, params, this.settings);\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} when - the number of milliseconds to wait before committing\n * @param {string} callback - the name of the commit event callback\n */\n scheduleCommit(when: number, callback: string) {\n if (!this._timeout) {\n this._timeout = new ScheduledCommit(this, when, callback);\n this.apiLog(\"scheduleCommit\", \"scheduled\", LogLevelEnum.DEBUG, \"\");\n }\n }\n\n /**\n * Clears and cancels any currently scheduled commits\n */\n clearScheduledCommit() {\n if (this._timeout) {\n this._timeout.cancel();\n this._timeout = undefined;\n this.apiLog(\"clearScheduledCommit\", \"cleared\", LogLevelEnum.DEBUG, \"\");\n }\n }\n\n /**\n * Check to see if the specific object has the given property\n * @param {RefObject} refObject\n * @param {string} attribute\n * @return {boolean}\n * @private\n */\n private _checkObjectHasProperty(\n refObject: RefObject,\n attribute: string,\n ): boolean {\n return (\n Object.hasOwnProperty.call(refObject, attribute) ||\n Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(refObject),\n attribute,\n ) != null ||\n attribute in refObject\n );\n }\n\n /**\n * Handles the error that occurs when trying to access a value\n * @param {any} e\n * @param {string} returnValue\n * @return {string}\n * @private\n */\n private handleValueAccessException(e: any, returnValue: string): string {\n if (e instanceof ValidationError) {\n this.lastErrorCode = String(e.errorCode);\n returnValue = global_constants.SCORM_FALSE;\n } else {\n if (e instanceof Error && e.message) {\n console.error(e.message);\n } else {\n console.error(e);\n }\n this.throwSCORMError(this._error_codes.GENERAL);\n }\n return returnValue;\n }\n\n /**\n * Builds the commit object to be sent to the LMS\n * @param {boolean} terminateCommit\n * @return {CommitObject|RefObject|Array}\n * @private\n */\n protected getCommitObject(\n terminateCommit: boolean,\n ): CommitObject | RefObject | Array<any> {\n const shouldTerminateCommit =\n terminateCommit || this.settings.alwaysSendTotalTime;\n const commitObject = this.settings.renderCommonCommitFields\n ? this.renderCommitObject(shouldTerminateCommit)\n : this.renderCommitCMI(shouldTerminateCommit);\n\n if ([LogLevelEnum.DEBUG, \"1\", 1, \"DEBUG\"].includes(this.apiLogLevel)) {\n console.debug(\n \"Commit (terminated: \" + (terminateCommit ? \"yes\" : \"no\") + \"): \",\n );\n console.debug(commitObject);\n }\n return commitObject;\n }\n\n /**\n * Perform the fetch request to the LMS\n * @param {string} url\n * @param {RefObject|Array} params\n * @return {Promise<Response>}\n * @private\n */\n private async performFetch(\n url: string,\n params: RefObject | Array<any>,\n ): Promise<Response> {\n return fetch(url, {\n method: \"POST\",\n mode: this.settings.fetchMode,\n body: params instanceof Array ? params.join(\"&\") : JSON.stringify(params),\n headers: {\n ...this.settings.xhrHeaders,\n \"Content-Type\": this.settings.commitRequestDataType,\n },\n credentials: this.settings.xhrWithCredentials ? \"include\" : undefined,\n keepalive: true,\n });\n }\n\n /**\n * Transforms the response from the LMS to a ResultObject\n * @param {Response} response\n * @return {Promise<ResultObject>}\n * @private\n */\n private async transformResponse(response: Response): Promise<ResultObject> {\n const result =\n typeof this.settings.responseHandler === \"function\"\n ? await this.settings.responseHandler(response)\n : await response.json();\n\n if (\n response.status >= 200 &&\n response.status <= 299 &&\n (result.result === true || result.result === global_constants.SCORM_TRUE)\n ) {\n this.processListeners(\"CommitSuccess\");\n } else {\n this.processListeners(\"CommitError\");\n }\n return result;\n }\n}\n","import { BaseCMI } from \"./base_cmi\";\nimport { BaseScormValidationError } from \"../../exceptions\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n private readonly _errorCode: number;\n private readonly _errorClass: typeof BaseScormValidationError;\n private readonly __children: string;\n public childArray: any[];\n\n /**\n * Constructor cmi *.n arrays\n * @param {object} params\n */\n constructor(params: {\n children: string;\n errorCode?: number;\n errorClass?: typeof BaseScormValidationError;\n }) {\n super();\n this.__children = params.children;\n this._errorCode = params.errorCode || scorm12_errors.GENERAL;\n this._errorClass = params.errorClass || BaseScormValidationError;\n this.childArray = [];\n }\n\n /**\n * Called when the API has been reset\n */\n reset(wipe: boolean = false): void {\n this._initialized = false;\n if (wipe) {\n this.childArray = [];\n } else {\n // Reset all children\n for (let i = 0; i < this.childArray.length; i++) {\n this.childArray[i].reset();\n }\n }\n }\n /**\n * Getter for _children\n * @return {string}\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children: string) {\n throw new this._errorClass(this._errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count(): number {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count: number) {\n throw new this._errorClass(this._errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON(): object {\n this.jsonString = true;\n const result: { [key: string]: any } = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + \"\"] = this.childArray[i];\n }\n delete this.jsonString;\n return result;\n }\n}\n","/**\n * Base class for API cmi objects\n */\nexport abstract class BaseCMI {\n jsonString? = false;\n protected _initialized = false;\n private _start_time: number | undefined;\n\n /**\n * Getter for _initialized\n * @return {boolean}\n */\n get initialized(): boolean {\n return this._initialized;\n }\n\n /**\n * Getter for _start_time\n * @return {number | undefined}\n */\n get start_time(): number | undefined {\n return this._start_time;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize(): void {\n this._initialized = true;\n }\n\n /**\n * Called when the player should override the 'session_time' provided by\n * the module\n */\n setStartTime(): void {\n this._start_time = new Date().getTime();\n }\n\n abstract reset(): void;\n}\n\n/**\n * Base class for cmi root objects\n */\nexport abstract class BaseRootCMI extends BaseCMI {\n abstract getCurrentTotalTime(): string;\n}\n","import { scorm12_constants } from \"../../constants/api_constants\";\nimport { scorm12_regex } from \"../../constants/regex\";\nimport { BaseCMI } from \"./base_cmi\";\nimport { checkValidFormat, checkValidRange } from \"./validation\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { BaseScormValidationError } from \"../../exceptions\";\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n private readonly __children: string;\n private readonly __score_range: string | false;\n private readonly __invalid_error_code: number;\n private readonly __invalid_type_code: number;\n private readonly __invalid_range_code: number;\n private readonly __decimal_regex: string;\n private readonly __error_class: typeof BaseScormValidationError;\n protected _raw = \"\";\n protected _min = \"\";\n protected _max: string;\n\n /**\n * Constructor for *.score\n * @param {\n * score_children: string,\n * score_range: string,\n * max: string,\n * invalidErrorCode: number,\n * invalidTypeCode: number,\n * invalidRangeCode: number,\n * decimalRegex: string,\n * errorClass: typeof BaseScormValidationError\n * } params\n */\n constructor(params: {\n score_children?: string;\n score_range?: string;\n max?: string;\n invalidErrorCode?: number;\n invalidTypeCode?: number;\n invalidRangeCode?: number;\n decimalRegex?: string;\n errorClass: typeof BaseScormValidationError;\n }) {\n super();\n\n this.__children = params.score_children || scorm12_constants.score_children;\n this.__score_range = !params.score_range\n ? false\n : scorm12_regex.score_range;\n this._max = params.max || params.max === \"\" ? params.max : \"100\";\n this.__invalid_error_code =\n params.invalidErrorCode || scorm12_errors.INVALID_SET_VALUE;\n this.__invalid_type_code =\n params.invalidTypeCode || scorm12_errors.TYPE_MISMATCH;\n this.__invalid_range_code =\n params.invalidRangeCode || scorm12_errors.VALUE_OUT_OF_RANGE;\n this.__decimal_regex = params.decimalRegex || scorm12_regex.CMIDecimal;\n this.__error_class = params.errorClass;\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n }\n\n /**\n * Getter for _children\n * @return {string}\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children: string) {\n throw new this.__error_class(this.__invalid_error_code);\n }\n\n /**\n * Getter for _raw\n * @return {string}\n */\n get raw(): string {\n return this._raw;\n }\n\n /**\n * Setter for _raw\n * @param {string} raw\n */\n set raw(raw: string) {\n if (\n checkValidFormat(\n raw,\n this.__decimal_regex,\n this.__invalid_type_code,\n this.__error_class,\n ) &&\n (!this.__score_range ||\n checkValidRange(\n raw,\n this.__score_range,\n this.__invalid_range_code,\n this.__error_class,\n ))\n ) {\n this._raw = raw;\n }\n }\n\n /**\n * Getter for _min\n * @return {string}\n */\n get min(): string {\n return this._min;\n }\n\n /**\n * Setter for _min\n * @param {string} min\n */\n set min(min: string) {\n if (\n checkValidFormat(\n min,\n this.__decimal_regex,\n this.__invalid_type_code,\n this.__error_class,\n ) &&\n (!this.__score_range ||\n checkValidRange(\n min,\n this.__score_range,\n this.__invalid_range_code,\n this.__error_class,\n ))\n ) {\n this._min = min;\n }\n }\n\n /**\n * Getter for _max\n * @return {string}\n */\n get max(): string {\n return this._max;\n }\n\n /**\n * Setter for _max\n * @param {string} max\n */\n set max(max: string) {\n if (\n checkValidFormat(\n max,\n this.__decimal_regex,\n this.__invalid_type_code,\n this.__error_class,\n ) &&\n (!this.__score_range ||\n checkValidRange(\n max,\n this.__score_range,\n this.__invalid_range_code,\n this.__error_class,\n ))\n ) {\n this._max = max;\n }\n }\n\n /**\n * toJSON for *.score\n * @return {\n * {\n * min: string,\n * max: string,\n * raw: string\n * }\n * }\n */\n toJSON(): {\n min: string;\n max: string;\n raw: string;\n } {\n this.jsonString = true;\n const result = {\n raw: this.raw,\n min: this.min,\n max: this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import { BaseScormValidationError } from \"../../exceptions\";\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {typeof BaseScormValidationError} errorClass\n * @param {boolean} [allowEmptyString]\n * @return {boolean}\n */\nexport function checkValidFormat(\n value: string,\n regexPattern: string,\n errorCode: number,\n errorClass: typeof BaseScormValidationError,\n allowEmptyString?: boolean,\n): boolean {\n if (typeof value !== \"string\") {\n return false;\n }\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === \"\") {\n return true;\n }\n if (value === undefined || !matches || matches[0] === \"\") {\n throw new errorClass(errorCode);\n }\n return true;\n}\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {any} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @param {typeof BaseScormValidationError} errorClass\n * @return {boolean}\n */\nexport function checkValidRange(\n value: any,\n rangePattern: string,\n errorCode: number,\n errorClass: typeof BaseScormValidationError,\n): boolean {\n const ranges = rangePattern.split(\"#\");\n value = value * 1.0;\n if (value >= ranges[0]) {\n if (ranges[1] === \"*\" || value <= ranges[1]) {\n return true;\n } else {\n throw new errorClass(errorCode);\n }\n } else {\n throw new errorClass(errorCode);\n }\n}\n","interface ErrorDescription {\n basicMessage: string;\n detailMessage: string;\n}\n\ninterface ErrorDescriptions {\n [key: string]: ErrorDescription;\n}\n\ninterface ScormConstants {\n cmi_children: string;\n core_children: string;\n score_children: string;\n comments_children: string;\n objectives_children: string;\n correct_responses_children: string;\n student_data_children: string;\n student_preference_children: string;\n interactions_children: string;\n error_descriptions: ErrorDescriptions;\n}\n\ninterface AiccConstants extends ScormConstants {\n student_demographics_children: string;\n tries_children: string;\n attempt_records_children: string;\n paths_children: string;\n}\n\ninterface Scorm2004Constants {\n cmi_children: string;\n comments_children: string;\n score_children: string;\n objectives_children: string;\n correct_responses_children: string;\n student_data_children: string;\n student_preference_children: string;\n interactions_children: string;\n adl_data_children: string;\n error_descriptions: ErrorDescriptions;\n}\n\ninterface GlobalConstants {\n SCORM_TRUE: string;\n SCORM_FALSE: string;\n STATE_NOT_INITIALIZED: number;\n STATE_INITIALIZED: number;\n STATE_TERMINATED: number;\n}\n\nexport const global_constants: GlobalConstants = {\n SCORM_TRUE: \"true\",\n SCORM_FALSE: \"false\",\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n};\n\nexport const scorm12_constants: ScormConstants = {\n // Children lists\n cmi_children:\n \"core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions\",\n core_children:\n \"student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time\",\n score_children: \"raw,min,max\",\n comments_children: \"content,location,time\",\n objectives_children: \"id,score,status\",\n correct_responses_children: \"pattern\",\n student_data_children: \"mastery_score,max_time_allowed,time_limit_action\",\n student_preference_children: \"audio,language,speed,text\",\n interactions_children:\n \"id,objectives,time,type,correct_responses,weighting,student_response,result,latency\",\n error_descriptions: {\n \"101\": {\n basicMessage: \"General Exception\",\n detailMessage:\n \"No specific error code exists to describe the error. Use LMSGetDiagnostic for more information\",\n },\n \"201\": {\n basicMessage: \"Invalid argument error\",\n detailMessage:\n \"Indicates that an argument represents an invalid data model element or is otherwise incorrect.\",\n },\n \"202\": {\n basicMessage: \"Element cannot have children\",\n detailMessage:\n 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n \"203\": {\n basicMessage: \"Element not an array - cannot have count\",\n detailMessage:\n 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n \"301\": {\n basicMessage: \"Not initialized\",\n detailMessage:\n \"Indicates that an API call was made before the call to lmsInitialize.\",\n },\n \"401\": {\n basicMessage: \"Not implemented error\",\n detailMessage:\n \"The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.\",\n },\n \"402\": {\n basicMessage: \"Invalid set value, element is a keyword\",\n detailMessage:\n 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n \"403\": {\n basicMessage: \"Element is read only\",\n detailMessage:\n \"LMSSetValue was called with a data model element that can only be read.\",\n },\n \"404\": {\n basicMessage: \"Element is write only\",\n detailMessage:\n \"LMSGetValue was called on a data model element that can only be written to.\",\n },\n \"405\": {\n basicMessage: \"Incorrect Data Type\",\n detailMessage:\n \"LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.\",\n },\n \"407\": {\n basicMessage: \"Element Value Out Of Range\",\n detailMessage:\n \"The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.\",\n },\n \"408\": {\n basicMessage: \"Data Model Dependency Not Established\",\n detailMessage:\n \"Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.\",\n },\n },\n};\nexport const aicc_constants: AiccConstants = {\n ...scorm12_constants,\n ...{\n cmi_children:\n \"core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation\",\n student_preference_children:\n \"audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows\",\n student_data_children:\n \"attempt_number,tries,mastery_score,max_time_allowed,time_limit_action\",\n student_demographics_children:\n \"city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience\",\n tries_children: \"time,status,score\",\n attempt_records_children: \"score,lesson_status\",\n paths_children: \"location_id,date,time,status,why_left,time_in_element\",\n },\n};\n\nexport const scorm2004_constants: Scorm2004Constants = {\n // Children lists\n cmi_children:\n \"_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time\",\n comments_children: \"comment,timestamp,location\",\n score_children: \"max,raw,scaled,min\",\n objectives_children:\n \"progress_measure,completion_status,success_status,description,score,id\",\n correct_responses_children: \"pattern\",\n student_data_children: \"mastery_score,max_time_allowed,time_limit_action\",\n student_preference_children:\n \"audio_level,audio_captioning,delivery_speed,language\",\n interactions_children:\n \"id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description\",\n adl_data_children: \"id,store\",\n error_descriptions: {\n \"0\": {\n basicMessage: \"No Error\",\n detailMessage: \"No error occurred, the previous API call was successful.\",\n },\n \"101\": {\n basicMessage: \"General Exception\",\n detailMessage:\n \"No specific error code exists to describe the error. Use GetDiagnostic for more information.\",\n },\n \"102\": {\n basicMessage: \"General Initialization Failure\",\n detailMessage: \"Call to Initialize failed for an unknown reason.\",\n },\n \"103\": {\n basicMessage: \"Already Initialized\",\n detailMessage:\n \"Call to Initialize failed because Initialize was already called.\",\n },\n \"104\": {\n basicMessage: \"Content Instance Terminated\",\n detailMessage:\n \"Call to Initialize failed because Terminate was already called.\",\n },\n \"111\": {\n basicMessage: \"General Termination Failure\",\n detailMessage: \"Call to Terminate failed for an unknown reason.\",\n },\n \"112\": {\n basicMessage: \"Termination Before Initialization\",\n detailMessage:\n \"Call to Terminate failed because it was made before the call to Initialize.\",\n },\n \"113\": {\n basicMessage: \"Termination After Termination\",\n detailMessage:\n \"Call to Terminate failed because Terminate was already called.\",\n },\n \"122\": {\n basicMessage: \"Retrieve Data Before Initialization\",\n detailMessage:\n \"Call to GetValue failed because it was made before the call to Initialize.\",\n },\n \"123\": {\n basicMessage: \"Retrieve Data After Termination\",\n detailMessage:\n \"Call to GetValue failed because it was made after the call to Terminate.\",\n },\n \"132\": {\n basicMessage: \"Store Data Before Initialization\",\n detailMessage:\n \"Call to SetValue failed because it was made before the call to Initialize.\",\n },\n \"133\": {\n basicMessage: \"Store Data After Termination\",\n detailMessage:\n \"Call to SetValue failed because it was made after the call to Terminate.\",\n },\n \"142\": {\n basicMessage: \"Commit Before Initialization\",\n detailMessage:\n \"Call to Commit failed because it was made before the call to Initialize.\",\n },\n \"143\": {\n basicMessage: \"Commit After Termination\",\n detailMessage:\n \"Call to Commit failed because it was made after the call to Terminate.\",\n },\n \"201\": {\n basicMessage: \"General Argument Error\",\n detailMessage:\n \"An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.\",\n },\n \"301\": {\n basicMessage: \"General Get Failure\",\n detailMessage:\n \"Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.\",\n },\n \"351\": {\n basicMessage: \"General Set Failure\",\n detailMessage:\n \"Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.\",\n },\n \"391\": {\n basicMessage: \"General Commit Failure\",\n detailMessage:\n \"Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.\",\n },\n \"401\": {\n basicMessage: \"Undefined Data Model Element\",\n detailMessage:\n \"The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.\",\n },\n \"402\": {\n basicMessage: \"Unimplemented Data Model Element\",\n detailMessage:\n \"The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.\",\n },\n \"403\": {\n basicMessage: \"Data Model Element Value Not Initialized\",\n detailMessage:\n \"Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.\",\n },\n \"404\": {\n basicMessage: \"Data Model Element Is Read Only\",\n detailMessage:\n \"SetValue was called with a data model element that can only be read.\",\n },\n \"405\": {\n basicMessage: \"Data Model Element Is Write Only\",\n detailMessage:\n \"GetValue was called on a data model element that can only be written to.\",\n },\n \"406\": {\n basicMessage: \"Data Model Element Type Mismatch\",\n detailMessage:\n \"SetValue was called with a value that is not consistent with the data format of the supplied data model element.\",\n },\n \"407\": {\n basicMessage: \"Data Model Element Value Out Of Range\",\n detailMessage:\n \"The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.\",\n },\n \"408\": {\n basicMessage: \"Data Model Dependency Not Established\",\n detailMessage:\n \"Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.\",\n },\n },\n};\n","export enum NAVBoolean {\n unknown = \"unknown\",\n true = \"true\",\n false = \"false\",\n}\n\nexport enum SuccessStatus {\n passed = \"passed\",\n failed = \"failed\",\n unknown = \"unknown\",\n}\n\nexport enum CompletionStatus {\n completed = \"completed\",\n incomplete = \"incomplete\",\n unknown = \"unknown\",\n}\n\nexport enum LogLevelEnum {\n _,\n DEBUG,\n INFO,\n WARN,\n ERROR,\n NONE,\n}\n","export type ErrorCode = {\n [key: string]: number;\n};\n\nexport const global_errors: ErrorCode = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nexport const scorm12_errors: ErrorCode = {\n ...global_errors,\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n};\n\nexport const scorm2004_errors: ErrorCode = {\n ...global_errors,\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n};\n","export const scorm12_regex = {\n CMIString256: \"^.{0,255}$\",\n CMIString4096: \"^.{0,4096}$\",\n CMITime: \"^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$\",\n CMITimespan: \"^([0-9]{2,}):([0-9]{2}):([0-9]{2})(.[0-9]{1,2})?$\",\n\n CMIInteger: \"^\\\\d+$\",\n CMISInteger: \"^-?([0-9]+)$\",\n CMIDecimal: \"^-?([0-9]{0,3})(.[0-9]*)?$\",\n\n CMIIdentifier: \"^[\\\\u0021-\\\\u007E\\\\s]{0,255}$\",\n CMIFeedback: \"^.{0,255}$\",\n // This must be redefined\n CMIIndex: \"[._](\\\\d+).\",\n // Vocabulary Data Type Definition\n CMIStatus: \"^(passed|completed|failed|incomplete|browsed)$\",\n CMIStatus2: \"^(passed|completed|failed|incomplete|browsed|not attempted)$\",\n CMIExit: \"^(time-out|suspend|logout|)$\",\n CMIType:\n \"^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$\",\n CMIResult:\n \"^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\\\.[0-9]*)?)$\",\n NAVEvent: \"^(previous|continue)$\",\n // Data ranges\n score_range: \"0#100\",\n audio_range: \"-1#100\",\n speed_range: \"-100#100\",\n weighting_range: \"-100#100\",\n text_range: \"-1#1\",\n};\nexport const aicc_regex = {\n ...scorm12_regex,\n ...{\n CMIIdentifier: \"^\\\\w{1,255}$\",\n },\n};\nexport const scorm2004_regex = {\n CMIString200: \"^[\\\\u0000-\\\\uFFFF]{0,200}$\",\n CMIString250: \"^[\\\\u0000-\\\\uFFFF]{0,250}$\",\n CMIString1000: \"^[\\\\u0000-\\\\uFFFF]{0,1000}$\",\n CMIString4000: \"^[\\\\u0000-\\\\uFFFF]{0,4000}$\",\n CMIString64000: \"^[\\\\u0000-\\\\uFFFF]{0,64000}$\",\n CMILang: \"^([a-zA-Z]{2,3}|i|x)(-[a-zA-Z0-9-]{2,8})?$|^$\",\n\n CMILangString250:\n \"^({lang=([a-zA-Z]{2,3}|i|x)(-[a-zA-Z0-9-]{2,8})?})?((?!{.*$).{0,250}$)?$\",\n\n CMILangcr: \"^(({lang=([a-zA-Z]{2,3}|i|x)?(-[a-zA-Z0-9-]{2,8})?}))(.*?)$\",\n\n CMILangString250cr:\n \"^(({lang=([a-zA-Z]{2,3}|i|x)?(-[a-zA-Z0-9-]{2,8})?})?(.{0,250})?)?$\",\n\n CMILangString4000:\n \"^({lang=([a-zA-Z]{2,3}|i|x)(-[a-zA-Z0-9-]{2,8})?})?((?!{.*$).{0,4000}$)?$\",\n\n CMITime:\n \"^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$\",\n CMITimespan:\n \"^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$\",\n CMIInteger: \"^\\\\d+$\",\n CMISInteger: \"^-?([0-9]+)$\",\n CMIDecimal: \"^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$\",\n CMIIdentifier: \"^\\\\S{1,250}[a-zA-Z0-9]$\",\n CMIShortIdentifier: \"^[\\\\w\\\\.\\\\-\\\\_]{1,250}$\",\n CMILongIdentifier:\n \"^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000}|.{1,4000})$\",\n // need to re-examine this\n CMIFeedback: \"^.*$\",\n // This must be redefined\n CMIIndex: \"[._](\\\\d+).\",\n CMIIndexStore: \".N(\\\\d+).\",\n // Vocabulary Data Type Definition\n CMICStatus: \"^(completed|incomplete|not attempted|unknown)$\",\n CMISStatus: \"^(passed|failed|unknown)$\",\n CMIExit: \"^(time-out|suspend|logout|normal)$\",\n CMIType:\n \"^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$\",\n CMIResult:\n \"^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$\",\n NAVEvent:\n \"^(previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|_none_|(\\\\{target=(?<choice_target>\\\\S{0,}[a-zA-Z0-9-_]+)})?choice|(\\\\{target=(?<jump_target>\\\\S{0,}[a-zA-Z0-9-_]+)})?jump)$\",\n\n NAVBoolean: \"^(unknown|true|false$)\",\n NAVTarget: \"^{target=\\\\S{0,}[a-zA-Z0-9-_]+}$\",\n // Data ranges\n scaled_range: \"-1#1\",\n audio_range: \"0#*\",\n speed_range: \"0#*\",\n text_range: \"-1#1\",\n progress_range: \"0#1\",\n};\n","type APIError = {\n errorCode: number;\n errorMessage: string;\n detailedMessage: string;\n};\n\nexport class BaseScormValidationError extends Error {\n constructor(errorCode: number) {\n super(errorCode.toString());\n this._errorCode = errorCode;\n this.name = \"ScormValidationError\";\n }\n\n private readonly _errorCode: number;\n\n /**\n * Getter for _errorCode\n * @return {number}\n */\n get errorCode(): number {\n return this._errorCode;\n }\n}\n\n/**\n * Base Validation Exception\n */\nexport class ValidationError\n extends BaseScormValidationError\n implements APIError\n{\n /**\n * Constructor to take in an error message and code\n * @param {number} errorCode\n * @param {string} errorMessage\n * @param {string} detailedMessage\n */\n constructor(\n errorCode: number,\n errorMessage: string,\n detailedMessage?: string,\n ) {\n super(errorCode);\n this.message = errorMessage;\n this._errorMessage = errorMessage;\n if (detailedMessage) {\n this._detailedMessage = detailedMessage;\n }\n }\n\n private readonly _errorMessage: string;\n private readonly _detailedMessage: string = \"\";\n\n /**\n * Getter for _errorMessage\n * @return {string}\n */\n get errorMessage(): string {\n return this._errorMessage;\n }\n\n /**\n * Getter for _detailedMessage\n * @return {string}\n */\n get detailedMessage(): string {\n return this._detailedMessage;\n }\n}\n","export const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\ntype Designation = {\n [key: string]: number;\n};\n\ntype StringKeyMap = {\n [key: string]: any;\n};\n\nconst designations: Designation = {\n D: SECONDS_PER_DAY,\n H: SECONDS_PER_HOUR,\n M: SECONDS_PER_MINUTE,\n S: SECONDS_PER_SECOND,\n};\n\n/**\n * Converts a Number to a String of HH:MM:SS\n *\n * @param {number} totalSeconds\n * @return {string}\n */\nexport function getSecondsAsHHMMSS(totalSeconds: number | null): string {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return \"00:00:00\";\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds();\n const ms = totalSeconds % 1.0;\n let msStr = \"\";\n\n if (countDecimals(ms) > 0) {\n if (countDecimals(ms) > 2) {\n msStr = ms.toFixed(2);\n } else {\n msStr = String(ms);\n }\n\n msStr = \".\" + msStr.split(\".\")[1];\n }\n\n return (\n (hours + \":\" + minutes + \":\" + seconds).replace(/\\b\\d\\b/g, \"0$&\") + msStr\n );\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {number} seconds\n * @return {string}\n */\nexport function getSecondsAsISODuration(seconds: number | null): string {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return \"PT0S\";\n }\n\n let duration = \"P\";\n let remainder = seconds;\n for (const designationsKey in designations) {\n const current_seconds = designations[designationsKey];\n let value = Math.floor(remainder / current_seconds);\n remainder = remainder % current_seconds;\n\n if (countDecimals(remainder) > 2) {\n remainder = Number(Number(remainder).toFixed(2));\n }\n\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (designationsKey === \"S\" && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n if (\n (duration.indexOf(\"D\") > 0 ||\n designationsKey === \"H\" ||\n designationsKey === \"M\" ||\n designationsKey === \"S\") &&\n duration.indexOf(\"T\") === -1\n ) {\n duration += \"T\";\n }\n\n duration += `${value}${designationsKey}`;\n }\n }\n return duration;\n}\n\n/**\n * Calculate the number of seconds from HH:MM:SS.DDDDDD\n *\n * @param {string} timeString\n * @param {RegExp} timeRegex\n * @return {number}\n */\nexport function getTimeAsSeconds(\n timeString: string | number | boolean | null,\n timeRegex: RegExp | string,\n): number {\n if (typeof timeString === \"number\" || typeof timeString === \"boolean\") {\n timeString = String(timeString);\n }\n if (typeof timeRegex === \"string\") {\n timeRegex = new RegExp(timeRegex);\n }\n if (!timeString || !timeString.match(timeRegex)) {\n return 0;\n }\n\n const parts = timeString.split(\":\");\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return hours * 3600 + minutes * 60 + seconds;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {string} duration\n * @param {RegExp} durationRegex\n * @return {number}\n */\nexport function getDurationAsSeconds(\n duration: string | null,\n durationRegex: RegExp | string,\n): number {\n if (typeof durationRegex === \"string\") {\n durationRegex = new RegExp(durationRegex);\n }\n\n if (!duration || !duration.match(durationRegex)) {\n return 0;\n }\n\n const [, years, _, , days, hours, minutes, seconds] =\n new RegExp(durationRegex).exec(duration) || [];\n let result = 0.0;\n result += Number(seconds) || 0.0;\n result += Number(minutes) * 60.0 || 0.0;\n result += Number(hours) * 3600.0 || 0.0;\n result += Number(days) * (60 * 60 * 24.0) || 0.0;\n result += Number(years) * (60 * 60 * 24 * 365.0) || 0.0;\n return result;\n}\n\n/**\n * Adds together two ISO8601 Duration strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp|string} durationRegex\n * @return {string}\n */\nexport function addTwoDurations(\n first: string,\n second: string,\n durationRegex: RegExp | string,\n): string {\n const regex: RegExp =\n typeof durationRegex === \"string\"\n ? new RegExp(durationRegex)\n : durationRegex;\n return getSecondsAsISODuration(\n getDurationAsSeconds(first, regex) + getDurationAsSeconds(second, regex),\n );\n}\n\n/**\n * Add together two HH:MM:SS.DD strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} timeRegex\n * @return {string}\n */\nexport function addHHMMSSTimeStrings(\n first: string,\n second: string,\n timeRegex: RegExp | string,\n): string {\n if (typeof timeRegex === \"string\") {\n timeRegex = new RegExp(timeRegex);\n }\n return getSecondsAsHHMMSS(\n getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex),\n );\n}\n\n/**\n * Flatten a JSON object down to string paths for each values\n * @param {object} data\n * @return {object}\n */\nexport function flatten(data: StringKeyMap): object {\n const result: StringKeyMap = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur: any, prop: any) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (let i = 0, l = cur.length; i < l; i++) {\n recurse(cur[i], prop + \"[\" + i + \"]\");\n if (l === 0) result[prop] = [];\n }\n } else {\n let isEmpty = true;\n\n for (const p in cur) {\n if ({}.hasOwnProperty.call(cur, p)) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + \".\" + p : p);\n }\n }\n\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, \"\");\n return result;\n}\n\n/**\n * Un-flatten a flat JSON object\n * @param {object} data\n * @return {object}\n */\nexport function unflatten(data: StringKeyMap): object {\n \"use strict\";\n\n if (Object(data) !== data || Array.isArray(data)) return data;\n const regex = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n const result: StringKeyMap = {};\n\n for (const p in data) {\n if ({}.hasOwnProperty.call(data, p)) {\n let cur = result;\n let prop = \"\";\n let m = regex.exec(p);\n\n while (m) {\n cur = cur[prop] || (cur[prop] = m[2] ? [] : {});\n prop = m[2] || m[1];\n m = regex.exec(p);\n }\n\n cur[prop] = data[p];\n }\n }\n\n return result[\"\"] || result;\n}\n\n/**\n * Counts the number of decimal places\n * @param {number} num\n * @return {number}\n */\nexport function countDecimals(num: number): number {\n if (Math.floor(num) === num || String(num).indexOf(\".\") < 0) return 0;\n const parts = num.toString().split(\".\")[1];\n return parts.length || 0;\n}\n\n/**\n * Formats the SCORM messages for easy reading\n *\n * @param {string} functionName\n * @param {string} message\n * @param {string} CMIElement\n * @return {string}\n */\nexport function formatMessage(\n functionName: string,\n message: string,\n CMIElement?: string,\n): string {\n const baseLength = 20;\n let messageString = \"\";\n\n messageString += functionName;\n\n let fillChars = baseLength - messageString.length;\n\n for (let i = 0; i < fillChars; i++) {\n messageString += \" \";\n }\n\n messageString += \": \";\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n\n messageString += CMIElement;\n\n fillChars = CMIElementBaseLength - messageString.length;\n\n for (let j = 0; j < fillChars; j++) {\n messageString += \" \";\n }\n }\n\n if (message) {\n messageString += message;\n }\n\n return messageString;\n}\n\n/**\n * Checks to see if {str} contains {tester}\n *\n * @param {string} str String to check against\n * @param {string} tester String to check for\n * @return {boolean}\n */\nexport function stringMatches(str: string, tester: string): boolean {\n return str?.match(tester) !== null;\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { ValidationError } from \"../exceptions\";\nimport { scorm2004_constants } from \"../constants/api_constants\";\n\nconst scorm2004_errors = scorm2004_constants.error_descriptions;\n\n/**\n * SCORM 2004 Validation Error\n */\nexport class Scorm2004ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {\n super(\n errorCode,\n scorm2004_errors[String(errorCode)].basicMessage,\n scorm2004_errors[String(errorCode)].detailMessage,\n );\n } else {\n super(\n 101,\n scorm2004_errors[\"101\"].basicMessage,\n scorm2004_errors[\"101\"].detailMessage,\n );\n }\n }\n}\n","import { checkValidFormat, checkValidRange } from \"../common/validation\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {string} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check2004ValidFormat(\n value: string,\n regexPattern: string,\n allowEmptyString?: boolean,\n): boolean {\n return checkValidFormat(\n value,\n regexPattern,\n scorm2004_errors.TYPE_MISMATCH,\n Scorm2004ValidationError,\n allowEmptyString,\n );\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {string} value\n * @param {string} rangePattern\n * @return {boolean}\n */\nexport function check2004ValidRange(\n value: string,\n rangePattern: string,\n): boolean {\n return checkValidRange(\n value,\n rangePattern,\n scorm2004_errors.VALUE_OUT_OF_RANGE,\n Scorm2004ValidationError,\n );\n}\n","/**\n * Class for SCORM 2004's cmi.learner_preference object\n */\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { check2004ValidFormat, check2004ValidRange } from \"./validation\";\nimport { scorm2004_regex } from \"../../constants/regex\";\n\nexport class CMILearnerPreference extends BaseCMI {\n private __children = scorm2004_constants.student_preference_children;\n private _audio_level = \"1\";\n private _language = \"\";\n private _delivery_speed = \"1\";\n private _audio_captioning = \"0\";\n\n /**\n * Constructor for cmi.learner_preference\n */\n constructor() {\n super();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset() {\n this._initialized = false;\n }\n\n /**\n * Getter for __children\n * @return {string}\n * @private\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for __children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children: string) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n\n /**\n * Getter for _audio_level\n * @return {string}\n */\n get audio_level(): string {\n return this._audio_level;\n }\n\n /**\n * Setter for _audio_level\n * @param {string} audio_level\n */\n set audio_level(audio_level: string) {\n if (\n check2004ValidFormat(audio_level, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(audio_level, scorm2004_regex.audio_range)\n ) {\n this._audio_level = audio_level;\n }\n }\n\n /**\n * Getter for _language\n * @return {string}\n */\n get language(): string {\n return this._language;\n }\n\n /**\n * Setter for _language\n * @param {string} language\n */\n set language(language: string) {\n if (check2004ValidFormat(language, scorm2004_regex.CMILang)) {\n this._language = language;\n }\n }\n\n /**\n * Getter for _delivery_speed\n * @return {string}\n */\n get delivery_speed(): string {\n return this._delivery_speed;\n }\n\n /**\n * Setter for _delivery_speed\n * @param {string} delivery_speed\n */\n set delivery_speed(delivery_speed: string) {\n if (\n check2004ValidFormat(delivery_speed, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(delivery_speed, scorm2004_regex.speed_range)\n ) {\n this._delivery_speed = delivery_speed;\n }\n }\n\n /**\n * Getter for _audio_captioning\n * @return {string}\n */\n get audio_captioning(): string {\n return this._audio_captioning;\n }\n\n /**\n * Setter for _audio_captioning\n * @param {string} audio_captioning\n */\n set audio_captioning(audio_captioning: string) {\n if (\n check2004ValidFormat(audio_captioning, scorm2004_regex.CMISInteger) &&\n check2004ValidRange(audio_captioning, scorm2004_regex.text_range)\n ) {\n this._audio_captioning = audio_captioning;\n }\n }\n\n /**\n * toJSON for cmi.learner_preference\n *\n * @return {\n * {\n * audio_level: string,\n * language: string,\n * delivery_speed: string,\n * audio_captioning: string\n * }\n * }\n */\n toJSON(): {\n audio_level: string;\n language: string;\n delivery_speed: string;\n audio_captioning: string;\n } {\n this.jsonString = true;\n const result = {\n audio_level: this.audio_level,\n language: this.language,\n delivery_speed: this.delivery_speed,\n audio_captioning: this.audio_captioning,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import { scorm2004_regex } from \"./regex\";\n\nexport const LearnerResponses: Responses = {\n \"true-false\": {\n format: \"^true$|^false$\",\n max: 1,\n delimiter: \"\",\n unique: false,\n },\n choice: {\n format: scorm2004_regex.CMILongIdentifier,\n max: 36,\n delimiter: \"[,]\",\n unique: true,\n },\n \"fill-in\": {\n format: scorm2004_regex.CMILangString250,\n max: 10,\n delimiter: \"[,]\",\n unique: false,\n },\n \"long-fill-in\": {\n format: scorm2004_regex.CMILangString4000,\n max: 1,\n delimiter: \"\",\n unique: false,\n },\n matching: {\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: \"[,]\",\n delimiter2: \"[.]\",\n unique: false,\n },\n performance: {\n format: \"^$|\" + scorm2004_regex.CMIShortIdentifier,\n format2:\n scorm2004_regex.CMIDecimal + \"|^$|\" + scorm2004_regex.CMIShortIdentifier,\n max: 250,\n delimiter: \"[,]\",\n delimiter2: \"[.]\",\n unique: false,\n },\n sequencing: {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: \"[,]\",\n unique: false,\n },\n likert: {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 1,\n delimiter: \"\",\n unique: false,\n },\n numeric: {\n format: scorm2004_regex.CMIDecimal,\n max: 1,\n delimiter: \"\",\n unique: false,\n },\n other: {\n format: scorm2004_regex.CMIString4000,\n max: 1,\n delimiter: \"\",\n unique: false,\n },\n};\nexport const CorrectResponses: Responses = {\n \"true-false\": {\n max: 1,\n delimiter: \"\",\n unique: false,\n duplicate: false,\n format: \"^true$|^false$\",\n limit: 1,\n },\n choice: {\n max: 36,\n delimiter: \"[,]\",\n unique: true,\n duplicate: false,\n format: scorm2004_regex.CMILongIdentifier,\n },\n \"fill-in\": {\n max: 10,\n delimiter: \"[,]\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMILangString250cr,\n },\n \"long-fill-in\": {\n max: 1,\n delimiter: \"\",\n unique: false,\n duplicate: true,\n format: scorm2004_regex.CMILangString4000,\n },\n matching: {\n max: 36,\n delimiter: \"[,]\",\n delimiter2: \"[.]\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n },\n performance: {\n max: 250,\n delimiter: \"[,]\",\n delimiter2: \"[.]\",\n delimiter3: \"[:]\",\n unique: false,\n duplicate: false,\n format: \"^$|\" + scorm2004_regex.CMIShortIdentifier,\n format2:\n scorm2004_regex.CMIDecimal + \"|^$|\" + scorm2004_regex.CMIShortIdentifier,\n },\n sequencing: {\n max: 36,\n delimiter: \"[,]\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n likert: {\n max: 1,\n delimiter: \"\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n limit: 1,\n },\n numeric: {\n max: 2,\n delimiter: \"[:]\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIDecimal,\n limit: 1,\n },\n other: {\n max: 1,\n delimiter: \"\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIString4000,\n limit: 1,\n },\n};\n\nexport type ResponseType = {\n format: string;\n max: number;\n delimiter: string;\n unique: boolean;\n duplicate?: boolean;\n format2?: string;\n delimiter2?: string;\n limit?: number;\n delimiter3?: string;\n};\n\nexport type Responses = {\n [key: string]: ResponseType;\n};\n","/**\n * Class representing SCORM 2004's `cmi.interactions` object\n */\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { CMIArray } from \"../common/array\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\nimport { check2004ValidFormat } from \"./validation\";\nimport { scorm2004_regex } from \"../../constants/regex\";\nimport { LearnerResponses } from \"../../constants/response_constants\";\n\nexport class CMIInteractions extends CMIArray {\n /**\n * Constructor for `cmi.objectives` Array\n */\n constructor() {\n super({\n children: scorm2004_constants.interactions_children,\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.interaction.n object\n */\n\nexport class CMIInteractionsObject extends BaseCMI {\n private _id = \"\";\n private _type = \"\";\n private _timestamp = \"\";\n private _weighting = \"\";\n private _learner_response = \"\";\n private _result = \"\";\n private _latency = \"\";\n private _description = \"\";\n\n /**\n * Constructor for cmi.interaction.n\n */\n constructor() {\n super();\n this.objectives = new CMIArray({\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.correct_responses_children,\n });\n }\n\n public objectives: CMIArray;\n public correct_responses: CMIArray;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset() {\n this._initialized = false;\n this._id = \"\";\n this._type = \"\";\n this._timestamp = \"\";\n this._weighting = \"\";\n this._learner_response = \"\";\n this._result = \"\";\n this._latency = \"\";\n this._description = \"\";\n this.objectives = new CMIArray({\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.correct_responses_children,\n });\n }\n\n /**\n * Getter for _id\n * @return {string}\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * Getter for _type\n * @return {string}\n */\n get type(): string {\n return this._type;\n }\n\n /**\n * Setter for _type\n * @param {string} type\n */\n set type(type: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(type, scorm2004_regex.CMIType)) {\n this._type = type;\n }\n }\n }\n\n /**\n * Getter for _timestamp\n * @return {string}\n */\n get timestamp(): string {\n return this._timestamp;\n }\n\n /**\n * Setter for _timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {\n this._timestamp = timestamp;\n }\n }\n }\n\n /**\n * Getter for _weighting\n * @return {string}\n */\n get weighting(): string {\n return this._weighting;\n }\n\n /**\n * Setter for _weighting\n * @param {string} weighting\n */\n set weighting(weighting: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(weighting, scorm2004_regex.CMIDecimal)) {\n this._weighting = weighting;\n }\n }\n }\n\n /**\n * Getter for _learner_response\n * @return {string}\n */\n get learner_response(): string {\n return this._learner_response;\n }\n\n /**\n * Setter for _learner_response. Does type validation to make sure response\n * matches SCORM 2004's spec\n * @param {string} learner_response\n */\n set learner_response(learner_response: string) {\n if (this.initialized && (this._type === \"\" || this._id === \"\")) {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n let nodes = [];\n const response_type = LearnerResponses[this.type];\n\n if (response_type) {\n if (response_type?.delimiter) {\n nodes = learner_response.split(response_type.delimiter);\n } else {\n nodes[0] = learner_response;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n const formatRegex = new RegExp(response_type.format);\n\n for (let i = 0; i < nodes.length; i++) {\n if (response_type?.delimiter2) {\n const values = nodes[i].split(response_type.delimiter2);\n\n if (values.length === 2) {\n if (!values[0].match(formatRegex)) {\n throw new Scorm2004ValidationError(\n scorm2004_errors.TYPE_MISMATCH,\n );\n } else {\n if (\n !response_type.format2 ||\n !values[1].match(new RegExp(response_type.format2))\n ) {\n throw new Scorm2004ValidationError(\n scorm2004_errors.TYPE_MISMATCH,\n );\n }\n }\n } else {\n throw new Scorm2004ValidationError(\n scorm2004_errors.TYPE_MISMATCH,\n );\n }\n } else {\n if (!nodes[i].match(formatRegex)) {\n throw new Scorm2004ValidationError(\n scorm2004_errors.TYPE_MISMATCH,\n );\n } else {\n if (nodes[i] !== \"\" && response_type.unique) {\n for (let j = 0; j < i; j++) {\n if (nodes[i] === nodes[j]) {\n throw new Scorm2004ValidationError(\n scorm2004_errors.TYPE_MISMATCH,\n );\n }\n }\n }\n }\n }\n }\n } else {\n throw new Scorm2004ValidationError(\n scorm2004_errors.GENERAL_SET_FAILURE,\n );\n }\n\n this._learner_response = learner_response;\n } else {\n throw new Scorm2004ValidationError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n }\n\n /**\n * Getter for _result\n * @return {string}\n */\n get result(): string {\n return this._result;\n }\n\n /**\n * Setter for _result\n * @param {string} result\n */\n set result(result: string) {\n if (check2004ValidFormat(result, scorm2004_regex.CMIResult)) {\n this._result = result;\n }\n }\n\n /**\n * Getter for _latency\n * @return {string}\n */\n get latency(): string {\n return this._latency;\n }\n\n /**\n * Setter for _latency\n * @param {string} latency\n */\n set latency(latency: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(latency, scorm2004_regex.CMITimespan)) {\n this._latency = latency;\n }\n }\n }\n\n /**\n * Getter for _description\n * @return {string}\n */\n get description(): string {\n return this._description;\n }\n\n /**\n * Setter for _description\n * @param {string} description\n */\n set description(description: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (\n check2004ValidFormat(\n description,\n scorm2004_regex.CMILangString250,\n true,\n )\n ) {\n this._description = description;\n }\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * type: string,\n * objectives: CMIArray,\n * timestamp: string,\n * correct_responses: CMIArray,\n * weighting: string,\n * learner_response: string,\n * result: string,\n * latency: string,\n * description: string\n * }\n * }\n */\n toJSON(): {\n id: string;\n type: string;\n objectives: CMIArray;\n timestamp: string;\n correct_responses: CMIArray;\n weighting: string;\n learner_response: string;\n result: string;\n latency: string;\n description: string;\n } {\n this.jsonString = true;\n const result = {\n id: this.id,\n type: this.type,\n objectives: this.objectives,\n timestamp: this.timestamp,\n weighting: this.weighting,\n learner_response: this.learner_response,\n result: this.result,\n latency: this.latency,\n description: this.description,\n correct_responses: this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.objectives.n object\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n private _id = \"\";\n\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset() {\n this._initialized = false;\n this._id = \"\";\n }\n\n /**\n * Getter for _id\n * @return {string}\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON(): {\n id: string;\n } {\n this.jsonString = true;\n const result = {\n id: this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n private _pattern = \"\";\n\n /**\n * Constructor for cmi.interactions.n.correct_responses.n\n */\n constructor() {\n super();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset() {\n this._initialized = false;\n this._pattern = \"\";\n }\n\n /**\n * Getter for _pattern\n * @return {string}\n */\n get pattern(): string {\n return this._pattern;\n }\n\n /**\n * Setter for _pattern\n * @param {string} pattern\n */\n set pattern(pattern: string) {\n if (check2004ValidFormat(pattern, scorm2004_regex.CMIFeedback)) {\n this._pattern = pattern;\n }\n }\n\n /**\n * toJSON cmi.interactions.n.correct_responses.n object\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON(): {\n pattern: string;\n } {\n this.jsonString = true;\n const result = {\n pattern: this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n","/**\n * Class for SCORM 2004's cmi *.score object\n */\nimport { CMIScore } from \"../common/score\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { scorm2004_regex } from \"../../constants/regex\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { check2004ValidFormat, check2004ValidRange } from \"./validation\";\n\nexport class Scorm2004CMIScore extends CMIScore {\n private _scaled = \"\";\n\n /**\n * Constructor for cmi *.score\n */\n constructor() {\n super({\n score_children: scorm2004_constants.score_children,\n max: \"\",\n invalidErrorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n invalidTypeCode: scorm2004_errors.TYPE_MISMATCH,\n invalidRangeCode: scorm2004_errors.VALUE_OUT_OF_RANGE,\n decimalRegex: scorm2004_regex.CMIDecimal,\n errorClass: Scorm2004ValidationError,\n });\n }\n\n /**\n * Called when the API has been reset\n */\n override reset(): void {\n this._initialized = false;\n this._scaled = \"\";\n this._raw = \"\";\n this._min = \"\";\n this._max = \"\";\n }\n\n /**\n * Getter for _scaled\n * @return {string}\n */\n get scaled(): string {\n return this._scaled;\n }\n\n /**\n * Setter for _scaled\n * @param {string} scaled\n */\n set scaled(scaled: string) {\n if (\n check2004ValidFormat(scaled, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(scaled, scorm2004_regex.scaled_range)\n ) {\n this._scaled = scaled;\n }\n }\n\n /**\n * toJSON for cmi *.score\n *\n * @return {\n * {\n * scaled: string,\n * raw: string,\n * min: string,\n * max: string\n * }\n * }\n */\n override toJSON(): {\n scaled: string;\n raw: string;\n min: string;\n max: string;\n } {\n this.jsonString = true;\n const result = {\n scaled: this.scaled,\n raw: this.raw,\n min: this.min,\n max: this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import { CMIArray } from \"../common/array\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { check2004ValidFormat } from \"./validation\";\nimport { scorm2004_regex } from \"../../constants/regex\";\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_lms object\n * @extends CMIArray\n */\nexport class CMICommentsFromLMS extends CMIArray {\n /**\n * Constructor for cmi.comments_from_lms Array\n */\n constructor() {\n super({\n children: scorm2004_constants.comments_children,\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner object\n */\n\nexport class CMICommentsFromLearner extends CMIArray {\n /**\n * Constructor for cmi.comments_from_learner Array\n */\n constructor() {\n super({\n children: scorm2004_constants.comments_children,\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object\n */\n\nexport class CMICommentsObject extends BaseCMI {\n private _comment = \"\";\n private _location = \"\";\n private _timestamp = \"\";\n private readonly _readOnlyAfterInit: boolean;\n\n /**\n * Constructor for cmi.comments_from_learner.n and cmi.comments_from_lms.n\n * @param {boolean} readOnlyAfterInit\n */\n constructor(readOnlyAfterInit: boolean = false) {\n super();\n this._comment = \"\";\n this._location = \"\";\n this._timestamp = \"\";\n this._readOnlyAfterInit = readOnlyAfterInit;\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n }\n\n /**\n * Getter for _comment\n * @return {string}\n */\n get comment(): string {\n return this._comment;\n }\n\n /**\n * Setter for _comment\n * @param {string} comment\n */\n set comment(comment: string) {\n if (this.initialized && this._readOnlyAfterInit) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n if (\n check2004ValidFormat(comment, scorm2004_regex.CMILangString4000, true)\n ) {\n this._comment = comment;\n }\n }\n }\n\n /**\n * Getter for _location\n * @return {string}\n */\n get location(): string {\n return this._location;\n }\n\n /**\n * Setter for _location\n * @param {string} location\n */\n set location(location: string) {\n if (this.initialized && this._readOnlyAfterInit) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n if (check2004ValidFormat(location, scorm2004_regex.CMIString250)) {\n this._location = location;\n }\n }\n }\n\n /**\n * Getter for _timestamp\n * @return {string}\n */\n get timestamp(): string {\n return this._timestamp;\n }\n\n /**\n * Setter for _timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp: string) {\n if (this.initialized && this._readOnlyAfterInit) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {\n this._timestamp = timestamp;\n }\n }\n }\n\n /**\n * toJSON for cmi.comments_from_learner.n object\n * @return {\n * {\n * comment: string,\n * location: string,\n * timestamp: string\n * }\n * }\n */\n toJSON(): {\n comment: string;\n location: string;\n timestamp: string;\n } {\n this.jsonString = true;\n const result = {\n comment: this.comment,\n location: this.location,\n timestamp: this.timestamp,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import { CMIArray } from \"../common/array\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { Scorm2004CMIScore } from \"./score\";\nimport { check2004ValidFormat, check2004ValidRange } from \"./validation\";\nimport { scorm2004_regex } from \"../../constants/regex\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\n\n/**\n * Class representing SCORM 2004's `cmi.objectives` object\n * @extends CMIArray\n */\nexport class CMIObjectives extends CMIArray {\n /**\n * Constructor for `cmi.objectives` Array\n */\n constructor() {\n super({\n children: scorm2004_constants.objectives_children,\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n\n /**\n * Find an objective by its ID\n */\n public findObjectiveById(id: string): CMIObjectivesObject | undefined {\n return this.childArray.find((objective) => objective.id === id);\n }\n\n /**\n * Find objective by its index\n */\n public findObjectiveByIndex(index: number): CMIObjectivesObject {\n return this.childArray[index];\n }\n\n /**\n * Set an objective at the given index\n */\n public setObjectiveByIndex(index: number, objective: CMIObjectivesObject) {\n this.childArray[index] = objective;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.objectives.n object\n */\nexport class CMIObjectivesObject extends BaseCMI {\n private _id = \"\";\n private _success_status = \"unknown\";\n private _completion_status = \"unknown\";\n private _progress_measure = \"\";\n private _description = \"\";\n\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n this.score = new Scorm2004CMIScore();\n }\n\n override reset() {\n this._initialized = false;\n }\n\n public score: Scorm2004CMIScore;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n /**\n * Getter for _id\n * @return {string}\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * Getter for _success_status\n * @return {string}\n */\n get success_status(): string {\n return this._success_status;\n }\n\n /**\n * Setter for _success_status\n * @param {string} success_status\n */\n set success_status(success_status: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {\n this._success_status = success_status;\n }\n }\n }\n\n /**\n * Getter for _completion_status\n * @return {string}\n */\n get completion_status(): string {\n return this._completion_status;\n }\n\n /**\n * Setter for _completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {\n this._completion_status = completion_status;\n }\n }\n }\n\n /**\n * Getter for _progress_measure\n * @return {string}\n */\n get progress_measure(): string {\n return this._progress_measure;\n }\n\n /**\n * Setter for _progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (\n check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, scorm2004_regex.progress_range)\n ) {\n this._progress_measure = progress_measure;\n }\n }\n }\n\n /**\n * Getter for _description\n * @return {string}\n */\n get description(): string {\n return this._description;\n }\n\n /**\n * Setter for _description\n * @param {string} description\n */\n set description(description: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (\n check2004ValidFormat(\n description,\n scorm2004_regex.CMILangString250,\n true,\n )\n ) {\n this._description = description;\n }\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n *\n * @return {\n * {\n * id: string,\n * success_status: string,\n * completion_status: string,\n * progress_measure: string,\n * description: string,\n * score: Scorm2004CMIScore\n * }\n * }\n */\n toJSON(): {\n id: string;\n success_status: string;\n completion_status: string;\n progress_measure: string;\n description: string;\n score: Scorm2004CMIScore;\n } {\n this.jsonString = true;\n const result = {\n id: this.id,\n success_status: this.success_status,\n completion_status: this.completion_status,\n progress_measure: this.progress_measure,\n description: this.description,\n score: this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import { scorm2004_constants } from \"../../constants/api_constants\";\nimport { scorm2004_regex } from \"../../constants/regex\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport * as Util from \"../../utilities\";\nimport { BaseRootCMI } from \"../common/base_cmi\";\nimport { check2004ValidFormat, check2004ValidRange } from \"./validation\";\nimport { CMILearnerPreference } from \"./learner_preference\";\nimport { CMIInteractions } from \"./interactions\";\nimport { Scorm2004CMIScore } from \"./score\";\nimport { CMICommentsFromLearner, CMICommentsFromLMS } from \"./comments\";\nimport { CMIObjectives } from \"./objectives\";\n\n/**\n * Class representing cmi object for SCORM 2004\n */\nexport class CMI extends BaseRootCMI {\n /**\n * Constructor for the SCORM 2004 cmi object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean = false) {\n super();\n this.learner_preference = new CMILearnerPreference();\n this.score = new Scorm2004CMIScore();\n this.comments_from_learner = new CMICommentsFromLearner();\n this.comments_from_lms = new CMICommentsFromLMS();\n this.interactions = new CMIInteractions();\n this.objectives = new CMIObjectives();\n if (initialized) this.initialize();\n }\n\n public learner_preference: CMILearnerPreference;\n public score: Scorm2004CMIScore;\n public comments_from_learner: CMICommentsFromLearner;\n public comments_from_lms: CMICommentsFromLMS;\n public interactions: CMIInteractions;\n public objectives: CMIObjectives;\n\n private __version = \"1.0\";\n private __children = scorm2004_constants.cmi_children;\n private _completion_status = \"unknown\";\n private _completion_threshold = \"\";\n private _credit = \"credit\";\n private _entry = \"\";\n private _exit = \"\";\n private _launch_data = \"\";\n private _learner_id = \"\";\n private _learner_name = \"\";\n private _location = \"\";\n private _max_time_allowed = \"\";\n private _mode = \"normal\";\n private _progress_measure = \"\";\n private _scaled_passing_score = \"\";\n private _session_time = \"PT0H0M0S\";\n private _success_status = \"unknown\";\n private _suspend_data = \"\";\n private _time_limit_action = \"continue,no message\";\n private _total_time = \"\";\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.learner_preference?.initialize();\n this.score?.initialize();\n this.comments_from_learner?.initialize();\n this.comments_from_lms?.initialize();\n this.interactions?.initialize();\n this.objectives?.initialize();\n }\n\n /**\n * Called when API is moving to another SCO\n */\n reset() {\n this._initialized = false;\n\n this._completion_status = \"incomplete\";\n this._exit = \"\";\n this._session_time = \"PT0H0M0S\";\n this._progress_measure = \"\";\n this._location = \"\";\n\n this.objectives?.reset(false);\n this.interactions?.reset(true);\n\n this.score?.reset();\n this.comments_from_learner?.reset();\n this.comments_from_lms?.reset();\n this.learner_preference?.reset();\n }\n\n /**\n * Getter for __version\n * @return {string}\n * @private\n */\n get _version(): string {\n return this.__version;\n }\n\n /**\n * Setter for __version. Just throws an error.\n * @param {string} _version\n * @private\n */\n set _version(_version: string) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n\n /**\n * Getter for __children\n * @return {string}\n * @private\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for __children. Just throws an error.\n * @param {number} _children\n * @private\n */\n set _children(_children: number) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n\n /**\n * Getter for _completion_status\n * @return {string}\n */\n get completion_status(): string {\n return this._completion_status;\n }\n\n /**\n * Setter for _completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status: string) {\n if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {\n this._completion_status = completion_status;\n }\n }\n\n /**\n * Getter for _completion_threshold\n * @return {string}\n */\n get completion_threshold(): string {\n return this._completion_threshold;\n }\n\n /**\n * Setter for _completion_threshold. Can only be called before initialization.\n * @param {string} completion_threshold\n */\n set completion_threshold(completion_threshold: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._completion_threshold = completion_threshold;\n }\n }\n\n /**\n * Setter for _credit\n * @return {string}\n */\n get credit(): string {\n return this._credit;\n }\n\n /**\n * Setter for _credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._credit = credit;\n }\n }\n\n /**\n * Getter for _entry\n * @return {string}\n */\n get entry(): string {\n return this._entry;\n }\n\n /**\n * Setter for _entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._entry = entry;\n }\n }\n\n /**\n * Getter for _exit. Should only be called during JSON export.\n * @return {string}\n */\n get exit(): string {\n if (!this.jsonString) {\n throw new Scorm2004ValidationError(scorm2004_errors.WRITE_ONLY_ELEMENT);\n }\n return this._exit;\n }\n\n /**\n * Getter for _exit\n * @param {string} exit\n */\n set exit(exit: string) {\n if (check2004ValidFormat(exit, scorm2004_regex.CMIExit, true)) {\n this._exit = exit;\n }\n }\n\n /**\n * Getter for _launch_data\n * @return {string}\n */\n get launch_data(): string {\n return this._launch_data;\n }\n\n /**\n * Setter for _launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._launch_data = launch_data;\n }\n }\n\n /**\n * Getter for _learner_id\n * @return {string}\n */\n get learner_id(): string {\n return this._learner_id;\n }\n\n /**\n * Setter for _learner_id. Can only be called before initialization.\n * @param {string} learner_id\n */\n set learner_id(learner_id: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._learner_id = learner_id;\n }\n }\n\n /**\n * Getter for _learner_name\n * @return {string}\n */\n get learner_name(): string {\n return this._learner_name;\n }\n\n /**\n * Setter for _learner_name. Can only be called before initialization.\n * @param {string} learner_name\n */\n set learner_name(learner_name: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._learner_name = learner_name;\n }\n }\n\n /**\n * Getter for _location\n * @return {string}\n */\n get location(): string {\n return this._location;\n }\n\n /**\n * Setter for _location\n * @param {string} location\n */\n set location(location: string) {\n if (check2004ValidFormat(location, scorm2004_regex.CMIString1000)) {\n this._location = location;\n }\n }\n\n /**\n * Getter for _max_time_allowed\n * @return {string}\n */\n get max_time_allowed(): string {\n return this._max_time_allowed;\n }\n\n /**\n * Setter for _max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._max_time_allowed = max_time_allowed;\n }\n }\n\n /**\n * Getter for _mode\n * @return {string}\n */\n get mode(): string {\n return this._mode;\n }\n\n /**\n * Setter for _mode. Can only be called before initialization.\n * @param {string} mode\n */\n set mode(mode: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._mode = mode;\n }\n }\n\n /**\n * Getter for _progress_measure\n * @return {string}\n */\n get progress_measure(): string {\n return this._progress_measure;\n }\n\n /**\n * Setter for _progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure: string) {\n if (\n check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, scorm2004_regex.progress_range)\n ) {\n this._progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for _scaled_passing_score\n * @return {string}\n */\n get scaled_passing_score(): string {\n return this._scaled_passing_score;\n }\n\n /**\n * Setter for _scaled_passing_score. Can only be called before initialization.\n * @param {string} scaled_passing_score\n */\n set scaled_passing_score(scaled_passing_score: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._scaled_passing_score = scaled_passing_score;\n }\n }\n\n /**\n * Getter for _session_time. Should only be called during JSON export.\n * @return {string}\n */\n get session_time(): string {\n if (!this.jsonString) {\n throw new Scorm2004ValidationError(scorm2004_errors.WRITE_ONLY_ELEMENT);\n }\n return this._session_time;\n }\n\n /**\n * Setter for _session_time\n * @param {string} session_time\n */\n set session_time(session_time: string) {\n if (check2004ValidFormat(session_time, scorm2004_regex.CMITimespan)) {\n this._session_time = session_time;\n }\n }\n\n /**\n * Getter for _success_status\n * @return {string}\n */\n get success_status(): string {\n return this._success_status;\n }\n\n /**\n * Setter for _success_status\n * @param {string} success_status\n */\n set success_status(success_status: string) {\n if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {\n this._success_status = success_status;\n }\n }\n\n /**\n * Getter for _suspend_data\n * @return {string}\n */\n get suspend_data(): string {\n return this._suspend_data;\n }\n\n /**\n * Setter for _suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data: string) {\n if (\n check2004ValidFormat(suspend_data, scorm2004_regex.CMIString64000, true)\n ) {\n this._suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for _time_limit_action\n * @return {string}\n */\n get time_limit_action(): string {\n return this._time_limit_action;\n }\n\n /**\n * Setter for _time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._time_limit_action = time_limit_action;\n }\n }\n\n /**\n * Getter for _total_time\n * @return {string}\n */\n get total_time(): string {\n return this._total_time;\n }\n\n /**\n * Setter for _total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._total_time = total_time;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string} ISO8601 Duration\n */\n getCurrentTotalTime(): string {\n let sessionTime = this._session_time;\n const startTime = this.start_time;\n\n if (typeof startTime !== \"undefined\" && startTime !== null) {\n const seconds = new Date().getTime() - startTime;\n sessionTime = Util.getSecondsAsISODuration(seconds / 1000);\n }\n\n return Util.addTwoDurations(\n this._total_time,\n sessionTime,\n scorm2004_regex.CMITimespan,\n );\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * comments_from_learner: CMICommentsFromLearner,\n * comments_from_lms: CMICommentsFromLMS,\n * completion_status: string,\n * completion_threshold: string,\n * credit: string,\n * entry: string,\n * exit: string,\n * interactions: CMIInteractions,\n * launch_data: string,\n * learner_id: string,\n * learner_name: string,\n * learner_preference: CMILearnerPreference,\n * location: string,\n * max_time_allowed: string,\n * mode: string,\n * objectives: CMIObjectives,\n * progress_measure: string,\n * scaled_passing_score: string,\n * score: Scorm2004CMIScore,\n * session_time: string,\n * success_status: string,\n * suspend_data: string,\n * time_limit_action: string\n * }\n * }\n */\n toJSON(): {\n comments_from_learner: CMICommentsFromLearner;\n comments_from_lms: CMICommentsFromLMS;\n completion_status: string;\n completion_threshold: string;\n credit: string;\n entry: string;\n exit: string;\n interactions: CMIInteractions;\n launch_data: string;\n learner_id: string;\n learner_name: string;\n learner_preference: CMILearnerPreference;\n location: string;\n max_time_allowed: string;\n mode: string;\n objectives: CMIObjectives;\n progress_measure: string;\n scaled_passing_score: string;\n score: Scorm2004CMIScore;\n session_time: string;\n success_status: string;\n suspend_data: string;\n time_limit_action: string;\n } {\n this.jsonString = true;\n const result = {\n comments_from_learner: this.comments_from_learner,\n comments_from_lms: this.comments_from_lms,\n completion_status: this.completion_status,\n completion_threshold: this.completion_threshold,\n credit: this.credit,\n entry: this.entry,\n exit: this.exit,\n interactions: this.interactions,\n launch_data: this.launch_data,\n learner_id: this.learner_id,\n learner_name: this.learner_name,\n learner_preference: this.learner_preference,\n location: this.location,\n max_time_allowed: this.max_time_allowed,\n mode: this.mode,\n objectives: this.objectives,\n progress_measure: this.progress_measure,\n scaled_passing_score: this.scaled_passing_score,\n score: this.score,\n session_time: this.session_time,\n success_status: this.success_status,\n suspend_data: this.suspend_data,\n time_limit_action: this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n","const ValidLanguages: string[] = [\n \"aa\",\n \"ab\",\n \"ae\",\n \"af\",\n \"ak\",\n \"am\",\n \"an\",\n \"ar\",\n \"as\",\n \"av\",\n \"ay\",\n \"az\",\n \"ba\",\n \"be\",\n \"bg\",\n \"bh\",\n \"bi\",\n \"bm\",\n \"bn\",\n \"bo\",\n \"br\",\n \"bs\",\n \"ca\",\n \"ce\",\n \"ch\",\n \"co\",\n \"cr\",\n \"cs\",\n \"cu\",\n \"cv\",\n \"cy\",\n \"da\",\n \"de\",\n \"dv\",\n \"dz\",\n \"ee\",\n \"el\",\n \"en\",\n \"eo\",\n \"es\",\n \"et\",\n \"eu\",\n \"fa\",\n \"ff\",\n \"fi\",\n \"fj\",\n \"fo\",\n \"fr\",\n \"fy\",\n \"ga\",\n \"gd\",\n \"gl\",\n \"gn\",\n \"gu\",\n \"gv\",\n \"ha\",\n \"he\",\n \"hi\",\n \"ho\",\n \"hr\",\n \"ht\",\n \"hu\",\n \"hy\",\n \"hz\",\n \"ia\",\n \"id\",\n \"ie\",\n \"ig\",\n \"ii\",\n \"ik\",\n \"io\",\n \"is\",\n \"it\",\n \"iu\",\n \"ja\",\n \"jv\",\n \"ka\",\n \"kg\",\n \"ki\",\n \"kj\",\n \"kk\",\n \"kl\",\n \"km\",\n \"kn\",\n \"ko\",\n \"kr\",\n \"ks\",\n \"ku\",\n \"kv\",\n \"kw\",\n \"ky\",\n \"la\",\n \"lb\",\n \"lg\",\n \"li\",\n \"ln\",\n \"lo\",\n \"lt\",\n \"lu\",\n \"lv\",\n \"mg\",\n \"mh\",\n \"mi\",\n \"mk\",\n \"ml\",\n \"mn\",\n \"mo\",\n \"mr\",\n \"ms\",\n \"mt\",\n \"my\",\n \"na\",\n \"nb\",\n \"nd\",\n \"ne\",\n \"ng\",\n \"nl\",\n \"nn\",\n \"no\",\n \"nr\",\n \"nv\",\n \"ny\",\n \"oc\",\n \"oj\",\n \"om\",\n \"or\",\n \"os\",\n \"pa\",\n \"pi\",\n \"pl\",\n \"ps\",\n \"pt\",\n \"qu\",\n \"rm\",\n \"rn\",\n \"ro\",\n \"ru\",\n \"rw\",\n \"sa\",\n \"sc\",\n \"sd\",\n \"se\",\n \"sg\",\n \"sh\",\n \"si\",\n \"sk\",\n \"sl\",\n \"sm\",\n \"sn\",\n \"so\",\n \"sq\",\n \"sr\",\n \"ss\",\n \"st\",\n \"su\",\n \"sv\",\n \"sw\",\n \"ta\",\n \"te\",\n \"tg\",\n \"th\",\n \"ti\",\n \"tk\",\n \"tl\",\n \"tn\",\n \"to\",\n \"tr\",\n \"ts\",\n \"tt\",\n \"tw\",\n \"ty\",\n \"ug\",\n \"uk\",\n \"ur\",\n \"uz\",\n \"ve\",\n \"vi\",\n \"vo\",\n \"wa\",\n \"wo\",\n \"xh\",\n \"yi\",\n \"yo\",\n \"za\",\n \"zh\",\n \"zu\",\n \"aar\",\n \"abk\",\n \"ave\",\n \"afr\",\n \"aka\",\n \"amh\",\n \"arg\",\n \"ara\",\n \"asm\",\n \"ava\",\n \"aym\",\n \"aze\",\n \"bak\",\n \"bel\",\n \"bul\",\n \"bih\",\n \"bis\",\n \"bam\",\n \"ben\",\n \"tib\",\n \"bod\",\n \"bre\",\n \"bos\",\n \"cat\",\n \"che\",\n \"cha\",\n \"cos\",\n \"cre\",\n \"cze\",\n \"ces\",\n \"chu\",\n \"chv\",\n \"wel\",\n \"cym\",\n \"dan\",\n \"ger\",\n \"deu\",\n \"div\",\n \"dzo\",\n \"ewe\",\n \"gre\",\n \"ell\",\n \"eng\",\n \"epo\",\n \"spa\",\n \"est\",\n \"baq\",\n \"eus\",\n \"per\",\n \"fas\",\n \"ful\",\n \"fin\",\n \"fij\",\n \"fao\",\n \"fre\",\n \"fra\",\n \"fry\",\n \"gle\",\n \"gla\",\n \"glg\",\n \"grn\",\n \"guj\",\n \"glv\",\n \"hau\",\n \"heb\",\n \"hin\",\n \"hmo\",\n \"hrv\",\n \"hat\",\n \"hun\",\n \"arm\",\n \"hye\",\n \"her\",\n \"ina\",\n \"ind\",\n \"ile\",\n \"ibo\",\n \"iii\",\n \"ipk\",\n \"ido\",\n \"ice\",\n \"isl\",\n \"ita\",\n \"iku\",\n \"jpn\",\n \"jav\",\n \"geo\",\n \"kat\",\n \"kon\",\n \"kik\",\n \"kua\",\n \"kaz\",\n \"kal\",\n \"khm\",\n \"kan\",\n \"kor\",\n \"kau\",\n \"kas\",\n \"kur\",\n \"kom\",\n \"cor\",\n \"kir\",\n \"lat\",\n \"ltz\",\n \"lug\",\n \"lim\",\n \"lin\",\n \"lao\",\n \"lit\",\n \"lub\",\n \"lav\",\n \"mlg\",\n \"mah\",\n \"mao\",\n \"mri\",\n \"mac\",\n \"mkd\",\n \"mal\",\n \"mon\",\n \"mol\",\n \"mar\",\n \"may\",\n \"msa\",\n \"mlt\",\n \"bur\",\n \"mya\",\n \"nau\",\n \"nob\",\n \"nde\",\n \"nep\",\n \"ndo\",\n \"dut\",\n \"nld\",\n \"nno\",\n \"nor\",\n \"nbl\",\n \"nav\",\n \"nya\",\n \"oci\",\n \"oji\",\n \"orm\",\n \"ori\",\n \"oss\",\n \"pan\",\n \"pli\",\n \"pol\",\n \"pus\",\n \"por\",\n \"que\",\n \"roh\",\n \"run\",\n \"rum\",\n \"ron\",\n \"rus\",\n \"kin\",\n \"san\",\n \"srd\",\n \"snd\",\n \"sme\",\n \"sag\",\n \"slo\",\n \"sin\",\n \"slk\",\n \"slv\",\n \"smo\",\n \"sna\",\n \"som\",\n \"alb\",\n \"sqi\",\n \"srp\",\n \"ssw\",\n \"sot\",\n \"sun\",\n \"swe\",\n \"swa\",\n \"tam\",\n \"tel\",\n \"tgk\",\n \"tha\",\n \"tir\",\n \"tuk\",\n \"tgl\",\n \"tsn\",\n \"ton\",\n \"tur\",\n \"tso\",\n \"tat\",\n \"twi\",\n \"tah\",\n \"uig\",\n \"ukr\",\n \"urd\",\n \"uzb\",\n \"ven\",\n \"vie\",\n \"vol\",\n \"wln\",\n \"wol\",\n \"xho\",\n \"yid\",\n \"yor\",\n \"zha\",\n \"chi\",\n \"zho\",\n \"zul\",\n];\nexport default ValidLanguages;\n","import { BaseCMI } from \"../common/base_cmi\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { check2004ValidFormat } from \"./validation\";\nimport { scorm2004_regex } from \"../../constants/regex\";\nimport { NAVBoolean } from \"../../constants/enums\";\nimport { CMIArray } from \"../common/array\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\n\n/**\n * Class representing SCORM 2004's adl object\n */\nexport class ADL extends BaseCMI {\n /**\n * Constructor for adl\n */\n constructor() {\n super();\n this.nav = new ADLNav();\n this.data = new ADLData();\n }\n\n public nav: ADLNav;\n public data = new ADLData();\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.nav?.initialize();\n }\n\n /**\n * Called when the API needs to be reset\n */\n reset() {\n this._initialized = false;\n this.nav?.reset();\n }\n\n /**\n * toJSON for adl\n * @return {\n * {\n * nav: ADLNav,\n * data: ADLData\n * }\n * }\n */\n toJSON(): {\n nav: ADLNav;\n data: ADLData;\n } {\n this.jsonString = true;\n const result = {\n nav: this.nav,\n data: this.data,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's `adl.nav` object\n */\n\nexport class ADLNav extends BaseCMI {\n private _request = \"_none_\";\n\n /**\n * Constructor for `adl.nav`\n */\n constructor() {\n super();\n this.request_valid = new ADLNavRequestValid();\n }\n\n public request_valid: ADLNavRequestValid;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.request_valid?.initialize();\n }\n\n /**\n * Called when the API needs to be reset\n */\n reset() {\n this._initialized = false;\n this._request = \"_none_\";\n this.request_valid?.reset();\n }\n\n /**\n * Getter for _request\n * @return {string}\n */\n get request(): string {\n return this._request;\n }\n\n /**\n * Setter for _request\n * @param {string} request\n */\n set request(request: string) {\n if (check2004ValidFormat(request, scorm2004_regex.NAVEvent)) {\n this._request = request;\n }\n }\n\n /**\n * toJSON for adl.nav\n *\n * @return {\n * {\n * request: string\n * }\n * }\n */\n toJSON(): {\n request: string;\n } {\n this.jsonString = true;\n const result = {\n request: this.request,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's `adl.data` object\n */\nexport class ADLData extends CMIArray {\n constructor() {\n super({\n children: scorm2004_constants.adl_data_children,\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class for SCORM 2004's adl.data.n object\n */\nexport class ADLDataObject extends BaseCMI {\n private _id = \"\";\n private _store = \"\";\n\n constructor() {\n super();\n }\n\n /**\n * Called when the API has been reset\n */\n reset() {\n this._initialized = false;\n }\n\n /**\n * Getter for _id\n * @return {string}\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * Getter for _store\n * @return {string}\n */\n get store(): string {\n return this._store;\n }\n\n /**\n * Setter for _store\n * @param {string} store\n */\n set store(store: string) {\n if (check2004ValidFormat(store, scorm2004_regex.CMILangString4000)) {\n this._store = store;\n }\n }\n\n /**\n * toJSON for adl.data.n\n *\n * @return {\n * {\n * id: string,\n * store: string\n * }\n * }\n */\n toJSON(): {\n id: string;\n store: string;\n } {\n this.jsonString = true;\n const result = {\n id: this._id,\n store: this._store,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav.request_valid object\n */\n\nexport class ADLNavRequestValid extends BaseCMI {\n private _continue = \"unknown\";\n private _previous = \"unknown\";\n private _choice: {\n [key: string]: NAVBoolean;\n } = {};\n private _jump: {\n [key: string]: NAVBoolean;\n } = {};\n\n /**\n * Constructor for adl.nav.request_valid\n */\n constructor() {\n super();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset() {\n this._initialized = false;\n this._continue = \"unknown\";\n this._previous = \"unknown\";\n }\n\n /**\n * Getter for _continue\n * @return {string}\n */\n get continue(): string {\n return this._continue;\n }\n\n /**\n * Setter for _continue. Just throws an error.\n * @param {string} _continue\n */\n set continue(_continue: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n if (check2004ValidFormat(_continue, scorm2004_regex.NAVBoolean)) {\n this._continue = _continue;\n }\n }\n\n /**\n * Getter for _previous\n * @return {string}\n */\n get previous(): string {\n return this._previous;\n }\n\n /**\n * Setter for _previous. Just throws an error.\n * @param {string} _previous\n */\n set previous(_previous: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n if (check2004ValidFormat(_previous, scorm2004_regex.NAVBoolean)) {\n this._previous = _previous;\n }\n }\n\n /**\n * Getter for _choice\n * @return {{ [key: string]: NAVBoolean }}\n */\n get choice(): { [key: string]: NAVBoolean } {\n return this._choice;\n }\n\n /**\n * Setter for _choice\n * @param {{ [key: string]: string }} choice\n */\n set choice(choice: { [key: string]: string }) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n if (typeof choice !== \"object\") {\n throw new Scorm2004ValidationError(scorm2004_errors.TYPE_MISMATCH);\n }\n for (const key in choice) {\n if ({}.hasOwnProperty.call(choice, key)) {\n if (\n check2004ValidFormat(choice[key], scorm2004_regex.NAVBoolean) &&\n check2004ValidFormat(key, scorm2004_regex.NAVTarget)\n ) {\n this._choice[key] =\n NAVBoolean[choice[key] as keyof typeof NAVBoolean];\n }\n }\n }\n }\n\n /**\n * Getter for _jump\n * @return {{ [key: string]: NAVBoolean }}\n */\n get jump(): { [key: string]: NAVBoolean } {\n return this._jump;\n }\n\n /**\n * Setter for _jump\n * @param {{ [key: string]: string }} jump\n */\n set jump(jump: { [key: string]: string }) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n if (typeof jump !== \"object\") {\n throw new Scorm2004ValidationError(scorm2004_errors.TYPE_MISMATCH);\n }\n for (const key in jump) {\n if ({}.hasOwnProperty.call(jump, key)) {\n if (\n check2004ValidFormat(jump[key], scorm2004_regex.NAVBoolean) &&\n check2004ValidFormat(key, scorm2004_regex.NAVTarget)\n ) {\n this._jump[key] = NAVBoolean[jump[key] as keyof typeof NAVBoolean];\n }\n }\n }\n }\n\n /**\n * toJSON for adl.nav.request_valid\n *\n * @return {\n * {\n * previous: string,\n * continue: string\n * }\n * }\n */\n toJSON(): {\n previous: string;\n continue: string;\n } {\n this.jsonString = true;\n const result = {\n previous: this._previous,\n continue: this._continue,\n choice: this._choice,\n jump: this._jump,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import BaseAPI from \"./BaseAPI\";\nimport { CMI } from \"./cmi/scorm2004/cmi\";\nimport * as Utilities from \"./utilities\";\nimport { stringMatches } from \"./utilities\";\nimport {\n global_constants,\n scorm2004_constants,\n} from \"./constants/api_constants\";\nimport { scorm2004_errors } from \"./constants/error_codes\";\nimport { CorrectResponses, ResponseType } from \"./constants/response_constants\";\nimport ValidLanguages from \"./constants/language_constants\";\nimport { CMIArray } from \"./cmi/common/array\";\nimport { BaseCMI } from \"./cmi/common/base_cmi\";\nimport {\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n} from \"./cmi/scorm2004/interactions\";\nimport { CMICommentsObject } from \"./cmi/scorm2004/comments\";\nimport { CMIObjectivesObject } from \"./cmi/scorm2004/objectives\";\nimport { ADL, ADLDataObject } from \"./cmi/scorm2004/adl\";\nimport {\n CommitObject,\n RefObject,\n ResultObject,\n ScoreObject,\n Settings,\n} from \"./types/api_types\";\nimport { CompletionStatus, SuccessStatus } from \"./constants/enums\";\nimport { scorm2004_regex } from \"./constants/regex\";\n\n/**\n * API class for SCORM 2004\n */\nclass Scorm2004Impl extends BaseAPI {\n private _version: string = \"1.0\";\n private _globalObjectives: CMIObjectivesObject[] = [];\n\n /**\n * Constructor for SCORM 2004 API\n * @param {Settings} settings\n */\n constructor(settings?: Settings) {\n if (settings) {\n if (settings.mastery_override === undefined) {\n settings.mastery_override = false;\n }\n }\n\n super(scorm2004_errors, settings);\n\n this.cmi = new CMI();\n this.adl = new ADL();\n\n // Rename functions to match 2004 Spec and expose to modules\n this.Initialize = this.lmsInitialize;\n this.Terminate = this.lmsFinish;\n this.GetValue = this.lmsGetValue;\n this.SetValue = this.lmsSetValue;\n this.Commit = this.lmsCommit;\n this.GetLastError = this.lmsGetLastError;\n this.GetErrorString = this.lmsGetErrorString;\n this.GetDiagnostic = this.lmsGetDiagnostic;\n }\n\n public cmi: CMI;\n public adl: ADL;\n\n public Initialize: () => string;\n public Terminate: () => string;\n public GetValue: (CMIElement: string) => string;\n public SetValue: (CMIElement: string, value: any) => string;\n public Commit: () => string;\n public GetLastError: () => string;\n public GetErrorString: (CMIErrorCode: string | number) => string;\n public GetDiagnostic: (CMIErrorCode: string | number) => string;\n\n /**\n * Called when the API needs to be reset\n */\n reset(settings?: Settings) {\n this.commonReset(settings);\n\n this.cmi?.reset();\n this.adl?.reset();\n }\n\n /**\n * Getter for _version\n * @return {string}\n */\n get version(): string {\n return this._version;\n }\n\n /**\n * Getter for _globalObjectives\n */\n get globalObjectives(): CMIObjectivesObject[] {\n return this._globalObjectives;\n }\n\n /**\n * @return {string} bool\n */\n lmsInitialize(): string {\n this.cmi.initialize();\n return this.initialize(\"Initialize\");\n }\n\n /**\n * @return {string} bool\n */\n lmsFinish(): string {\n (async () => {\n await this.internalFinish();\n })();\n return global_constants.SCORM_TRUE;\n }\n\n async internalFinish(): Promise<string> {\n const result = await this.terminate(\"Terminate\", true);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.adl.nav.request !== \"_none_\") {\n const navActions: { [key: string]: string } = {\n continue: \"SequenceNext\",\n previous: \"SequencePrevious\",\n choice: \"SequenceChoice\",\n jump: \"SequenceJump\",\n exit: \"SequenceExit\",\n exitAll: \"SequenceExitAll\",\n abandon: \"SequenceAbandon\",\n abandonAll: \"SequenceAbandonAll\",\n };\n\n let request = this.adl.nav.request;\n const choiceJumpRegex = new RegExp(scorm2004_regex.NAVEvent);\n const matches = request.match(choiceJumpRegex);\n let target = \"\";\n if (matches) {\n if (matches.groups?.choice_target) {\n target = matches.groups?.choice_target;\n request = \"choice\";\n } else if (matches.groups?.jump_target) {\n target = matches.groups?.jump_target;\n request = \"jump\";\n }\n }\n const action = navActions[request];\n if (action) {\n this.processListeners(action, \"adl.nav.request\", target);\n }\n } else if (this.settings.autoProgress) {\n this.processListeners(\"SequenceNext\");\n }\n }\n\n return result;\n }\n\n /**\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement: string): string {\n const adlNavRequestRegex =\n \"^adl\\\\.nav\\\\.request_valid\\\\.(choice|jump)\\\\.{target=\\\\S{0,}([a-zA-Z0-9-_]+)}$\";\n if (stringMatches(CMIElement, adlNavRequestRegex)) {\n const matches = CMIElement.match(adlNavRequestRegex);\n const request = matches[1];\n const target = matches[2].replace(\"{target=\", \"\").replace(\"}\", \"\");\n if (request === \"choice\" || request === \"jump\") {\n if (this.settings.scoItemIdValidator) {\n return String(this.settings.scoItemIdValidator(target));\n }\n return String(this.settings.scoItemIds.includes(target));\n }\n }\n return this.getValue(\"GetValue\", true, CMIElement);\n }\n\n /**\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n lmsSetValue(CMIElement: string, value: any): string {\n // Proceed with regular setting for non-objective elements or fallback behavior\n return this.setValue(\"SetValue\", \"Commit\", true, CMIElement, value);\n }\n\n /**\n * Orders LMS to store all content parameters\n *\n * @return {string} bool\n */\n lmsCommit(): string {\n if (this.settings.asyncCommit) {\n this.scheduleCommit(500, \"LMSCommit\");\n } else {\n (async () => {\n await this.commit(\"LMSCommit\", false);\n })();\n }\n return global_constants.SCORM_TRUE;\n }\n\n /**\n * Returns last error code\n *\n * @return {string}\n */\n lmsGetLastError(): string {\n return this.getLastError(\"GetLastError\");\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode: string | number): string {\n return this.getErrorString(\"GetErrorString\", CMIErrorCode);\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode: string | number): string {\n return this.getDiagnostic(\"GetDiagnostic\", CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n override setCMIValue(CMIElement: string, value: any): string {\n // Check if we're updating a global or local objective\n if (stringMatches(CMIElement, \"cmi\\\\.objectives\\\\.\\\\d+\")) {\n const parts = CMIElement.split(\".\");\n const index = Number(parts[2]);\n const element_base = `cmi.objectives.${index}`;\n\n let objective_id;\n const setting_id = stringMatches(\n CMIElement,\n \"cmi\\\\.objectives\\\\.\\\\d+\\\\.id\",\n );\n\n if (setting_id) {\n // If we're setting the objective ID, capture it directly\n objective_id = value;\n } else {\n // Find existing objective ID if available\n const objective = this.cmi.objectives.findObjectiveByIndex(index);\n objective_id = objective ? objective.id : undefined;\n }\n\n // Check if the objective ID matches a global objective\n const is_global =\n objective_id && this.settings.globalObjectiveIds.includes(objective_id);\n\n if (is_global) {\n // Locate or create an entry in _globalObjectives for the global objective\n let global_index = this._globalObjectives.findIndex(\n (obj) => obj.id === objective_id,\n );\n\n if (global_index === -1) {\n global_index = this._globalObjectives.length;\n const newGlobalObjective = new CMIObjectivesObject();\n newGlobalObjective.id = objective_id;\n this._globalObjectives.push(newGlobalObjective);\n }\n\n // Update the global objective\n const global_element = CMIElement.replace(\n element_base,\n `_globalObjectives.${global_index}`,\n );\n this._commonSetCMIValue(\n \"SetGlobalObjectiveValue\",\n true,\n global_element,\n value,\n );\n }\n }\n return this._commonSetCMIValue(\"SetValue\", true, CMIElement, value);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {BaseCMI|null}\n */\n getChildElement(\n CMIElement: string,\n value: any,\n foundFirstIndex: boolean,\n ): BaseCMI | null {\n if (stringMatches(CMIElement, \"cmi\\\\.objectives\\\\.\\\\d+\")) {\n return new CMIObjectivesObject();\n }\n\n if (foundFirstIndex) {\n if (\n stringMatches(\n CMIElement,\n \"cmi\\\\.interactions\\\\.\\\\d+\\\\.correct_responses\\\\.\\\\d+\",\n )\n ) {\n return this.createCorrectResponsesObject(CMIElement, value);\n } else if (\n stringMatches(\n CMIElement,\n \"cmi\\\\.interactions\\\\.\\\\d+\\\\.objectives\\\\.\\\\d+\",\n )\n ) {\n return new CMIInteractionsObjectivesObject();\n }\n } else if (stringMatches(CMIElement, \"cmi\\\\.interactions\\\\.\\\\d+\")) {\n return new CMIInteractionsObject();\n }\n\n if (stringMatches(CMIElement, \"cmi\\\\.comments_from_learner\\\\.\\\\d+\")) {\n return new CMICommentsObject();\n } else if (stringMatches(CMIElement, \"cmi\\\\.comments_from_lms\\\\.\\\\d+\")) {\n return new CMICommentsObject(true);\n }\n\n if (stringMatches(CMIElement, \"adl\\\\.data\\\\.\\\\d+\")) {\n return new ADLDataObject();\n }\n\n return null;\n }\n\n private createCorrectResponsesObject(\n CMIElement: string,\n value: any,\n ): BaseCMI | null {\n const parts = CMIElement.split(\".\");\n const index = Number(parts[2]);\n const interaction = this.cmi.interactions.childArray[index];\n\n if (this.isInitialized()) {\n if (!interaction.type) {\n this.throwSCORMError(scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n this.checkDuplicateChoiceResponse(interaction, value);\n const response_type = CorrectResponses[interaction.type];\n if (response_type) {\n this.checkValidResponseType(response_type, value, interaction.type);\n } else {\n this.throwSCORMError(\n scorm2004_errors.GENERAL_SET_FAILURE,\n \"Incorrect Response Type: \" + interaction.type,\n );\n }\n }\n }\n\n if (this.lastErrorCode === \"0\") {\n return new CMIInteractionsCorrectResponsesObject();\n }\n\n return null;\n }\n\n /**\n * Checks for valid response types\n * @param {object} response_type\n * @param {any} value\n * @param {string} interaction_type\n */\n checkValidResponseType(\n response_type: ResponseType,\n value: any,\n interaction_type: string,\n ) {\n let nodes = [];\n if (response_type?.delimiter) {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(\n scorm2004_errors.GENERAL_SET_FAILURE,\n \"Data Model Element Pattern Too Long\",\n );\n }\n }\n\n /**\n * Checks for duplicate 'choice' responses.\n * @param {CMIInteractionsObject} interaction\n * @param {any} value\n */\n checkDuplicateChoiceResponse(interaction: CMIInteractionsObject, value: any) {\n const interaction_count = interaction.correct_responses._count;\n if (interaction.type === \"choice\") {\n for (\n let i = 0;\n i < interaction_count && this.lastErrorCode === \"0\";\n i++\n ) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_errors.GENERAL_SET_FAILURE);\n }\n }\n }\n }\n\n /**\n * Validate correct response.\n * @param {string} CMIElement\n * @param {*} value\n */\n validateCorrectResponse(CMIElement: string, value: any) {\n const parts = CMIElement.split(\".\");\n const index = Number(parts[2]);\n const pattern_index = Number(parts[4]);\n const interaction = this.cmi.interactions.childArray[index];\n\n const interaction_count = interaction.correct_responses._count;\n this.checkDuplicateChoiceResponse(interaction, value);\n\n const response_type = CorrectResponses[interaction.type];\n if (\n typeof response_type.limit === \"undefined\" ||\n interaction_count <= response_type.limit\n ) {\n this.checkValidResponseType(response_type, value, interaction.type);\n\n if (\n (this.lastErrorCode === \"0\" &&\n (!response_type.duplicate ||\n !this.checkDuplicatedPattern(\n interaction.correct_responses,\n pattern_index,\n value,\n ))) ||\n (this.lastErrorCode === \"0\" && value === \"\")\n ) {\n // do nothing, we want the inverse\n } else {\n if (this.lastErrorCode === \"0\") {\n this.throwSCORMError(\n scorm2004_errors.GENERAL_SET_FAILURE,\n \"Data Model Element Pattern Already Exists\",\n );\n }\n }\n } else {\n this.throwSCORMError(\n scorm2004_errors.GENERAL_SET_FAILURE,\n \"Data Model Element Collection Limit Reached\",\n );\n }\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n override getCMIValue(CMIElement: string): any {\n return this._commonGetCMIValue(\"GetValue\", true, CMIElement);\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {(string|number)} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n override getLmsErrorMessageDetails(\n errorNumber: string | number,\n detail: boolean,\n ): string {\n let basicMessage = \"\";\n let detailMessage = \"\";\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (scorm2004_constants.error_descriptions[errorNumber]) {\n basicMessage =\n scorm2004_constants.error_descriptions[errorNumber].basicMessage;\n detailMessage =\n scorm2004_constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Check to see if a correct_response value has been duplicated\n * @param {CMIArray} correct_response\n * @param {number} current_index\n * @param {*} value\n * @return {boolean}\n */\n checkDuplicatedPattern(\n correct_response: CMIArray,\n current_index: number,\n value: any,\n ): boolean {\n let found = false;\n const count = correct_response._count;\n for (let i = 0; i < count && !found; i++) {\n if (i !== current_index && correct_response.childArray[i] === value) {\n found = true;\n }\n }\n return found;\n }\n\n /**\n * Checks for a valid correct_response value\n * @param {string} interaction_type\n * @param {Array} nodes\n * @param {*} value\n */\n checkCorrectResponseValue(\n interaction_type: string,\n nodes: Array<any>,\n value: any,\n ) {\n const response = CorrectResponses[interaction_type];\n const formatRegex = new RegExp(response.format);\n for (let i = 0; i < nodes.length && this.lastErrorCode === \"0\"; i++) {\n if (\n interaction_type.match(\n \"^(fill-in|long-fill-in|matching|performance|sequencing)$\",\n )\n ) {\n nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);\n }\n\n if (response?.delimiter2) {\n const values = nodes[i].split(response.delimiter2);\n if (values.length === 2) {\n const matches = values[0].match(formatRegex);\n if (!matches) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n } else {\n if (\n !response.format2 ||\n !values[1].match(new RegExp(response.format2))\n ) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n } else {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n } else {\n const matches = nodes[i].match(formatRegex);\n if (\n (!matches && value !== \"\") ||\n (!matches && interaction_type === \"true-false\")\n ) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n } else {\n if (interaction_type === \"numeric\" && nodes.length > 1) {\n if (Number(nodes[0]) > Number(nodes[1])) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n } else {\n if (nodes[i] !== \"\" && response.unique) {\n for (let j = 0; j < i && this.lastErrorCode === \"0\"; j++) {\n if (nodes[i] === nodes[j]) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Remove prefixes from correct_response\n * @param {string} node\n * @return {*}\n */\n removeCorrectResponsePrefixes(node: string): any {\n let seenOrder = false;\n let seenCase = false;\n let seenLang = false;\n\n const prefixRegex = new RegExp(\n \"^({(lang|case_matters|order_matters)=([^}]+)})\",\n );\n let matches = node.match(prefixRegex);\n let langMatches = null;\n while (matches) {\n switch (matches[2]) {\n case \"lang\":\n langMatches = node.match(scorm2004_regex.CMILangcr);\n if (langMatches) {\n const lang = langMatches[3];\n if (lang !== undefined && lang.length > 0) {\n if (!ValidLanguages.includes(lang.toLowerCase())) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n }\n seenLang = true;\n break;\n case \"case_matters\":\n if (!seenLang && !seenOrder && !seenCase) {\n if (matches[3] !== \"true\" && matches[3] !== \"false\") {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n\n seenCase = true;\n break;\n case \"order_matters\":\n if (!seenCase && !seenLang && !seenOrder) {\n if (matches[3] !== \"true\" && matches[3] !== \"false\") {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n\n seenOrder = true;\n break;\n }\n node = node.substring(matches[1].length);\n matches = node.match(prefixRegex);\n }\n\n return node;\n }\n\n /**\n * Replace the whole API with another\n * @param {Scorm2004Impl} newAPI\n */\n replaceWithAnotherScormAPI(newAPI: Scorm2004Impl) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.adl = newAPI.adl;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean): object | Array<any> {\n const cmiExport: RefObject = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened: RefObject = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case \"flattened\":\n return Utilities.flatten(cmiExport);\n case \"params\":\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case \"json\":\n default:\n return cmiExport;\n }\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * @param {boolean} terminateCommit\n * @return {CommitObject}\n */\n renderCommitObject(terminateCommit: boolean): CommitObject {\n const cmiExport = this.renderCommitCMI(terminateCommit);\n const totalTimeDuration = this.cmi.getCurrentTotalTime();\n const totalTimeSeconds = Utilities.getDurationAsSeconds(\n totalTimeDuration,\n scorm2004_regex.CMITimespan,\n );\n\n let completionStatus = CompletionStatus.unknown;\n let successStatus = SuccessStatus.unknown;\n if (this.cmi.completion_status) {\n if (this.cmi.completion_status === \"completed\") {\n completionStatus = CompletionStatus.completed;\n } else if (this.cmi.completion_status === \"incomplete\") {\n completionStatus = CompletionStatus.incomplete;\n }\n }\n if (this.cmi.success_status) {\n if (this.cmi.success_status === \"passed\") {\n successStatus = SuccessStatus.passed;\n } else if (this.cmi.success_status === \"failed\") {\n successStatus = SuccessStatus.failed;\n }\n }\n\n const score = this.cmi.score;\n let scoreObject: ScoreObject = null;\n if (score) {\n scoreObject = {};\n\n if (!Number.isNaN(Number.parseFloat(score.raw))) {\n scoreObject.raw = Number.parseFloat(score.raw);\n }\n if (!Number.isNaN(Number.parseFloat(score.min))) {\n scoreObject.min = Number.parseFloat(score.min);\n }\n if (!Number.isNaN(Number.parseFloat(score.max))) {\n scoreObject.max = Number.parseFloat(score.max);\n }\n if (!Number.isNaN(Number.parseFloat(score.scaled))) {\n scoreObject.scaled = Number.parseFloat(score.scaled);\n }\n }\n\n const commitObject: CommitObject = {\n completionStatus: completionStatus,\n successStatus: successStatus,\n totalTimeSeconds: totalTimeSeconds,\n runtimeData: cmiExport,\n };\n if (scoreObject) {\n commitObject.score = scoreObject;\n }\n return commitObject;\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {ResultObject}\n */\n async storeData(terminateCommit: boolean): Promise<ResultObject> {\n if (terminateCommit) {\n if (this.cmi.mode === \"normal\") {\n if (this.cmi.credit === \"credit\") {\n if (this.cmi.completion_threshold && this.cmi.progress_measure) {\n if (this.cmi.progress_measure >= this.cmi.completion_threshold) {\n this.cmi.completion_status = \"completed\";\n } else {\n this.cmi.completion_status = \"incomplete\";\n }\n }\n if (this.cmi.scaled_passing_score && this.cmi.score.scaled) {\n if (this.cmi.score.scaled >= this.cmi.scaled_passing_score) {\n this.cmi.success_status = \"passed\";\n } else {\n this.cmi.success_status = \"failed\";\n }\n }\n }\n }\n }\n\n let navRequest = false;\n if (\n this.adl.nav.request !== this.startingData?.adl?.nav?.request &&\n this.adl.nav.request !== \"_none_\"\n ) {\n navRequest = true;\n }\n\n const commitObject = this.getCommitObject(terminateCommit);\n if (typeof this.settings.lmsCommitUrl === \"string\") {\n const result = await this.processHttpRequest(\n this.settings.lmsCommitUrl,\n commitObject,\n terminateCommit,\n );\n\n // check if this is a sequencing call, and then call the necessary JS\n {\n if (\n navRequest &&\n result.navRequest !== undefined &&\n result.navRequest !== \"\"\n ) {\n Function(`\"use strict\";(() => { ${result.navRequest} })()`)();\n }\n }\n return result;\n } else {\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n }\n }\n}\n\nexport { Scorm2004Impl };\n"],"names":["DefaultSettings","autocommit","autocommitSeconds","asyncCommit","sendFullCommit","lmsCommitUrl","dataCommitFormat","commitRequestDataType","autoProgress","logLevel","LogLevelEnum","ERROR","selfReportSessionTime","alwaysSendTotalTime","renderCommonCommitFields","strict_errors","xhrHeaders","xhrWithCredentials","fetchMode","responseHandler","response","text","responseText","httpResult","JSON","parse","hasOwnProperty","call","result","errorCode","global_constants","SCORM_TRUE","status","SCORM_FALSE","requestHandler","commitObject","onLogMessage","messageLevel","logMessage","console","error","WARN","warn","INFO","info","DEBUG","debug","log","scoItemIds","scoItemIdValidator","globalObjectiveIds","API","when","callback","_cancelled","this","_API","_timeout","setTimeout","wrapper","bind","_callback","cancel","clearTimeout","commit","error_codes","settings","_settings","BaseAPI","TypeError","currentState","STATE_NOT_INITIALIZED","lastErrorCode","listenerArray","_error_codes","apiLogLevel","undefined","NONE","commonReset","apiLog","clearScheduledCommit","startingData","initialize","callbackName","initializeMessage","terminationMessage","returnValue","isInitialized","throwSCORMError","INITIALIZED","isTerminated","TERMINATED","cmi","setStartTime","STATE_INITIALIZED","processListeners","clearSCORMError","functionName","CMIElement","formatMessage","terminate","checkTerminated","checkState","TERMINATION_BEFORE_INIT","MULTIPLE_TERMINATION","STATE_TERMINATED","storeData","getValue","RETRIEVE_BEFORE_INIT","RETRIEVE_AFTER_TERM","getCMIValue","e","handleValueAccessException","setValue","commitCallback","value","String","STORE_BEFORE_INIT","STORE_AFTER_TERM","setCMIValue","scheduleCommit","COMMIT_BEFORE_INIT","COMMIT_AFTER_TERM","getLastError","getErrorString","CMIErrorCode","getLmsErrorMessageDetails","getDiagnostic","beforeInitError","afterTermError","isNotInitialized","_errorNumber","_detail","Error","_CMIElement","_value","_commonSetCMIValue","methodName","scorm2004","structure","split","refObject","foundFirstIndex","invalidErrorMessage","invalidErrorCode","UNDEFINED_DATA_MODEL","GENERAL","idx","length","attribute","substring","READ_ONLY_ELEMENT","_checkObjectHasProperty","stringMatches","validateCorrectResponse","CMIArray","index","parseInt","isNaN","item","childArray","newChild","getChildElement","initialized","push","_commonGetCMIValue","uninitializedErrorMessage","_isTargetValid","target","VALUE_NOT_INITIALIZED","CHILDREN_ERROR","COUNT_ERROR","on","listenerName","listenerFunctions","i","listenerSplit","replace","off","removeIndex","findIndex","obj","splice","clear","filter","CMIElementsMatch","listener","functionsMatch","listenerHasCMIElement","indexOf","errorNumber","message","success","loadFromFlattenedJSON","json","int_pattern","obj_pattern","Object","keys","map","key","sort","test","a","c","testPattern","forEach","element","loadFromJSON","unflatten","a_pattern","c_match","a_match","match","a_num","Number","c_num","currentCMIElement","constructor","renderCMIToJSONString","stringify","k","v","renderCMIToJSONObject","processHttpRequest","url","params","immediate","api","genericError","performFetch","then","transformResponse","process","ScheduledCommit","getOwnPropertyDescriptor","getPrototypeOf","ValidationError","getCommitObject","terminateCommit","shouldTerminateCommit","renderCommitObject","renderCommitCMI","includes","fetch","method","mode","body","Array","join","headers","credentials","keepalive","__children","children","_errorCode","scorm12_errors","_errorClass","errorClass","BaseScormValidationError","reset","wipe","_initialized","_children","_count","toJSON","jsonString","BaseCMI","_start_time","Date","getTime","_raw","_min","score_children","scorm12_constants","__score_range","score_range","scorm12_regex","_max","max","__invalid_error_code","INVALID_SET_VALUE","__invalid_type_code","invalidTypeCode","TYPE_MISMATCH","__invalid_range_code","invalidRangeCode","VALUE_OUT_OF_RANGE","__decimal_regex","decimalRegex","CMIDecimal","__error_class","raw","checkValidFormat","checkValidRange","min","regexPattern","allowEmptyString","formatRegex","RegExp","matches","rangePattern","ranges","cmi_children","core_children","comments_children","objectives_children","correct_responses_children","student_data_children","student_preference_children","interactions_children","error_descriptions","basicMessage","detailMessage","aicc_constants","student_demographics_children","tries_children","attempt_records_children","paths_children","scorm2004_constants","adl_data_children","NAVBoolean","SuccessStatus","CompletionStatus","global_errors","INITIALIZATION_FAILED","TERMINATION_FAILURE","ARGUMENT_ERROR","GENERAL_GET_FAILURE","GENERAL_SET_FAILURE","GENERAL_COMMIT_FAILURE","UNIMPLEMENTED_ELEMENT","WRITE_ONLY_ELEMENT","DEPENDENCY_NOT_ESTABLISHED","scorm2004_errors","MULTIPLE_TERMINATIONS","CMIString256","CMIString4096","CMITime","CMITimespan","CMIInteger","CMISInteger","CMIIdentifier","CMIFeedback","CMIIndex","CMIStatus","CMIStatus2","CMIExit","CMIType","CMIResult","NAVEvent","audio_range","speed_range","weighting_range","text_range","aicc_regex","scorm2004_regex","CMIString200","CMIString250","CMIString1000","CMIString4000","CMIString64000","CMILang","CMILangString250","CMILangcr","CMILangString250cr","CMILangString4000","CMIShortIdentifier","CMILongIdentifier","CMIIndexStore","CMICStatus","CMISStatus","NAVTarget","scaled_range","progress_range","toString","name","errorMessage","detailedMessage","_detailedMessage","_errorMessage","SECONDS_PER_SECOND","SECONDS_PER_MINUTE","SECONDS_PER_HOUR","SECONDS_PER_DAY","designations","D","H","M","S","getSecondsAsHHMMSS","totalSeconds","hours","Math","floor","dateObj","minutes","getUTCMinutes","seconds","getSeconds","ms","msStr","countDecimals","toFixed","getSecondsAsISODuration","duration","remainder","designationsKey","current_seconds","getTimeAsSeconds","timeString","timeRegex","parts","getDurationAsSeconds","durationRegex","exec","years","days","addTwoDurations","first","second","regex","addHHMMSSTimeStrings","flatten","data","recurse","cur","prop","isArray","l","isEmpty","p","m","num","messageString","fillChars","j","str","tester","extendStatics","d","b","setPrototypeOf","__proto__","prototype","__extends","__","create","__assign","assign","t","s","n","arguments","apply","__rest","getOwnPropertySymbols","propertyIsEnumerable","__decorate","decorators","desc","r","Reflect","decorate","defineProperty","__param","paramIndex","decorator","__esDecorate","ctor","descriptorIn","contextIn","initializers","extraInitializers","accept","f","_","kind","descriptor","done","context","access","addInitializer","get","set","init","unshift","__runInitializers","thisArg","useValue","__propKey","x","concat","__setFunctionName","prefix","description","configurable","__metadata","metadataKey","metadataValue","metadata","__awaiter","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","__generator","y","label","sent","trys","ops","g","Iterator","verb","Symbol","iterator","op","pop","__createBinding","o","k2","__esModule","writable","enumerable","__exportStar","__values","__read","ar","__spread","__spreadArrays","il","jl","__spreadArray","to","from","pack","slice","__await","__asyncGenerator","asyncIterator","q","AsyncIterator","resume","fulfill","settle","shift","__asyncDelegator","__asyncValues","__makeTemplateObject","cooked","__setModuleDefault","__importStar","mod","__importDefault","default","__classPrivateFieldGet","receiver","state","has","__classPrivateFieldSet","__classPrivateFieldIn","__addDisposableResource","env","async","dispose","inner","asyncDispose","stack","_SuppressedError","SuppressedError","suppressed","__disposeResources","fail","hasError","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","definition","toStringTag","check2004ValidFormat","Scorm2004ValidationError","check2004ValidRange","_audio_level","_language","_delivery_speed","_audio_captioning","audio_level","language","delivery_speed","audio_captioning","LearnerResponses","format","delimiter","unique","choice","matching","format2","delimiter2","performance","sequencing","likert","numeric","other","CorrectResponses","duplicate","limit","delimiter3","_id","_type","_timestamp","_weighting","_learner_response","_result","_latency","_description","objectives","correct_responses","id","type","timestamp","weighting","learner_response","nodes","response_type","values","latency","_pattern","pattern","_scaled","scaled","CMIScore","readOnlyAfterInit","_comment","_location","_readOnlyAfterInit","comment","location","findObjectiveById","find","objective","findObjectiveByIndex","setObjectiveByIndex","_success_status","_completion_status","_progress_measure","score","Scorm2004CMIScore","success_status","completion_status","progress_measure","__version","_completion_threshold","_credit","_entry","_exit","_launch_data","_learner_id","_learner_name","_max_time_allowed","_mode","_scaled_passing_score","_session_time","_suspend_data","_time_limit_action","_total_time","learner_preference","CMILearnerPreference","comments_from_learner","CMICommentsFromLearner","comments_from_lms","CMICommentsFromLMS","interactions","CMIInteractions","CMIObjectives","_version","completion_threshold","credit","entry","exit","launch_data","learner_id","learner_name","max_time_allowed","scaled_passing_score","session_time","suspend_data","time_limit_action","total_time","getCurrentTotalTime","sessionTime","startTime","start_time","BaseRootCMI","ADLData","nav","ADLNav","_request","request_valid","ADLNavRequestValid","request","_store","store","_continue","_previous","_choice","_jump","jump","previous","continue","mastery_override","_globalObjectives","CMI","adl","ADL","Initialize","lmsInitialize","Terminate","lmsFinish","GetValue","lmsGetValue","SetValue","lmsSetValue","Commit","lmsCommit","GetLastError","lmsGetLastError","GetErrorString","lmsGetErrorString","GetDiagnostic","lmsGetDiagnostic","internalFinish","navActions","exitAll","abandon","abandonAll","choiceJumpRegex","groups","choice_target","jump_target","action","adlNavRequestRegex","element_base","global_index","newGlobalObjective","CMIObjectivesObject","global_element","createCorrectResponsesObject","CMIInteractionsObjectivesObject","CMIInteractionsObject","CMICommentsObject","ADLDataObject","interaction","checkDuplicateChoiceResponse","checkValidResponseType","CMIInteractionsCorrectResponsesObject","interaction_type","checkCorrectResponseValue","interaction_count","pattern_index","checkDuplicatedPattern","detail","correct_response","current_index","found","count","removeCorrectResponsePrefixes","node","seenOrder","seenCase","seenLang","prefixRegex","langMatches","lang","toLowerCase","replaceWithAnotherScormAPI","newAPI","cmiExport","flattened","totalTimeDuration","totalTimeSeconds","completionStatus","unknown","successStatus","completed","incomplete","passed","failed","scoreObject","parseFloat","runtimeData","navRequest","Function"],"sourceRoot":""}
1
+ {"version":3,"file":"scorm2004.min.js","mappings":"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ACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,O,QC3XF,cAIE,aACE,QAAK,YAAE,K,OAMF,EAAAtR,KAAO,IAAIuR,EALhB,EAAKC,IAAM,IAAIC,EACf,EAAKzR,KAAO,IAAIuR,E,CAClB,CA0CF,OAlDyB,oBAgBd,YAAA/mB,WAAT,W,MACE,YAAMA,WAAU,WACR,QAAR,EAAAzB,KAAKyoB,WAAG,SAAEhnB,YACZ,EAKA,YAAAoL,MAAA,W,MACE7M,KAAK+M,cAAe,EACZ,QAAR,EAAA/M,KAAKyoB,WAAG,SAAE5b,OACZ,EAWA,YAAAK,OAAA,WAIElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACboqB,IAAKzoB,KAAKyoB,IACVxR,KAAMjX,KAAKiX,MAGb,cADOjX,KAAKmN,WACL9O,CACT,EACF,EAlDA,CAAyB,EAAA+O,SAwDzB,cAME,aACE,QAAK,YAAE,K,OAND,EAAAub,SAAW,SAOjB,EAAKC,cAAgB,IAAIC,E,CAC3B,CA0DF,OAnE4B,oBAgBjB,YAAApnB,WAAT,W,MACE,YAAMA,WAAU,WACE,QAAlB,EAAAzB,KAAK4oB,qBAAa,SAAEnnB,YACtB,EAKA,YAAAoL,MAAA,W,MACE7M,KAAK+M,cAAe,EACpB/M,KAAK2oB,SAAW,SACE,QAAlB,EAAA3oB,KAAK4oB,qBAAa,SAAE/b,OACtB,EAMA,sBAAI,sBAAO,C,IAAX,WACE,OAAO7M,KAAK2oB,QACd,E,IAMA,SAAYG,GACNxH,EAAqBwH,EAAS,EAAAjW,gBAAgBN,YAChDvS,KAAK2oB,SAAWG,EAEpB,E,gCAWA,YAAA5b,OAAA,WAGElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbyqB,QAAS9oB,KAAK8oB,SAGhB,cADO9oB,KAAKmN,WACL9O,CACT,EACF,EAnEA,CAA4B,EAAA+O,SAwE5B,cACE,aACE,SAAK,UAAC,CACJb,SAAU,EAAAiE,oBAAoBC,kBAC9BnS,UAAW,EAAAiT,iBAAiBxL,kBAC5B4G,WAAY4U,KACZ,IACJ,CACF,OAR6B,oBAQ7B,EARA,CAA6B,EAAApb,UAa7B,cAIE,aACE,QAAK,YAAE,K,OAJD,EAAA+c,IAAM,GACN,EAAA6F,OAAS,G,CAIjB,CAmEF,OAzEmC,oBAWjC,YAAAlc,MAAA,WACE7M,KAAK+M,cAAe,CACtB,EAMA,sBAAI,iBAAE,C,IAAN,WACE,OAAO/M,KAAKkjB,GACd,E,IAMA,SAAOU,GACDtC,EAAqBsC,EAAI,EAAA/Q,gBAAgBY,qBAC3CzT,KAAKkjB,IAAMU,EAEf,E,gCAMA,sBAAI,oBAAK,C,IAAT,WACE,OAAO5jB,KAAK+oB,MACd,E,IAMA,SAAUC,GACJ1H,EAAqB0H,EAAO,EAAAnW,gBAAgBU,qBAC9CvT,KAAK+oB,OAASC,EAElB,E,gCAYA,YAAA9b,OAAA,WAIElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbulB,GAAI5jB,KAAKkjB,IACT8F,MAAOhpB,KAAK+oB,QAGd,cADO/oB,KAAKmN,WACL9O,CACT,EACF,EAzEA,CAAmC,EAAA+O,SA+EnC,cAaE,aACE,QAAK,YAAE,K,OAbD,EAAA6b,UAAY,UACZ,EAAAC,UAAY,UACZ,EAAAC,QAEJ,CAAC,EACG,EAAAC,MAEJ,CAAC,E,CAOL,CA4IF,OA3JwC,oBAoB7B,YAAAvc,MAAT,WACE7M,KAAK+M,cAAe,EACpB/M,KAAKipB,UAAY,UACjBjpB,KAAKkpB,UAAY,SACnB,EAMA,sBAAI,uBAAQ,C,IAAZ,WACE,OAAOlpB,KAAKipB,SACd,E,IAMA,SAAaA,GACX,GAAIjpB,KAAK2G,YACP,MAAM,IAAI4a,EAAyB,EAAAhQ,iBAAiBxL,mBAElDub,EAAqB2H,EAAW,EAAApW,gBAAgBnC,cAClD1Q,KAAKipB,UAAYA,EAErB,E,gCAMA,sBAAI,uBAAQ,C,IAAZ,WACE,OAAOjpB,KAAKkpB,SACd,E,IAMA,SAAaA,GACX,GAAIlpB,KAAK2G,YACP,MAAM,IAAI4a,EAAyB,EAAAhQ,iBAAiBxL,mBAElDub,EAAqB4H,EAAW,EAAArW,gBAAgBnC,cAClD1Q,KAAKkpB,UAAYA,EAErB,E,gCAMA,sBAAI,qBAAM,C,IAAV,WACE,OAAOlpB,KAAKmpB,OACd,E,IAMA,SAAW9G,GACT,GAAIriB,KAAK2G,YACP,MAAM,IAAI4a,EAAyB,EAAAhQ,iBAAiBxL,mBAEtD,GAAsB,iBAAXsc,EACT,MAAM,IAAId,EAAyB,EAAAhQ,iBAAiBlD,eAEtD,IAAK,IAAMrF,KAAOqZ,GACZ,CAAC,GAAElkB,eAAeC,KAAKikB,EAAQrZ,IAE/BsY,EAAqBe,EAAOrZ,GAAM,EAAA6J,gBAAgBnC,aAClD4Q,EAAqBtY,EAAK,EAAA6J,gBAAgBgB,aAE1C7T,KAAKmpB,QAAQngB,GACX,EAAA0H,WAAW2R,EAAOrZ,IAI5B,E,gCAMA,sBAAI,mBAAI,C,IAAR,WACE,OAAOhJ,KAAKopB,KACd,E,IAMA,SAASC,GACP,GAAIrpB,KAAK2G,YACP,MAAM,IAAI4a,EAAyB,EAAAhQ,iBAAiBxL,mBAEtD,GAAoB,iBAATsjB,EACT,MAAM,IAAI9H,EAAyB,EAAAhQ,iBAAiBlD,eAEtD,IAAK,IAAMrF,KAAOqgB,GACZ,CAAC,GAAElrB,eAAeC,KAAKirB,EAAMrgB,IAE7BsY,EAAqB+H,EAAKrgB,GAAM,EAAA6J,gBAAgBnC,aAChD4Q,EAAqBtY,EAAK,EAAA6J,gBAAgBgB,aAE1C7T,KAAKopB,MAAMpgB,GAAO,EAAA0H,WAAW2Y,EAAKrgB,IAI1C,E,gCAYA,YAAAkE,OAAA,WAIElN,KAAKmN,YAAa,EAClB,IAAM9O,EAAS,CACbirB,SAAUtpB,KAAKkpB,UACfK,SAAUvpB,KAAKipB,UACf5G,OAAQriB,KAAKmpB,QACbE,KAAMrpB,KAAKopB,OAGb,cADOppB,KAAKmN,WACL9O,CACT,EACF,EA3JA,CAAwC,EAAA+O,SC/MxC,cAQE,WAAYzM,GAAZ,W,OACMA,QACgC6C,IAA9B7C,EAAS6oB,mBACX7oB,EAAS6oB,kBAAmB,IAIhC,IAAK,UAAC,EAAAjY,iBAAkB5Q,IAAS,MAd3B0mB,SAAmB,MACnB,EAAAoC,kBAA2C,GAejD,EAAKtnB,IAAM,IAAIunB,EACf,EAAKC,IAAM,IAAIC,EAGf,EAAKC,WAAa,EAAKC,cACvB,EAAKC,UAAY,EAAKC,UACtB,EAAKC,SAAW,EAAKC,YACrB,EAAKC,SAAW,EAAKC,YACrB,EAAKC,OAAS,EAAKC,UACnB,EAAKC,aAAe,EAAKC,gBACzB,EAAKC,eAAiB,EAAKC,kBAC3B,EAAKC,cAAgB,EAAKC,iB,CAC5B,CAyvBF,OAtxB4B,oBA8C1B,YAAA/d,MAAA,SAAMlM,G,QACJX,KAAKqB,YAAYV,GAET,QAAR,EAAAX,KAAKmC,WAAG,SAAE0K,QACF,QAAR,EAAA7M,KAAK2pB,WAAG,SAAE9c,OACZ,EAMA,sBAAI,sBAAO,C,IAAX,WACE,OAAO7M,KAAKqnB,QACd,E,gCAKA,sBAAI,+BAAgB,C,IAApB,WACE,OAAOrnB,KAAKypB,iBACd,E,gCAKA,YAAAK,cAAA,WAEE,OADA9pB,KAAKmC,IAAIV,aACFzB,KAAKyB,WAAW,aACzB,EAKA,YAAAuoB,UAAA,WAIE,OAHC,eADH,UACG,qB,iEACC,SAAMhqB,KAAK6qB,kB,cAAX,S,WAEK,EAAAtsB,iBAAiBC,UAC1B,EAEM,YAAAqsB,eAAN,W,gJACiB,SAAM7qB,KAAK2C,UAAU,aAAa,I,OAqCjD,OArCMtE,EAAS,YAEA,EAAAE,iBAAiBC,aACD,WAAzBwB,KAAK2pB,IAAIlB,IAAIK,SACTgC,EAAwC,CAC5CvB,SAAU,eACVD,SAAU,mBACVjH,OAAQ,iBACRgH,KAAM,eACN5B,KAAM,eACNsD,QAAS,kBACTC,QAAS,kBACTC,WAAY,sBAGVnC,EAAU9oB,KAAK2pB,IAAIlB,IAAIK,QACrBoC,EAAkB,IAAI9b,OAAO,EAAAyD,gBAAgBN,UAC7ClD,EAAUyZ,EAAQjf,MAAMqhB,GAC1BlkB,EAAS,GACTqI,KACgB,QAAd,EAAAA,EAAQ8b,cAAM,eAAEC,gBAClBpkB,EAAuB,QAAd,EAAAqI,EAAQ8b,cAAM,eAAEC,cACzBtC,EAAU,WACa,QAAd,EAAAzZ,EAAQ8b,cAAM,eAAEE,eACzBrkB,EAAuB,QAAd,EAAAqI,EAAQ8b,cAAM,eAAEE,YACzBvC,EAAU,UAGRwC,EAASR,EAAWhC,KAExB9oB,KAAKsC,iBAAiBgpB,EAAQ,kBAAmBtkB,IAE1ChH,KAAKW,SAAS1D,cACvB+C,KAAKsC,iBAAiB,iBAInB,CAAP,EAAOjE,G,QAOT,YAAA6rB,YAAA,SAAYznB,G,MACJ8oB,EACJ,iFACF,IAAI,IAAAtlB,eAAcxD,EAAY8oB,GAAqB,CACjD,IAAMlc,EAAU5M,EAAWoH,MAAM0hB,GACjC,GAAIlc,EAAS,CACX,IAAMyZ,EAAUzZ,EAAQ,GAClBrI,EAASqI,EAAQ,GAAG5H,QAAQ,WAAY,IAAIA,QAAQ,IAAK,IAC/D,GAAgB,WAAZqhB,GAAoC,SAAZA,EAC1B,OAAI9oB,KAAKW,SAASjB,mBACTkE,OAAO5D,KAAKW,SAASjB,mBAAmBsH,IAE7ChH,KAAKW,SAASlB,WACTmE,OAA+B,QAAxB,EAAA5D,KAAKW,SAASlB,kBAAU,eAAEkM,SAAS3E,IAE5CpD,OAAOklB,EAElB,CACF,CACA,OAAO9oB,KAAKkD,SAAS,YAAY,EAAMT,EACzC,EAOA,YAAA2nB,YAAA,SAAY3nB,EAAoBkB,GAE9B,OAAO3D,KAAKyD,SAAS,WAAY,UAAU,EAAMhB,EAAYkB,EAC/D,EAOA,YAAA2mB,UAAA,WAQE,OAPItqB,KAAKW,SAAS/D,YAChBoD,KAAKgE,eAAe,IAAK,cAExB,eAJL,UAIK,qB,iEACC,SAAMhE,KAAKS,OAAO,aAAa,I,cAA/B,S,WAGG,EAAAlC,iBAAiBC,UAC1B,EAOA,YAAAgsB,gBAAA,WACE,OAAOxqB,KAAKmE,aAAa,eAC3B,EAQA,YAAAumB,kBAAA,SAAkBrmB,GAChB,OAAOrE,KAAKoE,eAAe,iBAAkBC,EAC/C,EAQA,YAAAumB,iBAAA,SAAiBvmB,GACf,OAAOrE,KAAKuE,cAAc,gBAAiBF,EAC7C,EASS,YAAAN,YAAT,SAAqBtB,EAAoBkB,G,MAEvC,IAAI,IAAAsC,eAAcxD,EAAY,2BAA4B,CACxD,IAII,EAJE4T,EAAQ5T,EAAW2C,MAAM,KACzBgB,EAAQ2D,OAAOsM,EAAM,IACrBmV,EAAe,yBAAkBplB,GAQvC,IALmB,IAAAH,eACjBxD,EACA,gCAKA,EAAekB,MACV,CAEL,IAAMuhB,EAAYllB,KAAKmC,IAAIuhB,WAAWyB,qBAAqB/e,GAC3D,EAAe8e,EAAYA,EAAUtB,QAAKpgB,CAC5C,CAOA,GAHE,IACgC,QAAhC,EAAAxD,KAAKW,SAAShB,0BAAkB,eAAEgM,SAAS,IAE9B,CAEb,IAAI8f,EAAezrB,KAAKypB,kBAAkB7hB,WACxC,SAACC,GAAQ,OAAAA,EAAI+b,KAAO,CAAX,IAGX,IAAsB,IAAlB6H,EAAqB,CACvBA,EAAezrB,KAAKypB,kBAAkB7jB,OACtC,IAAM8lB,EAAqB,IAAIC,EAC/BD,EAAmB9H,GAAK,EACxB5jB,KAAKypB,kBAAkB7iB,KAAK8kB,EAC9B,CAGA,IAAME,EAAiBnpB,EAAWgF,QAChC+jB,EACA,4BAAqBC,IAEvBzrB,KAAKgF,mBACH,2BACA,EACA4mB,EACAjoB,EAEJ,CACF,CACA,OAAO3D,KAAKgF,mBAAmB,YAAY,EAAMvC,EAAYkB,EAC/D,EAUA,YAAA+C,gBAAA,SACEjE,EACAkB,EACA2B,GAEA,IAAI,IAAAW,eAAcxD,EAAY,2BAC5B,OAAO,IAAIkpB,EAGb,GAAIrmB,EAAiB,CACnB,IACE,IAAAW,eACExD,EACA,wDAGF,OAAOzC,KAAK6rB,6BAA6BppB,EAAYkB,GAChD,IACL,IAAAsC,eACExD,EACA,iDAGF,OAAO,IAAIqpB,CAEf,MAAO,IAAI,IAAA7lB,eAAcxD,EAAY,6BACnC,OAAO,IAAIspB,EAGb,OAAI,IAAA9lB,eAAcxD,EAAY,sCACrB,IAAIupB,GACF,IAAA/lB,eAAcxD,EAAY,kCAC5B,IAAIupB,GAAkB,IAG3B,IAAA/lB,eAAcxD,EAAY,qBACrB,IAAIwpB,EAGN,IACT,EAEQ,YAAAJ,6BAAR,SACEppB,EACAkB,GAEA,IAAM0S,EAAQ5T,EAAW2C,MAAM,KACzBgB,EAAQ2D,OAAOsM,EAAM,IACrB6V,EAAclsB,KAAKmC,IAAI+kB,aAAa1gB,WAAWJ,GAErD,GAAIpG,KAAK8B,gBACP,GAAKoqB,EAAYrI,KAEV,CACL7jB,KAAKmsB,6BAA6BD,EAAavoB,GAC/C,IAAMugB,EAAgBpB,EAAiBoJ,EAAYrI,MAC/CK,EACFlkB,KAAKosB,uBAAuBlI,EAAevgB,EAAOuoB,EAAYrI,MAE9D7jB,KAAK+B,gBACH,EAAAwP,iBAAiBL,oBACjB,4BAA8Bgb,EAAYrI,KAGhD,MAZE7jB,KAAK+B,gBAAgB,EAAAwP,iBAAiBD,4BAe1C,MAA2B,MAAvBtR,KAAKiB,cACA,IAAIorB,EAGN,IACT,EAQA,YAAAD,uBAAA,SACElI,EACAvgB,EACA2oB,GAEA,IAAIrI,EAAQ,IACRC,aAAa,EAAbA,EAAe/B,WACjB8B,EAAQrgB,OAAOD,GAAOyB,MAAM8e,EAAc/B,WAE1C8B,EAAM,GAAKtgB,EAGTsgB,EAAMre,OAAS,GAAKqe,EAAMre,QAAUse,EAAclW,IACpDhO,KAAKusB,0BAA0BD,EAAkBrI,EAAOtgB,GAC/CsgB,EAAMre,OAASse,EAAclW,KACtChO,KAAK+B,gBACH,EAAAwP,iBAAiBL,oBACjB,sCAGN,EAOA,YAAAib,6BAAA,SAA6BD,EAAoCvoB,GAC/D,IAAM6oB,EAAoBN,EAAYvI,kBAAkB1W,OACxD,GAAyB,WAArBif,EAAYrI,KACd,IACE,IAAItc,EAAI,EACRA,EAAIilB,GAA4C,MAAvBxsB,KAAKiB,cAC9BsG,IAEiB2kB,EAAYvI,kBAAkBnd,WAAWe,GAC7C+c,UAAY3gB,GACvB3D,KAAK+B,gBAAgB,EAAAwP,iBAAiBL,oBAI9C,EAOA,YAAAhL,wBAAA,SAAwBzD,EAAoBkB,GAC1C,IAAM0S,EAAQ5T,EAAW2C,MAAM,KACzBgB,EAAQ2D,OAAOsM,EAAM,IACrBoW,EAAgB1iB,OAAOsM,EAAM,IAC7B6V,EAAclsB,KAAKmC,IAAI+kB,aAAa1gB,WAAWJ,GAE/ComB,EAAoBN,EAAYvI,kBAAkB1W,OACxDjN,KAAKmsB,6BAA6BD,EAAavoB,GAE/C,IAAMugB,EAAgBpB,EAAiBoJ,EAAYrI,WAElB,IAAxBK,EAAclB,OACrBwJ,GAAqBtI,EAAclB,OAEnChjB,KAAKosB,uBAAuBlI,EAAevgB,EAAOuoB,EAAYrI,MAGpC,MAAvB7jB,KAAKiB,iBACFijB,EAAcnB,YACb/iB,KAAK0sB,uBACJR,EAAYvI,kBACZ8I,EACA9oB,KAEkB,MAAvB3D,KAAKiB,eAAmC,KAAV0C,GAIJ,MAAvB3D,KAAKiB,eACPjB,KAAK+B,gBACH,EAAAwP,iBAAiBL,oBACjB,8CAKNlR,KAAK+B,gBACH,EAAAwP,iBAAiBL,oBACjB,8CAGN,EAQS,YAAA7N,YAAT,SAAqBZ,GACnB,OAAOzC,KAAK6G,mBAAmB,YAAY,EAAMpE,EACnD,EASS,YAAA6B,0BAAT,SACEgE,EACAqkB,GAEA,IAAI1c,EAAe,GACfC,EAAgB,GAWpB,OARA5H,EAAc1E,OAAO0E,GACjB,EAAAkI,oBAAoBR,mBAAmB1H,KACzC2H,EACE,EAAAO,oBAAoBR,mBAAmB1H,GAAa2H,aACtDC,EACE,EAAAM,oBAAoBR,mBAAmB1H,GAAa4H,eAGjDyc,EAASzc,EAAgBD,CAClC,EASA,YAAAyc,uBAAA,SACEE,EACAC,EACAlpB,GAIA,IAFA,IAAImpB,GAAQ,EACNC,EAAQH,EAAiB3f,OACtB1F,EAAI,EAAGA,EAAIwlB,IAAUD,EAAOvlB,IAC/BA,IAAMslB,GAAiBD,EAAiBpmB,WAAWe,KAAO5D,IAC5DmpB,GAAQ,GAGZ,OAAOA,CACT,EAQA,YAAAP,0BAAA,SACED,EACArI,EACAtgB,GAIA,IAFA,IAAM9F,EAAWilB,EAAiBwJ,GAC5Bnd,EAAc,IAAIC,OAAOvR,EAASqkB,QAC/B3a,EAAI,EAAGA,EAAI0c,EAAMre,QAAiC,MAAvB5F,KAAKiB,cAAuBsG,IAS9D,GAPE+kB,EAAiBziB,MACf,8DAGFoa,EAAM1c,GAAKvH,KAAKgtB,8BAA8B/I,EAAM1c,KAGlD1J,aAAQ,EAARA,EAAU2kB,WAAY,CACxB,IAAM2B,EAASF,EAAM1c,GAAGnC,MAAMvH,EAAS2kB,YACjB,IAAlB2B,EAAOve,SACHyJ,EAAU8U,EAAO,GAAGta,MAAMsF,KAK3BtR,EAAS0kB,SACT4B,EAAO,GAAGta,MAAM,IAAIuF,OAAOvR,EAAS0kB,WAMzCviB,KAAK+B,gBAAgB,EAAAwP,iBAAiBlD,cAE1C,KAAO,CACL,IAAMgB,EACN,KADMA,EAAU4U,EAAM1c,GAAGsC,MAAMsF,KAEN,KAAVxL,IACX0L,GAAgC,eAArBid,EAEbtsB,KAAK+B,gBAAgB,EAAAwP,iBAAiBlD,oBAEtC,GAAyB,YAArBie,GAAkCrI,EAAMre,OAAS,EAC/CmE,OAAOka,EAAM,IAAMla,OAAOka,EAAM,KAClCjkB,KAAK+B,gBAAgB,EAAAwP,iBAAiBlD,oBAGxC,GAAiB,KAAb4V,EAAM1c,IAAa1J,EAASukB,OAC9B,IAAK,IAAIvK,EAAI,EAAGA,EAAItQ,GAA4B,MAAvBvH,KAAKiB,cAAuB4W,IAC/CoM,EAAM1c,KAAO0c,EAAMpM,IACrB7X,KAAK+B,gBAAgB,EAAAwP,iBAAiBlD,cAMlD,CAEJ,EAOA,YAAA2e,8BAAA,SAA8BC,GAU5B,IATA,IAAIC,GAAY,EACZC,GAAW,EACXC,GAAW,EAETC,EAAc,IAAIje,OACtB,kDAEEC,EAAU4d,EAAKpjB,MAAMwjB,GACrBC,EAAc,KACXje,GAAS,CACd,OAAQA,EAAQ,IACd,IAAK,OAEH,GADAie,EAAcL,EAAKpjB,MAAM,EAAAgJ,gBAAgBQ,WACxB,CACf,IAAMka,EAAOD,EAAY,QACZ9pB,IAAT+pB,GAAsBA,EAAK3nB,OAAS,IACjC,EAAe+F,SAAS4hB,EAAKC,gBAChCxtB,KAAK+B,gBAAgB,EAAAwP,iBAAiBlD,eAG5C,CACA+e,GAAW,EACX,MACF,IAAK,eACEA,GAAaF,GAAcC,GACX,SAAf9d,EAAQ,IAAgC,UAAfA,EAAQ,IACnCrP,KAAK+B,gBAAgB,EAAAwP,iBAAiBlD,eAI1C8e,GAAW,EACX,MACF,IAAK,gBACEA,GAAaC,GAAaF,GACV,SAAf7d,EAAQ,IAAgC,UAAfA,EAAQ,IACnCrP,KAAK+B,gBAAgB,EAAAwP,iBAAiBlD,eAI1C6e,GAAY,EAIhB7d,GADA4d,EAAOA,EAAKnnB,UAAUuJ,EAAQ,GAAGzJ,SAClBiE,MAAMwjB,EACvB,CAEA,OAAOJ,CACT,EAMA,YAAAQ,2BAAA,SAA2BC,GAEzB1tB,KAAKmC,IAAMurB,EAAOvrB,IAClBnC,KAAK2pB,IAAM+D,EAAO/D,GACpB,EAQA,YAAAje,gBAAA,SAAgBH,GACd,IAAMoiB,EAAuB3tB,KAAKuK,wBAE9BgB,IACFoiB,EAAUxrB,IAAI+lB,WAAaloB,KAAKmC,IAAIgmB,uBAGtC,IAAM9pB,EAAS,GACTuvB,EAAuB,UAAkBD,GAC/C,OAAQ3tB,KAAKW,SAAS5D,kBACpB,IAAK,YACH,OAAO,UAAkB4wB,GAC3B,IAAK,SACH,IAAK,IAAMpnB,KAAQqnB,GACb,CAAC,GAAEzvB,eAAeC,KAAKwvB,EAAWrnB,IACpClI,EAAOuI,KAAK,UAAGL,EAAI,YAAIqnB,EAAUrnB,KAGrC,OAAOlI,EAET,QACE,OAAOsvB,EAEb,EAOA,YAAAliB,mBAAA,SAAmBF,GACjB,IAAMoiB,EAAY3tB,KAAK0L,gBAAgBH,GACjCsiB,EAAoB7tB,KAAKmC,IAAIgmB,sBAC7B2F,EAAmB,uBACvBD,EACA,EAAAhb,gBAAgBjB,aAGdmc,EAAmB,EAAAnd,iBAAiBod,QACpCC,EAAgB,EAAAtd,cAAcqd,QAC9BhuB,KAAKmC,IAAIwjB,oBACwB,cAA/B3lB,KAAKmC,IAAIwjB,kBACXoI,EAAmB,EAAAnd,iBAAiBsd,UACI,eAA/BluB,KAAKmC,IAAIwjB,oBAClBoI,EAAmB,EAAAnd,iBAAiBud,aAGpCnuB,KAAKmC,IAAIujB,iBACqB,WAA5B1lB,KAAKmC,IAAIujB,eACXuI,EAAgB,EAAAtd,cAAcyd,OACO,WAA5BpuB,KAAKmC,IAAIujB,iBAClBuI,EAAgB,EAAAtd,cAAc0d,SAIlC,IAAM7I,EAAQxlB,KAAKmC,IAAIqjB,MACjB8I,EAA2B,CAAC,EAC9B9I,IACGzb,OAAOzD,MAAMyD,OAAOwkB,WAAW/I,EAAM3W,QACxCyf,EAAYzf,IAAM9E,OAAOwkB,WAAW/I,EAAM3W,MAEvC9E,OAAOzD,MAAMyD,OAAOwkB,WAAW/I,EAAMxW,QACxCsf,EAAYtf,IAAMjF,OAAOwkB,WAAW/I,EAAMxW,MAEvCjF,OAAOzD,MAAMyD,OAAOwkB,WAAW/I,EAAMxX,QACxCsgB,EAAYtgB,IAAMjE,OAAOwkB,WAAW/I,EAAMxX,MAEvCjE,OAAOzD,MAAMyD,OAAOwkB,WAAW/I,EAAMhB,WACxC8J,EAAY9J,OAASza,OAAOwkB,WAAW/I,EAAMhB,UAIjD,IAAM5lB,EAA6B,CACjCmvB,iBAAkBA,EAClBE,cAAeA,EACfH,iBAAkBA,EAClBU,YAAab,GAKf,OAHIW,IACF1vB,EAAa4mB,MAAQ8I,GAEhB1vB,CACT,EAQM,YAAAqE,UAAN,SAAgBsI,G,6IACVA,GACoB,WAAlBvL,KAAKmC,IAAI2J,MACa,WAApB9L,KAAKmC,IAAIolB,SACPvnB,KAAKmC,IAAImlB,sBAAwBtnB,KAAKmC,IAAIyjB,mBACxC5lB,KAAKmC,IAAIyjB,kBAAoB5lB,KAAKmC,IAAImlB,qBACxCtnB,KAAKmC,IAAIwjB,kBAAoB,YAE7B3lB,KAAKmC,IAAIwjB,kBAAoB,cAG7B3lB,KAAKmC,IAAI2lB,sBAAwB9nB,KAAKmC,IAAIqjB,MAAMhB,SAC9CxkB,KAAKmC,IAAIqjB,MAAMhB,QAAUxkB,KAAKmC,IAAI2lB,qBACpC9nB,KAAKmC,IAAIujB,eAAiB,SAE1B1lB,KAAKmC,IAAIujB,eAAiB,WAOhC+I,GAAa,EAEfzuB,KAAK2pB,IAAIlB,IAAIK,WAAuC,QAA3B,EAAsB,QAAtB,EAAiB,QAAjB,EAAA9oB,KAAKwB,oBAAY,eAAEmoB,WAAG,eAAElB,WAAG,eAAEK,UAC7B,WAAzB9oB,KAAK2pB,IAAIlB,IAAIK,UAEb2F,GAAa,GAGT7vB,EAAeoB,KAAKsL,gBAAgBC,GACA,iBAA/BvL,KAAKW,SAAS7D,aAArB,MACa,GAAMkD,KAAKwK,mBACxBxK,KAAKW,SAAS7D,aACd8B,EACA2M,I,OAaF,OAhBMlN,EAAS,SASXowB,QACsBjrB,IAAtBnF,EAAOowB,YACe,KAAtBpwB,EAAOowB,YAEPC,SAAS,gCAAyBrwB,EAAOowB,WAAU,SAAnDC,GAGG,CAAP,EAAOrwB,G,OAEP,MAAO,CAAP,EAAO,CACLA,OAAQ,EAAAE,iBAAiBC,WACzBF,UAAW,I,QAInB,EAtxBA,CAA4BuC,EAAA,S","sources":["webpack://scorm-again/./src/constants/default_settings.ts","webpack://scorm-again/./src/helpers/scheduled_commit.ts","webpack://scorm-again/./src/BaseAPI.ts","webpack://scorm-again/./src/cmi/common/array.ts","webpack://scorm-again/./src/cmi/common/base_cmi.ts","webpack://scorm-again/./src/cmi/common/score.ts","webpack://scorm-again/./src/cmi/common/validation.ts","webpack://scorm-again/./src/constants/api_constants.ts","webpack://scorm-again/./src/constants/enums.ts","webpack://scorm-again/./src/constants/error_codes.ts","webpack://scorm-again/./src/constants/regex.ts","webpack://scorm-again/./src/exceptions.ts","webpack://scorm-again/./src/utilities.ts","webpack://scorm-again/./node_modules/tslib/tslib.es6.mjs","webpack://scorm-again/webpack/bootstrap","webpack://scorm-again/webpack/runtime/define property getters","webpack://scorm-again/webpack/runtime/hasOwnProperty shorthand","webpack://scorm-again/webpack/runtime/make namespace object","webpack://scorm-again/./src/exceptions/scorm2004_exceptions.ts","webpack://scorm-again/./src/cmi/scorm2004/validation.ts","webpack://scorm-again/./src/cmi/scorm2004/learner_preference.ts","webpack://scorm-again/./src/constants/response_constants.ts","webpack://scorm-again/./src/cmi/scorm2004/interactions.ts","webpack://scorm-again/./src/cmi/scorm2004/score.ts","webpack://scorm-again/./src/cmi/scorm2004/comments.ts","webpack://scorm-again/./src/cmi/scorm2004/objectives.ts","webpack://scorm-again/./src/cmi/scorm2004/cmi.ts","webpack://scorm-again/./src/constants/language_constants.ts","webpack://scorm-again/./src/cmi/scorm2004/adl.ts","webpack://scorm-again/./src/Scorm2004API.ts"],"sourcesContent":["import { InternalSettings, LogLevel, ResultObject } from \"../types/api_types\";\nimport { global_constants } from \"./api_constants\";\nimport { LogLevelEnum } from \"./enums\";\n\n/**\n * Default settings for the SCORM API\n */\nexport const DefaultSettings: InternalSettings = {\n autocommit: false,\n autocommitSeconds: 10,\n asyncCommit: false,\n sendFullCommit: true,\n lmsCommitUrl: false,\n dataCommitFormat: \"json\",\n commitRequestDataType: \"application/json;charset=UTF-8\",\n autoProgress: false,\n logLevel: LogLevelEnum.ERROR,\n selfReportSessionTime: false,\n alwaysSendTotalTime: false,\n renderCommonCommitFields: false,\n strict_errors: true,\n xhrHeaders: {},\n xhrWithCredentials: false,\n fetchMode: \"cors\",\n responseHandler: async function (response: Response): Promise<ResultObject> {\n if (typeof response !== \"undefined\") {\n const responseText = await response.text();\n let httpResult = null;\n if (responseText) {\n httpResult = JSON.parse(responseText);\n }\n if (\n httpResult === null ||\n !{}.hasOwnProperty.call(httpResult, \"result\")\n ) {\n if (response.status === 200) {\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n } else {\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: 101,\n };\n }\n } else {\n return {\n result: httpResult.result,\n errorCode: httpResult.errorCode\n ? httpResult.errorCode\n : httpResult.result === global_constants.SCORM_TRUE\n ? 0\n : 101,\n };\n }\n }\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: 101,\n };\n },\n requestHandler: function (commitObject) {\n return commitObject;\n },\n onLogMessage: function (messageLevel: LogLevel, logMessage) {\n switch (messageLevel) {\n case \"4\":\n case 4:\n case \"ERROR\":\n case LogLevelEnum.ERROR:\n console.error(logMessage);\n break;\n case \"3\":\n case 3:\n case \"WARN\":\n case LogLevelEnum.WARN:\n console.warn(logMessage);\n break;\n case \"2\":\n case 2:\n case \"INFO\":\n case LogLevelEnum.INFO:\n console.info(logMessage);\n break;\n case \"1\":\n case 1:\n case \"DEBUG\":\n case LogLevelEnum.DEBUG:\n if (console.debug) {\n console.debug(logMessage);\n } else {\n console.log(logMessage);\n }\n break;\n }\n },\n scoItemIds: [],\n scoItemIdValidator: false,\n globalObjectiveIds: [],\n};\n","import BaseAPI from \"../BaseAPI\";\n\n/**\n * Private class that wraps a timeout call to the commit() function\n */\nexport class ScheduledCommit {\n private _API;\n private _cancelled = false;\n private readonly _timeout;\n private readonly _callback;\n\n /**\n * Constructor for ScheduledCommit\n * @param {BaseAPI} API\n * @param {number} when\n * @param {string} callback\n */\n constructor(API: BaseAPI, when: number, callback: string) {\n this._API = API;\n this._timeout = setTimeout(this.wrapper.bind(this), when);\n this._callback = callback;\n }\n\n /**\n * Cancel any currently scheduled commit\n */\n cancel() {\n this._cancelled = true;\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n }\n\n /**\n * Wrap the API commit call to check if the call has already been cancelled\n */\n wrapper() {\n if (!this._cancelled) {\n (async () => await this._API.commit(this._callback))();\n }\n }\n}\n","import { CMIArray } from \"./cmi/common/array\";\nimport { ValidationError } from \"./exceptions\";\nimport { ErrorCode } from \"./constants/error_codes\";\nimport { global_constants } from \"./constants/api_constants\";\nimport { formatMessage, stringMatches, unflatten } from \"./utilities\";\nimport { BaseCMI } from \"./cmi/common/base_cmi\";\nimport { CommitObject, InternalSettings, LogLevel, RefObject, ResultObject, Settings } from \"./types/api_types\";\nimport { DefaultSettings } from \"./constants/default_settings\";\nimport { IBaseAPI } from \"./interfaces/IBaseAPI\";\nimport { ScheduledCommit } from \"./helpers/scheduled_commit\";\nimport { LogLevelEnum } from \"./constants/enums\";\n\n/**\n * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered\n * abstract, and never initialized on its own.\n */\nexport default abstract class BaseAPI implements IBaseAPI {\n private _timeout?: ScheduledCommit | undefined;\n private readonly _error_codes: ErrorCode;\n private _settings: InternalSettings = DefaultSettings;\n\n /**\n * Constructor for Base API class. Sets some shared API fields, as well as\n * sets up options for the API.\n * @param {ErrorCode} error_codes\n * @param {Settings} settings\n */\n protected constructor(error_codes: ErrorCode, settings?: Settings) {\n if (new.target === BaseAPI) {\n throw new TypeError(\"Cannot construct BaseAPI instances directly\");\n }\n this.currentState = global_constants.STATE_NOT_INITIALIZED;\n this.lastErrorCode = \"0\";\n this.listenerArray = [];\n\n this._error_codes = error_codes;\n\n if (settings) {\n this.settings = {\n ...DefaultSettings,\n ...settings,\n } as InternalSettings;\n }\n this.apiLogLevel = this.settings.logLevel ?? LogLevelEnum.ERROR;\n this.selfReportSessionTime = this.settings.selfReportSessionTime ?? false;\n }\n\n public abstract cmi: BaseCMI;\n public startingData?: RefObject;\n\n public currentState: number;\n public lastErrorCode: string;\n public listenerArray: any[];\n public apiLogLevel: LogLevel;\n public selfReportSessionTime: boolean;\n\n abstract reset(settings?: Settings): void;\n\n /**\n * Common reset method for all APIs. New settings are merged with the existing settings.\n * @param {Settings} settings\n * @protected\n */\n commonReset(settings?: Settings): void {\n this.apiLog(\"reset\", \"Called\", LogLevelEnum.INFO);\n\n this.settings = { ...this.settings, ...settings };\n\n this.clearScheduledCommit();\n this.currentState = global_constants.STATE_NOT_INITIALIZED;\n this.lastErrorCode = \"0\";\n this.listenerArray = [];\n this.startingData = {};\n }\n\n /**\n * Initialize the API\n * @param {string} callbackName\n * @param {string} initializeMessage\n * @param {string} terminationMessage\n * @return {string}\n */\n initialize(\n callbackName: string,\n initializeMessage?: string,\n terminationMessage?: string,\n ): string {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.isInitialized()) {\n this.throwSCORMError(this._error_codes.INITIALIZED, initializeMessage);\n } else if (this.isTerminated()) {\n this.throwSCORMError(this._error_codes.TERMINATED, terminationMessage);\n } else {\n if (this.selfReportSessionTime) {\n this.cmi.setStartTime();\n }\n\n this.currentState = global_constants.STATE_INITIALIZED;\n this.lastErrorCode = \"0\";\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n abstract lmsInitialize(): string;\n\n abstract lmsFinish(): string;\n\n abstract lmsGetValue(CMIElement: string): string;\n\n abstract lmsSetValue(CMIElement: string, value: any): string;\n\n abstract lmsCommit(): string;\n\n abstract lmsGetLastError(): string;\n\n abstract lmsGetErrorString(CMIErrorCode: string | number): string;\n\n abstract lmsGetDiagnostic(CMIErrorCode: string | number): string;\n\n /**\n * Abstract method for validating that a response is correct.\n *\n * @param {string} _CMIElement\n * @param {any} _value\n */\n abstract validateCorrectResponse(_CMIElement: string, _value: any): void;\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {BaseCMI|null}\n * @abstract\n */\n abstract getChildElement(\n _CMIElement: string,\n _value: any,\n _foundFirstIndex: boolean,\n ): BaseCMI | null;\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {ResultObject}\n * @abstract\n */\n abstract storeData(_calculateTotalTime: boolean): Promise<ResultObject>;\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _terminateCommit\n * @return {RefObject|Array}\n * @abstract\n */\n abstract renderCommitCMI(_terminateCommit: boolean): RefObject | Array<any>;\n\n /**\n * Render the commit object to the shortened format for LMS commit\n * @param {boolean} _terminateCommit\n * @return {CommitObject}\n */\n abstract renderCommitObject(_terminateCommit: boolean): CommitObject;\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} logMessage\n * @param {number} messageLevel\n * @param {string} CMIElement\n */\n apiLog(\n functionName: string,\n logMessage: string,\n messageLevel: LogLevel,\n CMIElement?: string,\n ) {\n logMessage = formatMessage(functionName, logMessage, CMIElement);\n\n if (messageLevel >= this.apiLogLevel) {\n this.settings.onLogMessage(messageLevel, logMessage);\n }\n }\n\n /**\n * Getter for _error_codes\n * @return {ErrorCode}\n */\n get error_codes(): ErrorCode {\n return this._error_codes;\n }\n\n /**\n * Getter for _settings\n * @return {Settings}\n */\n get settings(): InternalSettings {\n return this._settings;\n }\n\n /**\n * Setter for _settings\n * @param {Settings} settings\n */\n set settings(settings: Settings) {\n this._settings = { ...this._settings, ...settings };\n }\n\n /**\n * Terminates the current run of the API\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n async terminate(\n callbackName: string,\n checkTerminated: boolean,\n ): Promise<string> {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.TERMINATION_BEFORE_INIT,\n this._error_codes.MULTIPLE_TERMINATION,\n )\n ) {\n this.currentState = global_constants.STATE_TERMINATED;\n\n const result: ResultObject = await this.storeData(true);\n if (typeof result.errorCode !== \"undefined\" && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue =\n typeof result !== \"undefined\" && result.result\n ? result.result\n : global_constants.SCORM_FALSE;\n\n if (checkTerminated) this.lastErrorCode = \"0\";\n\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Get the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @return {string}\n */\n getValue(\n callbackName: string,\n checkTerminated: boolean,\n CMIElement: string,\n ): string {\n let returnValue: string = \"\";\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.RETRIEVE_BEFORE_INIT,\n this._error_codes.RETRIEVE_AFTER_TERM,\n )\n ) {\n if (checkTerminated) this.lastErrorCode = \"0\";\n try {\n returnValue = this.getCMIValue(CMIElement);\n } catch (e) {\n returnValue = this.handleValueAccessException(e, returnValue);\n }\n this.processListeners(callbackName, CMIElement);\n }\n\n this.apiLog(\n callbackName,\n \": returned: \" + returnValue,\n LogLevelEnum.INFO,\n CMIElement,\n );\n\n if (returnValue === undefined) {\n return \"\";\n }\n\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Sets the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {string} commitCallback\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setValue(\n callbackName: string,\n commitCallback: string,\n checkTerminated: boolean,\n CMIElement: string,\n value: any,\n ): string {\n if (value !== undefined) {\n value = String(value);\n }\n let returnValue: string = global_constants.SCORM_FALSE;\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.STORE_BEFORE_INIT,\n this._error_codes.STORE_AFTER_TERM,\n )\n ) {\n if (checkTerminated) this.lastErrorCode = \"0\";\n try {\n returnValue = this.setCMIValue(CMIElement, value);\n } catch (e) {\n this.handleValueAccessException(e, returnValue);\n }\n this.processListeners(callbackName, CMIElement, value);\n }\n\n if (returnValue === undefined) {\n returnValue = global_constants.SCORM_FALSE;\n }\n\n // If we didn't have any errors while setting the data, go ahead and\n // schedule a commit, if autocommit is turned on\n if (String(this.lastErrorCode) === \"0\") {\n if (this.settings.autocommit) {\n this.scheduleCommit(\n this.settings.autocommitSeconds * 1000,\n commitCallback,\n );\n }\n }\n\n this.apiLog(\n callbackName,\n \": \" + value + \": result: \" + returnValue,\n LogLevelEnum.INFO,\n CMIElement,\n );\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Orders LMS to store all content parameters\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n async commit(\n callbackName: string,\n checkTerminated: boolean = false,\n ): Promise<string> {\n this.clearScheduledCommit();\n\n let returnValue = global_constants.SCORM_FALSE;\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.COMMIT_BEFORE_INIT,\n this._error_codes.COMMIT_AFTER_TERM,\n )\n ) {\n const result = await this.storeData(false);\n if (result.errorCode && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue =\n typeof result !== \"undefined\" && result.result\n ? result.result\n : global_constants.SCORM_FALSE;\n\n this.apiLog(\n callbackName,\n \" Result: \" + returnValue,\n LogLevelEnum.DEBUG,\n \"HttpRequest\",\n );\n\n if (checkTerminated) this.lastErrorCode = \"0\";\n\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: string): string {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: string, CMIErrorCode: string | number): string {\n let returnValue = \"\";\n\n if (CMIErrorCode !== null && CMIErrorCode !== \"\") {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: string, CMIErrorCode: string | number): string {\n let returnValue = \"\";\n\n if (CMIErrorCode !== null && CMIErrorCode !== \"\") {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(\n checkTerminated: boolean,\n beforeInitError: number,\n afterTermError: number,\n ): boolean {\n if (this.isNotInitialized()) {\n this.throwSCORMError(beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(\n _errorNumber: string | number,\n _detail: boolean = false,\n ): string {\n throw new Error(\n \"The getLmsErrorMessageDetails method has not been implemented\",\n );\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement: string): string {\n throw new Error(\"The getCMIValue method has not been implemented\");\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement: string, _value: any): string {\n throw new Error(\"The setCMIValue method has not been implemented\");\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: string,\n scorm2004: boolean,\n CMIElement: string,\n value: any,\n ): string {\n if (!CMIElement || CMIElement === \"\") {\n return global_constants.SCORM_FALSE;\n }\n\n const structure = CMIElement.split(\".\");\n let refObject: RefObject = this;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004\n ? this._error_codes.UNDEFINED_DATA_MODEL\n : this._error_codes.GENERAL;\n\n for (let idx = 0; idx < structure.length; idx++) {\n const attribute = structure[idx];\n\n if (idx === structure.length - 1) {\n if (scorm2004 && attribute.substring(0, 8) === \"{target=\") {\n if (this.isInitialized()) {\n this.throwSCORMError(this._error_codes.READ_ONLY_ELEMENT);\n } else {\n refObject = {\n ...refObject,\n attribute: value,\n };\n }\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (\n stringMatches(CMIElement, \"\\\\.correct_responses\\\\.\\\\d+\") &&\n this.isInitialized()\n ) {\n this.validateCorrectResponse(CMIElement, value);\n }\n\n if (!scorm2004 || this.lastErrorCode === \"0\") {\n refObject[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[idx + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n foundFirstIndex = true;\n } else {\n const newChild = this.getChildElement(\n CMIElement,\n value,\n foundFirstIndex,\n );\n foundFirstIndex = true;\n\n if (!newChild) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (refObject.initialized) newChild.initialize();\n\n refObject.childArray.push(newChild);\n refObject = newChild;\n }\n }\n\n // Have to update idx value to skip the array position\n idx++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(\n methodName,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n LogLevelEnum.WARN,\n );\n }\n\n return returnValue;\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {any}\n */\n _commonGetCMIValue(\n methodName: string,\n scorm2004: boolean,\n CMIElement: string,\n ): any {\n if (!CMIElement || CMIElement === \"\") {\n return \"\";\n }\n\n const structure = CMIElement.split(\".\");\n let refObject: RefObject = this;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004\n ? this._error_codes.UNDEFINED_DATA_MODEL\n : this._error_codes.GENERAL;\n\n for (let idx = 0; idx < structure.length; idx++) {\n attribute = structure[idx];\n\n if (!scorm2004) {\n if (idx === structure.length - 1) {\n if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if (\n String(attribute).substring(0, 8) === \"{target=\" &&\n typeof refObject._isTargetValid == \"function\"\n ) {\n const target = String(attribute).substring(\n 8,\n String(attribute).length - 9,\n );\n return refObject._isTargetValid(target);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n refObject = refObject[attribute];\n if (refObject === undefined) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[idx + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(\n this._error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage,\n );\n break;\n }\n\n // Have to update idx value to skip the array position\n idx++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === \"_children\") {\n this.throwSCORMError(this._error_codes.CHILDREN_ERROR);\n } else if (attribute === \"_count\") {\n this.throwSCORMError(this._error_codes.COUNT_ERROR);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized(): boolean {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized(): boolean {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated(): boolean {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n on(listenerName: string, callback: Function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(\" \");\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split(\".\");\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + \".\", \"\");\n }\n\n this.listenerArray.push({\n functionName: functionName,\n CMIElement: CMIElement,\n callback: callback,\n });\n\n this.apiLog(\n \"on\",\n `Added event listener: ${this.listenerArray.length}`,\n LogLevelEnum.INFO,\n functionName,\n );\n }\n }\n\n /**\n * Provides a mechanism for detaching a specific SCORM event listener\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n off(listenerName: string, callback: Function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(\" \");\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split(\".\");\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + \".\", \"\");\n }\n\n const removeIndex = this.listenerArray.findIndex(\n (obj) =>\n obj.functionName === functionName &&\n obj.CMIElement === CMIElement &&\n obj.callback === callback,\n );\n if (removeIndex !== -1) {\n this.listenerArray.splice(removeIndex, 1);\n this.apiLog(\n \"off\",\n `Removed event listener: ${this.listenerArray.length}`,\n LogLevelEnum.INFO,\n functionName,\n );\n }\n }\n }\n\n /**\n * Provides a mechanism for clearing all listeners from a specific SCORM event\n *\n * @param {string} listenerName\n */\n clear(listenerName: string) {\n const listenerFunctions = listenerName.split(\" \");\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split(\".\");\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + \".\", \"\");\n }\n\n this.listenerArray = this.listenerArray.filter(\n (obj) =>\n obj.functionName !== functionName && obj.CMIElement !== CMIElement,\n );\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {any} value\n */\n processListeners(functionName: string, CMIElement?: string, value?: any) {\n this.apiLog(functionName, value, LogLevelEnum.INFO, CMIElement);\n for (let i = 0; i < this.listenerArray.length; i++) {\n const listener = this.listenerArray[i];\n const functionsMatch = listener.functionName === functionName;\n const listenerHasCMIElement = !!listener.CMIElement;\n let CMIElementsMatch = false;\n if (\n CMIElement &&\n listener.CMIElement &&\n listener.CMIElement.substring(listener.CMIElement.length - 1) === \"*\"\n ) {\n CMIElementsMatch =\n CMIElement.indexOf(\n listener.CMIElement.substring(0, listener.CMIElement.length - 1),\n ) === 0;\n } else {\n CMIElementsMatch = listener.CMIElement === CMIElement;\n }\n\n if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {\n this.apiLog(\n \"processListeners\",\n `Processing listener: ${listener.functionName}`,\n LogLevelEnum.INFO,\n CMIElement,\n );\n listener.callback(CMIElement, value);\n }\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} errorNumber\n * @param {string} message\n */\n throwSCORMError(errorNumber: number, message?: string) {\n if (!message) {\n message = this.getLmsErrorMessageDetails(errorNumber);\n }\n\n this.apiLog(\n \"throwSCORMError\",\n errorNumber + \": \" + message,\n LogLevelEnum.ERROR,\n );\n\n this.lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success\n */\n clearSCORMError(success: string) {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this.lastErrorCode = \"0\";\n }\n }\n\n /**\n * Load the CMI from a flattened JSON object\n * @param {RefObject} json\n * @param {string} CMIElement\n */\n loadFromFlattenedJSON(json: RefObject, CMIElement?: string) {\n if (!CMIElement) {\n // by default, we start from a blank string because we're expecting each element to start with `cmi`\n CMIElement = \"\";\n }\n if (!this.isNotInitialized()) {\n console.error(\n \"loadFromFlattenedJSON can only be called before the call to lmsInitialize.\",\n );\n return;\n }\n\n /**\n * Tests two strings against a given regular expression pattern and determines a numeric or null result based on the matching criterion.\n *\n * @param {string} a - The first string to be tested against the pattern.\n * @param {string} c - The second string to be tested against the pattern.\n * @param {RegExp} a_pattern - The regular expression pattern to test the strings against.\n * @return {number | null} A numeric result based on the matching criterion, or null if the strings do not match the pattern.\n */\n function testPattern(\n a: string,\n c: string,\n a_pattern: RegExp,\n ): number | null {\n const a_match = a.match(a_pattern);\n\n let c_match;\n if (a_match !== null && (c_match = c.match(a_pattern)) !== null) {\n const a_num = Number(a_match[2]);\n const c_num = Number(c_match[2]);\n if (a_num === c_num) {\n if (a_match[3] === \"id\") {\n return -1;\n } else if (a_match[3] === \"type\") {\n if (c_match[3] === \"id\") {\n return 1;\n } else {\n return -1;\n }\n } else {\n return 1;\n }\n }\n return a_num - c_num;\n }\n\n return null;\n }\n\n const int_pattern = /^(cmi\\.interactions\\.)(\\d+)\\.(.*)$/;\n const obj_pattern = /^(cmi\\.objectives\\.)(\\d+)\\.(.*)$/;\n\n const result = Object.keys(json).map(function (key) {\n return [String(key), json[key]];\n });\n\n // CMI interactions need to have id and type loaded before any other fields\n result.sort(function ([a, _b], [c, _d]) {\n let test;\n if ((test = testPattern(a, c, int_pattern)) !== null) {\n return test;\n }\n if ((test = testPattern(a, c, obj_pattern)) !== null) {\n return test;\n }\n\n if (a < c) {\n return -1;\n }\n if (a > c) {\n return 1;\n }\n return 0;\n });\n\n let obj: RefObject;\n result.forEach((element) => {\n obj = {};\n obj[element[0]] = element[1];\n this.loadFromJSON(unflatten(obj), CMIElement);\n });\n }\n\n /**\n * Loads CMI data from a JSON object.\n *\n * @param {RefObject} json\n * @param {string} CMIElement\n */\n loadFromJSON(json: RefObject, CMIElement: string = \"\") {\n if (\n (!CMIElement || CMIElement === \"\") &&\n !Object.hasOwnProperty.call(json, \"cmi\") &&\n !Object.hasOwnProperty.call(json, \"adl\")\n ) {\n // providing a backward compatibility for the old v1 API\n CMIElement = \"cmi\";\n }\n\n if (!this.isNotInitialized()) {\n console.error(\n \"loadFromJSON can only be called before the call to lmsInitialize.\",\n );\n return;\n }\n\n CMIElement = CMIElement !== undefined ? CMIElement : \"cmi\";\n\n this.startingData = json;\n\n // could this be refactored down to flatten(json) then setCMIValue on each?\n for (const key in json) {\n if ({}.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = (CMIElement ? CMIElement + \".\" : \"\") + key;\n const value = json[key];\n\n if (value[\"childArray\"]) {\n for (let i = 0; i < value[\"childArray\"].length; i++) {\n this.loadFromJSON(\n value[\"childArray\"][i],\n currentCMIElement + \".\" + i,\n );\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(value, currentCMIElement);\n } else {\n this.setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @return {string}\n */\n renderCMIToJSONString(): string {\n const cmi = this.cmi;\n // Do we want/need to return fields that have no set value?\n if (this.settings.sendFullCommit) {\n return JSON.stringify({ cmi });\n }\n return JSON.stringify({ cmi }, (k, v) => (v === undefined ? null : v), 2);\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @return {object}\n */\n renderCMIToJSONObject(): object {\n return JSON.parse(this.renderCMIToJSONString());\n }\n\n /**\n * Send the request to the LMS\n * @param {string} url\n * @param {CommitObject|RefObject|Array} params\n * @param {boolean} immediate\n * @return {ResultObject}\n */\n async processHttpRequest(\n url: string,\n params: CommitObject | RefObject | Array<any>,\n immediate: boolean = false,\n ): Promise<ResultObject> {\n const api = this;\n const genericError: ResultObject = {\n result: global_constants.SCORM_FALSE,\n errorCode: this.error_codes.GENERAL,\n };\n\n // if we are terminating the module or closing the browser window/tab, we need to make this fetch ASAP.\n // Some browsers, especially Chrome, do not like synchronous requests to be made when the window is closing.\n if (immediate) {\n this.performFetch(url, params).then(async (response) => {\n await this.transformResponse(response);\n });\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n }\n\n const process = async (\n url: string,\n params: CommitObject | RefObject | Array<any>,\n settings: InternalSettings,\n ): Promise<ResultObject> => {\n try {\n params = settings.requestHandler(params);\n const response = await this.performFetch(url, params);\n\n return this.transformResponse(response);\n } catch (e) {\n this.apiLog(\"processHttpRequest\", e, LogLevelEnum.ERROR);\n api.processListeners(\"CommitError\");\n return genericError;\n }\n };\n\n return await process(url, params, this.settings);\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} when - the number of milliseconds to wait before committing\n * @param {string} callback - the name of the commit event callback\n */\n scheduleCommit(when: number, callback: string) {\n if (!this._timeout) {\n this._timeout = new ScheduledCommit(this, when, callback);\n this.apiLog(\"scheduleCommit\", \"scheduled\", LogLevelEnum.DEBUG, \"\");\n }\n }\n\n /**\n * Clears and cancels any currently scheduled commits\n */\n clearScheduledCommit() {\n if (this._timeout) {\n this._timeout.cancel();\n this._timeout = undefined;\n this.apiLog(\"clearScheduledCommit\", \"cleared\", LogLevelEnum.DEBUG, \"\");\n }\n }\n\n /**\n * Check to see if the specific object has the given property\n * @param {RefObject} refObject\n * @param {string} attribute\n * @return {boolean}\n * @private\n */\n private _checkObjectHasProperty(\n refObject: RefObject,\n attribute: string,\n ): boolean {\n return (\n Object.hasOwnProperty.call(refObject, attribute) ||\n Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(refObject),\n attribute,\n ) != null ||\n attribute in refObject\n );\n }\n\n /**\n * Handles the error that occurs when trying to access a value\n * @param {any} e\n * @param {string} returnValue\n * @return {string}\n * @private\n */\n private handleValueAccessException(e: any, returnValue: string): string {\n if (e instanceof ValidationError) {\n this.lastErrorCode = String(e.errorCode);\n returnValue = global_constants.SCORM_FALSE;\n } else {\n if (e instanceof Error && e.message) {\n console.error(e.message);\n } else {\n console.error(e);\n }\n this.throwSCORMError(this._error_codes.GENERAL);\n }\n return returnValue;\n }\n\n /**\n * Builds the commit object to be sent to the LMS\n * @param {boolean} terminateCommit\n * @return {CommitObject|RefObject|Array}\n * @private\n */\n protected getCommitObject(\n terminateCommit: boolean,\n ): CommitObject | RefObject | Array<any> {\n const shouldTerminateCommit =\n terminateCommit || this.settings.alwaysSendTotalTime;\n const commitObject = this.settings.renderCommonCommitFields\n ? this.renderCommitObject(shouldTerminateCommit)\n : this.renderCommitCMI(shouldTerminateCommit);\n\n if ([LogLevelEnum.DEBUG, \"1\", 1, \"DEBUG\"].includes(this.apiLogLevel)) {\n console.debug(\n \"Commit (terminated: \" + (terminateCommit ? \"yes\" : \"no\") + \"): \",\n );\n console.debug(commitObject);\n }\n return commitObject;\n }\n\n /**\n * Perform the fetch request to the LMS\n * @param {string} url\n * @param {RefObject|Array} params\n * @return {Promise<Response>}\n * @private\n */\n private async performFetch(\n url: string,\n params: RefObject | Array<any>,\n ): Promise<Response> {\n let init = {\n method: \"POST\",\n mode: this.settings.fetchMode,\n body: params instanceof Array ? params.join(\"&\") : JSON.stringify(params),\n headers: {\n ...this.settings.xhrHeaders,\n \"Content-Type\": this.settings.commitRequestDataType,\n },\n keepalive: true,\n } as RequestInit;\n\n if (this.settings.xhrWithCredentials) {\n init = {\n ...init,\n credentials: \"include\",\n };\n }\n\n return fetch(url, init);\n }\n\n /**\n * Transforms the response from the LMS to a ResultObject\n * @param {Response} response\n * @return {Promise<ResultObject>}\n * @private\n */\n private async transformResponse(response: Response): Promise<ResultObject> {\n const result =\n typeof this.settings.responseHandler === \"function\"\n ? await this.settings.responseHandler(response)\n : await response.json();\n\n if (\n response.status >= 200 &&\n response.status <= 299 &&\n (result.result === true || result.result === global_constants.SCORM_TRUE)\n ) {\n this.processListeners(\"CommitSuccess\");\n } else {\n this.processListeners(\"CommitError\");\n }\n return result;\n }\n}\n","import { BaseCMI } from \"./base_cmi\";\nimport { BaseScormValidationError } from \"../../exceptions\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n private readonly _errorCode: number;\n private readonly _errorClass: typeof BaseScormValidationError;\n private readonly __children: string;\n public childArray: any[];\n\n /**\n * Constructor cmi *.n arrays\n * @param {object} params\n */\n constructor(params: {\n children: string;\n errorCode?: number;\n errorClass?: typeof BaseScormValidationError;\n }) {\n super();\n this.__children = params.children;\n this._errorCode = params.errorCode || scorm12_errors.GENERAL;\n this._errorClass = params.errorClass || BaseScormValidationError;\n this.childArray = [];\n }\n\n /**\n * Called when the API has been reset\n */\n reset(wipe: boolean = false): void {\n this._initialized = false;\n if (wipe) {\n this.childArray = [];\n } else {\n // Reset all children\n for (let i = 0; i < this.childArray.length; i++) {\n this.childArray[i].reset();\n }\n }\n }\n /**\n * Getter for _children\n * @return {string}\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children: string) {\n throw new this._errorClass(this._errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count(): number {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count: number) {\n throw new this._errorClass(this._errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON(): object {\n this.jsonString = true;\n const result: { [key: string]: any } = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + \"\"] = this.childArray[i];\n }\n delete this.jsonString;\n return result;\n }\n}\n","/**\n * Base class for API cmi objects\n */\nexport abstract class BaseCMI {\n jsonString? = false;\n protected _initialized = false;\n private _start_time: number | undefined;\n\n /**\n * Getter for _initialized\n * @return {boolean}\n */\n get initialized(): boolean {\n return this._initialized;\n }\n\n /**\n * Getter for _start_time\n * @return {number | undefined}\n */\n get start_time(): number | undefined {\n return this._start_time;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize(): void {\n this._initialized = true;\n }\n\n /**\n * Called when the player should override the 'session_time' provided by\n * the module\n */\n setStartTime(): void {\n this._start_time = new Date().getTime();\n }\n\n abstract reset(): void;\n}\n\n/**\n * Base class for cmi root objects\n */\nexport abstract class BaseRootCMI extends BaseCMI {\n abstract getCurrentTotalTime(): string;\n}\n","import { scorm12_constants } from \"../../constants/api_constants\";\nimport { scorm12_regex } from \"../../constants/regex\";\nimport { BaseCMI } from \"./base_cmi\";\nimport { checkValidFormat, checkValidRange } from \"./validation\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { BaseScormValidationError } from \"../../exceptions\";\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n private readonly __children: string;\n private readonly __score_range: string | false;\n private readonly __invalid_error_code: number;\n private readonly __invalid_type_code: number;\n private readonly __invalid_range_code: number;\n private readonly __decimal_regex: string;\n private readonly __error_class: typeof BaseScormValidationError;\n protected _raw = \"\";\n protected _min = \"\";\n protected _max: string;\n\n /**\n * Constructor for *.score\n * @param {\n * score_children: string,\n * score_range: string,\n * max: string,\n * invalidErrorCode: number,\n * invalidTypeCode: number,\n * invalidRangeCode: number,\n * decimalRegex: string,\n * errorClass: typeof BaseScormValidationError\n * } params\n */\n constructor(params: {\n score_children?: string;\n score_range?: string;\n max?: string;\n invalidErrorCode?: number;\n invalidTypeCode?: number;\n invalidRangeCode?: number;\n decimalRegex?: string;\n errorClass: typeof BaseScormValidationError;\n }) {\n super();\n\n this.__children = params.score_children || scorm12_constants.score_children;\n this.__score_range = !params.score_range\n ? false\n : scorm12_regex.score_range;\n this._max = params.max || params.max === \"\" ? params.max : \"100\";\n this.__invalid_error_code =\n params.invalidErrorCode || scorm12_errors.INVALID_SET_VALUE;\n this.__invalid_type_code =\n params.invalidTypeCode || scorm12_errors.TYPE_MISMATCH;\n this.__invalid_range_code =\n params.invalidRangeCode || scorm12_errors.VALUE_OUT_OF_RANGE;\n this.__decimal_regex = params.decimalRegex || scorm12_regex.CMIDecimal;\n this.__error_class = params.errorClass;\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n }\n\n /**\n * Getter for _children\n * @return {string}\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children: string) {\n throw new this.__error_class(this.__invalid_error_code);\n }\n\n /**\n * Getter for _raw\n * @return {string}\n */\n get raw(): string {\n return this._raw;\n }\n\n /**\n * Setter for _raw\n * @param {string} raw\n */\n set raw(raw: string) {\n if (\n checkValidFormat(\n raw,\n this.__decimal_regex,\n this.__invalid_type_code,\n this.__error_class,\n ) &&\n (!this.__score_range ||\n checkValidRange(\n raw,\n this.__score_range,\n this.__invalid_range_code,\n this.__error_class,\n ))\n ) {\n this._raw = raw;\n }\n }\n\n /**\n * Getter for _min\n * @return {string}\n */\n get min(): string {\n return this._min;\n }\n\n /**\n * Setter for _min\n * @param {string} min\n */\n set min(min: string) {\n if (\n checkValidFormat(\n min,\n this.__decimal_regex,\n this.__invalid_type_code,\n this.__error_class,\n ) &&\n (!this.__score_range ||\n checkValidRange(\n min,\n this.__score_range,\n this.__invalid_range_code,\n this.__error_class,\n ))\n ) {\n this._min = min;\n }\n }\n\n /**\n * Getter for _max\n * @return {string}\n */\n get max(): string {\n return this._max;\n }\n\n /**\n * Setter for _max\n * @param {string} max\n */\n set max(max: string) {\n if (\n checkValidFormat(\n max,\n this.__decimal_regex,\n this.__invalid_type_code,\n this.__error_class,\n ) &&\n (!this.__score_range ||\n checkValidRange(\n max,\n this.__score_range,\n this.__invalid_range_code,\n this.__error_class,\n ))\n ) {\n this._max = max;\n }\n }\n\n /**\n * toJSON for *.score\n * @return {\n * {\n * min: string,\n * max: string,\n * raw: string\n * }\n * }\n */\n toJSON(): {\n min: string;\n max: string;\n raw: string;\n } {\n this.jsonString = true;\n const result = {\n raw: this.raw,\n min: this.min,\n max: this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import { BaseScormValidationError } from \"../../exceptions\";\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {typeof BaseScormValidationError} errorClass\n * @param {boolean} [allowEmptyString]\n * @return {boolean}\n */\nexport function checkValidFormat(\n value: string,\n regexPattern: string,\n errorCode: number,\n errorClass: typeof BaseScormValidationError,\n allowEmptyString?: boolean,\n): boolean {\n if (typeof value !== \"string\") {\n return false;\n }\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === \"\") {\n return true;\n }\n if (value === undefined || !matches || matches[0] === \"\") {\n throw new errorClass(errorCode);\n }\n return true;\n}\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {any} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @param {typeof BaseScormValidationError} errorClass\n * @return {boolean}\n */\nexport function checkValidRange(\n value: any,\n rangePattern: string,\n errorCode: number,\n errorClass: typeof BaseScormValidationError,\n): boolean {\n const ranges = rangePattern.split(\"#\");\n value = value * 1.0;\n if (value >= ranges[0]) {\n if (ranges[1] === \"*\" || value <= ranges[1]) {\n return true;\n } else {\n throw new errorClass(errorCode);\n }\n } else {\n throw new errorClass(errorCode);\n }\n}\n","interface ErrorDescription {\n basicMessage: string;\n detailMessage: string;\n}\n\ninterface ErrorDescriptions {\n [key: string]: ErrorDescription;\n}\n\ninterface ScormConstants {\n cmi_children: string;\n core_children: string;\n score_children: string;\n comments_children: string;\n objectives_children: string;\n correct_responses_children: string;\n student_data_children: string;\n student_preference_children: string;\n interactions_children: string;\n error_descriptions: ErrorDescriptions;\n}\n\ninterface AiccConstants extends ScormConstants {\n student_demographics_children: string;\n tries_children: string;\n attempt_records_children: string;\n paths_children: string;\n}\n\ninterface Scorm2004Constants {\n cmi_children: string;\n comments_children: string;\n score_children: string;\n objectives_children: string;\n correct_responses_children: string;\n student_data_children: string;\n student_preference_children: string;\n interactions_children: string;\n adl_data_children: string;\n error_descriptions: ErrorDescriptions;\n}\n\ninterface GlobalConstants {\n SCORM_TRUE: string;\n SCORM_FALSE: string;\n STATE_NOT_INITIALIZED: number;\n STATE_INITIALIZED: number;\n STATE_TERMINATED: number;\n}\n\nexport const global_constants: GlobalConstants = {\n SCORM_TRUE: \"true\",\n SCORM_FALSE: \"false\",\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n};\n\nexport const scorm12_constants: ScormConstants = {\n // Children lists\n cmi_children:\n \"core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions\",\n core_children:\n \"student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time\",\n score_children: \"raw,min,max\",\n comments_children: \"content,location,time\",\n objectives_children: \"id,score,status\",\n correct_responses_children: \"pattern\",\n student_data_children: \"mastery_score,max_time_allowed,time_limit_action\",\n student_preference_children: \"audio,language,speed,text\",\n interactions_children:\n \"id,objectives,time,type,correct_responses,weighting,student_response,result,latency\",\n error_descriptions: {\n \"101\": {\n basicMessage: \"General Exception\",\n detailMessage:\n \"No specific error code exists to describe the error. Use LMSGetDiagnostic for more information\",\n },\n \"201\": {\n basicMessage: \"Invalid argument error\",\n detailMessage:\n \"Indicates that an argument represents an invalid data model element or is otherwise incorrect.\",\n },\n \"202\": {\n basicMessage: \"Element cannot have children\",\n detailMessage:\n 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n \"203\": {\n basicMessage: \"Element not an array - cannot have count\",\n detailMessage:\n 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n \"301\": {\n basicMessage: \"Not initialized\",\n detailMessage:\n \"Indicates that an API call was made before the call to lmsInitialize.\",\n },\n \"401\": {\n basicMessage: \"Not implemented error\",\n detailMessage:\n \"The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.\",\n },\n \"402\": {\n basicMessage: \"Invalid set value, element is a keyword\",\n detailMessage:\n 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n \"403\": {\n basicMessage: \"Element is read only\",\n detailMessage:\n \"LMSSetValue was called with a data model element that can only be read.\",\n },\n \"404\": {\n basicMessage: \"Element is write only\",\n detailMessage:\n \"LMSGetValue was called on a data model element that can only be written to.\",\n },\n \"405\": {\n basicMessage: \"Incorrect Data Type\",\n detailMessage:\n \"LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.\",\n },\n \"407\": {\n basicMessage: \"Element Value Out Of Range\",\n detailMessage:\n \"The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.\",\n },\n \"408\": {\n basicMessage: \"Data Model Dependency Not Established\",\n detailMessage:\n \"Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.\",\n },\n },\n};\nexport const aicc_constants: AiccConstants = {\n ...scorm12_constants,\n ...{\n cmi_children:\n \"core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation\",\n student_preference_children:\n \"audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows\",\n student_data_children:\n \"attempt_number,tries,mastery_score,max_time_allowed,time_limit_action\",\n student_demographics_children:\n \"city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience\",\n tries_children: \"time,status,score\",\n attempt_records_children: \"score,lesson_status\",\n paths_children: \"location_id,date,time,status,why_left,time_in_element\",\n },\n};\n\nexport const scorm2004_constants: Scorm2004Constants = {\n // Children lists\n cmi_children:\n \"_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time\",\n comments_children: \"comment,timestamp,location\",\n score_children: \"max,raw,scaled,min\",\n objectives_children:\n \"progress_measure,completion_status,success_status,description,score,id\",\n correct_responses_children: \"pattern\",\n student_data_children: \"mastery_score,max_time_allowed,time_limit_action\",\n student_preference_children:\n \"audio_level,audio_captioning,delivery_speed,language\",\n interactions_children:\n \"id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description\",\n adl_data_children: \"id,store\",\n error_descriptions: {\n \"0\": {\n basicMessage: \"No Error\",\n detailMessage: \"No error occurred, the previous API call was successful.\",\n },\n \"101\": {\n basicMessage: \"General Exception\",\n detailMessage:\n \"No specific error code exists to describe the error. Use GetDiagnostic for more information.\",\n },\n \"102\": {\n basicMessage: \"General Initialization Failure\",\n detailMessage: \"Call to Initialize failed for an unknown reason.\",\n },\n \"103\": {\n basicMessage: \"Already Initialized\",\n detailMessage:\n \"Call to Initialize failed because Initialize was already called.\",\n },\n \"104\": {\n basicMessage: \"Content Instance Terminated\",\n detailMessage:\n \"Call to Initialize failed because Terminate was already called.\",\n },\n \"111\": {\n basicMessage: \"General Termination Failure\",\n detailMessage: \"Call to Terminate failed for an unknown reason.\",\n },\n \"112\": {\n basicMessage: \"Termination Before Initialization\",\n detailMessage:\n \"Call to Terminate failed because it was made before the call to Initialize.\",\n },\n \"113\": {\n basicMessage: \"Termination After Termination\",\n detailMessage:\n \"Call to Terminate failed because Terminate was already called.\",\n },\n \"122\": {\n basicMessage: \"Retrieve Data Before Initialization\",\n detailMessage:\n \"Call to GetValue failed because it was made before the call to Initialize.\",\n },\n \"123\": {\n basicMessage: \"Retrieve Data After Termination\",\n detailMessage:\n \"Call to GetValue failed because it was made after the call to Terminate.\",\n },\n \"132\": {\n basicMessage: \"Store Data Before Initialization\",\n detailMessage:\n \"Call to SetValue failed because it was made before the call to Initialize.\",\n },\n \"133\": {\n basicMessage: \"Store Data After Termination\",\n detailMessage:\n \"Call to SetValue failed because it was made after the call to Terminate.\",\n },\n \"142\": {\n basicMessage: \"Commit Before Initialization\",\n detailMessage:\n \"Call to Commit failed because it was made before the call to Initialize.\",\n },\n \"143\": {\n basicMessage: \"Commit After Termination\",\n detailMessage:\n \"Call to Commit failed because it was made after the call to Terminate.\",\n },\n \"201\": {\n basicMessage: \"General Argument Error\",\n detailMessage:\n \"An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.\",\n },\n \"301\": {\n basicMessage: \"General Get Failure\",\n detailMessage:\n \"Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.\",\n },\n \"351\": {\n basicMessage: \"General Set Failure\",\n detailMessage:\n \"Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.\",\n },\n \"391\": {\n basicMessage: \"General Commit Failure\",\n detailMessage:\n \"Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.\",\n },\n \"401\": {\n basicMessage: \"Undefined Data Model Element\",\n detailMessage:\n \"The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.\",\n },\n \"402\": {\n basicMessage: \"Unimplemented Data Model Element\",\n detailMessage:\n \"The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.\",\n },\n \"403\": {\n basicMessage: \"Data Model Element Value Not Initialized\",\n detailMessage:\n \"Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.\",\n },\n \"404\": {\n basicMessage: \"Data Model Element Is Read Only\",\n detailMessage:\n \"SetValue was called with a data model element that can only be read.\",\n },\n \"405\": {\n basicMessage: \"Data Model Element Is Write Only\",\n detailMessage:\n \"GetValue was called on a data model element that can only be written to.\",\n },\n \"406\": {\n basicMessage: \"Data Model Element Type Mismatch\",\n detailMessage:\n \"SetValue was called with a value that is not consistent with the data format of the supplied data model element.\",\n },\n \"407\": {\n basicMessage: \"Data Model Element Value Out Of Range\",\n detailMessage:\n \"The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.\",\n },\n \"408\": {\n basicMessage: \"Data Model Dependency Not Established\",\n detailMessage:\n \"Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.\",\n },\n },\n};\n","export enum NAVBoolean {\n unknown = \"unknown\",\n true = \"true\",\n false = \"false\",\n}\n\nexport enum SuccessStatus {\n passed = \"passed\",\n failed = \"failed\",\n unknown = \"unknown\",\n}\n\nexport enum CompletionStatus {\n completed = \"completed\",\n incomplete = \"incomplete\",\n unknown = \"unknown\",\n}\n\nexport enum LogLevelEnum {\n _,\n DEBUG,\n INFO,\n WARN,\n ERROR,\n NONE,\n}\n","export type ErrorCode = {\n [key: string]: number;\n};\n\nexport const global_errors: ErrorCode = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nexport const scorm12_errors: ErrorCode = {\n ...global_errors,\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n};\n\nexport const scorm2004_errors: ErrorCode = {\n ...global_errors,\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n};\n","export const scorm12_regex = {\n CMIString256: \"^.{0,255}$\",\n CMIString4096: \"^.{0,4096}$\",\n CMITime: \"^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$\",\n CMITimespan: \"^([0-9]{2,}):([0-9]{2}):([0-9]{2})(.[0-9]{1,2})?$\",\n\n CMIInteger: \"^\\\\d+$\",\n CMISInteger: \"^-?([0-9]+)$\",\n CMIDecimal: \"^-?([0-9]{0,3})(.[0-9]*)?$\",\n\n CMIIdentifier: \"^[\\\\u0021-\\\\u007E\\\\s]{0,255}$\",\n CMIFeedback: \"^.{0,255}$\",\n // This must be redefined\n CMIIndex: \"[._](\\\\d+).\",\n // Vocabulary Data Type Definition\n CMIStatus: \"^(passed|completed|failed|incomplete|browsed)$\",\n CMIStatus2: \"^(passed|completed|failed|incomplete|browsed|not attempted)$\",\n CMIExit: \"^(time-out|suspend|logout|)$\",\n CMIType:\n \"^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$\",\n CMIResult:\n \"^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\\\.[0-9]*)?)$\",\n NAVEvent: \"^(previous|continue)$\",\n // Data ranges\n score_range: \"0#100\",\n audio_range: \"-1#100\",\n speed_range: \"-100#100\",\n weighting_range: \"-100#100\",\n text_range: \"-1#1\",\n};\nexport const aicc_regex = {\n ...scorm12_regex,\n ...{\n CMIIdentifier: \"^\\\\w{1,255}$\",\n },\n};\nexport const scorm2004_regex = {\n CMIString200: \"^[\\\\u0000-\\\\uFFFF]{0,200}$\",\n CMIString250: \"^[\\\\u0000-\\\\uFFFF]{0,250}$\",\n CMIString1000: \"^[\\\\u0000-\\\\uFFFF]{0,1000}$\",\n CMIString4000: \"^[\\\\u0000-\\\\uFFFF]{0,4000}$\",\n CMIString64000: \"^[\\\\u0000-\\\\uFFFF]{0,64000}$\",\n CMILang: \"^([a-zA-Z]{2,3}|i|x)(-[a-zA-Z0-9-]{2,8})?$|^$\",\n\n CMILangString250:\n \"^({lang=([a-zA-Z]{2,3}|i|x)(-[a-zA-Z0-9-]{2,8})?})?((?!{.*$).{0,250}$)?$\",\n\n CMILangcr: \"^(({lang=([a-zA-Z]{2,3}|i|x)?(-[a-zA-Z0-9-]{2,8})?}))(.*?)$\",\n\n CMILangString250cr:\n \"^(({lang=([a-zA-Z]{2,3}|i|x)?(-[a-zA-Z0-9-]{2,8})?})?(.{0,250})?)?$\",\n\n CMILangString4000:\n \"^({lang=([a-zA-Z]{2,3}|i|x)(-[a-zA-Z0-9-]{2,8})?})?((?!{.*$).{0,4000}$)?$\",\n\n CMITime:\n \"^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$\",\n CMITimespan:\n \"^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$\",\n CMIInteger: \"^\\\\d+$\",\n CMISInteger: \"^-?([0-9]+)$\",\n CMIDecimal: \"^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$\",\n CMIIdentifier: \"^\\\\S{1,250}[a-zA-Z0-9]$\",\n CMIShortIdentifier: \"^[\\\\w\\\\.\\\\-\\\\_]{1,250}$\",\n CMILongIdentifier:\n \"^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000}|.{1,4000})$\",\n // need to re-examine this\n CMIFeedback: \"^.*$\",\n // This must be redefined\n CMIIndex: \"[._](\\\\d+).\",\n CMIIndexStore: \".N(\\\\d+).\",\n // Vocabulary Data Type Definition\n CMICStatus: \"^(completed|incomplete|not attempted|unknown)$\",\n CMISStatus: \"^(passed|failed|unknown)$\",\n CMIExit: \"^(time-out|suspend|logout|normal)$\",\n CMIType:\n \"^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$\",\n CMIResult:\n \"^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$\",\n NAVEvent:\n \"^(previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|_none_|(\\\\{target=(?<choice_target>\\\\S{0,}[a-zA-Z0-9-_]+)})?choice|(\\\\{target=(?<jump_target>\\\\S{0,}[a-zA-Z0-9-_]+)})?jump)$\",\n\n NAVBoolean: \"^(unknown|true|false$)\",\n NAVTarget: \"^{target=\\\\S{0,}[a-zA-Z0-9-_]+}$\",\n // Data ranges\n scaled_range: \"-1#1\",\n audio_range: \"0#*\",\n speed_range: \"0#*\",\n text_range: \"-1#1\",\n progress_range: \"0#1\",\n};\n","type APIError = {\n errorCode: number;\n errorMessage: string;\n detailedMessage: string;\n};\n\nexport class BaseScormValidationError extends Error {\n constructor(errorCode: number) {\n super(errorCode.toString());\n this._errorCode = errorCode;\n this.name = \"ScormValidationError\";\n }\n\n private readonly _errorCode: number;\n\n /**\n * Getter for _errorCode\n * @return {number}\n */\n get errorCode(): number {\n return this._errorCode;\n }\n}\n\n/**\n * Base Validation Exception\n */\nexport class ValidationError\n extends BaseScormValidationError\n implements APIError\n{\n /**\n * Constructor to take in an error message and code\n * @param {number} errorCode\n * @param {string} errorMessage\n * @param {string} detailedMessage\n */\n constructor(\n errorCode: number,\n errorMessage: string,\n detailedMessage?: string,\n ) {\n super(errorCode);\n this.message = errorMessage;\n this._errorMessage = errorMessage;\n if (detailedMessage) {\n this._detailedMessage = detailedMessage;\n }\n }\n\n private readonly _errorMessage: string;\n private readonly _detailedMessage: string = \"\";\n\n /**\n * Getter for _errorMessage\n * @return {string}\n */\n get errorMessage(): string {\n return this._errorMessage;\n }\n\n /**\n * Getter for _detailedMessage\n * @return {string}\n */\n get detailedMessage(): string {\n return this._detailedMessage;\n }\n}\n","export const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\ntype Designation = {\n [key: string]: number;\n};\n\ntype StringKeyMap = {\n [key: string]: any;\n};\n\nconst designations: Designation = {\n D: SECONDS_PER_DAY,\n H: SECONDS_PER_HOUR,\n M: SECONDS_PER_MINUTE,\n S: SECONDS_PER_SECOND,\n};\n\n/**\n * Converts a Number to a String of HH:MM:SS\n *\n * @param {number} totalSeconds\n * @return {string}\n */\nexport function getSecondsAsHHMMSS(totalSeconds: number | null): string {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return \"00:00:00\";\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds();\n const ms = totalSeconds % 1.0;\n let msStr = \"\";\n\n if (countDecimals(ms) > 0) {\n if (countDecimals(ms) > 2) {\n msStr = ms.toFixed(2);\n } else {\n msStr = String(ms);\n }\n\n msStr = \".\" + msStr.split(\".\")[1];\n }\n\n return (\n (hours + \":\" + minutes + \":\" + seconds).replace(/\\b\\d\\b/g, \"0$&\") + msStr\n );\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {number} seconds\n * @return {string}\n */\nexport function getSecondsAsISODuration(seconds: number | null): string {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return \"PT0S\";\n }\n\n let duration = \"P\";\n let remainder = seconds;\n for (const designationsKey in designations) {\n const current_seconds = designations[designationsKey];\n let value = Math.floor(remainder / current_seconds);\n remainder = remainder % current_seconds;\n\n if (countDecimals(remainder) > 2) {\n remainder = Number(Number(remainder).toFixed(2));\n }\n\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (designationsKey === \"S\" && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n if (\n (duration.indexOf(\"D\") > 0 ||\n designationsKey === \"H\" ||\n designationsKey === \"M\" ||\n designationsKey === \"S\") &&\n duration.indexOf(\"T\") === -1\n ) {\n duration += \"T\";\n }\n\n duration += `${value}${designationsKey}`;\n }\n }\n return duration;\n}\n\n/**\n * Calculate the number of seconds from HH:MM:SS.DDDDDD\n *\n * @param {string} timeString\n * @param {RegExp} timeRegex\n * @return {number}\n */\nexport function getTimeAsSeconds(\n timeString: string | number | boolean | null,\n timeRegex: RegExp | string,\n): number {\n if (typeof timeString === \"number\" || typeof timeString === \"boolean\") {\n timeString = String(timeString);\n }\n if (typeof timeRegex === \"string\") {\n timeRegex = new RegExp(timeRegex);\n }\n if (!timeString || !timeString.match(timeRegex)) {\n return 0;\n }\n\n const parts = timeString.split(\":\");\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return hours * 3600 + minutes * 60 + seconds;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {string} duration\n * @param {RegExp} durationRegex\n * @return {number}\n */\nexport function getDurationAsSeconds(\n duration: string | null,\n durationRegex: RegExp | string,\n): number {\n if (typeof durationRegex === \"string\") {\n durationRegex = new RegExp(durationRegex);\n }\n\n if (!duration || !duration.match(durationRegex)) {\n return 0;\n }\n\n const [, years, _, , days, hours, minutes, seconds] =\n new RegExp(durationRegex).exec(duration) || [];\n let result = 0.0;\n result += Number(seconds) || 0.0;\n result += Number(minutes) * 60.0 || 0.0;\n result += Number(hours) * 3600.0 || 0.0;\n result += Number(days) * (60 * 60 * 24.0) || 0.0;\n result += Number(years) * (60 * 60 * 24 * 365.0) || 0.0;\n return result;\n}\n\n/**\n * Adds together two ISO8601 Duration strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp|string} durationRegex\n * @return {string}\n */\nexport function addTwoDurations(\n first: string,\n second: string,\n durationRegex: RegExp | string,\n): string {\n const regex: RegExp =\n typeof durationRegex === \"string\"\n ? new RegExp(durationRegex)\n : durationRegex;\n return getSecondsAsISODuration(\n getDurationAsSeconds(first, regex) + getDurationAsSeconds(second, regex),\n );\n}\n\n/**\n * Add together two HH:MM:SS.DD strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} timeRegex\n * @return {string}\n */\nexport function addHHMMSSTimeStrings(\n first: string,\n second: string,\n timeRegex: RegExp | string,\n): string {\n if (typeof timeRegex === \"string\") {\n timeRegex = new RegExp(timeRegex);\n }\n return getSecondsAsHHMMSS(\n getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex),\n );\n}\n\n/**\n * Flatten a JSON object down to string paths for each values\n * @param {object} data\n * @return {object}\n */\nexport function flatten(data: StringKeyMap): object {\n const result: StringKeyMap = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur: any, prop: any) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (let i = 0, l = cur.length; i < l; i++) {\n recurse(cur[i], prop + \"[\" + i + \"]\");\n if (l === 0) result[prop] = [];\n }\n } else {\n let isEmpty = true;\n\n for (const p in cur) {\n if ({}.hasOwnProperty.call(cur, p)) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + \".\" + p : p);\n }\n }\n\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, \"\");\n return result;\n}\n\n/**\n * Un-flatten a flat JSON object\n * @param {object} data\n * @return {object}\n */\nexport function unflatten(data: StringKeyMap): object {\n \"use strict\";\n\n if (Object(data) !== data || Array.isArray(data)) return data;\n const regex = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n const result: StringKeyMap = {};\n\n for (const p in data) {\n if ({}.hasOwnProperty.call(data, p)) {\n let cur = result;\n let prop = \"\";\n let m = regex.exec(p);\n\n while (m) {\n cur = cur[prop] || (cur[prop] = m[2] ? [] : {});\n prop = m[2] || m[1];\n m = regex.exec(p);\n }\n\n cur[prop] = data[p];\n }\n }\n\n return result[\"\"] || result;\n}\n\n/**\n * Counts the number of decimal places\n * @param {number} num\n * @return {number}\n */\nexport function countDecimals(num: number): number {\n if (Math.floor(num) === num || String(num).indexOf(\".\") < 0) return 0;\n const parts = num.toString().split(\".\")[1];\n return parts.length || 0;\n}\n\n/**\n * Formats the SCORM messages for easy reading\n *\n * @param {string} functionName\n * @param {string} message\n * @param {string} CMIElement\n * @return {string}\n */\nexport function formatMessage(\n functionName: string,\n message: string,\n CMIElement?: string,\n): string {\n const baseLength = 20;\n let messageString = \"\";\n\n messageString += functionName;\n\n let fillChars = baseLength - messageString.length;\n\n for (let i = 0; i < fillChars; i++) {\n messageString += \" \";\n }\n\n messageString += \": \";\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n\n messageString += CMIElement;\n\n fillChars = CMIElementBaseLength - messageString.length;\n\n for (let j = 0; j < fillChars; j++) {\n messageString += \" \";\n }\n }\n\n if (message) {\n messageString += message;\n }\n\n return messageString;\n}\n\n/**\n * Checks to see if {str} contains {tester}\n *\n * @param {string} str String to check against\n * @param {string} tester String to check for\n * @return {boolean}\n */\nexport function stringMatches(str: string, tester: string): boolean {\n return str?.match(tester) !== null;\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { ValidationError } from \"../exceptions\";\nimport { scorm2004_constants } from \"../constants/api_constants\";\n\nconst scorm2004_errors = scorm2004_constants.error_descriptions;\n\n/**\n * SCORM 2004 Validation Error\n */\nexport class Scorm2004ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {\n super(\n errorCode,\n scorm2004_errors[String(errorCode)].basicMessage,\n scorm2004_errors[String(errorCode)].detailMessage,\n );\n } else {\n super(\n 101,\n scorm2004_errors[\"101\"].basicMessage,\n scorm2004_errors[\"101\"].detailMessage,\n );\n }\n }\n}\n","import { checkValidFormat, checkValidRange } from \"../common/validation\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {string} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check2004ValidFormat(\n value: string,\n regexPattern: string,\n allowEmptyString?: boolean,\n): boolean {\n return checkValidFormat(\n value,\n regexPattern,\n scorm2004_errors.TYPE_MISMATCH,\n Scorm2004ValidationError,\n allowEmptyString,\n );\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {string} value\n * @param {string} rangePattern\n * @return {boolean}\n */\nexport function check2004ValidRange(\n value: string,\n rangePattern: string,\n): boolean {\n return checkValidRange(\n value,\n rangePattern,\n scorm2004_errors.VALUE_OUT_OF_RANGE,\n Scorm2004ValidationError,\n );\n}\n","/**\n * Class for SCORM 2004's cmi.learner_preference object\n */\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { check2004ValidFormat, check2004ValidRange } from \"./validation\";\nimport { scorm2004_regex } from \"../../constants/regex\";\n\nexport class CMILearnerPreference extends BaseCMI {\n private __children = scorm2004_constants.student_preference_children;\n private _audio_level = \"1\";\n private _language = \"\";\n private _delivery_speed = \"1\";\n private _audio_captioning = \"0\";\n\n /**\n * Constructor for cmi.learner_preference\n */\n constructor() {\n super();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset() {\n this._initialized = false;\n }\n\n /**\n * Getter for __children\n * @return {string}\n * @private\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for __children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children: string) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n\n /**\n * Getter for _audio_level\n * @return {string}\n */\n get audio_level(): string {\n return this._audio_level;\n }\n\n /**\n * Setter for _audio_level\n * @param {string} audio_level\n */\n set audio_level(audio_level: string) {\n if (\n check2004ValidFormat(audio_level, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(audio_level, scorm2004_regex.audio_range)\n ) {\n this._audio_level = audio_level;\n }\n }\n\n /**\n * Getter for _language\n * @return {string}\n */\n get language(): string {\n return this._language;\n }\n\n /**\n * Setter for _language\n * @param {string} language\n */\n set language(language: string) {\n if (check2004ValidFormat(language, scorm2004_regex.CMILang)) {\n this._language = language;\n }\n }\n\n /**\n * Getter for _delivery_speed\n * @return {string}\n */\n get delivery_speed(): string {\n return this._delivery_speed;\n }\n\n /**\n * Setter for _delivery_speed\n * @param {string} delivery_speed\n */\n set delivery_speed(delivery_speed: string) {\n if (\n check2004ValidFormat(delivery_speed, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(delivery_speed, scorm2004_regex.speed_range)\n ) {\n this._delivery_speed = delivery_speed;\n }\n }\n\n /**\n * Getter for _audio_captioning\n * @return {string}\n */\n get audio_captioning(): string {\n return this._audio_captioning;\n }\n\n /**\n * Setter for _audio_captioning\n * @param {string} audio_captioning\n */\n set audio_captioning(audio_captioning: string) {\n if (\n check2004ValidFormat(audio_captioning, scorm2004_regex.CMISInteger) &&\n check2004ValidRange(audio_captioning, scorm2004_regex.text_range)\n ) {\n this._audio_captioning = audio_captioning;\n }\n }\n\n /**\n * toJSON for cmi.learner_preference\n *\n * @return {\n * {\n * audio_level: string,\n * language: string,\n * delivery_speed: string,\n * audio_captioning: string\n * }\n * }\n */\n toJSON(): {\n audio_level: string;\n language: string;\n delivery_speed: string;\n audio_captioning: string;\n } {\n this.jsonString = true;\n const result = {\n audio_level: this.audio_level,\n language: this.language,\n delivery_speed: this.delivery_speed,\n audio_captioning: this.audio_captioning,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import { scorm2004_regex } from \"./regex\";\n\nexport const LearnerResponses: Responses = {\n \"true-false\": {\n format: \"^true$|^false$\",\n max: 1,\n delimiter: \"\",\n unique: false,\n },\n choice: {\n format: scorm2004_regex.CMILongIdentifier,\n max: 36,\n delimiter: \"[,]\",\n unique: true,\n },\n \"fill-in\": {\n format: scorm2004_regex.CMILangString250,\n max: 10,\n delimiter: \"[,]\",\n unique: false,\n },\n \"long-fill-in\": {\n format: scorm2004_regex.CMILangString4000,\n max: 1,\n delimiter: \"\",\n unique: false,\n },\n matching: {\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: \"[,]\",\n delimiter2: \"[.]\",\n unique: false,\n },\n performance: {\n format: \"^$|\" + scorm2004_regex.CMIShortIdentifier,\n format2:\n scorm2004_regex.CMIDecimal + \"|^$|\" + scorm2004_regex.CMIShortIdentifier,\n max: 250,\n delimiter: \"[,]\",\n delimiter2: \"[.]\",\n unique: false,\n },\n sequencing: {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: \"[,]\",\n unique: false,\n },\n likert: {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 1,\n delimiter: \"\",\n unique: false,\n },\n numeric: {\n format: scorm2004_regex.CMIDecimal,\n max: 1,\n delimiter: \"\",\n unique: false,\n },\n other: {\n format: scorm2004_regex.CMIString4000,\n max: 1,\n delimiter: \"\",\n unique: false,\n },\n};\nexport const CorrectResponses: Responses = {\n \"true-false\": {\n max: 1,\n delimiter: \"\",\n unique: false,\n duplicate: false,\n format: \"^true$|^false$\",\n limit: 1,\n },\n choice: {\n max: 36,\n delimiter: \"[,]\",\n unique: true,\n duplicate: false,\n format: scorm2004_regex.CMILongIdentifier,\n },\n \"fill-in\": {\n max: 10,\n delimiter: \"[,]\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMILangString250cr,\n },\n \"long-fill-in\": {\n max: 1,\n delimiter: \"\",\n unique: false,\n duplicate: true,\n format: scorm2004_regex.CMILangString4000,\n },\n matching: {\n max: 36,\n delimiter: \"[,]\",\n delimiter2: \"[.]\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n },\n performance: {\n max: 250,\n delimiter: \"[,]\",\n delimiter2: \"[.]\",\n delimiter3: \"[:]\",\n unique: false,\n duplicate: false,\n format: \"^$|\" + scorm2004_regex.CMIShortIdentifier,\n format2:\n scorm2004_regex.CMIDecimal + \"|^$|\" + scorm2004_regex.CMIShortIdentifier,\n },\n sequencing: {\n max: 36,\n delimiter: \"[,]\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n likert: {\n max: 1,\n delimiter: \"\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n limit: 1,\n },\n numeric: {\n max: 2,\n delimiter: \"[:]\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIDecimal,\n limit: 1,\n },\n other: {\n max: 1,\n delimiter: \"\",\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIString4000,\n limit: 1,\n },\n};\n\nexport type ResponseType = {\n format: string;\n max: number;\n delimiter: string;\n unique: boolean;\n duplicate?: boolean;\n format2?: string;\n delimiter2?: string;\n limit?: number;\n delimiter3?: string;\n};\n\nexport type Responses = {\n [key: string]: ResponseType;\n};\n","/**\n * Class representing SCORM 2004's `cmi.interactions` object\n */\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { CMIArray } from \"../common/array\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\nimport { check2004ValidFormat } from \"./validation\";\nimport { scorm2004_regex } from \"../../constants/regex\";\nimport { LearnerResponses } from \"../../constants/response_constants\";\n\nexport class CMIInteractions extends CMIArray {\n /**\n * Constructor for `cmi.objectives` Array\n */\n constructor() {\n super({\n children: scorm2004_constants.interactions_children,\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.interaction.n object\n */\n\nexport class CMIInteractionsObject extends BaseCMI {\n private _id = \"\";\n private _type = \"\";\n private _timestamp = \"\";\n private _weighting = \"\";\n private _learner_response = \"\";\n private _result = \"\";\n private _latency = \"\";\n private _description = \"\";\n\n /**\n * Constructor for cmi.interaction.n\n */\n constructor() {\n super();\n this.objectives = new CMIArray({\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.correct_responses_children,\n });\n }\n\n public objectives: CMIArray;\n public correct_responses: CMIArray;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset() {\n this._initialized = false;\n this._id = \"\";\n this._type = \"\";\n this._timestamp = \"\";\n this._weighting = \"\";\n this._learner_response = \"\";\n this._result = \"\";\n this._latency = \"\";\n this._description = \"\";\n this.objectives = new CMIArray({\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.correct_responses_children,\n });\n }\n\n /**\n * Getter for _id\n * @return {string}\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * Getter for _type\n * @return {string}\n */\n get type(): string {\n return this._type;\n }\n\n /**\n * Setter for _type\n * @param {string} type\n */\n set type(type: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(type, scorm2004_regex.CMIType)) {\n this._type = type;\n }\n }\n }\n\n /**\n * Getter for _timestamp\n * @return {string}\n */\n get timestamp(): string {\n return this._timestamp;\n }\n\n /**\n * Setter for _timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {\n this._timestamp = timestamp;\n }\n }\n }\n\n /**\n * Getter for _weighting\n * @return {string}\n */\n get weighting(): string {\n return this._weighting;\n }\n\n /**\n * Setter for _weighting\n * @param {string} weighting\n */\n set weighting(weighting: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(weighting, scorm2004_regex.CMIDecimal)) {\n this._weighting = weighting;\n }\n }\n }\n\n /**\n * Getter for _learner_response\n * @return {string}\n */\n get learner_response(): string {\n return this._learner_response;\n }\n\n /**\n * Setter for _learner_response. Does type validation to make sure response\n * matches SCORM 2004's spec\n * @param {string} learner_response\n */\n set learner_response(learner_response: string) {\n if (this.initialized && (this._type === \"\" || this._id === \"\")) {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n let nodes = [];\n const response_type = LearnerResponses[this.type];\n\n if (response_type) {\n if (response_type?.delimiter) {\n nodes = learner_response.split(response_type.delimiter);\n } else {\n nodes[0] = learner_response;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n const formatRegex = new RegExp(response_type.format);\n\n for (let i = 0; i < nodes.length; i++) {\n if (response_type?.delimiter2) {\n const values = nodes[i].split(response_type.delimiter2);\n\n if (values.length === 2) {\n if (!values[0].match(formatRegex)) {\n throw new Scorm2004ValidationError(\n scorm2004_errors.TYPE_MISMATCH,\n );\n } else {\n if (\n !response_type.format2 ||\n !values[1].match(new RegExp(response_type.format2))\n ) {\n throw new Scorm2004ValidationError(\n scorm2004_errors.TYPE_MISMATCH,\n );\n }\n }\n } else {\n throw new Scorm2004ValidationError(\n scorm2004_errors.TYPE_MISMATCH,\n );\n }\n } else {\n if (!nodes[i].match(formatRegex)) {\n throw new Scorm2004ValidationError(\n scorm2004_errors.TYPE_MISMATCH,\n );\n } else {\n if (nodes[i] !== \"\" && response_type.unique) {\n for (let j = 0; j < i; j++) {\n if (nodes[i] === nodes[j]) {\n throw new Scorm2004ValidationError(\n scorm2004_errors.TYPE_MISMATCH,\n );\n }\n }\n }\n }\n }\n }\n } else {\n throw new Scorm2004ValidationError(\n scorm2004_errors.GENERAL_SET_FAILURE,\n );\n }\n\n this._learner_response = learner_response;\n } else {\n throw new Scorm2004ValidationError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n }\n\n /**\n * Getter for _result\n * @return {string}\n */\n get result(): string {\n return this._result;\n }\n\n /**\n * Setter for _result\n * @param {string} result\n */\n set result(result: string) {\n if (check2004ValidFormat(result, scorm2004_regex.CMIResult)) {\n this._result = result;\n }\n }\n\n /**\n * Getter for _latency\n * @return {string}\n */\n get latency(): string {\n return this._latency;\n }\n\n /**\n * Setter for _latency\n * @param {string} latency\n */\n set latency(latency: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(latency, scorm2004_regex.CMITimespan)) {\n this._latency = latency;\n }\n }\n }\n\n /**\n * Getter for _description\n * @return {string}\n */\n get description(): string {\n return this._description;\n }\n\n /**\n * Setter for _description\n * @param {string} description\n */\n set description(description: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (\n check2004ValidFormat(\n description,\n scorm2004_regex.CMILangString250,\n true,\n )\n ) {\n this._description = description;\n }\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * type: string,\n * objectives: CMIArray,\n * timestamp: string,\n * correct_responses: CMIArray,\n * weighting: string,\n * learner_response: string,\n * result: string,\n * latency: string,\n * description: string\n * }\n * }\n */\n toJSON(): {\n id: string;\n type: string;\n objectives: CMIArray;\n timestamp: string;\n correct_responses: CMIArray;\n weighting: string;\n learner_response: string;\n result: string;\n latency: string;\n description: string;\n } {\n this.jsonString = true;\n const result = {\n id: this.id,\n type: this.type,\n objectives: this.objectives,\n timestamp: this.timestamp,\n weighting: this.weighting,\n learner_response: this.learner_response,\n result: this.result,\n latency: this.latency,\n description: this.description,\n correct_responses: this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.objectives.n object\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n private _id = \"\";\n\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset() {\n this._initialized = false;\n this._id = \"\";\n }\n\n /**\n * Getter for _id\n * @return {string}\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON(): {\n id: string;\n } {\n this.jsonString = true;\n const result = {\n id: this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n private _pattern = \"\";\n\n /**\n * Constructor for cmi.interactions.n.correct_responses.n\n */\n constructor() {\n super();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset() {\n this._initialized = false;\n this._pattern = \"\";\n }\n\n /**\n * Getter for _pattern\n * @return {string}\n */\n get pattern(): string {\n return this._pattern;\n }\n\n /**\n * Setter for _pattern\n * @param {string} pattern\n */\n set pattern(pattern: string) {\n if (check2004ValidFormat(pattern, scorm2004_regex.CMIFeedback)) {\n this._pattern = pattern;\n }\n }\n\n /**\n * toJSON cmi.interactions.n.correct_responses.n object\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON(): {\n pattern: string;\n } {\n this.jsonString = true;\n const result = {\n pattern: this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n","/**\n * Class for SCORM 2004's cmi *.score object\n */\nimport { CMIScore } from \"../common/score\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { scorm2004_regex } from \"../../constants/regex\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { check2004ValidFormat, check2004ValidRange } from \"./validation\";\n\nexport class Scorm2004CMIScore extends CMIScore {\n private _scaled = \"\";\n\n /**\n * Constructor for cmi *.score\n */\n constructor() {\n super({\n score_children: scorm2004_constants.score_children,\n max: \"\",\n invalidErrorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n invalidTypeCode: scorm2004_errors.TYPE_MISMATCH,\n invalidRangeCode: scorm2004_errors.VALUE_OUT_OF_RANGE,\n decimalRegex: scorm2004_regex.CMIDecimal,\n errorClass: Scorm2004ValidationError,\n });\n }\n\n /**\n * Called when the API has been reset\n */\n override reset(): void {\n this._initialized = false;\n this._scaled = \"\";\n this._raw = \"\";\n this._min = \"\";\n this._max = \"\";\n }\n\n /**\n * Getter for _scaled\n * @return {string}\n */\n get scaled(): string {\n return this._scaled;\n }\n\n /**\n * Setter for _scaled\n * @param {string} scaled\n */\n set scaled(scaled: string) {\n if (\n check2004ValidFormat(scaled, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(scaled, scorm2004_regex.scaled_range)\n ) {\n this._scaled = scaled;\n }\n }\n\n /**\n * toJSON for cmi *.score\n *\n * @return {\n * {\n * scaled: string,\n * raw: string,\n * min: string,\n * max: string\n * }\n * }\n */\n override toJSON(): {\n scaled: string;\n raw: string;\n min: string;\n max: string;\n } {\n this.jsonString = true;\n const result = {\n scaled: this.scaled,\n raw: this.raw,\n min: this.min,\n max: this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import { CMIArray } from \"../common/array\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { check2004ValidFormat } from \"./validation\";\nimport { scorm2004_regex } from \"../../constants/regex\";\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_lms object\n * @extends CMIArray\n */\nexport class CMICommentsFromLMS extends CMIArray {\n /**\n * Constructor for cmi.comments_from_lms Array\n */\n constructor() {\n super({\n children: scorm2004_constants.comments_children,\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner object\n */\n\nexport class CMICommentsFromLearner extends CMIArray {\n /**\n * Constructor for cmi.comments_from_learner Array\n */\n constructor() {\n super({\n children: scorm2004_constants.comments_children,\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object\n */\n\nexport class CMICommentsObject extends BaseCMI {\n private _comment = \"\";\n private _location = \"\";\n private _timestamp = \"\";\n private readonly _readOnlyAfterInit: boolean;\n\n /**\n * Constructor for cmi.comments_from_learner.n and cmi.comments_from_lms.n\n * @param {boolean} readOnlyAfterInit\n */\n constructor(readOnlyAfterInit: boolean = false) {\n super();\n this._comment = \"\";\n this._location = \"\";\n this._timestamp = \"\";\n this._readOnlyAfterInit = readOnlyAfterInit;\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n }\n\n /**\n * Getter for _comment\n * @return {string}\n */\n get comment(): string {\n return this._comment;\n }\n\n /**\n * Setter for _comment\n * @param {string} comment\n */\n set comment(comment: string) {\n if (this.initialized && this._readOnlyAfterInit) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n if (\n check2004ValidFormat(comment, scorm2004_regex.CMILangString4000, true)\n ) {\n this._comment = comment;\n }\n }\n }\n\n /**\n * Getter for _location\n * @return {string}\n */\n get location(): string {\n return this._location;\n }\n\n /**\n * Setter for _location\n * @param {string} location\n */\n set location(location: string) {\n if (this.initialized && this._readOnlyAfterInit) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n if (check2004ValidFormat(location, scorm2004_regex.CMIString250)) {\n this._location = location;\n }\n }\n }\n\n /**\n * Getter for _timestamp\n * @return {string}\n */\n get timestamp(): string {\n return this._timestamp;\n }\n\n /**\n * Setter for _timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp: string) {\n if (this.initialized && this._readOnlyAfterInit) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {\n this._timestamp = timestamp;\n }\n }\n }\n\n /**\n * toJSON for cmi.comments_from_learner.n object\n * @return {\n * {\n * comment: string,\n * location: string,\n * timestamp: string\n * }\n * }\n */\n toJSON(): {\n comment: string;\n location: string;\n timestamp: string;\n } {\n this.jsonString = true;\n const result = {\n comment: this.comment,\n location: this.location,\n timestamp: this.timestamp,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import { CMIArray } from \"../common/array\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { Scorm2004CMIScore } from \"./score\";\nimport { check2004ValidFormat, check2004ValidRange } from \"./validation\";\nimport { scorm2004_regex } from \"../../constants/regex\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\n\n/**\n * Class representing SCORM 2004's `cmi.objectives` object\n * @extends CMIArray\n */\nexport class CMIObjectives extends CMIArray {\n /**\n * Constructor for `cmi.objectives` Array\n */\n constructor() {\n super({\n children: scorm2004_constants.objectives_children,\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n\n /**\n * Find an objective by its ID\n */\n public findObjectiveById(id: string): CMIObjectivesObject | undefined {\n return this.childArray.find((objective) => objective.id === id);\n }\n\n /**\n * Find objective by its index\n */\n public findObjectiveByIndex(index: number): CMIObjectivesObject {\n return this.childArray[index];\n }\n\n /**\n * Set an objective at the given index\n */\n public setObjectiveByIndex(index: number, objective: CMIObjectivesObject) {\n this.childArray[index] = objective;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.objectives.n object\n */\nexport class CMIObjectivesObject extends BaseCMI {\n private _id = \"\";\n private _success_status = \"unknown\";\n private _completion_status = \"unknown\";\n private _progress_measure = \"\";\n private _description = \"\";\n\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n this.score = new Scorm2004CMIScore();\n }\n\n override reset() {\n this._initialized = false;\n }\n\n public score: Scorm2004CMIScore;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n /**\n * Getter for _id\n * @return {string}\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * Getter for _success_status\n * @return {string}\n */\n get success_status(): string {\n return this._success_status;\n }\n\n /**\n * Setter for _success_status\n * @param {string} success_status\n */\n set success_status(success_status: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {\n this._success_status = success_status;\n }\n }\n }\n\n /**\n * Getter for _completion_status\n * @return {string}\n */\n get completion_status(): string {\n return this._completion_status;\n }\n\n /**\n * Setter for _completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {\n this._completion_status = completion_status;\n }\n }\n }\n\n /**\n * Getter for _progress_measure\n * @return {string}\n */\n get progress_measure(): string {\n return this._progress_measure;\n }\n\n /**\n * Setter for _progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (\n check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, scorm2004_regex.progress_range)\n ) {\n this._progress_measure = progress_measure;\n }\n }\n }\n\n /**\n * Getter for _description\n * @return {string}\n */\n get description(): string {\n return this._description;\n }\n\n /**\n * Setter for _description\n * @param {string} description\n */\n set description(description: string) {\n if (this.initialized && this._id === \"\") {\n throw new Scorm2004ValidationError(\n scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED,\n );\n } else {\n if (\n check2004ValidFormat(\n description,\n scorm2004_regex.CMILangString250,\n true,\n )\n ) {\n this._description = description;\n }\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n *\n * @return {\n * {\n * id: string,\n * success_status: string,\n * completion_status: string,\n * progress_measure: string,\n * description: string,\n * score: Scorm2004CMIScore\n * }\n * }\n */\n toJSON(): {\n id: string;\n success_status: string;\n completion_status: string;\n progress_measure: string;\n description: string;\n score: Scorm2004CMIScore;\n } {\n this.jsonString = true;\n const result = {\n id: this.id,\n success_status: this.success_status,\n completion_status: this.completion_status,\n progress_measure: this.progress_measure,\n description: this.description,\n score: this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import { scorm2004_constants } from \"../../constants/api_constants\";\nimport { scorm2004_regex } from \"../../constants/regex\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport * as Util from \"../../utilities\";\nimport { BaseRootCMI } from \"../common/base_cmi\";\nimport { check2004ValidFormat, check2004ValidRange } from \"./validation\";\nimport { CMILearnerPreference } from \"./learner_preference\";\nimport { CMIInteractions } from \"./interactions\";\nimport { Scorm2004CMIScore } from \"./score\";\nimport { CMICommentsFromLearner, CMICommentsFromLMS } from \"./comments\";\nimport { CMIObjectives } from \"./objectives\";\n\n/**\n * Class representing cmi object for SCORM 2004\n */\nexport class CMI extends BaseRootCMI {\n /**\n * Constructor for the SCORM 2004 cmi object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean = false) {\n super();\n this.learner_preference = new CMILearnerPreference();\n this.score = new Scorm2004CMIScore();\n this.comments_from_learner = new CMICommentsFromLearner();\n this.comments_from_lms = new CMICommentsFromLMS();\n this.interactions = new CMIInteractions();\n this.objectives = new CMIObjectives();\n if (initialized) this.initialize();\n }\n\n public learner_preference: CMILearnerPreference;\n public score: Scorm2004CMIScore;\n public comments_from_learner: CMICommentsFromLearner;\n public comments_from_lms: CMICommentsFromLMS;\n public interactions: CMIInteractions;\n public objectives: CMIObjectives;\n\n private __version = \"1.0\";\n private __children = scorm2004_constants.cmi_children;\n private _completion_status = \"unknown\";\n private _completion_threshold = \"\";\n private _credit = \"credit\";\n private _entry = \"\";\n private _exit = \"\";\n private _launch_data = \"\";\n private _learner_id = \"\";\n private _learner_name = \"\";\n private _location = \"\";\n private _max_time_allowed = \"\";\n private _mode = \"normal\";\n private _progress_measure = \"\";\n private _scaled_passing_score = \"\";\n private _session_time = \"PT0H0M0S\";\n private _success_status = \"unknown\";\n private _suspend_data = \"\";\n private _time_limit_action = \"continue,no message\";\n private _total_time = \"\";\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.learner_preference?.initialize();\n this.score?.initialize();\n this.comments_from_learner?.initialize();\n this.comments_from_lms?.initialize();\n this.interactions?.initialize();\n this.objectives?.initialize();\n }\n\n /**\n * Called when API is moving to another SCO\n */\n reset() {\n this._initialized = false;\n\n this._completion_status = \"incomplete\";\n this._exit = \"\";\n this._session_time = \"PT0H0M0S\";\n this._progress_measure = \"\";\n this._location = \"\";\n\n this.objectives?.reset(false);\n this.interactions?.reset(true);\n\n this.score?.reset();\n this.comments_from_learner?.reset();\n this.comments_from_lms?.reset();\n this.learner_preference?.reset();\n }\n\n /**\n * Getter for __version\n * @return {string}\n * @private\n */\n get _version(): string {\n return this.__version;\n }\n\n /**\n * Setter for __version. Just throws an error.\n * @param {string} _version\n * @private\n */\n set _version(_version: string) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n\n /**\n * Getter for __children\n * @return {string}\n * @private\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for __children. Just throws an error.\n * @param {number} _children\n * @private\n */\n set _children(_children: number) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n\n /**\n * Getter for _completion_status\n * @return {string}\n */\n get completion_status(): string {\n return this._completion_status;\n }\n\n /**\n * Setter for _completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status: string) {\n if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {\n this._completion_status = completion_status;\n }\n }\n\n /**\n * Getter for _completion_threshold\n * @return {string}\n */\n get completion_threshold(): string {\n return this._completion_threshold;\n }\n\n /**\n * Setter for _completion_threshold. Can only be called before initialization.\n * @param {string} completion_threshold\n */\n set completion_threshold(completion_threshold: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._completion_threshold = completion_threshold;\n }\n }\n\n /**\n * Setter for _credit\n * @return {string}\n */\n get credit(): string {\n return this._credit;\n }\n\n /**\n * Setter for _credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._credit = credit;\n }\n }\n\n /**\n * Getter for _entry\n * @return {string}\n */\n get entry(): string {\n return this._entry;\n }\n\n /**\n * Setter for _entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._entry = entry;\n }\n }\n\n /**\n * Getter for _exit. Should only be called during JSON export.\n * @return {string}\n */\n get exit(): string {\n if (!this.jsonString) {\n throw new Scorm2004ValidationError(scorm2004_errors.WRITE_ONLY_ELEMENT);\n }\n return this._exit;\n }\n\n /**\n * Getter for _exit\n * @param {string} exit\n */\n set exit(exit: string) {\n if (check2004ValidFormat(exit, scorm2004_regex.CMIExit, true)) {\n this._exit = exit;\n }\n }\n\n /**\n * Getter for _launch_data\n * @return {string}\n */\n get launch_data(): string {\n return this._launch_data;\n }\n\n /**\n * Setter for _launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._launch_data = launch_data;\n }\n }\n\n /**\n * Getter for _learner_id\n * @return {string}\n */\n get learner_id(): string {\n return this._learner_id;\n }\n\n /**\n * Setter for _learner_id. Can only be called before initialization.\n * @param {string} learner_id\n */\n set learner_id(learner_id: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._learner_id = learner_id;\n }\n }\n\n /**\n * Getter for _learner_name\n * @return {string}\n */\n get learner_name(): string {\n return this._learner_name;\n }\n\n /**\n * Setter for _learner_name. Can only be called before initialization.\n * @param {string} learner_name\n */\n set learner_name(learner_name: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._learner_name = learner_name;\n }\n }\n\n /**\n * Getter for _location\n * @return {string}\n */\n get location(): string {\n return this._location;\n }\n\n /**\n * Setter for _location\n * @param {string} location\n */\n set location(location: string) {\n if (check2004ValidFormat(location, scorm2004_regex.CMIString1000)) {\n this._location = location;\n }\n }\n\n /**\n * Getter for _max_time_allowed\n * @return {string}\n */\n get max_time_allowed(): string {\n return this._max_time_allowed;\n }\n\n /**\n * Setter for _max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._max_time_allowed = max_time_allowed;\n }\n }\n\n /**\n * Getter for _mode\n * @return {string}\n */\n get mode(): string {\n return this._mode;\n }\n\n /**\n * Setter for _mode. Can only be called before initialization.\n * @param {string} mode\n */\n set mode(mode: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._mode = mode;\n }\n }\n\n /**\n * Getter for _progress_measure\n * @return {string}\n */\n get progress_measure(): string {\n return this._progress_measure;\n }\n\n /**\n * Setter for _progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure: string) {\n if (\n check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, scorm2004_regex.progress_range)\n ) {\n this._progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for _scaled_passing_score\n * @return {string}\n */\n get scaled_passing_score(): string {\n return this._scaled_passing_score;\n }\n\n /**\n * Setter for _scaled_passing_score. Can only be called before initialization.\n * @param {string} scaled_passing_score\n */\n set scaled_passing_score(scaled_passing_score: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._scaled_passing_score = scaled_passing_score;\n }\n }\n\n /**\n * Getter for _session_time. Should only be called during JSON export.\n * @return {string}\n */\n get session_time(): string {\n if (!this.jsonString) {\n throw new Scorm2004ValidationError(scorm2004_errors.WRITE_ONLY_ELEMENT);\n }\n return this._session_time;\n }\n\n /**\n * Setter for _session_time\n * @param {string} session_time\n */\n set session_time(session_time: string) {\n if (check2004ValidFormat(session_time, scorm2004_regex.CMITimespan)) {\n this._session_time = session_time;\n }\n }\n\n /**\n * Getter for _success_status\n * @return {string}\n */\n get success_status(): string {\n return this._success_status;\n }\n\n /**\n * Setter for _success_status\n * @param {string} success_status\n */\n set success_status(success_status: string) {\n if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {\n this._success_status = success_status;\n }\n }\n\n /**\n * Getter for _suspend_data\n * @return {string}\n */\n get suspend_data(): string {\n return this._suspend_data;\n }\n\n /**\n * Setter for _suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data: string) {\n if (\n check2004ValidFormat(suspend_data, scorm2004_regex.CMIString64000, true)\n ) {\n this._suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for _time_limit_action\n * @return {string}\n */\n get time_limit_action(): string {\n return this._time_limit_action;\n }\n\n /**\n * Setter for _time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._time_limit_action = time_limit_action;\n }\n }\n\n /**\n * Getter for _total_time\n * @return {string}\n */\n get total_time(): string {\n return this._total_time;\n }\n\n /**\n * Setter for _total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n } else {\n this._total_time = total_time;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string} ISO8601 Duration\n */\n getCurrentTotalTime(): string {\n let sessionTime = this._session_time;\n const startTime = this.start_time;\n\n if (typeof startTime !== \"undefined\" && startTime !== null) {\n const seconds = new Date().getTime() - startTime;\n sessionTime = Util.getSecondsAsISODuration(seconds / 1000);\n }\n\n return Util.addTwoDurations(\n this._total_time,\n sessionTime,\n scorm2004_regex.CMITimespan,\n );\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * comments_from_learner: CMICommentsFromLearner,\n * comments_from_lms: CMICommentsFromLMS,\n * completion_status: string,\n * completion_threshold: string,\n * credit: string,\n * entry: string,\n * exit: string,\n * interactions: CMIInteractions,\n * launch_data: string,\n * learner_id: string,\n * learner_name: string,\n * learner_preference: CMILearnerPreference,\n * location: string,\n * max_time_allowed: string,\n * mode: string,\n * objectives: CMIObjectives,\n * progress_measure: string,\n * scaled_passing_score: string,\n * score: Scorm2004CMIScore,\n * session_time: string,\n * success_status: string,\n * suspend_data: string,\n * time_limit_action: string\n * }\n * }\n */\n toJSON(): {\n comments_from_learner: CMICommentsFromLearner;\n comments_from_lms: CMICommentsFromLMS;\n completion_status: string;\n completion_threshold: string;\n credit: string;\n entry: string;\n exit: string;\n interactions: CMIInteractions;\n launch_data: string;\n learner_id: string;\n learner_name: string;\n learner_preference: CMILearnerPreference;\n location: string;\n max_time_allowed: string;\n mode: string;\n objectives: CMIObjectives;\n progress_measure: string;\n scaled_passing_score: string;\n score: Scorm2004CMIScore;\n session_time: string;\n success_status: string;\n suspend_data: string;\n time_limit_action: string;\n } {\n this.jsonString = true;\n const result = {\n comments_from_learner: this.comments_from_learner,\n comments_from_lms: this.comments_from_lms,\n completion_status: this.completion_status,\n completion_threshold: this.completion_threshold,\n credit: this.credit,\n entry: this.entry,\n exit: this.exit,\n interactions: this.interactions,\n launch_data: this.launch_data,\n learner_id: this.learner_id,\n learner_name: this.learner_name,\n learner_preference: this.learner_preference,\n location: this.location,\n max_time_allowed: this.max_time_allowed,\n mode: this.mode,\n objectives: this.objectives,\n progress_measure: this.progress_measure,\n scaled_passing_score: this.scaled_passing_score,\n score: this.score,\n session_time: this.session_time,\n success_status: this.success_status,\n suspend_data: this.suspend_data,\n time_limit_action: this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n","const ValidLanguages: string[] = [\n \"aa\",\n \"ab\",\n \"ae\",\n \"af\",\n \"ak\",\n \"am\",\n \"an\",\n \"ar\",\n \"as\",\n \"av\",\n \"ay\",\n \"az\",\n \"ba\",\n \"be\",\n \"bg\",\n \"bh\",\n \"bi\",\n \"bm\",\n \"bn\",\n \"bo\",\n \"br\",\n \"bs\",\n \"ca\",\n \"ce\",\n \"ch\",\n \"co\",\n \"cr\",\n \"cs\",\n \"cu\",\n \"cv\",\n \"cy\",\n \"da\",\n \"de\",\n \"dv\",\n \"dz\",\n \"ee\",\n \"el\",\n \"en\",\n \"eo\",\n \"es\",\n \"et\",\n \"eu\",\n \"fa\",\n \"ff\",\n \"fi\",\n \"fj\",\n \"fo\",\n \"fr\",\n \"fy\",\n \"ga\",\n \"gd\",\n \"gl\",\n \"gn\",\n \"gu\",\n \"gv\",\n \"ha\",\n \"he\",\n \"hi\",\n \"ho\",\n \"hr\",\n \"ht\",\n \"hu\",\n \"hy\",\n \"hz\",\n \"ia\",\n \"id\",\n \"ie\",\n \"ig\",\n \"ii\",\n \"ik\",\n \"io\",\n \"is\",\n \"it\",\n \"iu\",\n \"ja\",\n \"jv\",\n \"ka\",\n \"kg\",\n \"ki\",\n \"kj\",\n \"kk\",\n \"kl\",\n \"km\",\n \"kn\",\n \"ko\",\n \"kr\",\n \"ks\",\n \"ku\",\n \"kv\",\n \"kw\",\n \"ky\",\n \"la\",\n \"lb\",\n \"lg\",\n \"li\",\n \"ln\",\n \"lo\",\n \"lt\",\n \"lu\",\n \"lv\",\n \"mg\",\n \"mh\",\n \"mi\",\n \"mk\",\n \"ml\",\n \"mn\",\n \"mo\",\n \"mr\",\n \"ms\",\n \"mt\",\n \"my\",\n \"na\",\n \"nb\",\n \"nd\",\n \"ne\",\n \"ng\",\n \"nl\",\n \"nn\",\n \"no\",\n \"nr\",\n \"nv\",\n \"ny\",\n \"oc\",\n \"oj\",\n \"om\",\n \"or\",\n \"os\",\n \"pa\",\n \"pi\",\n \"pl\",\n \"ps\",\n \"pt\",\n \"qu\",\n \"rm\",\n \"rn\",\n \"ro\",\n \"ru\",\n \"rw\",\n \"sa\",\n \"sc\",\n \"sd\",\n \"se\",\n \"sg\",\n \"sh\",\n \"si\",\n \"sk\",\n \"sl\",\n \"sm\",\n \"sn\",\n \"so\",\n \"sq\",\n \"sr\",\n \"ss\",\n \"st\",\n \"su\",\n \"sv\",\n \"sw\",\n \"ta\",\n \"te\",\n \"tg\",\n \"th\",\n \"ti\",\n \"tk\",\n \"tl\",\n \"tn\",\n \"to\",\n \"tr\",\n \"ts\",\n \"tt\",\n \"tw\",\n \"ty\",\n \"ug\",\n \"uk\",\n \"ur\",\n \"uz\",\n \"ve\",\n \"vi\",\n \"vo\",\n \"wa\",\n \"wo\",\n \"xh\",\n \"yi\",\n \"yo\",\n \"za\",\n \"zh\",\n \"zu\",\n \"aar\",\n \"abk\",\n \"ave\",\n \"afr\",\n \"aka\",\n \"amh\",\n \"arg\",\n \"ara\",\n \"asm\",\n \"ava\",\n \"aym\",\n \"aze\",\n \"bak\",\n \"bel\",\n \"bul\",\n \"bih\",\n \"bis\",\n \"bam\",\n \"ben\",\n \"tib\",\n \"bod\",\n \"bre\",\n \"bos\",\n \"cat\",\n \"che\",\n \"cha\",\n \"cos\",\n \"cre\",\n \"cze\",\n \"ces\",\n \"chu\",\n \"chv\",\n \"wel\",\n \"cym\",\n \"dan\",\n \"ger\",\n \"deu\",\n \"div\",\n \"dzo\",\n \"ewe\",\n \"gre\",\n \"ell\",\n \"eng\",\n \"epo\",\n \"spa\",\n \"est\",\n \"baq\",\n \"eus\",\n \"per\",\n \"fas\",\n \"ful\",\n \"fin\",\n \"fij\",\n \"fao\",\n \"fre\",\n \"fra\",\n \"fry\",\n \"gle\",\n \"gla\",\n \"glg\",\n \"grn\",\n \"guj\",\n \"glv\",\n \"hau\",\n \"heb\",\n \"hin\",\n \"hmo\",\n \"hrv\",\n \"hat\",\n \"hun\",\n \"arm\",\n \"hye\",\n \"her\",\n \"ina\",\n \"ind\",\n \"ile\",\n \"ibo\",\n \"iii\",\n \"ipk\",\n \"ido\",\n \"ice\",\n \"isl\",\n \"ita\",\n \"iku\",\n \"jpn\",\n \"jav\",\n \"geo\",\n \"kat\",\n \"kon\",\n \"kik\",\n \"kua\",\n \"kaz\",\n \"kal\",\n \"khm\",\n \"kan\",\n \"kor\",\n \"kau\",\n \"kas\",\n \"kur\",\n \"kom\",\n \"cor\",\n \"kir\",\n \"lat\",\n \"ltz\",\n \"lug\",\n \"lim\",\n \"lin\",\n \"lao\",\n \"lit\",\n \"lub\",\n \"lav\",\n \"mlg\",\n \"mah\",\n \"mao\",\n \"mri\",\n \"mac\",\n \"mkd\",\n \"mal\",\n \"mon\",\n \"mol\",\n \"mar\",\n \"may\",\n \"msa\",\n \"mlt\",\n \"bur\",\n \"mya\",\n \"nau\",\n \"nob\",\n \"nde\",\n \"nep\",\n \"ndo\",\n \"dut\",\n \"nld\",\n \"nno\",\n \"nor\",\n \"nbl\",\n \"nav\",\n \"nya\",\n \"oci\",\n \"oji\",\n \"orm\",\n \"ori\",\n \"oss\",\n \"pan\",\n \"pli\",\n \"pol\",\n \"pus\",\n \"por\",\n \"que\",\n \"roh\",\n \"run\",\n \"rum\",\n \"ron\",\n \"rus\",\n \"kin\",\n \"san\",\n \"srd\",\n \"snd\",\n \"sme\",\n \"sag\",\n \"slo\",\n \"sin\",\n \"slk\",\n \"slv\",\n \"smo\",\n \"sna\",\n \"som\",\n \"alb\",\n \"sqi\",\n \"srp\",\n \"ssw\",\n \"sot\",\n \"sun\",\n \"swe\",\n \"swa\",\n \"tam\",\n \"tel\",\n \"tgk\",\n \"tha\",\n \"tir\",\n \"tuk\",\n \"tgl\",\n \"tsn\",\n \"ton\",\n \"tur\",\n \"tso\",\n \"tat\",\n \"twi\",\n \"tah\",\n \"uig\",\n \"ukr\",\n \"urd\",\n \"uzb\",\n \"ven\",\n \"vie\",\n \"vol\",\n \"wln\",\n \"wol\",\n \"xho\",\n \"yid\",\n \"yor\",\n \"zha\",\n \"chi\",\n \"zho\",\n \"zul\",\n];\nexport default ValidLanguages;\n","import { BaseCMI } from \"../common/base_cmi\";\nimport { Scorm2004ValidationError } from \"../../exceptions/scorm2004_exceptions\";\nimport { check2004ValidFormat } from \"./validation\";\nimport { scorm2004_regex } from \"../../constants/regex\";\nimport { NAVBoolean } from \"../../constants/enums\";\nimport { CMIArray } from \"../common/array\";\nimport { scorm2004_constants } from \"../../constants/api_constants\";\nimport { scorm2004_errors } from \"../../constants/error_codes\";\n\n/**\n * Class representing SCORM 2004's adl object\n */\nexport class ADL extends BaseCMI {\n /**\n * Constructor for adl\n */\n constructor() {\n super();\n this.nav = new ADLNav();\n this.data = new ADLData();\n }\n\n public nav: ADLNav;\n public data = new ADLData();\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.nav?.initialize();\n }\n\n /**\n * Called when the API needs to be reset\n */\n reset() {\n this._initialized = false;\n this.nav?.reset();\n }\n\n /**\n * toJSON for adl\n * @return {\n * {\n * nav: ADLNav,\n * data: ADLData\n * }\n * }\n */\n toJSON(): {\n nav: ADLNav;\n data: ADLData;\n } {\n this.jsonString = true;\n const result = {\n nav: this.nav,\n data: this.data,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's `adl.nav` object\n */\n\nexport class ADLNav extends BaseCMI {\n private _request = \"_none_\";\n\n /**\n * Constructor for `adl.nav`\n */\n constructor() {\n super();\n this.request_valid = new ADLNavRequestValid();\n }\n\n public request_valid: ADLNavRequestValid;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.request_valid?.initialize();\n }\n\n /**\n * Called when the API needs to be reset\n */\n reset() {\n this._initialized = false;\n this._request = \"_none_\";\n this.request_valid?.reset();\n }\n\n /**\n * Getter for _request\n * @return {string}\n */\n get request(): string {\n return this._request;\n }\n\n /**\n * Setter for _request\n * @param {string} request\n */\n set request(request: string) {\n if (check2004ValidFormat(request, scorm2004_regex.NAVEvent)) {\n this._request = request;\n }\n }\n\n /**\n * toJSON for adl.nav\n *\n * @return {\n * {\n * request: string\n * }\n * }\n */\n toJSON(): {\n request: string;\n } {\n this.jsonString = true;\n const result = {\n request: this.request,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's `adl.data` object\n */\nexport class ADLData extends CMIArray {\n constructor() {\n super({\n children: scorm2004_constants.adl_data_children,\n errorCode: scorm2004_errors.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class for SCORM 2004's adl.data.n object\n */\nexport class ADLDataObject extends BaseCMI {\n private _id = \"\";\n private _store = \"\";\n\n constructor() {\n super();\n }\n\n /**\n * Called when the API has been reset\n */\n reset() {\n this._initialized = false;\n }\n\n /**\n * Getter for _id\n * @return {string}\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * Getter for _store\n * @return {string}\n */\n get store(): string {\n return this._store;\n }\n\n /**\n * Setter for _store\n * @param {string} store\n */\n set store(store: string) {\n if (check2004ValidFormat(store, scorm2004_regex.CMILangString4000)) {\n this._store = store;\n }\n }\n\n /**\n * toJSON for adl.data.n\n *\n * @return {\n * {\n * id: string,\n * store: string\n * }\n * }\n */\n toJSON(): {\n id: string;\n store: string;\n } {\n this.jsonString = true;\n const result = {\n id: this._id,\n store: this._store,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav.request_valid object\n */\n\nexport class ADLNavRequestValid extends BaseCMI {\n private _continue = \"unknown\";\n private _previous = \"unknown\";\n private _choice: {\n [key: string]: NAVBoolean;\n } = {};\n private _jump: {\n [key: string]: NAVBoolean;\n } = {};\n\n /**\n * Constructor for adl.nav.request_valid\n */\n constructor() {\n super();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset() {\n this._initialized = false;\n this._continue = \"unknown\";\n this._previous = \"unknown\";\n }\n\n /**\n * Getter for _continue\n * @return {string}\n */\n get continue(): string {\n return this._continue;\n }\n\n /**\n * Setter for _continue. Just throws an error.\n * @param {string} _continue\n */\n set continue(_continue: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n if (check2004ValidFormat(_continue, scorm2004_regex.NAVBoolean)) {\n this._continue = _continue;\n }\n }\n\n /**\n * Getter for _previous\n * @return {string}\n */\n get previous(): string {\n return this._previous;\n }\n\n /**\n * Setter for _previous. Just throws an error.\n * @param {string} _previous\n */\n set previous(_previous: string) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n if (check2004ValidFormat(_previous, scorm2004_regex.NAVBoolean)) {\n this._previous = _previous;\n }\n }\n\n /**\n * Getter for _choice\n * @return {{ [key: string]: NAVBoolean }}\n */\n get choice(): { [key: string]: NAVBoolean } {\n return this._choice;\n }\n\n /**\n * Setter for _choice\n * @param {{ [key: string]: string }} choice\n */\n set choice(choice: { [key: string]: string }) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n if (typeof choice !== \"object\") {\n throw new Scorm2004ValidationError(scorm2004_errors.TYPE_MISMATCH);\n }\n for (const key in choice) {\n if ({}.hasOwnProperty.call(choice, key)) {\n if (\n check2004ValidFormat(choice[key], scorm2004_regex.NAVBoolean) &&\n check2004ValidFormat(key, scorm2004_regex.NAVTarget)\n ) {\n this._choice[key] =\n NAVBoolean[choice[key] as keyof typeof NAVBoolean];\n }\n }\n }\n }\n\n /**\n * Getter for _jump\n * @return {{ [key: string]: NAVBoolean }}\n */\n get jump(): { [key: string]: NAVBoolean } {\n return this._jump;\n }\n\n /**\n * Setter for _jump\n * @param {{ [key: string]: string }} jump\n */\n set jump(jump: { [key: string]: string }) {\n if (this.initialized) {\n throw new Scorm2004ValidationError(scorm2004_errors.READ_ONLY_ELEMENT);\n }\n if (typeof jump !== \"object\") {\n throw new Scorm2004ValidationError(scorm2004_errors.TYPE_MISMATCH);\n }\n for (const key in jump) {\n if ({}.hasOwnProperty.call(jump, key)) {\n if (\n check2004ValidFormat(jump[key], scorm2004_regex.NAVBoolean) &&\n check2004ValidFormat(key, scorm2004_regex.NAVTarget)\n ) {\n this._jump[key] = NAVBoolean[jump[key] as keyof typeof NAVBoolean];\n }\n }\n }\n }\n\n /**\n * toJSON for adl.nav.request_valid\n *\n * @return {\n * {\n * previous: string,\n * continue: string\n * }\n * }\n */\n toJSON(): {\n previous: string;\n continue: string;\n } {\n this.jsonString = true;\n const result = {\n previous: this._previous,\n continue: this._continue,\n choice: this._choice,\n jump: this._jump,\n };\n delete this.jsonString;\n return result;\n }\n}\n","import BaseAPI from \"./BaseAPI\";\nimport { CMI } from \"./cmi/scorm2004/cmi\";\nimport * as Utilities from \"./utilities\";\nimport { stringMatches } from \"./utilities\";\nimport { global_constants, scorm2004_constants } from \"./constants/api_constants\";\nimport { scorm2004_errors } from \"./constants/error_codes\";\nimport { CorrectResponses, ResponseType } from \"./constants/response_constants\";\nimport ValidLanguages from \"./constants/language_constants\";\nimport { CMIArray } from \"./cmi/common/array\";\nimport { BaseCMI } from \"./cmi/common/base_cmi\";\nimport {\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject\n} from \"./cmi/scorm2004/interactions\";\nimport { CMICommentsObject } from \"./cmi/scorm2004/comments\";\nimport { CMIObjectivesObject } from \"./cmi/scorm2004/objectives\";\nimport { ADL, ADLDataObject } from \"./cmi/scorm2004/adl\";\nimport { CommitObject, RefObject, ResultObject, ScoreObject, Settings } from \"./types/api_types\";\nimport { CompletionStatus, SuccessStatus } from \"./constants/enums\";\nimport { scorm2004_regex } from \"./constants/regex\";\n\n/**\n * API class for SCORM 2004\n */\nclass Scorm2004Impl extends BaseAPI {\n private _version: string = \"1.0\";\n private _globalObjectives: CMIObjectivesObject[] = [];\n\n /**\n * Constructor for SCORM 2004 API\n * @param {Settings} settings\n */\n constructor(settings?: Settings) {\n if (settings) {\n if (settings.mastery_override === undefined) {\n settings.mastery_override = false;\n }\n }\n\n super(scorm2004_errors, settings);\n\n this.cmi = new CMI();\n this.adl = new ADL();\n\n // Rename functions to match 2004 Spec and expose to modules\n this.Initialize = this.lmsInitialize;\n this.Terminate = this.lmsFinish;\n this.GetValue = this.lmsGetValue;\n this.SetValue = this.lmsSetValue;\n this.Commit = this.lmsCommit;\n this.GetLastError = this.lmsGetLastError;\n this.GetErrorString = this.lmsGetErrorString;\n this.GetDiagnostic = this.lmsGetDiagnostic;\n }\n\n public cmi: CMI;\n public adl: ADL;\n\n public Initialize: () => string;\n public Terminate: () => string;\n public GetValue: (CMIElement: string) => string;\n public SetValue: (CMIElement: string, value: any) => string;\n public Commit: () => string;\n public GetLastError: () => string;\n public GetErrorString: (CMIErrorCode: string | number) => string;\n public GetDiagnostic: (CMIErrorCode: string | number) => string;\n\n /**\n * Called when the API needs to be reset\n */\n reset(settings?: Settings) {\n this.commonReset(settings);\n\n this.cmi?.reset();\n this.adl?.reset();\n }\n\n /**\n * Getter for _version\n * @return {string}\n */\n get version(): string {\n return this._version;\n }\n\n /**\n * Getter for _globalObjectives\n */\n get globalObjectives(): CMIObjectivesObject[] {\n return this._globalObjectives;\n }\n\n /**\n * @return {string} bool\n */\n lmsInitialize(): string {\n this.cmi.initialize();\n return this.initialize(\"Initialize\");\n }\n\n /**\n * @return {string} bool\n */\n lmsFinish(): string {\n (async () => {\n await this.internalFinish();\n })();\n return global_constants.SCORM_TRUE;\n }\n\n async internalFinish(): Promise<string> {\n const result = await this.terminate(\"Terminate\", true);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.adl.nav.request !== \"_none_\") {\n const navActions: { [key: string]: string } = {\n continue: \"SequenceNext\",\n previous: \"SequencePrevious\",\n choice: \"SequenceChoice\",\n jump: \"SequenceJump\",\n exit: \"SequenceExit\",\n exitAll: \"SequenceExitAll\",\n abandon: \"SequenceAbandon\",\n abandonAll: \"SequenceAbandonAll\",\n };\n\n let request = this.adl.nav.request;\n const choiceJumpRegex = new RegExp(scorm2004_regex.NAVEvent);\n const matches = request.match(choiceJumpRegex);\n let target = \"\";\n if (matches) {\n if (matches.groups?.choice_target) {\n target = matches.groups?.choice_target;\n request = \"choice\";\n } else if (matches.groups?.jump_target) {\n target = matches.groups?.jump_target;\n request = \"jump\";\n }\n }\n const action = navActions[request];\n if (action) {\n this.processListeners(action, \"adl.nav.request\", target);\n }\n } else if (this.settings.autoProgress) {\n this.processListeners(\"SequenceNext\");\n }\n }\n\n return result;\n }\n\n /**\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement: string): string {\n const adlNavRequestRegex =\n \"^adl\\\\.nav\\\\.request_valid\\\\.(choice|jump)\\\\.{target=\\\\S{0,}([a-zA-Z0-9-_]+)}$\";\n if (stringMatches(CMIElement, adlNavRequestRegex)) {\n const matches = CMIElement.match(adlNavRequestRegex);\n if (matches) {\n const request = matches[1];\n const target = matches[2].replace(\"{target=\", \"\").replace(\"}\", \"\");\n if (request === \"choice\" || request === \"jump\") {\n if (this.settings.scoItemIdValidator) {\n return String(this.settings.scoItemIdValidator(target));\n }\n if (this.settings.scoItemIds) {\n return String(this.settings.scoItemIds?.includes(target));\n }\n return String(request);\n }\n }\n }\n return this.getValue(\"GetValue\", true, CMIElement);\n }\n\n /**\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n lmsSetValue(CMIElement: string, value: any): string {\n // Proceed with regular setting for non-objective elements or fallback behavior\n return this.setValue(\"SetValue\", \"Commit\", true, CMIElement, value);\n }\n\n /**\n * Orders LMS to store all content parameters\n *\n * @return {string} bool\n */\n lmsCommit(): string {\n if (this.settings.asyncCommit) {\n this.scheduleCommit(500, \"LMSCommit\");\n } else {\n (async () => {\n await this.commit(\"LMSCommit\", false);\n })();\n }\n return global_constants.SCORM_TRUE;\n }\n\n /**\n * Returns last error code\n *\n * @return {string}\n */\n lmsGetLastError(): string {\n return this.getLastError(\"GetLastError\");\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode: string | number): string {\n return this.getErrorString(\"GetErrorString\", CMIErrorCode);\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode: string | number): string {\n return this.getDiagnostic(\"GetDiagnostic\", CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n override setCMIValue(CMIElement: string, value: any): string {\n // Check if we're updating a global or local objective\n if (stringMatches(CMIElement, \"cmi\\\\.objectives\\\\.\\\\d+\")) {\n const parts = CMIElement.split(\".\");\n const index = Number(parts[2]);\n const element_base = `cmi.objectives.${index}`;\n\n let objective_id;\n const setting_id = stringMatches(\n CMIElement,\n \"cmi\\\\.objectives\\\\.\\\\d+\\\\.id\",\n );\n\n if (setting_id) {\n // If we're setting the objective ID, capture it directly\n objective_id = value;\n } else {\n // Find existing objective ID if available\n const objective = this.cmi.objectives.findObjectiveByIndex(index);\n objective_id = objective ? objective.id : undefined;\n }\n\n // Check if the objective ID matches a global objective\n const is_global =\n objective_id &&\n this.settings.globalObjectiveIds?.includes(objective_id);\n\n if (is_global) {\n // Locate or create an entry in _globalObjectives for the global objective\n let global_index = this._globalObjectives.findIndex(\n (obj) => obj.id === objective_id,\n );\n\n if (global_index === -1) {\n global_index = this._globalObjectives.length;\n const newGlobalObjective = new CMIObjectivesObject();\n newGlobalObjective.id = objective_id;\n this._globalObjectives.push(newGlobalObjective);\n }\n\n // Update the global objective\n const global_element = CMIElement.replace(\n element_base,\n `_globalObjectives.${global_index}`,\n );\n this._commonSetCMIValue(\n \"SetGlobalObjectiveValue\",\n true,\n global_element,\n value,\n );\n }\n }\n return this._commonSetCMIValue(\"SetValue\", true, CMIElement, value);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {BaseCMI|null}\n */\n getChildElement(\n CMIElement: string,\n value: any,\n foundFirstIndex: boolean,\n ): BaseCMI | null {\n if (stringMatches(CMIElement, \"cmi\\\\.objectives\\\\.\\\\d+\")) {\n return new CMIObjectivesObject();\n }\n\n if (foundFirstIndex) {\n if (\n stringMatches(\n CMIElement,\n \"cmi\\\\.interactions\\\\.\\\\d+\\\\.correct_responses\\\\.\\\\d+\",\n )\n ) {\n return this.createCorrectResponsesObject(CMIElement, value);\n } else if (\n stringMatches(\n CMIElement,\n \"cmi\\\\.interactions\\\\.\\\\d+\\\\.objectives\\\\.\\\\d+\",\n )\n ) {\n return new CMIInteractionsObjectivesObject();\n }\n } else if (stringMatches(CMIElement, \"cmi\\\\.interactions\\\\.\\\\d+\")) {\n return new CMIInteractionsObject();\n }\n\n if (stringMatches(CMIElement, \"cmi\\\\.comments_from_learner\\\\.\\\\d+\")) {\n return new CMICommentsObject();\n } else if (stringMatches(CMIElement, \"cmi\\\\.comments_from_lms\\\\.\\\\d+\")) {\n return new CMICommentsObject(true);\n }\n\n if (stringMatches(CMIElement, \"adl\\\\.data\\\\.\\\\d+\")) {\n return new ADLDataObject();\n }\n\n return null;\n }\n\n private createCorrectResponsesObject(\n CMIElement: string,\n value: any,\n ): BaseCMI | null {\n const parts = CMIElement.split(\".\");\n const index = Number(parts[2]);\n const interaction = this.cmi.interactions.childArray[index];\n\n if (this.isInitialized()) {\n if (!interaction.type) {\n this.throwSCORMError(scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n this.checkDuplicateChoiceResponse(interaction, value);\n const response_type = CorrectResponses[interaction.type];\n if (response_type) {\n this.checkValidResponseType(response_type, value, interaction.type);\n } else {\n this.throwSCORMError(\n scorm2004_errors.GENERAL_SET_FAILURE,\n \"Incorrect Response Type: \" + interaction.type,\n );\n }\n }\n }\n\n if (this.lastErrorCode === \"0\") {\n return new CMIInteractionsCorrectResponsesObject();\n }\n\n return null;\n }\n\n /**\n * Checks for valid response types\n * @param {object} response_type\n * @param {any} value\n * @param {string} interaction_type\n */\n checkValidResponseType(\n response_type: ResponseType,\n value: any,\n interaction_type: string,\n ) {\n let nodes = [];\n if (response_type?.delimiter) {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(\n scorm2004_errors.GENERAL_SET_FAILURE,\n \"Data Model Element Pattern Too Long\",\n );\n }\n }\n\n /**\n * Checks for duplicate 'choice' responses.\n * @param {CMIInteractionsObject} interaction\n * @param {any} value\n */\n checkDuplicateChoiceResponse(interaction: CMIInteractionsObject, value: any) {\n const interaction_count = interaction.correct_responses._count;\n if (interaction.type === \"choice\") {\n for (\n let i = 0;\n i < interaction_count && this.lastErrorCode === \"0\";\n i++\n ) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_errors.GENERAL_SET_FAILURE);\n }\n }\n }\n }\n\n /**\n * Validate correct response.\n * @param {string} CMIElement\n * @param {*} value\n */\n validateCorrectResponse(CMIElement: string, value: any) {\n const parts = CMIElement.split(\".\");\n const index = Number(parts[2]);\n const pattern_index = Number(parts[4]);\n const interaction = this.cmi.interactions.childArray[index];\n\n const interaction_count = interaction.correct_responses._count;\n this.checkDuplicateChoiceResponse(interaction, value);\n\n const response_type = CorrectResponses[interaction.type];\n if (\n typeof response_type.limit === \"undefined\" ||\n interaction_count <= response_type.limit\n ) {\n this.checkValidResponseType(response_type, value, interaction.type);\n\n if (\n (this.lastErrorCode === \"0\" &&\n (!response_type.duplicate ||\n !this.checkDuplicatedPattern(\n interaction.correct_responses,\n pattern_index,\n value,\n ))) ||\n (this.lastErrorCode === \"0\" && value === \"\")\n ) {\n // do nothing, we want the inverse\n } else {\n if (this.lastErrorCode === \"0\") {\n this.throwSCORMError(\n scorm2004_errors.GENERAL_SET_FAILURE,\n \"Data Model Element Pattern Already Exists\",\n );\n }\n }\n } else {\n this.throwSCORMError(\n scorm2004_errors.GENERAL_SET_FAILURE,\n \"Data Model Element Collection Limit Reached\",\n );\n }\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n override getCMIValue(CMIElement: string): any {\n return this._commonGetCMIValue(\"GetValue\", true, CMIElement);\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {(string|number)} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n override getLmsErrorMessageDetails(\n errorNumber: string | number,\n detail: boolean,\n ): string {\n let basicMessage = \"\";\n let detailMessage = \"\";\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (scorm2004_constants.error_descriptions[errorNumber]) {\n basicMessage =\n scorm2004_constants.error_descriptions[errorNumber].basicMessage;\n detailMessage =\n scorm2004_constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Check to see if a correct_response value has been duplicated\n * @param {CMIArray} correct_response\n * @param {number} current_index\n * @param {*} value\n * @return {boolean}\n */\n checkDuplicatedPattern(\n correct_response: CMIArray,\n current_index: number,\n value: any,\n ): boolean {\n let found = false;\n const count = correct_response._count;\n for (let i = 0; i < count && !found; i++) {\n if (i !== current_index && correct_response.childArray[i] === value) {\n found = true;\n }\n }\n return found;\n }\n\n /**\n * Checks for a valid correct_response value\n * @param {string} interaction_type\n * @param {Array} nodes\n * @param {*} value\n */\n checkCorrectResponseValue(\n interaction_type: string,\n nodes: Array<any>,\n value: any,\n ) {\n const response = CorrectResponses[interaction_type];\n const formatRegex = new RegExp(response.format);\n for (let i = 0; i < nodes.length && this.lastErrorCode === \"0\"; i++) {\n if (\n interaction_type.match(\n \"^(fill-in|long-fill-in|matching|performance|sequencing)$\",\n )\n ) {\n nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);\n }\n\n if (response?.delimiter2) {\n const values = nodes[i].split(response.delimiter2);\n if (values.length === 2) {\n const matches = values[0].match(formatRegex);\n if (!matches) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n } else {\n if (\n !response.format2 ||\n !values[1].match(new RegExp(response.format2))\n ) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n } else {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n } else {\n const matches = nodes[i].match(formatRegex);\n if (\n (!matches && value !== \"\") ||\n (!matches && interaction_type === \"true-false\")\n ) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n } else {\n if (interaction_type === \"numeric\" && nodes.length > 1) {\n if (Number(nodes[0]) > Number(nodes[1])) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n } else {\n if (nodes[i] !== \"\" && response.unique) {\n for (let j = 0; j < i && this.lastErrorCode === \"0\"; j++) {\n if (nodes[i] === nodes[j]) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Remove prefixes from correct_response\n * @param {string} node\n * @return {*}\n */\n removeCorrectResponsePrefixes(node: string): any {\n let seenOrder = false;\n let seenCase = false;\n let seenLang = false;\n\n const prefixRegex = new RegExp(\n \"^({(lang|case_matters|order_matters)=([^}]+)})\",\n );\n let matches = node.match(prefixRegex);\n let langMatches = null;\n while (matches) {\n switch (matches[2]) {\n case \"lang\":\n langMatches = node.match(scorm2004_regex.CMILangcr);\n if (langMatches) {\n const lang = langMatches[3];\n if (lang !== undefined && lang.length > 0) {\n if (!ValidLanguages.includes(lang.toLowerCase())) {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n }\n seenLang = true;\n break;\n case \"case_matters\":\n if (!seenLang && !seenOrder && !seenCase) {\n if (matches[3] !== \"true\" && matches[3] !== \"false\") {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n\n seenCase = true;\n break;\n case \"order_matters\":\n if (!seenCase && !seenLang && !seenOrder) {\n if (matches[3] !== \"true\" && matches[3] !== \"false\") {\n this.throwSCORMError(scorm2004_errors.TYPE_MISMATCH);\n }\n }\n\n seenOrder = true;\n break;\n }\n node = node.substring(matches[1].length);\n matches = node.match(prefixRegex);\n }\n\n return node;\n }\n\n /**\n * Replace the whole API with another\n * @param {Scorm2004Impl} newAPI\n */\n replaceWithAnotherScormAPI(newAPI: Scorm2004Impl) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.adl = newAPI.adl;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean): object | Array<any> {\n const cmiExport: RefObject = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened: RefObject = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case \"flattened\":\n return Utilities.flatten(cmiExport);\n case \"params\":\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case \"json\":\n default:\n return cmiExport;\n }\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * @param {boolean} terminateCommit\n * @return {CommitObject}\n */\n renderCommitObject(terminateCommit: boolean): CommitObject {\n const cmiExport = this.renderCommitCMI(terminateCommit);\n const totalTimeDuration = this.cmi.getCurrentTotalTime();\n const totalTimeSeconds = Utilities.getDurationAsSeconds(\n totalTimeDuration,\n scorm2004_regex.CMITimespan,\n );\n\n let completionStatus = CompletionStatus.unknown;\n let successStatus = SuccessStatus.unknown;\n if (this.cmi.completion_status) {\n if (this.cmi.completion_status === \"completed\") {\n completionStatus = CompletionStatus.completed;\n } else if (this.cmi.completion_status === \"incomplete\") {\n completionStatus = CompletionStatus.incomplete;\n }\n }\n if (this.cmi.success_status) {\n if (this.cmi.success_status === \"passed\") {\n successStatus = SuccessStatus.passed;\n } else if (this.cmi.success_status === \"failed\") {\n successStatus = SuccessStatus.failed;\n }\n }\n\n const score = this.cmi.score;\n const scoreObject: ScoreObject = {};\n if (score) {\n if (!Number.isNaN(Number.parseFloat(score.raw))) {\n scoreObject.raw = Number.parseFloat(score.raw);\n }\n if (!Number.isNaN(Number.parseFloat(score.min))) {\n scoreObject.min = Number.parseFloat(score.min);\n }\n if (!Number.isNaN(Number.parseFloat(score.max))) {\n scoreObject.max = Number.parseFloat(score.max);\n }\n if (!Number.isNaN(Number.parseFloat(score.scaled))) {\n scoreObject.scaled = Number.parseFloat(score.scaled);\n }\n }\n\n const commitObject: CommitObject = {\n completionStatus: completionStatus,\n successStatus: successStatus,\n totalTimeSeconds: totalTimeSeconds,\n runtimeData: cmiExport,\n };\n if (scoreObject) {\n commitObject.score = scoreObject;\n }\n return commitObject;\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {ResultObject}\n */\n async storeData(terminateCommit: boolean): Promise<ResultObject> {\n if (terminateCommit) {\n if (this.cmi.mode === \"normal\") {\n if (this.cmi.credit === \"credit\") {\n if (this.cmi.completion_threshold && this.cmi.progress_measure) {\n if (this.cmi.progress_measure >= this.cmi.completion_threshold) {\n this.cmi.completion_status = \"completed\";\n } else {\n this.cmi.completion_status = \"incomplete\";\n }\n }\n if (this.cmi.scaled_passing_score && this.cmi.score.scaled) {\n if (this.cmi.score.scaled >= this.cmi.scaled_passing_score) {\n this.cmi.success_status = \"passed\";\n } else {\n this.cmi.success_status = \"failed\";\n }\n }\n }\n }\n }\n\n let navRequest = false;\n if (\n this.adl.nav.request !== this.startingData?.adl?.nav?.request &&\n this.adl.nav.request !== \"_none_\"\n ) {\n navRequest = true;\n }\n\n const commitObject = this.getCommitObject(terminateCommit);\n if (typeof this.settings.lmsCommitUrl === \"string\") {\n const result = await this.processHttpRequest(\n this.settings.lmsCommitUrl,\n commitObject,\n terminateCommit,\n );\n\n // check if this is a sequencing call, and then call the necessary JS\n {\n if (\n navRequest &&\n result.navRequest !== undefined &&\n result.navRequest !== \"\"\n ) {\n Function(`\"use strict\";(() => { ${result.navRequest} })()`)();\n }\n }\n return result;\n } else {\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n }\n }\n}\n\nexport { Scorm2004Impl as Scorm2004API };\n"],"names":["DefaultSettings","autocommit","autocommitSeconds","asyncCommit","sendFullCommit","lmsCommitUrl","dataCommitFormat","commitRequestDataType","autoProgress","logLevel","LogLevelEnum","ERROR","selfReportSessionTime","alwaysSendTotalTime","renderCommonCommitFields","strict_errors","xhrHeaders","xhrWithCredentials","fetchMode","responseHandler","response","text","responseText","httpResult","JSON","parse","hasOwnProperty","call","result","errorCode","global_constants","SCORM_TRUE","status","SCORM_FALSE","requestHandler","commitObject","onLogMessage","messageLevel","logMessage","console","error","WARN","warn","INFO","info","DEBUG","debug","log","scoItemIds","scoItemIdValidator","globalObjectiveIds","API","when","callback","_cancelled","this","_API","_timeout","setTimeout","wrapper","bind","_callback","cancel","clearTimeout","commit","error_codes","settings","_settings","BaseAPI","TypeError","currentState","STATE_NOT_INITIALIZED","lastErrorCode","listenerArray","_error_codes","apiLogLevel","commonReset","apiLog","clearScheduledCommit","startingData","initialize","callbackName","initializeMessage","terminationMessage","returnValue","isInitialized","throwSCORMError","INITIALIZED","isTerminated","TERMINATED","cmi","setStartTime","STATE_INITIALIZED","processListeners","clearSCORMError","functionName","CMIElement","formatMessage","terminate","checkTerminated","checkState","TERMINATION_BEFORE_INIT","MULTIPLE_TERMINATION","STATE_TERMINATED","storeData","getValue","RETRIEVE_BEFORE_INIT","RETRIEVE_AFTER_TERM","getCMIValue","e","handleValueAccessException","undefined","setValue","commitCallback","value","String","STORE_BEFORE_INIT","STORE_AFTER_TERM","setCMIValue","scheduleCommit","COMMIT_BEFORE_INIT","COMMIT_AFTER_TERM","getLastError","getErrorString","CMIErrorCode","getLmsErrorMessageDetails","getDiagnostic","beforeInitError","afterTermError","isNotInitialized","_errorNumber","_detail","Error","_CMIElement","_value","_commonSetCMIValue","methodName","scorm2004","structure","split","refObject","foundFirstIndex","invalidErrorMessage","invalidErrorCode","UNDEFINED_DATA_MODEL","GENERAL","idx","length","attribute","substring","READ_ONLY_ELEMENT","_checkObjectHasProperty","stringMatches","validateCorrectResponse","CMIArray","index","parseInt","isNaN","item","childArray","newChild","getChildElement","initialized","push","_commonGetCMIValue","uninitializedErrorMessage","_isTargetValid","target","VALUE_NOT_INITIALIZED","CHILDREN_ERROR","COUNT_ERROR","on","listenerName","listenerFunctions","i","listenerSplit","replace","off","removeIndex","findIndex","obj","splice","clear","filter","CMIElementsMatch","listener","functionsMatch","listenerHasCMIElement","indexOf","errorNumber","message","success","loadFromFlattenedJSON","json","int_pattern","obj_pattern","Object","keys","map","key","sort","test","a","c","testPattern","forEach","element","loadFromJSON","unflatten","a_pattern","c_match","a_match","match","a_num","Number","c_num","currentCMIElement","constructor","renderCMIToJSONString","stringify","k","v","renderCMIToJSONObject","processHttpRequest","url","params","immediate","api","genericError","performFetch","then","transformResponse","process","ScheduledCommit","getOwnPropertyDescriptor","getPrototypeOf","ValidationError","getCommitObject","terminateCommit","shouldTerminateCommit","renderCommitObject","renderCommitCMI","includes","init","method","mode","body","Array","join","headers","keepalive","credentials","fetch","__children","children","_errorCode","scorm12_errors","_errorClass","errorClass","BaseScormValidationError","reset","wipe","_initialized","_children","_count","toJSON","jsonString","BaseCMI","_start_time","Date","getTime","_raw","_min","score_children","scorm12_constants","__score_range","score_range","scorm12_regex","_max","max","__invalid_error_code","INVALID_SET_VALUE","__invalid_type_code","invalidTypeCode","TYPE_MISMATCH","__invalid_range_code","invalidRangeCode","VALUE_OUT_OF_RANGE","__decimal_regex","decimalRegex","CMIDecimal","__error_class","raw","checkValidFormat","checkValidRange","min","regexPattern","allowEmptyString","formatRegex","RegExp","matches","rangePattern","ranges","cmi_children","core_children","comments_children","objectives_children","correct_responses_children","student_data_children","student_preference_children","interactions_children","error_descriptions","basicMessage","detailMessage","aicc_constants","student_demographics_children","tries_children","attempt_records_children","paths_children","scorm2004_constants","adl_data_children","NAVBoolean","SuccessStatus","CompletionStatus","global_errors","INITIALIZATION_FAILED","TERMINATION_FAILURE","ARGUMENT_ERROR","GENERAL_GET_FAILURE","GENERAL_SET_FAILURE","GENERAL_COMMIT_FAILURE","UNIMPLEMENTED_ELEMENT","WRITE_ONLY_ELEMENT","DEPENDENCY_NOT_ESTABLISHED","scorm2004_errors","MULTIPLE_TERMINATIONS","CMIString256","CMIString4096","CMITime","CMITimespan","CMIInteger","CMISInteger","CMIIdentifier","CMIFeedback","CMIIndex","CMIStatus","CMIStatus2","CMIExit","CMIType","CMIResult","NAVEvent","audio_range","speed_range","weighting_range","text_range","aicc_regex","scorm2004_regex","CMIString200","CMIString250","CMIString1000","CMIString4000","CMIString64000","CMILang","CMILangString250","CMILangcr","CMILangString250cr","CMILangString4000","CMIShortIdentifier","CMILongIdentifier","CMIIndexStore","CMICStatus","CMISStatus","NAVTarget","scaled_range","progress_range","toString","name","errorMessage","detailedMessage","_detailedMessage","_errorMessage","SECONDS_PER_SECOND","SECONDS_PER_MINUTE","SECONDS_PER_HOUR","SECONDS_PER_DAY","designations","D","H","M","S","getSecondsAsHHMMSS","totalSeconds","hours","Math","floor","dateObj","minutes","getUTCMinutes","seconds","getSeconds","ms","msStr","countDecimals","toFixed","getSecondsAsISODuration","duration","remainder","designationsKey","current_seconds","getTimeAsSeconds","timeString","timeRegex","parts","getDurationAsSeconds","durationRegex","exec","years","days","addTwoDurations","first","second","regex","addHHMMSSTimeStrings","flatten","data","recurse","cur","prop","isArray","l","isEmpty","p","m","num","messageString","fillChars","j","str","tester","extendStatics","d","b","setPrototypeOf","__proto__","prototype","__extends","__","create","__assign","assign","t","s","n","arguments","apply","__rest","getOwnPropertySymbols","propertyIsEnumerable","__decorate","decorators","desc","r","Reflect","decorate","defineProperty","__param","paramIndex","decorator","__esDecorate","ctor","descriptorIn","contextIn","initializers","extraInitializers","accept","f","_","kind","descriptor","done","context","access","addInitializer","get","set","unshift","__runInitializers","thisArg","useValue","__propKey","x","concat","__setFunctionName","prefix","description","configurable","__metadata","metadataKey","metadataValue","metadata","__awaiter","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","__generator","y","label","sent","trys","ops","g","Iterator","verb","Symbol","iterator","op","pop","__createBinding","o","k2","__esModule","writable","enumerable","__exportStar","__values","__read","ar","__spread","__spreadArrays","il","jl","__spreadArray","to","from","pack","slice","__await","__asyncGenerator","asyncIterator","q","AsyncIterator","resume","fulfill","settle","shift","__asyncDelegator","__asyncValues","__makeTemplateObject","cooked","__setModuleDefault","__importStar","mod","__importDefault","default","__classPrivateFieldGet","receiver","state","has","__classPrivateFieldSet","__classPrivateFieldIn","__addDisposableResource","env","async","dispose","inner","asyncDispose","stack","_SuppressedError","SuppressedError","suppressed","__disposeResources","fail","hasError","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","definition","toStringTag","check2004ValidFormat","Scorm2004ValidationError","check2004ValidRange","_audio_level","_language","_delivery_speed","_audio_captioning","audio_level","language","delivery_speed","audio_captioning","LearnerResponses","format","delimiter","unique","choice","matching","format2","delimiter2","performance","sequencing","likert","numeric","other","CorrectResponses","duplicate","limit","delimiter3","_id","_type","_timestamp","_weighting","_learner_response","_result","_latency","_description","objectives","correct_responses","id","type","timestamp","weighting","learner_response","nodes","response_type","values","latency","_pattern","pattern","_scaled","scaled","CMIScore","readOnlyAfterInit","_comment","_location","_readOnlyAfterInit","comment","location","findObjectiveById","find","objective","findObjectiveByIndex","setObjectiveByIndex","_success_status","_completion_status","_progress_measure","score","Scorm2004CMIScore","success_status","completion_status","progress_measure","__version","_completion_threshold","_credit","_entry","_exit","_launch_data","_learner_id","_learner_name","_max_time_allowed","_mode","_scaled_passing_score","_session_time","_suspend_data","_time_limit_action","_total_time","learner_preference","CMILearnerPreference","comments_from_learner","CMICommentsFromLearner","comments_from_lms","CMICommentsFromLMS","interactions","CMIInteractions","CMIObjectives","_version","completion_threshold","credit","entry","exit","launch_data","learner_id","learner_name","max_time_allowed","scaled_passing_score","session_time","suspend_data","time_limit_action","total_time","getCurrentTotalTime","sessionTime","startTime","start_time","BaseRootCMI","ADLData","nav","ADLNav","_request","request_valid","ADLNavRequestValid","request","_store","store","_continue","_previous","_choice","_jump","jump","previous","continue","mastery_override","_globalObjectives","CMI","adl","ADL","Initialize","lmsInitialize","Terminate","lmsFinish","GetValue","lmsGetValue","SetValue","lmsSetValue","Commit","lmsCommit","GetLastError","lmsGetLastError","GetErrorString","lmsGetErrorString","GetDiagnostic","lmsGetDiagnostic","internalFinish","navActions","exitAll","abandon","abandonAll","choiceJumpRegex","groups","choice_target","jump_target","action","adlNavRequestRegex","element_base","global_index","newGlobalObjective","CMIObjectivesObject","global_element","createCorrectResponsesObject","CMIInteractionsObjectivesObject","CMIInteractionsObject","CMICommentsObject","ADLDataObject","interaction","checkDuplicateChoiceResponse","checkValidResponseType","CMIInteractionsCorrectResponsesObject","interaction_type","checkCorrectResponseValue","interaction_count","pattern_index","checkDuplicatedPattern","detail","correct_response","current_index","found","count","removeCorrectResponsePrefixes","node","seenOrder","seenCase","seenLang","prefixRegex","langMatches","lang","toLowerCase","replaceWithAnotherScormAPI","newAPI","cmiExport","flattened","totalTimeDuration","totalTimeSeconds","completionStatus","unknown","successStatus","completed","incomplete","passed","failed","scoreObject","parseFloat","runtimeData","navRequest","Function"],"sourceRoot":""}