cubing 0.25.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/esm/{2x2x2.sgs.json-TCTAV5XU.js → 2x2x2.sgs.json-QKP2WRPT.js} +2 -2
  2. package/dist/esm/{2x2x2.sgs.json-TCTAV5XU.js.map → 2x2x2.sgs.json-QKP2WRPT.js.map} +0 -0
  3. package/dist/esm/{3d-dynamic-inside-MLJKFLGH.js → 3d-dynamic-inside-GKERM3IG.js} +3 -3
  4. package/dist/esm/{3d-dynamic-inside-MLJKFLGH.js.map → 3d-dynamic-inside-GKERM3IG.js.map} +0 -0
  5. package/dist/esm/bluetooth/index.js +1 -1
  6. package/dist/esm/{chunk-U2R5E2A4.js → chunk-37NJ765B.js} +6 -4
  7. package/dist/esm/{chunk-U2R5E2A4.js.map → chunk-37NJ765B.js.map} +2 -2
  8. package/dist/esm/{chunk-4SUQM4XH.js → chunk-GXV3K7MX.js} +2 -2
  9. package/dist/esm/{chunk-4SUQM4XH.js.map → chunk-GXV3K7MX.js.map} +0 -0
  10. package/dist/esm/{chunk-TVY3UOOK.js → chunk-HCNUMBT5.js} +2 -2
  11. package/dist/esm/{chunk-TVY3UOOK.js.map → chunk-HCNUMBT5.js.map} +0 -0
  12. package/dist/esm/{chunk-AAB2V4UB.js → chunk-QUTXXRPT.js} +2 -2
  13. package/dist/esm/{chunk-AAB2V4UB.js.map → chunk-QUTXXRPT.js.map} +0 -0
  14. package/dist/esm/{chunk-V7Z6KRM2.js → chunk-Z5INA5XR.js} +3 -3
  15. package/dist/esm/{chunk-V7Z6KRM2.js.map → chunk-Z5INA5XR.js.map} +0 -0
  16. package/dist/esm/{entry-Y2R6JXV7.js → entry-RSZSKW5X.js} +17 -9
  17. package/dist/esm/{entry-Y2R6JXV7.js.map → entry-RSZSKW5X.js.map} +3 -3
  18. package/dist/esm/{fto.sgs.json-2IU2J6W7.js → fto.sgs.json-T5WY2HR7.js} +2 -2
  19. package/dist/esm/{fto.sgs.json-2IU2J6W7.js.map → fto.sgs.json-T5WY2HR7.js.map} +0 -0
  20. package/dist/esm/{ftosolver-smaller-phase3-table-PUTNXKKW.js → ftosolver-smaller-phase3-table-UTQRO776.js} +283 -76
  21. package/dist/esm/ftosolver-smaller-phase3-table-UTQRO776.js.map +7 -0
  22. package/dist/esm/masterpyra-QOJCNGZM.js +732 -0
  23. package/dist/esm/masterpyra-QOJCNGZM.js.map +7 -0
  24. package/dist/esm/{module-entry-3WBGTDCZ.js → module-entry-UDFTQHXX.js} +2 -2
  25. package/dist/esm/{module-entry-3WBGTDCZ.js.map → module-entry-UDFTQHXX.js.map} +0 -0
  26. package/dist/esm/puzzles/index.js +1 -1
  27. package/dist/esm/{pyraminx.sgs.json-NZWNQPLL.js → pyraminx.sgs.json-5HPDQAOM.js} +3 -3
  28. package/dist/esm/{pyraminx.sgs.json-NZWNQPLL.js.map → pyraminx.sgs.json-5HPDQAOM.js.map} +0 -0
  29. package/dist/esm/scramble/index.js +3 -3
  30. package/dist/esm/{scramble_444-Q334Y5FH.js → scramble_444-FXLLIDCW.js} +3 -3
  31. package/dist/esm/{scramble_444-Q334Y5FH.js.map → scramble_444-FXLLIDCW.js.map} +0 -0
  32. package/dist/esm/search/index.js +3 -3
  33. package/dist/esm/twisty/index.js +2 -2
  34. package/dist/esm/worker-inside-generated-string-WGUQ4QSO.js +2828 -0
  35. package/dist/esm/worker-inside-generated-string-WGUQ4QSO.js.map +7 -0
  36. package/dist/types/puzzles/async/async-pg3d.d.ts +2 -0
  37. package/dist/types/search/inside/solve/puzzles/master_tetraminx.d.ts +2 -0
  38. package/dist/types/search/worker-inside-generated-string.d.ts +1 -1
  39. package/dist/types/vendor/xyzzy/ftosolver-smaller-phase3-table.d.ts +1 -1
  40. package/dist/types/vendor/xyzzy/ftosolver.d.ts +4 -25
  41. package/dist/types/vendor/xyzzy/kilosolver.d.ts +1 -19
  42. package/dist/types/vendor/xyzzy/masterpyra.d.ts +1 -217
  43. package/dist/types/vendor/xyzzy/rediscrambler.d.ts +1 -37
  44. package/package.json +2 -2
  45. package/dist/esm/ftosolver-smaller-phase3-table-PUTNXKKW.js.map +0 -7
  46. package/dist/esm/worker-inside-generated-string-BERQU3U7.js +0 -2828
  47. package/dist/esm/worker-inside-generated-string-BERQU3U7.js.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/cubing/vendor/xyzzy/ftosolver-smaller-phase3-table.js"],
