@pie-element/graphing 10.1.2-next.0 → 10.1.2-next.1

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 (188) hide show
  1. package/dist/author/configure.js +46 -46
  2. package/dist/author/correct-response.js +86 -87
  3. package/dist/author/graphing-config.js +60 -60
  4. package/dist/author/index.js +19 -19
  5. package/dist/author/utils.js +1 -1
  6. package/dist/browser/author/index.js +1280 -4426
  7. package/dist/browser/author/index.js.map +1 -1
  8. package/dist/browser/{container-Bg6U_CJ-.js → container-DaIvr1Vu.js} +13429 -14293
  9. package/dist/browser/container-DaIvr1Vu.js.map +1 -0
  10. package/dist/browser/controller/index.js +126 -153
  11. package/dist/browser/controller/index.js.map +1 -1
  12. package/dist/browser/delivery/index.js +26 -26
  13. package/dist/browser/delivery/index.js.map +1 -1
  14. package/dist/browser/dist-BrN2xZtM.js +547 -0
  15. package/dist/browser/dist-BrN2xZtM.js.map +1 -0
  16. package/dist/controller/index.d.ts +1 -1
  17. package/dist/controller/index.js +56 -58
  18. package/dist/controller/utils.d.ts +14 -14
  19. package/dist/controller/utils.js +1 -4
  20. package/dist/index.iife.js +105 -103
  21. package/dist/runtime-support.d.ts +12 -0
  22. package/dist/runtime-support.js +12 -0
  23. package/package.json +14 -10
  24. package/dist/browser/container-Bg6U_CJ-.js.map +0 -1
  25. package/dist/browser/dist-eInAO7us.js +0 -1468
  26. package/dist/browser/dist-eInAO7us.js.map +0 -1
  27. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_DataView.js +0 -6
  28. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_Hash.js +0 -16
  29. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_ListCache.js +0 -16
  30. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_Map.js +0 -6
  31. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_MapCache.js +0 -16
  32. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_Promise.js +0 -6
  33. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_Set.js +0 -6
  34. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_SetCache.js +0 -11
  35. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_Stack.js +0 -14
  36. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_Symbol.js +0 -5
  37. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_Uint8Array.js +0 -5
  38. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_WeakMap.js +0 -6
  39. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_apply.js +0 -12
  40. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_arrayEach.js +0 -7
  41. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_arrayFilter.js +0 -10
  42. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_arrayIncludes.js +0 -7
  43. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_arrayIncludesWith.js +0 -7
  44. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_arrayLikeKeys.js +0 -15
  45. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_arrayMap.js +0 -7
  46. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_arrayPush.js +0 -7
  47. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_arraySome.js +0 -7
  48. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_assignValue.js +0 -10
  49. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_assocIndexOf.js +0 -8
  50. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseAssign.js +0 -8
  51. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseAssignIn.js +0 -8
  52. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseAssignValue.js +0 -12
  53. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseClone.js +0 -57
  54. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseCreate.js +0 -14
  55. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseDifference.js +0 -23
  56. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseFindIndex.js +0 -7
  57. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseFlatten.js +0 -13
  58. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseGetAllKeys.js +0 -9
  59. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseGetTag.js +0 -10
  60. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIndexOf.js +0 -9
  61. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIntersection.js +0 -29
  62. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIsArguments.js +0 -9
  63. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIsEqual.js +0 -8
  64. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIsEqualDeep.js +0 -30
  65. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIsMap.js +0 -9
  66. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIsNaN.js +0 -6
  67. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIsNative.js +0 -11
  68. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIsSet.js +0 -9
  69. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIsTypedArray.js +0 -11
  70. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseKeys.js +0 -12
  71. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseKeysIn.js +0 -13
  72. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseRest.js +0 -9
  73. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseSet.js +0 -22
  74. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseSetToString.js +0 -14
  75. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseTimes.js +0 -7
  76. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseToString.js +0 -15
  77. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseUnary.js +0 -8
  78. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseUniq.js +0 -27
  79. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_cacheHas.js +0 -6
  80. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_castArrayLikeObject.js +0 -7
  81. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_castPath.js +0 -10
  82. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_cloneArrayBuffer.js +0 -8
  83. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_cloneBuffer.js +0 -10
  84. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_cloneDataView.js +0 -8
  85. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_cloneRegExp.js +0 -8
  86. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_cloneSymbol.js +0 -8
  87. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_cloneTypedArray.js +0 -8
  88. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_copyArray.js +0 -8
  89. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_copyObject.js +0 -14
  90. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_copySymbols.js +0 -8
  91. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_copySymbolsIn.js +0 -8
  92. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_coreJsData.js +0 -5
  93. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_createSet.js +0 -9
  94. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_defineProperty.js +0 -10
  95. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_equalArrays.js +0 -35
  96. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_equalByTag.js +0 -35
  97. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_equalObjects.js +0 -32
  98. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_freeGlobal.js +0 -4
  99. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getAllKeys.js +0 -9
  100. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getAllKeysIn.js +0 -9
  101. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getMapData.js +0 -8
  102. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getNative.js +0 -9
  103. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getPrototype.js +0 -5
  104. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getRawTag.js +0 -14
  105. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getSymbols.js +0 -10
  106. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getSymbolsIn.js +0 -11
  107. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getTag.js +0 -23
  108. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getValue.js +0 -6
  109. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_hashClear.js +0 -7
  110. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_hashDelete.js +0 -7
  111. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_hashGet.js +0 -13
  112. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_hashHas.js +0 -9
  113. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_hashSet.js +0 -9
  114. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_initCloneArray.js +0 -8
  115. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_initCloneByTag.js +0 -33
  116. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_initCloneObject.js +0 -9
  117. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_isFlattenable.js +0 -10
  118. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_isIndex.js +0 -8
  119. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_isKey.js +0 -11
  120. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_isKeyable.js +0 -7
  121. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_isMasked.js +0 -11
  122. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_isPrototype.js +0 -8
  123. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_listCacheClear.js +0 -6
  124. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_listCacheDelete.js +0 -9
  125. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_listCacheGet.js +0 -8
  126. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_listCacheHas.js +0 -7
  127. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_listCacheSet.js +0 -8
  128. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheClear.js +0 -13
  129. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheDelete.js +0 -8
  130. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheGet.js +0 -7
  131. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheHas.js +0 -7
  132. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheSet.js +0 -8
  133. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapToArray.js +0 -9
  134. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_memoizeCapped.js +0 -11
  135. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_nativeCreate.js +0 -5
  136. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_nativeKeys.js +0 -5
  137. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_nativeKeysIn.js +0 -8
  138. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_nodeUtil.js +0 -9
  139. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_objectToString.js +0 -7
  140. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_overArg.js +0 -8
  141. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_overRest.js +0 -13
  142. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_root.js +0 -5
  143. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_setCacheAdd.js +0 -7
  144. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_setCacheHas.js +0 -6
  145. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_setToArray.js +0 -9
  146. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_setToString.js +0 -6
  147. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_shortOut.js +0 -14
  148. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_stackClear.js +0 -7
  149. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_stackDelete.js +0 -7
  150. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_stackGet.js +0 -6
  151. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_stackHas.js +0 -6
  152. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_stackSet.js +0 -16
  153. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_strictIndexOf.js +0 -7
  154. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_stringToPath.js +0 -10
  155. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_toKey.js +0 -10
  156. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_toSource.js +0 -15
  157. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/cloneDeep.js +0 -8
  158. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/constant.js +0 -8
  159. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/differenceWith.js +0 -12
  160. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/eq.js +0 -6
  161. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/identity.js +0 -6
  162. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/intersection.js +0 -11
  163. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isArguments.js +0 -10
  164. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isArray.js +0 -4
  165. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isArrayLike.js +0 -8
  166. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isArrayLikeObject.js +0 -8
  167. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isBuffer.js +0 -6
  168. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isEmpty.js +0 -21
  169. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isEqual.js +0 -7
  170. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isFunction.js +0 -11
  171. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isLength.js +0 -7
  172. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isMap.js +0 -7
  173. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isObject.js +0 -7
  174. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isObjectLike.js +0 -6
  175. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isSet.js +0 -7
  176. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isSymbol.js +0 -9
  177. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isTypedArray.js +0 -7
  178. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/keys.js +0 -9
  179. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/keysIn.js +0 -9
  180. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/last.js +0 -7
  181. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/memoize.js +0 -16
  182. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/noop.js +0 -4
  183. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/set.js +0 -7
  184. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/stubArray.js +0 -6
  185. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/stubFalse.js +0 -6
  186. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/toString.js +0 -7
  187. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/uniq.js +0 -7
  188. package/dist/node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/uniqWith.js +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../../node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseDifference.js","../../../../../../node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/differenceWith.js","../../../../../../node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/uniqWith.js","../../../src/controller/defaults.ts","../../../src/controller/utils.ts","../../../../../shared/controller-utils/dist/index.js","../../../src/controller/index.ts"],"sourcesContent":["import SetCache from './_SetCache.js';\nimport arrayIncludes from './_arrayIncludes.js';\nimport arrayIncludesWith from './_arrayIncludesWith.js';\nimport arrayMap from './_arrayMap.js';\nimport baseUnary from './_baseUnary.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n}\n\nexport default baseDifference;\n","import baseDifference from './_baseDifference.js';\nimport baseFlatten from './_baseFlatten.js';\nimport baseRest from './_baseRest.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport last from './last.js';\n\n/**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */\nvar differenceWith = baseRest(function(array, values) {\n var comparator = last(values);\n if (isArrayLikeObject(comparator)) {\n comparator = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n : [];\n});\n\nexport default differenceWith;\n","import baseUniq from './_baseUniq.js';\n\n/**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\nfunction uniqWith(array, comparator) {\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n}\n\nexport default uniqWith;\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/graphing/controller/src/defaults.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\n// TODO: This is lifted from @pie-lib/graphing, however importing this will break a controller build because it has jsx source in that package.\nconst allTools = [\n 'circle',\n 'line',\n 'label',\n 'parabola',\n 'point',\n 'polygon',\n 'ray',\n 'segment',\n 'sine',\n 'vector',\n // 'absolute', // - not available as default\n // 'exponential', // - not available as default\n];\n\n/* model defaults */\nexport default {\n answers: {\n correctAnswer: {\n name: 'Correct Answer',\n marks: [],\n },\n },\n arrows: {\n left: true,\n right: true,\n up: true,\n down: true,\n },\n backgroundMarks: [],\n coordinatesOnHover: false,\n defaultGridConfiguration: 0,\n domain: {\n min: -5,\n max: 5,\n step: 1,\n labelStep: 1,\n axisLabel: 'x',\n },\n graph: { width: 500, height: 500 },\n includeAxes: true,\n labels: {},\n labelsEnabled: true,\n padding: true,\n prompt: '',\n promptEnabled: true,\n range: {\n min: -5,\n max: 5,\n step: 1,\n labelStep: 1,\n axisLabel: 'y',\n },\n rationale: '',\n rationaleEnabled: true,\n standardGrid: false,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n title: '',\n titleEnabled: true,\n toolbarTools: allTools,\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/graphing/controller/src/utils.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport { differenceWith, isEqual, uniq, uniqWith } from 'lodash-es';\nimport {\n getAmplitudeAndFreq,\n pointsToABC,\n pointsToAForAbsolute,\n pointsToABForExponential,\n} from '@pie-lib/graphing-utils';\n\nexport const equalPoint = (A, B) => {\n A = { ...A };\n B = { ...B };\n\n return isEqual(A.x, B.x) && isEqual(A.y, B.y);\n};\n\nexport const equalPointWithLabel = (A, B) => {\n // x1 = x2 & y1 = y2\n // A point is only correct if both its position AND its label match.\n // Labels are not scored independently; a point in the correct position\n // with the wrong label is considered incorrect as a whole.\n let equalLabel = true;\n\n A = { ...A };\n B = { ...B };\n\n if (A.label || B.label) {\n equalLabel = isEqual(A.label, B.label);\n }\n\n return isEqual(A.x, B.x) && isEqual(A.y, B.y) && equalLabel;\n};\n\nexport const equalSegment = (segment1, segment2) => {\n // A.from = B.from, A.to = B.to OR A.from = B.to, A.to = B.from\n // x1 = x3 & y1 = y3 & x2 = x4 & y2 = y4\n return (\n (isEqual(segment1.from, segment2.from) && isEqual(segment1.to, segment2.to)) ||\n (isEqual(segment1.to, segment2.from) && isEqual(segment1.from, segment2.to))\n );\n};\n\nexport const equalVector = (vector1, vector2) => {\n // A.from = B.from, A.to = B.to;\n // x1 = x3 & y1 = y3 & x2 = x4 & y2 = y4\n return isEqual(vector1.from, vector2.from) && isEqual(vector1.to, vector2.to);\n};\n\n// this function is implemented in configure as well\nexport const sortedAnswers = (answers) =>\n Object.keys(answers || {})\n .sort()\n .reduce((result, key) => {\n if (key !== 'correctAnswer') {\n result[key] = answers[key];\n }\n\n return result;\n }, {});\n\nconst returnLineEquationCoefficients = (line) => {\n line = { ...line, to: { ...line.to }, from: { ...line.from } };\n\n const xA = line.from.x;\n const yA = line.from.y;\n const xB = line.to.x;\n const yB = line.to.y;\n\n return {\n a: yB - yA,\n b: xA - xB,\n c: xB * yA - xA * yB,\n };\n};\n\nconst getSignificantDecimals = (number) => Math.round(number * 10000) / 10000;\n\nexport const equalLine = (line1, line2) => {\n // line equation: ax + by + c = 0\n // 2 lines are equal if a1/a2 = b1/b2 = c1/c2, where a, b, c are the coefficients in line equation\n\n // line equation knowing 2 points: (y - yA) / (yB - yA) = (x - xA) / (xB - xA)\n // extending this equation, we get: x * (yB - yA) + y * (xA - xB) + (xB * yA - xA * yB) = 0\n // where a = yB - yA; b = xA - xB; c = xB * yA - xA * yB\n\n const { a: a1, b: b1, c: c1 } = returnLineEquationCoefficients(line1);\n const { a: a2, b: b2, c: c2 } = returnLineEquationCoefficients(line2);\n\n const proportions = [];\n\n if (a2 !== 0) {\n proportions.push(getSignificantDecimals(a1 / a2));\n } else if (a1 !== a2) {\n return false;\n }\n\n if (b2 !== 0) {\n proportions.push(getSignificantDecimals(b1 / b2));\n } else if (b1 !== b2) {\n return false;\n }\n\n if (c2 !== 0) {\n proportions.push(getSignificantDecimals(c1 / c2));\n } else if (c1 !== c2) {\n return false;\n }\n\n return uniq(proportions).length === 1;\n\n // (y2 - y1)/(x2 - x1) = (y4 - y3)/(x4 - x3);\n // return ((Math.abs((line1.to.y - line1.from.y) / (line1.to.x - line1.from.x))) === (Math.abs((line2.to.y - line2.from.y) / (line2.to.x - line2.from.x))));\n};\n\nexport const equalRay = (ray1, ray2) => {\n ray1 = { ...ray1, to: { ...ray1.to }, from: { ...ray1.from } };\n ray2 = { ...ray2, to: { ...ray2.to }, from: { ...ray2.from } };\n\n // slope: m = (y2-y1)/(x2-x1)\n // slope & x1 = x3 & y1 = y3 & angle between (x1, y1) (x2, y2) is same as angle between (x3, y3) (x4, y4)\n const mRay1 = (ray1.to.y - ray1.from.y) / (ray1.to.x - ray1.from.x);\n const mRay2 = (ray2.to.y - ray2.from.y) / (ray2.to.x - ray2.from.x);\n const angleRay1 = (Math.atan2(ray1.to.y - ray1.from.y, ray1.to.x - ray1.from.x) * 180) / Math.PI;\n const angleRay2 = (Math.atan2(ray2.to.y - ray2.from.y, ray2.to.x - ray2.from.x) * 180) / Math.PI;\n\n return mRay1 === mRay2 && ray1.from.x === ray2.from.x && ray1.from.y === ray2.from.y && angleRay1 === angleRay2;\n};\n\nexport const constructSegmentsFromPoints = (points) => {\n // takes the list of points that represent a polygon and transforms it into a list of segments; eg.:\n // points: A, B, C, D => segments: AB, BC, CD, DA\n return (points || []).map((point, index) => ({ from: point, to: points[(index + 1) % points.length] }));\n};\n\nexport const removeDuplicateSegments = (segments) => {\n segments = segments || [];\n // removes segments that are duplicates; eg. These segments are the same, so one will be removed:\n // segment1: from: { x: 1, y: 1 }, to: { x: 2, y: 1 }\n // segment2: from: { x: 2, y: 1 }, to: { x: 1, y: 1 }\n return uniqWith(segments, (s1, s2) => equalSegment(s1, s2));\n};\n\nexport const removeInvalidSegments = (segments) => {\n segments = segments || [];\n // removes segments that start in a point and end in the same point (eg.: from: { x: 1, y: 1 }, to: { x: 1, y: 1 })\n\n return segments.filter((segment) => !isEqual(segment.from, segment.to));\n};\n\nexport const equalPolygon = (poly1, poly2) => {\n const { points: points1 } = poly1;\n const { points: points2 } = poly2;\n\n // generate segments\n const segments1 = constructSegmentsFromPoints(points1);\n const segments2 = constructSegmentsFromPoints(points2);\n\n const segments1NoDuplicates = removeDuplicateSegments(removeInvalidSegments(segments1));\n const segments2NoDuplicates = removeDuplicateSegments(removeInvalidSegments(segments2));\n\n const differentSegments1 = differenceWith(segments1NoDuplicates, segments2NoDuplicates, equalSegment);\n const differentSegments2 = differenceWith(segments2NoDuplicates, segments1NoDuplicates, equalSegment);\n\n return (!differentSegments1 || !differentSegments1.length) && (!differentSegments2 || !differentSegments2.length);\n};\n\nexport const equalCircle = (c1, c2) => {\n c1 = { ...c1, root: { ...c1.root }, edge: { ...c1.edge } };\n c2 = { ...c2, root: { ...c2.root }, edge: { ...c2.edge } };\n const equalRootAndEdge = isEqual(c2.edge, c1.edge) && isEqual(c2.root, c1.root);\n\n // if both edge and root are the same, it means the shapes are exactly the same\n if (equalRootAndEdge) return true;\n\n const rC1 = Math.sqrt((c1.edge.x - c1.root.x) ** 2 + (c1.edge.y - c1.root.y) ** 2);\n const rC2 = Math.sqrt((c2.edge.x - c2.root.x) ** 2 + (c2.edge.y - c2.root.y) ** 2);\n\n // if both root and radius are the same, it means the shapes are equal\n return isEqual(c2.root, c1.root) && isEqual(rC1, rC2);\n};\n\nexport const equalSine = (sine1, sine2) => {\n const getPoints = ({ root, edge }) => {\n root = { ...root };\n edge = { ...edge };\n\n const { amplitude, freq } = getAmplitudeAndFreq(root, edge);\n // the height of the sine wave\n const tY = Math.abs(root.y - edge.y) * 2;\n // the distance on x axis between edge and root\n const tXRoot = Math.abs(root.x - edge.x);\n // the distance on x axis between 2 edges for sine wave (min & max)\n const tX = tXRoot * 2;\n // the first edge placed east side of root\n let edgeAboveZeroX = edge.x;\n let edgeAboveZeroY = edge.y;\n\n // if edge less then 0, find out the appropriate edge placed east side of zero (0)\n while (edgeAboveZeroX < 0 && tX !== 0) {\n edgeAboveZeroX = edgeAboveZeroX + tX;\n edgeAboveZeroY = edgeAboveZeroY < root.y ? edgeAboveZeroY + tY : edgeAboveZeroY - tY;\n }\n\n // if edge more then 0, find out the appropriate edge placed east side of zero (0)\n while (edgeAboveZeroX - tX > 0 && tX !== 0) {\n edgeAboveZeroX = edgeAboveZeroX - tX;\n edgeAboveZeroY = edgeAboveZeroY < root.y ? edgeAboveZeroY + tY : edgeAboveZeroY - tY;\n }\n\n return {\n amplitude: getSignificantDecimals(amplitude),\n freq: getSignificantDecimals(freq),\n min: getSignificantDecimals(edge.y < root.y ? edge.y : edge.y - tY),\n max: getSignificantDecimals(edge.y < root.y ? edge.y + tY : edge.y),\n edgeAboveZeroX: getSignificantDecimals(edgeAboveZeroX),\n edgeAboveZeroY: getSignificantDecimals(edgeAboveZeroY),\n };\n };\n\n const studentAnswerBpY = getPoints(sine1);\n const correctAnswerBpY = getPoints(sine2);\n\n const {\n amplitude: amplitude1,\n freq: freq1,\n min: min1,\n max: max1,\n edgeAboveZeroX: edgeAboveZeroX1,\n edgeAboveZeroY: edgeAboveZeroY1,\n } = studentAnswerBpY;\n const {\n amplitude: amplitude2,\n freq: freq2,\n min: min2,\n max: max2,\n edgeAboveZeroX: edgeAboveZeroX2,\n edgeAboveZeroY: edgeAboveZeroY2,\n } = correctAnswerBpY;\n\n return (\n Math.abs(amplitude1) === Math.abs(amplitude2) &&\n Math.abs(freq1) === Math.abs(freq2) &&\n min1 === min2 &&\n max1 === max2 &&\n edgeAboveZeroX1 === edgeAboveZeroX2 &&\n edgeAboveZeroY1 === edgeAboveZeroY2\n );\n // rootDiff1 === rootDiff2);\n};\n\nexport const equalParabola = (p1, p2) => {\n const { edge: edgeP1 } = p1;\n const { edge: edgeP2 } = p2;\n let { root: rootP1 } = p1;\n let { root: rootP2 } = p2;\n\n rootP1 = { ...rootP1 };\n rootP2 = { ...rootP2 };\n\n const p1edge = edgeP1 || { ...rootP1 };\n const p2edge = edgeP2 || { ...rootP2 };\n\n const p1mirrorEdge = { x: rootP1.x - (p1edge.x - rootP1.x), y: p1edge.y };\n const p2mirrorEdge = { x: rootP2.x - (p2edge.x - rootP2.x), y: p2edge.y };\n\n if (!edgeP1 || !edgeP2) return false;\n\n const { a: a1, b: b1, c: c1 } = pointsToABC(rootP1, edgeP1, p1mirrorEdge);\n const { a: a2, b: b2, c: c2 } = pointsToABC(rootP2, edgeP2, p2mirrorEdge);\n\n // sometimes numbers have this form: 1.00000000002 because of calculations, we have to round them\n const round = (number) => Math.round(number * 10000) / 10000;\n\n return round(a1) === round(a2) && round(b1) === round(b2) && round(c1) === round(c2);\n};\n\n/*\n * Function to check if given two points for absolute function\n * for correct answer and student answer are equal or not.\n * @param p1 - student answer\n * @param p2 - correct answer\n * */\nexport const equalAbsolute = (p1, p2) => {\n const { edge: edgeP1 } = p1;\n const { edge: edgeP2 } = p2;\n let { root: rootP1 } = p1;\n let { root: rootP2 } = p2;\n\n rootP1 = { ...rootP1 };\n rootP2 = { ...rootP2 };\n\n const p1edge = edgeP1 || { ...rootP1 };\n const p2edge = edgeP2 || { ...rootP2 };\n\n const p1a1 = pointsToAForAbsolute(rootP1, p1edge);\n const p2a2 = pointsToAForAbsolute(rootP2, p2edge);\n\n // if both root and a value are equal\n return isEqual(rootP2, rootP1) && isEqual(p2a2, p1a1);\n};\n\n/*\n * Function to check if given two points for exponential function\n * for correct answer and student answer are equal or not.\n * @param p1 - student answer\n * @param p2 - correct answer\n * */\nexport const equalExponential = (p1, p2) => {\n const { edge: edgeP1 } = p1;\n const { edge: edgeP2 } = p2;\n let { root: rootP1 } = p1;\n let { root: rootP2 } = p2;\n\n rootP1 = { ...rootP1 };\n rootP2 = { ...rootP2 };\n\n const p1edge = edgeP1 || { ...rootP1 };\n const p2edge = edgeP2 || { ...rootP2 };\n\n const { a1, b1 } = pointsToABForExponential(rootP1, p1edge);\n const { a2, b2 } = pointsToABForExponential(rootP2, p2edge);\n\n // if both a and b value are equal\n return isEqual(a2, a1) && isEqual(b2, b1);\n};\n\nexport const equalMarks = {\n circle: (sessAnswer, mark) => equalCircle(sessAnswer, mark),\n line: (sessAnswer, mark) => equalLine(sessAnswer, mark),\n parabola: (sessAnswer, mark) => equalParabola(sessAnswer, mark),\n absolute: (sessAnswer, mark) => equalAbsolute(sessAnswer, mark),\n exponential: (sessAnswer, mark) => equalExponential(sessAnswer, mark),\n point: (sessAnswer, mark) => equalPoint(sessAnswer, mark),\n polygon: (sessAnswer, poly) => equalPolygon(sessAnswer, poly),\n ray: (sessAnswer, mark) => equalRay(sessAnswer, mark),\n segment: (sessAnswer, mark) => equalSegment(sessAnswer, mark),\n sine: (sessAnswer, mark) => equalSine(sessAnswer, mark),\n vector: (sessAnswer, mark) => equalVector(sessAnswer, mark),\n};\n\nconst completePoint = (point) => point && Number.isFinite(point.x) && Number.isFinite(point.y);\nconst completeFromTo = (item) => item && completeMark.point(item.from) && completeMark.point(item.to);\nconst completeRootEdge = (item) => item && completeMark.point(item.edge) && completeMark.point(item.root);\nconst completePoints = (item) =>\n item &&\n item.points &&\n item.points.length &&\n (item.points.filter((point) => completePoint(point)) || []).length === item.points.length;\n\nconst completeMark = {\n point: completePoint,\n line: completeFromTo,\n ray: completeFromTo,\n segment: completeFromTo,\n vector: completeFromTo,\n circle: completeRootEdge,\n parabola: completeRootEdge,\n absolute: completeRootEdge,\n exponential: completeRootEdge,\n sine: completeRootEdge,\n polygon: completePoints,\n};\n","//#region \\0rolldown/runtime.js\nvar e = Object.defineProperty, t = (t, n) => {\n\tlet r = {};\n\tfor (var i in t) e(r, i, {\n\t\tget: t[i],\n\t\tenumerable: !0\n\t});\n\treturn n || e(r, Symbol.toStringTag, { value: \"Module\" }), r;\n};\n//#endregion\n//#region src/persistence.ts\nfunction n(e) {\n\treturn Array.isArray(e) ? e.filter((e) => e != null) : [];\n}\nfunction r(e) {\n\tlet t = [...e];\n\tfor (let e = t.length - 1; e > 0; e--) {\n\t\tlet n = Math.floor(Math.random() * (e + 1));\n\t\t[t[e], t[n]] = [t[n], t[e]];\n\t}\n\treturn t;\n}\nfunction i(e) {\n\treturn e == null ? !0 : Array.isArray(e) ? e.length === 0 : typeof e == \"object\" ? Object.keys(e).length === 0 : !1;\n}\nasync function a(e, t, a, o = \"value\") {\n\tlet s = n(t?.data?.shuffledValues ?? t?.shuffledValues ?? []);\n\tif (!t) {\n\t\tconsole.warn(\"Unable to save shuffled choices because there's no session.\");\n\t\treturn;\n\t}\n\tif (!i(s)) return n(s.map((t) => e.find((e) => e[o] === t)));\n\tlet c = r(e);\n\tif (a && typeof a == \"function\") try {\n\t\tlet e = n(c.map((e) => e[o]));\n\t\ti(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(c)}, key: ${o}`) : t.id && t.element && await a(t.id, t.element, { shuffledValues: e });\n\t} catch (e) {\n\t\tconsole.warn(\"Unable to save shuffled order for choices\"), console.error(e);\n\t}\n\telse console.warn(\"Unable to save shuffled choices, shuffle will happen every time.\");\n\treturn c;\n}\nfunction o(e, t, n) {\n\treturn !!(e.lockChoiceOrder || n[\"@pie-element\"]?.lockChoiceOrder || (n.role ?? \"student\") === \"instructor\");\n}\n//#endregion\n//#region src/partial-scoring.ts\nvar s = /* @__PURE__ */ t({ enabled: () => c });\nfunction c(e, t, n) {\n\treturn e?.partialScoring === !1 || t?.partialScoring === !1 ? !1 : typeof n == \"boolean\" ? n : !0;\n}\n//#endregion\nexport { a as getShuffledChoices, o as lockChoices, s as partialScoring };\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/graphing/controller/src/index.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport debug from 'debug';\n\nimport { cloneDeep, isEmpty, uniqWith } from 'lodash-es';\nimport defaults from './defaults.js';\nimport { equalMarks, equalPointWithLabel, sortedAnswers } from './utils.js';\n\nimport { partialScoring } from '@pie-element/shared-controller-utils';\n\nconst log = debug('@pie-element:graphing:controller');\n\nconst initializeGraphMap = () => ({\n point: [],\n segment: [],\n line: [],\n ray: [],\n vector: [],\n polygon: [],\n circle: [],\n sine: [],\n parabola: [],\n absolute: [],\n exponential: [],\n});\n\nconst graphObjectsOrder = {\n incorrect: 0,\n correct: 1,\n missing: 2,\n};\n\nexport const compareMarks = (mark1, mark2) => {\n // marks can be compared with equalMarks[type] function only if they have the same type;\n // if type is different, they are clearly not equal\n return !!(\n mark1 &&\n mark2 &&\n mark1.type === mark2.type &&\n equalMarks[mark1.type] &&\n equalMarks[mark1.type](mark1, mark2)\n );\n};\n\nexport const comparLabelMarks = (mark1, mark2) => {\n return mark1.label === mark2.label ? 'correct' : 'incorrect';\n};\n\nexport const getAnswerCorrected = ({ sessionAnswers, marks: correctAnswers, withPointLabel = false }) => {\n sessionAnswers = sessionAnswers || [];\n correctAnswers = correctAnswers || [];\n\n const rez = cloneDeep(sessionAnswers).reduce((correctedAnswer, answer) => {\n const answerIsCorrect = correctAnswers.find((mark) => compareMarks(answer, mark));\n\n // For scoring points, check if both position AND label match\n const isCorrectForScoring = answerIsCorrect && answer.type === 'point' && withPointLabel \n ? equalPointWithLabel(answer, answerIsCorrect)\n : !!answerIsCorrect;\n\n answer.correctness = isCorrectForScoring ? 'correct' : 'incorrect';\n if (answerIsCorrect) {\n answer.correctnesslabel = comparLabelMarks(answer, answerIsCorrect);\n answer.correctlabel = answerIsCorrect.label ? answerIsCorrect.label : '';\n answer.label = answer.label ? answer.label : '';\n }\n return [...correctedAnswer, answer];\n }, []);\n\n // add missing objects from correct answer\n const missingAnswers = cloneDeep(correctAnswers).reduce((correctedAnswer, answer) => {\n const answerIndex = sessionAnswers.find((mark) => compareMarks(answer, mark));\n\n if (!answerIndex) {\n // means that corrected answer is missing from session, so we mark it as missing object\n return [...correctedAnswer, { ...answer, correctness: 'missing' }];\n }\n\n return correctedAnswer;\n }, []);\n\n return [...rez, ...missingAnswers];\n};\n\nconst getPartialScoring = ({ scoringType, env }) => {\n let pS = scoringType;\n\n // if scoringType is undefined, partialScoring should be considered undefined (not set)\n // because partialScoring.enabled is using that information\n // if it has a value, we check if it is partial scoring or dichotomous\n if (scoringType) {\n pS = scoringType === 'partial scoring';\n }\n\n return partialScoring.enabled({ partialScoring: pS }, env);\n};\n\nexport const getBestAnswer = (question, session, env = {}) => {\n // questionPossibleAnswers contains all possible answers (correct response and alternates);\n let { answers: questionPossibleAnswers = {}, scoringType } = question || {};\n let { answer } = session || {};\n\n // filter the incomplete objects\n Object.entries(questionPossibleAnswers || {}).forEach(\n ([key, value]) =>\n (questionPossibleAnswers[key] = { ...value, marks: value?.marks.filter((mark) => !mark.building) }),\n );\n\n // initialize answer if no values\n answer = answer || [];\n\n //filter the incomplete objects for student response - Fix for SC-33160\n answer = answer.filter((mark) => !mark.building);\n\n // initialize one possible answer if no values\n if (isEmpty(questionPossibleAnswers)) {\n questionPossibleAnswers = { correctAnswer: initializeGraphMap() };\n } else {\n questionPossibleAnswers = {\n correctAnswer: questionPossibleAnswers.correctAnswer,\n ...sortedAnswers(questionPossibleAnswers),\n };\n }\n\n const partialScoringEnabled = getPartialScoring({ scoringType, env });\n\n // student's answers without DUPLICATES\n const sessionAnswers = uniqWith(answer, compareMarks);\n // array of possible answers entries\n const possibleAnswers = Object.entries(questionPossibleAnswers);\n\n return possibleAnswers.reduce(\n (acc, entry) => {\n // iterating each possible answer (main + alternates)\n const possibleAnswerKey = entry[0];\n const possibleAnswer = entry[1] || {};\n let { marks } = possibleAnswer;\n\n if (!marks || !marks.length) {\n return acc;\n }\n\n // returns array of marks, each having 'correctness' property\n const correctedAnswer = getAnswerCorrected({ sessionAnswers, marks });\n const correctedAnswerWithLabels = getAnswerCorrected({ sessionAnswers, marks, withPointLabel: true });\n const correctMarks = correctedAnswerWithLabels.filter((answer) => answer.correctness === 'correct');\n // filter out missing objects because they do not affect the calculation of the score\n // only correct and incorrect are needed\n const scoredCorrectedAnswer = correctedAnswerWithLabels.filter((answer) => answer.correctness !== 'missing');\n\n const maxScore = marks.length;\n let score = correctMarks.length;\n\n // if extra placements\n if (scoredCorrectedAnswer.length > maxScore) {\n score -= scoredCorrectedAnswer.length - maxScore;\n }\n\n if (score < 0) {\n score = 0;\n }\n\n if (score / maxScore > acc.bestScore || !acc.foundOneSolution) {\n if (partialScoringEnabled) {\n acc.bestScore = parseFloat((score / maxScore).toFixed(2));\n } else {\n acc.bestScore = Math.floor(score / maxScore);\n }\n\n acc.bestScoreAnswerKey = possibleAnswerKey;\n acc.answersCorrected = correctedAnswer;\n acc.foundOneSolution = true;\n }\n\n return acc;\n },\n {\n bestScore: 0,\n bestScoreAnswerKey: null,\n // initially we just suppose all the answers are incorrect\n answersCorrected: cloneDeep(sessionAnswers).map((answer) => ({ ...answer, correctness: 'incorrect' })),\n foundOneSolution: false,\n },\n );\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport function model(question, session, env) {\n return new Promise((resolve) => {\n const normalizedQuestion = normalize(question);\n\n // added a sanity check for session for environments where it is not passed initially (ex. pie-website)\n if (session === undefined || session === null) {\n session = {};\n }\n // console.log('normalizedQuestion', normalizedQuestion);\n const { defaultTool, extraCSSRules, prompt, promptEnabled, graph, answers, toolbarTools, ...questionProps } =\n normalizedQuestion || {};\n let { arrows } = normalizedQuestion;\n const { mode, role } = env || {};\n\n // This is used for offering support for old models which have the property arrows: boolean\n // Same thing is set in authoring : packages/graphing/configure/src/configure.jsx - componentDidMount\n if (typeof arrows === 'boolean') {\n if (arrows) {\n arrows = {\n left: true,\n right: true,\n up: true,\n down: true,\n };\n } else {\n arrows = {\n left: false,\n right: false,\n up: false,\n down: false,\n };\n }\n }\n\n // added support for models without defaultTool defined; also used in packages/graphing/configure/src/index.js\n const toolbarToolsNoLabel = (toolbarTools || []).filter((tool) => tool !== 'label');\n const normalizedDefaultTool = defaultTool || (toolbarToolsNoLabel.length && toolbarToolsNoLabel[0]) || '';\n\n const base = {\n ...questionProps,\n answers,\n arrows,\n defaultTool: normalizedDefaultTool,\n disabled: env.mode !== 'gather',\n prompt: promptEnabled ? prompt : null,\n rationale: null,\n size: graph,\n showKeyLegend: env.mode === 'evaluate',\n showToggle:\n env.mode === 'evaluate' &&\n !isEmpty(answers) &&\n answers.correctAnswer &&\n answers.correctAnswer.marks &&\n !isEmpty(answers.correctAnswer.marks),\n teacherInstructions: null,\n toolbarTools,\n extraCSSRules,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n const { rationale, rationaleEnabled, teacherInstructions, teacherInstructionsEnabled } = normalizedQuestion || {};\n\n base.rationale = rationaleEnabled ? rationale : null;\n base.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n }\n\n if (mode === 'evaluate') {\n if (\n !isEmpty(answers) &&\n answers.correctAnswer &&\n answers.correctAnswer.marks &&\n !isEmpty(answers.correctAnswer.marks)\n ) {\n const { answersCorrected, bestScoreAnswerKey, bestScore } = getBestAnswer(normalizedQuestion, session, env);\n // array of marks from session with 'correctness' property set\n base.answersCorrected = answersCorrected.sort(\n (a, b) => graphObjectsOrder[a.correctness] - graphObjectsOrder[b.correctness],\n );\n base.correctResponse = bestScoreAnswerKey ? (answers[bestScoreAnswerKey] || {}).marks : [];\n base.showToggle = base.showToggle && bestScore !== 1;\n } else {\n base.answersCorrected = (session && session.answer) || [];\n base.correctResponse = [];\n }\n }\n\n log('base: ', base);\n resolve(base);\n });\n}\n\n /**\n * Generates detailed trace log for scoring evaluation\n * @param {Object} model - the question model\n * @param {Object} session - the student session\n * @param {Object} env - the environment\n * @returns {Array} traceLog - array of trace messages\n */\nexport const getLogTrace = (question, session, env) => {\n const traceLog = [];\n const { answers = {}, scoringType } = question || {};\n const studentMarks = (session && session.answer) || [];\n\n if (!studentMarks.length) {\n return ['Student did not interact with the graph.'];\n }\n\n traceLog.push(`Student added ${studentMarks.length} object(s) to the graph.`);\n\n const partialScoringEnabled = getPartialScoring({ scoringType, env });\n\n const {\n answersCorrected,\n bestScore,\n bestScoreAnswerKey,\n } = getBestAnswer(question, session, env);\n\n const correctResponse =\n bestScoreAnswerKey && answers[bestScoreAnswerKey]\n ? answers[bestScoreAnswerKey].marks || []\n : [];\n\n let correctCount = 0;\n let incorrectCount = 0;\n let missingCount = 0;\n\n for (let i = 0; i < answersCorrected.length; i++) {\n const c = answersCorrected[i].correctness;\n if (c === 'correct') correctCount++;\n else if (c === 'incorrect') incorrectCount++;\n else if (c === 'missing') missingCount++;\n }\n\n if (correctCount > 0) {\n traceLog.push(`Correct objects: ${correctCount}.`);\n }\n\n if (incorrectCount > 0) {\n traceLog.push(`Incorrect objects: ${incorrectCount}.`);\n }\n\n if (missingCount > 0) {\n traceLog.push(`Missing required objects: ${missingCount}.`);\n }\n\n answersCorrected.forEach((mark, index) => {\n const objectType = mark.type || 'graph object';\n const objectLabel = mark.label ? `'${mark.label}'` : '';\n const objectIndex = `with index ${index + 1}`;\n\n if (mark.correctness === 'correct') {\n traceLog.push(\n `${objectType.charAt(0).toUpperCase() + objectType.slice(1)} ${objectLabel || objectIndex} is correct.`\n );\n }\n\n if (mark.correctness === 'incorrect') {\n traceLog.push(\n `${objectType.charAt(0).toUpperCase() + objectType.slice(1)} ${objectLabel || objectIndex} does not match the expected ${objectType}.`\n );\n }\n\n if (mark.correctness === 'missing') {\n traceLog.push(`Expected ${objectType} ${objectLabel || objectIndex} was not plotted by the student.`);\n }\n });\n\n if (studentMarks.length > correctResponse.length) {\n const extra = studentMarks.length - correctResponse.length;\n traceLog.push(`${extra} extra object(s) were plotted and are penalized in scoring.`);\n }\n\n if (partialScoringEnabled) {\n traceLog.push('Score calculated using partial scoring.');\n } else {\n traceLog.push('Score calculated using all-or-nothing scoring.');\n }\n\n traceLog.push(`Final score: ${bestScore}.`);\n\n return traceLog;\n};\n\n\nexport function outcome(question, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true, logTrace: ['Student did not interact with the graph.'] });\n }\n\n if (\n env.mode !== 'evaluate' ||\n isEmpty(question.answers) ||\n (question.answers && question.answers.correctAnswer && isEmpty(question.answers.correctAnswer.marks))\n ) {\n resolve({ score: 0, empty: true, logTrace: ['Student did not interact with the graph.'] });\n }\n\n const { bestScore } = getBestAnswer(question, session, env);\n\n resolve({ score: bestScore, empty: false, logTrace: getLogTrace(question, session, env) });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { answers } = question || {};\n let marks = [];\n\n if (answers && Object.values(answers)) {\n const correctAnswer = answers.correctAnswer || Object.values(answers)[0] || {};\n marks = correctAnswer.marks || [];\n }\n\n resolve({\n answer: marks,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { answers, toolbarTools } = model;\n const errors = {};\n const correctAnswerErrors = {};\n const toolbarToolsNoLabel = (toolbarTools || []).filter((tool) => tool !== 'label');\n\n if (!toolbarToolsNoLabel.length) {\n errors.toolbarToolsError = 'There should be at least 1 tool defined.';\n }\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n Object.entries(answers || {}).forEach(([key, value]) => {\n if (!value.marks.length) {\n correctAnswerErrors[key] = 'At least 1 graph object should be defined.';\n }\n\n // check if all graph objects are correctly defined with respect to root, edge and from, to\n if (value.marks.length > 0) {\n value.marks.forEach((mark) => {\n if (mark.building) {\n correctAnswerErrors[key] = 'At least 1 graph object is not correctly defined.';\n }\n });\n }\n });\n\n if (!isEmpty(correctAnswerErrors)) {\n errors.correctAnswerErrors = correctAnswerErrors;\n }\n\n return errors;\n};\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/controller/defaults.ts","../../../src/controller/utils.ts","../../../../../shared/controller-utils/dist/index.js","../../../src/controller/index.ts"],"sourcesContent":["// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/graphing/controller/src/defaults.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\n// TODO: This is lifted from @pie-lib/graphing, however importing this will break a controller build because it has jsx source in that package.\nconst allTools = [\n 'circle',\n 'line',\n 'label',\n 'parabola',\n 'point',\n 'polygon',\n 'ray',\n 'segment',\n 'sine',\n 'vector',\n // 'absolute', // - not available as default\n // 'exponential', // - not available as default\n];\n\n/* model defaults */\nexport default {\n answers: {\n correctAnswer: {\n name: 'Correct Answer',\n marks: [],\n },\n },\n arrows: {\n left: true,\n right: true,\n up: true,\n down: true,\n },\n backgroundMarks: [],\n coordinatesOnHover: false,\n defaultGridConfiguration: 0,\n domain: {\n min: -5,\n max: 5,\n step: 1,\n labelStep: 1,\n axisLabel: 'x',\n },\n graph: { width: 500, height: 500 },\n includeAxes: true,\n labels: {},\n labelsEnabled: true,\n padding: true,\n prompt: '',\n promptEnabled: true,\n range: {\n min: -5,\n max: 5,\n step: 1,\n labelStep: 1,\n axisLabel: 'y',\n },\n rationale: '',\n rationaleEnabled: true,\n standardGrid: false,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n title: '',\n titleEnabled: true,\n toolbarTools: allTools,\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/graphing/controller/src/utils.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport { differenceWith, isEqual, uniq, uniqWith } from '@pie-element/shared-lodash';\nimport {\n getAmplitudeAndFreq,\n pointsToABC,\n pointsToAForAbsolute,\n pointsToABForExponential,\n} from '@pie-lib/graphing-utils';\n\nexport const equalPoint = (A, B) => {\n A = { ...A };\n B = { ...B };\n\n return isEqual(A.x, B.x) && isEqual(A.y, B.y);\n};\n\nexport const equalPointWithLabel = (A, B) => {\n // x1 = x2 & y1 = y2\n // A point is only correct if both its position AND its label match.\n // Labels are not scored independently; a point in the correct position\n // with the wrong label is considered incorrect as a whole.\n let equalLabel = true;\n\n A = { ...A };\n B = { ...B };\n\n if (A.label || B.label) {\n equalLabel = isEqual(A.label, B.label);\n }\n\n return isEqual(A.x, B.x) && isEqual(A.y, B.y) && equalLabel;\n};\n\nexport const equalSegment = (segment1, segment2) => {\n // A.from = B.from, A.to = B.to OR A.from = B.to, A.to = B.from\n // x1 = x3 & y1 = y3 & x2 = x4 & y2 = y4\n return (\n (isEqual(segment1.from, segment2.from) && isEqual(segment1.to, segment2.to)) ||\n (isEqual(segment1.to, segment2.from) && isEqual(segment1.from, segment2.to))\n );\n};\n\nexport const equalVector = (vector1, vector2) => {\n // A.from = B.from, A.to = B.to;\n // x1 = x3 & y1 = y3 & x2 = x4 & y2 = y4\n return isEqual(vector1.from, vector2.from) && isEqual(vector1.to, vector2.to);\n};\n\n// this function is implemented in configure as well\nexport const sortedAnswers = (answers) =>\n Object.keys(answers || {})\n .sort()\n .reduce((result, key) => {\n if (key !== 'correctAnswer') {\n result[key] = answers[key];\n }\n\n return result;\n }, {});\n\nconst returnLineEquationCoefficients = (line) => {\n line = { ...line, to: { ...line.to }, from: { ...line.from } };\n\n const xA = line.from.x;\n const yA = line.from.y;\n const xB = line.to.x;\n const yB = line.to.y;\n\n return {\n a: yB - yA,\n b: xA - xB,\n c: xB * yA - xA * yB,\n };\n};\n\nconst getSignificantDecimals = (number) => Math.round(number * 10000) / 10000;\n\nexport const equalLine = (line1, line2) => {\n // line equation: ax + by + c = 0\n // 2 lines are equal if a1/a2 = b1/b2 = c1/c2, where a, b, c are the coefficients in line equation\n\n // line equation knowing 2 points: (y - yA) / (yB - yA) = (x - xA) / (xB - xA)\n // extending this equation, we get: x * (yB - yA) + y * (xA - xB) + (xB * yA - xA * yB) = 0\n // where a = yB - yA; b = xA - xB; c = xB * yA - xA * yB\n\n const { a: a1, b: b1, c: c1 } = returnLineEquationCoefficients(line1);\n const { a: a2, b: b2, c: c2 } = returnLineEquationCoefficients(line2);\n\n const proportions = [];\n\n if (a2 !== 0) {\n proportions.push(getSignificantDecimals(a1 / a2));\n } else if (a1 !== a2) {\n return false;\n }\n\n if (b2 !== 0) {\n proportions.push(getSignificantDecimals(b1 / b2));\n } else if (b1 !== b2) {\n return false;\n }\n\n if (c2 !== 0) {\n proportions.push(getSignificantDecimals(c1 / c2));\n } else if (c1 !== c2) {\n return false;\n }\n\n return uniq(proportions).length === 1;\n\n // (y2 - y1)/(x2 - x1) = (y4 - y3)/(x4 - x3);\n // return ((Math.abs((line1.to.y - line1.from.y) / (line1.to.x - line1.from.x))) === (Math.abs((line2.to.y - line2.from.y) / (line2.to.x - line2.from.x))));\n};\n\nexport const equalRay = (ray1, ray2) => {\n ray1 = { ...ray1, to: { ...ray1.to }, from: { ...ray1.from } };\n ray2 = { ...ray2, to: { ...ray2.to }, from: { ...ray2.from } };\n\n // slope: m = (y2-y1)/(x2-x1)\n // slope & x1 = x3 & y1 = y3 & angle between (x1, y1) (x2, y2) is same as angle between (x3, y3) (x4, y4)\n const mRay1 = (ray1.to.y - ray1.from.y) / (ray1.to.x - ray1.from.x);\n const mRay2 = (ray2.to.y - ray2.from.y) / (ray2.to.x - ray2.from.x);\n const angleRay1 = (Math.atan2(ray1.to.y - ray1.from.y, ray1.to.x - ray1.from.x) * 180) / Math.PI;\n const angleRay2 = (Math.atan2(ray2.to.y - ray2.from.y, ray2.to.x - ray2.from.x) * 180) / Math.PI;\n\n return mRay1 === mRay2 && ray1.from.x === ray2.from.x && ray1.from.y === ray2.from.y && angleRay1 === angleRay2;\n};\n\nexport const constructSegmentsFromPoints = (points) => {\n // takes the list of points that represent a polygon and transforms it into a list of segments; eg.:\n // points: A, B, C, D => segments: AB, BC, CD, DA\n return (points || []).map((point, index) => ({ from: point, to: points[(index + 1) % points.length] }));\n};\n\nexport const removeDuplicateSegments = (segments) => {\n segments = segments || [];\n // removes segments that are duplicates; eg. These segments are the same, so one will be removed:\n // segment1: from: { x: 1, y: 1 }, to: { x: 2, y: 1 }\n // segment2: from: { x: 2, y: 1 }, to: { x: 1, y: 1 }\n return uniqWith(segments, (s1, s2) => equalSegment(s1, s2));\n};\n\nexport const removeInvalidSegments = (segments) => {\n segments = segments || [];\n // removes segments that start in a point and end in the same point (eg.: from: { x: 1, y: 1 }, to: { x: 1, y: 1 })\n\n return segments.filter((segment) => !isEqual(segment.from, segment.to));\n};\n\nexport const equalPolygon = (poly1, poly2) => {\n const { points: points1 } = poly1;\n const { points: points2 } = poly2;\n\n // generate segments\n const segments1 = constructSegmentsFromPoints(points1);\n const segments2 = constructSegmentsFromPoints(points2);\n\n const segments1NoDuplicates = removeDuplicateSegments(removeInvalidSegments(segments1));\n const segments2NoDuplicates = removeDuplicateSegments(removeInvalidSegments(segments2));\n\n const differentSegments1 = differenceWith(segments1NoDuplicates, segments2NoDuplicates, equalSegment);\n const differentSegments2 = differenceWith(segments2NoDuplicates, segments1NoDuplicates, equalSegment);\n\n return (!differentSegments1 || !differentSegments1.length) && (!differentSegments2 || !differentSegments2.length);\n};\n\nexport const equalCircle = (c1, c2) => {\n c1 = { ...c1, root: { ...c1.root }, edge: { ...c1.edge } };\n c2 = { ...c2, root: { ...c2.root }, edge: { ...c2.edge } };\n const equalRootAndEdge = isEqual(c2.edge, c1.edge) && isEqual(c2.root, c1.root);\n\n // if both edge and root are the same, it means the shapes are exactly the same\n if (equalRootAndEdge) return true;\n\n const rC1 = Math.sqrt((c1.edge.x - c1.root.x) ** 2 + (c1.edge.y - c1.root.y) ** 2);\n const rC2 = Math.sqrt((c2.edge.x - c2.root.x) ** 2 + (c2.edge.y - c2.root.y) ** 2);\n\n // if both root and radius are the same, it means the shapes are equal\n return isEqual(c2.root, c1.root) && isEqual(rC1, rC2);\n};\n\nexport const equalSine = (sine1, sine2) => {\n const getPoints = ({ root, edge }) => {\n root = { ...root };\n edge = { ...edge };\n\n const { amplitude, freq } = getAmplitudeAndFreq(root, edge);\n // the height of the sine wave\n const tY = Math.abs(root.y - edge.y) * 2;\n // the distance on x axis between edge and root\n const tXRoot = Math.abs(root.x - edge.x);\n // the distance on x axis between 2 edges for sine wave (min & max)\n const tX = tXRoot * 2;\n // the first edge placed east side of root\n let edgeAboveZeroX = edge.x;\n let edgeAboveZeroY = edge.y;\n\n // if edge less then 0, find out the appropriate edge placed east side of zero (0)\n while (edgeAboveZeroX < 0 && tX !== 0) {\n edgeAboveZeroX = edgeAboveZeroX + tX;\n edgeAboveZeroY = edgeAboveZeroY < root.y ? edgeAboveZeroY + tY : edgeAboveZeroY - tY;\n }\n\n // if edge more then 0, find out the appropriate edge placed east side of zero (0)\n while (edgeAboveZeroX - tX > 0 && tX !== 0) {\n edgeAboveZeroX = edgeAboveZeroX - tX;\n edgeAboveZeroY = edgeAboveZeroY < root.y ? edgeAboveZeroY + tY : edgeAboveZeroY - tY;\n }\n\n return {\n amplitude: getSignificantDecimals(amplitude),\n freq: getSignificantDecimals(freq),\n min: getSignificantDecimals(edge.y < root.y ? edge.y : edge.y - tY),\n max: getSignificantDecimals(edge.y < root.y ? edge.y + tY : edge.y),\n edgeAboveZeroX: getSignificantDecimals(edgeAboveZeroX),\n edgeAboveZeroY: getSignificantDecimals(edgeAboveZeroY),\n };\n };\n\n const studentAnswerBpY = getPoints(sine1);\n const correctAnswerBpY = getPoints(sine2);\n\n const {\n amplitude: amplitude1,\n freq: freq1,\n min: min1,\n max: max1,\n edgeAboveZeroX: edgeAboveZeroX1,\n edgeAboveZeroY: edgeAboveZeroY1,\n } = studentAnswerBpY;\n const {\n amplitude: amplitude2,\n freq: freq2,\n min: min2,\n max: max2,\n edgeAboveZeroX: edgeAboveZeroX2,\n edgeAboveZeroY: edgeAboveZeroY2,\n } = correctAnswerBpY;\n\n return (\n Math.abs(amplitude1) === Math.abs(amplitude2) &&\n Math.abs(freq1) === Math.abs(freq2) &&\n min1 === min2 &&\n max1 === max2 &&\n edgeAboveZeroX1 === edgeAboveZeroX2 &&\n edgeAboveZeroY1 === edgeAboveZeroY2\n );\n // rootDiff1 === rootDiff2);\n};\n\nexport const equalParabola = (p1, p2) => {\n const { edge: edgeP1 } = p1;\n const { edge: edgeP2 } = p2;\n let { root: rootP1 } = p1;\n let { root: rootP2 } = p2;\n\n rootP1 = { ...rootP1 };\n rootP2 = { ...rootP2 };\n\n const p1edge = edgeP1 || { ...rootP1 };\n const p2edge = edgeP2 || { ...rootP2 };\n\n const p1mirrorEdge = { x: rootP1.x - (p1edge.x - rootP1.x), y: p1edge.y };\n const p2mirrorEdge = { x: rootP2.x - (p2edge.x - rootP2.x), y: p2edge.y };\n\n if (!edgeP1 || !edgeP2) return false;\n\n const { a: a1, b: b1, c: c1 } = pointsToABC(rootP1, edgeP1, p1mirrorEdge);\n const { a: a2, b: b2, c: c2 } = pointsToABC(rootP2, edgeP2, p2mirrorEdge);\n\n // sometimes numbers have this form: 1.00000000002 because of calculations, we have to round them\n const round = (number) => Math.round(number * 10000) / 10000;\n\n return round(a1) === round(a2) && round(b1) === round(b2) && round(c1) === round(c2);\n};\n\n/*\n * Function to check if given two points for absolute function\n * for correct answer and student answer are equal or not.\n * @param p1 - student answer\n * @param p2 - correct answer\n * */\nexport const equalAbsolute = (p1, p2) => {\n const { edge: edgeP1 } = p1;\n const { edge: edgeP2 } = p2;\n let { root: rootP1 } = p1;\n let { root: rootP2 } = p2;\n\n rootP1 = { ...rootP1 };\n rootP2 = { ...rootP2 };\n\n const p1edge = edgeP1 || { ...rootP1 };\n const p2edge = edgeP2 || { ...rootP2 };\n\n const p1a1 = pointsToAForAbsolute(rootP1, p1edge);\n const p2a2 = pointsToAForAbsolute(rootP2, p2edge);\n\n // if both root and a value are equal\n return isEqual(rootP2, rootP1) && isEqual(p2a2, p1a1);\n};\n\n/*\n * Function to check if given two points for exponential function\n * for correct answer and student answer are equal or not.\n * @param p1 - student answer\n * @param p2 - correct answer\n * */\nexport const equalExponential = (p1, p2) => {\n const { edge: edgeP1 } = p1;\n const { edge: edgeP2 } = p2;\n let { root: rootP1 } = p1;\n let { root: rootP2 } = p2;\n\n rootP1 = { ...rootP1 };\n rootP2 = { ...rootP2 };\n\n const p1edge = edgeP1 || { ...rootP1 };\n const p2edge = edgeP2 || { ...rootP2 };\n\n const { a1, b1 } = pointsToABForExponential(rootP1, p1edge);\n const { a2, b2 } = pointsToABForExponential(rootP2, p2edge);\n\n // if both a and b value are equal\n return isEqual(a2, a1) && isEqual(b2, b1);\n};\n\nexport const equalMarks = {\n circle: (sessAnswer, mark) => equalCircle(sessAnswer, mark),\n line: (sessAnswer, mark) => equalLine(sessAnswer, mark),\n parabola: (sessAnswer, mark) => equalParabola(sessAnswer, mark),\n absolute: (sessAnswer, mark) => equalAbsolute(sessAnswer, mark),\n exponential: (sessAnswer, mark) => equalExponential(sessAnswer, mark),\n point: (sessAnswer, mark) => equalPoint(sessAnswer, mark),\n polygon: (sessAnswer, poly) => equalPolygon(sessAnswer, poly),\n ray: (sessAnswer, mark) => equalRay(sessAnswer, mark),\n segment: (sessAnswer, mark) => equalSegment(sessAnswer, mark),\n sine: (sessAnswer, mark) => equalSine(sessAnswer, mark),\n vector: (sessAnswer, mark) => equalVector(sessAnswer, mark),\n};\n\nconst completePoint = (point) => point && Number.isFinite(point.x) && Number.isFinite(point.y);\nconst completeFromTo = (item) => item && completeMark.point(item.from) && completeMark.point(item.to);\nconst completeRootEdge = (item) => item && completeMark.point(item.edge) && completeMark.point(item.root);\nconst completePoints = (item) =>\n item &&\n item.points &&\n item.points.length &&\n (item.points.filter((point) => completePoint(point)) || []).length === item.points.length;\n\nconst completeMark = {\n point: completePoint,\n line: completeFromTo,\n ray: completeFromTo,\n segment: completeFromTo,\n vector: completeFromTo,\n circle: completeRootEdge,\n parabola: completeRootEdge,\n absolute: completeRootEdge,\n exponential: completeRootEdge,\n sine: completeRootEdge,\n polygon: completePoints,\n};\n","//#region \\0rolldown/runtime.js\nvar e = Object.defineProperty, t = (t, n) => {\n\tlet r = {};\n\tfor (var i in t) e(r, i, {\n\t\tget: t[i],\n\t\tenumerable: !0\n\t});\n\treturn n || e(r, Symbol.toStringTag, { value: \"Module\" }), r;\n};\n//#endregion\n//#region src/persistence.ts\nfunction n(e) {\n\treturn Array.isArray(e) ? e.filter((e) => e != null) : [];\n}\nfunction r(e) {\n\tlet t = [...e];\n\tfor (let e = t.length - 1; e > 0; e--) {\n\t\tlet n = Math.floor(Math.random() * (e + 1));\n\t\t[t[e], t[n]] = [t[n], t[e]];\n\t}\n\treturn t;\n}\nfunction i(e) {\n\treturn e == null ? !0 : Array.isArray(e) ? e.length === 0 : typeof e == \"object\" ? Object.keys(e).length === 0 : !1;\n}\nasync function a(e, t, a, o = \"value\") {\n\tlet s = n(t?.data?.shuffledValues ?? t?.shuffledValues ?? []);\n\tif (!t) {\n\t\tconsole.warn(\"Unable to save shuffled choices because there's no session.\");\n\t\treturn;\n\t}\n\tif (!i(s)) return n(s.map((t) => e.find((e) => e[o] === t)));\n\tlet c = r(e);\n\tif (a && typeof a == \"function\") try {\n\t\tlet e = n(c.map((e) => e[o]));\n\t\ti(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(c)}, key: ${o}`) : t.id && t.element && await a(t.id, t.element, { shuffledValues: e });\n\t} catch (e) {\n\t\tconsole.warn(\"Unable to save shuffled order for choices\"), console.error(e);\n\t}\n\telse console.warn(\"Unable to save shuffled choices, shuffle will happen every time.\");\n\treturn c;\n}\nfunction o(e, t, n) {\n\treturn !!(e.lockChoiceOrder || n[\"@pie-element\"]?.lockChoiceOrder || (n.role ?? \"student\") === \"instructor\");\n}\n//#endregion\n//#region src/partial-scoring.ts\nvar s = /* @__PURE__ */ t({ enabled: () => c });\nfunction c(e, t, n) {\n\treturn e?.partialScoring === !1 || t?.partialScoring === !1 ? !1 : typeof n == \"boolean\" ? n : !0;\n}\n//#endregion\nexport { a as getShuffledChoices, o as lockChoices, s as partialScoring };\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/graphing/controller/src/index.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport debug from 'debug';\n\nimport { cloneDeep, isEmpty, uniqWith } from '@pie-element/shared-lodash';\nimport defaults from './defaults.js';\nimport { equalMarks, equalPointWithLabel, sortedAnswers } from './utils.js';\n\nimport { partialScoring } from '@pie-element/shared-controller-utils';\n\nconst log = debug('@pie-element:graphing:controller');\n\nconst initializeGraphMap = () => ({\n point: [],\n segment: [],\n line: [],\n ray: [],\n vector: [],\n polygon: [],\n circle: [],\n sine: [],\n parabola: [],\n absolute: [],\n exponential: [],\n});\n\nconst graphObjectsOrder = {\n incorrect: 0,\n correct: 1,\n missing: 2,\n};\n\nexport const compareMarks = (mark1, mark2) => {\n // marks can be compared with equalMarks[type] function only if they have the same type;\n // if type is different, they are clearly not equal\n return !!(\n mark1 &&\n mark2 &&\n mark1.type === mark2.type &&\n equalMarks[mark1.type] &&\n equalMarks[mark1.type](mark1, mark2)\n );\n};\n\nexport const comparLabelMarks = (mark1, mark2) => {\n return mark1.label === mark2.label ? 'correct' : 'incorrect';\n};\n\nexport const getAnswerCorrected = ({ sessionAnswers, marks: correctAnswers, withPointLabel = false }) => {\n sessionAnswers = sessionAnswers || [];\n correctAnswers = correctAnswers || [];\n\n const rez = cloneDeep(sessionAnswers).reduce((correctedAnswer, answer) => {\n const answerIsCorrect = correctAnswers.find((mark) => compareMarks(answer, mark));\n\n // For scoring points, check if both position AND label match\n const isCorrectForScoring = answerIsCorrect && answer.type === 'point' && withPointLabel \n ? equalPointWithLabel(answer, answerIsCorrect)\n : !!answerIsCorrect;\n\n answer.correctness = isCorrectForScoring ? 'correct' : 'incorrect';\n if (answerIsCorrect) {\n answer.correctnesslabel = comparLabelMarks(answer, answerIsCorrect);\n answer.correctlabel = answerIsCorrect.label ? answerIsCorrect.label : '';\n answer.label = answer.label ? answer.label : '';\n }\n return [...correctedAnswer, answer];\n }, []);\n\n // add missing objects from correct answer\n const missingAnswers = cloneDeep(correctAnswers).reduce((correctedAnswer, answer) => {\n const answerIndex = sessionAnswers.find((mark) => compareMarks(answer, mark));\n\n if (!answerIndex) {\n // means that corrected answer is missing from session, so we mark it as missing object\n return [...correctedAnswer, { ...answer, correctness: 'missing' }];\n }\n\n return correctedAnswer;\n }, []);\n\n return [...rez, ...missingAnswers];\n};\n\nconst getPartialScoring = ({ scoringType, env }) => {\n let pS = scoringType;\n\n // if scoringType is undefined, partialScoring should be considered undefined (not set)\n // because partialScoring.enabled is using that information\n // if it has a value, we check if it is partial scoring or dichotomous\n if (scoringType) {\n pS = scoringType === 'partial scoring';\n }\n\n return partialScoring.enabled({ partialScoring: pS }, env);\n};\n\nexport const getBestAnswer = (question, session, env = {}) => {\n // questionPossibleAnswers contains all possible answers (correct response and alternates);\n let { answers: questionPossibleAnswers = {}, scoringType } = question || {};\n let { answer } = session || {};\n\n // filter the incomplete objects\n Object.entries(questionPossibleAnswers || {}).forEach(\n ([key, value]) =>\n (questionPossibleAnswers[key] = { ...value, marks: value?.marks.filter((mark) => !mark.building) }),\n );\n\n // initialize answer if no values\n answer = answer || [];\n\n //filter the incomplete objects for student response - Fix for SC-33160\n answer = answer.filter((mark) => !mark.building);\n\n // initialize one possible answer if no values\n if (isEmpty(questionPossibleAnswers)) {\n questionPossibleAnswers = { correctAnswer: initializeGraphMap() };\n } else {\n questionPossibleAnswers = {\n correctAnswer: questionPossibleAnswers.correctAnswer,\n ...sortedAnswers(questionPossibleAnswers),\n };\n }\n\n const partialScoringEnabled = getPartialScoring({ scoringType, env });\n\n // student's answers without DUPLICATES\n const sessionAnswers = uniqWith(answer, compareMarks);\n // array of possible answers entries\n const possibleAnswers = Object.entries(questionPossibleAnswers);\n\n return possibleAnswers.reduce(\n (acc, entry) => {\n // iterating each possible answer (main + alternates)\n const possibleAnswerKey = entry[0];\n const possibleAnswer = entry[1] || {};\n let { marks } = possibleAnswer;\n\n if (!marks || !marks.length) {\n return acc;\n }\n\n // returns array of marks, each having 'correctness' property\n const correctedAnswer = getAnswerCorrected({ sessionAnswers, marks });\n const correctedAnswerWithLabels = getAnswerCorrected({ sessionAnswers, marks, withPointLabel: true });\n const correctMarks = correctedAnswerWithLabels.filter((answer) => answer.correctness === 'correct');\n // filter out missing objects because they do not affect the calculation of the score\n // only correct and incorrect are needed\n const scoredCorrectedAnswer = correctedAnswerWithLabels.filter((answer) => answer.correctness !== 'missing');\n\n const maxScore = marks.length;\n let score = correctMarks.length;\n\n // if extra placements\n if (scoredCorrectedAnswer.length > maxScore) {\n score -= scoredCorrectedAnswer.length - maxScore;\n }\n\n if (score < 0) {\n score = 0;\n }\n\n if (score / maxScore > acc.bestScore || !acc.foundOneSolution) {\n if (partialScoringEnabled) {\n acc.bestScore = parseFloat((score / maxScore).toFixed(2));\n } else {\n acc.bestScore = Math.floor(score / maxScore);\n }\n\n acc.bestScoreAnswerKey = possibleAnswerKey;\n acc.answersCorrected = correctedAnswer;\n acc.foundOneSolution = true;\n }\n\n return acc;\n },\n {\n bestScore: 0,\n bestScoreAnswerKey: null,\n // initially we just suppose all the answers are incorrect\n answersCorrected: cloneDeep(sessionAnswers).map((answer) => ({ ...answer, correctness: 'incorrect' })),\n foundOneSolution: false,\n },\n );\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport function model(question, session, env) {\n return new Promise((resolve) => {\n const normalizedQuestion = normalize(question);\n\n // added a sanity check for session for environments where it is not passed initially (ex. pie-website)\n if (session === undefined || session === null) {\n session = {};\n }\n // console.log('normalizedQuestion', normalizedQuestion);\n const { defaultTool, extraCSSRules, prompt, promptEnabled, graph, answers, toolbarTools, ...questionProps } =\n normalizedQuestion || {};\n let { arrows } = normalizedQuestion;\n const { mode, role } = env || {};\n\n // This is used for offering support for old models which have the property arrows: boolean\n // Same thing is set in authoring : packages/graphing/configure/src/configure.jsx - componentDidMount\n if (typeof arrows === 'boolean') {\n if (arrows) {\n arrows = {\n left: true,\n right: true,\n up: true,\n down: true,\n };\n } else {\n arrows = {\n left: false,\n right: false,\n up: false,\n down: false,\n };\n }\n }\n\n // added support for models without defaultTool defined; also used in packages/graphing/configure/src/index.js\n const toolbarToolsNoLabel = (toolbarTools || []).filter((tool) => tool !== 'label');\n const normalizedDefaultTool = defaultTool || (toolbarToolsNoLabel.length && toolbarToolsNoLabel[0]) || '';\n\n const base = {\n ...questionProps,\n answers,\n arrows,\n defaultTool: normalizedDefaultTool,\n disabled: env.mode !== 'gather',\n prompt: promptEnabled ? prompt : null,\n rationale: null,\n size: graph,\n showKeyLegend: env.mode === 'evaluate',\n showToggle:\n env.mode === 'evaluate' &&\n !isEmpty(answers) &&\n answers.correctAnswer &&\n answers.correctAnswer.marks &&\n !isEmpty(answers.correctAnswer.marks),\n teacherInstructions: null,\n toolbarTools,\n extraCSSRules,\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n const { rationale, rationaleEnabled, teacherInstructions, teacherInstructionsEnabled } = normalizedQuestion || {};\n\n base.rationale = rationaleEnabled ? rationale : null;\n base.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n }\n\n if (mode === 'evaluate') {\n if (\n !isEmpty(answers) &&\n answers.correctAnswer &&\n answers.correctAnswer.marks &&\n !isEmpty(answers.correctAnswer.marks)\n ) {\n const { answersCorrected, bestScoreAnswerKey, bestScore } = getBestAnswer(normalizedQuestion, session, env);\n // array of marks from session with 'correctness' property set\n base.answersCorrected = answersCorrected.sort(\n (a, b) => graphObjectsOrder[a.correctness] - graphObjectsOrder[b.correctness],\n );\n base.correctResponse = bestScoreAnswerKey ? (answers[bestScoreAnswerKey] || {}).marks : [];\n base.showToggle = base.showToggle && bestScore !== 1;\n } else {\n base.answersCorrected = (session && session.answer) || [];\n base.correctResponse = [];\n }\n }\n\n log('base: ', base);\n resolve(base);\n });\n}\n\n /**\n * Generates detailed trace log for scoring evaluation\n * @param {Object} model - the question model\n * @param {Object} session - the student session\n * @param {Object} env - the environment\n * @returns {Array} traceLog - array of trace messages\n */\nexport const getLogTrace = (question, session, env) => {\n const traceLog = [];\n const { answers = {}, scoringType } = question || {};\n const studentMarks = (session && session.answer) || [];\n\n if (!studentMarks.length) {\n return ['Student did not interact with the graph.'];\n }\n\n traceLog.push(`Student added ${studentMarks.length} object(s) to the graph.`);\n\n const partialScoringEnabled = getPartialScoring({ scoringType, env });\n\n const {\n answersCorrected,\n bestScore,\n bestScoreAnswerKey,\n } = getBestAnswer(question, session, env);\n\n const correctResponse =\n bestScoreAnswerKey && answers[bestScoreAnswerKey]\n ? answers[bestScoreAnswerKey].marks || []\n : [];\n\n let correctCount = 0;\n let incorrectCount = 0;\n let missingCount = 0;\n\n for (let i = 0; i < answersCorrected.length; i++) {\n const c = answersCorrected[i].correctness;\n if (c === 'correct') correctCount++;\n else if (c === 'incorrect') incorrectCount++;\n else if (c === 'missing') missingCount++;\n }\n\n if (correctCount > 0) {\n traceLog.push(`Correct objects: ${correctCount}.`);\n }\n\n if (incorrectCount > 0) {\n traceLog.push(`Incorrect objects: ${incorrectCount}.`);\n }\n\n if (missingCount > 0) {\n traceLog.push(`Missing required objects: ${missingCount}.`);\n }\n\n answersCorrected.forEach((mark, index) => {\n const objectType = mark.type || 'graph object';\n const objectLabel = mark.label ? `'${mark.label}'` : '';\n const objectIndex = `with index ${index + 1}`;\n\n if (mark.correctness === 'correct') {\n traceLog.push(\n `${objectType.charAt(0).toUpperCase() + objectType.slice(1)} ${objectLabel || objectIndex} is correct.`\n );\n }\n\n if (mark.correctness === 'incorrect') {\n traceLog.push(\n `${objectType.charAt(0).toUpperCase() + objectType.slice(1)} ${objectLabel || objectIndex} does not match the expected ${objectType}.`\n );\n }\n\n if (mark.correctness === 'missing') {\n traceLog.push(`Expected ${objectType} ${objectLabel || objectIndex} was not plotted by the student.`);\n }\n });\n\n if (studentMarks.length > correctResponse.length) {\n const extra = studentMarks.length - correctResponse.length;\n traceLog.push(`${extra} extra object(s) were plotted and are penalized in scoring.`);\n }\n\n if (partialScoringEnabled) {\n traceLog.push('Score calculated using partial scoring.');\n } else {\n traceLog.push('Score calculated using all-or-nothing scoring.');\n }\n\n traceLog.push(`Final score: ${bestScore}.`);\n\n return traceLog;\n};\n\n\nexport function outcome(question, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true, logTrace: ['Student did not interact with the graph.'] });\n }\n\n if (\n env.mode !== 'evaluate' ||\n isEmpty(question.answers) ||\n (question.answers && question.answers.correctAnswer && isEmpty(question.answers.correctAnswer.marks))\n ) {\n resolve({ score: 0, empty: true, logTrace: ['Student did not interact with the graph.'] });\n }\n\n const { bestScore } = getBestAnswer(question, session, env);\n\n resolve({ score: bestScore, empty: false, logTrace: getLogTrace(question, session, env) });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { answers } = question || {};\n let marks = [];\n\n if (answers && Object.values(answers)) {\n const correctAnswer = answers.correctAnswer || Object.values(answers)[0] || {};\n marks = correctAnswer.marks || [];\n }\n\n resolve({\n answer: marks,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { answers, toolbarTools } = model;\n const errors = {};\n const correctAnswerErrors = {};\n const toolbarToolsNoLabel = (toolbarTools || []).filter((tool) => tool !== 'label');\n\n if (!toolbarToolsNoLabel.length) {\n errors.toolbarToolsError = 'There should be at least 1 tool defined.';\n }\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n Object.entries(answers || {}).forEach(([key, value]) => {\n if (!value.marks.length) {\n correctAnswerErrors[key] = 'At least 1 graph object should be defined.';\n }\n\n // check if all graph objects are correctly defined with respect to root, edge and from, to\n if (value.marks.length > 0) {\n value.marks.forEach((mark) => {\n if (mark.building) {\n correctAnswerErrors[key] = 'At least 1 graph object is not correctly defined.';\n }\n });\n }\n });\n\n if (!isEmpty(correctAnswerErrors)) {\n errors.correctAnswerErrors = correctAnswerErrors;\n }\n\n return errors;\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { et as e } from "../dist-eInAO7us.js";
2
- import { D as t, E as n, O as r, P as i, T as a, nt as o, o as s, st as c, t as l, tt as u, vt as d, w as f, yt as p, z as m } from "../container-Bg6U_CJ-.js";
1
+ import { R as e } from "../dist-BrN2xZtM.js";
2
+ import { D as t, E as n, O as r, P as i, T as a, gt as o, ht as s, it as c, nt as l, o as u, t as d, tt as f, w as p, z as m } from "../container-DaIvr1Vu.js";
3
3
  import h, { useRef as g } from "react";
4
4
  import { createRoot as _ } from "react-dom/client";
5
5
  import { jsx as v, jsxs as y } from "react/jsx-runtime";
@@ -34,7 +34,7 @@ var b = class e extends CustomEvent {
34
34
  }
35
35
  }), this.component = t, this.complete = n;
36
36
  }
