cubing 0.22.0 → 0.24.0-pre2

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 (1061) hide show
  1. package/README.md +5 -8
  2. package/alg/package.json +1 -3
  3. package/bluetooth/package.json +1 -3
  4. package/dist/esm/{2x2x2.kpuzzle.json-JOGUSQ4N.js → 2x2x2.kpuzzle.json-U5KOZCMU.js} +11 -11
  5. package/dist/esm/2x2x2.kpuzzle.json-U5KOZCMU.js.map +7 -0
  6. package/{src/cubing/search/inside/solve/puzzles/2x2x2.sgs.json.ts → dist/esm/2x2x2.sgs.json-UAYPCQVL.js} +21 -13
  7. package/dist/esm/2x2x2.sgs.json-UAYPCQVL.js.map +7 -0
  8. package/dist/esm/{3d-3WQVOHX5.js → 3d-NFF7OGTI.js} +4 -4
  9. package/dist/esm/{3d-3WQVOHX5.js.map → 3d-NFF7OGTI.js.map} +0 -0
  10. package/dist/esm/bluetooth/index.d.ts +1 -1
  11. package/dist/esm/bluetooth/index.js +46 -38
  12. package/dist/esm/bluetooth/index.js.map +3 -3
  13. package/dist/esm/chunk-27KJGD3S.js +84 -0
  14. package/dist/esm/chunk-27KJGD3S.js.map +7 -0
  15. package/dist/esm/chunk-37EHU3GZ.js +66 -0
  16. package/dist/esm/chunk-37EHU3GZ.js.map +7 -0
  17. package/dist/esm/chunk-7OPCF2OL.js +274 -0
  18. package/dist/esm/chunk-7OPCF2OL.js.map +7 -0
  19. package/dist/esm/chunk-BJIOROQC.js +18 -0
  20. package/dist/esm/chunk-BJIOROQC.js.map +7 -0
  21. package/dist/{bin/puzzle-geometry-bin.js → esm/chunk-J2U2GRS4.js} +104 -1488
  22. package/dist/esm/chunk-J2U2GRS4.js.map +7 -0
  23. package/dist/esm/chunk-KCRFOAR4.js +122 -0
  24. package/dist/esm/chunk-KCRFOAR4.js.map +7 -0
  25. package/{src/cubing/search/inside/solve/puzzles/pyraminx.sgs.json.ts → dist/esm/chunk-NPK6Z4AU.js} +22 -17
  26. package/dist/esm/chunk-NPK6Z4AU.js.map +7 -0
  27. package/dist/esm/chunk-NV5ESXTN.js +505 -0
  28. package/dist/esm/chunk-NV5ESXTN.js.map +7 -0
  29. package/dist/esm/{chunk-DLN5QS4V.js → chunk-REMJV2GO.js} +38 -51
  30. package/dist/esm/chunk-REMJV2GO.js.map +7 -0
  31. package/dist/esm/chunk-TB4D4E2W.js +226 -0
  32. package/dist/esm/chunk-TB4D4E2W.js.map +7 -0
  33. package/dist/esm/chunk-TNRZDNGH.js +822 -0
  34. package/dist/esm/chunk-TNRZDNGH.js.map +7 -0
  35. package/{src/cubing/search/inside/solve/puzzles/megaminx.sgs.json.ts → dist/esm/chunk-YN7E5RGM.js} +36 -24
  36. package/dist/esm/chunk-YN7E5RGM.js.map +7 -0
  37. package/dist/esm/{chunk-HXKINJ7U.js → chunk-ZLIK3DZT.js} +79 -57
  38. package/dist/esm/chunk-ZLIK3DZT.js.map +7 -0
  39. package/dist/esm/{clock.kpuzzle.json-EKWRMHJM.js → clock.kpuzzle.json-J3YBOI3G.js} +7 -45
  40. package/dist/esm/clock.kpuzzle.json-J3YBOI3G.js.map +7 -0
  41. package/dist/esm/entry-PHAJAE4E.js +536 -0
  42. package/dist/esm/entry-PHAJAE4E.js.map +7 -0
  43. package/dist/esm/esm-test-worker.js +3 -14
  44. package/dist/esm/esm-test-worker.js.map +3 -3
  45. package/dist/esm/fto.sgs.json-VO6HST2V.js +641 -0
  46. package/dist/esm/fto.sgs.json-VO6HST2V.js.map +7 -0
  47. package/{src/cubing/search/inside/solve/vendor/min2phase/gwt.js → dist/esm/gwt-B7CBESZR.js} +350 -1380
  48. package/dist/esm/gwt-B7CBESZR.js.map +7 -0
  49. package/dist/esm/kpuzzle/index.js +5 -35
  50. package/dist/esm/megaminx.sgs.json-R3MK4HXM.js +16 -0
  51. package/dist/esm/megaminx.sgs.json-R3MK4HXM.js.map +7 -0
  52. package/dist/esm/module-entry-UYTOFYBC.js +18 -0
  53. package/dist/esm/module-entry-UYTOFYBC.js.map +7 -0
  54. package/dist/esm/{node-BSAQKO3G.js → node-SP4L2AKI.js} +2 -2
  55. package/dist/esm/{node-BSAQKO3G.js.map → node-SP4L2AKI.js.map} +1 -1
  56. package/dist/esm/{node-WEHVBEKP.js → node-W3AD4HBK.js} +3 -2
  57. package/dist/esm/node-W3AD4HBK.js.map +7 -0
  58. package/dist/esm/protocol/index.js +2 -1
  59. package/dist/esm/puzzle-geometry/index.js +15 -4053
  60. package/dist/esm/puzzle-geometry/index.js.map +3 -3
  61. package/dist/esm/puzzles/index.js +4 -4
  62. package/dist/esm/pyraminx.sgs.json-R3J3JHMV.js +14 -0
  63. package/dist/esm/pyraminx.sgs.json-R3J3JHMV.js.map +7 -0
  64. package/dist/esm/scramble/index.js +5 -3
  65. package/{src/cubing/search/inside/solve/vendor/cstimer/src/js/scramble/scramble_444.ts → dist/esm/scramble_444-F3YANDPO.js} +367 -586
  66. package/dist/esm/scramble_444-F3YANDPO.js.map +7 -0
  67. package/{src/cubing/search/inside/solve/vendor/sq12phase/scramble_sq1.js → dist/esm/scramble_sq1-PQ2AYBFW.js} +143 -290
  68. package/dist/esm/scramble_sq1-PQ2AYBFW.js.map +7 -0
  69. package/dist/esm/search/index.js +7 -4
  70. package/dist/esm/skewb.sgs.json-T6CO36WU.js +16 -0
  71. package/dist/esm/skewb.sgs.json-T6CO36WU.js.map +7 -0
  72. package/dist/esm/{sq1-hyperorbit.kpuzzle.json-N3FGCPML.js → sq1-hyperorbit.kpuzzle.json-AWDGN4ZW.js} +6 -6
  73. package/dist/esm/sq1-hyperorbit.kpuzzle.json-AWDGN4ZW.js.map +7 -0
  74. package/dist/esm/twisty/index.js +342 -231
  75. package/dist/esm/twisty/index.js.map +3 -3
  76. package/dist/esm/worker-inside-generated-string-6YDSDSRJ.js +3447 -0
  77. package/dist/esm/worker-inside-generated-string-6YDSDSRJ.js.map +7 -0
  78. package/dist/{esm → types}/.DS_Store +0 -0
  79. package/dist/types/alg/Alg.d.ts +0 -1
  80. package/dist/types/alg/Alg.spec.d.ts +0 -1
  81. package/dist/types/alg/AlgBuilder.d.ts +0 -1
  82. package/dist/types/alg/Serializable.d.ts +0 -1
  83. package/dist/types/alg/common.d.ts +0 -1
  84. package/dist/types/alg/debug.d.ts +0 -1
  85. package/dist/types/alg/example.d.ts +0 -1
  86. package/dist/types/alg/index.d.ts +0 -1
  87. package/dist/types/alg/is.d.ts +0 -1
  88. package/dist/types/alg/iteration.d.ts +0 -1
  89. package/dist/types/alg/keyboard.d.ts +0 -1
  90. package/dist/types/alg/limits.d.ts +0 -1
  91. package/dist/types/alg/operation.d.ts +0 -1
  92. package/dist/types/alg/operation.spec.d.ts +0 -1
  93. package/dist/types/alg/parse.d.ts +0 -1
  94. package/dist/types/alg/parse.spec.d.ts +0 -1
  95. package/dist/types/alg/test/alg-comparison.d.ts +0 -1
  96. package/dist/types/alg/test/alg.spec.d.ts +0 -1
  97. package/dist/types/alg/traversal.d.ts +0 -1
  98. package/dist/types/alg/units/QuantumWithAmount.d.ts +0 -1
  99. package/dist/types/alg/units/Unit.d.ts +0 -1
  100. package/dist/types/alg/units/containers/Commutator.d.ts +0 -1
  101. package/dist/types/alg/units/containers/Conjugate.d.ts +0 -1
  102. package/dist/types/alg/units/containers/Grouping.d.ts +0 -1
  103. package/dist/types/alg/units/index.d.ts +0 -1
  104. package/dist/types/alg/units/leaves/LineComment.d.ts +0 -1
  105. package/dist/types/alg/units/leaves/LineComment.spec.d.ts +0 -1
  106. package/dist/types/alg/units/leaves/Move.d.ts +0 -1
  107. package/dist/types/alg/units/leaves/Move.spec.d.ts +0 -1
  108. package/dist/types/alg/units/leaves/Newline.d.ts +0 -1
  109. package/dist/types/alg/units/leaves/Pause.d.ts +0 -1
  110. package/dist/types/alg/url.d.ts +0 -1
  111. package/dist/types/alg/url.spec.d.ts +0 -1
  112. package/dist/types/alg/validation.d.ts +0 -1
  113. package/dist/types/alg/warnOnce.d.ts +0 -1
  114. package/dist/types/bluetooth/connect/index.d.ts +0 -1
  115. package/dist/types/bluetooth/debug.d.ts +0 -1
  116. package/dist/types/bluetooth/index.d.ts +0 -1
  117. package/dist/types/bluetooth/keyboard.d.ts +5 -5
  118. package/dist/types/bluetooth/smart-puzzle/Heykube.d.ts +3 -3
  119. package/dist/types/bluetooth/smart-puzzle/bluetooth-puzzle.d.ts +3 -5
  120. package/dist/types/bluetooth/smart-puzzle/connect.d.ts +0 -1
  121. package/dist/types/bluetooth/smart-puzzle/endianness.d.ts +0 -1
  122. package/dist/types/bluetooth/smart-puzzle/gan.d.ts +5 -4
  123. package/dist/types/bluetooth/smart-puzzle/giiker.d.ts +3 -3
  124. package/dist/types/bluetooth/smart-puzzle/giiker.spec.d.ts +0 -1
  125. package/dist/types/bluetooth/smart-puzzle/gocube.d.ts +0 -1
  126. package/dist/types/bluetooth/smart-robot/GanRobot.d.ts +0 -1
  127. package/dist/types/bluetooth/smart-robot/index.d.ts +0 -1
  128. package/dist/types/bluetooth/smart-timer/GanTimer.d.ts +0 -1
  129. package/dist/types/bluetooth/smart-timer/index.d.ts +0 -1
  130. package/dist/types/bluetooth/transformer.d.ts +0 -1
  131. package/dist/types/cubing.bundle-global.d.ts +0 -1
  132. package/{src/cubing/cubing.bundle-global.ts → dist/types/cubing.bundle-global.exports.d.ts} +12 -19
  133. package/dist/types/esm-test-worker.d.ts +0 -1
  134. package/dist/types/kpuzzle/3x3x3/3x3x3.kpuzzle.json.d.ts +2 -3
  135. package/dist/types/kpuzzle/3x3x3/3x3x3.kpuzzle.json.spec.d.ts +0 -1
  136. package/dist/types/kpuzzle/3x3x3/puzzle-orientation.d.ts +4 -0
  137. package/dist/types/kpuzzle/KPuzzle.d.ts +25 -0
  138. package/dist/types/kpuzzle/KPuzzleDefinition.d.ts +20 -0
  139. package/dist/types/kpuzzle/KState.d.ts +16 -0
  140. package/dist/types/kpuzzle/KTransformation.d.ts +20 -0
  141. package/dist/types/kpuzzle/calculate.d.ts +16 -0
  142. package/dist/types/kpuzzle/combine.d.ts +3 -0
  143. package/dist/types/kpuzzle/construct.d.ts +5 -0
  144. package/dist/types/kpuzzle/index.d.ts +6 -10
  145. package/dist/types/notation/CountAnimatedLeaves.d.ts +0 -1
  146. package/dist/types/notation/CountMoves.d.ts +0 -1
  147. package/dist/types/notation/index.d.ts +0 -1
  148. package/dist/types/protocol/binary/binary3x3x3.d.ts +5 -6
  149. package/dist/types/protocol/binary/binary3x3x3.spec.d.ts +0 -1
  150. package/dist/types/protocol/binary/hex.d.ts +0 -1
  151. package/dist/types/protocol/binary/hex.spec.d.ts +0 -1
  152. package/dist/types/protocol/binary/orbit-indexing.d.ts +0 -1
  153. package/dist/types/protocol/binary/orbit-indexing.spec.d.ts +0 -1
  154. package/dist/types/protocol/binary/puzzle-orientation.d.ts +4 -5
  155. package/dist/types/protocol/index.d.ts +0 -1
  156. package/dist/types/puzzle-geometry/FaceNameSwizzler.d.ts +0 -1
  157. package/dist/types/puzzle-geometry/Options.d.ts +0 -1
  158. package/dist/types/puzzle-geometry/PGPuzzles.d.ts +0 -1
  159. package/dist/types/puzzle-geometry/PGPuzzles.spec.d.ts +0 -1
  160. package/dist/types/puzzle-geometry/Perm.d.ts +0 -1
  161. package/dist/types/puzzle-geometry/PermOriSet.d.ts +4 -5
  162. package/dist/types/puzzle-geometry/PlatonicGenerator.d.ts +0 -1
  163. package/dist/types/puzzle-geometry/PuzzleGeometry.d.ts +11 -5
  164. package/dist/types/puzzle-geometry/Quat.d.ts +0 -1
  165. package/dist/types/puzzle-geometry/Quat.spec.d.ts +0 -1
  166. package/dist/types/puzzle-geometry/SchreierSims.d.ts +0 -1
  167. package/dist/types/puzzle-geometry/index.d.ts +2 -2
  168. package/dist/types/puzzle-geometry/notation-mapping/FTONotationMapper.d.ts +0 -1
  169. package/dist/types/puzzle-geometry/notation-mapping/FaceRenamingMapper.d.ts +0 -1
  170. package/dist/types/puzzle-geometry/notation-mapping/MegaminxScramblingNotationMapper.d.ts +0 -1
  171. package/dist/types/puzzle-geometry/notation-mapping/NotationMapper.d.ts +3 -2
  172. package/dist/types/puzzle-geometry/notation-mapping/NullMapper.d.ts +0 -1
  173. package/dist/types/puzzle-geometry/notation-mapping/NxNxNCubeMapper.d.ts +0 -1
  174. package/dist/types/puzzle-geometry/notation-mapping/PyraminxNotationMapper.d.ts +0 -1
  175. package/dist/types/puzzle-geometry/notation-mapping/SkewbNotationMapper.d.ts +0 -1
  176. package/dist/types/puzzle-geometry/notation-mapping/index.d.ts +0 -1
  177. package/dist/types/puzzle-geometry/orientcenters.spec.d.ts +0 -1
  178. package/dist/types/puzzles/PuzzleLoader.d.ts +3 -3
  179. package/dist/types/puzzles/async/async-pg3d.d.ts +3 -3
  180. package/dist/types/puzzles/async/lazy-cached-kpuzzle.d.ts +2 -0
  181. package/dist/types/puzzles/customPGPuzzleLoader.d.ts +2 -3
  182. package/dist/types/puzzles/implementations/2x2x2/2x2x2.kpuzzle.json.d.ts +1 -2
  183. package/dist/types/puzzles/implementations/2x2x2/2x2x2.kpuzzle.svg.d.ts +0 -1
  184. package/dist/types/puzzles/implementations/2x2x2/index.d.ts +0 -1
  185. package/dist/types/puzzles/implementations/3x3x3/3x3x3-ll.kpuzzle.svg.d.ts +0 -1
  186. package/dist/types/puzzles/implementations/3x3x3/3x3x3.kpuzzle.svg.d.ts +0 -1
  187. package/dist/types/puzzles/implementations/3x3x3/index.d.ts +0 -1
  188. package/dist/types/puzzles/implementations/clock/clock.kpuzzle.json.d.ts +1 -2
  189. package/dist/types/puzzles/implementations/clock/clock.kpuzzle.svg.d.ts +0 -1
  190. package/dist/types/puzzles/implementations/clock/index.d.ts +0 -1
  191. package/dist/types/puzzles/implementations/fto/index.d.ts +0 -1
  192. package/dist/types/puzzles/implementations/megaminx/index.d.ts +0 -1
  193. package/dist/types/puzzles/implementations/pyraminx/index.d.ts +0 -1
  194. package/dist/types/puzzles/implementations/pyraminx/pyraminx.kpuzzle.json.d.ts +0 -1
  195. package/dist/types/puzzles/implementations/pyraminx/pyraminx.kpuzzle.svg.d.ts +0 -1
  196. package/dist/types/puzzles/implementations/square1/index.d.ts +0 -1
  197. package/dist/types/puzzles/implementations/square1/sq1-hyperorbit.kpuzzle.json.d.ts +1 -2
  198. package/dist/types/puzzles/implementations/square1/sq1-hyperorbit.kpuzzle.svg.d.ts +0 -1
  199. package/dist/types/puzzles/index.d.ts +1 -2
  200. package/dist/types/puzzles/stickerings/appearance.d.ts +6 -7
  201. package/dist/types/puzzles/stickerings/cube-stickerings.d.ts +0 -1
  202. package/dist/types/puzzles/stickerings/fto-stickerings.d.ts +0 -1
  203. package/dist/types/puzzles/stickerings/global-custom-stickering-hack.d.ts +0 -1
  204. package/dist/types/puzzles/stickerings/megaminx-stickerings.d.ts +0 -1
  205. package/dist/types/scramble/index.d.ts +0 -1
  206. package/dist/types/search/esm-test-worker.d.ts +0 -1
  207. package/dist/types/search/index.d.ts +0 -1
  208. package/dist/types/search/inside/api.d.ts +6 -7
  209. package/dist/types/search/inside/api.spec.d.ts +0 -1
  210. package/dist/types/search/inside/entry.d.ts +0 -1
  211. package/dist/types/search/inside/inside-worker.d.ts +0 -1
  212. package/dist/types/search/inside/module-entry-path-getter.d.ts +1 -0
  213. package/dist/types/search/inside/module-entry.d.ts +1 -0
  214. package/dist/types/search/inside/solve/addOrientationSuffix.d.ts +0 -1
  215. package/dist/types/search/inside/solve/parseSGS.d.ts +3 -4
  216. package/dist/types/search/inside/solve/puzzles/2x2x2.d.ts +3 -4
  217. package/dist/types/search/inside/solve/puzzles/2x2x2.sgs.json.d.ts +0 -1
  218. package/dist/types/search/inside/solve/puzzles/3x3x3/convert.d.ts +2 -3
  219. package/dist/types/search/inside/solve/puzzles/3x3x3/filter.d.ts +4 -4
  220. package/dist/types/search/inside/solve/puzzles/3x3x3/index.d.ts +3 -4
  221. package/dist/types/search/inside/solve/puzzles/3x3x3/legacy-sgs.d.ts +0 -1
  222. package/dist/types/search/inside/solve/puzzles/3x3x3-inefficient.sgs.json.d.ts +0 -1
  223. package/dist/types/search/inside/solve/puzzles/4x4x4.d.ts +2 -2
  224. package/dist/types/search/inside/solve/puzzles/5x5x5.d.ts +0 -1
  225. package/dist/types/search/inside/solve/puzzles/big-cubes.d.ts +0 -1
  226. package/dist/types/search/inside/solve/puzzles/clock.d.ts +0 -1
  227. package/dist/types/search/inside/solve/puzzles/fto.d.ts +5 -0
  228. package/dist/types/search/inside/solve/puzzles/fto.sgs.json.d.ts +2 -0
  229. package/dist/types/search/inside/solve/puzzles/megaminx.d.ts +2 -3
  230. package/dist/types/search/inside/solve/puzzles/megaminx.sgs.json.d.ts +2 -3
  231. package/dist/types/search/inside/solve/puzzles/pyraminx.d.ts +3 -4
  232. package/dist/types/search/inside/solve/puzzles/pyraminx.sgs.json.d.ts +0 -1
  233. package/dist/types/search/inside/solve/puzzles/sgs-defs.spec.d.ts +0 -1
  234. package/dist/types/search/inside/solve/puzzles/skewb.d.ts +3 -4
  235. package/dist/types/search/inside/solve/puzzles/skewb.sgs.json.d.ts +2 -3
  236. package/dist/types/search/inside/solve/puzzles/sq1.d.ts +0 -1
  237. package/dist/types/search/inside/solve/puzzles/wca-minx.d.ts +0 -1
  238. package/dist/types/search/inside/solve/tremble.d.ts +6 -6
  239. package/dist/types/search/instantiator.d.ts +1 -3
  240. package/dist/types/search/outside.d.ts +6 -7
  241. package/dist/types/search/worker-inside-generated-string.d.ts +1 -2
  242. package/dist/types/stream/index.d.ts +0 -1
  243. package/dist/types/stream/process/ReorientedStream.d.ts +1 -3
  244. package/dist/types/stream/proxy-event.d.ts +0 -1
  245. package/dist/types/stream/twizzle/TwizzleStream.d.ts +0 -1
  246. package/dist/types/stream/twizzle/stream-types.d.ts +0 -1
  247. package/dist/types/stream/websocket-proxy.d.ts +0 -1
  248. package/dist/types/twisty/controllers/AnimationTypes.d.ts +2 -3
  249. package/dist/types/twisty/controllers/RenderScheduler.d.ts +0 -1
  250. package/dist/types/twisty/controllers/TwistyAnimationController.d.ts +0 -1
  251. package/dist/types/twisty/controllers/TwistyPlayerController.d.ts +0 -1
  252. package/dist/types/twisty/controllers/easing.d.ts +0 -1
  253. package/dist/types/twisty/controllers/indexer/AlgDuration.d.ts +0 -1
  254. package/dist/types/twisty/controllers/indexer/AlgIndexer.d.ts +6 -6
  255. package/dist/types/twisty/controllers/indexer/SimpleAlgIndexer.d.ts +7 -7
  256. package/dist/types/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexer.d.ts +8 -8
  257. package/dist/types/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexerV2.d.ts +9 -9
  258. package/dist/types/twisty/controllers/indexer/simultaneous-moves/simul-moves.d.ts +0 -1
  259. package/dist/types/twisty/controllers/indexer/tree/AlgWalker.d.ts +36 -37
  260. package/dist/types/twisty/controllers/indexer/tree/TreeAlgIndexer.d.ts +7 -7
  261. package/dist/types/twisty/controllers/indexer/tree/chunkAlgs.d.ts +0 -1
  262. package/dist/types/twisty/controllers/stream/timeline-move-calculation-draft.d.ts +0 -1
  263. package/dist/types/twisty/heavy-code-imports/3d.d.ts +0 -1
  264. package/dist/types/twisty/heavy-code-imports/dynamic-entries/3d.d.ts +0 -1
  265. package/dist/types/twisty/index.d.ts +1 -2
  266. package/dist/types/twisty/model/PromiseFreshener.d.ts +0 -1
  267. package/dist/types/twisty/model/TwistyPlayerModel.d.ts +6 -7
  268. package/dist/types/twisty/model/UserVisibleErrorTracker.d.ts +0 -1
  269. package/dist/types/twisty/model/helpers.d.ts +0 -1
  270. package/dist/types/twisty/model/props/TwistyProp.d.ts +0 -1
  271. package/dist/types/twisty/model/props/TwistyProp.spec.d.ts +0 -1
  272. package/dist/types/twisty/model/props/TwistyPropDebugger.d.ts +0 -1
  273. package/dist/types/twisty/model/props/general/URLProp.d.ts +0 -1
  274. package/dist/types/twisty/model/props/puzzle/display/FoundationDisplayProp.d.ts +0 -1
  275. package/dist/types/twisty/model/props/puzzle/display/HintFaceletProp.d.ts +0 -1
  276. package/dist/types/twisty/model/props/puzzle/display/SpriteProp.d.ts +0 -1
  277. package/dist/types/twisty/model/props/puzzle/display/StickeringProp.d.ts +2 -1
  278. package/dist/types/twisty/model/props/puzzle/state/AlgProp.d.ts +0 -1
  279. package/dist/types/twisty/model/props/puzzle/state/AlgTransformationProp.d.ts +5 -8
  280. package/dist/types/twisty/model/props/puzzle/state/AnchoredStartProp.d.ts +5 -7
  281. package/dist/types/twisty/model/props/puzzle/state/CatchUpMoveProp.d.ts +0 -1
  282. package/dist/types/twisty/model/props/puzzle/state/CurrentLeavesSimplified.d.ts +0 -1
  283. package/dist/types/twisty/model/props/puzzle/state/{CurrentLeavesProp.d.ts → CurrentMoveInfoProp.d.ts} +2 -3
  284. package/dist/types/twisty/model/props/puzzle/state/CurrentStateProp.d.ts +14 -0
  285. package/dist/types/twisty/model/props/puzzle/state/IndexerConstructorProp.d.ts +7 -8
  286. package/dist/types/twisty/model/props/puzzle/state/IndexerConstructorRequestProp.d.ts +0 -1
  287. package/dist/types/twisty/model/props/puzzle/state/IndexerProp.d.ts +5 -6
  288. package/dist/types/twisty/model/props/puzzle/state/LegacyPositionProp.d.ts +2 -3
  289. package/dist/types/twisty/model/props/puzzle/state/MovePressInputProp.d.ts +6 -2
  290. package/dist/types/twisty/model/props/puzzle/state/NaiveMoveCountProp.d.ts +0 -1
  291. package/dist/types/twisty/model/props/puzzle/state/PuzzleAlgProp.d.ts +4 -5
  292. package/dist/types/twisty/model/props/puzzle/state/SetupAnchorProp.d.ts +0 -1
  293. package/dist/types/twisty/model/props/puzzle/structure/KPuzzleProp.d.ts +10 -0
  294. package/dist/types/twisty/model/props/puzzle/structure/PuzzleDescriptionProp.d.ts +0 -1
  295. package/dist/types/twisty/model/props/puzzle/structure/PuzzleIDProp.d.ts +0 -1
  296. package/dist/types/twisty/model/props/puzzle/structure/PuzzleIDRequestProp.d.ts +0 -1
  297. package/dist/types/twisty/model/props/puzzle/structure/PuzzleLoaderProp.d.ts +0 -1
  298. package/dist/types/twisty/model/props/timeline/CoarseTimelineInfoProp.d.ts +0 -1
  299. package/dist/types/twisty/model/props/timeline/DetailedTimelineInfoProp.d.ts +0 -1
  300. package/dist/types/twisty/model/props/timeline/PlayingInfoProp.d.ts +0 -1
  301. package/dist/types/twisty/model/props/timeline/TempoScaleProp.d.ts +0 -1
  302. package/dist/types/twisty/model/props/timeline/TimestampRequestProp.d.ts +0 -1
  303. package/dist/types/twisty/model/props/viewer/BackViewProp.d.ts +0 -1
  304. package/dist/types/twisty/model/props/viewer/BackgroundProp.d.ts +0 -1
  305. package/dist/types/twisty/model/props/viewer/ButtonAppearanceProp.d.ts +0 -1
  306. package/dist/types/twisty/model/props/viewer/ControlPanelProp.d.ts +0 -1
  307. package/dist/types/twisty/model/props/viewer/LatitudeLimit.d.ts +0 -1
  308. package/dist/types/twisty/model/props/viewer/OrbitCoordinatesProp.d.ts +0 -1
  309. package/dist/types/twisty/model/props/viewer/OrbitCoordinatesRequestProp.d.ts +0 -1
  310. package/dist/types/twisty/model/props/viewer/TimeRangeProp.d.ts +2 -3
  311. package/dist/types/twisty/model/props/viewer/ViewerLinkProp.d.ts +0 -1
  312. package/dist/types/twisty/model/props/viewer/VisualizationProp.d.ts +0 -1
  313. package/dist/types/twisty/model/props/viewer/VisualizationStrategyProp.d.ts +0 -1
  314. package/dist/types/twisty/views/2D/KPuzzleSVGWrapper.d.ts +17 -0
  315. package/dist/types/twisty/views/2D/Twisty2DPuzzle.css.d.ts +0 -1
  316. package/dist/types/twisty/views/2D/Twisty2DPuzzle.d.ts +4 -4
  317. package/dist/types/twisty/views/2D/Twisty2DPuzzleWrapper.d.ts +0 -1
  318. package/dist/types/twisty/views/2D/Twisty2DSceneWrapper.d.ts +0 -1
  319. package/dist/types/twisty/views/3D/DragTracker.d.ts +0 -1
  320. package/dist/types/twisty/views/3D/RendererPool.d.ts +0 -1
  321. package/dist/types/twisty/views/3D/TAU.d.ts +0 -1
  322. package/dist/types/twisty/views/3D/Twisty3DPuzzleWrapper.d.ts +0 -1
  323. package/dist/types/twisty/views/3D/Twisty3DRenderTarget.d.ts +0 -1
  324. package/dist/types/twisty/views/3D/Twisty3DScene.d.ts +0 -1
  325. package/dist/types/twisty/views/3D/Twisty3DSceneWrapper.d.ts +0 -1
  326. package/dist/types/twisty/views/3D/Twisty3DVantage.css.d.ts +0 -1
  327. package/dist/types/twisty/views/3D/Twisty3DVantage.d.ts +0 -1
  328. package/dist/types/twisty/views/3D/TwistyOrbitControls.d.ts +0 -1
  329. package/dist/types/twisty/views/3D/TwistyOrbitControls.spec.d.ts +0 -1
  330. package/dist/types/twisty/views/3D/puzzles/Cube3D.d.ts +4 -5
  331. package/dist/types/twisty/views/3D/puzzles/PG3D.d.ts +5 -6
  332. package/dist/types/twisty/views/3D/puzzles/Twisty3DPuzzle.d.ts +0 -1
  333. package/dist/types/twisty/views/ClassListManager.d.ts +0 -1
  334. package/dist/types/twisty/views/ManagedCustomElement.d.ts +0 -1
  335. package/dist/types/twisty/views/TwistyAlgEditor/LeafTokens.d.ts +0 -1
  336. package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.css.d.ts +0 -1
  337. package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.d.ts +0 -1
  338. package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.spec.d.ts +0 -1
  339. package/dist/types/twisty/views/TwistyAlgEditor/model.d.ts +0 -1
  340. package/dist/types/twisty/views/TwistyAlgViewer.css.d.ts +0 -1
  341. package/dist/types/twisty/views/TwistyAlgViewer.d.ts +0 -1
  342. package/dist/types/twisty/views/TwistyPlayer.css.d.ts +0 -1
  343. package/dist/types/twisty/views/TwistyPlayer.d.ts +0 -1
  344. package/dist/types/twisty/views/TwistyPlayerSettable.d.ts +0 -1
  345. package/dist/types/twisty/views/TwistyViewerWrapper.css.d.ts +0 -1
  346. package/dist/types/twisty/views/canvas.d.ts +0 -1
  347. package/dist/types/twisty/views/control-panel/TwistyButtonsV2.css.d.ts +0 -1
  348. package/dist/types/twisty/views/control-panel/TwistyButtonsV2.d.ts +0 -1
  349. package/dist/types/twisty/views/control-panel/TwistyScrubber.css.d.ts +0 -1
  350. package/dist/types/twisty/views/control-panel/TwistyScrubberV2.d.ts +0 -1
  351. package/dist/types/twisty/views/control-panel/webkit-fullscreen.d.ts +0 -1
  352. package/dist/types/twisty/views/document.d.ts +0 -1
  353. package/dist/types/twisty/views/node-custom-element-shims.d.ts +0 -1
  354. package/dist/types/twisty/views/screenshot.d.ts +0 -1
  355. package/dist/types/twisty/views/stream/TwistyStreamSource.css.d.ts +0 -1
  356. package/dist/types/twisty/views/stream/TwistyStreamSource.d.ts +0 -1
  357. package/{src/cubing/search → dist/types}/vendor/comlink-everywhere/inside/index.d.ts +0 -0
  358. package/dist/types/{search/vendor → vendor}/comlink-everywhere/inside/node.d.ts +0 -1
  359. package/dist/types/{search/vendor → vendor}/comlink-everywhere/outside/index.d.ts +0 -1
  360. package/dist/types/{search/vendor → vendor}/comlink-everywhere/outside/node.d.ts +0 -1
  361. package/dist/types/{search/inside/solve/vendor → vendor}/cstimer/src/js/lib/mathlib.d.ts +0 -1
  362. package/dist/types/{search/inside/solve/vendor → vendor}/cstimer/src/js/scramble/scramble_444.d.ts +1 -2
  363. package/dist/types/{search/inside/solve/vendor → vendor}/min2phase/gwt.d.ts +0 -1
  364. package/dist/types/vendor/p-lazy/p-lazy.d.ts +0 -1
  365. package/dist/types/{search/inside/solve/vendor → vendor}/random-uint-below/get-random-values.d.ts +0 -1
  366. package/dist/types/{search/inside/solve/vendor → vendor}/random-uint-below/index.d.ts +1 -2
  367. package/dist/types/{search/inside/solve/vendor → vendor}/random-uint-below/random-choice.d.ts +0 -1
  368. package/dist/types/{search/inside/solve/vendor/random-uint-below/random-int.d.ts → vendor/random-uint-below/random53BitValue.d.ts} +0 -1
  369. package/dist/types/{search/inside/solve/vendor → vendor}/sq12phase/scramble_sq1.d.ts +0 -1
  370. package/dist/types/vendor/three/examples/jsm/libs/stats.modified.module.d.ts +0 -1
  371. package/dist/types/{bluetooth/smart-puzzle → vendor/unsafe-raw-aes}/unsafe-raw-aes.d.ts +0 -1
  372. package/kpuzzle/package.json +1 -3
  373. package/notation/package.json +1 -3
  374. package/package.json +11 -17
  375. package/protocol/package.json +1 -3
  376. package/puzzle-geometry/package.json +1 -3
  377. package/puzzles/package.json +1 -3
  378. package/scramble/package.json +1 -3
  379. package/search/package.json +1 -3
  380. package/stream/package.json +1 -3
  381. package/twisty/package.json +1 -3
  382. package/alg/index.d.ts +0 -1
  383. package/bluetooth/index.d.ts +0 -1
  384. package/dist/.DS_Store +0 -0
  385. package/dist/bin/puzzle-geometry-bin.js.map +0 -7
  386. package/dist/bundle-global/cubing.bundle-global.js +0 -7419
  387. package/dist/esm/2x2x2.kpuzzle.json-JOGUSQ4N.js.map +0 -7
  388. package/dist/esm/chunk-7KI3I3Y7.js +0 -1379
  389. package/dist/esm/chunk-7KI3I3Y7.js.map +0 -7
  390. package/dist/esm/chunk-DLN5QS4V.js.map +0 -7
  391. package/dist/esm/chunk-HXKINJ7U.js.map +0 -7
  392. package/dist/esm/chunk-X6JHXPDX.js +0 -2359
  393. package/dist/esm/chunk-X6JHXPDX.js.map +0 -7
  394. package/dist/esm/clock.kpuzzle.json-EKWRMHJM.js.map +0 -7
  395. package/dist/esm/index.d.ts +0 -1
  396. package/dist/esm/node-WEHVBEKP.js.map +0 -7
  397. package/dist/esm/sq1-hyperorbit.kpuzzle.json-N3FGCPML.js.map +0 -7
  398. package/dist/esm/worker-inside-generated-string-ZA6E6672.js +0 -2831
  399. package/dist/esm/worker-inside-generated-string-ZA6E6672.js.map +0 -7
  400. package/dist/types/alg/Alg.d.ts.map +0 -1
  401. package/dist/types/alg/Alg.spec.d.ts.map +0 -1
  402. package/dist/types/alg/AlgBuilder.d.ts.map +0 -1
  403. package/dist/types/alg/Serializable.d.ts.map +0 -1
  404. package/dist/types/alg/common.d.ts.map +0 -1
  405. package/dist/types/alg/debug.d.ts.map +0 -1
  406. package/dist/types/alg/example.d.ts.map +0 -1
  407. package/dist/types/alg/index.d.ts.map +0 -1
  408. package/dist/types/alg/is.d.ts.map +0 -1
  409. package/dist/types/alg/iteration.d.ts.map +0 -1
  410. package/dist/types/alg/keyboard.d.ts.map +0 -1
  411. package/dist/types/alg/limits.d.ts.map +0 -1
  412. package/dist/types/alg/operation.d.ts.map +0 -1
  413. package/dist/types/alg/operation.spec.d.ts.map +0 -1
  414. package/dist/types/alg/parse.d.ts.map +0 -1
  415. package/dist/types/alg/parse.spec.d.ts.map +0 -1
  416. package/dist/types/alg/test/alg-comparison.d.ts.map +0 -1
  417. package/dist/types/alg/test/alg.spec.d.ts.map +0 -1
  418. package/dist/types/alg/traversal.d.ts.map +0 -1
  419. package/dist/types/alg/units/QuantumWithAmount.d.ts.map +0 -1
  420. package/dist/types/alg/units/Unit.d.ts.map +0 -1
  421. package/dist/types/alg/units/containers/Commutator.d.ts.map +0 -1
  422. package/dist/types/alg/units/containers/Conjugate.d.ts.map +0 -1
  423. package/dist/types/alg/units/containers/Grouping.d.ts.map +0 -1
  424. package/dist/types/alg/units/index.d.ts.map +0 -1
  425. package/dist/types/alg/units/leaves/LineComment.d.ts.map +0 -1
  426. package/dist/types/alg/units/leaves/LineComment.spec.d.ts.map +0 -1
  427. package/dist/types/alg/units/leaves/Move.d.ts.map +0 -1
  428. package/dist/types/alg/units/leaves/Move.spec.d.ts.map +0 -1
  429. package/dist/types/alg/units/leaves/Newline.d.ts.map +0 -1
  430. package/dist/types/alg/units/leaves/Pause.d.ts.map +0 -1
  431. package/dist/types/alg/url.d.ts.map +0 -1
  432. package/dist/types/alg/url.spec.d.ts.map +0 -1
  433. package/dist/types/alg/validation.d.ts.map +0 -1
  434. package/dist/types/alg/warnOnce.d.ts.map +0 -1
  435. package/dist/types/bluetooth/connect/index.d.ts.map +0 -1
  436. package/dist/types/bluetooth/debug.d.ts.map +0 -1
  437. package/dist/types/bluetooth/index.d.ts.map +0 -1
  438. package/dist/types/bluetooth/keyboard.d.ts.map +0 -1
  439. package/dist/types/bluetooth/smart-puzzle/Heykube.d.ts.map +0 -1
  440. package/dist/types/bluetooth/smart-puzzle/bluetooth-puzzle.d.ts.map +0 -1
  441. package/dist/types/bluetooth/smart-puzzle/connect.d.ts.map +0 -1
  442. package/dist/types/bluetooth/smart-puzzle/endianness.d.ts.map +0 -1
  443. package/dist/types/bluetooth/smart-puzzle/gan.d.ts.map +0 -1
  444. package/dist/types/bluetooth/smart-puzzle/giiker.d.ts.map +0 -1
  445. package/dist/types/bluetooth/smart-puzzle/giiker.spec.d.ts.map +0 -1
  446. package/dist/types/bluetooth/smart-puzzle/gocube.d.ts.map +0 -1
  447. package/dist/types/bluetooth/smart-puzzle/unsafe-raw-aes.d.ts.map +0 -1
  448. package/dist/types/bluetooth/smart-robot/GanRobot.d.ts.map +0 -1
  449. package/dist/types/bluetooth/smart-robot/index.d.ts.map +0 -1
  450. package/dist/types/bluetooth/smart-timer/GanTimer.d.ts.map +0 -1
  451. package/dist/types/bluetooth/smart-timer/index.d.ts.map +0 -1
  452. package/dist/types/bluetooth/transformer.d.ts.map +0 -1
  453. package/dist/types/cubing.bundle-global.d.ts.map +0 -1
  454. package/dist/types/esm-test-worker.d.ts.map +0 -1
  455. package/dist/types/kpuzzle/3x3x3/3x3x3.kpuzzle.json.d.ts.map +0 -1
  456. package/dist/types/kpuzzle/3x3x3/3x3x3.kpuzzle.json.spec.d.ts.map +0 -1
  457. package/dist/types/kpuzzle/canon.spec.d.ts +0 -2
  458. package/dist/types/kpuzzle/canon.spec.d.ts.map +0 -1
  459. package/dist/types/kpuzzle/canonicalize.d.ts +0 -55
  460. package/dist/types/kpuzzle/canonicalize.d.ts.map +0 -1
  461. package/dist/types/kpuzzle/definition_types.d.ts +0 -19
  462. package/dist/types/kpuzzle/definition_types.d.ts.map +0 -1
  463. package/dist/types/kpuzzle/index.d.ts.map +0 -1
  464. package/dist/types/kpuzzle/kpuzzle.d.ts +0 -17
  465. package/dist/types/kpuzzle/kpuzzle.d.ts.map +0 -1
  466. package/dist/types/kpuzzle/kpuzzle.spec.d.ts +0 -2
  467. package/dist/types/kpuzzle/kpuzzle.spec.d.ts.map +0 -1
  468. package/dist/types/kpuzzle/move_notation.d.ts +0 -6
  469. package/dist/types/kpuzzle/move_notation.d.ts.map +0 -1
  470. package/dist/types/kpuzzle/parser/index.d.ts +0 -2
  471. package/dist/types/kpuzzle/parser/index.d.ts.map +0 -1
  472. package/dist/types/kpuzzle/parser/parser-peggy.d.ts +0 -15
  473. package/dist/types/kpuzzle/parser/parser-peggy.d.ts.map +0 -1
  474. package/dist/types/kpuzzle/parser/parser-shim.d.ts +0 -4
  475. package/dist/types/kpuzzle/parser/parser-shim.d.ts.map +0 -1
  476. package/dist/types/kpuzzle/parser/parser.d.ts +0 -1
  477. package/dist/types/kpuzzle/parser/parser.d.ts.map +0 -1
  478. package/dist/types/kpuzzle/prunetable.spec.d.ts +0 -2
  479. package/dist/types/kpuzzle/prunetable.spec.d.ts.map +0 -1
  480. package/dist/types/kpuzzle/pruningtable.d.ts +0 -16
  481. package/dist/types/kpuzzle/pruningtable.d.ts.map +0 -1
  482. package/dist/types/kpuzzle/puzzle-orientation.d.ts +0 -5
  483. package/dist/types/kpuzzle/puzzle-orientation.d.ts.map +0 -1
  484. package/dist/types/kpuzzle/svg.d.ts +0 -18
  485. package/dist/types/kpuzzle/svg.d.ts.map +0 -1
  486. package/dist/types/kpuzzle/transformations.d.ts +0 -13
  487. package/dist/types/kpuzzle/transformations.d.ts.map +0 -1
  488. package/dist/types/kpuzzle/transformations.spec.d.ts +0 -2
  489. package/dist/types/kpuzzle/transformations.spec.d.ts.map +0 -1
  490. package/dist/types/notation/CountAnimatedLeaves.d.ts.map +0 -1
  491. package/dist/types/notation/CountMoves.d.ts.map +0 -1
  492. package/dist/types/notation/index.d.ts.map +0 -1
  493. package/dist/types/protocol/binary/binary3x3x3.d.ts.map +0 -1
  494. package/dist/types/protocol/binary/binary3x3x3.spec.d.ts.map +0 -1
  495. package/dist/types/protocol/binary/hex.d.ts.map +0 -1
  496. package/dist/types/protocol/binary/hex.spec.d.ts.map +0 -1
  497. package/dist/types/protocol/binary/orbit-indexing.d.ts.map +0 -1
  498. package/dist/types/protocol/binary/orbit-indexing.spec.d.ts.map +0 -1
  499. package/dist/types/protocol/binary/puzzle-orientation.d.ts.map +0 -1
  500. package/dist/types/protocol/index.d.ts.map +0 -1
  501. package/dist/types/puzzle-geometry/FaceNameSwizzler.d.ts.map +0 -1
  502. package/dist/types/puzzle-geometry/Options.d.ts.map +0 -1
  503. package/dist/types/puzzle-geometry/PGPuzzles.d.ts.map +0 -1
  504. package/dist/types/puzzle-geometry/PGPuzzles.spec.d.ts.map +0 -1
  505. package/dist/types/puzzle-geometry/Perm.d.ts.map +0 -1
  506. package/dist/types/puzzle-geometry/PermOriSet.d.ts.map +0 -1
  507. package/dist/types/puzzle-geometry/PlatonicGenerator.d.ts.map +0 -1
  508. package/dist/types/puzzle-geometry/PuzzleGeometry.d.ts.map +0 -1
  509. package/dist/types/puzzle-geometry/Quat.d.ts.map +0 -1
  510. package/dist/types/puzzle-geometry/Quat.spec.d.ts.map +0 -1
  511. package/dist/types/puzzle-geometry/SchreierSims.d.ts.map +0 -1
  512. package/dist/types/puzzle-geometry/index.d.ts.map +0 -1
  513. package/dist/types/puzzle-geometry/interfaces.d.ts +0 -6
  514. package/dist/types/puzzle-geometry/interfaces.d.ts.map +0 -1
  515. package/dist/types/puzzle-geometry/notation-mapping/FTONotationMapper.d.ts.map +0 -1
  516. package/dist/types/puzzle-geometry/notation-mapping/FaceRenamingMapper.d.ts.map +0 -1
  517. package/dist/types/puzzle-geometry/notation-mapping/MegaminxScramblingNotationMapper.d.ts.map +0 -1
  518. package/dist/types/puzzle-geometry/notation-mapping/NotationMapper.d.ts.map +0 -1
  519. package/dist/types/puzzle-geometry/notation-mapping/NullMapper.d.ts.map +0 -1
  520. package/dist/types/puzzle-geometry/notation-mapping/NxNxNCubeMapper.d.ts.map +0 -1
  521. package/dist/types/puzzle-geometry/notation-mapping/PyraminxNotationMapper.d.ts.map +0 -1
  522. package/dist/types/puzzle-geometry/notation-mapping/SkewbNotationMapper.d.ts.map +0 -1
  523. package/dist/types/puzzle-geometry/notation-mapping/index.d.ts.map +0 -1
  524. package/dist/types/puzzle-geometry/orientcenters.spec.d.ts.map +0 -1
  525. package/dist/types/puzzles/PuzzleLoader.d.ts.map +0 -1
  526. package/dist/types/puzzles/async/async-pg3d.d.ts.map +0 -1
  527. package/dist/types/puzzles/customPGPuzzleLoader.d.ts.map +0 -1
  528. package/dist/types/puzzles/implementations/2x2x2/2x2x2.kpuzzle.json.d.ts.map +0 -1
  529. package/dist/types/puzzles/implementations/2x2x2/2x2x2.kpuzzle.svg.d.ts.map +0 -1
  530. package/dist/types/puzzles/implementations/2x2x2/index.d.ts.map +0 -1
  531. package/dist/types/puzzles/implementations/3x3x3/3x3x3-ll.kpuzzle.svg.d.ts.map +0 -1
  532. package/dist/types/puzzles/implementations/3x3x3/3x3x3.kpuzzle.svg.d.ts.map +0 -1
  533. package/dist/types/puzzles/implementations/3x3x3/index.d.ts.map +0 -1
  534. package/dist/types/puzzles/implementations/clock/clock.kpuzzle.json.d.ts.map +0 -1
  535. package/dist/types/puzzles/implementations/clock/clock.kpuzzle.svg.d.ts.map +0 -1
  536. package/dist/types/puzzles/implementations/clock/index.d.ts.map +0 -1
  537. package/dist/types/puzzles/implementations/fto/index.d.ts.map +0 -1
  538. package/dist/types/puzzles/implementations/megaminx/index.d.ts.map +0 -1
  539. package/dist/types/puzzles/implementations/pyraminx/index.d.ts.map +0 -1
  540. package/dist/types/puzzles/implementations/pyraminx/pyraminx.kpuzzle.json.d.ts.map +0 -1
  541. package/dist/types/puzzles/implementations/pyraminx/pyraminx.kpuzzle.svg.d.ts.map +0 -1
  542. package/dist/types/puzzles/implementations/square1/index.d.ts.map +0 -1
  543. package/dist/types/puzzles/implementations/square1/sq1-hyperorbit.kpuzzle.json.d.ts.map +0 -1
  544. package/dist/types/puzzles/implementations/square1/sq1-hyperorbit.kpuzzle.svg.d.ts.map +0 -1
  545. package/dist/types/puzzles/index.d.ts.map +0 -1
  546. package/dist/types/puzzles/stickerings/appearance.d.ts.map +0 -1
  547. package/dist/types/puzzles/stickerings/cube-stickerings.d.ts.map +0 -1
  548. package/dist/types/puzzles/stickerings/fto-stickerings.d.ts.map +0 -1
  549. package/dist/types/puzzles/stickerings/global-custom-stickering-hack.d.ts.map +0 -1
  550. package/dist/types/puzzles/stickerings/megaminx-stickerings.d.ts.map +0 -1
  551. package/dist/types/scramble/index.d.ts.map +0 -1
  552. package/dist/types/search/esm-test-worker.d.ts.map +0 -1
  553. package/dist/types/search/index.d.ts.map +0 -1
  554. package/dist/types/search/inside/api.d.ts.map +0 -1
  555. package/dist/types/search/inside/api.spec.d.ts.map +0 -1
  556. package/dist/types/search/inside/entry.d.ts.map +0 -1
  557. package/dist/types/search/inside/inside-worker.d.ts.map +0 -1
  558. package/dist/types/search/inside/solve/addOrientationSuffix.d.ts.map +0 -1
  559. package/dist/types/search/inside/solve/parseSGS.d.ts.map +0 -1
  560. package/dist/types/search/inside/solve/puzzles/2x2x2.d.ts.map +0 -1
  561. package/dist/types/search/inside/solve/puzzles/2x2x2.sgs.json.d.ts.map +0 -1
  562. package/dist/types/search/inside/solve/puzzles/3x3x3/convert.d.ts.map +0 -1
  563. package/dist/types/search/inside/solve/puzzles/3x3x3/filter.d.ts.map +0 -1
  564. package/dist/types/search/inside/solve/puzzles/3x3x3/index.d.ts.map +0 -1
  565. package/dist/types/search/inside/solve/puzzles/3x3x3/legacy-sgs.d.ts.map +0 -1
  566. package/dist/types/search/inside/solve/puzzles/3x3x3-inefficient.sgs.json.d.ts.map +0 -1
  567. package/dist/types/search/inside/solve/puzzles/4x4x4.d.ts.map +0 -1
  568. package/dist/types/search/inside/solve/puzzles/5x5x5.d.ts.map +0 -1
  569. package/dist/types/search/inside/solve/puzzles/big-cubes.d.ts.map +0 -1
  570. package/dist/types/search/inside/solve/puzzles/clock.d.ts.map +0 -1
  571. package/dist/types/search/inside/solve/puzzles/megaminx.d.ts.map +0 -1
  572. package/dist/types/search/inside/solve/puzzles/megaminx.sgs.json.d.ts.map +0 -1
  573. package/dist/types/search/inside/solve/puzzles/pyraminx.d.ts.map +0 -1
  574. package/dist/types/search/inside/solve/puzzles/pyraminx.sgs.json.d.ts.map +0 -1
  575. package/dist/types/search/inside/solve/puzzles/sgs-defs.spec.d.ts.map +0 -1
  576. package/dist/types/search/inside/solve/puzzles/skewb.d.ts.map +0 -1
  577. package/dist/types/search/inside/solve/puzzles/skewb.sgs.json.d.ts.map +0 -1
  578. package/dist/types/search/inside/solve/puzzles/sq1.d.ts.map +0 -1
  579. package/dist/types/search/inside/solve/puzzles/wca-minx.d.ts.map +0 -1
  580. package/dist/types/search/inside/solve/tremble.d.ts.map +0 -1
  581. package/dist/types/search/inside/solve/vendor/cstimer/src/js/lib/mathlib.d.ts.map +0 -1
  582. package/dist/types/search/inside/solve/vendor/cstimer/src/js/scramble/scramble_444.d.ts.map +0 -1
  583. package/dist/types/search/inside/solve/vendor/min2phase/gwt.d.ts.map +0 -1
  584. package/dist/types/search/inside/solve/vendor/random-uint-below/get-random-values.d.ts.map +0 -1
  585. package/dist/types/search/inside/solve/vendor/random-uint-below/index.d.ts.map +0 -1
  586. package/dist/types/search/inside/solve/vendor/random-uint-below/random-choice.d.ts.map +0 -1
  587. package/dist/types/search/inside/solve/vendor/random-uint-below/random-int.d.ts.map +0 -1
  588. package/dist/types/search/inside/solve/vendor/sq12phase/scramble_sq1.d.ts.map +0 -1
  589. package/dist/types/search/instantiator.d.ts.map +0 -1
  590. package/dist/types/search/outside.d.ts.map +0 -1
  591. package/dist/types/search/vendor/comlink-everywhere/inside/index.d.ts +0 -2
  592. package/dist/types/search/vendor/comlink-everywhere/inside/index.d.ts.map +0 -1
  593. package/dist/types/search/vendor/comlink-everywhere/inside/node.d.ts.map +0 -1
  594. package/dist/types/search/vendor/comlink-everywhere/outside/index.d.ts.map +0 -1
  595. package/dist/types/search/vendor/comlink-everywhere/outside/node.d.ts.map +0 -1
  596. package/dist/types/search/worker-inside-generated-string.d.ts.map +0 -1
  597. package/dist/types/stream/index.d.ts.map +0 -1
  598. package/dist/types/stream/process/ReorientedStream.d.ts.map +0 -1
  599. package/dist/types/stream/proxy-event.d.ts.map +0 -1
  600. package/dist/types/stream/twizzle/TwizzleStream.d.ts.map +0 -1
  601. package/dist/types/stream/twizzle/stream-types.d.ts.map +0 -1
  602. package/dist/types/stream/websocket-proxy.d.ts.map +0 -1
  603. package/dist/types/twisty/controllers/AnimationTypes.d.ts.map +0 -1
  604. package/dist/types/twisty/controllers/RenderScheduler.d.ts.map +0 -1
  605. package/dist/types/twisty/controllers/TwistyAnimationController.d.ts.map +0 -1
  606. package/dist/types/twisty/controllers/TwistyPlayerController.d.ts.map +0 -1
  607. package/dist/types/twisty/controllers/easing.d.ts.map +0 -1
  608. package/dist/types/twisty/controllers/indexer/AlgDuration.d.ts.map +0 -1
  609. package/dist/types/twisty/controllers/indexer/AlgIndexer.d.ts.map +0 -1
  610. package/dist/types/twisty/controllers/indexer/SimpleAlgIndexer.d.ts.map +0 -1
  611. package/dist/types/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexer.d.ts.map +0 -1
  612. package/dist/types/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexerV2.d.ts.map +0 -1
  613. package/dist/types/twisty/controllers/indexer/simultaneous-moves/simul-moves.d.ts.map +0 -1
  614. package/dist/types/twisty/controllers/indexer/tree/AlgWalker.d.ts.map +0 -1
  615. package/dist/types/twisty/controllers/indexer/tree/TreeAlgIndexer.d.ts.map +0 -1
  616. package/dist/types/twisty/controllers/indexer/tree/chunkAlgs.d.ts.map +0 -1
  617. package/dist/types/twisty/controllers/stream/timeline-move-calculation-draft.d.ts.map +0 -1
  618. package/dist/types/twisty/heavy-code-imports/3d.d.ts.map +0 -1
  619. package/dist/types/twisty/heavy-code-imports/dynamic-entries/3d.d.ts.map +0 -1
  620. package/dist/types/twisty/index.d.ts.map +0 -1
  621. package/dist/types/twisty/model/PromiseFreshener.d.ts.map +0 -1
  622. package/dist/types/twisty/model/TwistyPlayerModel.d.ts.map +0 -1
  623. package/dist/types/twisty/model/UserVisibleErrorTracker.d.ts.map +0 -1
  624. package/dist/types/twisty/model/helpers.d.ts.map +0 -1
  625. package/dist/types/twisty/model/props/TwistyProp.d.ts.map +0 -1
  626. package/dist/types/twisty/model/props/TwistyProp.spec.d.ts.map +0 -1
  627. package/dist/types/twisty/model/props/TwistyPropDebugger.d.ts.map +0 -1
  628. package/dist/types/twisty/model/props/general/URLProp.d.ts.map +0 -1
  629. package/dist/types/twisty/model/props/puzzle/display/FoundationDisplayProp.d.ts.map +0 -1
  630. package/dist/types/twisty/model/props/puzzle/display/HintFaceletProp.d.ts.map +0 -1
  631. package/dist/types/twisty/model/props/puzzle/display/SpriteProp.d.ts.map +0 -1
  632. package/dist/types/twisty/model/props/puzzle/display/StickeringProp.d.ts.map +0 -1
  633. package/dist/types/twisty/model/props/puzzle/state/AlgProp.d.ts.map +0 -1
  634. package/dist/types/twisty/model/props/puzzle/state/AlgTransformationProp.d.ts.map +0 -1
  635. package/dist/types/twisty/model/props/puzzle/state/AnchoredStartProp.d.ts.map +0 -1
  636. package/dist/types/twisty/model/props/puzzle/state/CatchUpMoveProp.d.ts.map +0 -1
  637. package/dist/types/twisty/model/props/puzzle/state/CurrentLeavesProp.d.ts.map +0 -1
  638. package/dist/types/twisty/model/props/puzzle/state/CurrentLeavesSimplified.d.ts.map +0 -1
  639. package/dist/types/twisty/model/props/puzzle/state/CurrentTransformationProp.d.ts +0 -15
  640. package/dist/types/twisty/model/props/puzzle/state/CurrentTransformationProp.d.ts.map +0 -1
  641. package/dist/types/twisty/model/props/puzzle/state/IndexerConstructorProp.d.ts.map +0 -1
  642. package/dist/types/twisty/model/props/puzzle/state/IndexerConstructorRequestProp.d.ts.map +0 -1
  643. package/dist/types/twisty/model/props/puzzle/state/IndexerProp.d.ts.map +0 -1
  644. package/dist/types/twisty/model/props/puzzle/state/LegacyPositionProp.d.ts.map +0 -1
  645. package/dist/types/twisty/model/props/puzzle/state/MovePressInputProp.d.ts.map +0 -1
  646. package/dist/types/twisty/model/props/puzzle/state/NaiveMoveCountProp.d.ts.map +0 -1
  647. package/dist/types/twisty/model/props/puzzle/state/PuzzleAlgProp.d.ts.map +0 -1
  648. package/dist/types/twisty/model/props/puzzle/state/SetupAnchorProp.d.ts.map +0 -1
  649. package/dist/types/twisty/model/props/puzzle/structure/PuzzleDefProp.d.ts +0 -11
  650. package/dist/types/twisty/model/props/puzzle/structure/PuzzleDefProp.d.ts.map +0 -1
  651. package/dist/types/twisty/model/props/puzzle/structure/PuzzleDescriptionProp.d.ts.map +0 -1
  652. package/dist/types/twisty/model/props/puzzle/structure/PuzzleIDProp.d.ts.map +0 -1
  653. package/dist/types/twisty/model/props/puzzle/structure/PuzzleIDRequestProp.d.ts.map +0 -1
  654. package/dist/types/twisty/model/props/puzzle/structure/PuzzleLoaderProp.d.ts.map +0 -1
  655. package/dist/types/twisty/model/props/timeline/CoarseTimelineInfoProp.d.ts.map +0 -1
  656. package/dist/types/twisty/model/props/timeline/DetailedTimelineInfoProp.d.ts.map +0 -1
  657. package/dist/types/twisty/model/props/timeline/PlayingInfoProp.d.ts.map +0 -1
  658. package/dist/types/twisty/model/props/timeline/TempoScaleProp.d.ts.map +0 -1
  659. package/dist/types/twisty/model/props/timeline/TimestampRequestProp.d.ts.map +0 -1
  660. package/dist/types/twisty/model/props/viewer/BackViewProp.d.ts.map +0 -1
  661. package/dist/types/twisty/model/props/viewer/BackgroundProp.d.ts.map +0 -1
  662. package/dist/types/twisty/model/props/viewer/ButtonAppearanceProp.d.ts.map +0 -1
  663. package/dist/types/twisty/model/props/viewer/ControlPanelProp.d.ts.map +0 -1
  664. package/dist/types/twisty/model/props/viewer/LatitudeLimit.d.ts.map +0 -1
  665. package/dist/types/twisty/model/props/viewer/OrbitCoordinatesProp.d.ts.map +0 -1
  666. package/dist/types/twisty/model/props/viewer/OrbitCoordinatesRequestProp.d.ts.map +0 -1
  667. package/dist/types/twisty/model/props/viewer/TimeRangeProp.d.ts.map +0 -1
  668. package/dist/types/twisty/model/props/viewer/ViewerLinkProp.d.ts.map +0 -1
  669. package/dist/types/twisty/model/props/viewer/VisualizationProp.d.ts.map +0 -1
  670. package/dist/types/twisty/model/props/viewer/VisualizationStrategyProp.d.ts.map +0 -1
  671. package/dist/types/twisty/views/2D/Twisty2DPuzzle.css.d.ts.map +0 -1
  672. package/dist/types/twisty/views/2D/Twisty2DPuzzle.d.ts.map +0 -1
  673. package/dist/types/twisty/views/2D/Twisty2DPuzzleWrapper.d.ts.map +0 -1
  674. package/dist/types/twisty/views/2D/Twisty2DSceneWrapper.d.ts.map +0 -1
  675. package/dist/types/twisty/views/3D/DragTracker.d.ts.map +0 -1
  676. package/dist/types/twisty/views/3D/RendererPool.d.ts.map +0 -1
  677. package/dist/types/twisty/views/3D/TAU.d.ts.map +0 -1
  678. package/dist/types/twisty/views/3D/Twisty3DPuzzleWrapper.d.ts.map +0 -1
  679. package/dist/types/twisty/views/3D/Twisty3DRenderTarget.d.ts.map +0 -1
  680. package/dist/types/twisty/views/3D/Twisty3DScene.d.ts.map +0 -1
  681. package/dist/types/twisty/views/3D/Twisty3DSceneWrapper.d.ts.map +0 -1
  682. package/dist/types/twisty/views/3D/Twisty3DVantage.css.d.ts.map +0 -1
  683. package/dist/types/twisty/views/3D/Twisty3DVantage.d.ts.map +0 -1
  684. package/dist/types/twisty/views/3D/TwistyOrbitControls.d.ts.map +0 -1
  685. package/dist/types/twisty/views/3D/TwistyOrbitControls.spec.d.ts.map +0 -1
  686. package/dist/types/twisty/views/3D/puzzles/Cube3D.d.ts.map +0 -1
  687. package/dist/types/twisty/views/3D/puzzles/KPuzzleWrapper.d.ts +0 -48
  688. package/dist/types/twisty/views/3D/puzzles/KPuzzleWrapper.d.ts.map +0 -1
  689. package/dist/types/twisty/views/3D/puzzles/PG3D.d.ts.map +0 -1
  690. package/dist/types/twisty/views/3D/puzzles/Twisty3DPuzzle.d.ts.map +0 -1
  691. package/dist/types/twisty/views/ClassListManager.d.ts.map +0 -1
  692. package/dist/types/twisty/views/ManagedCustomElement.d.ts.map +0 -1
  693. package/dist/types/twisty/views/TwistyAlgEditor/LeafTokens.d.ts.map +0 -1
  694. package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.css.d.ts.map +0 -1
  695. package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.d.ts.map +0 -1
  696. package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.spec.d.ts.map +0 -1
  697. package/dist/types/twisty/views/TwistyAlgEditor/model.d.ts.map +0 -1
  698. package/dist/types/twisty/views/TwistyAlgViewer.css.d.ts.map +0 -1
  699. package/dist/types/twisty/views/TwistyAlgViewer.d.ts.map +0 -1
  700. package/dist/types/twisty/views/TwistyPlayer.css.d.ts.map +0 -1
  701. package/dist/types/twisty/views/TwistyPlayer.d.ts.map +0 -1
  702. package/dist/types/twisty/views/TwistyPlayerSettable.d.ts.map +0 -1
  703. package/dist/types/twisty/views/TwistyViewerWrapper.css.d.ts.map +0 -1
  704. package/dist/types/twisty/views/canvas.d.ts.map +0 -1
  705. package/dist/types/twisty/views/control-panel/TwistyButtonsV2.css.d.ts.map +0 -1
  706. package/dist/types/twisty/views/control-panel/TwistyButtonsV2.d.ts.map +0 -1
  707. package/dist/types/twisty/views/control-panel/TwistyScrubber.css.d.ts.map +0 -1
  708. package/dist/types/twisty/views/control-panel/TwistyScrubberV2.d.ts.map +0 -1
  709. package/dist/types/twisty/views/control-panel/webkit-fullscreen.d.ts.map +0 -1
  710. package/dist/types/twisty/views/document.d.ts.map +0 -1
  711. package/dist/types/twisty/views/node-custom-element-shims.d.ts.map +0 -1
  712. package/dist/types/twisty/views/screenshot.d.ts.map +0 -1
  713. package/dist/types/twisty/views/stream/TwistyStreamSource.css.d.ts.map +0 -1
  714. package/dist/types/twisty/views/stream/TwistyStreamSource.d.ts.map +0 -1
  715. package/dist/types/vendor/p-lazy/p-lazy.d.ts.map +0 -1
  716. package/dist/types/vendor/three/examples/jsm/libs/stats.modified.module.d.ts.map +0 -1
  717. package/docs/.DS_Store +0 -0
  718. package/docs/CNAME +0 -1
  719. package/docs/cubing/.DS_Store +0 -0
  720. package/docs/cubing/alg/index.html +0 -174
  721. package/docs/cubing/api/index.html +0 -158
  722. package/docs/cubing/index.html +0 -151
  723. package/docs/cubing/scramble/index.html +0 -138
  724. package/docs/cubing/twisty/index.html +0 -329
  725. package/docs/favicon.ico +0 -0
  726. package/docs/index.html +0 -20
  727. package/docs/main.css +0 -192
  728. package/kpuzzle/index.d.ts +0 -1
  729. package/notation/index.d.ts +0 -1
  730. package/protocol/index.d.ts +0 -1
  731. package/puzzle-geometry/index.d.ts +0 -1
  732. package/puzzles/index.d.ts +0 -1
  733. package/scramble/index.d.ts +0 -1
  734. package/search/index.d.ts +0 -1
  735. package/src/cubing/.DS_Store +0 -0
  736. package/src/cubing/alg/Alg.spec.ts +0 -10
  737. package/src/cubing/alg/Alg.ts +0 -290
  738. package/src/cubing/alg/AlgBuilder.ts +0 -33
  739. package/src/cubing/alg/Serializable.ts +0 -29
  740. package/src/cubing/alg/common.ts +0 -59
  741. package/src/cubing/alg/debug.ts +0 -27
  742. package/src/cubing/alg/example.ts +0 -152
  743. package/src/cubing/alg/index.ts +0 -21
  744. package/src/cubing/alg/is.ts +0 -38
  745. package/src/cubing/alg/iteration.ts +0 -45
  746. package/src/cubing/alg/keyboard.ts +0 -48
  747. package/src/cubing/alg/limits.ts +0 -4
  748. package/src/cubing/alg/operation.spec.ts +0 -48
  749. package/src/cubing/alg/operation.ts +0 -36
  750. package/src/cubing/alg/parse.spec.ts +0 -75
  751. package/src/cubing/alg/parse.ts +0 -408
  752. package/src/cubing/alg/test/alg-comparison.ts +0 -23
  753. package/src/cubing/alg/test/alg.spec.ts +0 -348
  754. package/src/cubing/alg/traversal.ts +0 -284
  755. package/src/cubing/alg/units/QuantumWithAmount.ts +0 -55
  756. package/src/cubing/alg/units/Unit.ts +0 -11
  757. package/src/cubing/alg/units/containers/Commutator.ts +0 -85
  758. package/src/cubing/alg/units/containers/Conjugate.ts +0 -53
  759. package/src/cubing/alg/units/containers/Grouping.ts +0 -116
  760. package/src/cubing/alg/units/index.ts +0 -8
  761. package/src/cubing/alg/units/leaves/LineComment.spec.ts +0 -35
  762. package/src/cubing/alg/units/leaves/LineComment.ts +0 -48
  763. package/src/cubing/alg/units/leaves/Move.spec.ts +0 -15
  764. package/src/cubing/alg/units/leaves/Move.ts +0 -265
  765. package/src/cubing/alg/units/leaves/Newline.ts +0 -24
  766. package/src/cubing/alg/units/leaves/Pause.ts +0 -24
  767. package/src/cubing/alg/url.spec.ts +0 -10
  768. package/src/cubing/alg/url.ts +0 -133
  769. package/src/cubing/alg/validation.ts +0 -62
  770. package/src/cubing/alg/warnOnce.ts +0 -7
  771. package/src/cubing/bluetooth/connect/index.ts +0 -93
  772. package/src/cubing/bluetooth/debug.ts +0 -18
  773. package/src/cubing/bluetooth/docs/gan-robot.md +0 -60
  774. package/src/cubing/bluetooth/docs/gan356i.md +0 -309
  775. package/src/cubing/bluetooth/index.ts +0 -19
  776. package/src/cubing/bluetooth/keyboard.ts +0 -55
  777. package/src/cubing/bluetooth/smart-puzzle/Heykube.ts +0 -165
  778. package/src/cubing/bluetooth/smart-puzzle/bluetooth-puzzle.ts +0 -95
  779. package/src/cubing/bluetooth/smart-puzzle/connect.ts +0 -19
  780. package/src/cubing/bluetooth/smart-puzzle/endianness.ts +0 -15
  781. package/src/cubing/bluetooth/smart-puzzle/gan.ts +0 -481
  782. package/src/cubing/bluetooth/smart-puzzle/giiker.spec.ts +0 -28
  783. package/src/cubing/bluetooth/smart-puzzle/giiker.ts +0 -277
  784. package/src/cubing/bluetooth/smart-puzzle/gocube.ts +0 -167
  785. package/src/cubing/bluetooth/smart-puzzle/unsafe-raw-aes.ts +0 -66
  786. package/src/cubing/bluetooth/smart-robot/GanRobot.ts +0 -311
  787. package/src/cubing/bluetooth/smart-robot/index.ts +0 -13
  788. package/src/cubing/bluetooth/smart-timer/GanTimer.ts +0 -141
  789. package/src/cubing/bluetooth/smart-timer/index.ts +0 -13
  790. package/src/cubing/bluetooth/transformer.ts +0 -74
  791. package/src/cubing/esm-test-worker.js +0 -5
  792. package/src/cubing/kpuzzle/3x3x3/3x3x3.kpuzzle.json.spec.ts +0 -40
  793. package/src/cubing/kpuzzle/3x3x3/3x3x3.kpuzzle.json.ts +0 -339
  794. package/src/cubing/kpuzzle/canon.spec.ts +0 -48
  795. package/src/cubing/kpuzzle/canonicalize.ts +0 -325
  796. package/src/cubing/kpuzzle/definition_types.ts +0 -23
  797. package/src/cubing/kpuzzle/index.ts +0 -33
  798. package/src/cubing/kpuzzle/kpuzzle.spec.ts +0 -12
  799. package/src/cubing/kpuzzle/kpuzzle.ts +0 -124
  800. package/src/cubing/kpuzzle/move_notation.ts +0 -9
  801. package/src/cubing/kpuzzle/parser/index.ts +0 -1
  802. package/src/cubing/kpuzzle/parser/parser-peggy.js +0 -1221
  803. package/src/cubing/kpuzzle/parser/parser-peggy.peggy +0 -72
  804. package/src/cubing/kpuzzle/parser/parser-shim.ts +0 -11
  805. package/src/cubing/kpuzzle/parser/parser.js +0 -0
  806. package/src/cubing/kpuzzle/prunetable.spec.ts +0 -19
  807. package/src/cubing/kpuzzle/pruningtable.ts +0 -99
  808. package/src/cubing/kpuzzle/puzzle-orientation.ts +0 -34
  809. package/src/cubing/kpuzzle/svg.ts +0 -290
  810. package/src/cubing/kpuzzle/transformations.spec.ts +0 -75
  811. package/src/cubing/kpuzzle/transformations.ts +0 -258
  812. package/src/cubing/notation/CountAnimatedLeaves.ts +0 -56
  813. package/src/cubing/notation/CountMoves.ts +0 -89
  814. package/src/cubing/notation/index.ts +0 -4
  815. package/src/cubing/protocol/binary/binary3x3x3.spec.ts +0 -143
  816. package/src/cubing/protocol/binary/binary3x3x3.ts +0 -226
  817. package/src/cubing/protocol/binary/hex.spec.ts +0 -17
  818. package/src/cubing/protocol/binary/hex.ts +0 -12
  819. package/src/cubing/protocol/binary/orbit-indexing.spec.ts +0 -49
  820. package/src/cubing/protocol/binary/orbit-indexing.ts +0 -68
  821. package/src/cubing/protocol/binary/puzzle-orientation.ts +0 -69
  822. package/src/cubing/protocol/index.ts +0 -12
  823. package/src/cubing/puzzle-geometry/FaceNameSwizzler.ts +0 -148
  824. package/src/cubing/puzzle-geometry/Options.ts +0 -179
  825. package/src/cubing/puzzle-geometry/PGPuzzles.spec.ts +0 -127
  826. package/src/cubing/puzzle-geometry/PGPuzzles.ts +0 -80
  827. package/src/cubing/puzzle-geometry/Perm.ts +0 -154
  828. package/src/cubing/puzzle-geometry/PermOriSet.ts +0 -765
  829. package/src/cubing/puzzle-geometry/PlatonicGenerator.ts +0 -146
  830. package/src/cubing/puzzle-geometry/PuzzleGeometry.ts +0 -3009
  831. package/src/cubing/puzzle-geometry/Quat.spec.ts +0 -10
  832. package/src/cubing/puzzle-geometry/Quat.ts +0 -325
  833. package/src/cubing/puzzle-geometry/SchreierSims.ts +0 -144
  834. package/src/cubing/puzzle-geometry/index.ts +0 -17
  835. package/src/cubing/puzzle-geometry/interfaces.ts +0 -6
  836. package/src/cubing/puzzle-geometry/notation-mapping/FTONotationMapper.ts +0 -38
  837. package/src/cubing/puzzle-geometry/notation-mapping/FaceRenamingMapper.ts +0 -59
  838. package/src/cubing/puzzle-geometry/notation-mapping/MegaminxScramblingNotationMapper.ts +0 -50
  839. package/src/cubing/puzzle-geometry/notation-mapping/NotationMapper.ts +0 -6
  840. package/src/cubing/puzzle-geometry/notation-mapping/NullMapper.ts +0 -12
  841. package/src/cubing/puzzle-geometry/notation-mapping/NxNxNCubeMapper.ts +0 -77
  842. package/src/cubing/puzzle-geometry/notation-mapping/PyraminxNotationMapper.ts +0 -121
  843. package/src/cubing/puzzle-geometry/notation-mapping/SkewbNotationMapper.ts +0 -103
  844. package/src/cubing/puzzle-geometry/notation-mapping/index.ts +0 -13
  845. package/src/cubing/puzzle-geometry/orientcenters.spec.ts +0 -55
  846. package/src/cubing/puzzles/PuzzleLoader.ts +0 -20
  847. package/src/cubing/puzzles/async/async-pg3d.ts +0 -73
  848. package/src/cubing/puzzles/customPGPuzzleLoader.ts +0 -60
  849. package/src/cubing/puzzles/implementations/2x2x2/2x2x2.kpuzzle.json.ts +0 -92
  850. package/src/cubing/puzzles/implementations/2x2x2/2x2x2.kpuzzle.svg.ts +0 -45
  851. package/src/cubing/puzzles/implementations/2x2x2/index.ts +0 -25
  852. package/src/cubing/puzzles/implementations/2x2x2/svg/2x2x2.kpuzzle.svg +0 -45
  853. package/src/cubing/puzzles/implementations/3x3x3/3x3x3-ll.kpuzzle.svg.ts +0 -108
  854. package/src/cubing/puzzles/implementations/3x3x3/3x3x3.kpuzzle.svg.ts +0 -128
  855. package/src/cubing/puzzles/implementations/3x3x3/index.ts +0 -33
  856. package/src/cubing/puzzles/implementations/3x3x3/src/3x3x3-ll.kpuzzle.svg +0 -108
  857. package/src/cubing/puzzles/implementations/3x3x3/src/3x3x3.kpuzzle.svg +0 -128
  858. package/src/cubing/puzzles/implementations/TODO/svg/alg/3x3x3.kpuzzle.original.svg +0 -128
  859. package/src/cubing/puzzles/implementations/TODO/svg/alg/3x3x3.kpuzzle.outlined.svg +0 -486
  860. package/src/cubing/puzzles/implementations/TODO/svg/alg/3x3x3.kpuzzle.spaced.svg +0 -128
  861. package/src/cubing/puzzles/implementations/clock/clock.kpuzzle.json.ts +0 -241
  862. package/src/cubing/puzzles/implementations/clock/clock.kpuzzle.svg.ts +0 -369
  863. package/src/cubing/puzzles/implementations/clock/index.ts +0 -14
  864. package/src/cubing/puzzles/implementations/clock/src/clock.kpuzzle.svg +0 -369
  865. package/src/cubing/puzzles/implementations/fto/index.ts +0 -28
  866. package/src/cubing/puzzles/implementations/megaminx/index.ts +0 -20
  867. package/src/cubing/puzzles/implementations/pyraminx/index.ts +0 -18
  868. package/src/cubing/puzzles/implementations/pyraminx/pyraminx.kpuzzle.json.ts +0 -84
  869. package/src/cubing/puzzles/implementations/pyraminx/pyraminx.kpuzzle.svg.ts +0 -88
  870. package/src/cubing/puzzles/implementations/pyraminx/src/pyraminx.kpuzzle.svg +0 -87
  871. package/src/cubing/puzzles/implementations/square1/index.ts +0 -14
  872. package/src/cubing/puzzles/implementations/square1/sq1-hyperorbit.kpuzzle.json.ts +0 -62
  873. package/src/cubing/puzzles/implementations/square1/sq1-hyperorbit.kpuzzle.svg.ts +0 -295
  874. package/src/cubing/puzzles/implementations/square1/src/sq1-hyperorbit.kpuzzle.svg +0 -295
  875. package/src/cubing/puzzles/implementations/square1/src/sq1-simple.svg +0 -60
  876. package/src/cubing/puzzles/index.ts +0 -92
  877. package/src/cubing/puzzles/stickerings/appearance.ts +0 -292
  878. package/src/cubing/puzzles/stickerings/cube-stickerings.ts +0 -286
  879. package/src/cubing/puzzles/stickerings/fto-stickerings.ts +0 -105
  880. package/src/cubing/puzzles/stickerings/global-custom-stickering-hack.ts +0 -61
  881. package/src/cubing/puzzles/stickerings/megaminx-stickerings.ts +0 -26
  882. package/src/cubing/scramble/index.ts +0 -1
  883. package/src/cubing/search/.gitignore +0 -1
  884. package/src/cubing/search/esm-test-worker.js +0 -14
  885. package/src/cubing/search/index.ts +0 -12
  886. package/src/cubing/search/inside/api.spec.ts +0 -37
  887. package/src/cubing/search/inside/api.ts +0 -171
  888. package/src/cubing/search/inside/entry.js +0 -4
  889. package/src/cubing/search/inside/inside-worker.ts +0 -13
  890. package/src/cubing/search/inside/solve/addOrientationSuffix.ts +0 -17
  891. package/src/cubing/search/inside/solve/parseSGS.ts +0 -119
  892. package/src/cubing/search/inside/solve/puzzles/2x2x2.ts +0 -92
  893. package/src/cubing/search/inside/solve/puzzles/3x3x3/convert.ts +0 -137
  894. package/src/cubing/search/inside/solve/puzzles/3x3x3/filter.ts +0 -60
  895. package/src/cubing/search/inside/solve/puzzles/3x3x3/index.ts +0 -57
  896. package/src/cubing/search/inside/solve/puzzles/3x3x3/legacy-sgs.ts +0 -291
  897. package/src/cubing/search/inside/solve/puzzles/3x3x3-inefficient.sgs.json.ts +0 -272
  898. package/src/cubing/search/inside/solve/puzzles/4x4x4.ts +0 -16
  899. package/src/cubing/search/inside/solve/puzzles/5x5x5.ts +0 -12
  900. package/src/cubing/search/inside/solve/puzzles/FTO.sgs +0 -264
  901. package/src/cubing/search/inside/solve/puzzles/big-cubes.ts +0 -78
  902. package/src/cubing/search/inside/solve/puzzles/clock.ts +0 -48
  903. package/src/cubing/search/inside/solve/puzzles/megaminx.ts +0 -51
  904. package/src/cubing/search/inside/solve/puzzles/pyraminx.ts +0 -48
  905. package/src/cubing/search/inside/solve/puzzles/sgs-defs.spec.ts +0 -27
  906. package/src/cubing/search/inside/solve/puzzles/skewb.sgs.json.ts +0 -113
  907. package/src/cubing/search/inside/solve/puzzles/skewb.ts +0 -65
  908. package/src/cubing/search/inside/solve/puzzles/sq1.ts +0 -6
  909. package/src/cubing/search/inside/solve/puzzles/wca-minx.ts +0 -32
  910. package/src/cubing/search/inside/solve/tremble.ts +0 -212
  911. package/src/cubing/search/inside/solve/vendor/cstimer/LICENSE +0 -674
  912. package/src/cubing/search/inside/solve/vendor/cstimer/src/js/lib/mathlib.ts +0 -54
  913. package/src/cubing/search/inside/solve/vendor/min2phase/gwt.d.ts +0 -2
  914. package/src/cubing/search/inside/solve/vendor/random-uint-below/get-random-values.ts +0 -38
  915. package/src/cubing/search/inside/solve/vendor/random-uint-below/index.ts +0 -12
  916. package/src/cubing/search/inside/solve/vendor/random-uint-below/random-choice.ts +0 -9
  917. package/src/cubing/search/inside/solve/vendor/random-uint-below/random-int.ts +0 -64
  918. package/src/cubing/search/instantiator.ts +0 -60
  919. package/src/cubing/search/outside.ts +0 -110
  920. package/src/cubing/search/vendor/comlink-everywhere/comlink-everywhere.webloc +0 -8
  921. package/src/cubing/search/vendor/comlink-everywhere/inside/index.js +0 -16
  922. package/src/cubing/search/vendor/comlink-everywhere/inside/node.js +0 -6
  923. package/src/cubing/search/vendor/comlink-everywhere/outside/index.d.ts +0 -6
  924. package/src/cubing/search/vendor/comlink-everywhere/outside/index.js +0 -31
  925. package/src/cubing/search/vendor/comlink-everywhere/outside/node.js +0 -41
  926. package/src/cubing/search/worker-inside-generated-string.js +0 -1
  927. package/src/cubing/stream/index.ts +0 -12
  928. package/src/cubing/stream/process/ReorientedStream.ts +0 -93
  929. package/src/cubing/stream/proxy-event.ts +0 -16
  930. package/src/cubing/stream/twizzle/TwizzleStream.ts +0 -53
  931. package/src/cubing/stream/twizzle/stream-types.ts +0 -45
  932. package/src/cubing/stream/websocket-proxy.ts +0 -73
  933. package/src/cubing/twisty/.DS_Store +0 -0
  934. package/src/cubing/twisty/controllers/.DS_Store +0 -0
  935. package/src/cubing/twisty/controllers/AnimationTypes.ts +0 -50
  936. package/src/cubing/twisty/controllers/RenderScheduler.ts +0 -28
  937. package/src/cubing/twisty/controllers/TwistyAnimationController.ts +0 -325
  938. package/src/cubing/twisty/controllers/TwistyPlayerController.ts +0 -38
  939. package/src/cubing/twisty/controllers/animation/.DS_Store +0 -0
  940. package/src/cubing/twisty/controllers/easing.ts +0 -3
  941. package/src/cubing/twisty/controllers/indexer/.DS_Store +0 -0
  942. package/src/cubing/twisty/controllers/indexer/AlgDuration.ts +0 -94
  943. package/src/cubing/twisty/controllers/indexer/AlgIndexer.ts +0 -87
  944. package/src/cubing/twisty/controllers/indexer/SimpleAlgIndexer.ts +0 -76
  945. package/src/cubing/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexer.ts +0 -181
  946. package/src/cubing/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexerV2.ts +0 -243
  947. package/src/cubing/twisty/controllers/indexer/simultaneous-moves/simul-moves.ts +0 -193
  948. package/src/cubing/twisty/controllers/indexer/tree/AlgWalker.ts +0 -439
  949. package/src/cubing/twisty/controllers/indexer/tree/TreeAlgIndexer.ts +0 -97
  950. package/src/cubing/twisty/controllers/indexer/tree/chunkAlgs.ts +0 -81
  951. package/src/cubing/twisty/controllers/stream/timeline-move-calculation-draft.spec.ts.TODO +0 -59
  952. package/src/cubing/twisty/controllers/stream/timeline-move-calculation-draft.ts +0 -162
  953. package/src/cubing/twisty/heavy-code-imports/.DS_Store +0 -0
  954. package/src/cubing/twisty/heavy-code-imports/3d.ts +0 -18
  955. package/src/cubing/twisty/heavy-code-imports/dynamic-entries/3d.ts +0 -31
  956. package/src/cubing/twisty/index.ts +0 -24
  957. package/src/cubing/twisty/model/.DS_Store +0 -0
  958. package/src/cubing/twisty/model/PromiseFreshener.ts +0 -49
  959. package/src/cubing/twisty/model/TwistyPlayerModel.ts +0 -254
  960. package/src/cubing/twisty/model/UserVisibleErrorTracker.ts +0 -22
  961. package/src/cubing/twisty/model/helpers.ts +0 -47
  962. package/src/cubing/twisty/model/props/.DS_Store +0 -0
  963. package/src/cubing/twisty/model/props/TwistyProp.spec.ts +0 -38
  964. package/src/cubing/twisty/model/props/TwistyProp.ts +0 -366
  965. package/src/cubing/twisty/model/props/TwistyPropDebugger.ts +0 -370
  966. package/src/cubing/twisty/model/props/general/URLProp.ts +0 -14
  967. package/src/cubing/twisty/model/props/puzzle/.DS_Store +0 -0
  968. package/src/cubing/twisty/model/props/puzzle/display/FoundationDisplayProp.ts +0 -9
  969. package/src/cubing/twisty/model/props/puzzle/display/HintFaceletProp.ts +0 -15
  970. package/src/cubing/twisty/model/props/puzzle/display/SpriteProp.ts +0 -43
  971. package/src/cubing/twisty/model/props/puzzle/display/StickeringProp.ts +0 -54
  972. package/src/cubing/twisty/model/props/puzzle/state/AlgProp.ts +0 -91
  973. package/src/cubing/twisty/model/props/puzzle/state/AlgTransformationProp.ts +0 -28
  974. package/src/cubing/twisty/model/props/puzzle/state/AnchoredStartProp.ts +0 -44
  975. package/src/cubing/twisty/model/props/puzzle/state/CatchUpMoveProp.ts +0 -17
  976. package/src/cubing/twisty/model/props/puzzle/state/CurrentLeavesProp.ts +0 -109
  977. package/src/cubing/twisty/model/props/puzzle/state/CurrentLeavesSimplified.ts +0 -48
  978. package/src/cubing/twisty/model/props/puzzle/state/CurrentTransformationProp.ts +0 -46
  979. package/src/cubing/twisty/model/props/puzzle/state/IndexerConstructorProp.ts +0 -53
  980. package/src/cubing/twisty/model/props/puzzle/state/IndexerConstructorRequestProp.ts +0 -15
  981. package/src/cubing/twisty/model/props/puzzle/state/IndexerProp.ts +0 -24
  982. package/src/cubing/twisty/model/props/puzzle/state/LegacyPositionProp.ts +0 -22
  983. package/src/cubing/twisty/model/props/puzzle/state/MovePressInputProp.ts +0 -9
  984. package/src/cubing/twisty/model/props/puzzle/state/NaiveMoveCountProp.ts +0 -20
  985. package/src/cubing/twisty/model/props/puzzle/state/PuzzleAlgProp.ts +0 -28
  986. package/src/cubing/twisty/model/props/puzzle/state/SetupAnchorProp.ts +0 -14
  987. package/src/cubing/twisty/model/props/puzzle/structure/PuzzleDefProp.ts +0 -14
  988. package/src/cubing/twisty/model/props/puzzle/structure/PuzzleDescriptionProp.ts +0 -14
  989. package/src/cubing/twisty/model/props/puzzle/structure/PuzzleIDProp.ts +0 -12
  990. package/src/cubing/twisty/model/props/puzzle/structure/PuzzleIDRequestProp.ts +0 -36
  991. package/src/cubing/twisty/model/props/puzzle/structure/PuzzleLoaderProp.ts +0 -38
  992. package/src/cubing/twisty/model/props/timeline/CoarseTimelineInfoProp.ts +0 -45
  993. package/src/cubing/twisty/model/props/timeline/DetailedTimelineInfoProp.ts +0 -78
  994. package/src/cubing/twisty/model/props/timeline/PlayingInfoProp.ts +0 -48
  995. package/src/cubing/twisty/model/props/timeline/TempoScaleProp.ts +0 -13
  996. package/src/cubing/twisty/model/props/timeline/TimestampRequestProp.ts +0 -38
  997. package/src/cubing/twisty/model/props/viewer/BackViewProp.ts +0 -16
  998. package/src/cubing/twisty/model/props/viewer/BackgroundProp.ts +0 -15
  999. package/src/cubing/twisty/model/props/viewer/ButtonAppearanceProp.ts +0 -86
  1000. package/src/cubing/twisty/model/props/viewer/ControlPanelProp.ts +0 -14
  1001. package/src/cubing/twisty/model/props/viewer/LatitudeLimit.ts +0 -11
  1002. package/src/cubing/twisty/model/props/viewer/OrbitCoordinatesProp.ts +0 -127
  1003. package/src/cubing/twisty/model/props/viewer/OrbitCoordinatesRequestProp.ts +0 -69
  1004. package/src/cubing/twisty/model/props/viewer/TimeRangeProp.ts +0 -15
  1005. package/src/cubing/twisty/model/props/viewer/ViewerLinkProp.ts +0 -14
  1006. package/src/cubing/twisty/model/props/viewer/VisualizationProp.ts +0 -17
  1007. package/src/cubing/twisty/model/props/viewer/VisualizationStrategyProp.ts +0 -45
  1008. package/src/cubing/twisty/old/.DS_Store +0 -0
  1009. package/src/cubing/twisty/old/animation/.DS_Store +0 -0
  1010. package/src/cubing/twisty/old/dom/.DS_Store +0 -0
  1011. package/src/cubing/twisty/views/.DS_Store +0 -0
  1012. package/src/cubing/twisty/views/2D/Twisty2DPuzzle.css.ts +0 -26
  1013. package/src/cubing/twisty/views/2D/Twisty2DPuzzle.ts +0 -146
  1014. package/src/cubing/twisty/views/2D/Twisty2DPuzzleWrapper.ts +0 -52
  1015. package/src/cubing/twisty/views/2D/Twisty2DSceneWrapper.ts +0 -77
  1016. package/src/cubing/twisty/views/3D/.DS_Store +0 -0
  1017. package/src/cubing/twisty/views/3D/DragTracker.ts +0 -184
  1018. package/src/cubing/twisty/views/3D/RendererPool.ts +0 -54
  1019. package/src/cubing/twisty/views/3D/TAU.ts +0 -2
  1020. package/src/cubing/twisty/views/3D/Twisty3DPuzzleWrapper.ts +0 -214
  1021. package/src/cubing/twisty/views/3D/Twisty3DRenderTarget.ts +0 -5
  1022. package/src/cubing/twisty/views/3D/Twisty3DScene.ts +0 -42
  1023. package/src/cubing/twisty/views/3D/Twisty3DSceneWrapper.ts +0 -189
  1024. package/src/cubing/twisty/views/3D/Twisty3DVantage.css.ts +0 -32
  1025. package/src/cubing/twisty/views/3D/Twisty3DVantage.ts +0 -312
  1026. package/src/cubing/twisty/views/3D/TwistyOrbitControls.spec.ts +0 -213
  1027. package/src/cubing/twisty/views/3D/TwistyOrbitControls.ts +0 -176
  1028. package/src/cubing/twisty/views/3D/puzzles/Cube3D.ts +0 -966
  1029. package/src/cubing/twisty/views/3D/puzzles/KPuzzleWrapper.ts +0 -142
  1030. package/src/cubing/twisty/views/3D/puzzles/PG3D.ts +0 -1078
  1031. package/src/cubing/twisty/views/3D/puzzles/Twisty3DPuzzle.ts +0 -6
  1032. package/src/cubing/twisty/views/ClassListManager.ts +0 -34
  1033. package/src/cubing/twisty/views/ManagedCustomElement.ts +0 -76
  1034. package/src/cubing/twisty/views/TwistyAlgEditor/LeafTokens.ts +0 -116
  1035. package/src/cubing/twisty/views/TwistyAlgEditor/TwistyAlgEditor.css.ts +0 -72
  1036. package/src/cubing/twisty/views/TwistyAlgEditor/TwistyAlgEditor.spec.ts +0 -57
  1037. package/src/cubing/twisty/views/TwistyAlgEditor/TwistyAlgEditor.ts +0 -368
  1038. package/src/cubing/twisty/views/TwistyAlgEditor/model.ts +0 -179
  1039. package/src/cubing/twisty/views/TwistyAlgViewer.css.ts +0 -25
  1040. package/src/cubing/twisty/views/TwistyAlgViewer.ts +0 -502
  1041. package/src/cubing/twisty/views/TwistyPlayer.css.ts +0 -73
  1042. package/src/cubing/twisty/views/TwistyPlayer.ts +0 -362
  1043. package/src/cubing/twisty/views/TwistyPlayerSettable.ts +0 -115
  1044. package/src/cubing/twisty/views/TwistyViewerWrapper.css.ts +0 -41
  1045. package/src/cubing/twisty/views/canvas.ts +0 -9
  1046. package/src/cubing/twisty/views/control-panel/TwistyButtonsV2.css.ts +0 -127
  1047. package/src/cubing/twisty/views/control-panel/TwistyButtonsV2.ts +0 -156
  1048. package/src/cubing/twisty/views/control-panel/TwistyScrubber.css.ts +0 -48
  1049. package/src/cubing/twisty/views/control-panel/TwistyScrubberV2.ts +0 -145
  1050. package/src/cubing/twisty/views/control-panel/webkit-fullscreen.ts +0 -44
  1051. package/src/cubing/twisty/views/document.ts +0 -4
  1052. package/src/cubing/twisty/views/node-custom-element-shims.ts +0 -30
  1053. package/src/cubing/twisty/views/screenshot.ts +0 -90
  1054. package/src/cubing/twisty/views/stream/TwistyStreamSource.css.ts +0 -17
  1055. package/src/cubing/twisty/views/stream/TwistyStreamSource.ts +0 -155
  1056. package/src/cubing/vendor/p-lazy/license +0 -9
  1057. package/src/cubing/vendor/p-lazy/p-lazy.ts +0 -52
  1058. package/src/cubing/vendor/p-lazy/readme.md +0 -54
  1059. package/src/cubing/vendor/three/examples/jsm/libs/stats.modified.module.ts +0 -179
  1060. package/stream/index.d.ts +0 -1
  1061. package/twisty/index.d.ts +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/cubing/bluetooth/debug.ts", "../../../src/cubing/bluetooth/transformer.ts", "../../../src/cubing/bluetooth/smart-puzzle/bluetooth-puzzle.ts", "../../../src/cubing/bluetooth/keyboard.ts", "../../../src/cubing/bluetooth/connect/index.ts", "../../../src/cubing/bluetooth/smart-puzzle/gan.ts", "../../../src/cubing/bluetooth/smart-puzzle/unsafe-raw-aes.ts", "../../../src/cubing/bluetooth/smart-puzzle/giiker.ts", "../../../src/cubing/bluetooth/smart-puzzle/gocube.ts", "../../../src/cubing/bluetooth/smart-puzzle/endianness.ts", "../../../src/cubing/bluetooth/smart-puzzle/Heykube.ts", "../../../src/cubing/bluetooth/smart-puzzle/connect.ts", "../../../src/cubing/bluetooth/smart-robot/GanRobot.ts", "../../../src/cubing/bluetooth/smart-robot/index.ts", "../../../src/cubing/bluetooth/smart-timer/GanTimer.ts", "../../../src/cubing/bluetooth/smart-timer/index.ts"],