4
- "sourcesContent": ["/* eslint-disable */\n/* ftosolver.js - An FTO solver\nversion 0.5.1 (2021-04-20)\n\nCopyright (c) 2016, 2020, 2021\n\nFrom https://gist.github.com/torchlight/9a5c53da09d8e090756a228f4b5f3471\nOriginally MIT licensed, added to `cubing.js` under the GPL license by permission from the author (@torchlight/xyzzy).\n\nCompatibility note:\nThis is targeted at Firefox / Spidermonkey releases from 2019 and onwards. It might not run on older\nJavaScript engines. Recent Chrome / Node releases should also work, but are not tested as much.\n*/\n\n'use strict';\n\n/* Helper functions */\n\nfunction counter(A)\n{\n\tlet counts = [];\n\tfor (let a of A) counts[a] = (counts[a] || 0) + 1;\n\treturn counts;\n}\n\nlet rng = (() => {\n\nlet entropy = 0;\nlet entropy_size = 1;\n// invariant: 1 <= entropy_size <= 2**53 and 0 <= entropy < entropy_size\n\nlet random_bit = globalThis.crypto ? () => crypto.getRandomValues(new Uint8Array(1))[0] & 1 : () => Math.round(Math.random());\n\nconst SAFETY_MARGIN = 10000;\nconst MAX_ITERATIONS = 20;\n/*\nThe probability of using a fallback nonuniform RNG is bounded by 1 / SAFETY_MARGIN ** MAX_ITERATIONS\nassuming the underlying RNG used is free from bias. With these values, this means that there is at\nmost a 1/10^80 chance of using the fallback, which is basically zero.\n\nNote: SAFETY_MARGIN must be at most 2**20.\n*/\n\nfunction next(bound)\n{\n\tif (bound <= 0 || bound > 2**32 || bound !== Math.floor(bound)) {throw 'invalid bound';}\n\tfor (let it = 0; it <= MAX_ITERATIONS; it++)\n\t{\n\t\tfor (let i = 0; i < 53 && entropy_size <= 2**52 && entropy_size < bound*SAFETY_MARGIN; i++)\n\t\t{\n\t\t\tentropy += random_bit() * entropy_size;\n\t\t\tentropy_size *= 2;\n\t\t}\n\t\tlet limit = entropy_size - entropy_size%bound; // = floor(entropy_size / bound) * bound\n\t\tif (entropy < limit || it === MAX_ITERATIONS)\n\t\t{\n\t\t\tlet result = entropy % bound;\n\t\t\tentropy = (entropy - result) / bound;\n\t\t\tentropy_size = limit / bound;\n\t\t\tif (entropy === entropy_size)\n\t\t\t{\n\t\t\t\t// this can happen only if we've exceeded the iteration limit\n\t\t\t\tentropy = 0;\n\t\t\t\tentropy_size = 1;\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\tentropy -= limit;\n\t\tentropy_size -= limit;\n\t}\n}\n\nreturn {next, is_crypto: !!globalThis.crypto};\n})();\n\n/* Combinatoric functions */\n\nfunction factorial(n)\n{\n\tif (n < 2) return n;\n\tlet f = 1;\n\tfor (let i = 2; i <= n; i++) f *= i;\n\treturn f;\n}\n\nfunction C(n, k)\n{\n\tif (k < 0 || k > n) return 0;\n\tif (k === 0 || k === n) return 1;\n\tlet c = 1;\n\tfor (let i = 0; i < k; i++)\n\t{\n\t\tc = (c * (n-i) / (i+1)) | 0;\n\t}\n\treturn c;\n}\n\nfunction C4(n, k0, k1, k2, k3=n-k0-k1-k2)\n{\n\treturn C(n, k0 + k1) * C(k0 + k1, k0) * C(k2 + k3, k2);\n}\n\nfunction permutation_to_index(perm)\n{\n\tperm = perm.slice();\n\tlet n = perm.length;\n\tlet f = factorial(n-1);\n\tlet ind = 0;\n\twhile (n > 1)\n\t{\n\t\tn--;\n\t\t// invariant: f == factorial(n)\n\t\t// also, perm stores meaningful values up to perm[n]\n\t\tlet e = perm[0];\n\t\tind += e * f;\n\t\tfor (let i = 0; i < n; i++)\n\t\t{\n\t\t\tlet x = perm[i+1];\n\t\t\tperm[i] = x - (x > e);\n\t\t}\n\t\tf /= n;\n\t}\n\treturn ind;\n}\n\nfunction index_to_permutation(ind, n)\n{\n\tlet perm = [];\n\tlet f = factorial(n-1);\n\tfor (let i = 0; i < n; i++)\n\t{\n\t\tperm[i] = (ind / f) | 0;\n\t\tind %= f;\n\t\tf /= n-1-i;\n\t}\n\tfor (let i = n-2; i >= 0; i--)\n\t{\n\t\tfor (let j = i+1; j < n; j++)\n\t\t{\n\t\t\tperm[j] += +(perm[j] >= perm[i]);\n\t\t}\n\t}\n\treturn perm;\n}\n\nfunction permutation_parity(A)\n{\n\tlet n = A.length;\n\tlet parity = 0;\n\tfor (let i = 0; i < n-1; i++)\n\t{\n\t\tfor (let j = i; j < n; j++)\n\t\t{\n\t\t\tif (A[i] > A[j]) parity ^= 1;\n\t\t}\n\t}\n\treturn parity;\n}\n\nfunction index_to_evenpermutation(ind, n)\n{\n\tlet perm = [];\n\tlet f = factorial(n-1) / 2;\n\tlet parity = 0;\n\tfor (let i = 0; i < n-1; i++)\n\t{\n\t\tperm[i] = (ind / f) | 0;\n\t\tind %= f;\n\t\tf /= n-1-i;\n\t}\n\tperm[n-1] = 0;\n\tfor (let i = n-2; i >= 0; i--)\n\t{\n\t\tfor (let j = i+1; j < n; j++)\n\t\t{\n\t\t\tif (perm[j] >= perm[i]) perm[j]++;\n\t\t\telse parity ^= 1;\n\t\t}\n\t}\n\tif (parity === 1) [perm[n-2], perm[n-1]] = [perm[n-1], perm[n-2]];\n\treturn perm;\n}\n\nfunction evenpermutation_to_index(perm)\n{\n\treturn permutation_to_index(perm) >> 1;\n}\n\nlet [evenpermutation8_to_index, index_to_evenpermutation8] = (() => {\n\nlet index_in_set_bits = new Int8Array(256 * 8);\nlet look_up_set_bits = new Int8Array(256 * 8);\nfor (let i = 0; i < 256; i++)\n{\n\tfor (let j = 0, counter = 0; j < 8; j++)\n\t{\n\t\tif (((i >>> j) & 1) === 0) {continue;}\n\t\tindex_in_set_bits[(j << 8) | i] = counter;\n\t\tlook_up_set_bits[(counter << 8) | i] = j;\n\t\tcounter++;\n\t}\n}\n\nfunction evenpermutation8_to_index(perm)\n{\n\tlet unused = 0xff; // track which values in 0..7 haven't been used so far\n\tlet f = 2520; // = 7!/2\n\tlet ind = 0;\n\tfor (let i = 0; i < 6; i++)\n\t{\n\t\tlet v = perm[i];\n\t\tind += index_in_set_bits[unused | (v << 8)] * f;\n\t\tunused &= ~(1 << v);\n\t\tf /= 7-i;\n\t}\n\treturn ind;\n}\n\n// note: this is *not* a drop-in replacement for index_to_evenpermutation!\nfunction index_to_evenpermutation8(ind, perm)\n{\n\tlet unused = 0xff;\n\tlet f = 2520; // = 7!/2\n\tlet parity = 0;\n\tfor (let i = 0; i < 6; i++)\n\t{\n\t\tlet a = (ind / f) | 0;\n\t\tind -= a * f;\n\t\tparity ^= (a & 1);\n\t\tlet v = look_up_set_bits[unused | (a << 8)];\n\t\tperm[i] = v;\n\t\tunused &= ~(1 << v);\n\t\tf /= 7-i;\n\t}\n\t// the last two elements are uniquely determined by the others\n\tperm[6] = look_up_set_bits[unused | (parity << 8)];\n\tperm[7] = look_up_set_bits[unused | ((parity^1) << 8)];\n\treturn perm;\n}\n\nreturn [evenpermutation8_to_index, index_to_evenpermutation8];\n\n})();\n\nfunction random_permutation(n)\n{\n\tlet p = [0];\n\tfor (let i = 1; i < n; i++)\n\t{\n\t\tlet r = rng.next(i + 1);\n\t\tp[i] = p[r];\n\t\tp[r] = i;\n\t}\n\treturn p;\n}\n\nfunction random_even_permutation(n)\n{\n\tlet p = random_permutation(n);\n\tif (permutation_parity(p) === 1) {[p[0], p[1]] = [p[1], p[0]];}\n\treturn p;\n}\n\nfunction comb_to_index(l)\n{\n\tlet bits = l.length;\n\tlet ones = 0;\n\tfor (let i = 0; i < bits; i++) ones += +(l[i] === 1);\n\tlet zeros = bits - ones;\n\tif (zeros === 0 || ones === 0 || bits === 1) return 0;\n\tlet b = C(bits-1, ones);\n\tlet ind = 0;\n\tfor (let i = 0; zeros > 0 && ones > 0 && bits > 1; i++)\n\t{\n\t\tbits--;\n\t\tif (l[i] === 0)\n\t\t{\n\t\t\tb = b * --zeros / bits;\n\t\t}\n\t\telse // l[i] === 1\n\t\t{\n\t\t\tind += b;\n\t\t\tb = b * ones-- / bits;\n\t\t}\n\t}\n\treturn ind;\n}\n\nfunction index_to_comb(ind, ones, bits)\n{\n\tlet zeros = bits - ones;\n\tlet b = C(bits-1 , ones);\n\tlet l = [];\n\tlet n = bits-1;\n\tfor (let i = 0; i < n; i++)\n\t{\n\t\tbits--;\n\t\tif (ind < b)\n\t\t{\n\t\t\tl.push(0);\n\t\t\tb = b * --zeros / bits;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tl.push(1);\n\t\t\tind -= b;\n\t\t\tb = b * ones-- / bits;\n\t\t}\n\t}\n\tl.push(ones);\n\treturn l;\n}\n\n// this is \"incorrect\" for n=0 but that's out of scope\nfunction ctz(n)\n{\n\tn |= 0;\n\treturn 31 - Math.clz32(n ^ (n-1));\n}\n\nlet comb_lookup_tables = {};\nfunction generate_comb_lookup_tables(n, k)\n{\n\t// 2 <= n <= 28, 0 <= k <= n\n\tn |= 0;\n\tk |= 0;\n\tlet key = n + ' ' + k;\n\tif (comb_lookup_tables[key]) {return comb_lookup_tables[key];}\n\tlet total = C(n, k);\n\tlet index_to_comb_table = new Uint32Array(total);\n\tlet comb_to_index_table = new Uint32Array(1 << n).fill(-1);\n\tfor (let i = 0, c = (1 << k)-1; i < total; i++)\n\t{\n\t\tindex_to_comb_table[i] = c;\n\t\tcomb_to_index_table[c] = i;\n\t\tlet t = c | (c-1);\n\t\tc = (t + 1) | (((~t & -~t) - 1) >> (ctz(c) + 1));\n\t}\n\treturn comb_lookup_tables[key] = [index_to_comb_table, comb_to_index_table];\n}\n\nfunction popcount(n)\n{\n\tn |= 0;\n\tlet c = 0;\n\twhile (n !== 0)\n\t{\n\t\tn &= n-1;\n\t\tc++;\n\t}\n\treturn c;\n}\n\nfunction spread_bits(n)\n{\n\tn &= 0xffff;\n\tn = (n | (n << 8)) & 0x00ff00ff;\n\tn = (n | (n << 4)) & 0x0f0f0f0f;\n\tn = (n | (n << 2)) & 0x33333333;\n\tn = (n | (n << 1)) & 0x55555555;\n\treturn n;\n}\n\nfunction interleave_bits(x, y)\n{\n\treturn spread_bits(x) | (spread_bits(y) << 1);\n}\n\nlet comb4_lookup_tables = {};\nfunction generate_comb4_lookup_tables(n, k0, k1, k2, k3)\n{\n\t// 3 <= n <= 14\n\t// 0 <= k0,k1,k2,k3 <= n\n\t// n = k0 + k1 + k2 + k3\n\t// WARNING: This does not return the combinations in sorted order.\n\t// (but if only two of k0,k1,k2,k3 are nonzero, then they will be sorted)\n\tn |= 0;\n\tk0 |= 0;\n\tk1 |= 0;\n\tk2 |= 0;\n\tk3 |= 0;\n\tif (n !== k0 + k1 + k2 + k3) {throw 'generate_comb4_lookup_tables: invalid parameters';}\n\tlet key = [n, k0, k1, k2, k3].join(' ');\n\tif (comb4_lookup_tables[key]) {return comb4_lookup_tables[key];}\n\tlet [itcl, ctil] = generate_comb_lookup_tables(n, k1+k3);\n\tlet [itch, ctih] = generate_comb_lookup_tables(n, k2+k3);\n\tlet total = C4(n, k0, k1, k2, k3);\n\tlet index_to_comb4_table = new Uint32Array(total);\n\tlet comb4_to_index_table = new Uint32Array(4**n).fill(-1);\n\tfor (let i = 0, index = 0; i < itch.length; i++)\n\t{\n\t\tlet ch = itch[i];\n\t\tfor (let j = 0; j < itcl.length; j++)\n\t\t{\n\t\t\tlet cl = itcl[j];\n\t\t\tif (popcount(cl & ch) === k3)\n\t\t\t{\n\t\t\t\tlet c = interleave_bits(cl, ch);\n\t\t\t\tindex_to_comb4_table[index] = c;\n\t\t\t\tcomb4_to_index_table[c] = index;\n\t\t\t\tindex++;\n\t\t\t}\n\t\t}\n\t}\n\treturn comb4_lookup_tables[key] = [index_to_comb4_table, comb4_to_index_table];\n}\n\nfunction compose(A, B)\n{\n\tlet C = [];\n\tfor (let i = 0; i < B.length; i++) C[i] = A[B[i]];\n\treturn C;\n}\n\nfunction compose3(A, B, C)\n{\n\tlet D = [];\n\tfor (let i = 0; i < C.length; i++) D[i] = A[B[C[i]]];\n\treturn D;\n}\n\nfunction compose_o(A, B)\n{\n\tlet p = compose(A[0], B[0]);\n\tlet o = [];\n\tlet n = B[0].length;\n\tfor (let i = 0; i < n; i++)\n\t{\n\t\to[i] = (A[1][B[0][i]] ^ B[1][i]);\n\t}\n\treturn [p, o];\n}\n\n/*\nfunction permutation_from_cycle(cycle, n)\n{\n\tlet perm = [];\n\tfor (let i = 0; i < n; i++) {perm[i] = i};\n\tfor (let i = 0; i < cycle.length; i++)\n\t{\n\t\tperm[cycle[i]] = cycle[(i + 1) % cycle.length];\n\t}\n\treturn perm;\n}\n*/\n\nfunction permutation_from_cycles(cycles, n)\n{\n\tlet perm = [];\n\tfor (let i = 0; i < n; i++) {perm[i] = i;}\n\tfor (let cycle of cycles)\n\t{\n\t\tfor (let i = 0; i < cycle.length; i++)\n\t\t{\n\t\t\tperm[cycle[i]] = cycle[(i + 1) % cycle.length];\n\t\t}\n\t}\n\treturn perm;\n}\n\nfunction reduce_permutation(perm, keep)\n{\n\t// perm: a permutation\n\t// keep: array of booleans, of the same length as perm\n\tlet n = perm.length;\n\tlet count = Array(n).fill(0);\n\tfor (let i = 1; i < n; i++) {count[i] = count[i-1] + keep[i-1];}\n\tlet nn = count[n-1] + keep[n-1];\n\tlet reduced = Array(nn);\n\tfor (let i = 0; i < n; i++)\n\t{\n\t\tif (keep[i]) {reduced[count[i]] = count[perm[i]];}\n\t}\n\treturn reduced;\n}\n\nfunction invert_permutation(perm)\n{\n\tlet n = perm.length;\n\tlet inverse = Array(n);\n\tfor (let i = 0; i < n; i++) {inverse[perm[i]] = i;}\n\treturn inverse;\n}\n\nfunction gcd(a, b)\n{\n\twhile (a && b) {[a, b] = [b % a, a];}\n\treturn Math.abs(a + b);\n}\n\nfunction lcm(a, b)\n{\n\treturn a*b / gcd(a, b);\n}\n\nfunction permutation_order(perm)\n{\n\tlet order = 1;\n\tlet n = perm.length;\n\tlet visited = Array(n).fill(false);\n\tlet i = -1;\n\twhile (true)\n\t{\n\t\ti = visited.indexOf(false, i+1);\n\t\tif (i === -1) {break;}\n\t\tlet cycle_length = 0;\n\t\tlet j = i;\n\t\twhile (!visited[j])\n\t\t{\n\t\t\tvisited[j] = true;\n\t\t\tj = perm[j];\n\t\t\tcycle_length++;\n\t\t}\n\t\t//console.log(cycle_length);\n\t\torder = lcm(order, cycle_length);\n\t}\n\treturn order;\n}\n\n/*\nFacelet layout:\n\t\t\t\tU\t\t\t\t\t\t\t\t\tB\n\t\t8\t7\t6\t5\t4\t\t\t\t\t67\t68\t69\t70\t71\n\t44\t\t3\t2\t1\t\t49\t\t\t22\t\t64\t65\t66\t\t35\n\t43\t39\t\t0\t\t46\t50\t\t\t23\t19\t\t63\t\t30\t34\nL\t42\t38\t36\t\t45\t47\t51\tR\tBR\t24\t20\t18\t\t27\t29\t33\tBL\n\t41\t37\t\t9\t\t48\t52\t\t\t25\t21\t\t54\t\t28\t32\n\t40\t\t10\t11\t12\t\t53\t\t\t26\t\t57\t56\t55\t\t31\n\t\t13\t14\t15\t16\t17\t\t\t\t\t62\t61\t60\t59\t58\n\t\t\t\tF\t\t\t\t\t\t\t\t\tD\n\nWe'll be using the facelet permutations as the underlying representation. This specific labelling\ngives us three symmetries that can be written very compactly, and this turns out to be enough to\ngenerate any face move from any other face move.\n\nWhich is nice, because I don't have an FTO and it would be very error prone if I were to write out\nevery move individually.\n\nX = T2\nY = Ro Lo' (I think)\nZ = mirroring so that U swaps with L and F swaps with R\n\nFaces / colours (Lanlan colour scheme):\n0: U (white)\n1: F (red)\n2: BR (grey)\n3: BL (orange)\n4: L (purple)\n5: R (green)\n6: D (yellow)\n7: B (blue)\n*/\n\nlet solved_state = Array(72).fill().map((_, i) => (i/9)|0);\n\nlet move_U = permutation_from_cycles([[0,4,8],[1,6,3],[2,5,7],[9,22,35],[45,67,44],[47,68,43],[46,69,39],[50,70,38],[49,71,36]], 72);\nlet move_Ui = compose(move_U, move_U);\n\nlet move_X = Array(72).fill().map((_, i) => ((i/18)|0)*18 + (i+9)%18);\nlet move_Y = Array(72).fill().map((_, i) => ((i/36)|0)*36 + (i+18)%36);\nlet move_Z = Array(72).fill().map((_, i) => (i+36)%72);\n\n// Z changes sign, so this is really setting up to U' rather than U\nlet move_L = compose3(move_Z, move_Ui, move_Z);\nlet move_F = compose3(move_X, move_U, move_X);\nlet move_R = compose3(move_X, move_L, move_X);\n\n//let move_BR = compose3(move_Y, move_U, move_Y);\n//let move_BL = compose3(move_Y, move_F, move_Y);\n//let move_B = compose3(move_Y, move_R, move_Y);\n//let move_D = compose3(move_Y, move_L, move_Y);\n\nlet move_Us = permutation_from_cycles([[10,24,30],[11,23,34],[12,19,33],[42,48,64],[41,52,65],[37,51,66]], 72);\nlet move_Uw = compose(move_U, move_Us);\nlet move_Uwi = compose(move_Uw, move_Uw);\n\nlet move_Lw = compose3(move_Z, move_Uwi, move_Z);\nlet move_Fw = compose3(move_X, move_Uw, move_X);\nlet move_Rw = compose3(move_X, move_Lw, move_X);\n\nlet colour_map = Array(72).fill().map((_, i) => (i/9)|0);\n\nlet corner_piece_facelets = [\n[0, 45, 9, 36], // U-F\n[4, 67, 22, 49], // U-BR\n[8, 44, 35, 71], // U-BL\n[13, 58, 31, 40], // F-BL\n[17, 53, 26, 62], // F-BR\n[18, 63, 27, 54], // BR-BL\n];\n\nlet edge_piece_facelets = [\n[1, 46], // U-R\n[3, 39], // U-L\n[6, 69], // U-B\n[10, 37], // F-L\n[33, 42], // BL-L\n[12, 48], // F-R *\n[15, 60], // F-D *\n[24, 51], // BR-R *\n[19, 64], // BR-B **\n[28, 55], // BL-D **\n[30, 66], // BL-B **\n[21, 57], // BR-D **\n];\n\nlet centreA_piece_facelets = Array(12).fill().map((_, i) => ((i/3)|0)*9 + [2,5,7][i%3]);\nlet centreB_piece_facelets = centreA_piece_facelets.map(x => x + 36);\n\n/*\nfacelet definition sanity test:\nall corner facelets are 0,4,8 mod 9; facelet order is always in U,R,U,R orbits\nall edge facelets are 1,3,6 mod 9; facelet order is always in U,R orbits\nall centre facelets are 2,5,7 mod 9\n\nfunction facelet_sanity_test()\n{\nif (corner_piece_facelets.length !== 6) {console.log('wrong number of corner pieces'); return;}\nif (edge_piece_facelets.length !== 12) {console.log('wrong number of edge pieces'); return;}\nif (!corner_piece_facelets.every(x => {return x.every(y => y % 9 % 4 === 0) && x[0] < 36 && x[2] < 36 && x[1] >= 36 && x[3] >= 36;}))\n{\n\tconsole.log('corner pieces weird');\n\treturn;\n}\nif (!edge_piece_facelets.every(x => {return x.every(y => [1,3,6].indexOf(y % 9) !== -1) && x[0] < 36 && x[1] >= 36;}))\n{\n\tconsole.log('edge pieces weird');\n\treturn;\n}\n}\n\n*/\n\nfunction identify_corner_piece(colourA, colourB)\n{\n\t// return a 2-tuple [p, o] where\n\t// p in {0,1,2,3,4,5} is the corner piece's ID and\n\t// o in {0,1} is its orientation\n\tfor (let i = 0; i < 6; i++)\n\t{\n\t\tif (colourA === colour_map[corner_piece_facelets[i][0]] && colourB === colour_map[corner_piece_facelets[i][2]])\n\t\t{\n\t\t\treturn [i, 0];\n\t\t}\n\t\telse if (colourA === colour_map[corner_piece_facelets[i][2]] && colourB === colour_map[corner_piece_facelets[i][0]])\n\t\t{\n\t\t\treturn [i, 1];\n\t\t}\n\t}\n\tthrow 'unknown corner piece';\n}\n\nfunction identify_edge_piece(colourA, colourB)\n{\n\t// return p in {0..11} the edge piece's ID\n\t// (edges are not flippable on the FTO)\n\tfor (let i = 0; i < 12; i++)\n\t{\n\t\tif (colourA === colour_map[edge_piece_facelets[i][0]] && colourB === colour_map[edge_piece_facelets[i][1]])\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t\tif (colourB === colour_map[edge_piece_facelets[i][0]] && colourA === colour_map[edge_piece_facelets[i][1]])\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\tthrow 'unknown edge piece';\n}\n\nfunction get_corner_piece(facelets, location)\n{\n\treturn identify_corner_piece(facelets[corner_piece_facelets[location][0]], facelets[corner_piece_facelets[location][2]]);\n}\n\nfunction get_edge_piece(facelets, location)\n{\n\treturn identify_edge_piece(facelets[edge_piece_facelets[location][0]], facelets[edge_piece_facelets[location][1]]);\n}\n\nfunction set_corner_piece(facelets, location, value, orientation)\n{\n\tlet indices = corner_piece_facelets[location];\n\tlet colours = corner_piece_facelets[value].map(x => colour_map[x]);\n\tif (orientation % 2 !== 0) {colours = [colours[2], colours[3], colours[0], colours[1]];}\n\tfor (let i = 0; i < 4; i++)\n\t{\n\t\tfacelets[indices[i]] = colours[i];\n\t}\n}\n\nfunction set_edge_piece(facelets, location, value)\n{\n\tlet indices = edge_piece_facelets[location];\n\tlet colours = edge_piece_facelets[value].map(x => colour_map[x]);\n\tfor (let i = 0; i < 2; i++)\n\t{\n\t\tfacelets[indices[i]] = colours[i];\n\t}\n}\n\nfunction convert_move_to_permutations(move)\n{\n\tlet state = move.map(x => colour_map[x]);\n\t//console.log(state);\n\tlet cp_raw = Array(6).fill().map((_,i) => get_corner_piece(state, i));\n\tlet cp_half = cp_raw.map(([p, o]) => p + 6*o);\n\tlet cp = cp_half.concat(cp_half.map(x => (x+6)%12));\n\tlet ep = Array(12).fill().map((_,i) => get_edge_piece(state, i));\n\tlet ap = Array(12).fill().map((_,i) => centreA_piece_facelets.indexOf(move[centreA_piece_facelets[i]]));\n\tlet bp = Array(12).fill().map((_,i) => centreB_piece_facelets.indexOf(move[centreB_piece_facelets[i]]));\n\treturn {cp: cp, ep: ep, ap: ap, bp: bp};\n}\n\nlet moves = [move_U, move_L, move_F, move_R, move_Uw, move_Lw, move_Fw, move_Rw];\nlet move_names = ['U', 'L', 'F', 'R', 'u', 'l', 'f', 'r'];\n\nlet move_permutations = moves.map(convert_move_to_permutations);\n\n/*\nlet commute_table = (function () {\n\tlet n = moves.length;\n\tlet t = Array(n);\n\tfor (let i = 0; i < n; i++)\n\t{\n\t\tt[i] = Array(n);\n\t\tfor (let j = 0; j < n; j++)\n\t\t{\n\t\t\tlet a = compose(moves[i], moves[j]);\n\t\t\tlet b = compose(moves[j], moves[i]);\n\t\t\tt[i][j] = (a.join(' ') === b.join(' '));\n\t\t}\n\t}\n\treturn t;\n})();\n*/\n\n// generate a random state with the BR-BL corner solved\nfunction random_state()\n{\n\tlet facelets = Array(72);\n\tlet cp = random_even_permutation(5);\n\tcp.push(5);\n\tlet co = Array(4).fill().map(_ => rng.next(2));\n\tco.push(co.reduce((x, y) => x^y));\n\tco.push(0);\n\tfor (let i = 0; i < 6; i++)\n\t{\n\t\tset_corner_piece(facelets, i, cp[i], co[i]);\n\t}\n\n\tlet ep = random_even_permutation(12);\n\tfor (let i = 0; i < 12; i++)\n\t{\n\t\tset_edge_piece(facelets, i, ep[i]);\n\t}\n\n\tlet a = random_permutation(12).map(x => (x/3)|0);\n\tlet b = random_permutation(12).map(x => 4+((x/3)|0));\n\tfor (let i = 0; i < 12; i++)\n\t{\n\t\tfacelets[centreA_piece_facelets[i]] = a[i];\n\t\tfacelets[centreB_piece_facelets[i]] = b[i];\n\t}\n\treturn facelets;\n}\n\nfunction stringify_move_sequence(move_sequence, no_wide=false)\n{\n\tif (no_wide)\n\t{\n\t\tconst U = 0, L = 1, F = 2, R = 3, D = 4, BR = 5, B = 6, BL = 7;\n\t\tmove_sequence = move_sequence.map(x => x.slice());\n\t\tlet ordering = [U,L,F,R,D,BR,B,BL];\n\t\tlet rotations = [[U,R,BR,B,D,BL,L,F],[BL,L,U,B,R,BR,D,F],[BL,D,F,L,R,U,B,BR],[F,D,BR,R,B,U,L,BL]];\n\t\trotations = rotations.concat(rotations.map(p => invert_permutation(p)));\n\t\tfor (let i = 0; i < move_sequence.length; i++)\n\t\t{\n\t\t\tif (move_sequence[i][0] < 4)\n\t\t\t{\n\t\t\t\t// it's already a single-layer turn\n\t\t\t\tmove_sequence[i][0] = ordering[move_sequence[i][0]];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// it's a double-layer turn and we need to Do Stuff\n\t\t\t\tlet m = ordering[move_sequence[i][0]];\n\t\t\t\tlet r = move_sequence[i][1];\n\t\t\t\tmove_sequence[i][0] = m;\n\t\t\t\tordering = compose(r === 1 ? rotations[m ^ 4] : rotations[m], ordering);\n\t\t\t\t//console.log(ordering);\n\t\t\t}\n\t\t}\n\t}\n\tlet names = no_wide ? 'U L F R D BR B BL'.split(' ') : move_names; // WARNING: this ordering is _not_ the same as the facelet colours\n\tlet suffixes = [\"0\", \"\", \"'\"];\n\tlet s = move_sequence.map(([m, r]) => (names[m] + suffixes[r]));\n\treturn s.join(' ');\n}\n\nfunction print_move_sequence(move_sequence)\n{\n\tconsole.log(stringify_move_sequence(move_sequence));\n}\n\nfunction apply_move_sequence(state, move_sequence)\n{\n\tfor (let [m, r] of move_sequence)\n\t{\n\t\tfor (let i = 0; i < r; i++)\n\t\t{\n\t\t\tstate = compose(state, moves[m]);\n\t\t}\n\t}\n\treturn state;\n}\n\nfunction invert_move_sequence(move_sequence)\n{\n\treturn move_sequence.map(([m, r]) => [m, (3-r)%3]).reverse();\n}\n\nfunction simplify_move_sequence(move_sequence, make_noise=false)\n{\n\tif (move_sequence.length === 0) {return [];}\n\tlet simplified = [];\n\tlet last_move = undefined;\n\tfor (let [m, r] of move_sequence)\n\t{\n\t\tif (last_move && last_move[0] === m)\n\t\t{\n\t\t\t// turn of the same face\n\t\t\tlast_move[1] += r;\n\t\t\tlast_move[1] %= 3;\n\t\t\tif (last_move[1] === 0)\n\t\t\t{\n\t\t\t\tsimplified.pop();\n\t\t\t\tlast_move = simplified.length === 0 ? undefined : simplified[simplified.length-1];\n\t\t\t}\n\t\t}\n\t\telse if (simplified.length >= 2 && (last_move[0] ^ m) === 4 && simplified[simplified.length-2][0] === m)\n\t\t{\n\t\t\t// turn of the opposite face\n\t\t\tsimplified[simplified.length-2][1] += r;\n\t\t\tsimplified[simplified.length-2][1] %= 3;\n\t\t\tif (simplified[simplified.length-2][1] === 0)\n\t\t\t{\n\t\t\t\tsimplified.splice(simplified.length-2, 1);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlast_move = [m, r];\n\t\t\tsimplified.push(last_move);\n\t\t}\n\t}\n\tif (make_noise && ''+move_sequence !== ''+simplified)\n\t{\n\t\tconsole.log(`simplified ${move_sequence} to ${simplified}`);\n\t}\n\treturn simplified;\n}\n\nfunction generate_random_state_scramble()\n{\n\treturn stringify_move_sequence(invert_move_sequence(solve(random_state(), true)), true);\n}\n\nfunction generate_multiple_random_state_scrambles(n)\n{\n\tlet scrambles = [];\n\tfor (let i = 0; i < n; i++)\n\t{\n\t\tscrambles[i] = generate_random_state_scramble();\n\t}\n\treturn scrambles;\n}\n\n/*\nActual solver logic goes here.\n\nUnlike most of the earlier random-state scramblers I've written before, this one comes with a slight\ncomplication: the FTO's states are _not_ a group. In other words, we can't skip inverting the\nsolution to get the scramble. Not a big deal.\n\nWe assume the D-BR-B-BL corner is solved. (If not, rotate puzzle accordingly.)\n\nPhase 1: Solve a small pyramid around the D-BR-B-BL corner.\n- centres #6, #9 in orbit A and #6, #9 in orbit B\n- edges #8, #9, #10, #11\nReduction: (132/9)**2 * (12*11*10*9) = 2555520\n\nPhase 2: Reduce to LU 2-gen.\n- remaining BR, D centres, one each of F, R centres (#5, #7, #8 in each orbit)\n- edges F-R, F-D, R-BR (#5, #6, #7)\n- corner F-BR (#4)\n- corner orientation constraint on the other four corners\nReduction: 120**2 * (8*7*6) * 10 * 4 = 193536000\n\nPhase 3: Finish solve.\n- remaining centres (#0..#4, #10, #11 in each orbit)\n- edges #0..#4\n- corners #0..#3\nReduction: 210**2 * (5!/2) * (4!/2*2) = 63504000\n\n\n*/\n\nfunction generate_mtable_comb_generic(n, k, permutations)\n{\n\tlet N = C(n, k);\n\tlet nmoves = permutations.length;\n\tlet [itc, cti] = generate_comb_lookup_tables(n, k);\n\tlet mtable = Array(nmoves).fill().map(() => new Uint32Array(N));\n\tfor (let i = 0; i < N; i++)\n\t{\n\t\tlet c = itc[i];\n\t\tlet arr = Array(n);\n\t\tfor (let j = 0; j < n; j++) {arr[j] = ((c >> j) & 1);}\n\t\tfor (let m = 0; m < nmoves; m++)\n\t\t{\n\t\t\tlet arr2 = compose(arr, permutations[m]);\n\t\t\tlet c2 = arr2.reduce((acc, x, j) => acc | (x << j), 0);\n\t\t\tmtable[m][i] = cti[c2];\n\t\t}\n\t}\n\treturn mtable;\n}\n\nfunction generate_mtable_comb4_generic(n, k0, k1, k2, k3, permutations)\n{\n\tlet N = C4(n, k0, k1, k2, k3);\n\tlet nmoves = permutations.length;\n\tlet [itc, cti] = generate_comb4_lookup_tables(n, k0, k1, k2, k3);\n\tlet mtable = Array(nmoves).fill().map(() => new Uint32Array(N));\n\tfor (let i = 0; i < N; i++)\n\t{\n\t\tlet c = itc[i];\n\t\tlet arr = Array(n);\n\t\tfor (let j = 0; j < n; j++) {arr[j] = ((c >> (2*j)) & 3);}\n\t\tfor (let m = 0; m < nmoves; m++)\n\t\t{\n\t\t\tlet arr2 = compose(arr, permutations[m]);\n\t\t\tlet c2 = arr2.reduce((acc, x, j) => acc | (x << (2*j)), 0);\n\t\t\tmtable[m][i] = cti[c2];\n\t\t}\n\t}\n\treturn mtable;\n}\n\nfunction generate_mtable_single_generic(permutations)\n{\n\tlet n = permutations[0].length;\n\tlet nmoves = permutations.length;\n\tlet mtable = Array(nmoves).fill().map(() => new Uint32Array(n));\n\tfor (let i = 0; i < n; i++)\n\t{\n\t\tfor (let m = 0; m < nmoves; m++)\n\t\t{\n\t\t\tmtable[m][permutations[m][i]] = i;\n\t\t\t// we're using right-action convention here,\n\t\t\t// so we use the *inverse* of the permutation\n\t\t\t// to track how pieces move.\n\t\t}\n\t}\n\treturn mtable;\n}\n\nfunction combine_mtables(mtable0, mtable1)\n{\n\tlet n0 = mtable0[0].length;\n\tlet n1 = mtable1[0].length;\n\tlet nmoves = mtable0.length;\n\tlet combined = Array(nmoves).fill().map(() => new Uint32Array(n0*n1));\n\tfor (let j = 0; j < n1; j++)\n\t{\n\t\tfor (let i = 0; i < n0; i++)\n\t\t{\n\t\t\tlet index = i + n0*j;\n\t\t\tfor (let m = 0; m < nmoves; m++)\n\t\t\t{\n\t\t\t\tcombined[m][index] = mtable0[m][i] + n0*mtable1[m][j];\n\t\t\t}\n\t\t}\n\t}\n\treturn combined;\n}\n\nfunction trim_unreachable(mtable, origin)\n{\n\t// input: mtable\n\t// output: [trimmed mtable, map]\n\tlet nmoves = mtable.length;\n\tlet n = mtable[0].length;\n\tlet reachable = new Uint8Array(n);\n\treachable[origin] = 1;\n\tlet done = false;\n\twhile (!done)\n\t{\n\t\tdone = true;\n\t\tfor (let i = 0; i < n; i++)\n\t\t{\n\t\t\tif (!reachable[i]) {continue;}\n\t\t\tfor (let m = 0; m < nmoves; m++)\n\t\t\t{\n\t\t\t\tif (!reachable[mtable[m][i]])\n\t\t\t\t{\n\t\t\t\t\treachable[mtable[m][i]] = 1;\n\t\t\t\t\tdone = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tlet map = new Int32Array(n).fill(-1);\n\tfor (let i = 0, counter = 0; i < n; i++)\n\t{\n\t\tif (!reachable[i]) {continue;}\n\t\tmap[i] = counter;\n\t\tcounter++;\n\t}\n\treturn [mtable.map(entry => reduce_permutation(entry, reachable)), map];\n}\n\nfunction reduce_to_quotient(mtable, origins)\n{\n\tlet nmoves = mtable.length;\n\tlet n = mtable[0].length;\n\tlet quotient_map = new Int32Array(n).fill(-1);\n\torigins.forEach(x => {quotient_map[x] = 0;});\n\tlet preimages = [origins];\n\tfor (let image = 0; image < preimages.length; image++)\n\t{\n\t\tlet equiv_class = preimages[image];\n\t\tfor (let m = 0; m < nmoves; m++)\n\t\t{\n\t\t\tlet j = mtable[m][equiv_class[0]];\n\t\t\tif (quotient_map[j] !== -1) {continue;} // already looked at those nodes\n\t\t\tlet new_equiv_class = equiv_class.map(x => mtable[m][x]);\n\t\t\tlet new_image = preimages.length;\n\t\t\tpreimages.push(new_equiv_class);\n\t\t\tfor (let x of new_equiv_class)\n\t\t\t{\n\t\t\t\tif (quotient_map[x] !== -1)\n\t\t\t\t{\n\t\t\t\t\tthrow 'quotienting failed';\n\t\t\t\t}\n\t\t\t\tquotient_map[x] = new_image;\n\t\t\t}\n\t\t}\n\t}\n\tlet n_quot = preimages.length;\n\tlet mtable_quot = Array(nmoves).fill().map(() => new Int32Array(n_quot));\n\tfor (let m = 0; m < nmoves; m++)\n\t{\n\t\tfor (let i = 0; i < n_quot; i++)\n\t\t{\n\t\t\tmtable_quot[m][i] = quotient_map[mtable[m][preimages[i][0]]];\n\t\t}\n\t}\n\treturn [mtable_quot, quotient_map];\n}\n\nfunction generate_mirrored_coordinate_table(mtable, a, b)\n{\n\tlet n = mtable[0].length;\n\tlet nmoves = mtable.length;\n\tlet mirror_map = new Int32Array(n).fill(-1);\n\tmirror_map[a] = b;\n\tmirror_map[b] = a;\n\tlet done = false;\n\twhile (!done)\n\t{\n\t\tdone = true;\n\t\tfor (let i = 0; i < n; i++)\n\t\t{\n\t\t\tif (mirror_map[i] === -1) {continue;}\n\t\t\tlet I = mirror_map[i];\n\t\t\tfor (let m = 0; m < nmoves; m++)\n\t\t\t{\n\t\t\t\tlet M = m^1;\n\t\t\t\tlet new_i = mtable[m][i];\n\t\t\t\tlet new_I = mtable[M][mtable[M][I]];\n\t\t\t\t// convert moves according to this table:\n\t\t\t\t// U -> L2\n\t\t\t\t// L -> U2\n\t\t\t\t// F -> R2\n\t\t\t\t// R -> F2\n\t\t\t\tif (mirror_map[new_i] === -1)\n\t\t\t\t{\n\t\t\t\t\tdone = false;\n\t\t\t\t\tmirror_map[new_i] = new_I;\n\t\t\t\t\tmirror_map[new_I] = new_i;\n\t\t\t\t}\n\t\t\t\telse if (mirror_map[new_i] !== new_I)\n\t\t\t\t{\n\t\t\t\t\tthrow 'mirroring failed - is the initial map correct?';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn mirror_map;\n}\n\nfunction bfs(mtable, goal_states)\n{\n\tlet N = mtable[0].length;\n\tlet nmoves = mtable.length;\n\tlet ptable = new Int8Array(N).fill(-1);\n\tfor (let state of goal_states) {ptable[state] = 0;}\n\tlet depth = 0;\n\tlet done = false;\n\twhile (!done)\n\t{\n\t\tdone = true;\n\t\tfor (let state = 0; state < N; state++)\n\t\t{\n\t\t\tif (ptable[state] !== depth) {continue;}\n\t\t\tfor (let move_index = 0; move_index < nmoves; move_index++)\n\t\t\t{\n\t\t\t\tlet new_state = mtable[move_index][state];\n\t\t\t\twhile (new_state !== state)\n\t\t\t\t{\n\t\t\t\t\tif (ptable[new_state] === -1)\n\t\t\t\t\t{\n\t\t\t\t\t\tdone = false;\n\t\t\t\t\t\tptable[new_state] = depth + 1;\n\t\t\t\t\t}\n\t\t\t\t\tnew_state = mtable[move_index][new_state];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdepth++;\n\t}\n\treturn ptable;\n}\n\nfunction* ida_solve_gen(indices, mtables, ptables, moves_left, commute)\n{\n\tlet ncoords = indices.length;\n\tlet bound = 0;\n\tfor (let i = 0; i < ncoords; i++) bound = Math.max(bound, ptables[i][indices[i]]);\n\twhile (bound <= moves_left)\n\t{\n\t\t//console.log(`searching depth ${bound}`);\n\t\tyield* ida_search_gen(indices, mtables, ptables, bound, -1, commute);\n\t\tbound++;\n\t}\n}\n\nfunction* ida_search_gen(indices, mtables, ptables, bound, last, commute)\n{\n\tlet ncoords = indices.length;\n\tlet nmoves = mtables[0].length;\n\tlet heuristic = 0;\n\tfor (let i = 0; i < ncoords; i++) heuristic = Math.max(heuristic, ptables[i][indices[i]]);\n\tif (heuristic > bound) return;\n\tif (bound === 0)\n\t{\n\t\tyield [];\n\t\treturn;\n\t}\n\tif (heuristic === 0 && bound === 1) return;\n\tfor (let m = 0; m < nmoves; m++)\n\t{\n\t\tif (m === last) continue;\n\t\tif (m < last && commute[m][last]) continue;\n\t\tlet new_indices = indices.slice();\n\t\tfor (let c = 0; c < ncoords; c++) new_indices[c] = mtables[c][m][indices[c]];\n\t\tlet r = 1;\n\t\twhile (indices.some((_, i) => indices[i] != new_indices[i]))\n\t\t{\n\t\t\tlet subpath_gen = ida_search_gen(new_indices, mtables, ptables, bound-1, m, commute);\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tlet {value: subpath, done} = subpath_gen.next();\n\t\t\t\tif (done) break;\n\t\t\t\tyield [[m, r]].concat(subpath);\n\t\t\t}\n\t\t\tfor (let c = 0; c < ncoords; c++)\n\t\t\t{\n\t\t\t\tnew_indices[c] = mtables[c][m][new_indices[c]];\n\t\t\t}\n\t\t\tr++;\n\t\t}\n\t}\n}\n\nfunction solve(facelets, readable=false)\n{\n\tlet phase1sol = solve_phase1_gen(facelets).next().value;\n\tlet facelets2 = apply_move_sequence(facelets, phase1sol);\n\tlet phase2sol = (readable ? solve_phase2_and_phase3_readable : solve_phase2_and_phase3_fast)(facelets2);\n\tlet solution = simplify_move_sequence(phase1sol.concat(phase2sol), false);\n\tif (apply_move_sequence(facelets, solution).join('') !== solved_state.join(''))\n\t{\n\t\tconsole.log('solving failed!');\n\t\tconsole.log(facelets);\n\t\tconsole.log(phase1sol);\n\t\tconsole.log(facelets2);\n\t\tconsole.log(phase2sol);\n\t\tconsole.log(apply_move_sequence(facelets, solution));\n\t}\n\treturn solution;\n}\n\nlet cached_mtables = {};\nlet cached_ptables = {};\n\n/* Phase 1 stuff */\n\nlet phase1_centre_colour_map = [0,0,2,3, 0,0,2,3];\nfunction index_phase1(facelets)\n{\n\tlet [itc, cti] = generate_comb4_lookup_tables(12, 6, 0, 3, 3);\n\tlet ep = Array(12).fill().map((_,i) => get_edge_piece(facelets, i));\n\tlet edge_coord = ep.indexOf(8) + 12*ep.indexOf(9) + 12**2*ep.indexOf(10) + 12**3*ep.indexOf(11);\n\tlet [a_coord, b_coord] = [centreA_piece_facelets, centreB_piece_facelets].map(facelet_indices =>\n\t{\n\t\tlet arr = facelet_indices.map(x => phase1_centre_colour_map[facelets[x]]);\n\t\treturn cti[arr.reduce((acc, x, j) => acc | (x << (2*j)), 0)];\n\t});\n\treturn [edge_coord, a_coord, b_coord];\n}\n\nfunction generate_phase1_edge_mtable()\n{\n\tif (cached_mtables.phase1_edge) {return cached_mtables.phase1_edge;}\n\tlet m1 = generate_mtable_single_generic(move_permutations.map(x => x.ep));\n\tlet m2 = combine_mtables(m1, m1);\n\tlet m4 = combine_mtables(m2, m2);\n\treturn cached_mtables.phase1_edge = m4;\n}\n\nfunction generate_phase1_edge_ptable()\n{\n\tif (cached_ptables.phase1_edge) {return cached_ptables.phase1_edge;}\n\treturn cached_ptables.phase1_edge = bfs(generate_phase1_edge_mtable(), [8 + 12*9 + 12**2*10 + 12**3*11]);\n}\n\nfunction generate_phase1_centreA_mtable()\n{\n\tif (cached_mtables.phase1_centreA) {return cached_mtables.phase1_centreA;}\n\treturn cached_mtables.phase1_centreA = generate_mtable_comb4_generic(12, 6, 0, 3, 3, move_permutations.map(x => x.ap));\n}\n\nfunction generate_phase1_centreB_mtable()\n{\n\tif (cached_mtables.phase1_centreB) {return cached_mtables.phase1_centreB;}\n\treturn cached_mtables.phase1_centreB = generate_mtable_comb4_generic(12, 6, 0, 3, 3, move_permutations.map(x => x.bp));\n}\n\nfunction generate_phase1_centre_ptable()\n{\n\t// the pruning tables for the two centre orbits are identical due to the specific facelet\n\t// labelling we're using.\n\tif (cached_ptables.phase1_centre) {return cached_ptables.phase1_centre;}\n\tlet [itc, cti] = generate_comb4_lookup_tables(12, 6, 0, 3, 3);\n\tlet goal_states = itc.filter(x => {\n\t\tlet x6 = ((x >> 12) & 3);\n\t\tlet x9 = ((x >> 18) & 3);\n\t\treturn x6 === 2 && x9 === 3;\n\t}).map(x => cti[x]);\n\treturn cached_ptables.phase1_centre = bfs(generate_phase1_centreB_mtable(), goal_states);\n}\n\nfunction* solve_phase1_gen(facelets)\n{\n\tlet mtables = [generate_phase1_edge_mtable(), generate_phase1_centreA_mtable(), generate_phase1_centreB_mtable()];\n\tlet ptables = [generate_phase1_edge_ptable(), generate_phase1_centre_ptable(), generate_phase1_centre_ptable()];\n\tyield* phase1_ida_solve_gen(index_phase1(facelets), mtables, ptables, 15);\n}\n\nfunction* phase1_ida_solve_gen(indices, mtables, ptables, moves_left)\n{\n\tlet ncoords = indices.length;\n\tlet bound = 0;\n\tfor (let i = 0; i < ncoords; i++) bound = Math.max(bound, ptables[i][indices[i]]);\n\twhile (bound <= moves_left)\n\t{\n\t\t//console.log(`searching depth ${bound}`);\n\t\tyield* phase1_ida_search_gen(indices, mtables, ptables, bound, -1);\n\t\tbound++;\n\t}\n}\n\nfunction* phase1_ida_search_gen(indices, mtables, ptables, bound, last)\n{\n\tlet ncoords = 3;//indices.length;\n\tlet nmoves = 8;//mtables[0].length;\n\tlet heuristic = Math.max(ptables[0][indices[0]], ptables[1][indices[1]], ptables[2][indices[2]]);//0;\n\t//for (let i = 0; i < ncoords; i++) heuristic = Math.max(heuristic, ptables[i][indices[i]]);\n\tif (heuristic > bound) return;\n\tif (bound === 0)\n\t{\n\t\tyield [];\n\t\treturn;\n\t}\n\tif (heuristic === 0 && bound === 1) return;\n\tfor (let m = 0; m < nmoves; m++)\n\t{\n\t\tif (m === last) continue;\n\t\tif (m === last-4) continue;\n\t\tlet new_indices = [];\n\t\tnew_indices[0] = mtables[0][m][indices[0]];\n\t\tnew_indices[1] = mtables[1][m][indices[1]];\n\t\tnew_indices[2] = mtables[2][m][indices[2]];\n\t\tlet r = 1;\n\t\twhile (indices.some((_, i) => indices[i] != new_indices[i]))\n\t\t{\n\t\t\tlet subpath_gen = phase1_ida_search_gen(new_indices, mtables, ptables, bound-1, m);\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tlet {value: subpath, done} = subpath_gen.next();\n\t\t\t\tif (done) break;\n\t\t\t\tyield [[m, r]].concat(subpath);\n\t\t\t}\n\t\t\tnew_indices[0] = mtables[0][m][new_indices[0]];\n\t\t\tnew_indices[1] = mtables[1][m][new_indices[1]];\n\t\t\tnew_indices[2] = mtables[2][m][new_indices[2]];\n\t\t\tr++;\n\t\t}\n\t}\n}\n\n/* Phase 2 stuff */\n\nlet phase2_centre_colour_map = [0,1,2,0, 0,1,2,0];\n// we don't care about swapping U and BL centres in phase 2\n\nlet phase2_centre_indices = [0,1,2, 3,4,5, 7,8, 10,11]; // 6 and 9 are already solved in phase 1\nlet phase2_keep = [true,true,true, true,true,true, false,true,true, false,true,true];\nlet phase2_corner_keep = [true,true,true,true,true,false, true,true,true,true,true,false];\n\nfunction index_phase2(facelets)\n{\n\tlet [itc, cti] = generate_comb4_lookup_tables(10, 5, 3, 2, 0);\n\tlet ep = Array(8).fill().map((_,i) => get_edge_piece(facelets, i));\n\tlet edge_coord = ep.indexOf(5) + 8*ep.indexOf(6) + 8**2*ep.indexOf(7);\n\tlet corners = Array(5).fill().map((_,i) => get_corner_piece(facelets, i));\n\tlet cp_inverse_full = invert_permutation(corners.map(([p, o]) => p + 5*o).concat(corners.map(([p, o]) => p + 5*(o^1))));\n\tlet cp_inverse = cp_inverse_full.slice(0, 5).map(x => x%5);\n\tlet co_inverse = cp_inverse_full.slice(0, 5).map(x => (x/5)|0);\n\tlet corner_coord = evenpermutation_to_index(cp_inverse)*8 + (co_inverse[0]^co_inverse[2]) + 2*(co_inverse[0]^co_inverse[3]) + 4*co_inverse[4];\n\tlet [a_coord, b_coord] = [centreA_piece_facelets, centreB_piece_facelets].map(facelet_indices =>\n\t{\n\t\tlet arr = compose(facelet_indices, phase2_centre_indices).map(x => phase2_centre_colour_map[facelets[x]]);\n\t\treturn cti[arr.reduce((acc, x, j) => acc | (x << (2*j)), 0)];\n\t});\n\t// we don't need these move tables, but we do need the reduction maps\n\t// that are computed with these (and stored in global vars, yikes)\n\tgenerate_phase2_edge_mtable();\n\tgenerate_phase2_corner_mtable_compact();\n\treturn [a_coord, b_coord, phase2_corner_reduction_map[corner_coord] + 40 * phase2_edge_reduction_map[edge_coord]];\n}\n\nfunction* solve_phase2_gen(facelets)\n{\n\tyield* phase2_ida_solve_gen(index_phase2(facelets), 30);\n}\n\nfunction solve_phase2(facelets)\n{\n\treturn solve_phase2_gen(facelets).next().value;\n}\n\nfunction generate_phase2_centre_mtables()\n{\n\tif (cached_mtables.phase2_centre) {return cached_mtables.phase2_centre;}\n\tlet a = generate_mtable_comb4_generic(10, 5, 3, 2, 0, move_permutations.slice(0, 4).map(x => reduce_permutation(x.ap, phase2_keep)));\n\tlet b = generate_mtable_comb4_generic(10, 5, 3, 2, 0, move_permutations.slice(0, 4).map(x => reduce_permutation(x.bp, phase2_keep)));\n\treturn cached_mtables.phase2_centre = [a, b];\n}\n\nlet phase2_edge_reduction_map;\nfunction generate_phase2_edge_mtable()\n{\n\tif (cached_mtables.phase2_edge) {return cached_mtables.phase2_edge;}\n\tlet e = generate_mtable_single_generic(move_permutations.slice(0, 4).map(x => x.ep.slice(0, 8)));\n\tlet eee = combine_mtables(e, combine_mtables(e, e));\n\tlet eee_trimmed;\n\t[eee_trimmed, phase2_edge_reduction_map] = trim_unreachable(eee, 0o765);\n\treturn cached_mtables.phase2_edge = eee_trimmed;\n}\n\nfunction generate_phase2_corner_mtable()\n{\n\tif (cached_mtables.phase2_corner) {return cached_mtables.phase2_corner;}\n\tconst HALFFACT5 = factorial(5)/2; // = 60\n\tconst N = HALFFACT5 * 8; // = 480\n\tconst keep = [true,true,true,true,true,false, true,true,true,true,true,false];\n\t// ignore the sixth and twelfth entries, which encode corner #5's state\n\tlet mtable = Array(4).fill().map(() => new Uint32Array(N));\n\tlet permutations = move_permutations.slice(0, 4).map(x => invert_permutation(reduce_permutation(x.cp, keep)));\n\t// using the left-action convention here, so take inverses\n\tfor (let i = 0; i < N; i++)\n\t{\n\t\tlet p = index_to_evenpermutation(i >> 3, 5);\n\t\tlet o = [0, 0, i & 1, (i >> 1) & 1, (i >> 2) & 1];\n\t\to[1] = o[2]^o[3]^o[4];\n\t\tlet cp = Array(10);\n\t\tfor (let j = 0; j < 5; j++)\n\t\t{\n\t\t\tcp[j] = p[j] + 5*o[j];\n\t\t\tcp[j+5] = p[j] + 5*(o[j]^1);\n\t\t}\n\t\tfor (let m = 0; m < 4; m++)\n\t\t{\n\t\t\tlet cp2 = compose(permutations[m], cp);\n\t\t\tlet p2 = cp2.slice(0, 5).map(x => x%5);\n\t\t\tlet o2 = cp2.slice(0, 5).map(x => (x/5)|0);\n\t\t\tlet orientation_index = (o2[0]^o2[2]) + 2*(o2[0]^o2[3]) + 4*o2[4];\n\t\t\tmtable[m][i] = evenpermutation_to_index(p2)*8 + orientation_index;\n\t\t}\n\t}\n\treturn cached_mtables.phase2_corner = mtable;\n\t/*\n\tfar as I can tell, there's no clean way to index the cosets of the corner subgroup in this\n\tphase. so we just do it the dirty way (see `reduce_to_quotient`).\n\t*/\n}\n\nlet phase2_corner_reduction_map;\nfunction generate_phase2_corner_mtable_compact()\n{\n\tif (cached_mtables.phase2_corner_compact) {return cached_mtables.phase2_corner_compact;}\n\t[cached_mtables.phase2_corner_compact, phase2_corner_reduction_map] = reduce_to_quotient(generate_phase2_corner_mtable(), phase2_corner_goal_states());\n\treturn cached_mtables.phase2_corner_compact;\n}\n\nfunction generate_phase2_ce_mtable()\n{\n\tif (cached_mtables.phase2_ce) {return cached_mtables.phase2_ce;}\n\tlet c = generate_phase2_corner_mtable_compact();\n\tlet e = generate_phase2_edge_mtable();\n\treturn cached_mtables.phase2_ce = combine_mtables(c, e);\n}\n\nlet phase2_ce_mirror_map;\nfunction generate_phase2_ce_mirror_map()\n{\n\tif (phase2_ce_mirror_map) {return phase2_ce_mirror_map;}\n\tconst ce_solved = index_phase2(solved_state)[2];\n\treturn phase2_ce_mirror_map = generate_mirrored_coordinate_table(generate_phase2_ce_mtable(), ce_solved, ce_solved);\n}\n\nfunction phase2_centre_goal_states()\n{\n\tlet [itc, cti] = generate_comb4_lookup_tables(10, 5, 3, 2, 0);\n\treturn itc.filter(x => ((x >> 10) & 63) === 41).map(x => cti[x]);\n\t/*\n\tthe combination tracks the centre pieces at indices\n\t0, 1, 2, 3, 4, 5, 7, 8, 10, 11\n\tin little endian order.\n\tright-shifting 10 bits changes this to\n\t5, 7, 8, 10, 11\n\tand masking by 63 keeps only the three least significant digits\n\t5, 7, 8\n\twhich are exactly the pieces we're solving in this phase.\n\t1 + 4 * 2 + 4**2 * 2 = 41\n\tWARNING: this needs to be adjusted if the centre indexing is changed\n\t(also, this returns a Uint32Array, but nothing we do here can possibly cause overflow so\n\tthat's not a problem)\n\t*/\n}\n\nfunction phase2_corner_goal_states()\n{\n\tlet mtable = generate_phase2_corner_mtable();\n\tlet N = mtable[0].length;\n\tlet flags = Array(N).fill(false);\n\tflags[0] = true; /* index 0 is the solved state */\n\tlet done = false;\n\twhile (!done)\n\t{\n\t\tdone = true;\n\t\tfor (let i = 0; i < N; i++)\n\t\t{\n\t\t\tif (flags[i])\n\t\t\t{\n\t\t\t\tif (!flags[mtable[0][i]]) {done = false; flags[mtable[0][i]] = true;}\n\t\t\t\tif (!flags[mtable[1][i]]) {done = false; flags[mtable[1][i]] = true;}\n\t\t\t}\n\t\t}\n\t}\n\treturn flags.map((_,i) => i).filter(i => flags[i]);\n}\n\nfunction generate_phase2_ace_ptable()\n{\n\tif (cached_ptables.phase2_ace) {return cached_ptables.phase2_ace;}\n\tconst [mtable_a, mtable_b] = generate_phase2_centre_mtables();\n\tconst mtable_ce = generate_phase2_ce_mtable();\n\tconst Na = 2520;\n\tconst Nce = 40 * 336;\n\tconst N = Na * Nce; // = 33868800\n\tconst ce_solved = index_phase2(solved_state)[2];\n\tconst max_depth = 9;\n\tlet ptable = new Int8Array(N).fill(max_depth);\n\tfor (let a_solved of phase2_centre_goal_states())\n\t{\n\t\tptable[a_solved + Na*ce_solved] = 0;\n\t}\n\tfor (let depth = 0; depth < max_depth-1; depth++)\n\t{\n\t\tfor (let state = ptable.indexOf(depth); state !== -1; state = ptable.indexOf(depth, state+1))\n\t\t{\n\t\t\tlet a = state % Na, ce = (state / Na) | 0;\n\t\t\tfor (let move_index = 0; move_index < 4; move_index++)\n\t\t\t{\n\t\t\t\tlet new_a = mtable_a[move_index][a];\n\t\t\t\tlet new_ce = mtable_ce[move_index][ce];\n\t\t\t\tlet new_state = new_a + Na*new_ce;\n\t\t\t\tif (ptable[new_state] === max_depth)\n\t\t\t\t{\n\t\t\t\t\tptable[new_state] = depth + 1;\n\t\t\t\t}\n\t\t\t\tnew_a = mtable_a[move_index][new_a];\n\t\t\t\tnew_ce = mtable_ce[move_index][new_ce];\n\t\t\t\tnew_state = new_a + Na*new_ce;\n\t\t\t\tif (ptable[new_state] === max_depth)\n\t\t\t\t{\n\t\t\t\t\tptable[new_state] = depth + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// don't bother filling in the table for depth >=10; this saves a substantial amount of time\n\t// on startup at a slight cost of pruning effectiveness\n\treturn cached_ptables.phase2_ace = ptable;\n}\n\nfunction* phase2_ida_solve_gen(indices, moves_left)\n{\n\tlet [mtable_a, mtable_b] = generate_phase2_centre_mtables()\n\tlet mtable_ce = generate_phase2_ce_mtable();\n\tlet ptable_ace = generate_phase2_ace_ptable();\n\tlet mirror_map = generate_phase2_ce_mirror_map();\n\tlet [a, b, ce] = indices;\n\tlet ce_mirror = mirror_map[ce];\n\tlet bound = Math.max(ptable_ace[a + 2520 * ce], ptable_ace[b + 2520 * ce_mirror]);\n\twhile (bound <= moves_left)\n\t{\n\t\t//console.log(`searching depth ${bound}`);\n\t\tyield* phase2_ida_search_gen(\n\t\t\ta, b, ce,\n\t\t\tmtable_a, mtable_b, mtable_ce,\n\t\t\tptable_ace,\n\t\t\tmirror_map,\n\t\t\tbound,\n\t\t\t-1);\n\t\tbound++;\n\t}\n}\n\nfunction* phase2_ida_search_gen(a, b, ce, mtable_a, mtable_b, mtable_ce, ptable_ace, mirror_map, bound, last)\n{\n\tlet h = Math.max(ptable_ace[a + 2520 * ce], ptable_ace[b + 2520 * mirror_map[ce]]);\n\tif (h > bound) {return;}\n\tif (bound === 0)\n\t{\n\t\tyield [];\n\t\treturn;\n\t}\n\telse if (h === 0) {return;}\n\tfor (let m = 0; m < 4; m++)\n\t{\n\t\tif (m === last) continue;\n\t\tlet new_a = a, new_b = b, new_ce = ce;\n\t\tfor (let r = 1; r <= 2; r++)\n\t\t{\n\t\t\tnew_a = mtable_a[m][new_a];\n\t\t\tnew_b = mtable_b[m][new_b];\n\t\t\tnew_ce = mtable_ce[m][new_ce];\n\t\t\tlet subpath_gen = phase2_ida_search_gen(\n\t\t\t\tnew_a, new_b, new_ce,\n\t\t\t\tmtable_a, mtable_b, mtable_ce,\n\t\t\t\tptable_ace,\n\t\t\t\tmirror_map,\n\t\t\t\tbound-1,\n\t\t\t\tm);\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tlet {value: subpath, done} = subpath_gen.next();\n\t\t\t\tif (done) break;\n\t\t\t\tyield [[m, r]].concat(subpath);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* Phase 3 mostly-2-gen stuff */\n\nlet phase3_2gen_centre_indices = [0,1,2, 3,4, 10,11];\n\nlet phase3_2gen_keep = [true,true,true, true,true,false, false,false,false, false,true,true];\n\nlet phase3_2gen_move_seqs = [\n[[0,1]], // U\n[[1,1]], // L\n\n// F U R U' R' F'\n[[2,1], [0,1], [3,1], [0,2], [3,2], [2,2]],\n[[3,2], [1,2], [2,2], [1,1], [2,1], [3,1]],\n[[6,1], [0,1], [3,1], [0,2], [3,2], [6,2]],\n[[7,2], [1,2], [2,2], [1,1], [2,1], [7,1]],\n\n// F U F' U F U F'\n[[2,1], [0,1], [2,2], [0,1], [2,1], [0,1], [2,2]],\n[[3,2], [1,1], [3,1], [1,1], [3,2], [1,1], [3,1]],\n\n// F R F' L' U' F R F'\n[[2,1], [3,1], [2,2], [1,2], [0,2], [2,1], [3,1], [2,2]],\n[[3,2], [2,2], [3,1], [0,1], [1,1], [3,2], [2,2], [3,1]],\n[[6,1], [0,1], [6,2], [0,2], [1,2], [6,1], [0,1], [6,2]],\n[[7,2], [1,2], [7,1], [1,1], [0,1], [7,2], [1,2], [7,1]],\n\n// F R' F' R U F' L F\n[[2,1], [3,2], [2,2], [3,1], [0,1], [2,2], [1,1], [2,1]],\n[[3,2], [2,1], [3,1], [2,2], [1,2], [3,1], [0,2], [3,2]],\n[[6,1], [0,2], [6,2], [7,1], [6,1], [1,2], [7,1], [6,1]],\n[[7,2], [1,1], [7,1], [6,2], [7,2], [0,1], [6,2], [7,2]],\n\n// F' L' F' R' F' R' U' R'\n[[2,2], [1,2], [2,2], [3,2], [2,2], [3,2], [0,2], [3,2]],\n[[6,2], [7,2], [1,2], [0,2], [1,2], [0,2], [6,2], [7,2]],\n/*\n[[2,1], [0,2], [2,2], [0,2], [2,1], [3,1], [0,2], [3,2], [2,2]], // F U' F' U' F R U' R' F'\n[[3,2], [1,1], [3,1], [1,1], [3,2], [2,2], [1,1], [2,1], [3,1]], // R' L R L R' F' L F R\n[[6,1], [3,2], [6,2], [1,2], [6,1], [0,1], [3,2], [0,2], [6,2]], // f R' f' L' f U R' U' f'\n[[7,2], [2,1], [7,1], [0,1], [7,2], [1,2], [2,1], [1,1], [7,1]], // r' F r U r' L' F L r\n[[2,1], [0,1], [3,1], [0,2], [3,2], [0,1], [3,1], [0,2], [3,2], [2,2]], // F (U R U' R')2 F'\n[[3,2], [1,2], [2,2], [1,1], [2,1], [1,2], [2,2], [1,1], [2,1], [3,1]], // R' (L' F' L F)2 R\n[[6,1], [0,1], [3,1], [0,2], [3,2], [0,1], [3,1], [0,2], [3,2], [6,2]], // f (U R U' R')2 f'\n[[7,2], [1,2], [2,2], [1,1], [2,1], [1,2], [2,2], [1,1], [2,1], [7,1]], // r' (L' F' L F)2 r\n*/\n];\nphase3_2gen_move_seqs = phase3_2gen_move_seqs.concat(phase3_2gen_move_seqs.map(seq => invert_move_sequence(seq)));\nlet phase3_2gen_nmoves = phase3_2gen_move_seqs.length; // = 36\n/*\nThe moves we're using for this phase:\nU\nL\nF U R U' R' F'\nR' L' F' L F R\nf U R U' R' f'\nr' L' F' L F r\nF U F' U F U F' (= F' U F U F' U F = r' F r U r' F r = r l U' l F l r')\nR' L R L R' L R (= R L R' L R L R' = f R f' L f R f' = f' u R u L' u f)\n\nF R F' L' U' F R F'\nR' F' R U L R' F' R\nf U f' U' L' f U f'\nr' L' r L U r' L' r\n\nF R' F' R U F' L F\nR' F R F' L' R U' R'\nf U' f' r f L' r f\nr' L r f' r' U f' r'\n\nF' L' F' R' F' R' U' R'\nf' r' L' U' L' U' f' r'\n\nand the inverses of the above\n\nThese are the atomic 4-gen move sequences of length <= 8 where the induced permutations lie in the\n<U,L> group (verified with GAP, barring transcription errors).\n\nTemporarily going out of LU 2-gen can sometimes save _many_ moves, e.g. the F R U R' U' F' scramble\nobviously has a 6-move 4-gen solution (F U R U' R' F'), but the optimal 2-gen solution is 24 moves:\nU L' U L' U' L' U' L U' L U L' U L' U L U L' U' L U' L U L'.\n*/\n\nlet phase3_2gen_facelet_permutations = phase3_2gen_move_seqs.map(seq => apply_move_sequence(permutation_from_cycles([], 72), seq));\nlet phase3_2gen_piece_permutations = phase3_2gen_facelet_permutations.map(convert_move_to_permutations);\nlet phase3_2gen_move_orders = phase3_2gen_facelet_permutations.map(permutation_order);\n\nfunction index_phase3_2gen(facelets)\n{\n\tlet [itc, cti] = generate_comb4_lookup_tables(7, 3, 2, 0, 2);\n\tlet ep = Array(5).fill().map((_,i) => get_edge_piece(facelets, i));\n\tlet edge_coord = evenpermutation_to_index(ep);\n\tlet corners = Array(4).fill().map((_,i) => get_corner_piece(facelets, i));\n\tlet corner_coord = evenpermutation_to_index(corners.map(x => x[0]))*2 + corners.find(x => x[0] === 0)[1];\n\tlet [a_coord, b_coord] = [centreA_piece_facelets, centreB_piece_facelets].map((facelet_indices) =>\n\t{\n\t\tlet arr = compose(facelet_indices, phase3_2gen_centre_indices).map(x => facelets[x] % 4);\n\t\treturn cti[arr.reduce((acc, x, j) => acc | (x << (2*j)), 0)];\n\t});\n\treturn [a_coord+210*b_coord, corner_coord+24*edge_coord];\n}\n\nfunction generate_phase3_2gen_edge_mtable()\n{\n\tif (cached_mtables.phase3_2gen_edge) {return cached_mtables.phase3_2gen_edge;}\n\tconst HALFFACT5 = factorial(5)/2; // = 60\n\tlet mtable = Array(phase3_2gen_nmoves).fill().map(() => new Uint32Array(HALFFACT5));\n\tlet permutations = phase3_2gen_piece_permutations.map(x => x.ep.slice(0, 5));\n\tfor (let i = 0; i < HALFFACT5; i++)\n\t{\n\t\tlet p = index_to_evenpermutation(i, 5);\n\t\tfor (let m = 0; m < phase3_2gen_nmoves; m++)\n\t\t{\n\t\t\tmtable[m][i] = evenpermutation_to_index(compose(p, permutations[m]));\n\t\t}\n\t}\n\treturn cached_mtables.phase3_2gen_edge = mtable;\n}\n\n// the group of corner states is the binary tetrahedral group 2T, where |2T| = 24\nfunction generate_phase3_2gen_corner_mtable()\n{\n\tif (cached_mtables.phase3_2gen_corner) {return cached_mtables.phase3_2gen_corner;}\n\tconst HALFFACT4 = factorial(4)/2; // = 12\n\tconst N = HALFFACT4 * 2; // = 24\n\tconst keep = [true,true,true,true,false,false, true,true,true,true,false,false];\n\tlet mtable = Array(phase3_2gen_nmoves).fill().map(() => new Uint32Array(N));\n\tlet permutations = phase3_2gen_piece_permutations.map(x => reduce_permutation(x.cp, keep).slice(0, 4));\n\tfor (let i = 0; i < N; i += 2)\n\t{\n\t\tlet p = index_to_evenpermutation(i >> 1, 4);\n\t\tlet cp = p.concat(p.map(x => x+4));\n\t\tfor (let m = 0; m < phase3_2gen_nmoves; m++)\n\t\t{\n\t\t\tlet cp2 = compose(cp, permutations[m]);\n\t\t\tlet p2 = cp2.map(x => x%4);\n\t\t\tlet o2 = (cp2.find(x => x % 4 === 0) >> 2);\n\t\t\tmtable[m][i] = evenpermutation_to_index(p2)*2 + o2;\n\t\t\tmtable[m][i+1] = evenpermutation_to_index(p2)*2 + (o2^1);\n\t\t}\n\t}\n\treturn cached_mtables.phase3_2gen_corner = mtable;\n}\n\nfunction generate_phase3_2gen_corneredge_mtable()\n{\n\tif (cached_mtables.phase3_2gen_corneredge) {return cached_mtables.phase3_2gen_corneredge;}\n\treturn cached_mtables.phase3_2gen_corneredge = combine_mtables(generate_phase3_2gen_corner_mtable(), generate_phase3_2gen_edge_mtable());\n}\n\nfunction generate_phase3_2gen_centre_mtable()\n{\n\tif (cached_mtables.phase3_2gen_centre) {return cached_mtables.phase3_2gen_centre;}\n\tlet mtable_a = generate_mtable_comb4_generic(7, 3, 2, 0, 2, phase3_2gen_piece_permutations.map(x => reduce_permutation(x.ap, phase3_2gen_keep)));\n\tlet mtable_b = generate_mtable_comb4_generic(7, 3, 2, 0, 2, phase3_2gen_piece_permutations.map(x => reduce_permutation(x.bp, phase3_2gen_keep)));\n\tcached_mtables.phase3_2gen_centreA = mtable_a;\n\tcached_mtables.phase3_2gen_centreB = mtable_b;\n\treturn cached_mtables.phase3_2gen_centre = combine_mtables(mtable_a, mtable_b);\n}\n\nlet phase3_2gen_depth_table;\nfunction generate_phase3_2gen_depth_table()\n{\n\tif (phase3_2gen_depth_table) {return phase3_2gen_depth_table;}\n\tconst mtable_ab = generate_phase3_2gen_centre_mtable();\n\tconst mtable_ce = generate_phase3_2gen_corneredge_mtable();\n\tconst Nab = mtable_ab[0].length; // = 44100\n\tconst Nce = mtable_ce[0].length; // = 1440\n\tconst N = Nab*Nce; // = 63504000\n\tconst max_depth = 25; // pre-determined; hard-coding this makes the algorithm a bit faster\n\tconst all_weights = phase3_2gen_move_seqs.map(seq => seq.length);\n\tconst table = new Int8Array(N).fill(max_depth);\n\tconst solved_indices = index_phase3_2gen(solved_state);\n\ttable[solved_indices[0] + Nab*solved_indices[1]] = 0;\n\tlet depth = 0;\n\tlet done = false;\n\twhile (!done && depth < max_depth-1)\n\t{\n\t\tdone = true;\n\t\t//console.log(`scanning depth ${depth}`);\n\t\tlet move_indices = Array(phase3_2gen_nmoves).fill().map((x,i)=>i).filter(m => all_weights[m] + depth < max_depth);\n\t\tmove_indices.sort((m, mm) => all_weights[m] - all_weights[mm]);\n\t\tlet weights = compose(all_weights, move_indices);\n\t\tlet mtable_ab_pruned = compose(mtable_ab, move_indices);\n\t\tlet mtable_ce_pruned = compose(mtable_ce, move_indices);\n\t\tlet nmoves = move_indices.length;\n\t\t//console.log(move_indices);\n\t\tfor (let state = table.indexOf(depth); state !== -1; state = table.indexOf(depth, state+1))\n\t\t{\n\t\t\tlet ab = state % Nab, ce = (state / Nab) | 0;\n\t\t\tfor (let mi = 0; mi < nmoves; mi++)\n\t\t\t{\n\t\t\t\tlet weight = weights[mi];\n\t\t\t\tlet new_ab = mtable_ab_pruned[mi][ab];\n\t\t\t\tlet new_ce = mtable_ce_pruned[mi][ce];\n\t\t\t\tlet new_state = new_ab + Nab*new_ce;\n\t\t\t\tif (table[new_state] > depth+weight)\n\t\t\t\t{\n\t\t\t\t\tdone = false;\n\t\t\t\t\ttable[new_state] = depth+weight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdepth++;\n\t}\n\treturn phase3_2gen_depth_table = table;\n}\n\nlet phase3_2gen_ace_table;\nfunction generate_phase3_2gen_ace_table()\n{\n\tif (phase3_2gen_ace_table) {return phase3_2gen_ace_table;}\n\tconst mtable_ab = generate_phase3_2gen_centre_mtable();\n\tconst mtable_a = cached_mtables.phase3_2gen_centreA;\n\tconst mtable_ce = generate_phase3_2gen_corneredge_mtable();\n\tconst Na = mtable_a[0].length; // = 210\n\tconst Nce = mtable_ce[0].length; // = 1440\n\tconst N = Na*Nce; // = 302400\n\tconst max_depth = 25; // pre-determined; hard-coding this makes the algorithm a bit faster\n\tconst all_weights = phase3_2gen_move_seqs.map(seq => seq.length);\n\tconst table = new Int8Array(N).fill(max_depth);\n\tconst solved_indices = index_phase3_2gen(solved_state);\n\ttable[solved_indices[0]%Na + Na*solved_indices[1]] = 0;\n\tlet depth = 0;\n\tlet done = false;\n\twhile (!done && depth < max_depth-1)\n\t{\n\t\tdone = true;\n\t\t//console.log(`scanning depth ${depth}`);\n\t\tlet move_indices = Array(phase3_2gen_nmoves).fill().map((x,i)=>i).filter(m => all_weights[m] + depth < max_depth);\n\t\tmove_indices.sort((m, mm) => all_weights[m] - all_weights[mm]);\n\t\tlet weights = compose(all_weights, move_indices);\n\t\tlet mtable_a_pruned = compose(mtable_a, move_indices);\n\t\tlet mtable_ce_pruned = compose(mtable_ce, move_indices);\n\t\tlet nmoves = move_indices.length;\n\t\t//console.log(move_indices);\n\t\tfor (let state = table.indexOf(depth); state !== -1; state = table.indexOf(depth, state+1))\n\t\t{\n\t\t\tlet a = state % Na, ce = (state / Na) | 0;\n\t\t\tfor (let mi = 0; mi < nmoves; mi++)\n\t\t\t{\n\t\t\t\tlet weight = weights[mi];\n\t\t\t\tlet new_a = mtable_a_pruned[mi][a];\n\t\t\t\tlet new_ce = mtable_ce_pruned[mi][ce];\n\t\t\t\tlet new_state = new_a + Na*new_ce;\n\t\t\t\tif (table[new_state] > depth+weight)\n\t\t\t\t{\n\t\t\t\t\tdone = false;\n\t\t\t\t\ttable[new_state] = depth+weight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdepth++;\n\t}\n\treturn phase3_2gen_ace_table = table;\n}\n\nlet phase3_2gen_ce_mirror_map;\nfunction generate_phase3_2gen_ce_mirror_map()\n{\n\tif (phase3_2gen_ce_mirror_map) {return phase3_2gen_ce_mirror_map;}\n\tconst mtable_ce = generate_phase3_2gen_corneredge_mtable().slice(0, 2);\n\tconst solved_indices = index_phase3_2gen(solved_state);\n\treturn phase3_2gen_ce_mirror_map = generate_mirrored_coordinate_table(mtable_ce, solved_indices[1], solved_indices[1]);\n}\n\n/*\nfunction solve_phase3_2gen(facelets, indices=index_phase3_2gen(facelets), simplify=true)\n{\n\tlet [ab, ce] = indices;\n\tlet Nab = 44100;\n\tlet mtable_ab = generate_phase3_2gen_centre_mtable();\n\tlet mtable_ce = generate_phase3_2gen_corneredge_mtable();\n\tlet depth_table = generate_phase3_2gen_depth_table();\n\tlet seq = [];\n\twhile (depth_table[ab + Nab*ce] > 0)\n\t{\n\t\tlet distance = depth_table[ab + Nab*ce];\n\t\tfor (let m = 0; m < phase3_2gen_nmoves; m++)\n\t\t{\n\t\t\tlet new_ab = mtable_ab[m][ab];\n\t\t\tlet new_ce = mtable_ce[m][ce];\n\t\t\tlet new_distance = depth_table[new_ab + Nab*new_ce];\n\t\t\tif (new_distance === distance-phase3_2gen_move_seqs[m].length)\n\t\t\t{\n\t\t\t\tseq = seq.concat(phase3_2gen_move_seqs[m]);\n\t\t\t\tab = new_ab;\n\t\t\t\tce = new_ce;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn simplify ? simplify_move_sequence(seq) : seq;\n}\n*/\n\nfunction solve_phase3_2gen(facelets, indices=index_phase3_2gen(facelets))\n{\n\t//const THRESHOLD = 31;\n\tlet [ab, ce] = indices;\n\tlet a = ab % 210, b = Math.floor(ab / 210);\n\tlet mtable_ab = generate_phase3_2gen_centre_mtable();\n\tlet mtable_a = cached_mtables.phase3_2gen_centreA;\n\tlet mtable_b = cached_mtables.phase3_2gen_centreB;\n\tlet mtable_ce = generate_phase3_2gen_corneredge_mtable();\n\tlet ace_table = generate_phase3_2gen_ace_table();\n\tlet mirror_map_ce = generate_phase3_2gen_ce_mirror_map();\n\tlet bound = 0;\n\twhile (true)\n\t{\n\t\tlet gen = solve_phase3_2gen_ida(a, b, ce, mtable_a, mtable_b, mtable_ce, ace_table, mirror_map_ce, bound);\n\t\tfor (let solution of gen)\n\t\t{\n\t\t\treturn solution.map(m => phase3_2gen_move_seqs[m]).flat();\n\t\t}\n\t\tbound++;\n\t}\n}\n\nfunction solve_phase3_2gen_readable(facelets, indices=index_phase3_2gen(facelets))\n{\n\t//const THRESHOLD = 31;\n\tlet [ab, ce] = indices;\n\tlet a = ab % 210, b = Math.floor(ab / 210);\n\tlet mtable_ab = generate_phase3_2gen_centre_mtable();\n\tlet mtable_a = cached_mtables.phase3_2gen_centreA;\n\tlet mtable_b = cached_mtables.phase3_2gen_centreB;\n\tlet mtable_ce = generate_phase3_2gen_corneredge_mtable();\n\t//let depth_table = generate_phase3_2gen_depth_table();\n\tlet ace_table = generate_phase3_2gen_ace_table();\n\tlet mirror_map_ce = generate_phase3_2gen_ce_mirror_map();\n\tlet initial = solve_phase3_2gen(facelets).length;\n\tlet best_score = Infinity;\n\tlet best_solution;\n\t//console.log(`initial: ${initial}`);\n\tfor (let bound = initial; bound <= initial+0; bound++)\n\t{\n\t\tlet gen = solve_phase3_2gen_ida(a, b, ce, mtable_a, mtable_b, mtable_ce, ace_table, mirror_map_ce, bound);\n\t\tfor (let solution of gen)\n\t\t{\n\t\t\tlet expanded = solution.map(m => phase3_2gen_move_seqs[m]).flat();\n\t\t\tlet simplified = simplify_move_sequence(expanded);\n\t\t\tlet score = grade_readability(simplified);\n\t\t\tif (score < best_score)\n\t\t\t{\n\t\t\t\tbest_score = score;\n\t\t\t\tbest_solution = simplified;\n\t\t\t\t//console.log(`${score} ${stringify_move_sequence(simplified, true)}`);\n\t\t\t\t//if (score <= THRESHOLD) {break search;}\n\t\t\t}\n\t\t}\n\t}\n\treturn best_solution;\n}\n\nfunction alternation_penalty(x)\n{\n\treturn (x-1)*(x-2)/2;\n\t// A B A B A costs 1\n\t// A B A B A B costs 3\n\t// A B A B A B A costs 6\n\t// A B A B A B A B costs 10\n\t// etc.\n\t// this should be chosen to be a convex function\n}\n\nfunction grade_readability(seq)\n{\n\tlet nowide = stringify_move_sequence(seq, true).replace(/'/g, '').split(' ');\n\treturn seq.length + alternations(nowide).map(alternation_penalty).reduce((x, y) => x+y, 0);\n}\n\nfunction alternations(seq)\n{\n\t// return a list of \"alternating\" run lengths\n\t// convention:\n\t// A B does not count\n\t// A B A counts as length 1\n\t// A B A B counts as length 2\n\t// A B A B A counts as length 3\n\t// etc.\n\tif (seq.length < 3) {return [];}\n\tlet n = seq.length;\n\tlet a = [];\n\tfor (let i = 0; i < n-2; i++) {a[i] = (seq[i] === seq[i+2]);}\n\ta.push(false);\n\tlet i = -1;\n\tlet runs = [];\n\twhile (i < n-2)\n\t{\n\t\ti = a.indexOf(true, i+1);\n\t\tif (i === -1) {break;}\n\t\tlet j = a.indexOf(false, i+1);\n\t\truns.push(j-i);\n\t\ti = j;\n\n\t}\n\treturn runs;\n}\n\nfunction* solve_phase3_2gen_ida(a, b, ce, mtable_a, mtable_b, mtable_ce, ace_table, mirror_map_ce, bound, last=-1)\n{\n\tlet h_ace = ace_table[a + 210 * ce];\n\tlet h_bce = ace_table[b + 210 * mirror_map_ce[ce]];\n\tlet h = Math.max(h_ace, h_bce);\n\t//console.log(h_ace, h_bce, bound);\n\tif (h > bound) {return;}\n\tif (bound === 0) {yield []; return;}\n\tif (h === 0) {return;} // this solution includes redundant moves\n\tfor (let m = 0; m < phase3_2gen_nmoves; m++)\n\t{\n\t\tif (m === last && phase3_2gen_move_orders[m] <= 3) {continue;}\n\t\tlet new_a = mtable_a[m][a];\n\t\tlet new_b = mtable_b[m][b];\n\t\tlet new_ce = mtable_ce[m][ce];\n\t\tlet new_bound = bound - phase3_2gen_move_seqs[m].length;\n\t\tif (new_bound < 0) {continue;}\n\t\tlet subpath_gen = solve_phase3_2gen_ida(new_a, new_b, new_ce, mtable_a, mtable_b, mtable_ce, ace_table, mirror_map_ce, new_bound, m);\n\t\twhile (true)\n\t\t{\n\t\t\tlet {value: subpath, done} = subpath_gen.next();\n\t\t\tif (done) {break;}\n\t\t\tyield [m].concat(subpath);\n\t\t}\n\t}\n}\n\n/* Some glue code */\n\nfunction solve_phase2_and_phase3_fast(facelets, phase2_attempts=200, cap=24)\n{\n\tlet pool = [];\n\tlet gen = solve_phase2_gen(facelets);\n\tlet facelets_t2 = compose(facelets, move_X).map(x => x ^ 1);\n\tlet gen_t2 = solve_phase2_gen(facelets_t2);\n\tlet best = Array(1000);\n\t// phase 2 always takes <= 15 moves and phase 3 <= 25 moves, so this is a safe upper bound\n\tfor (let i = 0; i < phase2_attempts; i++)\n\t{\n\t\t{\n\t\tlet {value, done} = gen.next();\n\t\tif (!done)\n\t\t{\n\t\t\tlet intermediate_facelets = apply_move_sequence(facelets, value);\n\t\t\tlet solution = value.concat(solve_phase3_2gen(intermediate_facelets));\n\t\t\tif (solution.length <= cap)\n\t\t\t{\n\t\t\t\treturn solution;\n\t\t\t}\n\t\t\telse if (solution.length < best.length)\n\t\t\t{\n\t\t\t\tbest = solution;\n\t\t\t}\n\t\t}\n\t\t}\n\t\t{\n\t\tlet {value, done} = gen_t2.next();\n\t\tif (!done)\n\t\t{\n\t\t\tlet intermediate_facelets = apply_move_sequence(facelets_t2, value);\n\t\t\tlet solution = value.concat(solve_phase3_2gen(intermediate_facelets)).map(([m, r]) => [m^2, r]);\n\t\t\tif (solution.length <= cap)\n\t\t\t{\n\t\t\t\treturn solution;\n\t\t\t}\n\t\t\telse if (solution.length < best.length)\n\t\t\t{\n\t\t\t\tbest = solution;\n\t\t\t}\n\t\t}\n\t\t}\n\t}\n\treturn best;\n}\n\nfunction solve_phase2_and_phase3_readable(facelets, phase2_attempts=20, cap=30)\n{\n\tlet pool = [];\n\tlet gen = solve_phase2_gen(facelets);\n\tlet facelets_t2 = compose(facelets, move_X).map(x => x ^ 1);\n\tlet gen_t2 = solve_phase2_gen(facelets_t2);\n\tlet best;\n\tlet best_score = Infinity;\n\tfor (let i = 0; i < phase2_attempts; i++)\n\t{\n\t\t{\n\t\tlet {value, done} = gen.next();\n\t\tif (!done)\n\t\t{\n\t\t\tlet intermediate_facelets = apply_move_sequence(facelets, value);\n\t\t\tlet solution = simplify_move_sequence(value.concat(solve_phase3_2gen_readable(intermediate_facelets)));\n\t\t\tlet score = grade_readability(solution);\n\t\t\tif (score <= cap)\n\t\t\t{\n\t\t\t\treturn solution;\n\t\t\t}\n\t\t\telse if (score < best_score)\n\t\t\t{\n\t\t\t\tbest = solution;\n\t\t\t\tbest_score = score;\n\t\t\t}\n\t\t}\n\t\t}\n\t\t{\n\t\tlet {value, done} = gen_t2.next();\n\t\tif (!done)\n\t\t{\n\t\t\tlet intermediate_facelets = apply_move_sequence(facelets_t2, value);\n\t\t\tlet solution = simplify_move_sequence(value.concat(solve_phase3_2gen_readable(intermediate_facelets)));\n\t\t\tsolution = solution.map(([m, r]) => [m^2, r]);\n\t\t\tlet score = grade_readability(solution);\n\t\t\tif (score <= cap)\n\t\t\t{\n\t\t\t\treturn solution;\n\t\t\t}\n\t\t\telse if (score < best_score)\n\t\t\t{\n\t\t\t\tbest = solution;\n\t\t\t\tbest_score = score;\n\t\t\t}\n\t\t}\n\t\t}\n\t}\n\treturn best;\n}\n\nfunction phase3_benchmark(solver=solve_phase3_2gen)\n{\nlet some_2gen_scrambles = [\n[0,0,0,0,1,0,0,3,1,2,1,0,1,3,1,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,0,1,3,3,3,5,4,5,5,4,4,4,7,6,7,7,4,5,5,4,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,7,4,5,4],\n[0,3,0,1,1,1,0,1,1,2,0,3,1,3,3,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,0,0,0,0,3,5,4,5,4,4,5,5,7,6,7,4,4,5,5,7,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,4,7,4,4],\n[2,0,3,0,1,0,0,1,0,0,3,1,1,1,3,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,0,0,1,0,3,7,4,5,4,5,4,4,5,4,5,7,7,5,4,4,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,6,7,5,4,7],\n[3,0,3,0,1,0,0,0,0,0,1,1,1,2,1,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,0,0,3,3,1,4,4,7,7,7,5,4,7,5,7,4,4,5,4,5,5,5,5,6,6,6,6,5,6,6,6,6,7,7,7,7,6,4,5,4,4],\n[0,0,3,3,0,0,0,1,0,3,0,0,1,1,3,1,1,1,2,2,2,2,1,2,2,2,2,3,3,3,3,3,1,1,0,2,7,4,5,4,4,5,4,4,7,4,5,7,5,4,7,5,5,5,6,6,6,6,6,6,6,6,6,7,7,7,7,5,4,7,4,5],\n[1,0,0,3,0,3,0,0,3,0,0,0,1,0,1,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,2,3,1,1,1,5,7,4,4,5,5,4,7,4,4,4,7,5,7,4,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,5,5,4,6],\n[0,0,0,0,3,3,3,0,3,2,0,3,1,0,0,1,1,1,2,2,2,2,1,2,2,2,2,3,3,3,3,1,1,1,1,0,5,4,4,5,4,4,4,5,7,7,7,7,5,6,7,5,5,5,6,6,6,6,5,6,6,6,6,7,7,7,7,4,5,4,4,4],\n[1,0,0,3,0,3,1,3,1,3,0,1,1,3,0,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,0,0,0,1,0,4,4,4,4,4,4,5,5,4,6,7,5,5,5,7,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,7,4,4,7,5],\n[2,3,0,1,3,3,0,1,1,0,0,0,1,3,0,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,1,3,0,1,0,7,4,7,4,6,4,5,4,4,5,4,5,5,4,7,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,7,5,7,4,5],\n[3,1,1,0,1,0,3,1,0,1,0,3,1,0,0,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,2,0,0,3,3,6,4,4,7,5,4,5,7,4,4,4,5,5,5,5,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,7,4,4,7],\n[0,0,0,0,3,0,1,1,3,2,3,3,1,0,1,1,1,1,2,2,2,2,1,2,2,2,2,3,3,3,3,1,0,0,3,0,5,4,5,4,4,7,7,4,7,7,5,7,5,6,5,5,5,5,6,6,6,6,5,6,6,6,6,7,7,7,7,4,4,4,4,4],\n[1,3,3,0,0,0,1,1,3,0,0,0,1,0,1,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,2,3,0,0,1,5,4,4,5,5,5,7,7,4,4,4,7,5,7,5,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,4,4,4,6],\n[3,0,3,3,2,3,1,1,0,1,0,0,1,0,0,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,3,0,0,1,1,6,5,4,4,7,7,7,7,5,4,4,4,5,7,4,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,5,5,4,5,4],\n[1,0,0,0,0,1,1,1,2,3,0,3,1,1,0,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,0,3,3,0,0,4,7,4,5,5,4,4,4,5,6,4,5,5,7,7,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,4,7,4,5,7],\n[0,0,3,3,3,3,1,0,1,3,0,0,1,0,0,1,1,1,2,2,2,2,1,2,2,2,2,3,3,3,3,2,1,0,1,0,7,7,4,4,5,4,4,5,4,4,5,7,5,6,4,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,5,4,7,5],\n[3,0,0,0,1,1,0,3,0,1,1,0,1,0,0,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,2,1,3,3,3,6,4,5,4,5,4,4,4,4,4,5,4,5,5,7,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,5,7,7,7],\n[0,0,0,1,2,3,0,1,1,3,3,1,1,1,3,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,0,0,0,0,3,7,4,4,4,5,7,4,4,6,4,5,5,5,7,7,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,5,5,7,4,4],\n[0,0,3,0,0,3,3,1,0,2,0,0,1,1,0,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,3,0,1,1,1,5,5,7,7,4,5,4,7,5,7,4,4,5,7,4,5,5,5,6,6,6,6,6,6,6,6,6,7,7,7,7,4,5,4,4,4],\n[1,1,0,0,0,3,0,0,3,3,0,3,1,2,1,1,1,1,2,2,2,2,1,2,2,2,2,3,3,3,3,0,1,3,0,0,4,7,7,4,7,4,4,4,7,6,4,7,5,4,4,5,5,5,6,6,6,6,5,6,6,6,6,7,7,7,7,5,5,5,5,4],\n[1,0,3,3,2,0,0,1,3,0,1,1,1,3,3,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,1,0,0,0,0,5,4,5,4,6,7,7,5,7,4,5,7,5,7,4,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,5,4,4,4,4],\n[1,0,3,0,0,0,1,3,2,3,0,1,1,1,0,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,0,0,3,1,0,4,4,4,7,5,5,4,7,5,6,5,4,5,7,7,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,4,4,4,5,7],\n[0,3,0,1,0,3,0,1,0,2,0,0,1,1,3,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,3,1,0,0,1,5,4,7,4,4,5,5,5,5,7,4,7,5,7,4,5,5,5,6,6,6,6,6,6,6,6,6,7,7,7,7,4,4,7,4,4],\n[0,3,3,0,0,1,1,3,0,2,0,0,1,1,0,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,3,0,0,1,1,5,4,5,5,4,7,7,4,5,7,4,7,5,7,4,5,5,5,6,6,6,6,6,6,6,6,6,7,7,7,7,4,5,4,4,4],\n[1,0,1,0,0,3,1,3,3,0,0,0,1,0,0,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,2,1,3,0,1,5,5,7,4,5,5,4,4,4,4,7,7,5,7,4,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,5,4,4,6],\n[0,3,0,0,0,1,0,3,0,2,1,1,1,1,3,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,3,0,0,0,1,5,4,5,5,4,5,4,4,5,7,4,4,5,7,7,5,5,5,6,6,6,6,6,6,6,6,6,7,7,7,7,4,4,7,7,4],\n[0,0,0,1,2,0,0,3,1,3,0,1,1,1,0,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,0,3,3,1,3,7,4,5,4,5,7,4,5,6,4,7,4,5,7,4,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,5,4,5,7,4],\n[1,1,1,0,0,3,0,1,2,3,3,3,1,1,0,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,0,0,0,0,0,4,4,7,4,5,4,5,5,5,6,4,4,5,7,7,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,4,4,7,5,7],\n[0,0,0,0,0,3,1,0,0,1,0,1,1,1,0,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,1,3,4,7,4,5,4,4,4,7,4,5,4,7,5,5,4,5,5,5,6,6,6,6,6,6,6,6,6,7,7,7,7,7,5,4,5,7],\n[2,0,1,0,1,3,3,1,0,0,0,0,1,1,3,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,0,0,1,0,3,7,7,4,4,5,4,4,7,4,5,5,4,5,4,5,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,6,5,4,7,7],\n[3,0,0,3,1,0,0,3,0,1,1,1,1,0,3,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,2,1,0,0,3,6,4,4,4,5,5,5,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,7,7,7,7],\n[3,1,3,0,0,0,3,1,3,0,0,0,1,0,0,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,1,1,0,3,1,4,4,4,7,4,5,5,7,4,7,4,4,5,5,4,5,5,5,6,6,6,6,5,6,6,6,6,7,7,7,7,7,5,4,7,6],\n[0,3,0,1,1,1,0,1,1,2,0,3,1,3,0,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,0,0,0,3,3,5,4,4,4,4,7,5,4,6,7,4,5,5,5,7,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,5,7,4,4],\n[1,0,1,1,0,3,0,3,3,0,0,1,1,0,0,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,2,0,3,0,1,5,4,4,4,5,4,4,7,4,4,7,5,5,7,5,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,4,5,7,6],\n[0,1,1,3,3,0,0,3,1,1,0,1,1,2,3,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,0,0,0,0,3,4,7,4,4,7,7,5,4,6,5,4,5,5,4,5,5,5,5,6,6,6,6,5,6,6,6,6,7,7,7,7,7,7,4,4,4],\n[0,3,0,1,3,1,0,0,2,1,0,1,1,0,0,1,1,1,2,2,2,2,1,2,2,2,2,3,3,3,3,3,3,0,3,0,4,4,4,4,7,5,5,7,5,5,4,7,5,6,5,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,4,4,7,4,7],\n[1,1,0,0,0,0,3,1,1,3,0,1,1,3,3,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,0,0,0,3,0,4,4,7,7,4,4,5,4,4,6,4,5,5,5,4,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,7,7,4,5,5],\n[2,1,1,3,3,3,0,0,1,0,0,0,1,3,1,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,1,3,0,0,0,7,4,7,4,6,7,7,4,4,5,4,5,5,4,5,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,7,4,5,4,5],\n[2,0,0,3,0,0,0,0,3,0,0,1,1,0,3,1,1,1,2,2,2,2,1,2,2,2,2,3,3,3,3,3,3,1,1,1,7,5,4,4,7,4,4,7,4,5,7,7,5,4,5,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,5,4,4,5,6],\n[3,0,3,3,1,1,0,0,0,0,0,1,1,2,3,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,0,0,1,0,1,4,7,4,4,7,7,4,5,5,7,4,4,5,4,4,5,5,5,6,6,6,6,5,6,6,6,6,7,7,7,7,6,5,5,7,4],\n[1,0,1,0,0,1,0,0,3,0,1,0,1,0,3,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,2,3,3,0,1,5,4,4,5,5,4,4,5,4,4,7,7,5,7,5,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,4,4,7,6],\n[1,3,0,0,1,3,0,0,0,0,0,1,1,3,3,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,0,1,1,0,2,5,7,5,5,4,7,4,7,7,4,4,4,5,4,5,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,6,4,4,4,5],\n[3,0,1,0,1,3,0,0,2,0,3,3,1,3,0,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,1,0,1,1,0,4,4,5,5,6,7,4,4,5,7,4,5,5,5,4,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,4,4,7,7,7],\n[0,0,0,1,1,1,0,0,1,2,0,1,1,3,0,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,0,3,3,3,3,5,5,5,4,4,7,4,7,6,7,4,4,5,5,5,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,4,7,4,4],\n[0,1,1,0,1,3,3,0,1,2,0,0,1,3,1,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,0,0,0,3,3,5,5,7,4,4,7,7,5,6,7,4,4,5,5,5,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,4,4,4,4],\n[1,0,1,1,2,3,3,1,3,0,0,0,1,3,0,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,1,3,0,0,0,5,4,4,4,6,4,7,7,7,4,5,5,5,7,5,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,5,7,4,4,4],\n[0,0,1,0,1,1,0,0,1,2,3,0,1,3,3,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,0,3,1,0,3,5,4,5,7,4,7,4,7,6,7,5,4,5,5,4,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,4,4,4,5,4],\n[3,3,0,0,3,0,1,1,0,1,0,0,1,0,3,1,1,1,2,2,2,2,0,2,2,2,2,3,3,3,3,1,1,0,3,2,6,4,4,5,4,5,7,4,7,4,4,7,5,4,5,5,5,5,6,6,6,6,5,6,6,6,6,7,7,7,7,7,4,4,7,5],\n[1,3,3,0,0,0,0,1,1,3,1,3,1,3,0,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,0,1,0,0,0,4,4,7,7,4,4,5,7,4,6,4,5,5,5,4,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,7,4,4,5,5],\n[1,0,0,0,0,3,1,0,1,3,3,3,1,3,0,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,0,1,0,1,0,4,4,4,5,4,7,4,5,4,6,7,4,5,5,7,5,5,5,6,6,6,6,7,6,6,6,6,7,7,7,7,7,5,4,4,5],\n[1,0,3,3,0,0,0,3,2,3,1,0,1,1,1,1,1,1,2,2,2,2,3,2,2,2,2,3,3,3,3,0,0,0,1,0,4,4,5,4,5,7,4,4,5,6,7,4,5,7,7,5,5,5,6,6,6,6,4,6,6,6,6,7,7,7,7,4,5,5,4,7],\n];\n/* these fifty scrambles were obtained by doing a few hundred random LU moves */\nconsole.log('generating tables');\nlet start = performance.now();\nsolver(solved_state);\nconsole.log(performance.now() - start);\nlet solve_times = [], move_counts = [];\nconsole.log('solving');\nfor (let scramble of some_2gen_scrambles)\n{\n\tlet start = performance.now();\n\tlet sol = solver(scramble);\n\tlet elapsed = performance.now() - start;\n\tsolve_times.push(elapsed);\n\tmove_counts.push(sol.length);\n\tconsole.log(elapsed, sol.length);\n\tif (apply_move_sequence(scramble, sol).join('') !== solved_state.join(''))\n\t{\n\t\tconsole.log('solving failed!');\n\t}\n}\nconsole.log(`mean solve time: ${solve_times.reduce((x, y) => x+y) / some_2gen_scrambles.length}`);\nconsole.log(`mean move count: ${move_counts.reduce((x, y) => x+y) / some_2gen_scrambles.length}`);\nlet sorted_solve_times = solve_times.slice().sort((x, y) => x-y);\nconsole.log(`1%/25%/50%/75%/99% solve times: ${sorted_solve_times[0]} ${sorted_solve_times[12]} ${(sorted_solve_times[24]+sorted_solve_times[25])/2} ${sorted_solve_times[37]} ${sorted_solve_times[49]}`);\n}\n\nfunction solver_benchmark(solver=solve)\n{\nlet some_scrambles = [\n[1,1,0,3,1,1,2,3,0,2,3,1,2,0,2,0,3,0,2,0,1,1,3,0,3,2,2,3,0,0,1,3,2,2,3,1,6,6,5,4,7,7,7,4,5,5,5,4,5,4,5,7,4,7,6,5,7,4,4,6,7,5,5,7,4,7,6,6,6,6,6,4],\n[2,3,2,2,3,2,2,0,1,0,0,3,0,1,2,2,0,3,2,1,1,3,1,3,3,1,0,3,1,1,0,2,0,1,3,0,7,5,6,6,6,7,6,7,4,5,4,4,4,6,6,6,4,7,6,4,5,7,5,5,5,7,4,7,5,5,7,4,6,7,4,5],\n[3,0,0,0,1,3,3,0,0,1,1,2,3,3,3,3,2,0,2,0,1,1,2,3,1,1,1,3,2,1,2,0,2,2,0,2,6,6,4,7,4,5,6,7,7,4,5,5,4,6,4,5,7,5,6,5,6,4,7,7,7,4,4,7,4,6,7,5,6,6,5,5],\n[3,0,2,2,1,0,3,2,2,0,1,3,0,1,3,1,1,3,2,3,0,2,2,3,1,2,1,3,0,1,2,0,0,3,1,0,4,5,7,5,5,7,7,5,5,7,7,5,4,6,6,6,4,4,6,5,4,7,4,6,4,4,6,7,6,7,6,5,5,4,6,7],\n[0,1,2,0,0,3,3,0,2,3,0,0,3,0,1,2,3,3,2,1,0,3,1,1,1,1,1,3,2,3,2,2,2,0,2,1,7,5,4,4,5,5,7,7,6,4,6,4,4,4,6,4,5,4,6,5,6,6,7,7,7,6,6,7,5,7,6,5,4,7,5,5],\n[1,3,2,1,0,2,0,0,1,3,0,3,0,0,1,2,3,0,2,3,1,1,3,1,2,3,1,3,1,2,2,2,0,3,0,2,4,4,5,4,5,4,7,7,5,6,6,6,7,7,6,7,6,5,6,6,7,5,7,4,5,5,4,7,4,4,6,4,7,5,5,6],\n[2,2,1,2,0,0,0,3,2,0,0,0,3,1,0,3,3,3,2,2,1,1,3,3,1,2,1,3,1,2,0,0,2,3,1,1,7,4,7,5,5,5,7,6,6,5,7,6,4,7,7,4,7,4,6,5,5,6,4,4,6,4,6,7,6,4,7,4,5,5,6,5],\n[1,2,1,0,1,1,0,3,0,3,2,3,2,1,2,3,0,3,2,1,1,1,0,0,3,3,0,3,3,0,0,2,2,1,2,2,4,6,7,4,6,6,5,7,7,6,5,5,7,5,4,6,5,7,6,4,7,6,5,4,7,5,4,7,4,4,7,4,6,5,6,5],\n[0,1,2,1,2,1,0,0,1,3,2,3,3,2,0,1,1,0,2,3,1,0,1,2,3,3,1,3,0,0,2,0,2,2,3,3,7,5,7,6,7,5,7,7,6,4,5,4,4,5,4,7,4,5,6,7,5,4,5,5,4,6,4,7,6,6,6,6,6,5,7,4],\n[1,0,2,2,0,3,3,2,0,3,1,0,0,1,0,3,1,0,2,1,3,0,3,1,1,3,2,3,2,1,2,2,0,3,2,1,4,5,4,5,6,7,7,5,5,6,5,5,7,7,7,4,7,7,6,6,4,4,5,4,6,6,5,7,6,6,7,4,5,4,6,4],\n[3,0,1,2,0,3,3,1,1,1,1,2,2,2,0,0,0,0,2,1,3,1,3,1,0,3,1,3,3,2,2,0,0,3,2,2,6,6,6,7,7,5,6,4,5,4,7,5,6,7,6,5,4,5,6,7,4,4,5,7,4,7,4,7,5,7,5,4,6,4,5,6],\n[1,0,3,1,1,0,3,2,2,3,2,3,3,0,1,3,0,0,2,0,3,2,0,1,1,1,2,3,2,2,1,3,0,0,2,1,4,6,7,6,7,6,4,5,6,6,5,5,7,5,5,5,4,7,6,5,4,7,4,4,6,7,5,7,7,7,4,4,6,4,6,5],\n[3,3,2,3,1,2,0,0,2,0,0,1,0,2,1,1,0,1,2,2,3,1,3,1,2,0,0,3,2,3,1,1,3,3,2,0,4,5,6,7,5,4,6,6,5,7,4,7,7,4,4,6,7,4,6,7,7,6,6,6,4,5,5,7,5,5,5,6,5,4,4,7],\n[0,1,0,3,3,3,0,1,0,3,1,2,3,1,0,2,1,1,2,0,3,2,1,0,3,2,0,3,2,3,1,2,2,0,1,2,7,6,4,6,6,6,7,5,7,4,5,6,7,6,7,4,5,4,6,5,7,7,5,7,6,5,5,7,5,4,4,4,4,4,6,5],\n[2,3,2,2,0,1,1,0,3,0,0,3,3,2,2,3,0,1,2,0,1,1,3,3,2,3,0,3,2,0,1,1,2,0,1,1,7,5,6,7,5,5,7,7,4,5,4,7,6,7,4,6,4,4,6,5,4,4,6,6,7,7,5,7,4,5,5,4,5,6,6,6],\n[0,2,1,1,1,0,0,1,1,2,1,3,2,0,2,3,3,0,2,2,2,3,2,0,1,3,3,3,0,1,3,1,2,0,0,3,5,5,7,4,4,6,4,5,6,7,7,6,6,6,7,6,6,4,6,7,4,4,5,4,7,7,7,7,5,5,6,5,4,5,5,4],\n[3,1,3,2,1,1,3,0,0,0,1,0,2,1,3,3,1,1,2,3,3,1,2,0,0,2,3,3,0,2,2,0,2,0,1,2,4,6,5,5,5,4,7,5,7,7,5,4,6,6,7,4,4,6,6,5,5,4,4,7,7,7,4,7,4,6,7,5,6,6,6,5],\n[0,0,1,2,0,0,1,3,2,2,2,3,1,0,0,3,1,3,2,0,0,3,3,2,3,1,1,3,0,3,1,1,2,2,2,1,5,5,5,7,4,7,6,4,6,7,7,5,4,7,6,7,6,4,6,5,7,6,5,4,4,4,6,7,4,6,6,4,5,5,7,5],\n[3,3,3,3,1,3,0,1,0,1,0,0,2,0,3,1,0,1,2,1,2,1,2,2,3,0,0,3,0,1,2,3,2,2,1,2,6,5,5,7,7,5,7,7,7,4,4,4,5,6,6,6,5,4,6,7,7,5,4,6,4,4,5,7,6,4,6,5,7,4,6,5],\n[0,1,3,2,1,2,2,3,1,3,3,2,1,0,1,0,3,3,2,3,1,0,0,1,3,0,1,3,0,0,1,2,0,2,2,2,7,7,7,5,5,5,6,6,5,4,4,4,6,5,4,6,6,4,6,4,6,5,7,7,7,4,6,7,4,7,5,4,5,7,5,6],\n[3,2,3,1,0,2,2,3,1,1,2,0,0,0,1,0,2,1,2,3,3,3,3,1,3,0,0,3,1,2,1,2,0,0,1,2,6,6,5,5,5,4,5,7,5,4,5,7,7,7,6,4,6,4,6,6,4,6,7,5,4,6,5,7,7,5,4,4,7,7,4,6],\n[2,2,3,1,3,3,1,0,1,1,3,0,1,1,2,2,1,2,2,0,1,3,0,3,3,2,0,3,0,2,0,0,0,2,1,3,5,4,4,5,5,6,7,7,6,6,5,5,4,4,4,6,6,5,6,7,5,7,4,7,6,6,7,7,4,5,5,7,7,6,4,4],\n[3,2,0,1,1,2,3,3,3,0,3,1,0,0,3,0,1,0,2,1,0,3,2,0,0,3,1,3,1,2,2,2,2,2,1,1,4,7,5,5,5,7,7,7,4,7,6,6,7,6,4,5,4,5,6,4,7,6,7,6,4,5,4,7,6,4,5,5,6,4,5,6],\n[3,1,3,3,3,2,0,3,2,1,1,0,3,2,2,2,3,0,2,0,1,1,0,0,2,1,1,3,3,2,0,0,0,2,1,1,6,5,7,4,7,5,7,4,6,4,6,4,6,4,7,6,5,5,6,7,6,4,5,7,5,5,4,7,7,4,5,7,6,4,6,5],\n[3,2,1,2,2,1,0,2,0,1,1,3,0,3,3,3,1,1,2,0,0,1,1,0,3,2,0,3,1,2,2,0,3,3,0,2,6,6,6,5,4,7,7,7,7,4,6,6,7,5,7,6,6,4,6,4,4,5,7,4,4,5,5,7,4,5,7,6,5,5,4,5],\n[0,1,2,3,1,2,2,3,2,3,1,0,1,0,3,2,1,1,2,0,2,0,0,0,3,3,3,3,3,1,0,2,1,2,0,1,7,5,6,4,5,5,7,7,6,4,4,6,6,5,7,6,4,6,6,7,5,5,7,4,6,7,4,7,7,5,4,4,6,5,4,5],\n[1,3,3,0,2,1,3,0,1,3,0,1,2,2,3,2,3,3,2,0,2,1,1,0,1,1,0,3,3,2,1,0,2,2,0,0,4,4,6,7,7,7,7,4,4,6,6,7,6,5,4,4,6,7,6,4,7,6,5,5,5,5,4,7,5,6,5,6,5,7,4,5],\n[2,2,2,2,2,1,3,0,3,0,3,0,2,1,0,0,1,0,2,3,3,1,1,3,1,2,3,3,0,1,0,0,3,1,2,1,7,4,7,6,5,5,6,6,4,5,5,7,7,5,5,4,6,4,6,4,4,5,4,4,7,7,7,7,6,6,5,6,5,7,4,6],\n[0,3,2,1,0,3,0,3,1,3,3,3,1,1,0,0,1,0,2,1,2,3,1,2,2,0,2,3,0,0,2,2,1,2,1,3,7,4,6,4,6,5,5,5,6,4,7,4,6,4,7,6,6,7,6,4,5,6,5,7,7,7,5,7,5,4,7,5,4,5,6,4],\n[1,1,0,2,0,1,0,1,3,2,0,2,3,1,1,3,3,0,2,2,3,0,3,2,3,0,2,3,1,0,2,0,2,1,3,1,6,7,5,5,5,4,4,7,4,5,6,7,4,7,6,6,7,7,6,5,6,5,4,6,7,5,5,7,6,4,7,4,4,4,5,6],\n[3,1,0,2,1,2,1,0,2,1,3,1,2,2,0,2,2,0,2,0,1,3,0,3,0,3,3,3,0,2,3,1,3,1,1,0,6,7,5,6,5,5,5,7,5,4,4,6,5,5,6,4,5,4,6,7,4,4,6,7,7,7,7,7,5,4,6,4,4,6,6,7],\n[2,3,3,1,1,2,0,1,1,0,3,0,1,3,3,0,0,3,2,0,0,2,2,1,2,2,1,3,3,2,2,0,3,1,1,0,7,6,7,6,4,6,5,6,4,5,4,5,4,6,4,7,5,4,6,7,5,5,7,6,7,4,6,7,5,7,6,5,4,4,7,5],\n[0,1,2,2,1,0,3,1,2,2,2,0,0,3,0,3,3,0,2,1,3,0,3,1,0,2,1,3,3,1,2,0,2,1,3,1,5,5,7,7,4,5,5,5,6,7,4,5,5,4,6,7,4,5,6,4,4,4,7,6,7,7,4,7,6,4,6,6,7,6,6,5],\n[0,0,3,2,0,1,3,0,1,2,0,0,3,0,2,0,3,1,2,1,0,2,3,1,1,3,3,3,2,2,3,1,2,1,1,2,5,5,7,7,4,6,5,6,5,7,7,5,6,7,4,4,5,6,6,6,7,5,5,7,4,4,4,7,6,6,4,4,4,7,5,6],\n[2,2,2,2,3,3,1,3,0,1,1,2,0,3,0,3,1,2,2,1,1,0,1,3,3,2,0,3,2,1,3,0,0,0,0,1,5,5,7,5,4,7,7,5,5,6,7,6,5,6,6,7,4,5,6,6,7,4,7,4,4,5,7,7,6,4,6,4,6,4,5,4],\n[0,1,3,2,1,0,0,2,2,3,1,1,3,2,3,3,0,3,2,3,1,1,0,3,0,2,1,3,0,0,2,0,1,2,2,1,7,5,4,7,7,5,6,6,6,4,4,4,4,5,5,4,7,4,6,7,6,6,5,4,6,7,6,7,7,7,5,4,6,5,5,5],\n[2,0,0,1,0,3,2,3,1,0,2,2,3,1,0,1,0,1,2,3,1,0,3,1,3,2,0,3,0,1,1,2,3,2,2,3,7,6,4,6,6,7,7,5,6,5,5,6,4,7,6,6,5,4,6,4,5,7,5,4,5,6,5,7,7,7,4,4,7,5,4,4],\n[3,3,2,3,2,3,0,2,0,1,0,0,1,2,0,0,1,3,2,3,3,2,1,3,1,0,0,3,2,1,2,0,2,1,1,1,6,7,6,6,7,6,5,4,5,4,7,5,6,5,7,4,7,7,6,5,4,7,5,5,5,7,4,7,4,5,6,6,6,4,4,4],\n[3,3,3,1,0,1,0,2,2,0,2,3,1,2,0,3,2,3,2,2,3,0,1,1,2,2,1,3,0,0,3,0,1,1,0,1,4,5,6,5,7,7,6,5,6,7,4,7,4,4,5,7,6,4,6,7,4,4,5,5,7,4,6,7,6,4,6,5,6,5,7,5],\n[0,1,3,3,1,0,0,1,2,3,2,2,0,1,1,1,3,0,2,0,2,3,3,2,2,1,2,3,3,0,1,0,3,2,0,1,7,5,4,6,5,5,7,6,6,4,6,7,5,4,6,6,5,7,6,4,5,7,4,7,4,4,5,7,7,7,5,6,6,4,4,5],\n[0,0,3,2,2,2,3,0,2,3,0,0,1,0,0,3,2,1,2,1,1,0,1,2,1,3,3,3,2,3,2,1,1,3,1,0,7,4,5,5,4,5,7,7,5,4,7,6,4,5,4,5,4,6,6,6,6,5,5,6,6,7,4,7,6,7,7,6,4,4,5,7],\n[1,3,1,1,0,3,1,1,1,3,2,2,2,2,2,0,2,1,2,0,1,1,3,0,3,0,0,3,0,3,3,0,3,2,0,2,4,7,6,6,7,4,5,7,5,6,7,4,6,7,6,6,5,4,6,5,7,4,5,5,7,6,5,7,4,7,4,4,4,5,5,6],\n[2,0,1,2,1,3,1,0,1,0,3,3,0,3,2,2,0,0,2,3,0,2,3,2,3,1,1,3,0,3,1,0,2,1,1,2,7,7,4,5,4,6,5,4,5,5,7,4,4,4,5,4,5,5,6,5,7,7,7,7,6,6,4,7,6,7,6,6,5,4,6,6],\n[3,0,0,2,1,3,2,1,1,0,0,0,3,0,1,1,2,1,2,3,0,3,0,1,2,3,3,3,0,3,1,2,2,1,2,2,4,4,5,5,5,4,6,6,5,7,5,7,6,5,6,6,6,6,6,7,7,7,7,4,4,5,4,7,4,7,5,4,5,7,4,6],\n[2,3,0,2,1,3,3,2,0,1,2,2,0,3,0,0,3,3,2,1,3,1,0,1,1,1,1,3,2,2,3,0,1,0,0,2,5,6,7,5,4,6,5,4,7,6,4,4,4,5,7,6,7,4,6,7,4,5,7,5,7,6,6,7,4,6,6,4,5,7,5,5],\n[3,0,2,2,2,0,3,3,1,1,0,1,2,0,2,0,3,3,2,3,0,1,1,3,3,2,0,3,1,0,1,2,1,2,1,0,6,4,7,7,5,5,5,7,4,4,7,6,6,5,5,7,4,7,6,5,6,6,7,4,5,5,4,7,4,4,4,6,6,6,7,5],\n[1,0,3,1,3,2,1,3,0,2,3,0,0,1,3,3,1,0,2,0,1,3,1,1,1,0,3,3,2,2,2,0,0,2,2,2,6,6,7,4,5,4,5,5,7,5,7,4,5,6,5,5,6,4,6,7,7,4,4,4,7,6,7,7,4,7,6,4,5,6,6,5],\n[1,1,2,2,2,2,1,3,0,3,2,0,3,2,3,0,0,0,2,3,1,0,1,1,2,0,3,3,3,1,0,0,3,1,2,1,4,6,5,5,7,7,6,5,5,6,4,6,4,5,7,7,4,4,6,7,4,5,5,4,4,6,7,7,6,6,7,6,7,5,5,4],\n[0,3,0,2,1,1,1,2,1,3,3,2,2,0,0,0,3,0,2,1,1,3,3,0,0,3,2,3,2,1,0,1,3,1,2,2,7,7,5,6,4,6,6,5,5,4,6,7,5,4,6,5,4,7,6,7,4,4,5,7,4,7,5,7,4,6,7,6,5,5,4,6],\n[0,2,0,3,2,3,1,2,1,3,1,0,3,2,1,2,0,0,2,1,2,0,1,2,3,3,1,3,0,1,0,0,3,2,1,3,7,5,5,6,7,4,5,4,6,4,7,5,4,5,6,7,6,5,6,7,5,5,5,7,6,6,4,7,6,4,4,6,7,4,7,4],\n[2,2,0,2,0,2,2,3,3,1,0,0,1,2,3,0,1,3,2,0,2,3,1,1,3,2,0,3,1,0,1,0,3,3,1,1,5,4,6,6,7,5,7,6,4,6,5,7,4,4,7,6,7,7,6,6,4,4,5,5,7,5,4,7,5,6,5,5,4,7,4,6],\n[3,2,2,1,3,1,3,3,2,1,3,2,1,2,0,0,3,0,2,1,0,0,0,3,3,0,1,3,2,1,0,0,1,2,2,1,6,4,7,5,7,6,6,5,6,4,5,5,4,4,7,6,7,5,6,7,4,4,5,4,7,5,4,7,6,6,5,7,4,7,6,5],\n[0,0,2,1,1,3,2,1,2,2,2,3,2,0,1,3,3,1,2,1,0,0,3,2,3,0,0,3,0,0,3,3,1,1,2,1,5,5,7,6,7,6,4,7,6,7,7,5,6,4,5,6,4,4,6,4,4,5,4,7,7,5,5,7,5,6,4,6,6,7,4,5],\n[1,3,2,1,2,2,3,0,0,3,2,3,2,2,1,1,3,0,2,0,0,0,1,2,3,3,3,3,2,1,1,0,0,0,1,1,4,7,6,6,7,6,4,4,5,6,7,7,6,5,5,4,4,4,6,5,6,7,5,7,5,5,7,7,5,7,4,6,4,6,5,4],\n[0,1,3,2,2,2,3,1,2,3,0,3,0,1,0,0,2,3,2,1,2,3,1,3,2,1,1,3,2,1,1,0,0,3,0,0,7,7,5,6,5,7,6,4,5,4,4,6,5,5,4,7,6,4,6,5,5,7,4,5,4,7,6,7,5,6,6,6,4,4,7,7],\n[0,2,1,2,1,1,2,3,1,3,0,0,1,0,2,0,3,0,2,3,3,3,2,1,3,0,1,3,1,0,1,2,2,0,2,3,7,7,4,7,5,4,4,6,6,4,6,5,6,6,6,6,6,5,6,5,7,7,7,5,5,7,4,7,4,7,4,5,4,5,5,4],\n[0,2,3,0,1,2,0,1,1,3,1,0,1,2,2,0,0,0,2,1,3,3,0,1,2,1,2,3,2,0,3,1,2,3,3,3,7,5,6,4,5,7,6,4,6,4,6,5,6,5,6,7,4,7,6,5,4,7,6,5,7,7,5,7,4,5,4,4,6,5,7,4],\n[1,0,2,1,2,3,1,1,0,3,2,0,3,0,3,3,0,3,2,3,2,2,1,3,0,1,0,3,2,0,1,2,2,0,1,1,4,6,7,6,5,6,5,7,5,6,7,7,4,5,6,4,5,7,6,5,5,7,7,4,7,4,4,7,6,6,4,6,5,5,4,4],\n[1,2,3,3,2,3,1,0,1,3,2,0,1,2,2,0,3,3,2,3,0,2,1,2,0,1,0,3,0,1,1,0,1,3,2,0,4,6,7,6,7,5,7,4,4,6,7,7,4,5,4,5,7,7,6,4,4,5,5,5,7,6,4,7,4,6,6,6,6,5,5,5],\n[1,1,1,3,0,1,2,3,1,3,1,0,3,1,2,0,2,2,2,2,3,0,3,0,1,3,0,3,2,2,3,2,0,0,1,0,4,6,4,6,6,4,4,7,4,6,4,6,7,7,6,5,5,5,6,7,7,5,5,5,7,6,7,7,5,5,4,4,4,6,7,5],\n[2,0,1,3,1,2,2,0,1,0,1,0,3,1,3,3,3,0,2,0,1,2,3,0,1,2,3,3,2,2,1,2,3,0,1,0,7,6,5,7,6,4,7,7,4,5,5,7,6,4,4,5,4,4,6,6,5,7,5,6,4,6,7,7,4,7,4,6,5,5,6,5],\n[3,2,2,0,2,3,3,2,0,1,1,0,3,0,0,2,2,0,2,0,0,3,1,3,0,3,1,3,1,1,1,3,1,2,1,2,6,5,6,4,7,5,5,5,7,4,6,7,4,5,6,7,5,5,6,6,7,7,4,4,7,4,4,7,5,6,4,6,4,6,7,5],\n[0,2,3,0,0,0,1,0,1,3,3,1,2,2,2,2,1,3,2,3,1,1,1,3,1,2,1,3,0,0,3,0,2,0,3,2,7,4,6,7,7,4,5,7,5,4,5,6,6,4,5,5,6,4,6,4,5,4,5,7,7,4,6,7,7,5,6,5,4,6,7,6],\n[2,1,2,2,0,1,3,1,1,0,1,0,0,0,0,0,3,3,2,1,1,3,3,2,0,3,1,3,3,0,2,1,3,2,2,2,7,6,7,7,4,5,5,7,5,5,4,4,4,7,4,5,6,4,6,4,7,6,5,4,7,5,6,7,5,5,6,4,6,7,6,6],\n[3,1,3,2,3,0,3,3,2,0,0,0,2,0,2,3,1,2,2,1,3,0,1,2,3,1,0,3,1,0,2,1,1,0,2,1,4,7,4,6,4,6,5,5,6,7,5,5,5,6,4,7,6,5,6,4,5,4,5,7,6,7,7,7,6,7,7,4,6,4,4,5],\n[1,2,3,0,3,1,2,1,0,2,1,0,3,2,2,2,0,1,2,1,2,1,0,3,3,1,3,3,0,3,3,0,2,0,0,1,6,6,7,4,7,7,7,4,5,5,6,6,4,4,7,7,5,6,6,5,6,4,5,4,7,5,4,7,5,6,6,7,4,5,5,4],\n[0,1,1,3,3,0,2,0,2,3,2,0,0,0,3,3,2,0,2,1,2,3,1,1,0,1,2,3,2,3,0,1,3,1,2,1,7,5,6,6,4,7,5,5,6,4,6,6,5,6,4,7,5,7,6,7,7,7,5,4,4,5,5,7,4,6,4,4,7,6,4,5],\n[3,2,3,1,0,2,1,1,0,1,1,3,3,1,2,3,0,3,2,0,1,0,1,0,3,3,0,3,0,0,2,2,1,2,2,2,6,6,6,5,6,6,7,5,7,4,6,6,4,4,4,6,7,7,6,4,5,5,5,7,7,7,4,7,7,4,5,5,4,4,5,5],\n[1,1,2,2,2,3,3,2,0,3,2,1,1,2,1,0,0,0,2,3,1,1,1,0,2,3,3,3,0,0,3,0,3,0,2,1,4,7,7,5,7,6,5,5,5,6,5,4,4,5,4,6,7,4,6,4,5,6,5,7,7,5,7,7,7,6,4,6,4,6,6,4],\n[0,2,1,2,1,3,1,1,1,2,1,2,2,3,2,3,1,1,2,0,0,1,2,3,0,3,3,3,3,2,0,0,0,3,0,0,5,5,6,6,4,6,7,7,4,7,7,4,5,6,4,7,4,6,6,4,7,4,7,5,6,7,4,7,5,5,4,5,5,6,6,5],\n[3,2,1,3,3,0,3,3,1,1,2,3,1,0,0,2,3,0,2,0,1,0,0,2,1,1,1,3,0,2,3,2,2,1,0,2,6,5,5,6,5,7,5,6,5,4,7,7,4,4,4,6,4,5,6,4,7,5,7,5,6,4,4,7,7,6,4,7,5,7,6,6],\n[0,2,3,1,0,2,1,3,3,2,1,1,3,1,0,3,2,1,2,0,3,2,3,0,0,1,0,3,0,0,2,2,1,3,2,1,5,5,6,4,6,7,6,6,4,7,5,6,4,7,4,5,4,4,6,7,7,7,5,7,7,5,5,7,4,5,6,4,4,6,5,6],\n[2,3,2,3,1,3,2,1,1,0,0,0,2,3,2,1,0,3,2,3,3,1,2,1,0,0,1,3,2,3,0,0,2,1,1,0,7,4,6,4,4,7,4,5,4,5,6,4,5,6,7,7,7,4,6,6,5,6,7,5,5,6,6,7,7,4,5,5,6,7,4,5],\n[1,1,3,3,1,3,0,2,0,3,1,3,0,1,0,2,0,3,2,1,1,2,0,2,0,0,0,3,3,2,3,2,1,2,1,2,4,5,7,7,6,4,5,7,7,6,6,6,5,5,4,7,5,7,6,4,6,7,5,4,6,5,4,7,4,6,6,4,7,4,5,5],\n[1,1,3,2,0,2,2,1,0,2,2,3,3,0,0,0,1,1,2,1,2,0,3,3,3,0,3,3,1,0,3,2,2,0,1,1,6,7,4,6,5,6,5,6,5,5,5,6,4,7,7,7,7,6,6,4,4,7,7,5,4,7,4,7,6,5,6,4,5,5,4,4],\n[0,0,1,3,1,1,2,3,2,3,3,1,2,0,2,0,3,3,2,3,3,0,2,0,1,0,1,3,2,0,1,1,2,1,2,0,7,7,5,6,4,4,5,6,5,4,7,6,6,6,4,4,5,4,6,7,4,4,5,7,5,7,6,7,4,7,6,5,5,5,6,7],\n[2,1,1,3,1,1,0,1,0,1,2,2,1,0,2,1,2,2,2,2,0,2,3,3,3,3,0,3,3,3,0,3,0,0,0,1,5,7,6,7,7,7,7,4,5,6,5,5,6,4,6,6,7,5,6,4,4,5,4,7,4,4,7,7,6,5,4,6,6,5,5,4],\n[2,2,1,1,0,0,3,1,2,1,3,3,0,3,3,2,2,3,2,3,1,0,1,2,1,3,1,3,0,2,2,0,0,1,0,0,5,7,5,6,4,6,4,6,5,6,7,6,4,4,5,5,7,4,6,5,4,7,7,7,5,4,6,7,4,7,6,5,5,6,4,7],\n[0,1,2,1,2,3,1,1,1,3,3,3,2,2,2,0,3,0,2,3,2,2,1,1,0,1,1,3,3,0,0,0,0,2,0,3,7,6,6,6,7,7,6,5,6,4,4,7,5,5,4,5,4,5,6,4,6,7,5,7,4,5,4,7,7,6,7,6,5,5,4,4],\n[0,1,1,2,0,2,3,0,2,2,2,0,0,0,3,1,2,3,2,2,1,3,3,3,3,1,1,3,0,2,1,1,0,0,3,1,5,5,7,7,4,5,7,5,6,7,6,6,5,7,6,7,6,4,6,4,4,4,5,7,4,4,6,7,6,5,5,4,4,6,7,5],\n[0,2,1,2,2,0,3,3,0,2,0,2,0,3,2,1,2,1,2,1,1,2,1,1,3,0,3,3,1,3,0,0,3,3,0,1,5,5,6,6,4,6,7,7,5,7,7,7,7,5,5,4,4,6,6,4,7,5,7,4,5,5,4,7,6,6,4,6,5,6,4,4],\n[0,2,3,3,2,1,1,1,0,2,3,0,0,0,2,0,2,3,2,3,3,0,1,2,1,0,1,3,1,0,2,3,3,2,1,1,5,4,5,6,7,6,7,4,5,7,5,6,5,5,7,5,4,4,6,6,4,4,4,5,7,7,6,7,7,7,6,6,6,4,5,4],\n[0,1,3,3,1,2,1,3,1,2,3,1,1,0,0,3,0,0,2,0,3,2,3,2,0,1,1,3,2,2,0,3,1,2,0,2,5,4,6,6,7,6,6,5,5,7,6,5,4,4,4,5,5,5,6,7,7,5,4,4,7,7,4,7,4,4,7,6,7,5,6,6],\n[1,1,1,1,1,0,0,1,1,2,3,3,2,3,3,0,2,0,2,3,0,2,3,2,3,2,2,3,2,0,1,0,1,0,3,0,6,4,7,4,4,5,7,7,4,5,5,6,7,4,4,7,6,7,6,6,5,5,7,4,5,7,5,7,6,6,6,6,4,4,5,5],\n[2,3,0,1,3,2,1,2,0,0,2,3,2,1,0,2,2,0,2,0,3,3,1,1,1,1,3,3,0,3,3,2,0,0,1,1,7,7,4,5,6,5,4,7,5,5,6,6,5,6,6,6,7,4,6,7,6,7,5,4,6,5,7,7,5,7,4,4,4,4,5,4],\n[2,1,2,1,1,0,3,3,1,1,0,1,0,3,3,2,3,2,2,2,2,1,3,1,3,1,0,3,2,0,3,0,2,0,0,0,5,5,7,6,4,7,4,4,4,6,4,4,7,4,6,6,4,5,6,6,7,5,7,5,7,6,7,7,5,6,4,6,5,7,5,5],\n[2,3,1,2,1,0,2,0,2,1,2,2,0,3,1,0,3,1,2,1,3,1,0,0,1,3,3,3,0,2,3,0,1,3,2,0,5,7,6,5,4,5,6,7,5,6,7,5,4,5,5,4,7,6,6,7,7,6,7,4,5,6,4,7,5,4,4,4,6,6,4,7],\n[2,1,2,3,3,2,3,3,1,0,1,1,2,0,0,3,0,0,2,0,1,0,1,3,0,0,1,3,2,3,2,3,1,1,2,2,7,5,6,4,7,5,6,5,5,5,4,4,6,6,7,7,6,5,6,7,7,5,4,7,7,4,4,7,4,5,5,4,4,6,6,6],\n[0,1,2,3,3,1,2,3,0,2,1,3,3,1,1,0,3,3,2,0,0,1,1,2,2,2,0,3,3,0,2,2,0,0,1,1,5,5,7,6,6,4,4,6,5,7,4,6,7,6,4,7,4,7,6,4,5,6,5,7,7,5,4,7,5,6,6,4,7,5,5,4],\n[1,1,2,3,1,1,1,3,2,3,2,0,2,1,0,0,3,0,2,3,2,2,0,0,0,3,3,3,3,2,1,2,1,0,1,0,4,5,6,4,6,7,4,5,5,6,6,7,6,5,5,5,6,4,6,7,6,7,5,4,7,5,7,7,6,4,4,4,7,5,4,7],\n[3,1,1,0,2,1,0,3,2,0,2,0,3,0,1,1,2,3,2,3,0,1,1,3,2,0,1,3,3,2,0,1,2,2,3,0,4,5,6,7,4,7,7,7,5,7,6,7,6,5,6,6,6,4,6,4,5,5,5,4,4,4,6,7,7,5,5,6,5,4,4,7],\n[2,2,1,0,1,1,1,2,0,0,1,3,1,3,3,3,3,1,2,2,0,2,2,2,0,1,3,3,3,0,0,0,0,3,2,1,7,6,7,7,4,4,7,6,5,5,7,5,4,6,4,5,7,6,6,4,4,5,7,6,6,5,4,7,6,6,4,5,5,5,7,4],\n[3,2,3,1,0,0,1,0,0,1,2,2,3,1,1,3,2,3,2,1,2,0,1,3,3,0,0,3,0,3,0,2,1,2,1,2,6,5,6,5,6,7,7,5,7,4,6,7,4,4,5,6,4,7,6,4,5,5,5,7,7,4,4,7,6,6,7,5,4,4,6,5],\n[2,1,3,1,1,2,3,3,3,1,3,0,3,2,2,1,1,0,2,0,3,2,0,0,2,2,3,3,2,0,0,0,1,0,1,1,5,6,5,5,7,4,7,4,4,6,6,6,4,5,7,6,5,4,6,5,6,7,5,7,4,5,7,7,5,6,4,4,4,7,7,6],\n[0,2,1,2,3,2,0,0,2,3,3,3,3,1,2,0,1,2,2,1,0,3,1,2,1,3,0,3,1,1,2,0,0,0,3,1,7,6,7,6,5,4,5,5,6,4,5,4,4,6,7,4,7,5,6,5,5,7,4,6,7,4,7,7,6,6,7,4,6,4,5,5],\n[0,3,1,1,3,2,0,3,1,2,2,2,3,2,0,2,0,3,2,1,3,0,1,3,1,0,0,3,3,1,0,1,1,2,2,0,5,6,4,6,5,5,7,6,4,7,6,5,7,6,4,4,4,7,6,4,7,7,6,7,5,7,4,7,5,6,5,4,5,4,6,5],\n[0,3,1,1,1,0,0,0,2,3,1,1,0,0,2,2,2,1,2,2,0,3,0,1,2,3,3,3,1,3,0,2,2,3,3,1,7,6,6,4,5,4,6,6,6,4,4,7,7,5,6,6,5,6,6,5,4,7,7,5,7,5,4,7,5,4,4,4,7,5,7,5],\n[3,1,3,2,0,3,0,1,1,0,0,2,2,2,1,3,0,1,2,1,1,1,1,2,3,0,3,3,0,0,3,0,3,2,2,2,4,5,4,7,7,7,6,5,5,7,4,7,5,4,4,4,4,6,6,7,6,6,5,7,7,5,4,7,5,5,6,5,6,4,6,6],\n[0,0,1,1,3,2,3,2,0,3,1,3,3,2,1,2,3,0,2,0,0,2,1,3,1,1,1,3,3,0,0,1,2,2,0,2,7,6,7,4,5,6,7,4,7,4,5,5,4,6,5,5,4,5,6,7,5,5,6,7,6,7,4,7,7,6,4,4,4,6,6,5],\n[2,1,0,2,1,2,3,3,0,1,2,2,1,0,1,0,3,1,2,2,0,1,0,0,3,1,3,3,0,3,3,3,2,0,1,2,5,5,6,7,7,7,4,7,7,6,6,6,4,5,4,7,5,6,6,5,7,5,4,5,7,6,4,7,6,5,4,4,4,6,4,5],\n];\nconsole.log('generating tables');\nlet start = performance.now();\nsolver(solved_state);\nconsole.log(performance.now() - start);\nlet solve_times = [], move_counts = [];\nconsole.log('solving');\nfor (let scramble of some_scrambles)\n{\n\tlet start = performance.now();\n\tlet sol = solver(scramble);\n\tlet elapsed = performance.now() - start;\n\tsolve_times.push(elapsed);\n\tmove_counts.push(sol.length);\n\tlet score = grade_readability(sol);\n\tconsole.log(elapsed, sol.length, score);\n\tif (apply_move_sequence(scramble, sol).join('') !== solved_state.join(''))\n\t{\n\t\tconsole.log('solving failed!');\n\t}\n}\nconsole.log(`mean solve time: ${solve_times.reduce((x, y) => x+y) / some_scrambles.length}`);\nconsole.log(`mean move count: ${move_counts.reduce((x, y) => x+y) / some_scrambles.length}`);\n//let sorted_solve_times = solve_times.slice().sort((x, y) => x-y);\n}\n\nexport const randomFTOScrambleString = generate_random_state_scramble;"],
5
- "mappings": "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AAAA,EAGvC,CAAC,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE;AAAA,EAC9C,CAAC,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE;AAAA,EAG9C,CAAC,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE;AAAA,EACrD,CAAC,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE;AAAA,EACrD,CAAC,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE;AAAA,EACrD,CAAC,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE;AAAA,EAGrD,CAAC,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE;AAAA,EACrD,CAAC,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE;AAAA,EACrD,CAAC,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,GAAE;AAAA,EACrD,CAAC,CAAC,GAAE,IAAI,CAAC,GAAE,IAAI,CAAC,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",
6
- "names": []
7
- }