37
- }, x = /* @__PURE__ */ e(d(), 1), S = ({ bgFill: e, fgFill: t }) => /* @__PURE__ */ y("svg", {
37
+ }, x = /* @__PURE__ */ e(s(), 1), S = ({ bgFill: e, fgFill: t }) => /* @__PURE__ */ y("svg", {
38
38
  preserveAspectRatio: "xMinYMin meet",
39
39
  version: "1.1",
40
40
  viewBox: "-283 359 34 35",
@@ -126,7 +126,7 @@ T.propTypes = {
126
126
  //#endregion
127
127
  //#region ../../lib-react/graphing/dist/key-legend.js
128
128
  var E = c("div")(() => ({
129
- backgroundColor: o.defaults.WHITE,
129
+ backgroundColor: l.defaults.WHITE,
130
130
  padding: "20px",
131
131
  width: "355px",
132
132
  boxShadow: "0px 1px 5px 0px #9297A6"
@@ -386,7 +386,7 @@ var j = "height ease-in 300ms, opacity ease-in 300ms", M = c("div")(() => ({
386
386
  }
387
387
  })), N = (e) => {
388
388
  let { show: t, children: n, className: r } = e, i = g(null);
389
- return /* @__PURE__ */ v(u, {
389
+ return /* @__PURE__ */ v(f, {
390
390
  nodeRef: i,
391
391
  in: t,
392
392
  appear: !0,
@@ -418,28 +418,28 @@ function P(e) {
418
418
  function F(e, t) {
419
419
  return !e || P(e) ? e : P(e.default) ? e.default : t && P(e[t]) ? e[t] : t && P(e[t]?.default) ? e[t].default : e;
420
420
  }
421
- var I = F(t, "Readable") || F(z.Readable, "Readable"), L = f, R = L.default, z = R && typeof R == "object" ? R : L, { translator: B } = s, V = {
421
+ var ee = F(t, "Readable") || F(R.Readable, "Readable"), I = p, L = I.default, R = L && typeof L == "object" ? L : I, { translator: z } = u, B = {
422
422
  WebkitTouchCallout: "none",
423
423
  WebkitUserSelect: "none",
424
424
  KhtmlUserSelect: "none",
425
425
  MozUserSelect: "none",
426
426
  msUserSelect: "none",
427
427
  userSelect: "none"
428
- }, H = c("div")(() => ({
428
+ }, V = c("div")(() => ({
429
429
  width: "100%",
430
430
  cursor: "pointer"
431
- })), U = c("div")(() => ({
431
+ })), H = c("div")(() => ({
432
432
  margin: "0 auto",
433
433
  textAlign: "center",
434
434
  display: "flex"
435
- })), ee = c("div")(() => ({
435
+ })), U = c("div")(() => ({
436
436
  width: "fit-content",
437
437
  minWidth: "140px",
438
438
  alignSelf: "center",
439
439
  verticalAlign: "middle",
440
- color: `var(--correct-answer-toggle-label-color, ${o.text()})`,
440
+ color: `var(--correct-answer-toggle-label-color, ${l.text()})`,
441
441
  fontWeight: "normal",
442
- ...V
442
+ ...B
443
443
  })), W = c("div")(() => ({
444
444
  position: "absolute",
445
445
  width: "25px",
@@ -477,8 +477,8 @@ var I = F(t, "Readable") || F(z.Readable, "Readable"), L = f, R = L.default, z =
477
477
  constructor(t) {
478
478
  super(t), this.state = { show: t.show }, this.openIconRef = h.createRef(), this.closedIconRef = h.createRef(), e.defaultProps = {
479
479
  ...e.defaultProps,
480
- showMessage: B.t("common:showCorrectAnswer", { lng: t.language }),
481
- hideMessage: B.t("common:hideCorrectAnswer", { lng: t.language })
480
+ showMessage: z.t("common:showCorrectAnswer", { lng: t.language }),
481
+ hideMessage: z.t("common:hideCorrectAnswer", { lng: t.language })
482
482
  };
483
483
  }
484
484
  onClick() {
@@ -490,20 +490,20 @@ var I = F(t, "Readable") || F(z.Readable, "Readable"), L = f, R = L.default, z =
490
490
  UNSAFE_componentWillReceiveProps(t) {
491
491
  this.setState({ show: t.show }), t.language !== this.props?.language && (e.defaultProps = {
492
492
  ...e.defaultProps,
493
- showMessage: B.t("common:showCorrectAnswer", { lng: t.language }),
494
- hideMessage: B.t("common:hideCorrectAnswer", { lng: t.language })
493
+ showMessage: z.t("common:showCorrectAnswer", { lng: t.language }),
494
+ hideMessage: z.t("common:hideCorrectAnswer", { lng: t.language })
495
495
  });
496
496
  }
497
497
  render() {
498
498
  let { className: e, toggled: t, hideMessage: n, showMessage: r } = this.props;
499
- return /* @__PURE__ */ v(H, {
499
+ return /* @__PURE__ */ v(V, {
500
500
  className: e,
501
501
  children: /* @__PURE__ */ v(N, {
502
502
  show: this.state.show,
503
- children: /* @__PURE__ */ y(U, {
503
+ children: /* @__PURE__ */ y(H, {
504
504
  onClick: this.onClick.bind(this),
505
505
  onTouchEnd: this.onTouch.bind(this),
506
- children: [/* @__PURE__ */ y(te, { children: [/* @__PURE__ */ v(u, {
506
+ children: [/* @__PURE__ */ y(te, { children: [/* @__PURE__ */ v(f, {
507
507
  nodeRef: this.openIconRef,
508
508
  timeout: 400,
509
509
  in: t,
@@ -518,7 +518,7 @@ var I = F(t, "Readable") || F(z.Readable, "Readable"), L = f, R = L.default, z =
518
518
  ref: this.openIconRef,
519
519
  children: /* @__PURE__ */ v(T, { open: t }, "correct-open")
520
520
  })
521
- }), /* @__PURE__ */ v(u, {
521
+ }), /* @__PURE__ */ v(f, {
522
522
  nodeRef: this.closedIconRef,
523
523
  timeout: 5e3,
524
524
  in: !t,
@@ -533,9 +533,9 @@ var I = F(t, "Readable") || F(z.Readable, "Readable"), L = f, R = L.default, z =
533
533
  ref: this.closedIconRef,
534
534
  children: /* @__PURE__ */ v(T, { open: t }, "correct-closed")
535
535
  })
536
- })] }), /* @__PURE__ */ v(I, {
536
+ })] }), /* @__PURE__ */ v(ee, {
537
537
  false: !0,
538
- children: /* @__PURE__ */ v(ee, {
538
+ children: /* @__PURE__ */ v(U, {
539
539
  "aria-hidden": !this.state.show,
540
540
  children: t ? n : r
541
541
  })
@@ -553,10 +553,10 @@ function G(e) {
553
553
  function K(e, t) {
554
554
  return !e || G(e) ? e : G(e.default) ? e.default : t && G(e[t]) ? e[t] : t && G(e[t]?.default) ? e[t].default : e;
555
555
  }
556
- var re = K(i, "UiLayout") || K(Z.UiLayout, "UiLayout"), q = K(r, "PreviewPrompt") || K(Z.PreviewPrompt, "PreviewPrompt"), J = K(m, "Collapsible") || K(Z.Collapsible, "Collapsible"), Y = f, X = Y.default, Z = X && typeof X == "object" ? X : Y, ie = c(re)({
557
- color: o.text(),
558
- backgroundColor: o.background()
559
- }), ae = c(J)(({ theme: e }) => ({ marginBottom: e.spacing(2) })), Q = c(l)(({ theme: e }) => ({
556
+ var re = K(i, "UiLayout") || K(Z.UiLayout, "UiLayout"), q = K(r, "PreviewPrompt") || K(Z.PreviewPrompt, "PreviewPrompt"), J = K(m, "Collapsible") || K(Z.Collapsible, "Collapsible"), Y = p, X = Y.default, Z = X && typeof X == "object" ? X : Y, ie = c(re)({
557
+ color: l.text(),
558
+ backgroundColor: l.background()
559
+ }), ae = c(J)(({ theme: e }) => ({ marginBottom: e.spacing(2) })), Q = c(d)(({ theme: e }) => ({
560
560
  marginTop: e.spacing(2),
561
561
  marginBottom: e.spacing(2)
562
562
  })), $ = class extends h.Component {
@@ -670,7 +670,7 @@ var re = K(i, "UiLayout") || K(Z.UiLayout, "UiLayout"), q = K(r, "PreviewPrompt"
670
670
  onAnswersChange: this.changeAnswers
671
671
  });
672
672
  this._root ||= _(this), this._root.render(e), queueMicrotask(() => {
673
- p(this);
673
+ o(this);
674
674
  });
675
675
  }
676
676
  disconnectedCallback() {