4
- "sourcesContent": ["let DEBUG_LOGGING_ENABLED = false;\n\nexport function enableDebugLogging(enable: boolean): void {\n DEBUG_LOGGING_ENABLED = enable;\n}\n\n// TODO: Remove this.\nexport function debugLog(...args: any[]): void {\n if (!DEBUG_LOGGING_ENABLED) {\n return;\n }\n\n if (console.info) {\n console.info(...args);\n } else {\n console.log(...args);\n }\n}\n", "import { Quaternion, Vector3 } from \"three\";\nimport type {\n MoveEvent,\n OrientationEvent,\n} from \"./smart-puzzle/bluetooth-puzzle\";\n\n// TODO: Combine orientation and moves into a single event to handle quaternion remapping.\nexport interface StreamTransformer {\n // Modifies the input.\n transformMove(moveEvent: MoveEvent): void;\n\n // Modifies the input.\n transformOrientation(orientationEvent: OrientationEvent): void;\n}\n\nfunction maxAxis(v: Vector3): string {\n const maxVal = Math.max(Math.abs(v.x), Math.abs(v.y), Math.abs(v.z));\n switch (maxVal) {\n case v.x:\n return \"x\";\n case -v.x:\n return \"-x\";\n case v.y:\n return \"y\";\n case -v.y:\n return \"-y\";\n case v.z:\n return \"z\";\n case -v.z:\n return \"-z\";\n default:\n throw new Error(\"Uh-oh.\");\n }\n}\n\nconst s2 = Math.sqrt(0.5);\n\nconst m: { [s: string]: Quaternion } = {\n \"y z\": new Quaternion(0, 0, 0, 1),\n \"-z y\": new Quaternion(s2, 0, 0, s2),\n \"x z\": new Quaternion(0, 0, -s2, s2),\n \"-x z\": new Quaternion(0, 0, s2, s2),\n};\n\nexport class BasicRotationTransformer implements StreamTransformer {\n // private reorientQuat = new Quaternion();\n\n public transformMove(_moveEvent: MoveEvent): void {\n // Nothing to do.\n }\n\n public transformOrientation(orientationEvent: OrientationEvent): void {\n const { x, y, z, w } = orientationEvent.quaternion;\n const quat = new Quaternion(x, y, z, w);\n\n const U = new Vector3(0, 1, 0);\n const F = new Vector3(0, 0, 1);\n const maxU = maxAxis(U.applyQuaternion(quat));\n const maxF = maxAxis(F.applyQuaternion(quat));\n\n const oriQuat = m[`${maxU} ${maxF}`] || m[\"y z\"];\n\n console.log(quat);\n console.log(oriQuat);\n const q2 = quat.premultiply(oriQuat);\n\n // console.log(maxAxis(U.applyQuaternion(quat)), maxAxis(F.applyQuaternion(quat)));\n console.log(q2);\n\n orientationEvent.quaternion = quat;\n\n console.log(orientationEvent.quaternion);\n }\n}\n", "import type { Move } from \"../../alg\";\nimport type { Transformation } from \"../../kpuzzle\";\nimport { BasicRotationTransformer, StreamTransformer } from \"../transformer\";\n\n/******** BluetoothPuzzle ********/\n\n// TODO: Make compatible with Twisty.\nexport type PuzzleState = Transformation;\n\n// TODO: Use actual `CustomEvent`s?\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent\nexport interface MoveEvent {\n latestMove: Move;\n timeStamp: number;\n debug?: Record<string, unknown>;\n state?: PuzzleState;\n quaternion?: any; // TODO: Unused\n}\n\n// TODO: Only use the `quaternion` field in the `MoveEvent`?\nexport interface OrientationEvent {\n quaternion: {\n x: number;\n y: number;\n z: number;\n w: number;\n };\n timeStamp: number;\n debug?: Record<string, unknown>;\n}\n\nexport interface BluetoothConfig<T> {\n connect: (\n server: BluetoothRemoteGATTServer,\n device?: BluetoothDevice,\n ) => Promise<T>;\n // TODO: Can we reuse `filters`?\n prefixes: string[]; // `[\"\"]` for GiiKER\n filters: BluetoothLEScanFilter[];\n optionalServices: BluetoothServiceUUID[];\n}\n\n// TODO: Expose device name (and/or globally unique identifier)?\nexport abstract class BluetoothPuzzle extends EventTarget {\n public transformers: StreamTransformer[] = [];\n protected listeners: Array<(e: MoveEvent) => void> = []; // TODO: type\n protected orientationListeners: Array<(e: OrientationEvent) => void> = []; // TODO: type\n\n public abstract name(): string | undefined;\n public abstract disconnect(): void; // TODO: Can we make this reutrn (async) on success?\n\n // TODO: require subclasses to implement this?\n public async getState(): Promise<PuzzleState> {\n throw new Error(\"cannot get state\");\n }\n\n public addMoveListener(listener: (e: MoveEvent) => void): void {\n this.listeners.push(listener);\n }\n\n public addOrientationListener(listener: (e: OrientationEvent) => void): void {\n this.orientationListeners.push(listener);\n }\n\n public experimentalAddBasicRotationTransformer(): void {\n this.transformers.push(new BasicRotationTransformer());\n }\n\n protected dispatchMove(moveEvent: MoveEvent): void {\n for (const transformer of this.transformers) {\n transformer.transformMove(moveEvent);\n }\n for (const l of this.listeners) {\n l(moveEvent);\n }\n }\n\n protected dispatchOrientation(orientationEvent: OrientationEvent): void {\n for (const transformer of this.transformers) {\n transformer.transformOrientation(orientationEvent);\n }\n const { x, y, z, w } = orientationEvent.quaternion;\n // TODO: can we avoid mutating the source event?\n orientationEvent.quaternion = {\n x,\n y,\n z,\n w,\n };\n for (const l of this.orientationListeners) {\n // TODO: Convert quaternion.\n l(orientationEvent);\n }\n }\n}\n", "import { keyToMove } from \"../alg\";\nimport { KPuzzle } from \"../kpuzzle\";\nimport { puzzles } from \"../puzzles\";\nimport { BluetoothPuzzle, PuzzleState } from \"./smart-puzzle/bluetooth-puzzle\";\n\nexport class KeyboardPuzzle extends BluetoothPuzzle {\n public puzzle: Promise<KPuzzle> = (async () =>\n new KPuzzle(await puzzles[\"3x3x3\"].def()))();\n\n listener: (e: KeyboardEvent) => Promise<void>;\n\n // TODO: Decide on the right arguments.\n constructor(private target: Element) {\n super();\n // TODO: Filter out repeated keydown?\n this.listener = this.onKeyDown.bind(this);\n target.addEventListener(\"keydown\", this.listener);\n }\n\n public name(): string | undefined {\n return \"Keyboard Input\";\n }\n\n disconnect() {\n this.target.removeEventListener(\"keydown\", this.listener);\n }\n\n public async getState(): Promise<PuzzleState> {\n return (await this.puzzle).state;\n }\n\n private async onKeyDown(e: KeyboardEvent): Promise<void> {\n if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {\n return;\n }\n\n const move = keyToMove(e);\n if (move) {\n (await this.puzzle).applyMove(move);\n this.dispatchMove({\n latestMove: move,\n timeStamp: e.timeStamp,\n state: (await this.puzzle).state,\n });\n e.preventDefault();\n }\n }\n}\n\n// TODO: Type\nexport async function debugKeyboardConnect(\n target: any = window,\n): Promise<KeyboardPuzzle> {\n return new KeyboardPuzzle(target);\n}\n", "import { debugLog } from \"../debug\";\nimport type { BluetoothConfig } from \"../smart-puzzle/bluetooth-puzzle\";\n\n/******** requestOptions ********/\n\nfunction requestOptions<T>(\n configs: BluetoothConfig<T>[],\n acceptAllDevices: boolean = false,\n): RequestDeviceOptions {\n const options = acceptAllDevices\n ? {\n acceptAllDevices: true,\n optionalServices: [] as BluetoothServiceUUID[],\n }\n : {\n filters: [] as BluetoothLEScanFilter[],\n optionalServices: [] as BluetoothServiceUUID[],\n };\n for (const config of configs) {\n if (!acceptAllDevices) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n options.filters = options.filters!.concat(config.filters);\n }\n options.optionalServices = options.optionalServices.concat(\n config.optionalServices,\n );\n }\n debugLog({ requestOptions: options });\n return options;\n}\n\n/******** connect() ********/\n\nexport interface BluetoothConnectOptions {\n acceptAllDevices?: boolean;\n}\n\n// We globally track the number of connection failures,\n// in order to offer the user recourse (accept all devices) if they're having issues.\n// This allows us to future-proof situations where a device might not show up in\n// the chooser, but works if we connect.\nlet consecutiveFailures = 0;\nconst MAX_FAILURES_BEFORE_ACCEPT_ALL_FALLBACK = 2;\n\n// TODO: Debug options to allow connecting to any device?\nexport async function bluetoothConnect<T>(\n configs: BluetoothConfig<T>[],\n options: BluetoothConnectOptions = {},\n): Promise<T> {\n debugLog(\"Attempting to pair.\");\n let device;\n try {\n let acceptAllDevices = options.acceptAllDevices;\n if (\n !acceptAllDevices &&\n consecutiveFailures >= MAX_FAILURES_BEFORE_ACCEPT_ALL_FALLBACK\n ) {\n console.info(\n `The last ${MAX_FAILURES_BEFORE_ACCEPT_ALL_FALLBACK} Bluetooth puzzle connection attempts failed. This time, the Bluetooth prompt will show all possible devices.`,\n );\n acceptAllDevices = true;\n }\n device = await navigator.bluetooth.requestDevice(\n requestOptions<T>(configs, acceptAllDevices),\n );\n consecutiveFailures = 0;\n } catch (e) {\n consecutiveFailures++;\n throw new Error(e);\n }\n debugLog(\"Device:\", device);\n\n if (typeof device.gatt === \"undefined\") {\n return Promise.reject(\"Device did not have a GATT server.\");\n }\n\n const server = await device.gatt.connect();\n debugLog(\"Server:\", server);\n\n const name = server.device?.name || \"\";\n\n // TODO by reading supported matched filters or provided services.\n\n for (const config of configs) {\n for (const prefix of config.prefixes) {\n if (name?.startsWith(prefix)) {\n return config.connect(server, device);\n }\n }\n }\n\n throw Error(\"Unknown Bluetooth devive.\");\n}\n", "/* tslint:disable no-bitwise */\n\nimport { Quaternion } from \"three\";\nimport { Move } from \"../../alg\";\nimport { KPuzzle, KPuzzleDefinition } from \"../../kpuzzle\";\nimport { puzzles } from \"../../puzzles\";\nimport { debugLog } from \"../debug\";\nimport {\n BluetoothConfig,\n BluetoothPuzzle,\n PuzzleState,\n} from \"./bluetooth-puzzle\";\nimport { importKey, unsafeDecryptBlock } from \"./unsafe-raw-aes\";\n\n// This needs to be short enough to capture 6 moves (OBQTM).\nconst DEFAULT_INTERVAL_MS = 150;\n// Number of latest moves provided by the Gan 356i.\nconst MAX_LATEST_MOVES = 6;\n\nconst ganMoveToBlockMove: { [i: number]: Move } = {\n 0x00: new Move(\"U\"),\n 0x02: new Move(\"U\", -1),\n 0x03: new Move(\"R\"),\n 0x05: new Move(\"R\", -1),\n 0x06: new Move(\"F\"),\n 0x08: new Move(\"F\", -1),\n 0x09: new Move(\"D\"),\n 0x0b: new Move(\"D\", -1),\n 0x0c: new Move(\"L\"),\n 0x0e: new Move(\"L\", -1),\n 0x0f: new Move(\"B\"),\n 0x11: new Move(\"B\", -1),\n};\n\nlet homeQuatInverse: Quaternion | null = null;\n\nfunction probablyDecodedCorrectly(data: Uint8Array): boolean {\n return (\n data[13] < 0x12 &&\n data[14] < 0x12 &&\n data[15] < 0x12 &&\n data[16] < 0x12 &&\n data[17] < 0x12 &&\n data[18] < 0x12\n );\n}\n\nconst key10 = new Uint8Array([\n 198, 202, 21, 223, 79, 110, 19, 182, 119, 13, 230, 89, 58, 175, 186, 162,\n]);\nconst key11 = new Uint8Array([\n 67, 226, 91, 214, 125, 220, 120, 216, 7, 96, 163, 218, 130, 60, 1, 241,\n]);\n\n// Clean-room reverse-engineered\nasync function decryptState(\n data: Uint8Array,\n aesKey: CryptoKey | null,\n): Promise<Uint8Array> {\n if (aesKey === null) {\n return data;\n }\n\n const copy = new Uint8Array(data);\n copy.set(new Uint8Array(await unsafeDecryptBlock(aesKey, copy.slice(3))), 3);\n copy.set(\n new Uint8Array(await unsafeDecryptBlock(aesKey, copy.slice(0, 16))),\n 0,\n );\n\n if (probablyDecodedCorrectly(copy)) {\n return copy;\n }\n\n throw new Error(\"Invalid Gan cube state\");\n}\n\nclass PhysicalState {\n public static async read(\n characteristic: BluetoothRemoteGATTCharacteristic,\n aesKey: CryptoKey | null,\n ): Promise<PhysicalState> {\n const value = await decryptState(\n new Uint8Array((await characteristic.readValue()).buffer),\n aesKey,\n );\n const timeStamp = Date.now();\n // console.log(value);\n return new PhysicalState(new DataView(value.buffer), timeStamp);\n }\n\n private arr: Uint8Array;\n private arrLen = 19;\n private constructor(private dataView: DataView, public timeStamp: number) {\n this.arr = new Uint8Array(dataView.buffer);\n if (this.arr.length !== this.arrLen) {\n throw new Error(\"Unexpected array length\");\n }\n }\n\n public rotQuat(): Quaternion {\n let x = this.dataView.getInt16(0, true) / 16384;\n let y = this.dataView.getInt16(2, true) / 16384;\n let z = this.dataView.getInt16(4, true) / 16384;\n [x, y, z] = [-y, z, -x];\n const wSquared = 1 - (x * x + y * y + z * z);\n const w = wSquared > 0 ? Math.sqrt(wSquared) : 0;\n const quat = new Quaternion(x, y, z, w);\n\n if (!homeQuatInverse) {\n homeQuatInverse = quat.clone().inverse();\n }\n\n return quat.clone().multiply(homeQuatInverse.clone());\n }\n\n // Loops from 255 to 0.\n public moveCounter(): number {\n return this.arr[12];\n }\n\n public numMovesSince(previousMoveCounter: number): number {\n return (this.moveCounter() - previousMoveCounter) & 0xff;\n }\n\n // Due to the design of the Gan356i protocol, it's common to query for the\n // latest physical state and find 0 moves have been performed since the last\n // query. Therefore, it's useful to allow 0 as an argument.\n public latestMoves(n: number): Move[] {\n if (n < 0 || n > MAX_LATEST_MOVES) {\n throw new Error(`Must ask for 0 to 6 latest moves. (Asked for ${n})`);\n }\n return Array.from(this.arr.slice(19 - n, 19)).map(\n (i) => ganMoveToBlockMove[i],\n );\n }\n\n public debugInfo(): { arr: Uint8Array } {\n return {\n arr: this.arr,\n };\n }\n}\n\n// TODO: Short IDs\nconst UUIDs = {\n ganCubeService: \"0000fff0-0000-1000-8000-00805f9b34fb\",\n physicalStateCharacteristic: \"0000fff5-0000-1000-8000-00805f9b34fb\",\n actualAngleAndBatteryCharacteristic: \"0000fff7-0000-1000-8000-00805f9b34fb\",\n faceletStatus1Characteristic: \"0000fff2-0000-1000-8000-00805f9b34fb\",\n faceletStatus2Characteristic: \"0000fff3-0000-1000-8000-00805f9b34fb\",\n infoService: \"0000180a-0000-1000-8000-00805f9b34fb\",\n systemIDCharacteristic: \"00002a23-0000-1000-8000-00805f9b34fb\",\n versionCharacteristic: \"00002a28-0000-1000-8000-00805f9b34fb\",\n};\n\nconst commands: { [cmd: string]: BufferSource } = {\n reset: new Uint8Array([\n 0x00, 0x00, 0x24, 0x00, 0x49, 0x92, 0x24, 0x49, 0x6d, 0x92, 0xdb, 0xb6,\n 0x49, 0x92, 0xb6, 0x24, 0x6d, 0xdb,\n ]),\n};\n\nfunction buf2hex(buffer: ArrayBuffer): string {\n // buffer is an ArrayBuffer\n return (\n Array.prototype.map.call(new Uint8Array(buffer), (x: number) =>\n (\"00\" + x.toString(16)).slice(-2),\n ) as string[]\n ).join(\" \");\n}\n\nconst reidEdgeOrder = \"UF UR UB UL DF DR DB DL FR FL BR BL\".split(\" \");\nconst reidCornerOrder = \"UFR URB UBL ULF DRF DFL DLB DBR\".split(\" \");\n\ninterface PieceInfo {\n piece: number;\n orientation: number;\n}\n\nfunction rotateLeft(s: string, i: number): string {\n return s.slice(i) + s.slice(0, i);\n}\n\nconst pieceMap: { [s: string]: PieceInfo } = {};\n// TODO: Condense the for loops.\nreidEdgeOrder.forEach((edge, idx) => {\n for (let i = 0; i < 2; i++) {\n pieceMap[rotateLeft(edge, i)] = { piece: idx, orientation: i };\n }\n});\nreidCornerOrder.forEach((corner, idx) => {\n for (let i = 0; i < 3; i++) {\n pieceMap[rotateLeft(corner, i)] = { piece: idx, orientation: i };\n }\n});\n\nconst gan356iCornerMappings = [\n [0, 21, 15],\n [5, 13, 47],\n [7, 45, 39],\n [2, 37, 23],\n [29, 10, 16],\n [31, 18, 32],\n [26, 34, 40],\n [24, 42, 8],\n];\n\nconst gan356iEdgeMappings = [\n [1, 22],\n [3, 14],\n [6, 46],\n [4, 38],\n [30, 17],\n [27, 9],\n [25, 41],\n [28, 33],\n [19, 12],\n [20, 35],\n [44, 11],\n [43, 36],\n];\nconst faceOrder = \"URFDLB\";\n\nasync function getKey(\n server: BluetoothRemoteGATTServer,\n): Promise<CryptoKey | null> {\n const infoService = await server.getPrimaryService(UUIDs.infoService);\n\n const versionCharacteristic = await infoService.getCharacteristic(\n UUIDs.versionCharacteristic,\n );\n const versionBuffer = new Uint8Array(\n (await versionCharacteristic.readValue()).buffer,\n );\n\n const versionValue =\n (((versionBuffer[0] << 8) + versionBuffer[1]) << 8) + versionBuffer[2];\n if (versionValue < 0x01_00_08) {\n return null;\n }\n\n const keyXor = versionValue < 0x01_01_00 ? key10 : key11;\n\n const systemIDCharacteristic = await infoService.getCharacteristic(\n UUIDs.systemIDCharacteristic,\n );\n const systemID = new Uint8Array(\n (await systemIDCharacteristic.readValue()).buffer,\n ).reverse();\n\n const key = new Uint8Array(keyXor);\n for (let i = 0; i < systemID.length; i++) {\n key[i] = (key[i] + systemID[i]) % 256;\n }\n\n return importKey(key);\n}\n\nexport class GanCube extends BluetoothPuzzle {\n // We have to perform async operations before we call the constructor.\n public static async connect(\n server: BluetoothRemoteGATTServer,\n ): Promise<GanCube> {\n const ganCubeService = await server.getPrimaryService(UUIDs.ganCubeService);\n debugLog(\"Service:\", ganCubeService);\n\n const physicalStateCharacteristic = await ganCubeService.getCharacteristic(\n UUIDs.physicalStateCharacteristic,\n );\n debugLog(\"Characteristic:\", physicalStateCharacteristic);\n\n const aesKey = await getKey(server);\n\n const initialMoveCounter = (\n await PhysicalState.read(physicalStateCharacteristic, aesKey)\n ).moveCounter();\n debugLog(\"Initial Move Counter:\", initialMoveCounter);\n const cube = new GanCube(\n await puzzles[\"3x3x3\"].def(),\n ganCubeService,\n server,\n physicalStateCharacteristic,\n initialMoveCounter,\n aesKey,\n );\n return cube;\n }\n\n public INTERVAL_MS: number = DEFAULT_INTERVAL_MS;\n private intervalHandle: number | null = null;\n private kpuzzle: KPuzzle;\n private cachedFaceletStatus1Characteristic: Promise<BluetoothRemoteGATTCharacteristic>;\n\n private cachedFaceletStatus2Characteristic: Promise<BluetoothRemoteGATTCharacteristic>;\n\n private cachedActualAngleAndBatteryCharacteristic: Promise<BluetoothRemoteGATTCharacteristic>;\n\n private constructor(\n def: KPuzzleDefinition,\n private service: BluetoothRemoteGATTService,\n private server: BluetoothRemoteGATTServer,\n private physicalStateCharacteristic: BluetoothRemoteGATTCharacteristic,\n private lastMoveCounter: number,\n private aesKey: CryptoKey | null,\n ) {\n super();\n this.kpuzzle = new KPuzzle(def);\n this.startTrackingMoves();\n }\n\n public name(): string | undefined {\n return this.server.device.name;\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n public startTrackingMoves(): void {\n // `window.setInterval` instead of `setInterval`:\n // https://github.com/Microsoft/TypeScript/issues/842#issuecomment-252445883\n this.intervalHandle = window.setInterval(\n this.intervalHandler.bind(this),\n this.INTERVAL_MS,\n );\n }\n\n public stopTrackingMoves(): void {\n if (!this.intervalHandle) {\n throw new Error(\"Not tracking moves!\");\n }\n clearInterval(this.intervalHandle);\n this.intervalHandle = null;\n }\n\n // TODO: Can we ever receive async responses out of order?\n public async intervalHandler(): Promise<void> {\n const physicalState = await PhysicalState.read(\n this.physicalStateCharacteristic,\n this.aesKey,\n );\n let numInterveningMoves = physicalState.numMovesSince(this.lastMoveCounter);\n // console.log(numInterveningMoves);\n if (numInterveningMoves > MAX_LATEST_MOVES) {\n debugLog(\n `Too many moves! Dropping ${\n numInterveningMoves - MAX_LATEST_MOVES\n } moves`,\n );\n numInterveningMoves = MAX_LATEST_MOVES;\n }\n for (const move of physicalState.latestMoves(numInterveningMoves)) {\n // console.log(move);\n this.kpuzzle.applyMove(move);\n this.dispatchMove({\n latestMove: move,\n timeStamp: physicalState.timeStamp,\n debug: physicalState.debugInfo(),\n state: this.kpuzzle.state,\n // quaternion: physicalState.rotQuat(),\n });\n }\n this.dispatchOrientation({\n timeStamp: physicalState.timeStamp,\n quaternion: physicalState.rotQuat(),\n });\n this.lastMoveCounter = physicalState.moveCounter();\n }\n\n public async getBattery(): Promise<number> {\n return new Uint8Array(\n await this.readActualAngleAndBatteryCharacteristic(),\n )[7];\n }\n\n public async getState(): Promise<PuzzleState> {\n const arr: Uint8Array = await decryptState(\n new Uint8Array(await this.readFaceletStatus1Characteristic()),\n this.aesKey,\n );\n const stickers: number[] = [];\n for (let i = 0; i < 18; i += 3) {\n let v = (((arr[i ^ 1] << 8) + arr[(i + 1) ^ 1]) << 8) + arr[(i + 2) ^ 1];\n for (let j = 0; j < 8; j++) {\n stickers.push(v & 7);\n v >>= 3;\n }\n }\n\n const state: PuzzleState = {\n CORNERS: {\n permutation: [],\n orientation: [],\n },\n EDGES: {\n permutation: [],\n orientation: [],\n },\n CENTERS: {\n permutation: [0, 1, 2, 3, 4, 5],\n orientation: [0, 0, 0, 0, 0, 0],\n },\n };\n\n for (const cornerMapping of gan356iCornerMappings) {\n const pieceInfo: PieceInfo =\n pieceMap[cornerMapping.map((i) => faceOrder[stickers[i]]).join(\"\")];\n state.CORNERS.permutation.push(pieceInfo.piece);\n state.CORNERS.orientation.push(pieceInfo.orientation);\n }\n\n for (const edgeMapping of gan356iEdgeMappings) {\n const pieceInfo: PieceInfo =\n pieceMap[edgeMapping.map((i) => faceOrder[stickers[i]]).join(\"\")];\n state.EDGES.permutation.push(pieceInfo.piece);\n state.EDGES.orientation.push(pieceInfo.orientation);\n }\n\n return state;\n }\n\n public async faceletStatus1Characteristic(): Promise<BluetoothRemoteGATTCharacteristic> {\n this.cachedFaceletStatus1Characteristic =\n this.cachedFaceletStatus1Characteristic ||\n this.service.getCharacteristic(UUIDs.faceletStatus1Characteristic);\n return this.cachedFaceletStatus1Characteristic;\n }\n\n public async faceletStatus2Characteristic(): Promise<BluetoothRemoteGATTCharacteristic> {\n this.cachedFaceletStatus2Characteristic =\n this.cachedFaceletStatus2Characteristic ||\n this.service.getCharacteristic(UUIDs.faceletStatus2Characteristic);\n return this.cachedFaceletStatus2Characteristic;\n }\n\n public async actualAngleAndBatteryCharacteristic(): Promise<BluetoothRemoteGATTCharacteristic> {\n this.cachedActualAngleAndBatteryCharacteristic =\n this.cachedActualAngleAndBatteryCharacteristic ||\n this.service.getCharacteristic(UUIDs.actualAngleAndBatteryCharacteristic);\n return this.cachedActualAngleAndBatteryCharacteristic;\n }\n\n public async reset(): Promise<void> {\n const faceletStatus1Characteristic =\n await this.faceletStatus1Characteristic();\n await faceletStatus1Characteristic.writeValue(commands.reset);\n }\n\n public async readFaceletStatus1Characteristic(): Promise<ArrayBuffer> {\n const faceletStatus1Characteristic =\n await this.faceletStatus1Characteristic();\n return (await faceletStatus1Characteristic.readValue()).buffer;\n }\n\n public async readFaceletStatus2Characteristic(): Promise<string> {\n const faceletStatus2Characteristic =\n await this.faceletStatus2Characteristic();\n return buf2hex((await faceletStatus2Characteristic.readValue()).buffer);\n }\n\n public async readActualAngleAndBatteryCharacteristic(): Promise<ArrayBuffer> {\n const actualAngleAndBatteryCharacteristic =\n await this.actualAngleAndBatteryCharacteristic();\n return (await actualAngleAndBatteryCharacteristic.readValue()).buffer;\n }\n\n // TODO\n // private onphysicalStateCharacteristicChanged(event: any): void {\n // var val = event.target.value;\n // debugLog(val);\n // }\n}\n\n// // TODO: Move this into a factory?\nexport const ganConfig: BluetoothConfig<BluetoothPuzzle> = {\n connect: GanCube.connect.bind(GanCube),\n prefixes: [\"GAN\"],\n filters: [{ namePrefix: \"GAN\" }],\n optionalServices: [UUIDs.ganCubeService, UUIDs.infoService],\n};\n", "const blockSize = 16;\nconst zeros = new Uint8Array(blockSize);\nconst paddingBlockPlaintext = new Uint8Array(\n new Array(blockSize).fill(blockSize),\n);\nconst AES_CBC = \"AES-CBC\";\n\nexport async function importKey(keyBytes: ArrayBuffer): Promise<CryptoKey> {\n return await crypto.subtle.importKey(\"raw\", keyBytes, AES_CBC, true, [\n \"encrypt\",\n \"decrypt\",\n ]);\n}\n\nasync function unsafeEncryptBlockWithIV(\n key: CryptoKey,\n plaintextBlock: ArrayBuffer,\n iv: ArrayBuffer,\n): Promise<ArrayBuffer> {\n return (\n await window.crypto.subtle.encrypt(\n {\n name: AES_CBC,\n iv,\n },\n key,\n plaintextBlock,\n )\n ).slice(0, blockSize);\n}\n\nexport async function unsafeEncryptBlock(\n key: CryptoKey,\n plaintextBlock: ArrayBuffer,\n): Promise<ArrayBuffer> {\n return (await unsafeEncryptBlockWithIV(key, plaintextBlock, zeros)).slice(\n 0,\n blockSize,\n );\n}\n\nexport async function unsafeDecryptBlock(\n key: CryptoKey,\n ciphertextBlock: ArrayBuffer,\n): Promise<ArrayBuffer> {\n const paddingBlock = await unsafeEncryptBlockWithIV(\n key,\n paddingBlockPlaintext,\n ciphertextBlock,\n );\n\n const cbcCiphertext = new Uint8Array(2 * blockSize);\n cbcCiphertext.set(new Uint8Array(ciphertextBlock), 0);\n cbcCiphertext.set(new Uint8Array(paddingBlock), blockSize);\n\n return (\n await window.crypto.subtle.decrypt(\n {\n name: AES_CBC,\n iv: zeros,\n },\n key,\n cbcCiphertext,\n )\n ).slice(0, blockSize);\n}\n", "/* tslint:disable no-bitwise */\n\nimport { Move } from \"../../alg\";\nimport type { Transformation } from \"../../kpuzzle\";\nimport {\n BluetoothConfig,\n BluetoothPuzzle,\n PuzzleState,\n} from \"./bluetooth-puzzle\";\nimport { debugLog } from \"../debug\";\n\nconst MESSAGE_LENGTH = 20;\n\nconst UUIDs = {\n cubeService: \"0000aadb-0000-1000-8000-00805f9b34fb\",\n cubeCharacteristic: \"0000aadc-0000-1000-8000-00805f9b34fb\",\n};\n\n// TODO: Expose for testing.\nfunction giikerMoveToAlgMove(face: number, amount: number): Move {\n switch (amount) {\n case 3:\n amount = -1;\n break;\n case 9:\n debugLog(\"Encountered 9\", face, amount);\n amount = -2;\n break;\n }\n\n const family = [\"?\", \"B\", \"D\", \"L\", \"U\", \"R\", \"F\"][face];\n return new Move(family, amount);\n}\n\nexport { giikerMoveToAlgMove as giikerMoveToAlgMoveForTesting };\n\nfunction giikerStateStr(giikerState: number[]): string {\n let str = \"\";\n str += giikerState.slice(0, 8).join(\".\");\n str += \"\\n\";\n str += giikerState.slice(8, 16).join(\".\");\n str += \"\\n\";\n str += giikerState.slice(16, 28).join(\".\");\n str += \"\\n\";\n str += giikerState.slice(28, 32).join(\".\");\n str += \"\\n\";\n str += giikerState.slice(32, 40).join(\".\");\n return str;\n}\n\n// TODO\n// const Reid333Orbits = {\n// \"EDGES\": {\"numPieces\": 12, \"orientations\": 2},\n// \"CORNERS\": {\"numPieces\": 8, \"orientations\": 3},\n// \"CENTERS\": {\"numPieces\": 6, \"orientations\": 4}\n// };\n\nconst Reid333SolvedCenters = {\n permutation: [0, 1, 2, 3, 4, 5],\n orientation: [0, 0, 0, 0, 0, 0],\n};\n\nconst epGiiKERtoReid333: number[] = [4, 8, 0, 9, 5, 1, 3, 7, 6, 10, 2, 11];\nconst epReid333toGiiKER: number[] = [2, 5, 10, 6, 0, 4, 8, 7, 1, 3, 9, 11];\n\nconst preEO: number[] = [1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0];\nconst postEO: number[] = [1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0];\n\nconst cpGiiKERtoReid333: number[] = [4, 0, 3, 5, 7, 1, 2, 6];\nconst cpReid333toGiiKER: number[] = [1, 5, 6, 2, 0, 3, 7, 4];\n\nconst preCO: number[] = [1, 2, 1, 2, 2, 1, 2, 1];\nconst postCO: number[] = [2, 1, 2, 1, 1, 2, 1, 2];\n\nconst coFlip: number[] = [-1, 1, -1, 1, 1, -1, 1, -1];\n\nfunction getNibble(val: Uint8Array, i: number): number {\n if (i % 2 === 1) {\n return val[(i / 2) | 0] % 16;\n }\n return 0 | (val[(i / 2) | 0] / 16);\n}\n\nfunction probablyEncrypted(data: Uint8Array): boolean {\n return data[18] === 0xa7;\n}\n\nconst lookup = [\n 176, 81, 104, 224, 86, 137, 237, 119, 38, 26, 193, 161, 210, 126, 150, 81, 93,\n 13, 236, 249, 89, 235, 88, 24, 113, 81, 214, 131, 130, 199, 2, 169, 39, 165,\n 171, 41,\n];\n\nfunction decryptState(data: Uint8Array): Uint8Array {\n const offset1 = getNibble(data, 38);\n const offset2 = getNibble(data, 39);\n const output = new Uint8Array(MESSAGE_LENGTH);\n for (let i = 0; i < MESSAGE_LENGTH; i++) {\n output[i] = data[i] + lookup[offset1 + i] + lookup[offset2 + i];\n }\n return output;\n}\n\n// TODO: Support caching which decoding strategy worked last time.\nasync function decodeState(data: Uint8Array): Promise<Uint8Array> {\n if (!probablyEncrypted(data)) {\n return data;\n }\n return decryptState(data);\n // TODO: Check that the decrypted state is a valid staet.\n}\n\nexport class GiiKERCube extends BluetoothPuzzle {\n public static async connect(\n server: BluetoothRemoteGATTServer,\n ): Promise<GiiKERCube> {\n const cubeService = await server.getPrimaryService(UUIDs.cubeService);\n debugLog(\"Service:\", cubeService);\n\n const cubeCharacteristic = await cubeService.getCharacteristic(\n UUIDs.cubeCharacteristic,\n );\n debugLog(\"Characteristic:\", cubeCharacteristic);\n\n // TODO: Can we safely save the async promise instead of waiting for the response?\n\n const originalValue = await decodeState(\n new Uint8Array((await cubeCharacteristic.readValue()).buffer),\n );\n debugLog(\"Original value:\", originalValue);\n const cube = new GiiKERCube(server, cubeCharacteristic, originalValue);\n\n await cubeCharacteristic.startNotifications();\n cubeCharacteristic.addEventListener(\n \"characteristicvaluechanged\",\n cube.onCubeCharacteristicChanged.bind(cube),\n );\n\n return cube;\n }\n\n private constructor(\n private server: BluetoothRemoteGATTServer,\n private cubeCharacteristic: BluetoothRemoteGATTCharacteristic,\n private originalValue?: Uint8Array | null,\n ) {\n super();\n }\n\n public name(): string | undefined {\n return this.server.device.name;\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n public async getState(): Promise<PuzzleState> {\n return this.toReid333(\n new Uint8Array((await this.cubeCharacteristic.readValue()).buffer),\n );\n }\n\n private getBit(val: Uint8Array, i: number): number {\n const n = (i / 8) | 0;\n const shift = 7 - (i % 8);\n return (val[n] >> shift) & 1;\n }\n\n private toReid333(val: Uint8Array): Transformation {\n const state = {\n EDGES: {\n permutation: new Array(12),\n orientation: new Array(12),\n },\n CORNERS: {\n permutation: new Array(8),\n orientation: new Array(8),\n },\n CENTERS: Reid333SolvedCenters,\n };\n\n for (let i = 0; i < 12; i++) {\n const gi = epReid333toGiiKER[i];\n state.EDGES.permutation[i] =\n epGiiKERtoReid333[getNibble(val, gi + 16) - 1];\n state.EDGES.orientation[i] =\n this.getBit(val, gi + 112) ^\n preEO[state.EDGES.permutation[i]] ^\n postEO[i];\n }\n for (let i = 0; i < 8; i++) {\n const gi = cpReid333toGiiKER[i];\n state.CORNERS.permutation[i] = cpGiiKERtoReid333[getNibble(val, gi) - 1];\n state.CORNERS.orientation[i] =\n (getNibble(val, gi + 8) * coFlip[gi] +\n preCO[state.CORNERS.permutation[i]] +\n postCO[i]) %\n 3;\n }\n return state;\n }\n\n private async onCubeCharacteristicChanged(event: any): Promise<void> {\n const val = await decodeState(new Uint8Array(event.target.value.buffer));\n debugLog(val);\n debugLog(val);\n\n if (this.isRepeatedInitialValue(val)) {\n debugLog(\"Skipping repeated initial value.\");\n return;\n }\n\n const giikerState = [];\n for (let i = 0; i < MESSAGE_LENGTH; i++) {\n giikerState.push(Math.floor(val[i] / 16));\n giikerState.push(val[i] % 16);\n }\n debugLog(giikerState);\n const str = giikerStateStr(giikerState);\n debugLog(str);\n\n this.dispatchMove({\n latestMove: giikerMoveToAlgMove(giikerState[32], giikerState[33]),\n timeStamp: event.timeStamp,\n debug: {\n stateStr: str,\n },\n state: this.toReid333(val),\n });\n }\n\n private isRepeatedInitialValue(val: Uint8Array): boolean {\n if (typeof this.originalValue === \"undefined\") {\n // TODO: Test this branch.\n throw new Error(\"GiiKERCube has uninitialized original value.\");\n }\n\n if (this.originalValue === null) {\n return false;\n }\n\n const originalValue = this.originalValue;\n // Reset the value here, so we can return early below.\n this.originalValue = null;\n\n debugLog(\"Comparing against original value.\");\n for (let i = 0; i < MESSAGE_LENGTH - 2; i++) {\n if (originalValue[i] !== val[i]) {\n debugLog(\"Different at index \", i);\n return false;\n }\n }\n return true;\n }\n}\n\n// TODO: Move this into a factory?\nexport const giiKERConfig: BluetoothConfig<BluetoothPuzzle> = {\n connect: GiiKERCube.connect.bind(GiiKERCube),\n prefixes: [\"Gi\", \"\"], // Hack\n filters: [\n // Known prefixes: GiC, GiS (3x3x3), Gi2 (2x2x2)\n // Suspected prefixes GiY, Gi3\n { namePrefix: \"Gi\" },\n { services: [\"0000aadb-0000-1000-8000-00805f9b34fb\"] },\n { services: [\"0000aaaa-0000-1000-8000-00805f9b34fb\"] },\n { services: [\"0000fe95-0000-1000-8000-00805f9b34fb\"] },\n ],\n optionalServices: [\n // \"00001530-1212-efde-1523-785feabcd123\",\n // \"0000aaaa-0000-1000-8000-00805f9b34fb\",\n UUIDs.cubeService,\n // \"0000180f-0000-1000-8000-00805f9b34fb\",\n // \"0000180a-0000-1000-8000-00805f9b34fb\"\n ],\n};\n", "import { Quaternion } from \"three\";\nimport { Alg, experimentalAppendMove, Move } from \"../../alg\";\nimport { debugLog } from \"../debug\";\nimport { BluetoothConfig, BluetoothPuzzle } from \"./bluetooth-puzzle\";\n\nconst UUIDs = {\n goCubeService: \"6e400001-b5a3-f393-e0a9-e50e24dcca9e\",\n goCubeStateCharacteristic: \"6e400003-b5a3-f393-e0a9-e50e24dcca9e\",\n};\n\n// https://stackoverflow.com/a/40031979\nfunction buf2hex(buffer: ArrayBuffer): string {\n // buffer is an ArrayBuffer\n return (\n Array.prototype.map.call(new Uint8Array(buffer), (x: number) =>\n (\"00\" + x.toString(16)).slice(-2),\n ) as string[]\n ).join(\" \");\n}\n\nfunction bufferToString(buffer: ArrayBuffer): string {\n const byteView = new Uint8Array(buffer);\n let str = \"\";\n for (const charCode of byteView) {\n str += String.fromCharCode(charCode);\n }\n return str;\n}\n\nconst moveMap: Move[] = [\n new Move(\"B\", 1),\n new Move(\"B\", -1),\n new Move(\"F\", 1),\n new Move(\"F\", -1),\n new Move(\"U\", 1),\n new Move(\"U\", -1),\n new Move(\"D\", 1),\n new Move(\"D\", -1),\n new Move(\"R\", 1),\n new Move(\"R\", -1),\n new Move(\"L\", 1),\n new Move(\"L\", -1),\n];\n\nexport class GoCube extends BluetoothPuzzle {\n // We have to perform async operations before we call the constructor.\n public static async connect(\n server: BluetoothRemoteGATTServer,\n ): Promise<GoCube> {\n const service = await server.getPrimaryService(UUIDs.goCubeService);\n debugLog({ service });\n const goCubeStateCharacteristic = await service.getCharacteristic(\n UUIDs.goCubeStateCharacteristic,\n );\n debugLog({ goCubeStateCharacteristic });\n\n const cube = new GoCube(server, goCubeStateCharacteristic);\n\n await goCubeStateCharacteristic.startNotifications();\n goCubeStateCharacteristic.addEventListener(\n \"characteristicvaluechanged\",\n cube.onCubeCharacteristicChanged.bind(cube),\n );\n\n return cube;\n }\n\n // public async getState(): Promise<PuzzleState> {\n // return new Promise((resolve, reject) => {\n // this.resolve = (value: any) => {\n // resolve(buf2hex(value.buffer) as any);\n // };\n // this.goCubeStateCharacteristic.startNotifications();\n // });\n // }\n\n private recorded: any[][] = [];\n\n private homeQuatInverse: Quaternion | null = null;\n private lastRawQuat: Quaternion = new Quaternion(0, 0, 0, 1);\n private currentQuat: Quaternion = new Quaternion(0, 0, 0, 1);\n private lastTarget: Quaternion = new Quaternion(0, 0, 0, 1);\n private alg: Alg = new Alg();\n\n private constructor(\n private server: BluetoothRemoteGATTServer,\n public goCubeStateCharacteristic: BluetoothRemoteGATTCharacteristic,\n ) {\n super();\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n public reset(): void {\n this.resetAlg();\n this.resetOrientation();\n }\n\n public resetAlg(alg?: Alg): void {\n this.alg = alg || new Alg();\n }\n\n public resetOrientation(): void {\n this.homeQuatInverse = this.lastRawQuat.clone().inverse();\n this.currentQuat = new Quaternion(0, 0, 0, 1);\n this.lastTarget = new Quaternion(0, 0, 0, 1);\n }\n\n public name(): string | undefined {\n return this.server.device.name;\n }\n\n private onCubeCharacteristicChanged(event: any): void {\n const buffer: DataView = event.target.value;\n this.recorded.push([event.timeStamp, buf2hex(buffer.buffer)]);\n // TODO: read bytes from buffer instead of guessing meaning based on length.\n if (buffer.byteLength < 16) {\n for (let i = 3; i < buffer.byteLength - 4; i += 2) {\n const move = moveMap[buffer.getUint8(i)];\n this.alg = experimentalAppendMove(this.alg, move);\n this.dispatchMove({\n latestMove: moveMap[buffer.getUint8(i)],\n timeStamp: event.timeStamp,\n debug: {\n stateStr: buf2hex(buffer.buffer),\n },\n });\n }\n } else {\n const coords = bufferToString(\n buffer.buffer.slice(3, buffer.byteLength - 3),\n )\n .split(\"#\")\n .map((s) => parseInt(s, 10) / 16384);\n const quat = new Quaternion(coords[0], coords[1], coords[2], coords[3]);\n\n this.lastRawQuat = quat.clone();\n\n if (!this.homeQuatInverse) {\n this.homeQuatInverse = quat.clone().inverse();\n }\n\n const targetQuat = quat.clone().multiply(this.homeQuatInverse.clone());\n targetQuat.y = -targetQuat.y; // GoCube axis fix.\n\n this.lastTarget.slerp(targetQuat, 0.5);\n this.currentQuat.rotateTowards(this.lastTarget, rotateTowardsRate);\n\n this.dispatchOrientation({\n quaternion: this.currentQuat,\n timeStamp: event.timeStamp,\n });\n }\n }\n}\n\nconst rotateTowardsRate = 0.5;\n\n// TODO: Move this into a factory?\nexport const goCubeConfig: BluetoothConfig<BluetoothPuzzle> = {\n connect: GoCube.connect.bind(GoCube),\n prefixes: [\"GoCube\", \"Rubik\"],\n filters: [{ namePrefix: \"GoCube\" }, { namePrefix: \"Rubik\" }],\n optionalServices: [UUIDs.goCubeService],\n};\n", "export function flipBitOrder(v: number, numBits: number): number {\n let result = 0;\n for (let i = 0; i < numBits; i++) {\n const shiftLeft = numBits - 1 - 2 * i;\n const unShiftedBit = v & (0b1 << i);\n // console.log(\n // unShiftedBit,\n // shiftLeft,\n // shiftLeft < 0 ? unShiftedBit >> -shiftLeft : unShiftedBit << shiftLeft,\n // );\n result +=\n shiftLeft < 0 ? unShiftedBit >> -shiftLeft : unShiftedBit << shiftLeft;\n }\n return result;\n}\n", "/* tslint:disable no-bitwise */\n\nimport { Move } from \"../../alg\";\nimport type { KPuzzleDefinition } from \"../../kpuzzle\";\nimport {\n experimentalBinaryComponentsToReid3x3x3,\n experimentalTwizzleBinaryToBinaryComponents,\n} from \"../../protocol\";\nimport { puzzles } from \"../../puzzles\";\nimport { debugLog } from \"../debug\";\nimport {\n BluetoothConfig,\n BluetoothPuzzle,\n PuzzleState,\n} from \"./bluetooth-puzzle\";\nimport { flipBitOrder } from \"./endianness\";\n\n// TODO: Short IDs\nconst UUIDs = {\n heykubeService: \"b46a791a-8273-4fc1-9e67-94d3dc2aac1c\",\n stateCharacteristic: \"a2f41a4e-0e31-4bbc-9389-4253475481fb\",\n batteryCharacteristic: \"fd51b3ba-99c7-49c6-9f85-5644ff56a378\",\n};\n\nexport class HeykubeCube extends BluetoothPuzzle {\n // We have to perform async operations before we call the constructor.\n public static async connect(\n server: BluetoothRemoteGATTServer,\n device: BluetoothDevice,\n ): Promise<HeykubeCube> {\n const service = await server.getPrimaryService(UUIDs.heykubeService);\n debugLog(\"Service:\", service);\n\n const stateCharacteristic = await service.getCharacteristic(\n UUIDs.stateCharacteristic,\n );\n debugLog(\"Characteristic:\", stateCharacteristic);\n\n const cube = new HeykubeCube(\n await puzzles[\"3x3x3\"].def(),\n service,\n device,\n server,\n stateCharacteristic,\n );\n return cube;\n }\n\n private constructor(\n _def: KPuzzleDefinition,\n _service: BluetoothRemoteGATTService,\n device: BluetoothDevice,\n private server: BluetoothRemoteGATTServer,\n private stateCharacteristic: BluetoothRemoteGATTCharacteristic,\n ) {\n super();\n\n device.addEventListener(\n \"gattserverdisconnected\",\n this.onDisconnect.bind(this),\n );\n\n this.stateCharacteristic.startNotifications();\n this.startTrackingMoves();\n }\n\n public name(): string | undefined {\n return this.server.device.name;\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n onDisconnect(): void {\n this.dispatchEvent(new CustomEvent(\"disconnect\"));\n }\n\n public startTrackingMoves(): void {\n this.stateCharacteristic.addEventListener(\n \"characteristicvaluechanged\",\n (e: any) => this.onStateCharacteristic(e),\n ); // TODO\n }\n\n // public stopTrackingMoves(): void {}\n\n // public async getBattery(): Promise<number> {\n // return new Uint8Array(\n // await this.readActualAngleAndBatteryCharacteristic(),\n // )[7];\n // }srcElement: BluetoothRemoteGATTCharacteristic\n\n private onStateCharacteristic(event: {\n target: BluetoothRemoteGATTCharacteristic;\n timeStamp: number;\n }): void {\n const state = this.decodeState(event.target.value!);\n // console.log(event, state.latestMove.toString(), state);\n this.dispatchMove({\n latestMove: state.latestMove,\n timeStamp: event.timeStamp,\n state: state.state,\n });\n }\n\n private decodeState(dv: DataView): { state: PuzzleState; latestMove: Move } {\n const moves = [\n new Move(\"U\"),\n new Move(\"U'\"),\n new Move(\"B\"),\n new Move(\"B'\"),\n new Move(\"F\"),\n new Move(\"F'\"),\n null,\n null,\n new Move(\"L\"),\n new Move(\"L'\"),\n new Move(\"D\"),\n new Move(\"D'\"),\n new Move(\"R\"),\n new Move(\"R'\"),\n // null,\n // null,\n ];\n\n const b2 = new Uint8Array(dv.byteLength);\n for (let i = 0; i < dv.byteLength; i++) {\n b2[i] = flipBitOrder(dv.getUint8(i), 8);\n }\n const components1 = experimentalTwizzleBinaryToBinaryComponents(\n b2.slice(0, 11),\n );\n // console.log(\"sliced\", dv.byteLength, bufferToSpacedHex(b2.slice(11)));\n const components2 = {\n epLex: flipBitOrder(components1.epLex, 29),\n eoMask: flipBitOrder(components1.eoMask, 12),\n cpLex: flipBitOrder(components1.cpLex, 16),\n coMask: flipBitOrder(components1.coMask, 13),\n poIdxL: 0,\n poIdxU: 0b111,\n moSupport: 0b1, // TODO\n moMask: 0,\n };\n // console.log(components2, binaryComponentsToReid3x3x3(components2));\n\n return {\n state: experimentalBinaryComponentsToReid3x3x3(components2),\n latestMove: moves[b2[20] & 0b00001111]!,\n };\n }\n\n public async getState(): Promise<PuzzleState> {\n const b1 = await this.stateCharacteristic.readValue();\n return this.decodeState(b1).state;\n }\n}\n\n// // TODO: Move this into a factory?\nexport const heykubeConfig: BluetoothConfig<BluetoothPuzzle> = {\n connect: HeykubeCube.connect.bind(HeykubeCube),\n prefixes: [\"HEYKUBE\"],\n filters: [{ namePrefix: \"HEYKUBE\" }],\n optionalServices: [UUIDs.heykubeService],\n};\n", "import { bluetoothConnect, BluetoothConnectOptions } from \"../connect\";\nimport type { BluetoothPuzzle } from \"./bluetooth-puzzle\";\nimport { ganConfig } from \"./gan\";\nimport { giiKERConfig } from \"./giiker\";\nimport { goCubeConfig } from \"./gocube\";\nimport { heykubeConfig } from \"./Heykube\";\n\nconst smartPuzzleConfigs = [\n ganConfig,\n goCubeConfig,\n heykubeConfig,\n giiKERConfig, // GiiKER must be last, due to Xiaomi naming. TODO: enforce this using tests.\n];\n\nexport async function connectSmartPuzzle(\n options?: BluetoothConnectOptions,\n): Promise<BluetoothPuzzle> {\n return bluetoothConnect<BluetoothPuzzle>(smartPuzzleConfigs, options);\n}\n", "import { Alg, Move } from \"../../alg\";\nimport type { BluetoothConfig } from \"../smart-puzzle/bluetooth-puzzle\";\n\n// TODO: Remove this. It's only used for debugging.\nfunction buf2hex(buffer: ArrayBuffer): string {\n // buffer is an ArrayBuffer\n return (\n Array.prototype.map.call(new Uint8Array(buffer), (x: number) =>\n (\"00\" + x.toString(16)).slice(-2),\n ) as string[]\n ).join(\" \");\n}\n\nconst MAX_NIBBLES_PER_WRITE = 18 * 2;\nconst QUANTUM_TURN_DURATION_MS = 150;\nconst DOUBLE_TURN_DURATION_MS = 250;\n\nconst U_D_SWAP = new Alg(\"F B R2 L2 B' F'\");\nconst U_D_UNSWAP = U_D_SWAP.invert(); // TODO: make `cubing.js` clever enough to be able to reuse the regular swap.\nconst F_B_SWAP = new Alg(\"U D R2 L2 D' U'\");\nconst F_B_UNSWAP = F_B_SWAP.invert();\n\n// TODO: Short IDs\nconst UUIDs = {\n ganRobotService: \"0000fff0-0000-1000-8000-00805f9b34fb\",\n statusCharacteristic: \"0000fff2-0000-1000-8000-00805f9b34fb\",\n moveCharacteristic: \"0000fff3-0000-1000-8000-00805f9b34fb\",\n};\n\nconst moveMap: Record<string, number> = {\n \"R\": 0,\n \"R2\": 1,\n \"R2'\": 1,\n \"R'\": 2,\n \"F\": 3,\n \"F2\": 4,\n \"F2'\": 4,\n \"F'\": 5,\n \"D\": 6,\n \"D2\": 7,\n \"D2'\": 7,\n \"D'\": 8,\n \"L\": 9,\n \"L2\": 10,\n \"L2'\": 10,\n \"L'\": 11,\n \"B\": 12,\n \"B2\": 13,\n \"B2'\": 13,\n \"B'\": 14,\n};\n\nconst moveMapX: Record<string, number> = {\n \"R\": 0,\n \"R2\": 1,\n \"R2'\": 1,\n \"R'\": 2,\n \"U\": 3,\n \"U2\": 4,\n \"U2'\": 4,\n \"U'\": 5,\n \"F\": 6,\n \"F2\": 7,\n \"F2'\": 7,\n \"F'\": 8,\n \"L\": 9,\n \"L2\": 10,\n \"L2'\": 10,\n \"L'\": 11,\n \"D\": 12,\n \"D2\": 13,\n \"D2'\": 13,\n \"D'\": 14,\n};\n\nfunction isDoubleTurnNibble(nibble: number): boolean {\n return nibble % 3 === 1;\n}\n\nfunction nibbleDuration(nibble: number): number {\n return isDoubleTurnNibble(nibble)\n ? DOUBLE_TURN_DURATION_MS\n : QUANTUM_TURN_DURATION_MS;\n}\n\nfunction throwInvalidMove(move: Move) {\n console.error(\"invalid move\", move, move.toString());\n throw new Error(\"invalid move!\");\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface GanRobotStatus {\n movesRemaining: number;\n}\n\ninterface GanRobotOptions {\n xAngle: boolean;\n singleMoveFixHack: boolean;\n bufferQueue: number;\n postSleep: number;\n}\n\nexport class GanRobot extends EventTarget {\n experimentalDebugOnSend: ((alg: Alg) => void) | null = null;\n experimentalDebugLog: typeof console.log = () => {};\n\n // Because our Bluetooth connection code is set up not to know what kind of device is connecting, we put these options directly on the class.\n experimentalOptions: GanRobotOptions = {\n xAngle: false,\n singleMoveFixHack: false,\n bufferQueue: 0,\n postSleep: 0,\n };\n\n constructor(\n _service: BluetoothRemoteGATTService,\n private server: BluetoothRemoteGATTServer,\n device: BluetoothDevice,\n private statusCharacteristic: BluetoothRemoteGATTCharacteristic,\n private moveCharacteristic: BluetoothRemoteGATTCharacteristic,\n ) {\n super();\n device.addEventListener(\n \"gattserverdisconnected\",\n this.onDisconnect.bind(this),\n );\n }\n\n // We have to perform async operations before we call the constructor.\n static async connect(\n server: BluetoothRemoteGATTServer,\n device: BluetoothDevice,\n ) {\n const ganTimerService = await server.getPrimaryService(\n UUIDs.ganRobotService,\n );\n const statusCharacteristic = await ganTimerService.getCharacteristic(\n UUIDs.statusCharacteristic,\n );\n const moveCharacteristic = await ganTimerService.getCharacteristic(\n UUIDs.moveCharacteristic,\n );\n const timer = new GanRobot(\n ganTimerService,\n server,\n device,\n statusCharacteristic,\n moveCharacteristic,\n );\n return timer;\n }\n\n public name(): string | undefined {\n return this.server.device.name;\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n onDisconnect(): void {\n this.dispatchEvent(new CustomEvent(\"disconnect\"));\n }\n\n private moveToNibble(move: Move): number {\n const nibble =\n (this.experimentalOptions.xAngle ? moveMapX : moveMap)[move.toString()] ??\n null;\n if (nibble === null) {\n throwInvalidMove(move);\n }\n return nibble;\n }\n\n private async writeNibbles(nibbles: number[]): Promise<void> {\n if (nibbles.length > MAX_NIBBLES_PER_WRITE) {\n throw new Error(\n `Can only write ${MAX_NIBBLES_PER_WRITE} nibbles at a time!`,\n );\n }\n // const byteLength = Math.ceil(nibbles.length / 2);\n const bytes = new Uint8Array(18);\n let i: number;\n for (i = 0; i < nibbles.length; i++) {\n const byteIdx = Math.floor(i / 2);\n bytes[byteIdx] += nibbles[i];\n if (i % 2 === 0) {\n bytes[byteIdx] *= 0x10;\n }\n }\n if (nibbles.length % 2 === 1) {\n bytes[Math.ceil(nibbles.length / 2) - 1] += 0xf;\n }\n for (let i = Math.ceil(nibbles.length / 2); i < 18; i++) {\n bytes[i] = 0xff;\n }\n let sleepDuration = 0;\n for (const nibble of nibbles) {\n sleepDuration += nibbleDuration(nibble);\n }\n this.experimentalDebugLog(\"WRITING:\", buf2hex(bytes));\n await this.moveCharacteristic.writeValue(bytes);\n await sleep(sleepDuration * 0.75);\n while ((await this.getStatus()).movesRemaining > 0) {\n // repeat\n }\n await sleep(this.experimentalOptions.postSleep);\n }\n\n private async getStatus(): Promise<GanRobotStatus> {\n const statusBytes = new Uint8Array(\n (await this.statusCharacteristic.readValue()).buffer,\n );\n this.experimentalDebugLog(\"moves remaining:\", statusBytes[0]);\n return {\n movesRemaining: statusBytes[0],\n };\n }\n\n locked: boolean = false;\n processQueue(): void {}\n\n private moveQueue: Alg = new Alg();\n // TODO: Don't let this resolve until the move is done?\n private async queueMoves(moves: Alg): Promise<void> {\n this.moveQueue = this.moveQueue\n .concat(moves)\n .simplify({ collapseMoves: true, quantumMoveOrder: (_) => 4 });\n if (!this.locked) {\n // TODO: We're currently iterating over units instead of leaves to avoid \"zip bomps\".\n try {\n this.locked = true;\n if (this.moveQueue.experimentalNumUnits() === 1) {\n await sleep(this.experimentalOptions.bufferQueue);\n }\n // await this.writeNibbles([0xf, 0xf]);\n while (this.moveQueue.experimentalNumUnits() > 0) {\n let units = Array.from(this.moveQueue.units());\n if (\n this.experimentalOptions.singleMoveFixHack &&\n units.length === 1\n ) {\n const move = units[0] as Move;\n if (move.amount === 2) {\n units = [\n move.modified({ amount: 1 }),\n move.modified({ amount: 1 }),\n ];\n } else {\n units = [\n move.modified({ amount: -move.amount }),\n move.modified({ amount: 2 }),\n ];\n }\n }\n const moves = units.splice(0, MAX_NIBBLES_PER_WRITE);\n const nibbles: number[] = moves.map(this.moveToNibble.bind(this));\n const sending = new Alg(moves);\n this.experimentalDebugLog(\"SENDING\", sending.toString());\n if (this.experimentalDebugOnSend) {\n this.experimentalDebugOnSend(sending);\n }\n const write = this.writeNibbles(nibbles);\n this.moveQueue = new Alg(units);\n await write;\n }\n } finally {\n this.locked = false;\n }\n }\n }\n\n async applyMoves(moves: Iterable<Move>): Promise<void> {\n // const nibbles: number[] = [];\n for (const move of moves) {\n const str = move.toString();\n if (str in (this.experimentalOptions.xAngle ? moveMapX : moveMap)) {\n await this.queueMoves(new Alg([move]));\n } else if (\n move.family === (this.experimentalOptions.xAngle ? \"B\" : \"U\")\n ) {\n // We purposely send just the swap, so that U2 will get coalesced\n await Promise.all([\n this.queueMoves(\n this.experimentalOptions.xAngle ? F_B_SWAP : U_D_SWAP,\n ),\n this.queueMoves(\n new Alg([\n move.modified({\n family: this.experimentalOptions.xAngle ? \"F\" : \"D\",\n }),\n ]).concat(\n this.experimentalOptions.xAngle ? F_B_UNSWAP : U_D_UNSWAP,\n ),\n ),\n ]);\n }\n }\n }\n}\n\n// // TODO: Move this into a factory?\nexport const ganTimerConfig: BluetoothConfig<GanRobot> = {\n connect: GanRobot.connect.bind(GanRobot),\n prefixes: [\"GAN\"],\n filters: [{ namePrefix: \"GAN\" }],\n optionalServices: [UUIDs.ganRobotService],\n};\n", "import { bluetoothConnect, BluetoothConnectOptions } from \"../connect\";\nimport type { BluetoothConfig } from \"../smart-puzzle/bluetooth-puzzle\";\nimport { GanRobot, ganTimerConfig } from \"./GanRobot\";\n\nexport type BluetoothRobot = GanRobot; // TODO\n\nconst smartRobotConfigs: BluetoothConfig<BluetoothRobot>[] = [ganTimerConfig];\n\nexport async function connectSmartRobot(\n options?: BluetoothConnectOptions,\n): Promise<BluetoothRobot> {\n return bluetoothConnect<BluetoothRobot>(smartRobotConfigs, options);\n}\n", "import type { MillisecondTimestamp } from \"../../twisty/controllers/AnimationTypes\";\nimport type { BluetoothConfig } from \"../smart-puzzle/bluetooth-puzzle\";\n\n// TODO: Short IDs\nconst UUIDs = {\n ganTimerService: \"0000fff0-0000-1000-8000-00805f9b34fb\",\n timeCharacteristic: \"0000fff2-0000-1000-8000-00805f9b34fb\",\n};\n\ninterface GanTimerDetail {\n currentTime: MillisecondTimestamp;\n latestTimes: [\n MillisecondTimestamp,\n MillisecondTimestamp,\n MillisecondTimestamp,\n ];\n}\n\nexport class GanTimer extends EventTarget {\n private polling = false;\n private previousDetail: GanTimerDetail | null = null;\n\n constructor(\n _service: BluetoothRemoteGATTService,\n private server: BluetoothRemoteGATTServer,\n device: BluetoothDevice,\n private timeCharacteristic: BluetoothRemoteGATTCharacteristic,\n ) {\n super();\n this.startPolling();\n console.log(server);\n device.addEventListener(\n \"gattserverdisconnected\",\n this.onDisconnect.bind(this),\n );\n }\n\n // We have to perform async operations before we call the constructor.\n static async connect(\n server: BluetoothRemoteGATTServer,\n device: BluetoothDevice,\n ) {\n const ganTimerService = await server.getPrimaryService(\n UUIDs.ganTimerService,\n );\n console.log(\"Service:\", ganTimerService);\n const timeCharacteristic = await ganTimerService.getCharacteristic(\n UUIDs.timeCharacteristic,\n );\n console.log(\"Characteristic:\", timeCharacteristic);\n const timer = new GanTimer(\n ganTimerService,\n server,\n device,\n timeCharacteristic,\n );\n return timer;\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n async poll() {\n if (!this.polling) {\n return;\n }\n const value = await this.getTimeCharacteristic();\n\n const detail: GanTimerDetail = {\n currentTime: this.decodeTimeMs(value.slice(0, 4)),\n latestTimes: [\n this.decodeTimeMs(value.slice(4, 8)),\n this.decodeTimeMs(value.slice(8, 12)),\n this.decodeTimeMs(value.slice(12, 16)),\n ],\n };\n\n if (detail.currentTime === 0) {\n if (this.previousDetail && this.previousDetail.currentTime !== 0) {\n this.dispatchEvent(new CustomEvent(\"reset\"));\n }\n }\n\n if (detail.currentTime !== 0 && this.previousDetail) {\n if (this.previousDetail.currentTime === 0) {\n this.dispatchEvent(new CustomEvent(\"start\"));\n }\n\n if (detail.currentTime !== this.previousDetail.currentTime) {\n this.dispatchEvent(new CustomEvent(\"update\", { detail }));\n\n if (\n detail.currentTime === detail.latestTimes[0] &&\n detail.latestTimes[1] === this.previousDetail.latestTimes[0] &&\n detail.latestTimes[2] === this.previousDetail.latestTimes[1]\n ) {\n this.dispatchEvent(new CustomEvent(\"stop\", { detail }));\n }\n }\n }\n\n this.previousDetail = detail;\n\n this.poll();\n }\n\n onDisconnect(): void {\n this.dispatchEvent(new CustomEvent(\"disconnect\"));\n }\n\n async getTimeCharacteristic() {\n return new Uint8Array((await this.timeCharacteristic.readValue()).buffer);\n }\n\n async getTime() {\n const value = await this.getTimeCharacteristic();\n return this.decodeTimeMs(value.slice(0, 4));\n }\n\n decodeTimeMs(bytes: Uint8Array) {\n return (bytes[0] * 60 + bytes[1]) * 1000 + bytes[2] + bytes[3] * 256;\n }\n\n startPolling() {\n this.polling = true;\n this.poll();\n }\n\n stopPolling() {\n this.polling = false;\n }\n}\n\n// // TODO: Move this into a factory?\nexport const ganTimerConfig: BluetoothConfig<GanTimer> = {\n connect: GanTimer.connect.bind(GanTimer),\n prefixes: [\"GAN\"],\n filters: [{ namePrefix: \"GAN\" }],\n optionalServices: [UUIDs.ganTimerService],\n};\n", "import { bluetoothConnect, BluetoothConnectOptions } from \"../connect\";\nimport type { BluetoothConfig } from \"../smart-puzzle/bluetooth-puzzle\";\nimport { GanTimer, ganTimerConfig } from \"./GanTimer\";\n\nexport type BluetoothTimer = GanTimer; // TODO\n\nconst smartTimerConfigs: BluetoothConfig<BluetoothTimer>[] = [ganTimerConfig];\n\nexport async function connectSmartTimer(\n options?: BluetoothConnectOptions,\n): Promise<BluetoothTimer> {\n return bluetoothConnect<BluetoothTimer>(smartTimerConfigs, options);\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../../../src/cubing/bluetooth/debug.ts", "../../../src/cubing/bluetooth/transformer.ts", "../../../src/cubing/bluetooth/smart-puzzle/bluetooth-puzzle.ts", "../../../src/cubing/bluetooth/keyboard.ts", "../../../src/cubing/bluetooth/connect/index.ts", "../../../src/cubing/bluetooth/smart-puzzle/gan.ts", "../../../src/cubing/vendor/unsafe-raw-aes/unsafe-raw-aes.ts", "../../../src/cubing/bluetooth/smart-puzzle/giiker.ts", "../../../src/cubing/bluetooth/smart-puzzle/gocube.ts", "../../../src/cubing/bluetooth/smart-puzzle/endianness.ts", "../../../src/cubing/bluetooth/smart-puzzle/Heykube.ts", "../../../src/cubing/bluetooth/smart-puzzle/connect.ts", "../../../src/cubing/bluetooth/smart-robot/GanRobot.ts", "../../../src/cubing/bluetooth/smart-robot/index.ts", "../../../src/cubing/bluetooth/smart-timer/GanTimer.ts", "../../../src/cubing/bluetooth/smart-timer/index.ts"],
4
+ "sourcesContent": ["let DEBUG_LOGGING_ENABLED = false;\n\nexport function enableDebugLogging(enable: boolean): void {\n DEBUG_LOGGING_ENABLED = enable;\n}\n\n// TODO: Remove this.\nexport function debugLog(...args: any[]): void {\n if (!DEBUG_LOGGING_ENABLED) {\n return;\n }\n\n if (console.info) {\n console.info(...args);\n } else {\n console.log(...args);\n }\n}\n", "import { Quaternion, Vector3 } from \"three\";\nimport type {\n MoveEvent,\n OrientationEvent,\n} from \"./smart-puzzle/bluetooth-puzzle\";\n\n// TODO: Combine orientation and moves into a single event to handle quaternion remapping.\nexport interface StreamTransformer {\n // Modifies the input.\n transformMove(moveEvent: MoveEvent): void;\n\n // Modifies the input.\n transformOrientation(orientationEvent: OrientationEvent): void;\n}\n\nfunction maxAxis(v: Vector3): string {\n const maxVal = Math.max(Math.abs(v.x), Math.abs(v.y), Math.abs(v.z));\n switch (maxVal) {\n case v.x:\n return \"x\";\n case -v.x:\n return \"-x\";\n case v.y:\n return \"y\";\n case -v.y:\n return \"-y\";\n case v.z:\n return \"z\";\n case -v.z:\n return \"-z\";\n default:\n throw new Error(\"Uh-oh.\");\n }\n}\n\nconst s2 = Math.sqrt(0.5);\n\nconst m: { [s: string]: Quaternion } = {\n \"y z\": new Quaternion(0, 0, 0, 1),\n \"-z y\": new Quaternion(s2, 0, 0, s2),\n \"x z\": new Quaternion(0, 0, -s2, s2),\n \"-x z\": new Quaternion(0, 0, s2, s2),\n};\n\nexport class BasicRotationTransformer implements StreamTransformer {\n // private reorientQuat = new Quaternion();\n\n public transformMove(_moveEvent: MoveEvent): void {\n // Nothing to do.\n }\n\n public transformOrientation(orientationEvent: OrientationEvent): void {\n const { x, y, z, w } = orientationEvent.quaternion;\n const quat = new Quaternion(x, y, z, w);\n\n const U = new Vector3(0, 1, 0);\n const F = new Vector3(0, 0, 1);\n const maxU = maxAxis(U.applyQuaternion(quat));\n const maxF = maxAxis(F.applyQuaternion(quat));\n\n const oriQuat = m[`${maxU} ${maxF}`] || m[\"y z\"];\n\n console.log(quat);\n console.log(oriQuat);\n const q2 = quat.premultiply(oriQuat);\n\n // console.log(maxAxis(U.applyQuaternion(quat)), maxAxis(F.applyQuaternion(quat)));\n console.log(q2);\n\n orientationEvent.quaternion = quat;\n\n console.log(orientationEvent.quaternion);\n }\n}\n", "import type { Move } from \"../../alg\";\nimport type { KState } from \"../../kpuzzle/KState\";\nimport { BasicRotationTransformer, StreamTransformer } from \"../transformer\";\n\n/******** BluetoothPuzzle ********/\n\n// TODO: Use actual `CustomEvent`s?\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent\nexport interface MoveEvent {\n latestMove: Move;\n timeStamp: number;\n debug?: Record<string, unknown>;\n state?: KState;\n quaternion?: any; // TODO: Unused\n}\n\n// TODO: Only use the `quaternion` field in the `MoveEvent`?\nexport interface OrientationEvent {\n quaternion: {\n x: number;\n y: number;\n z: number;\n w: number;\n };\n timeStamp: number;\n debug?: Record<string, unknown>;\n}\n\nexport interface BluetoothConfig<T> {\n connect: (\n server: BluetoothRemoteGATTServer,\n device?: BluetoothDevice,\n ) => Promise<T>;\n // TODO: Can we reuse `filters`?\n prefixes: string[]; // `[\"\"]` for GiiKER\n filters: BluetoothLEScanFilter[];\n optionalServices: BluetoothServiceUUID[];\n}\n\n// TODO: Expose device name (and/or globally unique identifier)?\nexport abstract class BluetoothPuzzle extends EventTarget {\n public transformers: StreamTransformer[] = [];\n protected listeners: Array<(e: MoveEvent) => void> = []; // TODO: type\n protected orientationListeners: Array<(e: OrientationEvent) => void> = []; // TODO: type\n\n public abstract name(): string | undefined;\n public abstract disconnect(): void; // TODO: Can we make this reutrn (async) on success?\n\n // TODO: require subclasses to implement this?\n public async getState(): Promise<KState> {\n throw new Error(\"cannot get state\");\n }\n\n public addMoveListener(listener: (e: MoveEvent) => void): void {\n this.listeners.push(listener);\n }\n\n public addOrientationListener(listener: (e: OrientationEvent) => void): void {\n this.orientationListeners.push(listener);\n }\n\n public experimentalAddBasicRotationTransformer(): void {\n this.transformers.push(new BasicRotationTransformer());\n }\n\n protected dispatchMove(moveEvent: MoveEvent): void {\n for (const transformer of this.transformers) {\n transformer.transformMove(moveEvent);\n }\n for (const l of this.listeners) {\n l(moveEvent);\n }\n }\n\n protected dispatchOrientation(orientationEvent: OrientationEvent): void {\n for (const transformer of this.transformers) {\n transformer.transformOrientation(orientationEvent);\n }\n const { x, y, z, w } = orientationEvent.quaternion;\n // TODO: can we avoid mutating the source event?\n orientationEvent.quaternion = {\n x,\n y,\n z,\n w,\n };\n for (const l of this.orientationListeners) {\n // TODO: Convert quaternion.\n l(orientationEvent);\n }\n }\n}\n", "import { keyToMove } from \"../alg\";\nimport type { KPuzzle } from \"../kpuzzle\";\nimport type { KState } from \"../kpuzzle/KState\";\nimport { puzzles } from \"../puzzles\";\nimport { BluetoothPuzzle } from \"./smart-puzzle/bluetooth-puzzle\";\n\nexport class KeyboardPuzzle extends BluetoothPuzzle {\n private puzzle: Promise<KPuzzle> = puzzles[\"3x3x3\"].kpuzzle();\n private state: Promise<KState> = (async () =>\n (await this.puzzle).startState())();\n\n listener: (e: KeyboardEvent) => Promise<void>;\n\n // TODO: Decide on the right arguments.\n constructor(private target: Element) {\n super();\n // TODO: Filter out repeated keydown?\n this.listener = this.onKeyDown.bind(this);\n target.addEventListener(\"keydown\", this.listener);\n }\n\n public name(): string | undefined {\n return \"Keyboard Input\";\n }\n\n disconnect() {\n this.target.removeEventListener(\"keydown\", this.listener);\n }\n\n public async getState(): Promise<KState> {\n return this.state;\n }\n\n private async onKeyDown(e: KeyboardEvent): Promise<void> {\n if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {\n return;\n }\n\n const move = keyToMove(e);\n if (move) {\n const newState = (await this.state).applyMove(move);\n this.state = Promise.resolve(newState);\n this.dispatchMove({\n latestMove: move,\n timeStamp: e.timeStamp,\n state: newState,\n });\n e.preventDefault();\n }\n }\n}\n\n// TODO: Type\nexport async function debugKeyboardConnect(\n target: any = window,\n): Promise<KeyboardPuzzle> {\n return new KeyboardPuzzle(target);\n}\n", "import { debugLog } from \"../debug\";\nimport type { BluetoothConfig } from \"../smart-puzzle/bluetooth-puzzle\";\n\n/******** requestOptions ********/\n\nfunction requestOptions<T>(\n configs: BluetoothConfig<T>[],\n acceptAllDevices: boolean = false,\n): RequestDeviceOptions {\n const options = acceptAllDevices\n ? {\n acceptAllDevices: true,\n optionalServices: [] as BluetoothServiceUUID[],\n }\n : {\n filters: [] as BluetoothLEScanFilter[],\n optionalServices: [] as BluetoothServiceUUID[],\n };\n for (const config of configs) {\n if (!acceptAllDevices) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n options.filters = options.filters!.concat(config.filters);\n }\n options.optionalServices = options.optionalServices.concat(\n config.optionalServices,\n );\n }\n debugLog({ requestOptions: options });\n return options;\n}\n\n/******** connect() ********/\n\nexport interface BluetoothConnectOptions {\n acceptAllDevices?: boolean;\n}\n\n// We globally track the number of connection failures,\n// in order to offer the user recourse (accept all devices) if they're having issues.\n// This allows us to future-proof situations where a device might not show up in\n// the chooser, but works if we connect.\nlet consecutiveFailures = 0;\nconst MAX_FAILURES_BEFORE_ACCEPT_ALL_FALLBACK = 2;\n\n// TODO: Debug options to allow connecting to any device?\nexport async function bluetoothConnect<T>(\n configs: BluetoothConfig<T>[],\n options: BluetoothConnectOptions = {},\n): Promise<T> {\n debugLog(\"Attempting to pair.\");\n let device;\n try {\n let acceptAllDevices = options.acceptAllDevices;\n if (\n !acceptAllDevices &&\n consecutiveFailures >= MAX_FAILURES_BEFORE_ACCEPT_ALL_FALLBACK\n ) {\n console.info(\n `The last ${MAX_FAILURES_BEFORE_ACCEPT_ALL_FALLBACK} Bluetooth puzzle connection attempts failed. This time, the Bluetooth prompt will show all possible devices.`,\n );\n acceptAllDevices = true;\n }\n device = await navigator.bluetooth.requestDevice(\n requestOptions<T>(configs, acceptAllDevices),\n );\n consecutiveFailures = 0;\n } catch (e) {\n consecutiveFailures++;\n throw new Error(e);\n }\n debugLog(\"Device:\", device);\n\n if (typeof device.gatt === \"undefined\") {\n return Promise.reject(\"Device did not have a GATT server.\");\n }\n\n const server = await device.gatt.connect();\n debugLog(\"Server:\", server);\n\n const name = server.device?.name || \"\";\n\n // TODO by reading supported matched filters or provided services.\n\n for (const config of configs) {\n for (const prefix of config.prefixes) {\n if (name?.startsWith(prefix)) {\n return config.connect(server, device);\n }\n }\n }\n\n throw Error(\"Unknown Bluetooth devive.\");\n}\n", "/* tslint:disable no-bitwise */\n\nimport { Quaternion } from \"three\";\nimport { Move } from \"../../alg\";\nimport type { KPuzzle, KStateData } from \"../../kpuzzle\";\nimport { KState } from \"../../kpuzzle\";\nimport { puzzles } from \"../../puzzles\";\nimport {\n importKey,\n unsafeDecryptBlock,\n} from \"../../vendor/unsafe-raw-aes/unsafe-raw-aes\";\nimport { debugLog } from \"../debug\";\nimport { BluetoothConfig, BluetoothPuzzle } from \"./bluetooth-puzzle\";\n\n// This needs to be short enough to capture 6 moves (OBQTM).\nconst DEFAULT_INTERVAL_MS = 150;\n// Number of latest moves provided by the Gan 356i.\nconst MAX_LATEST_MOVES = 6;\n\nconst ganMoveToBlockMove: { [i: number]: Move } = {\n 0x00: new Move(\"U\"),\n 0x02: new Move(\"U\", -1),\n 0x03: new Move(\"R\"),\n 0x05: new Move(\"R\", -1),\n 0x06: new Move(\"F\"),\n 0x08: new Move(\"F\", -1),\n 0x09: new Move(\"D\"),\n 0x0b: new Move(\"D\", -1),\n 0x0c: new Move(\"L\"),\n 0x0e: new Move(\"L\", -1),\n 0x0f: new Move(\"B\"),\n 0x11: new Move(\"B\", -1),\n};\n\nlet homeQuatInverse: Quaternion | null = null;\n\nfunction probablyDecodedCorrectly(data: Uint8Array): boolean {\n return (\n data[13] < 0x12 &&\n data[14] < 0x12 &&\n data[15] < 0x12 &&\n data[16] < 0x12 &&\n data[17] < 0x12 &&\n data[18] < 0x12\n );\n}\n\nconst key10 = new Uint8Array([\n 198, 202, 21, 223, 79, 110, 19, 182, 119, 13, 230, 89, 58, 175, 186, 162,\n]);\nconst key11 = new Uint8Array([\n 67, 226, 91, 214, 125, 220, 120, 216, 7, 96, 163, 218, 130, 60, 1, 241,\n]);\n\n// Clean-room reverse-engineered\nasync function decryptState(\n data: Uint8Array,\n aesKey: CryptoKey | null,\n): Promise<Uint8Array> {\n if (aesKey === null) {\n return data;\n }\n\n const copy = new Uint8Array(data);\n copy.set(new Uint8Array(await unsafeDecryptBlock(aesKey, copy.slice(3))), 3);\n copy.set(\n new Uint8Array(await unsafeDecryptBlock(aesKey, copy.slice(0, 16))),\n 0,\n );\n\n if (probablyDecodedCorrectly(copy)) {\n return copy;\n }\n\n throw new Error(\"Invalid Gan cube state\");\n}\n\nclass PhysicalState {\n public static async read(\n characteristic: BluetoothRemoteGATTCharacteristic,\n aesKey: CryptoKey | null,\n ): Promise<PhysicalState> {\n const value = await decryptState(\n new Uint8Array((await characteristic.readValue()).buffer),\n aesKey,\n );\n const timeStamp = Date.now();\n // console.log(value);\n return new PhysicalState(new DataView(value.buffer), timeStamp);\n }\n\n private arr: Uint8Array;\n private arrLen = 19;\n private constructor(private dataView: DataView, public timeStamp: number) {\n this.arr = new Uint8Array(dataView.buffer);\n if (this.arr.length !== this.arrLen) {\n throw new Error(\"Unexpected array length\");\n }\n }\n\n public rotQuat(): Quaternion {\n let x = this.dataView.getInt16(0, true) / 16384;\n let y = this.dataView.getInt16(2, true) / 16384;\n let z = this.dataView.getInt16(4, true) / 16384;\n [x, y, z] = [-y, z, -x];\n const wSquared = 1 - (x * x + y * y + z * z);\n const w = wSquared > 0 ? Math.sqrt(wSquared) : 0;\n const quat = new Quaternion(x, y, z, w);\n\n if (!homeQuatInverse) {\n homeQuatInverse = quat.clone().inverse();\n }\n\n return quat.clone().multiply(homeQuatInverse.clone());\n }\n\n // Loops from 255 to 0.\n public moveCounter(): number {\n return this.arr[12];\n }\n\n public numMovesSince(previousMoveCounter: number): number {\n return (this.moveCounter() - previousMoveCounter) & 0xff;\n }\n\n // Due to the design of the Gan356i protocol, it's common to query for the\n // latest physical state and find 0 moves have been performed since the last\n // query. Therefore, it's useful to allow 0 as an argument.\n public latestMoves(n: number): Move[] {\n if (n < 0 || n > MAX_LATEST_MOVES) {\n throw new Error(`Must ask for 0 to 6 latest moves. (Asked for ${n})`);\n }\n return Array.from(this.arr.slice(19 - n, 19)).map(\n (i) => ganMoveToBlockMove[i],\n );\n }\n\n public debugInfo(): { arr: Uint8Array } {\n return {\n arr: this.arr,\n };\n }\n}\n\n// TODO: Short IDs\nconst UUIDs = {\n ganCubeService: \"0000fff0-0000-1000-8000-00805f9b34fb\",\n physicalStateCharacteristic: \"0000fff5-0000-1000-8000-00805f9b34fb\",\n actualAngleAndBatteryCharacteristic: \"0000fff7-0000-1000-8000-00805f9b34fb\",\n faceletStatus1Characteristic: \"0000fff2-0000-1000-8000-00805f9b34fb\",\n faceletStatus2Characteristic: \"0000fff3-0000-1000-8000-00805f9b34fb\",\n infoService: \"0000180a-0000-1000-8000-00805f9b34fb\",\n systemIDCharacteristic: \"00002a23-0000-1000-8000-00805f9b34fb\",\n versionCharacteristic: \"00002a28-0000-1000-8000-00805f9b34fb\",\n};\n\nconst commands: { [cmd: string]: BufferSource } = {\n reset: new Uint8Array([\n 0x00, 0x00, 0x24, 0x00, 0x49, 0x92, 0x24, 0x49, 0x6d, 0x92, 0xdb, 0xb6,\n 0x49, 0x92, 0xb6, 0x24, 0x6d, 0xdb,\n ]),\n};\n\nfunction buf2hex(buffer: ArrayBuffer): string {\n // buffer is an ArrayBuffer\n return (\n Array.prototype.map.call(new Uint8Array(buffer), (x: number) =>\n (\"00\" + x.toString(16)).slice(-2),\n ) as string[]\n ).join(\" \");\n}\n\nconst reidEdgeOrder = \"UF UR UB UL DF DR DB DL FR FL BR BL\".split(\" \");\nconst reidCornerOrder = \"UFR URB UBL ULF DRF DFL DLB DBR\".split(\" \");\n\ninterface PieceInfo {\n piece: number;\n orientation: number;\n}\n\nfunction rotateLeft(s: string, i: number): string {\n return s.slice(i) + s.slice(0, i);\n}\n\nconst pieceMap: { [s: string]: PieceInfo } = {};\n// TODO: Condense the for loops.\nreidEdgeOrder.forEach((edge, idx) => {\n for (let i = 0; i < 2; i++) {\n pieceMap[rotateLeft(edge, i)] = { piece: idx, orientation: i };\n }\n});\nreidCornerOrder.forEach((corner, idx) => {\n for (let i = 0; i < 3; i++) {\n pieceMap[rotateLeft(corner, i)] = { piece: idx, orientation: i };\n }\n});\n\nconst gan356iCornerMappings = [\n [0, 21, 15],\n [5, 13, 47],\n [7, 45, 39],\n [2, 37, 23],\n [29, 10, 16],\n [31, 18, 32],\n [26, 34, 40],\n [24, 42, 8],\n];\n\nconst gan356iEdgeMappings = [\n [1, 22],\n [3, 14],\n [6, 46],\n [4, 38],\n [30, 17],\n [27, 9],\n [25, 41],\n [28, 33],\n [19, 12],\n [20, 35],\n [44, 11],\n [43, 36],\n];\nconst faceOrder = \"URFDLB\";\n\nasync function getKey(\n server: BluetoothRemoteGATTServer,\n): Promise<CryptoKey | null> {\n const infoService = await server.getPrimaryService(UUIDs.infoService);\n\n const versionCharacteristic = await infoService.getCharacteristic(\n UUIDs.versionCharacteristic,\n );\n const versionBuffer = new Uint8Array(\n (await versionCharacteristic.readValue()).buffer,\n );\n\n const versionValue =\n (((versionBuffer[0] << 8) + versionBuffer[1]) << 8) + versionBuffer[2];\n if (versionValue < 0x01_00_08) {\n return null;\n }\n\n const keyXor = versionValue < 0x01_01_00 ? key10 : key11;\n\n const systemIDCharacteristic = await infoService.getCharacteristic(\n UUIDs.systemIDCharacteristic,\n );\n const systemID = new Uint8Array(\n (await systemIDCharacteristic.readValue()).buffer,\n ).reverse();\n\n const key = new Uint8Array(keyXor);\n for (let i = 0; i < systemID.length; i++) {\n key[i] = (key[i] + systemID[i]) % 256;\n }\n\n return importKey(key);\n}\n\nexport class GanCube extends BluetoothPuzzle {\n // We have to perform async operations before we call the constructor.\n public static async connect(\n server: BluetoothRemoteGATTServer,\n ): Promise<GanCube> {\n const ganCubeService = await server.getPrimaryService(UUIDs.ganCubeService);\n debugLog(\"Service:\", ganCubeService);\n\n const physicalStateCharacteristic = await ganCubeService.getCharacteristic(\n UUIDs.physicalStateCharacteristic,\n );\n debugLog(\"Characteristic:\", physicalStateCharacteristic);\n\n const aesKey = await getKey(server);\n\n const initialMoveCounter = (\n await PhysicalState.read(physicalStateCharacteristic, aesKey)\n ).moveCounter();\n debugLog(\"Initial Move Counter:\", initialMoveCounter);\n const cube = new GanCube(\n await puzzles[\"3x3x3\"].kpuzzle(),\n ganCubeService,\n server,\n physicalStateCharacteristic,\n initialMoveCounter,\n aesKey,\n );\n return cube;\n }\n\n public INTERVAL_MS: number = DEFAULT_INTERVAL_MS;\n private intervalHandle: number | null = null;\n private state: KState;\n private cachedFaceletStatus1Characteristic: Promise<BluetoothRemoteGATTCharacteristic>;\n\n private cachedFaceletStatus2Characteristic: Promise<BluetoothRemoteGATTCharacteristic>;\n\n private cachedActualAngleAndBatteryCharacteristic: Promise<BluetoothRemoteGATTCharacteristic>;\n\n private constructor(\n private kpuzzle: KPuzzle,\n private service: BluetoothRemoteGATTService,\n private server: BluetoothRemoteGATTServer,\n private physicalStateCharacteristic: BluetoothRemoteGATTCharacteristic,\n private lastMoveCounter: number,\n private aesKey: CryptoKey | null,\n ) {\n super();\n this.state = kpuzzle.startState();\n this.startTrackingMoves();\n }\n\n public name(): string | undefined {\n return this.server.device.name;\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n public startTrackingMoves(): void {\n // `window.setInterval` instead of `setInterval`:\n // https://github.com/Microsoft/TypeScript/issues/842#issuecomment-252445883\n this.intervalHandle = window.setInterval(\n this.intervalHandler.bind(this),\n this.INTERVAL_MS,\n );\n }\n\n public stopTrackingMoves(): void {\n if (!this.intervalHandle) {\n throw new Error(\"Not tracking moves!\");\n }\n clearInterval(this.intervalHandle);\n this.intervalHandle = null;\n }\n\n // TODO: Can we ever receive async responses out of order?\n public async intervalHandler(): Promise<void> {\n const physicalState = await PhysicalState.read(\n this.physicalStateCharacteristic,\n this.aesKey,\n );\n let numInterveningMoves = physicalState.numMovesSince(this.lastMoveCounter);\n // console.log(numInterveningMoves);\n if (numInterveningMoves > MAX_LATEST_MOVES) {\n debugLog(\n `Too many moves! Dropping ${\n numInterveningMoves - MAX_LATEST_MOVES\n } moves`,\n );\n numInterveningMoves = MAX_LATEST_MOVES;\n }\n for (const move of physicalState.latestMoves(numInterveningMoves)) {\n // console.log(move);\n this.state = this.state.applyMove(move);\n this.dispatchMove({\n latestMove: move,\n timeStamp: physicalState.timeStamp,\n debug: physicalState.debugInfo(),\n state: this.state,\n // quaternion: physicalState.rotQuat(),\n });\n }\n this.dispatchOrientation({\n timeStamp: physicalState.timeStamp,\n quaternion: physicalState.rotQuat(),\n });\n this.lastMoveCounter = physicalState.moveCounter();\n }\n\n public async getBattery(): Promise<number> {\n return new Uint8Array(\n await this.readActualAngleAndBatteryCharacteristic(),\n )[7];\n }\n\n public async getState(): Promise<KState> {\n const arr: Uint8Array = await decryptState(\n new Uint8Array(await this.readFaceletStatus1Characteristic()),\n this.aesKey,\n );\n const stickers: number[] = [];\n for (let i = 0; i < 18; i += 3) {\n let v = (((arr[i ^ 1] << 8) + arr[(i + 1) ^ 1]) << 8) + arr[(i + 2) ^ 1];\n for (let j = 0; j < 8; j++) {\n stickers.push(v & 7);\n v >>= 3;\n }\n }\n\n const stateData: KStateData = {\n CORNERS: {\n pieces: [],\n orientation: [],\n },\n EDGES: {\n pieces: [],\n orientation: [],\n },\n CENTERS: {\n pieces: [0, 1, 2, 3, 4, 5],\n orientation: [0, 0, 0, 0, 0, 0],\n },\n };\n\n for (const cornerMapping of gan356iCornerMappings) {\n const pieceInfo: PieceInfo =\n pieceMap[cornerMapping.map((i) => faceOrder[stickers[i]]).join(\"\")];\n stateData.CORNERS.pieces.push(pieceInfo.piece);\n stateData.CORNERS.orientation.push(pieceInfo.orientation);\n }\n\n for (const edgeMapping of gan356iEdgeMappings) {\n const pieceInfo: PieceInfo =\n pieceMap[edgeMapping.map((i) => faceOrder[stickers[i]]).join(\"\")];\n stateData.EDGES.pieces.push(pieceInfo.piece);\n stateData.EDGES.orientation.push(pieceInfo.orientation);\n }\n\n return new KState(this.kpuzzle, stateData);\n }\n\n public async faceletStatus1Characteristic(): Promise<BluetoothRemoteGATTCharacteristic> {\n this.cachedFaceletStatus1Characteristic =\n this.cachedFaceletStatus1Characteristic ||\n this.service.getCharacteristic(UUIDs.faceletStatus1Characteristic);\n return this.cachedFaceletStatus1Characteristic;\n }\n\n public async faceletStatus2Characteristic(): Promise<BluetoothRemoteGATTCharacteristic> {\n this.cachedFaceletStatus2Characteristic =\n this.cachedFaceletStatus2Characteristic ||\n this.service.getCharacteristic(UUIDs.faceletStatus2Characteristic);\n return this.cachedFaceletStatus2Characteristic;\n }\n\n public async actualAngleAndBatteryCharacteristic(): Promise<BluetoothRemoteGATTCharacteristic> {\n this.cachedActualAngleAndBatteryCharacteristic =\n this.cachedActualAngleAndBatteryCharacteristic ||\n this.service.getCharacteristic(UUIDs.actualAngleAndBatteryCharacteristic);\n return this.cachedActualAngleAndBatteryCharacteristic;\n }\n\n public async reset(): Promise<void> {\n const faceletStatus1Characteristic =\n await this.faceletStatus1Characteristic();\n await faceletStatus1Characteristic.writeValue(commands.reset);\n }\n\n public async readFaceletStatus1Characteristic(): Promise<ArrayBuffer> {\n const faceletStatus1Characteristic =\n await this.faceletStatus1Characteristic();\n return (await faceletStatus1Characteristic.readValue()).buffer;\n }\n\n public async readFaceletStatus2Characteristic(): Promise<string> {\n const faceletStatus2Characteristic =\n await this.faceletStatus2Characteristic();\n return buf2hex((await faceletStatus2Characteristic.readValue()).buffer);\n }\n\n public async readActualAngleAndBatteryCharacteristic(): Promise<ArrayBuffer> {\n const actualAngleAndBatteryCharacteristic =\n await this.actualAngleAndBatteryCharacteristic();\n return (await actualAngleAndBatteryCharacteristic.readValue()).buffer;\n }\n\n // TODO\n // private onphysicalStateCharacteristicChanged(event: any): void {\n // var val = event.target.value;\n // debugLog(val);\n // }\n}\n\n// // TODO: Move this into a factory?\nexport const ganConfig: BluetoothConfig<BluetoothPuzzle> = {\n connect: GanCube.connect.bind(GanCube),\n prefixes: [\"GAN\"],\n filters: [{ namePrefix: \"GAN\" }],\n optionalServices: [UUIDs.ganCubeService, UUIDs.infoService],\n};\n", "const blockSize = 16;\nconst zeros = new Uint8Array(blockSize);\nconst paddingBlockPlaintext = new Uint8Array(\n new Array(blockSize).fill(blockSize),\n);\nconst AES_CBC = \"AES-CBC\";\n\nexport async function importKey(keyBytes: ArrayBuffer): Promise<CryptoKey> {\n return await crypto.subtle.importKey(\"raw\", keyBytes, AES_CBC, true, [\n \"encrypt\",\n \"decrypt\",\n ]);\n}\n\nasync function unsafeEncryptBlockWithIV(\n key: CryptoKey,\n plaintextBlock: ArrayBuffer,\n iv: ArrayBuffer,\n): Promise<ArrayBuffer> {\n const cryptoResult: ArrayBuffer = await window.crypto.subtle.encrypt(\n {\n name: AES_CBC,\n iv,\n },\n key,\n plaintextBlock,\n );\n return cryptoResult.slice(0, blockSize);\n}\n\nexport async function unsafeEncryptBlock(\n key: CryptoKey,\n plaintextBlock: ArrayBuffer,\n): Promise<ArrayBuffer> {\n return (await unsafeEncryptBlockWithIV(key, plaintextBlock, zeros)).slice(\n 0,\n blockSize,\n );\n}\n\nexport async function unsafeDecryptBlock(\n key: CryptoKey,\n ciphertextBlock: ArrayBuffer,\n): Promise<ArrayBuffer> {\n const paddingBlock = await unsafeEncryptBlockWithIV(\n key,\n paddingBlockPlaintext,\n ciphertextBlock,\n );\n\n const cbcCiphertext = new Uint8Array(2 * blockSize);\n cbcCiphertext.set(new Uint8Array(ciphertextBlock), 0);\n cbcCiphertext.set(new Uint8Array(paddingBlock), blockSize);\n\n const cryptoResult: ArrayBuffer = await window.crypto.subtle.decrypt(\n {\n name: AES_CBC,\n iv: zeros,\n },\n key,\n cbcCiphertext,\n );\n return cryptoResult.slice(0, blockSize);\n}\n", "/* tslint:disable no-bitwise */\n\nimport { Move } from \"../../alg\";\nimport { experimental3x3x3KPuzzle, KState, KStateData } from \"../../kpuzzle\";\nimport { debugLog } from \"../debug\";\nimport { BluetoothConfig, BluetoothPuzzle } from \"./bluetooth-puzzle\";\n\nconst MESSAGE_LENGTH = 20;\n\nconst UUIDs = {\n cubeService: \"0000aadb-0000-1000-8000-00805f9b34fb\",\n cubeCharacteristic: \"0000aadc-0000-1000-8000-00805f9b34fb\",\n};\n\n// TODO: Expose for testing.\nfunction giikerMoveToAlgMove(face: number, amount: number): Move {\n switch (amount) {\n case 3:\n amount = -1;\n break;\n case 9:\n debugLog(\"Encountered 9\", face, amount);\n amount = -2;\n break;\n }\n\n const family = [\"?\", \"B\", \"D\", \"L\", \"U\", \"R\", \"F\"][face];\n return new Move(family, amount);\n}\n\nexport { giikerMoveToAlgMove as giikerMoveToAlgMoveForTesting };\n\nfunction giikerStateStr(giikerState: number[]): string {\n let str = \"\";\n str += giikerState.slice(0, 8).join(\".\");\n str += \"\\n\";\n str += giikerState.slice(8, 16).join(\".\");\n str += \"\\n\";\n str += giikerState.slice(16, 28).join(\".\");\n str += \"\\n\";\n str += giikerState.slice(28, 32).join(\".\");\n str += \"\\n\";\n str += giikerState.slice(32, 40).join(\".\");\n return str;\n}\n\n// TODO\n// const Reid333Orbits = {\n// \"EDGES\": {\"numPieces\": 12, \"orientations\": 2},\n// \"CORNERS\": {\"numPieces\": 8, \"orientations\": 3},\n// \"CENTERS\": {\"numPieces\": 6, \"orientations\": 4}\n// };\n\nconst Reid333SolvedCenters = {\n pieces: [0, 1, 2, 3, 4, 5],\n orientation: [0, 0, 0, 0, 0, 0],\n};\n\nconst epGiiKERtoReid333: number[] = [4, 8, 0, 9, 5, 1, 3, 7, 6, 10, 2, 11];\nconst epReid333toGiiKER: number[] = [2, 5, 10, 6, 0, 4, 8, 7, 1, 3, 9, 11];\n\nconst preEO: number[] = [1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0];\nconst postEO: number[] = [1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0];\n\nconst cpGiiKERtoReid333: number[] = [4, 0, 3, 5, 7, 1, 2, 6];\nconst cpReid333toGiiKER: number[] = [1, 5, 6, 2, 0, 3, 7, 4];\n\nconst preCO: number[] = [1, 2, 1, 2, 2, 1, 2, 1];\nconst postCO: number[] = [2, 1, 2, 1, 1, 2, 1, 2];\n\nconst coFlip: number[] = [-1, 1, -1, 1, 1, -1, 1, -1];\n\nfunction getNibble(val: Uint8Array, i: number): number {\n if (i % 2 === 1) {\n return val[(i / 2) | 0] % 16;\n }\n return 0 | (val[(i / 2) | 0] / 16);\n}\n\nfunction probablyEncrypted(data: Uint8Array): boolean {\n return data[18] === 0xa7;\n}\n\nconst lookup = [\n 176, 81, 104, 224, 86, 137, 237, 119, 38, 26, 193, 161, 210, 126, 150, 81, 93,\n 13, 236, 249, 89, 235, 88, 24, 113, 81, 214, 131, 130, 199, 2, 169, 39, 165,\n 171, 41,\n];\n\nfunction decryptState(data: Uint8Array): Uint8Array {\n const offset1 = getNibble(data, 38);\n const offset2 = getNibble(data, 39);\n const output = new Uint8Array(MESSAGE_LENGTH);\n for (let i = 0; i < MESSAGE_LENGTH; i++) {\n output[i] = data[i] + lookup[offset1 + i] + lookup[offset2 + i];\n }\n return output;\n}\n\n// TODO: Support caching which decoding strategy worked last time.\nasync function decodeState(data: Uint8Array): Promise<Uint8Array> {\n if (!probablyEncrypted(data)) {\n return data;\n }\n return decryptState(data);\n // TODO: Check that the decrypted state is a valid staet.\n}\n\nexport class GiiKERCube extends BluetoothPuzzle {\n public static async connect(\n server: BluetoothRemoteGATTServer,\n ): Promise<GiiKERCube> {\n const cubeService = await server.getPrimaryService(UUIDs.cubeService);\n debugLog(\"Service:\", cubeService);\n\n const cubeCharacteristic = await cubeService.getCharacteristic(\n UUIDs.cubeCharacteristic,\n );\n debugLog(\"Characteristic:\", cubeCharacteristic);\n\n // TODO: Can we safely save the async promise instead of waiting for the response?\n\n const originalValue = await decodeState(\n new Uint8Array((await cubeCharacteristic.readValue()).buffer),\n );\n debugLog(\"Original value:\", originalValue);\n const cube = new GiiKERCube(server, cubeCharacteristic, originalValue);\n\n await cubeCharacteristic.startNotifications();\n cubeCharacteristic.addEventListener(\n \"characteristicvaluechanged\",\n cube.onCubeCharacteristicChanged.bind(cube),\n );\n\n return cube;\n }\n\n private constructor(\n private server: BluetoothRemoteGATTServer,\n private cubeCharacteristic: BluetoothRemoteGATTCharacteristic,\n private originalValue?: Uint8Array | null,\n ) {\n super();\n }\n\n public name(): string | undefined {\n return this.server.device.name;\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n public async getState(): Promise<KState> {\n return this.toReid333(\n new Uint8Array((await this.cubeCharacteristic.readValue()).buffer),\n );\n }\n\n private getBit(val: Uint8Array, i: number): number {\n const n = (i / 8) | 0;\n const shift = 7 - (i % 8);\n return (val[n] >> shift) & 1;\n }\n\n private toReid333(val: Uint8Array): KState {\n const state: KStateData = {\n EDGES: {\n pieces: new Array(12),\n orientation: new Array(12),\n },\n CORNERS: {\n pieces: new Array(8),\n orientation: new Array(8),\n },\n CENTERS: Reid333SolvedCenters,\n };\n\n for (let i = 0; i < 12; i++) {\n const gi = epReid333toGiiKER[i];\n state.EDGES.pieces[i] = epGiiKERtoReid333[getNibble(val, gi + 16) - 1];\n state.EDGES.orientation[i] =\n this.getBit(val, gi + 112) ^ preEO[state.EDGES.pieces[i]] ^ postEO[i];\n }\n for (let i = 0; i < 8; i++) {\n const gi = cpReid333toGiiKER[i];\n state.CORNERS.pieces[i] = cpGiiKERtoReid333[getNibble(val, gi) - 1];\n state.CORNERS.orientation[i] =\n (getNibble(val, gi + 8) * coFlip[gi] +\n preCO[state.CORNERS.pieces[i]] +\n postCO[i]) %\n 3;\n }\n return new KState(experimental3x3x3KPuzzle, state);\n }\n\n private async onCubeCharacteristicChanged(event: any): Promise<void> {\n const val = await decodeState(new Uint8Array(event.target.value.buffer));\n debugLog(val);\n debugLog(val);\n\n if (this.isRepeatedInitialValue(val)) {\n debugLog(\"Skipping repeated initial value.\");\n return;\n }\n\n const giikerState = [];\n for (let i = 0; i < MESSAGE_LENGTH; i++) {\n giikerState.push(Math.floor(val[i] / 16));\n giikerState.push(val[i] % 16);\n }\n debugLog(giikerState);\n const str = giikerStateStr(giikerState);\n debugLog(str);\n\n this.dispatchMove({\n latestMove: giikerMoveToAlgMove(giikerState[32], giikerState[33]),\n timeStamp: event.timeStamp,\n debug: {\n stateStr: str,\n },\n state: this.toReid333(val),\n });\n }\n\n private isRepeatedInitialValue(val: Uint8Array): boolean {\n if (typeof this.originalValue === \"undefined\") {\n // TODO: Test this branch.\n throw new Error(\"GiiKERCube has uninitialized original value.\");\n }\n\n if (this.originalValue === null) {\n return false;\n }\n\n const originalValue = this.originalValue;\n // Reset the value here, so we can return early below.\n this.originalValue = null;\n\n debugLog(\"Comparing against original value.\");\n for (let i = 0; i < MESSAGE_LENGTH - 2; i++) {\n if (originalValue[i] !== val[i]) {\n debugLog(\"Different at index \", i);\n return false;\n }\n }\n return true;\n }\n}\n\n// TODO: Move this into a factory?\nexport const giiKERConfig: BluetoothConfig<BluetoothPuzzle> = {\n connect: GiiKERCube.connect.bind(GiiKERCube),\n prefixes: [\"Gi\", \"\"], // Hack\n filters: [\n // Known prefixes: GiC, GiS (3x3x3), Gi2 (2x2x2)\n // Suspected prefixes GiY, Gi3\n { namePrefix: \"Gi\" },\n { services: [\"0000aadb-0000-1000-8000-00805f9b34fb\"] },\n { services: [\"0000aaaa-0000-1000-8000-00805f9b34fb\"] },\n { services: [\"0000fe95-0000-1000-8000-00805f9b34fb\"] },\n ],\n optionalServices: [\n // \"00001530-1212-efde-1523-785feabcd123\",\n // \"0000aaaa-0000-1000-8000-00805f9b34fb\",\n UUIDs.cubeService,\n // \"0000180f-0000-1000-8000-00805f9b34fb\",\n // \"0000180a-0000-1000-8000-00805f9b34fb\"\n ],\n};\n", "import { Quaternion } from \"three\";\nimport { Alg, experimentalAppendMove, Move } from \"../../alg\";\nimport { debugLog } from \"../debug\";\nimport { BluetoothConfig, BluetoothPuzzle } from \"./bluetooth-puzzle\";\n\nconst UUIDs = {\n goCubeService: \"6e400001-b5a3-f393-e0a9-e50e24dcca9e\",\n goCubeStateCharacteristic: \"6e400003-b5a3-f393-e0a9-e50e24dcca9e\",\n};\n\n// https://stackoverflow.com/a/40031979\nfunction buf2hex(buffer: ArrayBuffer): string {\n // buffer is an ArrayBuffer\n return (\n Array.prototype.map.call(new Uint8Array(buffer), (x: number) =>\n (\"00\" + x.toString(16)).slice(-2),\n ) as string[]\n ).join(\" \");\n}\n\nfunction bufferToString(buffer: ArrayBuffer): string {\n const byteView = new Uint8Array(buffer);\n let str = \"\";\n for (const charCode of byteView) {\n str += String.fromCharCode(charCode);\n }\n return str;\n}\n\nconst moveMap: Move[] = [\n new Move(\"B\", 1),\n new Move(\"B\", -1),\n new Move(\"F\", 1),\n new Move(\"F\", -1),\n new Move(\"U\", 1),\n new Move(\"U\", -1),\n new Move(\"D\", 1),\n new Move(\"D\", -1),\n new Move(\"R\", 1),\n new Move(\"R\", -1),\n new Move(\"L\", 1),\n new Move(\"L\", -1),\n];\n\nexport class GoCube extends BluetoothPuzzle {\n // We have to perform async operations before we call the constructor.\n public static async connect(\n server: BluetoothRemoteGATTServer,\n ): Promise<GoCube> {\n const service = await server.getPrimaryService(UUIDs.goCubeService);\n debugLog({ service });\n const goCubeStateCharacteristic = await service.getCharacteristic(\n UUIDs.goCubeStateCharacteristic,\n );\n debugLog({ goCubeStateCharacteristic });\n\n const cube = new GoCube(server, goCubeStateCharacteristic);\n\n await goCubeStateCharacteristic.startNotifications();\n goCubeStateCharacteristic.addEventListener(\n \"characteristicvaluechanged\",\n cube.onCubeCharacteristicChanged.bind(cube),\n );\n\n return cube;\n }\n\n // public async getState(): Promise<PuzzleState> {\n // return new Promise((resolve, reject) => {\n // this.resolve = (value: any) => {\n // resolve(buf2hex(value.buffer) as any);\n // };\n // this.goCubeStateCharacteristic.startNotifications();\n // });\n // }\n\n private recorded: any[][] = [];\n\n private homeQuatInverse: Quaternion | null = null;\n private lastRawQuat: Quaternion = new Quaternion(0, 0, 0, 1);\n private currentQuat: Quaternion = new Quaternion(0, 0, 0, 1);\n private lastTarget: Quaternion = new Quaternion(0, 0, 0, 1);\n private alg: Alg = new Alg();\n\n private constructor(\n private server: BluetoothRemoteGATTServer,\n public goCubeStateCharacteristic: BluetoothRemoteGATTCharacteristic,\n ) {\n super();\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n public reset(): void {\n this.resetAlg();\n this.resetOrientation();\n }\n\n public resetAlg(alg?: Alg): void {\n this.alg = alg || new Alg();\n }\n\n public resetOrientation(): void {\n this.homeQuatInverse = this.lastRawQuat.clone().inverse();\n this.currentQuat = new Quaternion(0, 0, 0, 1);\n this.lastTarget = new Quaternion(0, 0, 0, 1);\n }\n\n public name(): string | undefined {\n return this.server.device.name;\n }\n\n private onCubeCharacteristicChanged(event: any): void {\n const buffer: DataView = event.target.value;\n this.recorded.push([event.timeStamp, buf2hex(buffer.buffer)]);\n // TODO: read bytes from buffer instead of guessing meaning based on length.\n if (buffer.byteLength < 16) {\n for (let i = 3; i < buffer.byteLength - 4; i += 2) {\n const move = moveMap[buffer.getUint8(i)];\n this.alg = experimentalAppendMove(this.alg, move);\n this.dispatchMove({\n latestMove: moveMap[buffer.getUint8(i)],\n timeStamp: event.timeStamp,\n debug: {\n stateStr: buf2hex(buffer.buffer),\n },\n });\n }\n } else {\n const coords = bufferToString(\n buffer.buffer.slice(3, buffer.byteLength - 3),\n )\n .split(\"#\")\n .map((s) => parseInt(s, 10) / 16384);\n const quat = new Quaternion(coords[0], coords[1], coords[2], coords[3]);\n\n this.lastRawQuat = quat.clone();\n\n if (!this.homeQuatInverse) {\n this.homeQuatInverse = quat.clone().inverse();\n }\n\n const targetQuat = quat.clone().multiply(this.homeQuatInverse.clone());\n targetQuat.y = -targetQuat.y; // GoCube axis fix.\n\n this.lastTarget.slerp(targetQuat, 0.5);\n this.currentQuat.rotateTowards(this.lastTarget, rotateTowardsRate);\n\n this.dispatchOrientation({\n quaternion: this.currentQuat,\n timeStamp: event.timeStamp,\n });\n }\n }\n}\n\nconst rotateTowardsRate = 0.5;\n\n// TODO: Move this into a factory?\nexport const goCubeConfig: BluetoothConfig<BluetoothPuzzle> = {\n connect: GoCube.connect.bind(GoCube),\n prefixes: [\"GoCube\", \"Rubik\"],\n filters: [{ namePrefix: \"GoCube\" }, { namePrefix: \"Rubik\" }],\n optionalServices: [UUIDs.goCubeService],\n};\n", "export function flipBitOrder(v: number, numBits: number): number {\n let result = 0;\n for (let i = 0; i < numBits; i++) {\n const shiftLeft = numBits - 1 - 2 * i;\n const unShiftedBit = v & (0b1 << i);\n // console.log(\n // unShiftedBit,\n // shiftLeft,\n // shiftLeft < 0 ? unShiftedBit >> -shiftLeft : unShiftedBit << shiftLeft,\n // );\n result +=\n shiftLeft < 0 ? unShiftedBit >> -shiftLeft : unShiftedBit << shiftLeft;\n }\n return result;\n}\n", "/* tslint:disable no-bitwise */\n\nimport { Move } from \"../../alg\";\nimport type { KPuzzle } from \"../../kpuzzle\";\nimport type { KState } from \"../../kpuzzle/KState\";\nimport {\n experimentalBinaryComponentsToReid3x3x3,\n experimentalTwizzleBinaryToBinaryComponents,\n} from \"../../protocol\";\nimport { puzzles } from \"../../puzzles\";\nimport { debugLog } from \"../debug\";\nimport { BluetoothConfig, BluetoothPuzzle } from \"./bluetooth-puzzle\";\nimport { flipBitOrder } from \"./endianness\";\n\n// TODO: Short IDs\nconst UUIDs = {\n heykubeService: \"b46a791a-8273-4fc1-9e67-94d3dc2aac1c\",\n stateCharacteristic: \"a2f41a4e-0e31-4bbc-9389-4253475481fb\",\n batteryCharacteristic: \"fd51b3ba-99c7-49c6-9f85-5644ff56a378\",\n};\n\nexport class HeykubeCube extends BluetoothPuzzle {\n // We have to perform async operations before we call the constructor.\n public static async connect(\n server: BluetoothRemoteGATTServer,\n device: BluetoothDevice,\n ): Promise<HeykubeCube> {\n const service = await server.getPrimaryService(UUIDs.heykubeService);\n debugLog(\"Service:\", service);\n\n const stateCharacteristic = await service.getCharacteristic(\n UUIDs.stateCharacteristic,\n );\n debugLog(\"Characteristic:\", stateCharacteristic);\n\n const cube = new HeykubeCube(\n await puzzles[\"3x3x3\"].kpuzzle(),\n service,\n device,\n server,\n stateCharacteristic,\n );\n return cube;\n }\n\n private constructor(\n _kpuzzle: KPuzzle,\n _service: BluetoothRemoteGATTService,\n device: BluetoothDevice,\n private server: BluetoothRemoteGATTServer,\n private stateCharacteristic: BluetoothRemoteGATTCharacteristic,\n ) {\n super();\n\n device.addEventListener(\n \"gattserverdisconnected\",\n this.onDisconnect.bind(this),\n );\n\n this.stateCharacteristic.startNotifications();\n this.startTrackingMoves();\n }\n\n public name(): string | undefined {\n return this.server.device.name;\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n onDisconnect(): void {\n this.dispatchEvent(new CustomEvent(\"disconnect\"));\n }\n\n public startTrackingMoves(): void {\n this.stateCharacteristic.addEventListener(\n \"characteristicvaluechanged\",\n (e: any) => this.onStateCharacteristic(e),\n ); // TODO\n }\n\n // public stopTrackingMoves(): void {}\n\n // public async getBattery(): Promise<number> {\n // return new Uint8Array(\n // await this.readActualAngleAndBatteryCharacteristic(),\n // )[7];\n // }srcElement: BluetoothRemoteGATTCharacteristic\n\n private onStateCharacteristic(event: {\n target: BluetoothRemoteGATTCharacteristic;\n timeStamp: number;\n }): void {\n const state = this.decodeState(event.target.value!);\n // console.log(event, state.latestMove.toString(), state);\n this.dispatchMove({\n latestMove: state.latestMove,\n timeStamp: event.timeStamp,\n state: state.state,\n });\n }\n\n private decodeState(dv: DataView): { state: KState; latestMove: Move } {\n const moves = [\n new Move(\"U\"),\n new Move(\"U'\"),\n new Move(\"B\"),\n new Move(\"B'\"),\n new Move(\"F\"),\n new Move(\"F'\"),\n null,\n null,\n new Move(\"L\"),\n new Move(\"L'\"),\n new Move(\"D\"),\n new Move(\"D'\"),\n new Move(\"R\"),\n new Move(\"R'\"),\n // null,\n // null,\n ];\n\n const b2 = new Uint8Array(dv.byteLength);\n for (let i = 0; i < dv.byteLength; i++) {\n b2[i] = flipBitOrder(dv.getUint8(i), 8);\n }\n const components1 = experimentalTwizzleBinaryToBinaryComponents(\n b2.slice(0, 11),\n );\n // console.log(\"sliced\", dv.byteLength, bufferToSpacedHex(b2.slice(11)));\n const components2 = {\n epLex: flipBitOrder(components1.epLex, 29),\n eoMask: flipBitOrder(components1.eoMask, 12),\n cpLex: flipBitOrder(components1.cpLex, 16),\n coMask: flipBitOrder(components1.coMask, 13),\n poIdxL: 0,\n poIdxU: 0b111,\n moSupport: 0b1, // TODO\n moMask: 0,\n };\n // console.log(components2, binaryComponentsToReid3x3x3(components2));\n\n return {\n state: experimentalBinaryComponentsToReid3x3x3(components2),\n latestMove: moves[b2[20] & 0b00001111]!,\n };\n }\n\n public async getState(): Promise<KState> {\n const b1 = await this.stateCharacteristic.readValue();\n return this.decodeState(b1).state;\n }\n}\n\n// // TODO: Move this into a factory?\nexport const heykubeConfig: BluetoothConfig<BluetoothPuzzle> = {\n connect: HeykubeCube.connect.bind(HeykubeCube),\n prefixes: [\"HEYKUBE\"],\n filters: [{ namePrefix: \"HEYKUBE\" }],\n optionalServices: [UUIDs.heykubeService],\n};\n", "import { bluetoothConnect, BluetoothConnectOptions } from \"../connect\";\nimport type { BluetoothPuzzle } from \"./bluetooth-puzzle\";\nimport { ganConfig } from \"./gan\";\nimport { giiKERConfig } from \"./giiker\";\nimport { goCubeConfig } from \"./gocube\";\nimport { heykubeConfig } from \"./Heykube\";\n\nconst smartPuzzleConfigs = [\n ganConfig,\n goCubeConfig,\n heykubeConfig,\n giiKERConfig, // GiiKER must be last, due to Xiaomi naming. TODO: enforce this using tests.\n];\n\nexport async function connectSmartPuzzle(\n options?: BluetoothConnectOptions,\n): Promise<BluetoothPuzzle> {\n return bluetoothConnect<BluetoothPuzzle>(smartPuzzleConfigs, options);\n}\n", "import { Alg, Move } from \"../../alg\";\nimport type { BluetoothConfig } from \"../smart-puzzle/bluetooth-puzzle\";\n\n// TODO: Remove this. It's only used for debugging.\nfunction buf2hex(buffer: ArrayBuffer): string {\n // buffer is an ArrayBuffer\n return (\n Array.prototype.map.call(new Uint8Array(buffer), (x: number) =>\n (\"00\" + x.toString(16)).slice(-2),\n ) as string[]\n ).join(\" \");\n}\n\nconst MAX_NIBBLES_PER_WRITE = 18 * 2;\nconst QUANTUM_TURN_DURATION_MS = 150;\nconst DOUBLE_TURN_DURATION_MS = 250;\n\nconst U_D_SWAP = new Alg(\"F B R2 L2 B' F'\");\nconst U_D_UNSWAP = U_D_SWAP.invert(); // TODO: make `cubing.js` clever enough to be able to reuse the regular swap.\nconst F_B_SWAP = new Alg(\"U D R2 L2 D' U'\");\nconst F_B_UNSWAP = F_B_SWAP.invert();\n\n// TODO: Short IDs\nconst UUIDs = {\n ganRobotService: \"0000fff0-0000-1000-8000-00805f9b34fb\",\n statusCharacteristic: \"0000fff2-0000-1000-8000-00805f9b34fb\",\n moveCharacteristic: \"0000fff3-0000-1000-8000-00805f9b34fb\",\n};\n\nconst moveMap: Record<string, number> = {\n \"R\": 0,\n \"R2\": 1,\n \"R2'\": 1,\n \"R'\": 2,\n \"F\": 3,\n \"F2\": 4,\n \"F2'\": 4,\n \"F'\": 5,\n \"D\": 6,\n \"D2\": 7,\n \"D2'\": 7,\n \"D'\": 8,\n \"L\": 9,\n \"L2\": 10,\n \"L2'\": 10,\n \"L'\": 11,\n \"B\": 12,\n \"B2\": 13,\n \"B2'\": 13,\n \"B'\": 14,\n};\n\nconst moveMapX: Record<string, number> = {\n \"R\": 0,\n \"R2\": 1,\n \"R2'\": 1,\n \"R'\": 2,\n \"U\": 3,\n \"U2\": 4,\n \"U2'\": 4,\n \"U'\": 5,\n \"F\": 6,\n \"F2\": 7,\n \"F2'\": 7,\n \"F'\": 8,\n \"L\": 9,\n \"L2\": 10,\n \"L2'\": 10,\n \"L'\": 11,\n \"D\": 12,\n \"D2\": 13,\n \"D2'\": 13,\n \"D'\": 14,\n};\n\nfunction isDoubleTurnNibble(nibble: number): boolean {\n return nibble % 3 === 1;\n}\n\nfunction nibbleDuration(nibble: number): number {\n return isDoubleTurnNibble(nibble)\n ? DOUBLE_TURN_DURATION_MS\n : QUANTUM_TURN_DURATION_MS;\n}\n\nfunction throwInvalidMove(move: Move) {\n console.error(\"invalid move\", move, move.toString());\n throw new Error(\"invalid move!\");\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface GanRobotStatus {\n movesRemaining: number;\n}\n\ninterface GanRobotOptions {\n xAngle: boolean;\n singleMoveFixHack: boolean;\n bufferQueue: number;\n postSleep: number;\n}\n\nexport class GanRobot extends EventTarget {\n experimentalDebugOnSend: ((alg: Alg) => void) | null = null;\n experimentalDebugLog: typeof console.log = () => {};\n\n // Because our Bluetooth connection code is set up not to know what kind of device is connecting, we put these options directly on the class.\n experimentalOptions: GanRobotOptions = {\n xAngle: false,\n singleMoveFixHack: false,\n bufferQueue: 0,\n postSleep: 0,\n };\n\n constructor(\n _service: BluetoothRemoteGATTService,\n private server: BluetoothRemoteGATTServer,\n device: BluetoothDevice,\n private statusCharacteristic: BluetoothRemoteGATTCharacteristic,\n private moveCharacteristic: BluetoothRemoteGATTCharacteristic,\n ) {\n super();\n device.addEventListener(\n \"gattserverdisconnected\",\n this.onDisconnect.bind(this),\n );\n }\n\n // We have to perform async operations before we call the constructor.\n static async connect(\n server: BluetoothRemoteGATTServer,\n device: BluetoothDevice,\n ) {\n const ganTimerService = await server.getPrimaryService(\n UUIDs.ganRobotService,\n );\n const statusCharacteristic = await ganTimerService.getCharacteristic(\n UUIDs.statusCharacteristic,\n );\n const moveCharacteristic = await ganTimerService.getCharacteristic(\n UUIDs.moveCharacteristic,\n );\n const timer = new GanRobot(\n ganTimerService,\n server,\n device,\n statusCharacteristic,\n moveCharacteristic,\n );\n return timer;\n }\n\n public name(): string | undefined {\n return this.server.device.name;\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n onDisconnect(): void {\n this.dispatchEvent(new CustomEvent(\"disconnect\"));\n }\n\n private moveToNibble(move: Move): number {\n const nibble =\n (this.experimentalOptions.xAngle ? moveMapX : moveMap)[move.toString()] ??\n null;\n if (nibble === null) {\n throwInvalidMove(move);\n }\n return nibble;\n }\n\n private async writeNibbles(nibbles: number[]): Promise<void> {\n if (nibbles.length > MAX_NIBBLES_PER_WRITE) {\n throw new Error(\n `Can only write ${MAX_NIBBLES_PER_WRITE} nibbles at a time!`,\n );\n }\n // const byteLength = Math.ceil(nibbles.length / 2);\n const bytes = new Uint8Array(18);\n let i: number;\n for (i = 0; i < nibbles.length; i++) {\n const byteIdx = Math.floor(i / 2);\n bytes[byteIdx] += nibbles[i];\n if (i % 2 === 0) {\n bytes[byteIdx] *= 0x10;\n }\n }\n if (nibbles.length % 2 === 1) {\n bytes[Math.ceil(nibbles.length / 2) - 1] += 0xf;\n }\n for (let i = Math.ceil(nibbles.length / 2); i < 18; i++) {\n bytes[i] = 0xff;\n }\n let sleepDuration = 0;\n for (const nibble of nibbles) {\n sleepDuration += nibbleDuration(nibble);\n }\n this.experimentalDebugLog(\"WRITING:\", buf2hex(bytes));\n await this.moveCharacteristic.writeValue(bytes);\n await sleep(sleepDuration * 0.75);\n while ((await this.getStatus()).movesRemaining > 0) {\n // repeat\n }\n await sleep(this.experimentalOptions.postSleep);\n }\n\n private async getStatus(): Promise<GanRobotStatus> {\n const statusBytes = new Uint8Array(\n (await this.statusCharacteristic.readValue()).buffer,\n );\n this.experimentalDebugLog(\"moves remaining:\", statusBytes[0]);\n return {\n movesRemaining: statusBytes[0],\n };\n }\n\n locked: boolean = false;\n processQueue(): void {}\n\n private moveQueue: Alg = new Alg();\n // TODO: Don't let this resolve until the move is done?\n private async queueMoves(moves: Alg): Promise<void> {\n this.moveQueue = this.moveQueue\n .concat(moves)\n .simplify({ collapseMoves: true, quantumMoveOrder: (_) => 4 });\n if (!this.locked) {\n // TODO: We're currently iterating over units instead of leaves to avoid \"zip bomps\".\n try {\n this.locked = true;\n if (this.moveQueue.experimentalNumUnits() === 1) {\n await sleep(this.experimentalOptions.bufferQueue);\n }\n // await this.writeNibbles([0xf, 0xf]);\n while (this.moveQueue.experimentalNumUnits() > 0) {\n let units = Array.from(this.moveQueue.units());\n if (\n this.experimentalOptions.singleMoveFixHack &&\n units.length === 1\n ) {\n const move = units[0] as Move;\n if (move.amount === 2) {\n units = [\n move.modified({ amount: 1 }),\n move.modified({ amount: 1 }),\n ];\n } else {\n units = [\n move.modified({ amount: -move.amount }),\n move.modified({ amount: 2 }),\n ];\n }\n }\n const moves = units.splice(0, MAX_NIBBLES_PER_WRITE);\n const nibbles: number[] = moves.map(this.moveToNibble.bind(this));\n const sending = new Alg(moves);\n this.experimentalDebugLog(\"SENDING\", sending.toString());\n if (this.experimentalDebugOnSend) {\n this.experimentalDebugOnSend(sending);\n }\n const write = this.writeNibbles(nibbles);\n this.moveQueue = new Alg(units);\n await write;\n }\n } finally {\n this.locked = false;\n }\n }\n }\n\n async applyMoves(moves: Iterable<Move>): Promise<void> {\n // const nibbles: number[] = [];\n for (const move of moves) {\n const str = move.toString();\n if (str in (this.experimentalOptions.xAngle ? moveMapX : moveMap)) {\n await this.queueMoves(new Alg([move]));\n } else if (\n move.family === (this.experimentalOptions.xAngle ? \"B\" : \"U\")\n ) {\n // We purposely send just the swap, so that U2 will get coalesced\n await Promise.all([\n this.queueMoves(\n this.experimentalOptions.xAngle ? F_B_SWAP : U_D_SWAP,\n ),\n this.queueMoves(\n new Alg([\n move.modified({\n family: this.experimentalOptions.xAngle ? \"F\" : \"D\",\n }),\n ]).concat(\n this.experimentalOptions.xAngle ? F_B_UNSWAP : U_D_UNSWAP,\n ),\n ),\n ]);\n }\n }\n }\n}\n\n// // TODO: Move this into a factory?\nexport const ganTimerConfig: BluetoothConfig<GanRobot> = {\n connect: GanRobot.connect.bind(GanRobot),\n prefixes: [\"GAN\"],\n filters: [{ namePrefix: \"GAN\" }],\n optionalServices: [UUIDs.ganRobotService],\n};\n", "import { bluetoothConnect, BluetoothConnectOptions } from \"../connect\";\nimport type { BluetoothConfig } from \"../smart-puzzle/bluetooth-puzzle\";\nimport { GanRobot, ganTimerConfig } from \"./GanRobot\";\n\nexport type BluetoothRobot = GanRobot; // TODO\n\nconst smartRobotConfigs: BluetoothConfig<BluetoothRobot>[] = [ganTimerConfig];\n\nexport async function connectSmartRobot(\n options?: BluetoothConnectOptions,\n): Promise<BluetoothRobot> {\n return bluetoothConnect<BluetoothRobot>(smartRobotConfigs, options);\n}\n", "import type { MillisecondTimestamp } from \"../../twisty/controllers/AnimationTypes\";\nimport type { BluetoothConfig } from \"../smart-puzzle/bluetooth-puzzle\";\n\n// TODO: Short IDs\nconst UUIDs = {\n ganTimerService: \"0000fff0-0000-1000-8000-00805f9b34fb\",\n timeCharacteristic: \"0000fff2-0000-1000-8000-00805f9b34fb\",\n};\n\ninterface GanTimerDetail {\n currentTime: MillisecondTimestamp;\n latestTimes: [\n MillisecondTimestamp,\n MillisecondTimestamp,\n MillisecondTimestamp,\n ];\n}\n\nexport class GanTimer extends EventTarget {\n private polling = false;\n private previousDetail: GanTimerDetail | null = null;\n\n constructor(\n _service: BluetoothRemoteGATTService,\n private server: BluetoothRemoteGATTServer,\n device: BluetoothDevice,\n private timeCharacteristic: BluetoothRemoteGATTCharacteristic,\n ) {\n super();\n this.startPolling();\n console.log(server);\n device.addEventListener(\n \"gattserverdisconnected\",\n this.onDisconnect.bind(this),\n );\n }\n\n // We have to perform async operations before we call the constructor.\n static async connect(\n server: BluetoothRemoteGATTServer,\n device: BluetoothDevice,\n ) {\n const ganTimerService = await server.getPrimaryService(\n UUIDs.ganTimerService,\n );\n console.log(\"Service:\", ganTimerService);\n const timeCharacteristic = await ganTimerService.getCharacteristic(\n UUIDs.timeCharacteristic,\n );\n console.log(\"Characteristic:\", timeCharacteristic);\n const timer = new GanTimer(\n ganTimerService,\n server,\n device,\n timeCharacteristic,\n );\n return timer;\n }\n\n disconnect(): void {\n this.server.disconnect();\n }\n\n async poll() {\n if (!this.polling) {\n return;\n }\n const value = await this.getTimeCharacteristic();\n\n const detail: GanTimerDetail = {\n currentTime: this.decodeTimeMs(value.slice(0, 4)),\n latestTimes: [\n this.decodeTimeMs(value.slice(4, 8)),\n this.decodeTimeMs(value.slice(8, 12)),\n this.decodeTimeMs(value.slice(12, 16)),\n ],\n };\n\n if (detail.currentTime === 0) {\n if (this.previousDetail && this.previousDetail.currentTime !== 0) {\n this.dispatchEvent(new CustomEvent(\"reset\"));\n }\n }\n\n if (detail.currentTime !== 0 && this.previousDetail) {\n if (this.previousDetail.currentTime === 0) {\n this.dispatchEvent(new CustomEvent(\"start\"));\n }\n\n if (detail.currentTime !== this.previousDetail.currentTime) {\n this.dispatchEvent(new CustomEvent(\"update\", { detail }));\n\n if (\n detail.currentTime === detail.latestTimes[0] &&\n detail.latestTimes[1] === this.previousDetail.latestTimes[0] &&\n detail.latestTimes[2] === this.previousDetail.latestTimes[1]\n ) {\n this.dispatchEvent(new CustomEvent(\"stop\", { detail }));\n }\n }\n }\n\n this.previousDetail = detail;\n\n this.poll();\n }\n\n onDisconnect(): void {\n this.dispatchEvent(new CustomEvent(\"disconnect\"));\n }\n\n async getTimeCharacteristic() {\n return new Uint8Array((await this.timeCharacteristic.readValue()).buffer);\n }\n\n async getTime() {\n const value = await this.getTimeCharacteristic();\n return this.decodeTimeMs(value.slice(0, 4));\n }\n\n decodeTimeMs(bytes: Uint8Array) {\n return (bytes[0] * 60 + bytes[1]) * 1000 + bytes[2] + bytes[3] * 256;\n }\n\n startPolling() {\n this.polling = true;\n this.poll();\n }\n\n stopPolling() {\n this.polling = false;\n }\n}\n\n// // TODO: Move this into a factory?\nexport const ganTimerConfig: BluetoothConfig<GanTimer> = {\n connect: GanTimer.connect.bind(GanTimer),\n prefixes: [\"GAN\"],\n filters: [{ namePrefix: \"GAN\" }],\n optionalServices: [UUIDs.ganTimerService],\n};\n", "import { bluetoothConnect, BluetoothConnectOptions } from \"../connect\";\nimport type { BluetoothConfig } from \"../smart-puzzle/bluetooth-puzzle\";\nimport { GanTimer, ganTimerConfig } from \"./GanTimer\";\n\nexport type BluetoothTimer = GanTimer; // TODO\n\nconst smartTimerConfigs: BluetoothConfig<BluetoothTimer>[] = [ganTimerConfig];\n\nexport async function connectSmartTimer(\n options?: BluetoothConnectOptions,\n): Promise<BluetoothTimer> {\n return bluetoothConnect<BluetoothTimer>(smartTimerConfigs, options);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,84 @@
1
+ import {
2
+ Alg
3
+ } from "./chunk-EWRBHQFX.js";
4
+
5
+ // src/cubing/search/inside/solve/parseSGS.ts
6
+ function parseSGS(kpuzzle, sgs) {
7
+ const subgroupSizes = [];
8
+ const sgsActions = [];
9
+ for (const line of sgs.split("\n")) {
10
+ const lineTokens = line.split(" ");
11
+ if (line.startsWith("SetOrder ")) {
12
+ } else if (line.startsWith("Alg ")) {
13
+ const alg = Alg.fromString(line.substring(4));
14
+ sgsActions.push({
15
+ alg,
16
+ transformation: kpuzzle.algToTransformation(alg)
17
+ });
18
+ } else if (line.startsWith("SubgroupSizes ")) {
19
+ for (let j = 1; j < lineTokens.length; j++) {
20
+ subgroupSizes.push(parseInt(lineTokens[j]));
21
+ }
22
+ }
23
+ }
24
+ const sgsCachedData = {
25
+ ordering: new Array(subgroupSizes.length)
26
+ };
27
+ const subgroupAlgOffsets = [];
28
+ let sum = 0;
29
+ subgroupAlgOffsets.push(0);
30
+ const emptyAlg = Alg.fromString("");
31
+ const identity = kpuzzle.identityTransformation();
32
+ for (let i = 0; i < subgroupSizes.length; i++) {
33
+ sum += subgroupSizes[i];
34
+ subgroupAlgOffsets.push(sum);
35
+ sgsActions.splice(sum - 1, 0, { alg: emptyAlg, transformation: identity });
36
+ }
37
+ if (sgsActions.length !== sum) {
38
+ throw Error(`Bad sgs; expected ${sum - subgroupSizes.length} algs but saw ${sgsActions.length - subgroupSizes.length}`);
39
+ }
40
+ const processedPieces = {};
41
+ for (const orbitName in kpuzzle.definition.orbits) {
42
+ const orbitDefinition = kpuzzle.definition.orbits[orbitName];
43
+ processedPieces[orbitName] = new Array(orbitDefinition.numPieces).fill(false);
44
+ }
45
+ for (let i = subgroupSizes.length - 1; i >= 0; i--) {
46
+ const pieceOrdering = [];
47
+ for (let j = subgroupAlgOffsets[i]; j < subgroupAlgOffsets[i + 1]; j++) {
48
+ const transformation = sgsActions[j].transformation;
49
+ for (const orbitName in kpuzzle.definition.orbits) {
50
+ const orbitDefinition = kpuzzle.definition.orbits[orbitName];
51
+ for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
52
+ if (transformation.transformationData[orbitName].permutation[idx] !== idx || transformation.transformationData[orbitName].orientation[idx] !== 0) {
53
+ if (!processedPieces[orbitName][idx]) {
54
+ pieceOrdering.push({ orbitName, permutationIdx: idx });
55
+ processedPieces[orbitName][idx] = true;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }
61
+ const lookup = {};
62
+ for (let j = subgroupAlgOffsets[i]; j < subgroupAlgOffsets[i + 1]; j++) {
63
+ const transformation = sgsActions[j].transformation.invert();
64
+ let key = "";
65
+ for (let k = 0; k < pieceOrdering.length; k++) {
66
+ const loc = pieceOrdering[k];
67
+ key = `${key} ${transformation.transformationData[loc.orbitName].permutation[loc.permutationIdx]} ${transformation.transformationData[loc.orbitName].orientation[loc.permutationIdx]}`;
68
+ }
69
+ lookup[key] = sgsActions[j];
70
+ sgsActions[j].alg = sgsActions[j].alg.invert();
71
+ sgsActions[j].transformation = sgsActions[j].transformation.invert();
72
+ }
73
+ sgsCachedData.ordering[i] = {
74
+ pieceOrdering,
75
+ lookup
76
+ };
77
+ }
78
+ return sgsCachedData;
79
+ }
80
+
81
+ export {
82
+ parseSGS
83
+ };
84
+ //# sourceMappingURL=chunk-27KJGD3S.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/cubing/search/inside/solve/parseSGS.ts"],
4
+ "sourcesContent": ["import { Alg } from \"../../../alg\";\nimport type { KPuzzle, KTransformation } from \"../../../kpuzzle\";\n\ninterface PieceReference {\n orbitName: string;\n permutationIdx: number;\n}\n\nexport interface SGSAction {\n alg: Alg;\n transformation: KTransformation;\n}\n\nexport interface SGSCachedData {\n ordering: {\n pieceOrdering: PieceReference[];\n lookup: Record<string, SGSAction>;\n }[];\n}\n\nexport function parseSGS(kpuzzle: KPuzzle, sgs: string): SGSCachedData {\n const subgroupSizes: number[] = [];\n const sgsActions: SGSAction[] = [];\n for (const line of sgs.split(\"\\n\")) {\n const lineTokens = line.split(\" \");\n if (line.startsWith(\"SetOrder \")) {\n // ignore\n } else if (line.startsWith(\"Alg \")) {\n const alg = Alg.fromString(line.substring(4));\n sgsActions.push({\n alg: alg,\n transformation: kpuzzle.algToTransformation(alg),\n });\n } else if (line.startsWith(\"SubgroupSizes \")) {\n for (let j = 1; j < lineTokens.length; j++) {\n subgroupSizes.push(parseInt(lineTokens[j]));\n }\n }\n }\n\n const sgsCachedData: SGSCachedData = {\n ordering: new Array(subgroupSizes.length),\n };\n const subgroupAlgOffsets: number[] = [];\n let sum = 0;\n subgroupAlgOffsets.push(0);\n const emptyAlg = Alg.fromString(\"\");\n const identity = kpuzzle.identityTransformation();\n for (let i = 0; i < subgroupSizes.length; i++) {\n sum += subgroupSizes[i];\n subgroupAlgOffsets.push(sum);\n sgsActions.splice(sum - 1, 0, { alg: emptyAlg, transformation: identity });\n }\n if (sgsActions.length !== sum) {\n throw Error(\n `Bad sgs; expected ${sum - subgroupSizes.length} algs but saw ${\n sgsActions.length - subgroupSizes.length\n }`,\n );\n }\n const processedPieces: Record<string, boolean[]> = {};\n for (const orbitName in kpuzzle.definition.orbits) {\n const orbitDefinition = kpuzzle.definition.orbits[orbitName];\n processedPieces[orbitName] = new Array(orbitDefinition.numPieces).fill(\n false,\n );\n }\n for (let i = subgroupSizes.length - 1; i >= 0; i--) {\n const pieceOrdering: PieceReference[] = [];\n for (let j = subgroupAlgOffsets[i]; j < subgroupAlgOffsets[i + 1]; j++) {\n const transformation = sgsActions[j].transformation;\n for (const orbitName in kpuzzle.definition.orbits) {\n const orbitDefinition = kpuzzle.definition.orbits[orbitName];\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n if (\n transformation.transformationData[orbitName].permutation[idx] !==\n idx ||\n transformation.transformationData[orbitName].orientation[idx] !== 0\n ) {\n if (!processedPieces[orbitName][idx]) {\n pieceOrdering.push({ orbitName: orbitName, permutationIdx: idx });\n processedPieces[orbitName][idx] = true;\n }\n }\n }\n }\n }\n const lookup: Record<string, SGSAction> = {};\n for (let j = subgroupAlgOffsets[i]; j < subgroupAlgOffsets[i + 1]; j++) {\n const transformation = sgsActions[j].transformation.invert();\n let key = \"\";\n for (let k = 0; k < pieceOrdering.length; k++) {\n const loc = pieceOrdering[k];\n key = `${key} ${\n transformation.transformationData[loc.orbitName].permutation[\n loc.permutationIdx\n ]\n } ${\n transformation.transformationData[loc.orbitName].orientation[\n loc.permutationIdx\n ]\n }`;\n }\n lookup[key] = sgsActions[j];\n sgsActions[j].alg = sgsActions[j].alg.invert();\n sgsActions[j].transformation = sgsActions[j].transformation.invert();\n }\n sgsCachedData.ordering[i] = {\n pieceOrdering: pieceOrdering,\n lookup: lookup,\n };\n }\n return sgsCachedData;\n}\n"],
5
+ "mappings": ";;;;;AAoBO,kBAAkB,SAAkB,KAA4B;AACrE,QAAM,gBAA0B;AAChC,QAAM,aAA0B;AAChC,aAAW,QAAQ,IAAI,MAAM,OAAO;AAClC,UAAM,aAAa,KAAK,MAAM;AAC9B,QAAI,KAAK,WAAW,cAAc;AAAA,eAEvB,KAAK,WAAW,SAAS;AAClC,YAAM,MAAM,IAAI,WAAW,KAAK,UAAU;AAC1C,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,gBAAgB,QAAQ,oBAAoB;AAAA;AAAA,eAErC,KAAK,WAAW,mBAAmB;AAC5C,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,sBAAc,KAAK,SAAS,WAAW;AAAA;AAAA;AAAA;AAK7C,QAAM,gBAA+B;AAAA,IACnC,UAAU,IAAI,MAAM,cAAc;AAAA;AAEpC,QAAM,qBAA+B;AACrC,MAAI,MAAM;AACV,qBAAmB,KAAK;AACxB,QAAM,WAAW,IAAI,WAAW;AAChC,QAAM,WAAW,QAAQ;AACzB,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,WAAO,cAAc;AACrB,uBAAmB,KAAK;AACxB,eAAW,OAAO,MAAM,GAAG,GAAG,EAAE,KAAK,UAAU,gBAAgB;AAAA;AAEjE,MAAI,WAAW,WAAW,KAAK;AAC7B,UAAM,MACJ,qBAAqB,MAAM,cAAc,uBACvC,WAAW,SAAS,cAAc;AAAA;AAIxC,QAAM,kBAA6C;AACnD,aAAW,aAAa,QAAQ,WAAW,QAAQ;AACjD,UAAM,kBAAkB,QAAQ,WAAW,OAAO;AAClD,oBAAgB,aAAa,IAAI,MAAM,gBAAgB,WAAW,KAChE;AAAA;AAGJ,WAAS,IAAI,cAAc,SAAS,GAAG,KAAK,GAAG,KAAK;AAClD,UAAM,gBAAkC;AACxC,aAAS,IAAI,mBAAmB,IAAI,IAAI,mBAAmB,IAAI,IAAI,KAAK;AACtE,YAAM,iBAAiB,WAAW,GAAG;AACrC,iBAAW,aAAa,QAAQ,WAAW,QAAQ;AACjD,cAAM,kBAAkB,QAAQ,WAAW,OAAO;AAClD,iBAAS,MAAM,GAAG,MAAM,gBAAgB,WAAW,OAAO;AACxD,cACE,eAAe,mBAAmB,WAAW,YAAY,SACvD,OACF,eAAe,mBAAmB,WAAW,YAAY,SAAS,GAClE;AACA,gBAAI,CAAC,gBAAgB,WAAW,MAAM;AACpC,4BAAc,KAAK,EAAE,WAAsB,gBAAgB;AAC3D,8BAAgB,WAAW,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAM5C,UAAM,SAAoC;AAC1C,aAAS,IAAI,mBAAmB,IAAI,IAAI,mBAAmB,IAAI,IAAI,KAAK;AACtE,YAAM,iBAAiB,WAAW,GAAG,eAAe;AACpD,UAAI,MAAM;AACV,eAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,cAAM,MAAM,cAAc;AAC1B,cAAM,GAAG,OACP,eAAe,mBAAmB,IAAI,WAAW,YAC/C,IAAI,mBAGN,eAAe,mBAAmB,IAAI,WAAW,YAC/C,IAAI;AAAA;AAIV,aAAO,OAAO,WAAW;AACzB,iBAAW,GAAG,MAAM,WAAW,GAAG,IAAI;AACtC,iBAAW,GAAG,iBAAiB,WAAW,GAAG,eAAe;AAAA;AAE9D,kBAAc,SAAS,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA;AAAA;AAGJ,SAAO;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,66 @@
1
+ // src/cubing/vendor/random-uint-below/get-random-values.ts
2
+ var cryptoPromise = null;
3
+ async function getRandomValuesFactory() {
4
+ if (!globalThis?.crypto?.getRandomValues) {
5
+ const nodeWebcrypto = (await (cryptoPromise ?? (cryptoPromise = import("crypto")))).webcrypto;
6
+ return nodeWebcrypto.getRandomValues;
7
+ } else {
8
+ return crypto.getRandomValues.bind(crypto);
9
+ }
10
+ }
11
+
12
+ // src/cubing/vendor/random-uint-below/random53BitValue.ts
13
+ var MAX_JS_PRECISE_INT = 9007199254740992;
14
+ var UPPER_HALF_MULTIPLIER = 2097152;
15
+ var LOWER_HALF_DIVIDER = 2048;
16
+ function random53BitValue(getRandomValues) {
17
+ const arr = new Uint32Array(2);
18
+ getRandomValues(arr);
19
+ const upper = arr[0];
20
+ const lower = arr[1];
21
+ return Math.floor(upper * UPPER_HALF_MULTIPLIER) + Math.floor(lower / LOWER_HALF_DIVIDER);
22
+ }
23
+ function validateMax(max) {
24
+ if (typeof max !== "number" || max < 0 || Math.floor(max) !== max) {
25
+ throw new Error("randomInt.below() not called with a positive integer value.");
26
+ }
27
+ if (max > MAX_JS_PRECISE_INT) {
28
+ throw new Error(`Called randomInt.below() with max == ${max}, which is larger than JavaScript can handle with integer precision.`);
29
+ }
30
+ }
31
+ async function randomUIntBelowFactory() {
32
+ const getRandomValues = await getRandomValuesFactory();
33
+ const randomUIntBelow = (max) => {
34
+ validateMax(max);
35
+ const val = random53BitValue(getRandomValues);
36
+ const maxUniformSamplingRange = Math.floor(MAX_JS_PRECISE_INT / max) * max;
37
+ if (val < maxUniformSamplingRange) {
38
+ return val % max;
39
+ } else {
40
+ return randomUIntBelow(max);
41
+ }
42
+ };
43
+ return randomUIntBelow;
44
+ }
45
+
46
+ // src/cubing/vendor/random-uint-below/random-choice.ts
47
+ async function randomChoiceFactory() {
48
+ const randomUIntBelow = await randomUIntBelowFactory();
49
+ return (arr) => arr[randomUIntBelow(arr.length)];
50
+ }
51
+
52
+ // src/cubing/vendor/random-uint-below/index.ts
53
+ var randomUIntBelowPromise = randomUIntBelowFactory();
54
+ async function randomPermute(list) {
55
+ for (let i = 1; i < list.length; i++) {
56
+ const j = (await randomUIntBelowPromise)(i);
57
+ [list[i], list[j]] = [list[j], list[i]];
58
+ }
59
+ }
60
+
61
+ export {
62
+ randomUIntBelowFactory,
63
+ randomChoiceFactory,
64
+ randomPermute
65
+ };
66
+ //# sourceMappingURL=chunk-37EHU3GZ.js.map