From 3ea485f6ccc497870c6ac9b10ac1ca9482350462 Mon Sep 17 00:00:00 2001 From: Tyson Decker Date: Thu, 3 Mar 2022 14:43:54 -0700 Subject: [PATCH] v1.0.3 --- dist/bundle/puzzleGen.min.js | 2 +- dist/bundle/puzzleGen.min.js.map | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/bundle/puzzleGen.min.js b/dist/bundle/puzzleGen.min.js index 8190d15..232407a 100644 --- a/dist/bundle/puzzleGen.min.js +++ b/dist/bundle/puzzleGen.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.puzzleGen=e():t.puzzleGen=e()}(this,(function(){return(()=>{"use strict";var t={302:(t,e,s)=>{s.r(e),s.d(e,{Algorithm:()=>_e,Colors:()=>a,Masks:()=>Oe,PNG:()=>Ae,PuzzleGeometry:()=>We,Rendering:()=>je,SVG:()=>Ge,Simulator:()=>$e,SvgVisualizer:()=>SvgVisualizer,Type:()=>ue,Visualizer:()=>Visualizer,validColor:()=>Me,validatePuzzleOptions:()=>Le});var i,r,o,a={};s.r(a),s.d(a,{BLACK:()=>v,BLUE:()=>m,BLUE_STICKERLESS:()=>B,DARK_BLUE:()=>C,DARK_BLUE_STICKERLESS:()=>U,GREEN:()=>k,GREEN_STICKERLESS:()=>x,GREY:()=>y,GREY_STICKERLESS:()=>D,LIGHT_GREEN:()=>E,LIGHT_GREEN_STICKERLESS:()=>z,LIGHT_YELLOW:()=>F,LIGHT_YELLOW_STICKERLESS:()=>G,MASK_COLOR:()=>L,ORANGE:()=>w,ORANGE_STICKERLESS:()=>I,PINK:()=>R,PINK_STICKERLESS:()=>A,PURPLE:()=>S,PURPLE_STICKERLESS:()=>N,RED:()=>p,RED_STICKERLESS:()=>P,WHITE:()=>g,WHITE_STICKERLESS:()=>T,YELLOW:()=>b,YELLOW_STICKERLESS:()=>M}),function(t){t[t.Clockwise=0]="Clockwise",t[t.CounterClockwise=1]="CounterClockwise",t[t.Double=2]="Double"}(i||(i={})),function(t){t.Clockwise="",t.CounterClockwise="'",t.Double="2"}(r||(r={})),function(t){t.F="F",t.U="U",t.R="R",t.L="L",t.D="D",t.B="B",t.M="M",t.E="E",t.S="S",t.X="x",t.Y="y",t.Z="z"}(o||(o={}));const n=[o.F,o.U,o.R,o.L,o.D,o.B,o.M,o.E,o.S,o.X,o.Y,o.Z],h=[o.X,o.Y,o.Z],c=/([2-9]+)?([UuFfRrDdLlBbMESxyz])(w)?([2\'])?/g;function l(t){if(!t)return[];let e,s=[];for(;e=c.exec(t);){let t=e[1],i=e[2],o=e[3],a=e[4]||r.Clockwise,n=i===i.toLowerCase()&&-1===h.indexOf(i);n&&(i=i.toUpperCase());let c={unit:d(i),turnType:f(a),slices:n?2:u(t,o)};s.push(c)}return s}function u(t,e){if(e&&!t)return 2;if(!e&&t)throw new Error("Invalid move: Cannot specify num slices if outer block move indicator 'w' is not present");return e||t?parseInt(t):1}function d(t){if(n.indexOf(t)<0)throw new Error(`Invalid move (${t}): Possible turn faces are [U R F L D B M E S x y z]`);return t}function f(t){switch(t){case r.Clockwise:return i.Clockwise;case r.CounterClockwise:return i.CounterClockwise;case r.Double:return i.Double;default:throw new Error(`Invalid move modifier (${t})`)}}class Simulator{constructor(){this.stickers=new Map,this.faces=new Map,this.turns=new Map}addFace(t,e){if(e&&this.faces.has(e))throw`Face ${e} already exists`;e||(e=(this.faces.size+1).toString());const s=t.reduce(((t,e)=>{const s=(this.stickers.size+1).toString();return this.stickers.set(s,e),t.push(s),t}),[]);return this.faces.set(e,s),{faceId:e,stickerIds:s}}addTurn(t,e){if(e&&this.turns.has(e))throw`Turn ${e} already exists`;return e||(e=(this.turns.size+1).toString()),this.turns.set(e,t),e}doTurn(t,e=!1){const s=this.turns.get(t);if(!s)throw`Unknown turn ${t}`;let i=e?1:0,r=e?0:1,o={};s.forEach((t=>{o[t[r]]=this.stickers.get(t[r]),this.stickers.set(t[r],o[t[i]]||this.stickers.get(t[i]))}))}isSolved(){const t=this.faces.entries();let e=t.next();do{const s=e.value[1];let i=this.stickers.get(s[0]);for(let t of s)if(i!=this.stickers.get(t))return!1;e=t.next()}while(!e.done);return!0}getValues(){let t={};return this.faces.forEach(((e,s)=>{t[s]=e.map((t=>this.stickers.get(t)))})),t}setValue(t,e,s){if(!this.faces.has(t))return void console.warn(`attempting to set sticker value on invalid face: ${t}`);let i=this.faces.get(t),r=i[e];i?this.stickers.set(r,s):console.warn(`attempting to set sticker value for invalid sticker: ${t} ${e}`)}alg(t){t&&t.split(" ").forEach((t=>this.doTurn(t)))}case(t){}reset(){this.faces.forEach(((t,e)=>{t.forEach((t=>{this.stickers.set(t,e)}))}))}}const b={value:"#FFFF00"},p={value:"#FF0000"},m={value:"#0000FF"},g={value:"#FFFFFF"},w={value:"#FFA500"},k={value:"#00FF00"},S={value:"#800080"},y={value:"#808080"},C={value:"#00008B"},F={value:"#ffffb3"},E={value:"#32CD32"},R={value:"#FF69B4"},v={value:"#000000"},L={value:"#404040"},M={value:"#FFFF00",stroke:"#DDDD00"},P={value:"#FF0000",stroke:"#DD0000"},B={value:"#0000FF",stroke:"#0000DD"},T={value:"#FFFFFF",stroke:"#DDD"},I={value:"#FFA500",stroke:"#DD8500"},x={value:"#00FF00",stroke:"#00DD00"},N={value:"#800080",stroke:"#5c005c"},D={value:"#808080",stroke:"#6b6b6b"},U={value:"#00008B",stroke:"#000075"},G={value:"#ffffb3",stroke:"#e6e6a3"},z={value:"#32CD32",stroke:"#2db32d"},A={value:"#FF69B4",stroke:"#de5b9c"};var O;!function(t){t[t.CORNER=0]="CORNER",t[t.EDGE=1]="EDGE",t[t.MIDDLE=2]="MIDDLE"}(O||(O={}));const j=[.96875,-.24803,0],W=b,$=g,_=p,q=m,H=k,X=w,Y={top:W,front:_,bottom:$,left:q,right:H,back:X},K=[{type:O.CORNER,colors:[W,_,q]},{type:O.EDGE,colors:[W,q]},{type:O.CORNER,colors:[W,q,X]},{type:O.EDGE,colors:[W,X]},{type:O.CORNER,colors:[W,X,H]},{type:O.EDGE,colors:[W,H]},{type:O.CORNER,colors:[W,H,_]},{type:O.EDGE,colors:[W,_]}],V=[{type:O.EDGE,colors:[$,X]},{type:O.CORNER,colors:[$,X,q]},{type:O.EDGE,colors:[$,q]},{type:O.CORNER,colors:[$,q,_]},{type:O.EDGE,colors:[$,_]},{type:O.CORNER,colors:[$,_,H]},{type:O.EDGE,colors:[$,H]},{type:O.CORNER,colors:[$,H,X]}],Z=/(\/|\((-?\d),(-?\d)\))/g;function Q(t){let e,s=[];for(;e=Z.exec(t);)"/"===e[0]?s.push({slice:!0}):s.push({top:parseInt(e[2]),bottom:parseInt(e[3])});return s}const J={[O.CORNER]:2,[O.EDGE]:1};class Square1Simualtor extends Simulator{constructor(t=Y){super(),this.scheme=t,this.topLayer=function(t){return[{type:O.CORNER,colors:[t.top||W,t.front||_,t.left||q]},{type:O.EDGE,colors:[t.top||W,t.left||q]},{type:O.CORNER,colors:[t.top||W,t.left||q,t.back||X]},{type:O.EDGE,colors:[t.top||W,t.back||X]},{type:O.CORNER,colors:[t.top||W,t.back||X,t.right||H]},{type:O.EDGE,colors:[t.top||W,t.right||H]},{type:O.CORNER,colors:[t.top||W,t.right||H,t.front||_]},{type:O.EDGE,colors:[t.top||W,t.front||_]}]}(this.scheme),this.bottomLayer=function(t){return[{type:O.EDGE,colors:[t.bottom||$,t.back||X]},{type:O.CORNER,colors:[t.bottom||$,t.back||X,t.left||q]},{type:O.EDGE,colors:[t.bottom||$,t.left||q]},{type:O.CORNER,colors:[t.bottom||$,t.left||q,t.front||_]},{type:O.EDGE,colors:[t.bottom||$,t.front||_]},{type:O.CORNER,colors:[t.bottom||$,t.front||_,t.right||H]},{type:O.EDGE,colors:[t.bottom||$,t.right||H]},{type:O.CORNER,colors:[t.bottom||$,t.right||H,t.back||X]}]}(this.scheme),this.middleRotated=!1}alg(t){Q(t).forEach((t=>{"slice"in t?this.slice():(this.rotateTop(t.top),this.rotateBottom(t.bottom))}))}case(t){Q(t).reverse().forEach((t=>{"slice"in t?this.slice():(this.rotateTop(-1*t.top),this.rotateBottom(-1*t.bottom))}))}slice(){let t=0,e=0;for(let e=this.topLayer.length,s=0;e>0&&s<6;e--)s+=J[this.topLayer[e-1].type],t++;for(let t=this.bottomLayer.length,s=0;t>0&&s<6;t--)s+=J[this.bottomLayer[t-1].type],e++;const s=this.topLayer.splice(this.topLayer.length-t,this.topLayer.length),i=this.bottomLayer.splice(this.bottomLayer.length-e,this.bottomLayer.length);this.topLayer=this.topLayer.concat(i),this.bottomLayer=this.bottomLayer.concat(s),this.middleRotated=!this.middleRotated}rotateTop(t){for(;0!=t;)if(t<0){const e=this.topLayer.shift(),s=J[e.type];if(Math.abs(t)Object.assign(Object.assign({},t),{turnType:t.turnType===i.Clockwise?i.CounterClockwise:i.Clockwise})));this.doTurns(e)}doTurns(t){t.forEach((t=>{let e=t.turnType===i.CounterClockwise;switch(t.unit){case"R":this.R(e);break;case"U":this.U(e);break;case"L":this.L(e);break;case"B":this.B(e)}}))}}const rt=t=>t[0],ot=t=>t[1],at=t=>t[2],nt=t=>t[3],ht=t=>t[4],ct=/([LlRrUuBb])(\'?)/g,lt={"":i.Clockwise,"'":i.CounterClockwise};function ut(t){let e,s=[];for(;e=ct.exec(t);){const t=e[1],i=e[2];s.push({unit:t,turnType:lt[i],slices:1})}return s}class PyraminxSimulator extends Simulator{constructor(){super();const{stickerIds:t}=this.addFace(it(9,"top"),"top"),{stickerIds:e}=this.addFace(it(9,"left"),"left"),{stickerIds:s}=this.addFace(it(9,"right"),"right"),{stickerIds:i}=this.addFace(it(9,"back"),"back");this.addTurn([[t[8],s[8]],[s[8],e[8]],[e[8],t[8]]],"u"),this.addTurn([[e[0],i[8]],[i[8],t[4]],[t[4],e[0]]],"l"),this.addTurn([[e[4],s[0]],[s[0],i[4]],[i[4],e[4]]],"r"),this.addTurn([[s[4],t[0]],[t[0],i[0]],[i[0],s[4]]],"b"),this.addTurn([[t[5],s[5]],[t[6],s[6]],[t[7],s[7]],[t[8],s[8]],[s[5],e[5]],[s[6],e[6]],[s[7],e[7]],[s[8],e[8]],[e[5],t[5]],[e[6],t[6]],[e[7],t[7]],[e[8],t[8]]],"U"),this.addTurn([[e[0],i[8]],[e[1],i[6]],[e[2],i[5]],[e[5],i[7]],[i[8],t[4]],[i[6],t[3]],[i[5],t[7]],[i[7],t[2]],[t[4],e[0]],[t[3],e[1]],[t[7],e[2]],[t[2],e[5]]],"L"),this.addTurn([[e[2],s[5]],[e[3],s[1]],[e[4],s[0]],[e[7],s[2]],[s[5],i[2]],[s[1],i[3]],[s[0],i[4]],[s[2],i[7]],[i[2],e[2]],[i[3],e[3]],[i[4],e[4]],[i[7],e[7]]],"R"),this.addTurn([[s[2],t[5]],[s[3],t[1]],[s[4],t[0]],[s[7],t[2]],[t[5],i[5]],[t[1],i[1]],[t[0],i[0]],[t[2],i[2]],[i[5],s[2]],[i[1],s[3]],[i[0],s[4]],[i[2],s[7]]],"B")}U(t){this.doTurn("U",t)}R(t){this.doTurn("R",t)}L(t){this.doTurn("L",t)}B(t){this.doTurn("B",t)}u(t){this.doTurn("u",t)}r(t){this.doTurn("r",t)}l(t){this.doTurn("l",t)}b(t){this.doTurn("b",t)}alg(t){t&&this.doTurns(ut(t))}case(t){if(!t)return;let e=ut(t).reverse().map((t=>Object.assign(Object.assign({},t),{turnType:t.turnType===i.Clockwise?i.CounterClockwise:i.Clockwise})));this.doTurns(e)}doTurns(t){t.forEach((t=>{let e=t.turnType===i.CounterClockwise;switch(t.unit){case"R":this.R(e);break;case"r":this.r(e);break;case"U":this.U(e);break;case"u":this.u(e);break;case"L":this.L(e);break;case"l":this.l(e);break;case"B":this.B(e);break;case"b":this.b(e)}}))}}const dt=["U","R","F","dr","dl","L","d","br","BR","BL","bl","b"],ft=/([RD])([\+\+|\-\-]+)|([UFRL]|BR|BL)([2-3]?)(\'?)/g;var bt;!function(t){t.Clockwise="++",t.CounterClockwise="--",t.FaceClockwise="",t.FaceCounter="'"}(bt||(bt={}));const pt={[bt.Clockwise]:i.Clockwise,[bt.CounterClockwise]:i.CounterClockwise,[bt.FaceClockwise]:i.Clockwise,[bt.FaceCounter]:i.CounterClockwise};function mt(t){if(!t)return[];let e,s=[];for(;e=ft.exec(t);){const t=e[1]?`${e[1]}xx`:e[3],i=e[2]||e[5],r=e[4];s.push({unit:t,turnType:pt[i],slices:1,n:r?parseInt(r):1})}return s}class MegaminxSimulator extends Simulator{constructor(){super(),dt.forEach((t=>{this.addFace(it(11,t),t)}));const t=this.faces.get("U"),e=this.faces.get("R"),s=this.faces.get("F"),i=this.faces.get("dr"),r=this.faces.get("dl"),o=this.faces.get("L"),a=this.faces.get("d"),n=this.faces.get("br"),h=this.faces.get("BR"),c=this.faces.get("BL"),l=this.faces.get("bl"),u=this.faces.get("b");this.addTurn([[s[2],t[6]],[s[1],t[5]],[s[10],t[4]],[t[6],h[10]],[t[5],h[9]],[t[4],h[8]],[h[10],n[8]],[h[9],n[7]],[h[8],n[6]],[n[8],i[2]],[n[7],i[1]],[n[6],i[10]],[i[2],s[2]],[i[1],s[1]],[i[10],s[10]],...gt(e)],"R"),this.addTurn([[t[2],e[2]],[t[3],e[3]],[t[4],e[4]],[e[2],i[2]],[e[3],i[3]],[e[4],i[4]],[i[2],r[2]],[i[3],r[3]],[i[4],r[4]],[r[2],o[2]],[r[3],o[3]],[r[4],o[4]],[o[2],t[2]],[o[3],t[3]],[o[4],t[4]],...gt(s)],"F"),this.addTurn([[s[2],o[4]],[s[3],o[5]],[s[4],o[6]],[o[4],c[8]],[o[5],c[9]],[o[6],c[10]],[c[8],h[6]],[c[9],h[7]],[c[10],h[8]],[h[6],e[10]],[h[7],e[1]],[h[8],e[2]],[e[10],s[2]],[e[1],s[3]],[e[2],s[4]],...gt(t)],"U"),this.addTurn([[s[4],r[4]],[s[5],r[5]],[s[6],r[6]],[r[4],l[8]],[r[5],l[9]],[r[6],l[10]],[l[8],c[6]],[l[9],c[7]],[l[10],c[8]],[c[6],t[10]],[c[7],t[1]],[c[8],t[2]],[t[10],s[4]],[t[1],s[5]],[t[2],s[6]],...gt(o)],"L"),this.addTurn([[t[6],c[10]],[t[7],c[1]],[t[8],c[2]],[c[10],u[8]],[c[1],u[9]],[c[2],u[10]],[u[8],n[4]],[u[9],n[5]],[u[10],n[6]],[n[4],e[8]],[n[5],e[9]],[n[6],e[10]],[e[8],t[6]],[e[9],t[7]],[e[10],t[8]],...gt(h)],"BR"),this.addTurn([[t[8],o[6]],[t[9],o[7]],[t[10],o[8]],[o[6],l[10]],[o[7],l[1]],[o[8],l[2]],[l[10],u[6]],[l[1],u[7]],[l[2],u[8]],[u[6],h[4]],[u[7],h[5]],[u[8],h[6]],[h[4],t[8]],[h[5],t[9]],[h[6],t[10]],...gt(c)],"BL"),this.addTurn([[s[8],e[4]],[s[9],e[5]],[s[10],e[6]],[e[4],n[8]],[e[5],n[9]],[e[6],n[10]],[n[8],a[6]],[n[9],a[7]],[n[10],a[8]],[a[6],r[10]],[a[7],r[1]],[a[8],r[2]],[r[10],s[8]],[r[1],s[9]],[r[2],s[10]],...gt(i)],"dr"),this.addTurn([[s[6],i[4]],[s[7],i[5]],[s[8],i[6]],[i[4],a[8]],[i[5],a[9]],[i[6],a[10]],[a[8],l[6]],[a[9],l[7]],[a[10],l[8]],[l[6],o[10]],[l[7],o[1]],[l[8],o[2]],[o[10],s[6]],[o[1],s[7]],[o[2],s[8]],...gt(r)],"dl"),this.addTurn([[n[10],u[2]],[n[1],u[3]],[n[2],u[4]],[u[2],l[4]],[u[3],l[5]],[u[4],l[6]],[l[4],r[8]],[l[5],r[9]],[l[6],r[10]],[r[8],i[6]],[r[9],i[7]],[r[10],i[8]],[i[6],n[10]],[i[7],n[1]],[i[8],n[2]],...gt(a)],"d"),this.addTurn([[u[10],a[4]],[u[1],a[5]],[u[2],a[6]],[a[4],i[8]],[a[5],i[9]],[a[6],i[10]],[i[8],e[6]],[i[9],e[7]],[i[10],e[8]],[e[6],h[10]],[e[7],h[1]],[e[8],h[2]],[h[10],u[10]],[h[1],u[1]],[h[2],u[2]],...gt(n)],"br"),this.addTurn([[c[4],o[8]],[c[5],o[9]],[c[6],o[10]],[o[8],r[6]],[o[9],r[7]],[o[10],r[8]],[r[6],a[10]],[r[7],a[1]],[r[8],a[2]],[a[10],u[4]],[a[1],u[5]],[a[2],u[6]],[u[4],c[4]],[u[5],c[5]],[u[6],c[6]],...gt(l)],"bl"),this.addTurn([[n[2],h[2]],[n[3],h[3]],[n[4],h[4]],[h[2],c[2]],[h[3],c[3]],[h[4],c[4]],[c[2],l[2]],[c[3],l[3]],[c[4],l[4]],[l[2],a[2]],[l[3],a[3]],[l[4],a[4]],[a[2],n[2]],[a[3],n[3]],[a[4],n[4]],...gt(u)],"b"),this.addTurn([[s[0],e[0]],[s[1],e[9]],[s[5],e[3]],[s[6],e[4]],[s[7],e[5]],[s[8],e[6]],[s[9],e[7]],[s[10],e[8]],[e[0],h[0]],[e[3],h[9]],[e[4],h[10]],[e[5],h[1]],[e[6],h[2]],[e[7],h[3]],[e[8],h[4]],[e[9],h[5]],[h[0],c[0]],[h[9],c[1]],[h[10],c[2]],[h[1],c[3]],[h[2],c[4]],[h[3],c[5]],[h[4],c[6]],[h[5],c[7]],[c[0],o[0]],[c[1],o[7]],[c[2],o[8]],[c[3],o[9]],[c[4],o[10]],[c[5],o[1]],[c[6],o[2]],[c[7],o[3]],[o[0],s[0]],[o[7],s[5]],[o[8],s[6]],[o[9],s[7]],[o[10],s[8]],[o[1],s[9]],[o[2],s[10]],[o[3],s[1]],[i[0],n[0]],[i[1],n[5]],[i[2],n[6]],[i[3],n[7]],[i[4],n[8]],[i[5],n[9]],[i[6],n[10]],[i[7],n[1]],[i[8],n[2]],[i[9],n[3]],[i[10],n[4]],[n[0],u[0]],[n[1],u[3]],[n[2],u[4]],[n[3],u[5]],[n[4],u[6]],[n[5],u[7]],[n[6],u[8]],[n[7],u[9]],[n[8],u[10]],[n[9],u[1]],[n[10],u[2]],[u[0],l[0]],[u[1],l[3]],[u[2],l[4]],[u[3],l[5]],[u[4],l[6]],[u[5],l[7]],[u[6],l[8]],[u[7],l[9]],[u[8],l[10]],[u[9],l[1]],[u[10],l[2]],[l[0],r[0]],[l[1],r[5]],[l[2],r[6]],[l[3],r[7]],[l[4],r[8]],[l[5],r[9]],[l[6],r[10]],[l[7],r[1]],[l[8],r[2]],[l[9],r[3]],[l[10],r[4]],[r[0],i[0]],[r[1],i[9]],[r[2],i[10]],[r[3],i[1]],[r[4],i[2]],[r[5],i[3]],[r[6],i[4]],[r[7],i[5]],[r[8],i[6]],[r[9],i[7]],[r[10],i[8]],...gt(a)],"D++"),this.addTurn([[s[0],t[0]],[s[7],t[3]],[s[8],t[4]],[s[9],t[5]],[s[10],t[6]],[s[1],t[7]],[s[2],t[8]],[s[3],t[9]],[t[0],c[0]],[t[3],c[9]],[t[4],c[10]],[t[5],c[1]],[t[6],c[2]],[t[7],c[3]],[t[8],c[4]],[t[9],c[5]],[c[0],l[0]],[c[9],l[1]],[c[10],l[2]],[c[1],l[3]],[c[2],l[4]],[c[3],l[5]],[c[4],l[6]],[c[5],l[7]],[l[0],r[0]],[l[1],r[7]],[l[2],r[8]],[l[3],r[9]],[l[4],r[10]],[l[5],r[1]],[l[6],r[2]],[l[7],r[3]],[r[0],s[0]],[r[7],s[7]],[r[8],s[8]],[r[9],s[9]],[r[10],s[10]],[r[1],s[1]],[r[2],s[2]],[r[3],s[3]],[i[0],e[0]],[i[1],e[9]],[i[2],e[10]],[i[3],e[1]],[i[4],e[2]],[i[5],e[3]],[i[6],e[4]],[i[7],e[5]],[i[8],e[6]],[i[9],e[7]],[i[10],e[8]],[e[0],h[0]],[e[1],h[5]],[e[2],h[6]],[e[3],h[7]],[e[4],h[8]],[e[5],h[9]],[e[6],h[10]],[e[7],h[1]],[e[8],h[2]],[e[9],h[3]],[e[10],h[4]],[h[0],u[0]],[h[1],u[1]],[h[2],u[2]],[h[3],u[3]],[h[4],u[4]],[h[5],u[5]],[h[6],u[6]],[h[7],u[7]],[h[8],u[8]],[h[9],u[9]],[h[10],u[10]],[u[0],a[0]],[u[1],a[5]],[u[2],a[6]],[u[3],a[7]],[u[4],a[8]],[u[5],a[9]],[u[6],a[10]],[u[7],a[1]],[u[8],a[2]],[u[9],a[3]],[u[10],a[4]],[a[0],i[0]],[a[1],i[5]],[a[2],i[6]],[a[3],i[7]],[a[4],i[8]],[a[5],i[9]],[a[6],i[10]],[a[7],i[1]],[a[8],i[2]],[a[9],i[3]],[a[10],i[4]],...gt(n)],"R++")}U(t){this.doTurn("U",t)}R(t){this.doTurn("R",t)}F(t){this.doTurn("F",t)}dr(t){this.doTurn("dr",t)}dl(t){this.doTurn("dl",t)}L(t){this.doTurn("L",t)}d(t){this.doTurn("d",t)}br(t){this.doTurn("br",t)}BR(t){this.doTurn("BR",t)}BL(t){this.doTurn("BL",t)}bl(t){this.doTurn("bl",t)}b(t){this.doTurn("b",t)}Dxx(t){this.doTurn("D++",t)}Rxx(t){this.doTurn("R++",t)}alg(t){t&&this.doTurns(mt(t))}case(t){if(!t)return;let e=mt(t).reverse().map((t=>Object.assign(Object.assign({},t),{turnType:t.turnType===i.Clockwise?i.CounterClockwise:i.Clockwise})));this.doTurns(e)}doTurns(t){t.forEach((t=>{let e,s=t.turnType===i.CounterClockwise;switch(t.unit){case"Rxx":e=this.Rxx.bind(this);break;case"Dxx":e=this.Dxx.bind(this);break;case"U":e=this.U.bind(this);break;case"R":e=this.R.bind(this);break;case"F":e=this.F.bind(this);break;case"L":e=this.L.bind(this);break;case"BL":e=this.BL.bind(this);break;case"BR":e=this.BR.bind(this)}for(let i=t.n;i>0;i--)e(s)}))}}function gt(t){return[[t[1],t[9]],[t[9],t[7]],[t[7],t[5]],[t[5],t[3]],[t[3],t[1]],[t[2],t[10]],[t[10],t[8]],[t[8],t[6]],[t[6],t[4]],[t[4],t[2]]]}var wt;!function(t){t.U="U",t.R="R",t.F="F",t.D="D",t.L="L",t.B="B"}(wt||(wt={}));const kt=[wt.U,wt.R,wt.F,wt.D,wt.L,wt.B];var St;!function(t){t.X="X",t.Y="Y",t.Z="Z"}(St||(St={}));const yt={X:[wt.U,wt.B,wt.D,wt.F],Y:[wt.L,wt.B,wt.R,wt.F],Z:[wt.L,wt.U,wt.R,wt.D]},Ct={X:{[wt.U]:0,[wt.B]:2,[wt.F]:0,[wt.D]:0},Y:{[wt.B]:-1,[wt.F]:-1,[wt.L]:-1,[wt.R]:-1},Z:{[wt.U]:-1,[wt.D]:1,[wt.L]:2,[wt.R]:0}},Ft={[wt.U]:!1,[wt.R]:!1,[wt.F]:!1,[wt.D]:!0,[wt.L]:!0,[wt.B]:!0};var Et=1e-6,Rt="undefined"!=typeof Float32Array?Float32Array:Array;Math.random;Math.PI;function vt(){var t=new Rt(3);return Rt!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function Lt(t){var e=new Rt(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e}function Mt(t,e,s){var i=new Rt(3);return i[0]=t,i[1]=e,i[2]=s,i}function Pt(t,e,s){return t[0]=e[0]*s[0],t[1]=e[1]*s[1],t[2]=e[2]*s[2],t}function Bt(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function Tt(t,e,s){var i=e[0],r=e[1],o=e[2],a=s[0],n=s[1],h=s[2];return t[0]=r*h-o*n,t[1]=o*a-i*h,t[2]=i*n-r*a,t}function It(t,e,s,i){var r=[],o=[];return r[0]=e[0]-s[0],r[1]=e[1]-s[1],r[2]=e[2]-s[2],o[0]=r[0]*Math.cos(i)-r[1]*Math.sin(i),o[1]=r[0]*Math.sin(i)+r[1]*Math.cos(i),o[2]=r[2],t[0]=o[0]+s[0],t[1]=o[1]+s[1],t[2]=o[2]+s[2],t}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});var xt,Nt=function(t){var e=t[0],s=t[1],i=t[2];return Math.hypot(e,s,i)};xt=vt();function Dt(t){return Math.PI*t/180}function Ut(t,e){return[t*Math.cos(e),t*Math.sin(e)]}function Gt(t){return t/2*Math.sqrt(2.5+1.1*Math.sqrt(5))}function zt(t){let e=0,s=0,i=0;return t.forEach((t=>{e+=t[0],s+=t[1],i+=t[2]})),e/=t.length,s/=t.length,i/=t.length,Lt([e,s,i])}class RubiksCubeSimulator extends Simulator{constructor(t){super(),this.size=t,this.gridSize=t*t,kt.forEach((t=>{this.addFace(it(this.gridSize,t),t);const e=this.makeFaceTurnDefinitions(t);this.addTurn(e,t)})),[St.X,St.Y,St.Z].forEach((t=>{for(let e=0;e{const o=yt[t][(r+1)%yt[t].length],a=this.faces.get(o),n=this.faces.get(i);for(let r=0;r[t,e[this.clockwiseSticker(s)]]))}clockwiseSticker(t){return(t+1)*this.size%(this.gridSize+1)-1}counterClockwiseSticker(t){return this.oppositeSticker(this.clockwiseSticker(t))}oppositeSticker(t){return this.gridSize-(t+1)}axisAlignedSticker(t,e,s){switch(Ct[t][e]){case 0:return s;case 1:return this.clockwiseSticker(s);case 2:return this.oppositeSticker(s);case-1:return this.counterClockwiseSticker(s);default:throw`Invalid axis face orientation value ${Ct[t][e]}`}}turnFace(t,e,s,i,r){Math.abs(r-i)>=this.size-1?console.error(`Invalid number of layers to turn, skipping turn.; face=${t}, layers=${Math.abs(r-i)+1}`):(this.doTurn(t,s),function(t,e){if(t===e)return[t];const s=t{this.doTurn(`${e}-${i}`,Ft[t]?!s:s)})))}U(t=!1,e=1){this.turnFace(wt.U,St.Y,t,this.size-1,this.size-e)}R(t=!1,e=1){this.turnFace(wt.R,St.X,t,this.size-1,this.size-e)}F(t=!1,e=1){this.turnFace(wt.F,St.Z,t,0,e-1)}D(t=!1,e=1){this.turnFace(wt.D,St.Y,t,0,e-1)}L(t=!1,e=1){this.turnFace(wt.L,St.X,t,0,e-1)}B(t=!1,e=1){this.turnFace(wt.B,St.Z,t,this.size-1,this.size-e)}M(t=!1){for(let e=1;e{switch(t.turnType){case i.Clockwise:t.turnType=i.CounterClockwise;break;case i.CounterClockwise:t.turnType=i.Clockwise;break;case i.Double:}return t}));this.doTurns(e)}doTurns(t){t.forEach((t=>{let e;switch(t.unit){case o.U:e=this.U.bind(this);break;case o.R:e=this.R.bind(this);break;case o.F:e=this.F.bind(this);break;case o.D:e=this.D.bind(this);break;case o.L:e=this.L.bind(this);break;case o.B:e=this.B.bind(this);break;case o.M:e=this.M.bind(this);break;case o.E:e=this.E.bind(this);break;case o.S:e=this.S.bind(this);break;case o.X:e=this.X.bind(this);break;case o.Y:e=this.Y.bind(this);break;case o.Z:e=this.Z.bind(this);break;default:console.warn("Unsupported cube move",t)}const s=t.turnType===i.CounterClockwise;e(s,t.slices),t.turnType===i.Double&&e(s,t.slices)}))}}function At(){var t=new Rt(16);return Rt!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t}function Ot(t,e,s){var i,r,o,a,n,h,c,l,u,d,f,b,p=s[0],m=s[1],g=s[2];return e===t?(t[12]=e[0]*p+e[4]*m+e[8]*g+e[12],t[13]=e[1]*p+e[5]*m+e[9]*g+e[13],t[14]=e[2]*p+e[6]*m+e[10]*g+e[14],t[15]=e[3]*p+e[7]*m+e[11]*g+e[15]):(i=e[0],r=e[1],o=e[2],a=e[3],n=e[4],h=e[5],c=e[6],l=e[7],u=e[8],d=e[9],f=e[10],b=e[11],t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=n,t[5]=h,t[6]=c,t[7]=l,t[8]=u,t[9]=d,t[10]=f,t[11]=b,t[12]=i*p+n*m+u*g+e[12],t[13]=r*p+h*m+d*g+e[13],t[14]=o*p+c*m+f*g+e[14],t[15]=a*p+l*m+b*g+e[15]),t}function jt(t,e,s){var i=s[0],r=s[1],o=s[2];return t[0]=e[0]*i,t[1]=e[1]*i,t[2]=e[2]*i,t[3]=e[3]*i,t[4]=e[4]*r,t[5]=e[5]*r,t[6]=e[6]*r,t[7]=e[7]*r,t[8]=e[8]*o,t[9]=e[9]*o,t[10]=e[10]*o,t[11]=e[11]*o,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}function Wt(t,e,s,i){var r,o,a,n,h,c,l,u,d,f,b,p,m,g,w,k,S,y,C,F,E,R,v,L,M=i[0],P=i[1],B=i[2],T=Math.hypot(M,P,B);return T{let t=0;return function(){return t++}})();class Object3D{constructor(){this.uid=_t(),this.matrix=At(),this.centroid=[0,0,0]}translate(t){Ot(this.matrix,this.matrix,t)}rotate(t,e){Wt(this.matrix,this.matrix,t,e)}scale(t){jt(this.matrix,this.matrix,t)}setColor(t){this.color=t}}class Group extends Object3D{constructor(t=[]){super(),this.setObjects(t)}setObjects(t){this.objects=t}addObject(t){this.objects.push(t)}setCentroid(t){this.centroid=t}}const qt=Math.sqrt(3),Ht=Math.atan(Dt(15)),Xt=Dt(30),Yt=(Dt(36),Dt(60));Dt(72);class Square1Builder{constructor(t=K,e=V,s=!1,i=.7){this.sideLength=i,this.halfSide=this.sideLength/2,this.halfEdgePiece=this.halfSide*Ht,this.layerWidth=this.halfSide-this.halfEdgePiece,this.middleWidth=this.sideLength-2*this.layerWidth,this.halfMiddleWidth=this.middleWidth/2,this.borderLayerWidth=.2*this.sideLength,this.outerHalfSide=(i+this.borderLayerWidth)/2,this.outerHalfEdgePiece=this.outerHalfSide*Ht,this.pieces=this.buildSquare1(t,e,s),this.group=new Group(this.pieces)}makeLayer(t){let e=[],s=Math.PI;return t.forEach(((t,i)=>{switch(t.type){case O.CORNER:const i=this.square1Corner(t.colors[0],t.colors[1],t.colors[2]);i.rotate(s,[0,0,1]),e.push(i),s-=Yt;break;case O.EDGE:const r=this.square1Edge(t.colors[0],t.colors[1]);r.rotate(s-Yt,[0,0,1]),e.push(r),s-=Xt}})),e}setColors(t){}}class Face{constructor(t,e,s){this.indices=t,this.color=s,this.uid=_t(),e&&this.calculateCentroid(e)}calculateCentroid(t){this.centroid=zt(t.filter(((t,e)=>this.indices.includes(e))))}}class Geometry extends Object3D{constructor(t,e){super(),this.vertices=t,this.faces=e,this.centroid=zt(this.vertices)}}class Square1Net extends Square1Builder{square1Corner(t,e,s){const i=[[0,0,0],[this.halfSide,this.halfEdgePiece,0],[this.halfSide,this.halfSide,0],[this.halfEdgePiece,this.halfSide,0],[this.outerHalfSide,this.outerHalfEdgePiece,0],[this.outerHalfSide,this.outerHalfSide,0],[this.outerHalfEdgePiece,this.outerHalfSide,0]],r=[new Face([0,1,2,3],i,t),new Face([2,3,6,5],i,e),new Face([1,2,5,4],i,s)];return new Geometry(i,r)}square1Edge(t,e){const s=[It(vt(),[0,0,0],[0,0,0],Xt),It(vt(),[this.halfEdgePiece,this.halfSide,0],[0,0,0],Xt),It(vt(),[-this.halfEdgePiece,this.halfSide,0],[0,0,0],Xt),It(vt(),[this.outerHalfEdgePiece,this.outerHalfSide,0],[0,0,0],Xt),It(vt(),[-this.outerHalfEdgePiece,this.outerHalfSide,0],[0,0,0],Xt)],i=[new Face([0,1,2],s,t),new Face([1,2,4,3],s,e)];return new Geometry(s,i)}square1Middle(t,e,s,i){const r=this.halfSide-this.halfEdgePiece,o=(this.sideLength-2*r)/2,a=this.outerHalfSide-this.outerHalfEdgePiece,n=[[-this.outerHalfSide,o,-.01],[-this.outerHalfEdgePiece,o,-.01],[this.outerHalfSide,o,-.01],[-this.outerHalfSide,-o,-.01],[-this.outerHalfEdgePiece,-o,-.01],[this.outerHalfSide,-o,-.01],[2*this.outerHalfEdgePiece,o,-.01],[2*this.outerHalfEdgePiece,-o,-.01],[2*a,o,-.01],[2*a,-o,-.01]],h=[new Face([0,1,4,3],n,t)];return i?(h.push(new Face([1,6,7,4],n,s)),h.push(new Face([6,8,9,7],n,e))):h.push(new Face([1,2,5,4],n,t)),new Geometry(n,h)}buildSquare1(t,e,s){const i=this.halfSide-this.halfEdgePiece,r=(this.sideLength-2*i)/2;let o=[];const a=new Group(this.makeLayer(t)),n=new Group(this.makeLayer(e));a.translate([0,this.outerHalfSide+r,0]),n.translate([0,-(this.outerHalfSide+r),0]),n.rotate(Xt,[0,0,1]),o=[a,n];const h=this.square1Middle(_,H,X,s);return this.faces={top:a,bottom:n},o.push(h),o}}class Square1 extends Square1Builder{constructor(t=K,e=V,s=!1,i=1.25){super(t,e,s,i)}square1Corner(t,e,s){const i=[[0,0,this.halfSide],[this.halfSide,this.halfEdgePiece,this.halfSide],[this.halfSide,this.halfSide,this.halfSide],[this.halfEdgePiece,this.halfSide,this.halfSide],[0,0,this.halfSide-this.layerWidth],[this.halfSide,this.halfEdgePiece,this.halfSide-this.layerWidth],[this.halfSide,this.halfSide,this.halfSide-this.layerWidth],[this.halfEdgePiece,this.halfSide,this.halfSide-this.layerWidth]],r=[new Face([0,1,2,3],i,t),new Face([2,3,7,6],i,e),new Face([1,2,6,5],i,s)];return new Geometry(i,r)}square1Edge(t,e){const s=[It(vt(),[0,0,this.halfSide],[0,0,0],Xt),It(vt(),[this.halfEdgePiece,this.halfSide,this.halfSide],[0,0,0],Xt),It(vt(),[-this.halfEdgePiece,this.halfSide,this.halfSide],[0,0,0],Xt),It(vt(),[0,0,this.halfSide-this.layerWidth],[0,0,0],Xt),It(vt(),[this.halfEdgePiece,this.halfSide,this.halfSide-this.layerWidth],[0,0,0],Xt),It(vt(),[-this.halfEdgePiece,this.halfSide,this.halfSide-this.layerWidth],[0,0,0],Xt)],i=[new Face([0,1,2],s,t),new Face([1,2,5,4],s,e)];return new Geometry(s,i)}square1Middle(t,e,s){const i=[[-this.halfSide,-this.halfSide,this.halfMiddleWidth],[-this.halfSide,this.halfSide,this.halfMiddleWidth],[this.halfEdgePiece,this.halfSide,this.halfMiddleWidth],[-this.halfEdgePiece,-this.halfSide,this.halfMiddleWidth],[-this.halfSide,-this.halfSide,-this.halfMiddleWidth],[-this.halfSide,this.halfSide,-this.halfMiddleWidth],[this.halfEdgePiece,this.halfSide,-this.halfMiddleWidth],[-this.halfEdgePiece,-this.halfSide,-this.halfMiddleWidth]],r=[new Face([0,1,2,3],i,{value:"#333"}),new Face([4,5,6,7],i,{value:"#333"}),new Face([0,1,5,4],i,e),new Face([1,2,6,5],i,s),new Face([2,3,7,6],i,{value:"#333"}),new Face([0,3,7,4],i,t)];return new Geometry(i,r)}buildSquare1(t,e,s){const i=new Group(this.makeLayer(t)),r=new Group(this.makeLayer(e));i.translate([0,0,.005]),r.translate([0,0,-.005]),r.rotate(Math.PI,[1,0,0]),r.rotate(Xt,[0,0,1]);const o=[i,r],a=this.square1Middle(_,q,X),n=this.square1Middle(X,H,_);return n.rotate(Math.PI,[0,0,1]),s&&n.rotate(Math.PI,j),o.push(a),o.push(n),this.faces={top:i,bottom:r},o}}class Plane extends Geometry{constructor(t,e,s){let i=[Lt([0,0,0]),Lt([t,0,0]),Lt([t,-e,0]),Lt([0,-e,0])];super(i,[new Face([0,1,2,3],i,s)])}}class Triangle extends Geometry{constructor(t,e,s,i){let r=[t,e,s];super(r,[new Face([0,1,2],r,i)])}}class SkewbNet{constructor(){const t=Math.sqrt(2*Math.pow(.5,2)),e=new Group(this.makeStickers(w,t,[-1,0,0])),s=new Group(this.makeStickers(k,t,[2,0,0])),i=new Group(this.makeStickers(g,t,[0,-1,0])),r=new Group(this.makeStickers(p,t,[1,0,0])),o=new Group(this.makeStickers(b,t,[0,1,0])),a=new Group(this.makeStickers(m,t,[0,0,0]));this.U=o,this.R=r,this.F=a,this.L=e,this.B=s,this.D=i,this.faces={top:this.U,front:this.F,right:this.R,back:this.B,left:this.L,bottom:this.D},this.stickers=[r,o,a,e,s,i],this.group=new Group(this.stickers),this.group.translate([-1/4,0,0]),this.group.scale([.5,.5,.5])}makeStickers(t,e,s){const i=new Plane(e,e,t);i.translate(s),i.rotate(Math.PI/4,[0,0,1]),i.translate([-e/2,e/2,0]);const r=[];for(let i=0;i<4;i++){const o=new Triangle([-e/2,e/2,0],[0,e,0],[e/2,e/2,0],t);o.translate(s),o.rotate(-Math.PI/2*i,[0,0,1]),o.rotate(Math.PI/4,[0,0,1]),r.push(o)}return[i,...r]}setColors(t){let{top:e,right:s,front:i,bottom:r,left:o,back:a}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.D,r),this.setFaceColors(this.L,o),this.setFaceColors(this.B,a)}setFaceColors(t,e=[]){t.objects[0].faces[0].color=e[0]||v,t.objects[1].faces[0].color=e[1]||v,t.objects[2].faces[0].color=e[2]||v,t.objects[3].faces[0].color=e[4]||v,t.objects[4].faces[0].color=e[3]||v}}class Skewb{constructor(){const t=Math.sqrt(2*Math.pow(.625,2)),e=.625,s=new Group(this.makeStickers(p,t)),i=new Group(this.makeStickers(b,t,[1,0,0])),r=new Group(this.makeStickers(m,t,[0,1,0])),o=new Group(this.makeStickers(w,t)),a=new Group(this.makeStickers(k,t,[0,1,0])),n=new Group(this.makeStickers(g,t,[1,0,0]));this.U=i,this.R=s,this.F=r,this.L=o,this.B=a,this.D=n,this.faces={top:this.U,front:this.F,right:this.R,back:this.B,left:this.L,bottom:this.D},s.translate([0,0,e]),s.rotate(Math.PI,[1,0,0]),s.rotate(Math.PI/2,[0,0,1]),o.rotate(-Math.PI/2,[0,0,1]),o.translate([0,0,-.625]),r.rotate(-Math.PI/2,[1,0,0]),r.translate([-.625,0,0]),a.translate([e,0,0]),a.rotate(Math.PI,[0,1,0]),a.rotate(-Math.PI/2,[1,0,0]),i.rotate(Math.PI,[0,1,0]),i.translate([0,e,0]),n.translate([0,-.625,0]),n.rotate(Math.PI,[1,0,0]),this.stickers=[s,i,r,o,a,n],this.group=new Group(this.stickers)}makeStickers(t,e,s){const i=new Plane(e,e,t);s&&i.rotate(Math.PI/2,s),i.rotate(Math.PI/4,[0,0,1]),i.translate([-e/2,e/2,0]);const r=[];for(let i=0;i<4;i++){const o=new Triangle([-e/2,e/2,0],[0,e,0],[e/2,e/2,0],t);s&&o.rotate(Math.PI/2,s),o.rotate(Math.PI/2*i,[0,0,1]),o.rotate(Math.PI/4,[0,0,1]),r.push(o)}return[i,...r]}setColors(t){let{top:e,right:s,front:i,bottom:r,left:o,back:a}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.D,r),this.setFaceColors(this.L,o),this.setFaceColors(this.B,a)}setFaceColors(t,e=[]){t.objects[0].faces[0].color=e[0]||v,t.objects[1].faces[0].color=e[1]||v,t.objects[2].faces[0].color=e[2]||v,t.objects[3].faces[0].color=e[4]||v,t.objects[4].faces[0].color=e[3]||v}}class TriangleLattice extends Geometry{constructor(t,e,s){const i=t/2,r=t*(qt/2),o=t/e,a=r/e,n=r/3;let h=[],c=[],l=0;for(let t=0;t<=e;t++)for(let r=0,u=e-t;r<=u;r++){const e=o*r+t*o/2+-i,d=a*t+-n;h.push([e,d,0]),t>0&&(r>0&&c.push(new Face([l,l-1,l-u-2],null,s)),c.push(new Face([l,l-u-2,l-u-1],null,s))),l++}c.forEach((t=>t.calculateCentroid(h))),super(h,c)}}const Kt=60*Math.PI/180;class PyraminxNet{constructor(t,e=.925){this.size=t;const s=e*(qt/2)/1.5,i=.1*s,r=new TriangleLattice(e,t,b),o=new TriangleLattice(e,t,k),a=new TriangleLattice(e,t,m),n=new TriangleLattice(e,t,p);this.L=a,this.R=o,this.U=r,this.B=n,o.rotate(-Kt,[0,0,1]),o.translate([0,s+i,0]),o.rotate(2*Kt,[0,0,1]),r.rotate(Kt,[0,0,1]),r.translate([0,s+i,0]),r.rotate(-2*Kt,[0,0,1]),n.rotate(3*Kt,[0,0,1]),n.translate([0,s+i,0]),n.rotate(-2*Kt,[0,0,1]),this.faces={top:this.U,right:this.R,left:this.L,back:this.B},this.group=new Group([r,o,a,n])}setColors(t){let{left:e,right:s,top:i,back:r}=t;this.setFaceColors(this.L,e),this.setFaceColors(this.R,s),this.setFaceColors(this.U,i),this.setFaceColors(this.B,r)}setFaceColors(t,e){t.faces.forEach(((t,s)=>{e&&e[s]?t.color=e[s]:t.color=v}))}}const Vt=Math.acos(1/3),Zt=120*Math.PI/180,Qt=Math.sqrt(24);class Pyraminx{constructor(t,e=1.75){this.size=t;const s=e/Qt,i=new TriangleLattice(e,t,b),r=new TriangleLattice(e,t,k),o=new TriangleLattice(e,t,m),a=new TriangleLattice(e,t,p);this.L=o,this.R=r,this.U=i,this.B=a,i.rotate(Zt,[0,0,1]),i.rotate(Vt,[1,0,0]),i.translate([0,0,s]),r.rotate(Vt,[1,0,0]),r.translate([0,0,s]),o.rotate(-Zt,[0,0,1]),o.rotate(Vt,[1,0,0]),o.translate([0,0,s]),a.rotate(Math.PI,[0,1,0]),a.translate([0,0,s]),this.faces={top:this.U,right:this.R,left:this.L,back:this.B},this.group=new Group([i,o,r,a])}setColors(t){let{left:e,right:s,top:i,back:r}=t;this.setFaceColors(this.L,e),this.setFaceColors(this.R,s),this.setFaceColors(this.U,i),this.setFaceColors(this.B,r)}setFaceColors(t,e){t.faces.forEach(((t,s)=>{e&&e[s]?t.color=e[s]:t.color=v}))}}class DividedPentagon extends Geometry{constructor(t,e=2,s=1.6,i=.4){const r=function(t){return t/(2*Math.sin(Math.PI/5))}(s),o=function(t){const e=t*t,s=71*Math.PI/180,i=2*e-2*e*Math.cos(s);return 2*Math.sqrt(Math.abs(e-i))}(i),a=function(t,e,s,i){let r=[];for(let o=0;o0;a--){let s=[t[0]+(e[0]-t[0])/r*i*a,t[1]+(e[1]-t[1])/r*i*a,0];o.unshift(s);let n=[e[0]+(t[0]-e[0])/r*i*a,e[1]+(t[1]-e[1])/r*i*a,0];o.push(n)}return o.unshift([t[0],t[1],0]),o.push([e[0],e[1],0]),o}function se(t,e,s){let i=[];for(let r=0;r<5;r++){const o=Ut(e,r*(2*Math.PI)/5-Math.PI/10);if(i.length>0){const e=i[i.length-1],r=ee([e[0],e[1]],o,t,s);r.shift(),i=i.concat(r)}else i.push([o[0],o[1],0])}const r=i[0],o=i[i.length-1],a=ee([o[0],o[1]],[r[0],r[1]],t,s);return a.pop(),a.shift(),i=i.concat(a),i}const ie=36*Math.PI/180,re=72*Math.PI/180,oe={2:.3,3:.17,4:.121};class MegaminxNet{constructor(t){this.layers=t;const e=.75,s=function(t,e){return oe[e]||t/(1.9*e)}(length,t);this.U=new DividedPentagon(g,t,e,s),this.F=new DividedPentagon(p,t,e,s),this.R=new DividedPentagon(m,t,e,s),this.L=new DividedPentagon(k,t,e,s),this.dl=new DividedPentagon(F,t,e,s),this.dr=new DividedPentagon(R,t,e,s),this.BL=new DividedPentagon(S,t,e,s),this.BR=new DividedPentagon(b,t,e,s),this.d=new DividedPentagon(y,t,e,s),this.bl=new DividedPentagon(C,t,e,s),this.br=new DividedPentagon(E,t,e,s),this.b=new DividedPentagon(w,t,e,s);const i=2*function(t){return t/(2*Math.tan(Math.PI/5))}(e);this.U.translate([0,i,0]),this.U.rotate(5*ie,[0,0,1]),this.R.rotate(-re,[0,0,1]),this.R.translate([0,i,0]),this.R.rotate(5*ie,[0,0,1]),this.L.rotate(re,[0,0,1]),this.L.translate([0,i,0]),this.L.rotate(-5*ie,[0,0,1]),this.dl.rotate(2*re,[0,0,1]),this.dl.translate([0,i,0]),this.dl.rotate(-5*ie,[0,0,1]),this.dr.rotate(-2*re,[0,0,1]),this.dr.translate([0,i,0]),this.dr.rotate(-5*ie,[0,0,1]),this.b.rotate(Math.PI,[0,0,1]),this.b.rotate(-2*ie,[0,0,1]),this.d.rotate(3*ie,[0,0,1]),this.d.translate([0,i,0]),this.d.rotate(5*ie,[0,0,1]),this.br.rotate(ie,[0,0,1]),this.br.translate([0,i,0]),this.br.rotate(5*ie,[0,0,1]),this.BR.rotate(-ie,[0,0,1]),this.BR.translate([0,i,0]),this.BR.rotate(-5*ie,[0,0,1]),this.BL.rotate(-3*ie,[0,0,1]),this.BL.translate([0,i,0]),this.BL.rotate(5*ie,[0,0,1]),this.bl.rotate(5*ie,[0,0,1]),this.bl.translate([0,i,0]),this.bl.rotate(-5*ie,[0,0,1]);let r=At();Wt(r,r,-re,[0,0,1]),Ot(r,r,[0,2*i,0]),Wt(r,r,2*re,[0,0,1]),Ot(r,r,[0,-i,0]),[this.d,this.bl,this.BL,this.BR,this.br,this.b].forEach((t=>{$t(t.matrix,r,t.matrix)})),this.faces={U:this.U,F:this.F,R:this.R,dr:this.dr,dl:this.dl,L:this.L,d:this.d,br:this.br,BR:this.BR,BL:this.BL,bl:this.bl,b:this.b},this.group=new Group([this.U,this.F,this.L,this.dr,this.dl,this.R,this.d,this.bl,this.BL,this.BR,this.br,this.b]),this.group.scale([.33,.33,.33]),this.group.translate([-1.3125,0,0])}setColors(t){let{U:e,R:s,F:i,d:r,L:o,b:a,dr:n,dl:h,br:c,BR:l,BL:u,bl:d}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.d,r),this.setFaceColors(this.L,o),this.setFaceColors(this.b,a),this.setFaceColors(this.dr,n),this.setFaceColors(this.dl,h),this.setFaceColors(this.BR,l),this.setFaceColors(this.BL,u),this.setFaceColors(this.bl,d),this.setFaceColors(this.br,c)}oldSetColors(t){const e=this.layers,s=5*e*e-5*e+1;let[i,r,o,a,n,h,c,l,u,d,f,b]=function(t,e){const s=Math.ceil(t.length/e);return new Array(s).fill(null).map(((s,i)=>t.slice(i*e,(i+1)*e)))}(t,s);this.setFaceColors(this.U,i),this.setFaceColors(this.R,r),this.setFaceColors(this.F,o),this.setFaceColors(this.d,c),this.setFaceColors(this.L,h),this.setFaceColors(this.b,b),this.setFaceColors(this.dr,a),this.setFaceColors(this.dl,n),this.setFaceColors(this.br,l),this.setFaceColors(this.BR,u),this.setFaceColors(this.BL,d),this.setFaceColors(this.bl,f)}setFaceColors(t,e){t.faces.forEach(((t,s)=>{e&&e[s]?t.color=e[s]:t.color=v}))}}const ae={2:.3,3:.17,4:.121};class Megaminx{constructor(t=2){this.layers=t;const e=.75,s=Gt(e),i=function(t,e){return ae[e]||t/(1.9*e)}(e,t);this.U=new DividedPentagon(g,t,e,i),this.F=new DividedPentagon(p,t,e,i),this.R=new DividedPentagon(m,t,e,i),this.dr=new DividedPentagon(R,t,e,i),this.dl=new DividedPentagon(F,t,e,i),this.L=new DividedPentagon(k,t,e,i),this.d=new DividedPentagon(y,t,e,i),this.br=new DividedPentagon(E,t,e,i),this.BR=new DividedPentagon(b,t,e,i),this.BL=new DividedPentagon(S,t,e,i),this.bl=new DividedPentagon(C,t,e,i),this.b=new DividedPentagon(w,t,e,i),this.F.translate([0,0,s]),this.b.rotate(Math.PI,[0,0,1]),this.b.rotate(Math.PI,[0,1,0]),this.b.translate([0,0,s]),this.U.rotate(Math.PI,[0,0,1]),this.U.rotate((180-116.57)*Math.PI/180,[1,0,0]),this.U.translate([0,0,s]),this.L.rotate(72*Math.PI/180,[0,0,1]),this.L.rotate(Math.PI,[0,0,1]),this.L.rotate((180-116.57)*Math.PI/180,[1,0,0]),this.L.translate([0,0,s]),this.R.rotate(72*Math.PI/180,[0,0,1]),this.R.rotate(Math.PI/5,[0,0,1]),this.R.rotate((180-116.57)*Math.PI/180,[1,0,0]),this.R.translate([0,0,s]),this.dr.rotate(72*Math.PI/180,[0,0,1]),this.dr.rotate(-Math.PI/5,[0,0,1]),this.dr.rotate((180-116.57)*Math.PI/180,[1,0,0]),this.dr.translate([0,0,s]),this.dl.rotate(72*Math.PI/180,[0,0,1]),this.dl.rotate(-3*Math.PI/5,[0,0,1]),this.dl.rotate((180-116.57)*Math.PI/180,[1,0,0]),this.dl.translate([0,0,s]),this.BL.rotate(Math.PI/5,[0,0,1]),this.BL.rotate(-116.57*Math.PI/180,[1,0,0]),this.BL.translate([0,0,s]),this.BR.rotate(-Math.PI/5,[0,0,1]),this.BR.rotate(-116.57*Math.PI/180,[1,0,0]),this.BR.translate([0,0,s]),this.bl.rotate(3*Math.PI/5,[0,0,1]),this.bl.rotate(-116.57*Math.PI/180,[1,0,0]),this.bl.translate([0,0,s]),this.d.rotate(5*Math.PI/5,[0,0,1]),this.d.rotate(-116.57*Math.PI/180,[1,0,0]),this.d.translate([0,0,s]),this.br.rotate(7*Math.PI/5,[0,0,1]),this.br.rotate(-116.57*Math.PI/180,[1,0,0]),this.br.translate([0,0,s]),this.stickers=[this.U,this.F,this.R,this.dr,this.dl,this.L,this.d,this.br,this.BR,this.BL,this.bl,this.b],this.faces={U:this.U,F:this.F,R:this.R,dr:this.dr,dl:this.dl,L:this.L,d:this.d,br:this.br,BR:this.BR,BL:this.BL,bl:this.bl,b:this.b},this.group=new Group(this.stickers)}setColors(t){let{U:e,R:s,F:i,d:r,L:o,b:a,dr:n,dl:h,br:c,BR:l,BL:u,bl:d}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.d,r),this.setFaceColors(this.L,o),this.setFaceColors(this.b,a),this.setFaceColors(this.dr,n),this.setFaceColors(this.dl,h),this.setFaceColors(this.BR,l),this.setFaceColors(this.BL,u),this.setFaceColors(this.bl,d),this.setFaceColors(this.br,c)}setFaceColors(t,e){t.faces.forEach(((t,s)=>{e&&e[s]?t.color=e[s]:t.color=v}))}}function ne(t,e,s){const i=t/2,r=t/e,o=r/2;let a=[];for(let n=0;n{e&&e[s]?t.faces[0].color=e[s]:t.faces[0].color=v}))}setColors(t){let{U:e,R:s,F:i,L:r,B:o}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.L,r),this.setFaceColors(this.B,o)}rotateBorder(t,e){t.forEach((t=>{t.vertices=t.vertices.map((t=>{return s=t,i=t,r=[0,this.halfStickerWidth,0],o=e,n=[],(a=[])[0]=i[0]-r[0],a[1]=i[1]-r[1],a[2]=i[2]-r[2],n[0]=a[0],n[1]=a[1]*Math.cos(o)-a[2]*Math.sin(o),n[2]=a[1]*Math.sin(o)+a[2]*Math.cos(o),s[0]=n[0]+r[0],s[1]=n[1]+r[1],s[2]=n[2]+r[2],s;var s,i,r,o,a,n})),t.centroid=zt(t.vertices)}))}}class RubiksCubeNet{constructor(t){this.size=t;const e=ne(1,t,b),s=ne(1,t,p),i=ne(1,t,m),r=ne(1,t,g),o=ne(1,t,w),a=ne(1,t,k);this.U=new Group(e),this.U.translate([0,1,0]),this.R=new Group(s),this.R.translate([1,0,0]),this.F=new Group(i),this.D=new Group(r),this.D.translate([0,-1,0]),this.L=new Group(o),this.L.translate([-1,0,0]),this.B=new Group(a),this.B.translate([2,0,0]),this.stickers=[this.U,this.R,this.F,this.D,this.L,this.B],this.faces={U:this.U,R:this.R,F:this.F,D:this.D,L:this.L,B:this.B},this.group=new Group(this.stickers),this.group.translate([-1/4,0,0]),this.group.scale([.5,.5,.5])}setFaceColors(t,e){t.objects.forEach(((t,s)=>{e&&e[s]?t.faces[0].color=e[s]:t.faces[0].color=v}))}setColors(t){let{U:e,R:s,F:i,D:r,L:o,B:a}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.D,r),this.setFaceColors(this.L,o),this.setFaceColors(this.B,a)}}class RubiksCube{constructor(t){this.size=t;const e=1.25,s=.625;this.U=new Group(ne(e,t,b)),this.R=new Group(ne(e,t,p)),this.F=new Group(ne(e,t,m)),this.D=new Group(ne(e,t,g)),this.L=new Group(ne(e,t,w)),this.B=new Group(ne(e,t,k)),this.U.rotate(-Math.PI/2,[0,1,0]),this.U.rotate(-Math.PI/2,[1,0,0]),this.U.translate([0,0,s]),this.R.translate([0,0,s]),this.F.rotate(-Math.PI/2,[0,1,0]),this.F.translate([0,0,s]),this.D.rotate(-Math.PI/2,[0,1,0]),this.D.rotate(Math.PI/2,[1,0,0]),this.D.translate([0,0,s]),this.L.rotate(-Math.PI,[0,1,0]),this.L.translate([0,0,s]),this.B.rotate(Math.PI/2,[0,1,0]),this.B.translate([0,0,s]),this.stickers=[this.U,this.R,this.F,this.D,this.L,this.B],this.faces={U:this.U,R:this.R,F:this.F,D:this.D,L:this.L,B:this.B},this.group=new Group(this.stickers)}setFaceColors(t,e){t.objects.forEach(((t,s)=>{e&&e[s]?t.faces[0].color=e[s]:t.faces[0].color=v}))}setColors(t){let{U:e,R:s,F:i,D:r,L:o,B:a}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.D,r),this.setFaceColors(this.L,o),this.setFaceColors(this.B,a)}}class Arrow extends Object3D{constructor(t,e){super(),this.p1=t,this.p2=e,this.centroid=zt([t,e])}}function ce(t,e,s,i){const r=function(t){return t.reduce(((t,e)=>`${t?t+" ":""}${e[0]}, ${e[1]}`),"")}(e),o=s?s.value:"black",a=s&&s.stroke||"#000000";t.setAttributeNS(null,"points",r),t.setAttributeNS(null,"fill",o),i&&(t.setAttributeNS(null,"stroke",a),t.setAttributeNS(null,"stroke-width",i)),t.setAttributeNS(null,"stroke-linejoin","round")}function le(t,e){return e.reduce(((t,e)=>{return s=t,r=e,o=(i=t)[0],a=i[1],n=i[2],h=(h=r[3]*o+r[7]*a+r[11]*n+r[15])||1,s[0]=(r[0]*o+r[4]*a+r[8]*n+r[12])/h,s[1]=(r[1]*o+r[5]*a+r[9]*n+r[13])/h,s[2]=(r[2]*o+r[6]*a+r[10]*n+r[14])/h,s;var s,i,r,o,a,n,h}),Lt(t))}class CustomSVGRenderer{constructor(t,e,s,i,r,o,a){this.strokeWidth="0.035",this.arrowStrokeWidth="0.03",this.polygons=[],this.lines=[],this.uidToPolygon={},this.uidToLine={},this.arrowColor=a||v,this.domElement=document.createElement("div"),this.domElement.className="svg-renderer",this.svgElement=function(t,e,s,i,r,o){const a=document.createElementNS("http://www.w3.org/2000/svg","svg");return a.setAttributeNS(null,"width",t.toString()),a.setAttributeNS(null,"height",e.toString()),a.setAttributeNS(null,"viewBox",`${s} ${i} ${r} ${o}`),a.setAttributeNS(null,"id","sr-visualizer"),a}(t,e,s,i,r,o);const n=function(t){const e=document.createElementNS("http://www.w3.org/2000/svg","defs"),s=document.createElementNS("http://www.w3.org/2000/svg","marker");s.setAttributeNS(null,"id","arrowhead"),s.setAttributeNS(null,"markerWidth","4"),s.setAttributeNS(null,"markerHeight","3.5"),s.setAttributeNS(null,"refX","3"),s.setAttributeNS(null,"refY","1.75"),s.setAttributeNS(null,"orient","auto");const i=document.createElementNS("http://www.w3.org/2000/svg","polygon");return i.setAttributeNS(null,"points","0 0, 4 1.75, 0 3.5"),i.setAttributeNS(null,"fill",t.value),e.appendChild(s),s.appendChild(i),e}(this.arrowColor);this.svgElement.appendChild(n),this.domElement.appendChild(this.svgElement)}render(t,e){this.polygons=[],this.lines=[],t.objects.forEach((t=>{this.renderObject3D(t,e,[])})),this.renderPolygons(),this.renderLines()}renderPolygons(){this.polygons.sort(((t,e)=>t.centroid[2]-e.centroid[2])),this.polygons.forEach((t=>this.svgElement.appendChild(t.polygon)))}renderLines(){this.lines.forEach((t=>{this.svgElement.appendChild(t)}))}addPolygon(t,e,s,i){if(this.uidToPolygon[e.uid]){ce(this.uidToPolygon[e.uid],t,e.color||s.color,this.strokeWidth)}else this.uidToPolygon[e.uid]=function(t,e,s){const i=document.createElementNS("http://www.w3.org/2000/svg","polygon");return ce(i,t,e,s),i}(t,e.color||s.color,this.strokeWidth);this.polygons.push({polygon:this.uidToPolygon[e.uid],centroid:le(e.centroid,[s.matrix,...i])})}renderObject3D(t,e,s){if(t instanceof Geometry)this.renderGeometry(t,e,s);else if(t instanceof Arrow)this.renderArrow(t,e,s);else if(t instanceof Group){let i=t;this.sortObjects(i.objects,e,[i.matrix,...s]),i.objects.forEach((t=>{this.renderObject3D(t,e,[i.matrix,...s])}))}}renderGeometry(t,e,s){t.faces.forEach((i=>{let r=[];i.indices.map((e=>t.vertices[e])).forEach((i=>{let o=le(i,[t.matrix,...s,e.matrix]),a=Pt(o,o,[1,-1,1]);r.push(a)})),this.addPolygon(r,i,t,s)}))}renderArrow(t,e,s){let i,r=[t.matrix,...s,e.matrix],o=le(t.p1,r),a=le(t.p2,r);this.uidToLine[t.uid]?(i=this.uidToLine[t.uid],i.setAttributeNS(null,"x1",o[0].toString()),i.setAttributeNS(null,"y1",(-o[1]).toString()),i.setAttributeNS(null,"x2",a[0].toString()),i.setAttributeNS(null,"y2",(-a[1]).toString())):(i=function(t,e,s,i){const r=document.createElementNS("http://www.w3.org/2000/svg","line");let o=s?s.value:v.value;return r.setAttributeNS(null,"x1",t[0].toString()),r.setAttributeNS(null,"y1",(-t[1]).toString()),r.setAttributeNS(null,"x2",e[0].toString()),r.setAttributeNS(null,"y2",(-e[1]).toString()),r.setAttributeNS(null,"stroke",o),r.setAttributeNS(null,"marker-end","url(#arrowhead)"),i&&r.setAttributeNS(null,"stroke-width",i),r}(o,a,this.arrowColor,this.arrowStrokeWidth),this.uidToLine[t.uid]=i),this.lines.push(i)}sortFaces(t,e,s){t.sort(((t,i)=>{let r=[e.matrix,...s],o=[e.matrix,...s],a=le(t.centroid,r),n=le(i.centroid,o);return a[2]-n[2]}))}sortObjects(t,e,s){t.sort(((t,e)=>{let i=[t.matrix,...s],r=[e.matrix,...s],o=le(t.centroid,i),a=le(e.centroid,r);return o[2]-a[2]}))}}class Camera{constructor(){var t,e,s,i,r,o,a;this.matrix=At(),t=this.matrix,e=Math.PI/2,s=1,i=.1,r=1e3,a=1/Math.tan(e/2),t[0]=a/s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=r&&r!==1/0?(o=1/(i-r),t[10]=(r+i)*o,t[14]=2*r*i*o):(t[10]=-1,t[14]=-2*i),Ot(this.matrix,this.matrix,[0,0,-5]),jt(this.matrix,this.matrix,[4,4,1])}}class Scene{constructor(){this.objects=[]}add(t){this.objects.push(t)}clear(){this.objects=[]}}var ue;!function(t){t.CUBE="cube",t.CUBE_NET="cube-net",t.CUBE_TOP="cube-top",t.MEGAMINX="megaminx",t.MEGAMINX_NET="megaminx-net",t.MEGAMINX_TOP="megaminx-top",t.PYRAMINX="pyraminx",t.PYRAMINX_NET="pyraminx-net",t.SKEWB="skewb",t.SKEWB_NET="skewb-net",t.SQUARE1="square1",t.SQUARE1_NET="square1-net"}(ue||(ue={}));const de={size:3,scheme:{U:b,R:p,F:m,D:g,L:w,B:k},rotations:[{x:0,y:45,z:0},{x:34,y:0,z:0}]},fe={size:2,scheme:{U:g,F:p,R:m,dr:R,dl:F,L:k,d:y,br:E,BR:b,BL:S,bl:C,b:w}},be={size:3,scheme:{left:m,right:k,top:b,back:p},rotations:[{x:0,y:0,z:60},{x:-60,y:0,z:0}]},pe={scheme:{top:b,front:m,right:p,back:k,left:w,bottom:g},rotations:[{x:0,y:45,z:0},{x:34,y:0,z:0}]},me={scheme:Y,rotations:[{x:0,y:0,z:-34},{x:-56,y:0,z:0}]};!function(){var t,e=(t=new Rt(4),Rt!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0),t)}();function ge(){var t=new Rt(4);return Rt!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t[3]=1,t}function we(t,e,s,i){var r,o,a,n,h,c=e[0],l=e[1],u=e[2],d=e[3],f=s[0],b=s[1],p=s[2],m=s[3];return c*f+l*b+u*p+d*m<0&&(-o,-f,-b,-p,-m),1-o>Et?(Math.acos(o),Math.sin(r),Math.sin((1-i)*r)/a,Math.sin(i*r)/a):(1-i,i),t[0]=n*c+h*f,t[1]=n*l+h*b,t[2]=n*u+h*p,t[3]=n*d+h*m,t}var ke,Se,ye,Ce,Fe,Ee,Re,ve=function(t,e){var s=e[0],i=e[1],r=e[2],o=e[3],a=s*s+i*i+r*r+o*o;return a>0&&(a=1/Math.sqrt(a)),t[0]=s*a,t[1]=i*a,t[2]=r*a,t[3]=o*a,t};ke=vt(),Se=Mt(1,0,0),ye=Mt(0,1,0),Ce=ge(),Fe=ge(),Ee=new Rt(9),Rt!=Float32Array&&(Ee[1]=0,Ee[2]=0,Ee[3]=0,Ee[5]=0,Ee[6]=0,Ee[7]=0),Ee[0]=1,Ee[4]=1,Ee[8]=1,Re=Ee;function Le(t){if(t.alg&&"string"!=typeof t.alg&&(console.warn(`Inavlid alg ${t.alg}. alg must be a string`),t.alg=""),t.case&&"string"!=typeof t.case&&(console.warn(`Inavlid case ${t.case}. case must be a string`),t.case=""),t.scheme&&("object"!=typeof t.scheme||Array.isArray(t.scheme)?(console.warn(`Invalid scheme ${t.scheme}. scheme must be an object`),t.scheme={}):Object.keys(t.scheme).forEach((e=>{const s=t.scheme[e];null!=s&&"object"==typeof s&&s.value||(console.warn(`Invalid scheme color ${s}. must be an type IColor`),t.scheme[e]=v)}))),t.mask&&("object"!=typeof t.mask||Array.isArray(t.mask)?(console.warn(`Invalid mask ${t.mask}. scheme must be an object`),t.mask={}):Object.keys(t.mask).forEach((e=>{const s=t.mask[e];if(Array.isArray(s)){for(let i=0;i{const s=t.stickerColors[e];if(Array.isArray(s)){for(let i=0;i{e&&e[s]?t.color=e[s]:t.color=v}))}removeHiddenStickers(){this.F.faces=this.F.faces.slice(2,5),this.BL.faces=this.BL.faces.slice(8,11),this.L.faces=this.L.faces.slice(4,7),this.R.faces=[this.R.faces[1],this.R.faces[2],this.R.faces[10]],this.BR.faces=this.BR.faces.slice(6,9)}}function Ie(t){const e=new Square1Simualtor(t.scheme);return t.case?e.case(t.case):t.alg&&e.alg(t.alg),e}function xe(t,e){switch(t){case ue.CUBE:return function(t={}){return[new RubiksCube(t.size),new RubiksCubeSimulator(t.size)]}(e);case ue.CUBE_NET:return function(t={}){return[new RubiksCubeNet(t.size),new RubiksCubeSimulator(t.size)]}(e);case ue.CUBE_TOP:return function(t={}){return[new RubiksCubeTopLayer(t.size),new RubiksCubeSimulator(t.size)]}(e);case ue.MEGAMINX:return function(t={}){return[new Megaminx(t.size),new MegaminxSimulator]}(e);case ue.MEGAMINX_NET:return function(t={}){return[new MegaminxNet(t.size),new MegaminxSimulator]}(e);case ue.MEGAMINX_TOP:return[new MegaminxTop,new MegaminxSimulator];case ue.PYRAMINX:return function(t={}){return[new Pyraminx(t.size),new PyraminxSimulator]}(e);case ue.PYRAMINX_NET:return function(t={}){return[new PyraminxNet(t.size),new PyraminxSimulator]}(e);case ue.SKEWB:return[new Skewb,new SkewbSimulator];case ue.SKEWB_NET:return[new SkewbNet,new SkewbSimulator];case ue.SQUARE1:return function(t={}){const e=Ie(t);return[new Square1(e.topLayer,e.bottomLayer,e.middleRotated),e]}(e);case ue.SQUARE1_NET:return function(t={}){const e=Ie(t);return[new Square1Net(e.topLayer,e.bottomLayer,e.middleRotated),e]}(e)}}function Ne(t){return t===ue.SQUARE1||t===ue.SQUARE1_NET}function De(t,e){return function(t){return t===ue.PYRAMINX||t===ue.PYRAMINX_NET}(t)?3===e:!function(t){return t===ue.MEGAMINX||t===ue.MEGAMINX_NET||t===ue.MEGAMINX_TOP}(t)||2===e}class Visualizer{constructor(t,e,s={}){this.type=e,this.camera=new Camera,this.scene=new Scene,this.renderer=t,this.setPuzzleOptions(s),this.render()}applyColors(){const t=this.options.stickerColors&&!Ne(this.type),e=De(this.type,this.options.size);if(t)this.puzzleGeometry.setColors(this.options.stickerColors);else if(e)this.applySimulatorColors();else{const t=this.puzzleGeometry.faces;Object.keys(t).forEach((e=>{const s=t[e],i=this.options.scheme[e];s instanceof Geometry?s.faces.forEach((t=>t.color=i)):s instanceof Group&&s.objects.forEach((t=>t.color=i))}))}}applySimulatorColors(){this.options.mask&&this.applyMask(this.options),(this.options.alg||this.options.case)&&this.applyAlgorithm();const t=function(t,e){return Object.keys(t).reduce(((s,i)=>(s[i]=t[i].map((t=>e[t]||L)),s)),{})}(this.simulator.getValues(),this.options.scheme);this.puzzleGeometry.setColors(t)}applyAlgorithm(){Ne(this.type)||(this.options.case?this.simulator.case(this.options.case):this.options.alg&&this.simulator.alg(this.options.alg))}applyMask(t){Object.keys(t.mask).forEach((e=>{t.mask[e].forEach((t=>this.simulator.setValue(e,t,"mask")))}))}buildGroupMatrix(){if(this.options.rotations){let t=At();this.options.rotations.forEach((e=>{const{x:s=0,y:i=0,z:r=0}=e;$t(t,function(t,e){var s=e[0],i=e[1],r=e[2],o=e[3],a=s+s,n=i+i,h=r+r,c=s*a,l=i*a,u=i*n,d=r*a,f=r*n,b=r*h,p=o*a,m=o*n,g=o*h;return t[0]=1-u-b,t[1]=l+g,t[2]=d-m,t[3]=0,t[4]=l-g,t[5]=1-c-b,t[6]=f+p,t[7]=0,t[8]=d+m,t[9]=f-p,t[10]=1-c-u,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}(At(),function(t,e,s,i){var r=.5*Math.PI/180;e*=r,s*=r,i*=r;var o=Math.sin(e),a=Math.cos(e),n=Math.sin(s),h=Math.cos(s),c=Math.sin(i),l=Math.cos(i);return t[0]=o*h*l-a*n*c,t[1]=a*n*l+o*h*c,t[2]=a*h*c-o*n*l,t[3]=a*h*l+o*n*c,t}(ge(),s,i,r)),t)})),$t(this.puzzleGeometry.group.matrix,At(),t)}if(this.options.scale){let t=this.options.scale;jt(this.puzzleGeometry.group.matrix,this.puzzleGeometry.group.matrix,Mt(t,t,t))}if(this.options.translation){const{x:t=0,y:e=0,z:s=0}=this.options.translation;let i=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=e[0],t[13]=e[1],t[14]=e[2],t[15]=1,t}(At(),Mt(t,e,s));$t(this.puzzleGeometry.group.matrix,i,this.puzzleGeometry.group.matrix)}}addArrows(){this.options.arrows&&this.options.arrows.forEach((t=>{try{this.scene.add(function(t,e){var s,i,r,o,a,n,h,c;let l=e.faces[t.start.face],u=e.faces[t.end.face];if(!l||!u)throw new Error(`Invalid arrow definition ${JSON.stringify(t)}`);let d,f,b=[l.matrix,e.group.matrix],p=[u.matrix,e.group.matrix];if(l instanceof Geometry&&u instanceof Geometry?(d=null===(s=l.faces[t.start.sticker])||void 0===s?void 0:s.centroid,f=null===(i=u.faces[t.end.sticker])||void 0===i?void 0:i.centroid):(e instanceof Square1?(d=null===(r=l.objects[t.start.sticker])||void 0===r?void 0:r.faces[0].centroid,f=null===(o=u.objects[t.end.sticker])||void 0===o?void 0:o.faces[0].centroid):(d=null===(a=l.objects[t.start.sticker])||void 0===a?void 0:a.centroid,f=null===(n=u.objects[t.end.sticker])||void 0===n?void 0:n.centroid),b.unshift(null===(h=l.objects[t.start.sticker])||void 0===h?void 0:h.matrix),p.unshift(null===(c=u.objects[t.end.sticker])||void 0===c?void 0:c.matrix)),!d||!f)throw new Error(`Invalid arrow definition ${JSON.stringify(t)}`);let m=le(d,b),g=le(f,p);return new Arrow(m,g)}(t,this.puzzleGeometry))}catch(e){console.warn(`Invalid arrow ${JSON.stringify(t)}`)}}))}setPuzzleOptions(t){this.options=Object.assign(Object.assign({},function(t){switch(t){case ue.CUBE:return de;case ue.CUBE_NET:case ue.CUBE_TOP:return Object.assign(Object.assign({},de),{rotations:null});case ue.MEGAMINX:case ue.MEGAMINX_NET:case ue.MEGAMINX_TOP:return fe;case ue.PYRAMINX:return be;case ue.PYRAMINX_NET:return Object.assign(Object.assign({},be),{rotations:null});case ue.SKEWB:return pe;case ue.SKEWB_NET:return Object.assign(Object.assign({},pe),{rotations:null});case ue.SQUARE1:return me;case ue.SQUARE1_NET:return Object.assign(Object.assign({},me),{rotations:null});default:throw new Error(`Could not get default options for puzzle ${t}`)}}(this.type)),t),Le(this.options),[this.puzzleGeometry,this.simulator]=xe(this.type,this.options),this.buildGroupMatrix(),this.applyColors(),this.scene.clear(),this.scene.add(this.puzzleGeometry.group),this.addArrows()}render(){this.renderer.render(this.scene,this.camera)}}const Ue={width:500,height:500,minx:-.9,miny:-.9,svgWidth:1.8,svgHeight:1.8,strokeWidth:.02,arrowColor:y,arrowStrokeWidth:.03};function Ge(t,e,s={}){return new SvgVisualizer(t,e,s)}class SvgVisualizer extends Visualizer{constructor(t,e,s={}){if(s=Object.assign(Object.assign({},Ue),s),"string"==typeof t&&null===(t=document.querySelector(t)))throw new Error(`Could not find visuzlier element by query selector: ${t}`);const i=new CustomSVGRenderer(s.width,s.height,s.minx,s.miny,s.svgWidth,s.svgHeight,s.arrowColor);i.strokeWidth=""+s.strokeWidth,t.appendChild(i.domElement),super(i,e,s.puzzle),this.svgOptions=s}setStrokeWidth(t){this.svgOptions.strokeWidth=t,this.renderer.strokeWidth=""+this.svgOptions.strokeWidth,this.render()}setSvgOptions(t){this.svgOptions=Object.assign(Object.assign({},Ue),t),function(t){Number.isInteger(t.width)||(console.warn(`invalid svg width ${t.width}. Must be a whole number`),t.width=Ue.width);Number.isInteger(t.height)||(console.warn(`invalid svg height ${t.height}. Must be a whole number`),t.width=Ue.height);Number.isFinite(t.minx)||(console.warn(`invalid svg minx ${t.minx}`),t.minx=Ue.minx);Number.isFinite(t.miny)||(console.warn(`invalid svg miny ${t.miny}`),t.minx=Ue.miny);Number.isFinite(t.svgWidth)||(console.warn(`invalid svgWidth ${t.svgWidth}`),t.minx=Ue.svgWidth);Number.isFinite(t.svgHeight)||(console.warn(`invalid svgHeight ${t.svgHeight}`),t.minx=Ue.svgHeight);Number.isFinite(t.strokeWidth)||(console.warn(`invalid strokeWidth ${t.strokeWidth}`),t.minx=Ue.strokeWidth);Number.isFinite(t.arrowStrokeWidth)||(console.warn(`invalid arrowStrokeWidth ${t.arrowStrokeWidth}`),t.minx=Ue.arrowStrokeWidth);t.arrowColor&&!Me(t.arrowColor)&&(t.arrowColor=v)}(this.svgOptions);const e=this.renderer,s=e.svgElement;e.strokeWidth=""+this.svgOptions.strokeWidth,e.arrowStrokeWidth=""+this.svgOptions.arrowStrokeWidth,s.setAttributeNS(null,"width",this.svgOptions.width.toString()),s.setAttributeNS(null,"height",this.svgOptions.width.toString()),s.setAttributeNS(null,"viewBox",`${this.svgOptions.minx} ${this.svgOptions.miny} ${this.svgOptions.svgWidth} ${this.svgOptions.svgHeight}`),this.render()}}const ze={width:500,height:500,minx:-.9,miny:-.9,svgWidth:1.8,svgHeight:1.8,strokeWidth:.02,arrowColor:y,arrowStrokeWidth:.03};function Ae(t,e,s={}){if("string"==typeof t&&null===(t=document.querySelector(t)))throw new Error(`Could not find visuzlier element by query selector: ${t}`);let i=document.createElement("div");s=Object.assign(Object.assign({},ze),s),Ge(i,e,s),setTimeout((()=>{let e=i.querySelector("svg"),r=document.createElement("img");t.appendChild(r);let o=document.createElement("canvas"),a=o.getContext("2d"),n=new Image;n.width=o.width=r.width=s.width,n.height=o.height=r.height=s.height,n.onload=function(){a.drawImage(n,0,0,n.width,n.height),r.src=o.toDataURL()};var h=(new XMLSerializer).serializeToString(e);n.src=`data:image/svg+xml,${encodeURIComponent(h)}`}))}const Oe={CUBE_3:{LAST_LAYER:{F:[3,4,5,6,7,8],B:[3,4,5,6,7,8],R:[3,4,5,6,7,8],L:[3,4,5,6,7,8],D:[0,1,2,3,4,5,6,7,8]},F2L:{F:[0,1,2],B:[0,1,2],R:[0,1,2],L:[0,1,2],U:[0,1,2,3,4,5,6,7,8]},FIRST_LAYER:{F:[0,1,2,3,4,5],B:[0,1,2,3,4,5],R:[0,1,2,3,4,5],L:[0,1,2,3,4,5],U:[0,1,2,3,4,5,6,7,8]},OLL:{R:[0,1,2,3,4,5,6,7,8],F:[0,1,2,3,4,5,6,7,8],D:[0,1,2,3,4,5,6,7,8],L:[0,1,2,3,4,5,6,7,8],B:[0,1,2,3,4,5,6,7,8]},CORNERS_LAST_LAYER:{U:[1,3,5,7],F:[1,3,4,5,6,7,8],B:[1,3,4,5,6,7,8],R:[1,3,4,5,6,7,8],L:[1,3,4,5,6,7,8],D:[0,1,2,3,4,5,6,7,8]},EDGES_LAST_LAYER:{U:[0,2,6,8],F:[0,2,3,4,5,6,7,8],B:[0,2,3,4,5,6,7,8],R:[0,2,3,4,5,6,7,8],L:[0,2,3,4,5,6,7,8],D:[0,1,2,3,4,5,6,7,8]}},MEGA_3:{OLL:{F:[0,1,2,3,4,5,6,7,8,9,10],R:[0,1,2,3,4,5,6,7,8,9,10],L:[0,1,2,3,4,5,6,7,8,9,10],BR:[0,1,2,3,4,5,6,7,8,9,10],BL:[0,1,2,3,4,5,6,7,8,9,10],d:[0,1,2,3,4,5,6,7,8,9,10],b:[0,1,2,3,4,5,6,7,8,9,10],dl:[0,1,2,3,4,5,6,7,8,9,10],dr:[0,1,2,3,4,5,6,7,8,9,10],bl:[0,1,2,3,4,5,6,7,8,9,10],br:[0,1,2,3,4,5,6,7,8,9,10]}}},je={Scene,Camera,CustomSVGRenderer},We={RubiksCube,RubiksCubeNet,RubiksCubeTopLayer,Megaminx,MegaminxNet,Pyraminx,PyraminxNet,Skewb,SkewbNet,Square1,Square1Net},$e={RubiksCubeSimulator,MegaminxSimulator,PyraminxSimulator,SkewbSimulator,Square1Simualtor},_e={TurnType:i,parseCubeAlgorithm:l,parseMegaminxAlgorithm:mt,parsePyraminxAlgorithm:ut,parseSkewbAlgorithm:st,parseSquare1Algorithm:Q}}},e={};function s(i){if(e[i])return e[i].exports;var r=e[i]={exports:{}};return t[i](r,r.exports,s),r.exports}return s.d=(t,e)=>{for(var i in e)s.o(e,i)&&!s.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},s.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),s.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},s(302)})()})); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.puzzleGen=e():t.puzzleGen=e()}(this,(function(){return(()=>{"use strict";var t={170:(t,e,s)=>{s.r(e),s.d(e,{Algorithm:()=>Se,Canvas:()=>be,CanvasVisualizer:()=>CanvasVisualizer,Colors:()=>a,Masks:()=>ge,PNG:()=>ve,PuzzleGeometry:()=>ye,Rendering:()=>we,SVG:()=>fe,Simulator:()=>Ee,SvgVisualizer:()=>SvgVisualizer,Type:()=>Kt,Visualizer:()=>Visualizer,validColor:()=>ie,validatePuzzleOptions:()=>se});var i,r,o,a={};s.r(a),s.d(a,{BLACK:()=>F,BLUE:()=>p,BLUE_STICKERLESS:()=>P,DARK_BLUE:()=>S,DARK_BLUE_STICKERLESS:()=>_,GREEN:()=>w,GREEN_STICKERLESS:()=>B,GREY:()=>E,GREY_STICKERLESS:()=>N,LIGHT_GREEN:()=>C,LIGHT_GREEN_STICKERLESS:()=>U,LIGHT_YELLOW:()=>k,LIGHT_YELLOW_STICKERLESS:()=>z,MASK_COLOR:()=>M,ORANGE:()=>g,ORANGE_STICKERLESS:()=>V,PINK:()=>R,PINK_STICKERLESS:()=>A,PURPLE:()=>y,PURPLE_STICKERLESS:()=>I,RED:()=>v,RED_STICKERLESS:()=>x,WHITE:()=>b,WHITE_STICKERLESS:()=>T,YELLOW:()=>m,YELLOW_STICKERLESS:()=>L}),function(t){t[t.Clockwise=0]="Clockwise",t[t.CounterClockwise=1]="CounterClockwise",t[t.Double=2]="Double"}(i||(i={})),function(t){t.Clockwise="",t.CounterClockwise="'",t.Double="2"}(r||(r={})),function(t){t.F="F",t.U="U",t.R="R",t.L="L",t.D="D",t.B="B",t.M="M",t.E="E",t.S="S",t.X="x",t.Y="y",t.Z="z"}(o||(o={}));const h=[o.F,o.U,o.R,o.L,o.D,o.B,o.M,o.E,o.S,o.X,o.Y,o.Z],n=[o.X,o.Y,o.Z],l=/([0-9]+)?([UuFfRrDdLlBbMESxyz])(w)?([2\'])?/g;function c(t){if(!t)return[];let e,s=[];for(;e=l.exec(t);){let t=e[1],i=e[2],o=e[3],a=e[4]||r.Clockwise,h=i===i.toLowerCase()&&-1===n.indexOf(i);h&&(i=i.toUpperCase());let l={unit:d(i),turnType:f(a),slices:h?2:u(t,o)};s.push(l)}return s}function u(t,e){if(e&&!t)return 2;if(!e&&t)throw new Error("Invalid move: Cannot specify num slices if outer block move indicator 'w' is not present");if(e||t){const e=parseInt(t);if(e>1)return e;throw new Error(`Invalid outer block move (${e}) must be greater than 1`)}return 1}function d(t){if(h.indexOf(t)<0)throw new Error(`Invalid move (${t}): Possible turn faces are [U R F L D B M E S x y z]`);return t}function f(t){switch(t){case r.Clockwise:return i.Clockwise;case r.CounterClockwise:return i.CounterClockwise;case r.Double:return i.Double;default:throw new Error(`Invalid move modifier (${t})`)}}class Simulator{constructor(){this.stickers=new Map,this.faces=new Map,this.turns=new Map}addFace(t,e){if(e&&this.faces.has(e))throw`Face ${e} already exists`;e||(e=(this.faces.size+1).toString());const s=t.reduce(((t,e)=>{const s=(this.stickers.size+1).toString();return this.stickers.set(s,e),t.push(s),t}),[]);return this.faces.set(e,s),{faceId:e,stickerIds:s}}addTurn(t,e){if(e&&this.turns.has(e))throw`Turn ${e} already exists`;return e||(e=(this.turns.size+1).toString()),this.turns.set(e,t),e}doTurn(t,e=!1){const s=this.turns.get(t);if(!s)throw`Unknown turn ${t}`;let i=e?1:0,r=e?0:1,o={};s.forEach((t=>{o[t[r]]=this.stickers.get(t[r]),this.stickers.set(t[r],o[t[i]]||this.stickers.get(t[i]))}))}isSolved(){const t=this.faces.entries();let e=t.next();do{const s=e.value[1];let i=this.stickers.get(s[0]);for(let t of s)if(i!=this.stickers.get(t))return!1;e=t.next()}while(!e.done);return!0}getValues(){let t={};return this.faces.forEach(((e,s)=>{t[s]=e.map((t=>this.stickers.get(t)))})),t}setValue(t,e,s){if(!this.faces.has(t))return void console.warn(`attempting to set sticker value on invalid face: ${t}`);let i=this.faces.get(t),r=i[e];i?this.stickers.set(r,s):console.warn(`attempting to set sticker value for invalid sticker: ${t} ${e}`)}alg(t){t&&t.split(" ").forEach((t=>this.doTurn(t)))}case(t){}reset(){this.faces.forEach(((t,e)=>{t.forEach((t=>{this.stickers.set(t,e)}))}))}}const m={value:"#FFFF00"},v={value:"#FF0000"},p={value:"#0000FF"},b={value:"#FFFFFF"},g={value:"#FFA500"},w={value:"#00FF00"},y={value:"#800080"},E={value:"#808080"},S={value:"#00008B"},k={value:"#ffffb3"},C={value:"#32CD32"},R={value:"#FF69B4"},F={value:"#000000"},M={value:"#404040"},L={value:"#FFFF00",stroke:"#DDDD00"},x={value:"#FF0000",stroke:"#DD0000"},P={value:"#0000FF",stroke:"#0000DD"},T={value:"#FFFFFF",stroke:"#DDD"},V={value:"#FFA500",stroke:"#DD8500"},B={value:"#00FF00",stroke:"#00DD00"},I={value:"#800080",stroke:"#5c005c"},N={value:"#808080",stroke:"#6b6b6b"},_={value:"#00008B",stroke:"#000075"},z={value:"#ffffb3",stroke:"#e6e6a3"},U={value:"#32CD32",stroke:"#2db32d"},A={value:"#FF69B4",stroke:"#de5b9c"};var D;!function(t){t[t.CORNER=0]="CORNER",t[t.EDGE=1]="EDGE",t[t.MIDDLE=2]="MIDDLE"}(D||(D={}));class vector_Vector3{constructor(t,e,s){this.x=t,this.y=e,this.z=s}static fromValues(t,e,s){return new vector_Vector3(t,e,s)}transformMat4(t){let e=t.values[3]*this.x+t.values[7]*this.y+t.values[11]*this.z+t.values[15];e=e||1;const s=(t.values[0]*this.x+t.values[4]*this.y+t.values[8]*this.z+t.values[12])/e,i=(t.values[1]*this.x+t.values[5]*this.y+t.values[9]*this.z+t.values[13])/e,r=(t.values[2]*this.x+t.values[6]*this.y+t.values[10]*this.z+t.values[14])/e;this.x=s,this.y=i,this.z=r}multiply(t,e,s){this.x=this.x*t,this.y=this.y*e,this.z=this.z*s}rotateX(t,e){let s=this.x-t.x,i=this.y-t.y,r=this.z-t.z;return this.x=s,this.y=i*Math.cos(e)-r*Math.sin(e),this.z=i*Math.sin(e)+r*Math.cos(e),this.x+=t.x,this.y+=t.y,this.z+=t.z,this}rotateZ(t,e){let s=this.x-t.x,i=this.y-t.y,r=this.z-t.z;return this.x=s*Math.cos(e)-i*Math.sin(e),this.y=s*Math.sin(e)+i*Math.cos(e),this.z=r,this.x+=t.x,this.y+=t.y,this.z+=t.z,this}clone(){return vector_Vector3.fromValues(this.x,this.y,this.z)}}class Vector2{constructor(t,e){this.x=t,this.y=e}static fromValues(t,e){return new Vector2(t,e)}}const G=vector_Vector3.fromValues(.92875,-.24803,0),O=m,W=b,j=v,$=p,X=w,q=g,H={top:O,front:j,bottom:W,left:$,right:X,back:q},Y=[{type:D.CORNER,colors:[O,j,$]},{type:D.EDGE,colors:[O,$]},{type:D.CORNER,colors:[O,$,q]},{type:D.EDGE,colors:[O,q]},{type:D.CORNER,colors:[O,q,X]},{type:D.EDGE,colors:[O,X]},{type:D.CORNER,colors:[O,X,j]},{type:D.EDGE,colors:[O,j]}],K=[{type:D.EDGE,colors:[W,q]},{type:D.CORNER,colors:[W,q,$]},{type:D.EDGE,colors:[W,$]},{type:D.CORNER,colors:[W,$,j]},{type:D.EDGE,colors:[W,j]},{type:D.CORNER,colors:[W,j,X]},{type:D.EDGE,colors:[W,X]},{type:D.CORNER,colors:[W,X,q]}],Z=/((\()?(-?\d)\s*,\s*(-?\d)(\))?)|(\/)/g;function Q(t){let e,s=[];for(;e=Z.exec(t);)"/"===e[0]?s.push({slice:!0}):s.push({top:parseInt(e[3]),bottom:parseInt(e[4])});return s}const J={[D.CORNER]:2,[D.EDGE]:1};class Square1Simualtor extends Simulator{constructor(t=H){super(),this.scheme=t,this.topLayer=function(t){return[{type:D.CORNER,colors:[t.top||O,t.front||j,t.left||$]},{type:D.EDGE,colors:[t.top||O,t.left||$]},{type:D.CORNER,colors:[t.top||O,t.left||$,t.back||q]},{type:D.EDGE,colors:[t.top||O,t.back||q]},{type:D.CORNER,colors:[t.top||O,t.back||q,t.right||X]},{type:D.EDGE,colors:[t.top||O,t.right||X]},{type:D.CORNER,colors:[t.top||O,t.right||X,t.front||j]},{type:D.EDGE,colors:[t.top||O,t.front||j]}]}(this.scheme),this.bottomLayer=function(t){return[{type:D.EDGE,colors:[t.bottom||W,t.back||q]},{type:D.CORNER,colors:[t.bottom||W,t.back||q,t.left||$]},{type:D.EDGE,colors:[t.bottom||W,t.left||$]},{type:D.CORNER,colors:[t.bottom||W,t.left||$,t.front||j]},{type:D.EDGE,colors:[t.bottom||W,t.front||j]},{type:D.CORNER,colors:[t.bottom||W,t.front||j,t.right||X]},{type:D.EDGE,colors:[t.bottom||W,t.right||X]},{type:D.CORNER,colors:[t.bottom||W,t.right||X,t.back||q]}]}(this.scheme),this.middleRotated=!1}alg(t){Q(t).forEach((t=>{"slice"in t?this.slice():(this.rotateTop(t.top),this.rotateBottom(t.bottom))}))}case(t){Q(t).reverse().forEach((t=>{"slice"in t?this.slice():(this.rotateTop(-1*t.top),this.rotateBottom(-1*t.bottom))}))}slice(){let t=0,e=0,s=0;for(let e=this.topLayer.length;e>0&&s<6;e--)s+=J[this.topLayer[e-1].type],t++;if(6!=s)throw"Cannot perform slice move. Top layer misaligned";s=0;for(let t=this.bottomLayer.length;t>0&&s<6;t--)s+=J[this.bottomLayer[t-1].type],e++;if(6!=s)throw"Cannot perform slice move. Bottom layer misaligned";const i=this.topLayer.splice(this.topLayer.length-t,this.topLayer.length),r=this.bottomLayer.splice(this.bottomLayer.length-e,this.bottomLayer.length);this.topLayer=this.topLayer.concat(r),this.bottomLayer=this.bottomLayer.concat(i),this.middleRotated=!this.middleRotated}rotateTop(t){const e=t;for(;0!=t;)if(t<0){const s=this.topLayer.shift(),i=J[s.type];if(Math.abs(t)Object.assign(Object.assign({},t),{turnType:t.turnType===i.Clockwise?i.CounterClockwise:i.Clockwise})));this.doTurns(e)}doTurns(t){t.forEach((t=>{let e=t.turnType===i.CounterClockwise;switch(t.unit){case"R":this.R(e);break;case"U":this.U(e);break;case"L":this.L(e);break;case"B":this.B(e)}}))}}const rt=t=>t[0],ot=t=>t[1],at=t=>t[2],ht=t=>t[3],nt=t=>t[4],lt=/([LlRrUuBb])(\'?)/g,ct={"":i.Clockwise,"'":i.CounterClockwise};function ut(t){let e,s=[];for(;e=lt.exec(t);){const t=e[1],i=e[2];s.push({unit:t,turnType:ct[i],slices:1})}return s}class PyraminxSimulator extends Simulator{constructor(){super();const{stickerIds:t}=this.addFace(it(9,"top"),"top"),{stickerIds:e}=this.addFace(it(9,"left"),"left"),{stickerIds:s}=this.addFace(it(9,"right"),"right"),{stickerIds:i}=this.addFace(it(9,"back"),"back");this.addTurn([[t[8],s[8]],[s[8],e[8]],[e[8],t[8]]],"u"),this.addTurn([[e[0],i[8]],[i[8],t[4]],[t[4],e[0]]],"l"),this.addTurn([[e[4],s[0]],[s[0],i[4]],[i[4],e[4]]],"r"),this.addTurn([[s[4],t[0]],[t[0],i[0]],[i[0],s[4]]],"b"),this.addTurn([[t[5],s[5]],[t[6],s[6]],[t[7],s[7]],[t[8],s[8]],[s[5],e[5]],[s[6],e[6]],[s[7],e[7]],[s[8],e[8]],[e[5],t[5]],[e[6],t[6]],[e[7],t[7]],[e[8],t[8]]],"U"),this.addTurn([[e[0],i[8]],[e[1],i[6]],[e[2],i[5]],[e[5],i[7]],[i[8],t[4]],[i[6],t[3]],[i[5],t[7]],[i[7],t[2]],[t[4],e[0]],[t[3],e[1]],[t[7],e[2]],[t[2],e[5]]],"L"),this.addTurn([[e[2],s[5]],[e[3],s[1]],[e[4],s[0]],[e[7],s[2]],[s[5],i[2]],[s[1],i[3]],[s[0],i[4]],[s[2],i[7]],[i[2],e[2]],[i[3],e[3]],[i[4],e[4]],[i[7],e[7]]],"R"),this.addTurn([[s[2],t[5]],[s[3],t[1]],[s[4],t[0]],[s[7],t[2]],[t[5],i[5]],[t[1],i[1]],[t[0],i[0]],[t[2],i[2]],[i[5],s[2]],[i[1],s[3]],[i[0],s[4]],[i[2],s[7]]],"B")}U(t){this.doTurn("U",t)}R(t){this.doTurn("R",t)}L(t){this.doTurn("L",t)}B(t){this.doTurn("B",t)}u(t){this.doTurn("u",t)}r(t){this.doTurn("r",t)}l(t){this.doTurn("l",t)}b(t){this.doTurn("b",t)}alg(t){t&&this.doTurns(ut(t))}case(t){if(!t)return;let e=ut(t).reverse().map((t=>Object.assign(Object.assign({},t),{turnType:t.turnType===i.Clockwise?i.CounterClockwise:i.Clockwise})));this.doTurns(e)}doTurns(t){t.forEach((t=>{let e=t.turnType===i.CounterClockwise;switch(t.unit){case"R":this.R(e);break;case"r":this.r(e);break;case"U":this.U(e);break;case"u":this.u(e);break;case"L":this.L(e);break;case"l":this.l(e);break;case"B":this.B(e);break;case"b":this.b(e)}}))}}const dt=["U","R","F","dr","dl","L","d","br","BR","BL","bl","b"],ft=/([RD])([\+\+|\-\-]+)|([UFRL]|BR|BL)([2-3]?)(\'?)/g;var mt;!function(t){t.Clockwise="++",t.CounterClockwise="--",t.FaceClockwise="",t.FaceCounter="'"}(mt||(mt={}));const vt={[mt.Clockwise]:i.Clockwise,[mt.CounterClockwise]:i.CounterClockwise,[mt.FaceClockwise]:i.Clockwise,[mt.FaceCounter]:i.CounterClockwise};function pt(t){if(!t)return[];let e,s=[];for(;e=ft.exec(t);){const t=e[1]?`${e[1]}xx`:e[3],i=e[2]||e[5],r=e[4];s.push({unit:t,turnType:vt[i],slices:1,n:r?parseInt(r):1})}return s}class MegaminxSimulator extends Simulator{constructor(){super(),dt.forEach((t=>{this.addFace(it(11,t),t)}));const t=this.faces.get("U"),e=this.faces.get("R"),s=this.faces.get("F"),i=this.faces.get("dr"),r=this.faces.get("dl"),o=this.faces.get("L"),a=this.faces.get("d"),h=this.faces.get("br"),n=this.faces.get("BR"),l=this.faces.get("BL"),c=this.faces.get("bl"),u=this.faces.get("b");this.addTurn([[s[2],t[6]],[s[1],t[5]],[s[10],t[4]],[t[6],n[10]],[t[5],n[9]],[t[4],n[8]],[n[10],h[8]],[n[9],h[7]],[n[8],h[6]],[h[8],i[2]],[h[7],i[1]],[h[6],i[10]],[i[2],s[2]],[i[1],s[1]],[i[10],s[10]],...bt(e)],"R"),this.addTurn([[t[2],e[2]],[t[3],e[3]],[t[4],e[4]],[e[2],i[2]],[e[3],i[3]],[e[4],i[4]],[i[2],r[2]],[i[3],r[3]],[i[4],r[4]],[r[2],o[2]],[r[3],o[3]],[r[4],o[4]],[o[2],t[2]],[o[3],t[3]],[o[4],t[4]],...bt(s)],"F"),this.addTurn([[s[2],o[4]],[s[3],o[5]],[s[4],o[6]],[o[4],l[8]],[o[5],l[9]],[o[6],l[10]],[l[8],n[6]],[l[9],n[7]],[l[10],n[8]],[n[6],e[10]],[n[7],e[1]],[n[8],e[2]],[e[10],s[2]],[e[1],s[3]],[e[2],s[4]],...bt(t)],"U"),this.addTurn([[s[4],r[4]],[s[5],r[5]],[s[6],r[6]],[r[4],c[8]],[r[5],c[9]],[r[6],c[10]],[c[8],l[6]],[c[9],l[7]],[c[10],l[8]],[l[6],t[10]],[l[7],t[1]],[l[8],t[2]],[t[10],s[4]],[t[1],s[5]],[t[2],s[6]],...bt(o)],"L"),this.addTurn([[t[6],l[10]],[t[7],l[1]],[t[8],l[2]],[l[10],u[8]],[l[1],u[9]],[l[2],u[10]],[u[8],h[4]],[u[9],h[5]],[u[10],h[6]],[h[4],e[8]],[h[5],e[9]],[h[6],e[10]],[e[8],t[6]],[e[9],t[7]],[e[10],t[8]],...bt(n)],"BR"),this.addTurn([[t[8],o[6]],[t[9],o[7]],[t[10],o[8]],[o[6],c[10]],[o[7],c[1]],[o[8],c[2]],[c[10],u[6]],[c[1],u[7]],[c[2],u[8]],[u[6],n[4]],[u[7],n[5]],[u[8],n[6]],[n[4],t[8]],[n[5],t[9]],[n[6],t[10]],...bt(l)],"BL"),this.addTurn([[s[8],e[4]],[s[9],e[5]],[s[10],e[6]],[e[4],h[8]],[e[5],h[9]],[e[6],h[10]],[h[8],a[6]],[h[9],a[7]],[h[10],a[8]],[a[6],r[10]],[a[7],r[1]],[a[8],r[2]],[r[10],s[8]],[r[1],s[9]],[r[2],s[10]],...bt(i)],"dr"),this.addTurn([[s[6],i[4]],[s[7],i[5]],[s[8],i[6]],[i[4],a[8]],[i[5],a[9]],[i[6],a[10]],[a[8],c[6]],[a[9],c[7]],[a[10],c[8]],[c[6],o[10]],[c[7],o[1]],[c[8],o[2]],[o[10],s[6]],[o[1],s[7]],[o[2],s[8]],...bt(r)],"dl"),this.addTurn([[h[10],u[2]],[h[1],u[3]],[h[2],u[4]],[u[2],c[4]],[u[3],c[5]],[u[4],c[6]],[c[4],r[8]],[c[5],r[9]],[c[6],r[10]],[r[8],i[6]],[r[9],i[7]],[r[10],i[8]],[i[6],h[10]],[i[7],h[1]],[i[8],h[2]],...bt(a)],"d"),this.addTurn([[u[10],a[4]],[u[1],a[5]],[u[2],a[6]],[a[4],i[8]],[a[5],i[9]],[a[6],i[10]],[i[8],e[6]],[i[9],e[7]],[i[10],e[8]],[e[6],n[10]],[e[7],n[1]],[e[8],n[2]],[n[10],u[10]],[n[1],u[1]],[n[2],u[2]],...bt(h)],"br"),this.addTurn([[l[4],o[8]],[l[5],o[9]],[l[6],o[10]],[o[8],r[6]],[o[9],r[7]],[o[10],r[8]],[r[6],a[10]],[r[7],a[1]],[r[8],a[2]],[a[10],u[4]],[a[1],u[5]],[a[2],u[6]],[u[4],l[4]],[u[5],l[5]],[u[6],l[6]],...bt(c)],"bl"),this.addTurn([[h[2],n[2]],[h[3],n[3]],[h[4],n[4]],[n[2],l[2]],[n[3],l[3]],[n[4],l[4]],[l[2],c[2]],[l[3],c[3]],[l[4],c[4]],[c[2],a[2]],[c[3],a[3]],[c[4],a[4]],[a[2],h[2]],[a[3],h[3]],[a[4],h[4]],...bt(u)],"b"),this.addTurn([[s[0],e[0]],[s[1],e[9]],[s[5],e[3]],[s[6],e[4]],[s[7],e[5]],[s[8],e[6]],[s[9],e[7]],[s[10],e[8]],[e[0],n[0]],[e[3],n[9]],[e[4],n[10]],[e[5],n[1]],[e[6],n[2]],[e[7],n[3]],[e[8],n[4]],[e[9],n[5]],[n[0],l[0]],[n[9],l[1]],[n[10],l[2]],[n[1],l[3]],[n[2],l[4]],[n[3],l[5]],[n[4],l[6]],[n[5],l[7]],[l[0],o[0]],[l[1],o[7]],[l[2],o[8]],[l[3],o[9]],[l[4],o[10]],[l[5],o[1]],[l[6],o[2]],[l[7],o[3]],[o[0],s[0]],[o[7],s[5]],[o[8],s[6]],[o[9],s[7]],[o[10],s[8]],[o[1],s[9]],[o[2],s[10]],[o[3],s[1]],[i[0],h[0]],[i[1],h[5]],[i[2],h[6]],[i[3],h[7]],[i[4],h[8]],[i[5],h[9]],[i[6],h[10]],[i[7],h[1]],[i[8],h[2]],[i[9],h[3]],[i[10],h[4]],[h[0],u[0]],[h[1],u[3]],[h[2],u[4]],[h[3],u[5]],[h[4],u[6]],[h[5],u[7]],[h[6],u[8]],[h[7],u[9]],[h[8],u[10]],[h[9],u[1]],[h[10],u[2]],[u[0],c[0]],[u[1],c[3]],[u[2],c[4]],[u[3],c[5]],[u[4],c[6]],[u[5],c[7]],[u[6],c[8]],[u[7],c[9]],[u[8],c[10]],[u[9],c[1]],[u[10],c[2]],[c[0],r[0]],[c[1],r[5]],[c[2],r[6]],[c[3],r[7]],[c[4],r[8]],[c[5],r[9]],[c[6],r[10]],[c[7],r[1]],[c[8],r[2]],[c[9],r[3]],[c[10],r[4]],[r[0],i[0]],[r[1],i[9]],[r[2],i[10]],[r[3],i[1]],[r[4],i[2]],[r[5],i[3]],[r[6],i[4]],[r[7],i[5]],[r[8],i[6]],[r[9],i[7]],[r[10],i[8]],...bt(a)],"D++"),this.addTurn([[s[0],t[0]],[s[7],t[3]],[s[8],t[4]],[s[9],t[5]],[s[10],t[6]],[s[1],t[7]],[s[2],t[8]],[s[3],t[9]],[t[0],l[0]],[t[3],l[9]],[t[4],l[10]],[t[5],l[1]],[t[6],l[2]],[t[7],l[3]],[t[8],l[4]],[t[9],l[5]],[l[0],c[0]],[l[9],c[1]],[l[10],c[2]],[l[1],c[3]],[l[2],c[4]],[l[3],c[5]],[l[4],c[6]],[l[5],c[7]],[c[0],r[0]],[c[1],r[7]],[c[2],r[8]],[c[3],r[9]],[c[4],r[10]],[c[5],r[1]],[c[6],r[2]],[c[7],r[3]],[r[0],s[0]],[r[7],s[7]],[r[8],s[8]],[r[9],s[9]],[r[10],s[10]],[r[1],s[1]],[r[2],s[2]],[r[3],s[3]],[i[0],e[0]],[i[1],e[9]],[i[2],e[10]],[i[3],e[1]],[i[4],e[2]],[i[5],e[3]],[i[6],e[4]],[i[7],e[5]],[i[8],e[6]],[i[9],e[7]],[i[10],e[8]],[e[0],n[0]],[e[1],n[5]],[e[2],n[6]],[e[3],n[7]],[e[4],n[8]],[e[5],n[9]],[e[6],n[10]],[e[7],n[1]],[e[8],n[2]],[e[9],n[3]],[e[10],n[4]],[n[0],u[0]],[n[1],u[1]],[n[2],u[2]],[n[3],u[3]],[n[4],u[4]],[n[5],u[5]],[n[6],u[6]],[n[7],u[7]],[n[8],u[8]],[n[9],u[9]],[n[10],u[10]],[u[0],a[0]],[u[1],a[5]],[u[2],a[6]],[u[3],a[7]],[u[4],a[8]],[u[5],a[9]],[u[6],a[10]],[u[7],a[1]],[u[8],a[2]],[u[9],a[3]],[u[10],a[4]],[a[0],i[0]],[a[1],i[5]],[a[2],i[6]],[a[3],i[7]],[a[4],i[8]],[a[5],i[9]],[a[6],i[10]],[a[7],i[1]],[a[8],i[2]],[a[9],i[3]],[a[10],i[4]],...bt(h)],"R++")}U(t){this.doTurn("U",t)}R(t){this.doTurn("R",t)}F(t){this.doTurn("F",t)}dr(t){this.doTurn("dr",t)}dl(t){this.doTurn("dl",t)}L(t){this.doTurn("L",t)}d(t){this.doTurn("d",t)}br(t){this.doTurn("br",t)}BR(t){this.doTurn("BR",t)}BL(t){this.doTurn("BL",t)}bl(t){this.doTurn("bl",t)}b(t){this.doTurn("b",t)}Dxx(t){this.doTurn("D++",t)}Rxx(t){this.doTurn("R++",t)}alg(t){t&&this.doTurns(pt(t))}case(t){if(!t)return;let e=pt(t).reverse().map((t=>Object.assign(Object.assign({},t),{turnType:t.turnType===i.Clockwise?i.CounterClockwise:i.Clockwise})));this.doTurns(e)}doTurns(t){t.forEach((t=>{let e,s=t.turnType===i.CounterClockwise;switch(t.unit){case"Rxx":e=this.Rxx.bind(this);break;case"Dxx":e=this.Dxx.bind(this);break;case"U":e=this.U.bind(this);break;case"R":e=this.R.bind(this);break;case"F":e=this.F.bind(this);break;case"L":e=this.L.bind(this);break;case"BL":e=this.BL.bind(this);break;case"BR":e=this.BR.bind(this)}for(let i=t.n;i>0;i--)e(s)}))}}function bt(t){return[[t[1],t[9]],[t[9],t[7]],[t[7],t[5]],[t[5],t[3]],[t[3],t[1]],[t[2],t[10]],[t[10],t[8]],[t[8],t[6]],[t[6],t[4]],[t[4],t[2]]]}var gt;!function(t){t.U="U",t.R="R",t.F="F",t.D="D",t.L="L",t.B="B"}(gt||(gt={}));const wt=[gt.U,gt.R,gt.F,gt.D,gt.L,gt.B];var yt;!function(t){t.X="X",t.Y="Y",t.Z="Z"}(yt||(yt={}));const Et={X:[gt.U,gt.B,gt.D,gt.F],Y:[gt.L,gt.B,gt.R,gt.F],Z:[gt.L,gt.U,gt.R,gt.D]},St={X:{[gt.U]:0,[gt.B]:2,[gt.F]:0,[gt.D]:0},Y:{[gt.B]:-1,[gt.F]:-1,[gt.L]:-1,[gt.R]:-1},Z:{[gt.U]:-1,[gt.D]:1,[gt.L]:2,[gt.R]:0}},kt={[gt.U]:!1,[gt.R]:!1,[gt.F]:!1,[gt.D]:!0,[gt.L]:!0,[gt.B]:!0};function Ct(t){return Math.PI*t/180}function Rt(t,e){const s=t*Math.cos(e),i=t*Math.sin(e);return Vector2.fromValues(s,i)}function Ft(t){return t/2*Math.sqrt(2.5+1.1*Math.sqrt(5))}function Mt(t){let e=0,s=0,i=0;return t.forEach((t=>{e+=t.x,s+=t.y,i+=t.z})),e/=t.length,s/=t.length,i/=t.length,vector_Vector3.fromValues(e,s,i)}class RubiksCubeSimulator extends Simulator{constructor(t){super(),this.size=t,this.gridSize=t*t,wt.forEach((t=>{this.addFace(it(this.gridSize,t),t);const e=this.makeFaceTurnDefinitions(t);this.addTurn(e,t)})),[yt.X,yt.Y,yt.Z].forEach((t=>{for(let e=0;e{const o=Et[t][(r+1)%Et[t].length],a=this.faces.get(o),h=this.faces.get(i);for(let r=0;r[t,e[this.clockwiseSticker(s)]]))}clockwiseSticker(t){return(t+1)*this.size%(this.gridSize+1)-1}counterClockwiseSticker(t){return this.oppositeSticker(this.clockwiseSticker(t))}oppositeSticker(t){return this.gridSize-(t+1)}axisAlignedSticker(t,e,s){switch(St[t][e]){case 0:return s;case 1:return this.clockwiseSticker(s);case 2:return this.oppositeSticker(s);case-1:return this.counterClockwiseSticker(s);default:throw`Invalid axis face orientation value ${St[t][e]}`}}turnFace(t,e,s,i,r){Math.abs(r-i)>=this.size-1?console.error(`Invalid number of layers to turn, skipping turn.; face=${t}, layers=${Math.abs(r-i)+1}`):(this.doTurn(t,s),function(t,e){if(t===e)return[t];const s=t{this.doTurn(`${e}-${i}`,kt[t]?!s:s)})))}U(t=!1,e=1){this.turnFace(gt.U,yt.Y,t,this.size-1,this.size-e)}R(t=!1,e=1){this.turnFace(gt.R,yt.X,t,this.size-1,this.size-e)}F(t=!1,e=1){this.turnFace(gt.F,yt.Z,t,0,e-1)}D(t=!1,e=1){this.turnFace(gt.D,yt.Y,t,0,e-1)}L(t=!1,e=1){this.turnFace(gt.L,yt.X,t,0,e-1)}B(t=!1,e=1){this.turnFace(gt.B,yt.Z,t,this.size-1,this.size-e)}M(t=!1){for(let e=1;e{switch(t.turnType){case i.Clockwise:t.turnType=i.CounterClockwise;break;case i.CounterClockwise:t.turnType=i.Clockwise;break;case i.Double:}return t}));this.doTurns(e)}doTurns(t){t.forEach((t=>{let e;switch(t.unit){case o.U:e=this.U.bind(this);break;case o.R:e=this.R.bind(this);break;case o.F:e=this.F.bind(this);break;case o.D:e=this.D.bind(this);break;case o.L:e=this.L.bind(this);break;case o.B:e=this.B.bind(this);break;case o.M:e=this.M.bind(this);break;case o.E:e=this.E.bind(this);break;case o.S:e=this.S.bind(this);break;case o.X:e=this.X.bind(this);break;case o.Y:e=this.Y.bind(this);break;case o.Z:e=this.Z.bind(this);break;default:console.warn("Unsupported cube move",t)}const s=t.turnType===i.CounterClockwise;e(s,t.slices),t.turnType===i.Double&&e(s,t.slices)}))}}const Lt=(()=>{let t=0;return function(){return t++}})();class Matrix4{constructor(t){Array.isArray(t)&&16==t.length?this.values=t:this.values=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}static fromValues(t,e,s,i,r,o,a,h,n,l,c,u,d,f,m,v){return new Matrix4([t,e,s,i,r,o,a,h,n,l,c,u,d,f,m,v])}static fromQuaternion(t){let{a:e,b:s,c:i,d:r}=t,o=e+e,a=s+s,h=i+i,n=e*o,l=s*o,c=s*a,u=i*o,d=i*a,f=i*h,m=r*o,v=r*a,p=r*h;return Matrix4.fromValues(1-c-f,l+p,u-v,0,l-p,1-n-f,d+m,0,u+v,d-m,1-n-c,0,0,0,0,1)}static fromTranslation(t,e,s){return Matrix4.fromValues(1,0,0,0,0,1,0,0,0,0,1,0,t,e,s,1)}static fromXRotation(t){let e=Math.sin(t),s=Math.cos(t);return Matrix4.fromValues(1,0,0,0,0,s,e,0,0,-e,s,0,0,0,0,1)}static fromYRotation(t){let e=Math.sin(t),s=Math.cos(t);return Matrix4.fromValues(s,0,-e,0,0,1,0,0,e,0,s,0,0,0,0,1)}static copy(t,e){t.values[0]=e.values[0],t.values[1]=e.values[1],t.values[2]=e.values[2],t.values[3]=e.values[3],t.values[4]=e.values[4],t.values[5]=e.values[5],t.values[6]=e.values[6],t.values[7]=e.values[7],t.values[8]=e.values[8],t.values[9]=e.values[9],t.values[10]=e.values[10],t.values[11]=e.values[11],t.values[12]=e.values[12],t.values[13]=e.values[13],t.values[14]=e.values[14],t.values[15]=e.values[15]}static multiply(t,e,s){let i=e.values[0],r=e.values[1],o=e.values[2],a=e.values[3],h=e.values[4],n=e.values[5],l=e.values[6],c=e.values[7],u=e.values[8],d=e.values[9],f=e.values[10],m=e.values[11],v=e.values[12],p=e.values[13],b=e.values[14],g=e.values[15],w=s.values[0],y=s.values[1],E=s.values[2],S=s.values[3];return t.values[0]=w*i+y*h+E*u+S*v,t.values[1]=w*r+y*n+E*d+S*p,t.values[2]=w*o+y*l+E*f+S*b,t.values[3]=w*a+y*c+E*m+S*g,w=s.values[4],y=s.values[5],E=s.values[6],S=s.values[7],t.values[4]=w*i+y*h+E*u+S*v,t.values[5]=w*r+y*n+E*d+S*p,t.values[6]=w*o+y*l+E*f+S*b,t.values[7]=w*a+y*c+E*m+S*g,w=s.values[8],y=s.values[9],E=s.values[10],S=s.values[11],t.values[8]=w*i+y*h+E*u+S*v,t.values[9]=w*r+y*n+E*d+S*p,t.values[10]=w*o+y*l+E*f+S*b,t.values[11]=w*a+y*c+E*m+S*g,w=s.values[12],y=s.values[13],E=s.values[14],S=s.values[15],t.values[12]=w*i+y*h+E*u+S*v,t.values[13]=w*r+y*n+E*d+S*p,t.values[14]=w*o+y*l+E*f+S*b,t.values[15]=w*a+y*c+E*m+S*g,t}static perspective(t,e,s,i){const r=1/Math.tan(t/2),o=[r/e,0,0,0,0,r,0,0,0,0,0,-1,0,0,0,0];if(null!=i&&i!==1/0){const t=1/(s-i);o[10]=(i+s)*t,o[14]=2*i*s*t}else o[10]=-1,o[14]=-2*s;return new Matrix4(o)}translate(t,e,s){this.values[12]=this.values[0]*t+this.values[4]*e+this.values[8]*s+this.values[12],this.values[13]=this.values[1]*t+this.values[5]*e+this.values[9]*s+this.values[13],this.values[14]=this.values[2]*t+this.values[6]*e+this.values[10]*s+this.values[14],this.values[15]=this.values[3]*t+this.values[7]*e+this.values[11]*s+this.values[15]}scale(t,e,s){this.values[0]=this.values[0]*t,this.values[1]=this.values[1]*t,this.values[2]=this.values[2]*t,this.values[3]=this.values[3]*t,this.values[4]=this.values[4]*e,this.values[5]=this.values[5]*e,this.values[6]=this.values[6]*e,this.values[7]=this.values[7]*e,this.values[8]=this.values[8]*s,this.values[9]=this.values[9]*s,this.values[10]=this.values[10]*s,this.values[11]=this.values[11]*s}rotate(t,e,s,i){let r=Math.hypot(e,s,i);if(r<1e-6)return;r=1/r,e*=r,s*=r,i*=r;let o,a,h,n,l,c,u,d,f,m,v,p,b,g,w,y,E,S,k,C,R,F=Math.sin(t),M=Math.cos(t),L=1-M;o=this.values[0],a=this.values[1],h=this.values[2],n=this.values[3],l=this.values[4],c=this.values[5],u=this.values[6],d=this.values[7],f=this.values[8],m=this.values[9],v=this.values[10],p=this.values[11],b=e*e*L+M,g=s*e*L+i*F,w=i*e*L-s*F,y=e*s*L-i*F,E=s*s*L+M,S=i*s*L+e*F,k=e*i*L+s*F,C=s*i*L-e*F,R=i*i*L+M,this.values[0]=o*b+l*g+f*w,this.values[1]=a*b+c*g+m*w,this.values[2]=h*b+u*g+v*w,this.values[3]=n*b+d*g+p*w,this.values[4]=o*y+l*E+f*S,this.values[5]=a*y+c*E+m*S,this.values[6]=h*y+u*E+v*S,this.values[7]=n*y+d*E+p*S,this.values[8]=o*k+l*C+f*R,this.values[9]=a*k+c*C+m*R,this.values[10]=h*k+u*C+v*R,this.values[11]=n*k+d*C+p*R}multiply(t){Matrix4.multiply(this,this,t)}}class Object3D{constructor(){this.uid=Lt(),this.matrix=new Matrix4,this.centroid=vector_Vector3.fromValues(0,0,0)}translate(t,e,s){this.matrix.translate(t,e,s)}rotate(t,e,s,i){this.matrix.rotate(t,e,s,i)}scale(t,e,s){this.matrix.scale(t,e,s)}setColor(t){this.color=t}}class Group extends Object3D{constructor(t=[]){super(),this.setObjects(t)}setObjects(t){this.objects=t}addObject(t){this.objects.push(t)}setCentroid(t){this.centroid=t}}const xt=Math.sqrt(3),Pt=Math.atan(Ct(15)),Tt=Ct(30),Vt=(Ct(36),Ct(60));Ct(72);class Square1Builder{constructor(t=Y,e=K,s=!1,i=.7){this.sideLength=i,this.halfSide=this.sideLength/2,this.halfEdgePiece=this.halfSide*Pt,this.layerWidth=this.halfSide-this.halfEdgePiece,this.middleWidth=this.sideLength-2*this.layerWidth,this.halfMiddleWidth=this.middleWidth/2,this.borderLayerWidth=.2*this.sideLength,this.outerHalfSide=(i+this.borderLayerWidth)/2,this.outerHalfEdgePiece=this.outerHalfSide*Pt,this.pieces=this.buildSquare1(t,e,s),this.group=new Group(this.pieces)}makeLayer(t){let e=[],s=Math.PI;return t.forEach(((t,i)=>{switch(t.type){case D.CORNER:const i=this.square1Corner(t.colors[0],t.colors[1],t.colors[2]);i.rotate(s,0,0,1),e.push(i),s-=Vt;break;case D.EDGE:const r=this.square1Edge(t.colors[0],t.colors[1]);r.rotate(s-Vt,0,0,1),e.push(r),s-=Tt}})),e}setColors(t){}}class Face{constructor(t,e,s){this.indices=t,this.color=s,this.uid=Lt(),e&&this.calculateCentroid(e)}calculateCentroid(t){this.centroid=Mt(t.filter(((t,e)=>this.indices.includes(e))))}}class Geometry extends Object3D{constructor(t,e){super(),this.vertices=t,this.faces=e,this.centroid=Mt(this.vertices)}}class Square1Net extends Square1Builder{square1Corner(t,e,s){const i=[vector_Vector3.fromValues(0,0,0),vector_Vector3.fromValues(this.halfSide,this.halfEdgePiece,0),vector_Vector3.fromValues(this.halfSide,this.halfSide,0),vector_Vector3.fromValues(this.halfEdgePiece,this.halfSide,0),vector_Vector3.fromValues(this.outerHalfSide,this.outerHalfEdgePiece,0),vector_Vector3.fromValues(this.outerHalfSide,this.outerHalfSide,0),vector_Vector3.fromValues(this.outerHalfEdgePiece,this.outerHalfSide,0)],r=[new Face([0,1,2,3],i,t),new Face([2,3,6,5],i,e),new Face([1,2,5,4],i,s)];return new Geometry(i,r)}square1Edge(t,e){const s=[vector_Vector3.fromValues(0,0,0).rotateZ(vector_Vector3.fromValues(0,0,0),Tt),vector_Vector3.fromValues(this.halfEdgePiece,this.halfSide,0).rotateZ(vector_Vector3.fromValues(0,0,0),Tt),vector_Vector3.fromValues(-this.halfEdgePiece,this.halfSide,0).rotateZ(vector_Vector3.fromValues(0,0,0),Tt),vector_Vector3.fromValues(this.outerHalfEdgePiece,this.outerHalfSide,0).rotateZ(vector_Vector3.fromValues(0,0,0),Tt),vector_Vector3.fromValues(-this.outerHalfEdgePiece,this.outerHalfSide,0).rotateZ(vector_Vector3.fromValues(0,0,0),Tt)],i=[new Face([0,1,2],s,t),new Face([1,2,4,3],s,e)];return new Geometry(s,i)}square1Middle(t,e,s,i){const r=this.halfSide-this.halfEdgePiece,o=(this.sideLength-2*r)/2,a=this.outerHalfSide-this.outerHalfEdgePiece,h=[vector_Vector3.fromValues(-this.outerHalfSide,o,-.01),vector_Vector3.fromValues(-this.outerHalfEdgePiece,o,-.01),vector_Vector3.fromValues(this.outerHalfSide,o,-.01),vector_Vector3.fromValues(-this.outerHalfSide,-o,-.01),vector_Vector3.fromValues(-this.outerHalfEdgePiece,-o,-.01),vector_Vector3.fromValues(this.outerHalfSide,-o,-.01),vector_Vector3.fromValues(2*this.outerHalfEdgePiece,o,-.01),vector_Vector3.fromValues(2*this.outerHalfEdgePiece,-o,-.01),vector_Vector3.fromValues(2*a,o,-.01),vector_Vector3.fromValues(2*a,-o,-.01)],n=[new Face([0,1,4,3],h,t)];return i?(n.push(new Face([1,6,7,4],h,s)),n.push(new Face([6,8,9,7],h,e))):n.push(new Face([1,2,5,4],h,t)),new Geometry(h,n)}buildSquare1(t,e,s){const i=this.halfSide-this.halfEdgePiece,r=(this.sideLength-2*i)/2;let o=[];const a=new Group(this.makeLayer(t)),h=new Group(this.makeLayer(e));a.translate(0,this.outerHalfSide+r,0),h.translate(0,-(this.outerHalfSide+r),0),h.rotate(Tt,0,0,1),o=[a,h];const n=this.square1Middle(j,X,q,s);return this.faces={top:a,bottom:h},o.push(n),o}}const Bt={value:"#333",stroke:"#333"};class Square1 extends Square1Builder{constructor(t=Y,e=K,s=!1,i=1.25){super(t,e,s,i)}square1Corner(t,e,s){const i=[vector_Vector3.fromValues(0,0,this.halfSide),vector_Vector3.fromValues(this.halfSide,this.halfEdgePiece,this.halfSide),vector_Vector3.fromValues(this.halfSide,this.halfSide,this.halfSide),vector_Vector3.fromValues(this.halfEdgePiece,this.halfSide,this.halfSide),vector_Vector3.fromValues(0,0,this.halfSide-this.layerWidth),vector_Vector3.fromValues(this.halfSide,this.halfEdgePiece,this.halfSide-this.layerWidth),vector_Vector3.fromValues(this.halfSide,this.halfSide,this.halfSide-this.layerWidth),vector_Vector3.fromValues(this.halfEdgePiece,this.halfSide,this.halfSide-this.layerWidth)],r=[new Face([0,1,2,3],i,t),new Face([4,5,6,7],i,Bt),new Face([0,1,5,4],i,Bt),new Face([2,3,7,6],i,e),new Face([1,2,6,5],i,s),new Face([0,3,7,4],i,Bt)],o=vector_Vector3.fromValues(this.halfSide/2,this.halfSide/2,this.halfSide/2);return r[1].centroid=o,r[2].centroid=o,r[5].centroid=o,new Geometry(i,r)}square1Edge(t,e){const s=[vector_Vector3.fromValues(0,0,this.halfSide).rotateZ(vector_Vector3.fromValues(0,0,0),Tt),vector_Vector3.fromValues(this.halfEdgePiece,this.halfSide,this.halfSide).rotateZ(vector_Vector3.fromValues(0,0,0),Tt),vector_Vector3.fromValues(-this.halfEdgePiece,this.halfSide,this.halfSide).rotateZ(vector_Vector3.fromValues(0,0,0),Tt),vector_Vector3.fromValues(0,0,this.halfSide-this.layerWidth).rotateZ(vector_Vector3.fromValues(0,0,0),Tt),vector_Vector3.fromValues(this.halfEdgePiece,this.halfSide,this.halfSide-this.layerWidth).rotateZ(vector_Vector3.fromValues(0,0,0),Tt),vector_Vector3.fromValues(-this.halfEdgePiece,this.halfSide,this.halfSide-this.layerWidth).rotateZ(vector_Vector3.fromValues(0,0,0),Tt)],i=[new Face([0,1,2],s,t),new Face([3,4,5],s,Bt),new Face([1,2,5,4],s,e),new Face([0,1,4,3],s,Bt),new Face([0,2,5,3],s,Bt)],r=vector_Vector3.fromValues(0,this.halfSide/2,this.halfSide/2).rotateZ(vector_Vector3.fromValues(0,0,0),Tt);return i[1].centroid=r,i[3].centroid=r,i[4].centroid=r,new Geometry(s,i)}square1Middle(t,e,s){const i=[vector_Vector3.fromValues(-this.halfSide,-this.halfSide,this.halfMiddleWidth),vector_Vector3.fromValues(-this.halfSide,this.halfSide,this.halfMiddleWidth),vector_Vector3.fromValues(this.halfEdgePiece,this.halfSide,this.halfMiddleWidth),vector_Vector3.fromValues(-this.halfEdgePiece,-this.halfSide,this.halfMiddleWidth),vector_Vector3.fromValues(-this.halfSide,-this.halfSide,-this.halfMiddleWidth),vector_Vector3.fromValues(-this.halfSide,this.halfSide,-this.halfMiddleWidth),vector_Vector3.fromValues(this.halfEdgePiece,this.halfSide,-this.halfMiddleWidth),vector_Vector3.fromValues(-this.halfEdgePiece,-this.halfSide,-this.halfMiddleWidth)],r=[new Face([0,1,2,3],i,{value:"#333"}),new Face([4,5,6,7],i,{value:"#333"}),new Face([0,1,5,4],i,e),new Face([1,2,6,5],i,s),new Face([0,3,7,4],i,t)],o=vector_Vector3.fromValues(-this.halfSide/2,0,0);return r[0].centroid=o,r[1].centroid=o,r[2].centroid=vector_Vector3.fromValues(-(this.halfSide+.45*this.halfSide),0,0),new Geometry(i,r)}buildSquare1(t,e,s){const i=new Group(this.makeLayer(t)),r=new Group(this.makeLayer(e));r.rotate(Math.PI,1,0,0),r.rotate(Tt,0,0,1);const o=[i,r],a=this.square1Middle(j,$,q),h=this.square1Middle(q,X,j);return h.rotate(Math.PI,0,0,1),s&&h.rotate(Math.PI,G.x,G.y,G.z),o.push(a),o.push(h),this.faces={top:i,bottom:r},o}}class Plane extends Geometry{constructor(t,e,s){let i=[vector_Vector3.fromValues(0,0,0),vector_Vector3.fromValues(t,0,0),vector_Vector3.fromValues(t,-e,0),vector_Vector3.fromValues(0,-e,0)];super(i,[new Face([0,1,2,3],i,s)])}}class Triangle extends Geometry{constructor(t,e,s,i){let r=[t,e,s];super(r,[new Face([0,1,2],r,i)])}}class SkewbNet{constructor(){const t=Math.sqrt(2*Math.pow(.5,2)),e=new Group(this.makeStickers(g,t,vector_Vector3.fromValues(-1,0,0))),s=new Group(this.makeStickers(w,t,vector_Vector3.fromValues(2,0,0))),i=new Group(this.makeStickers(b,t,vector_Vector3.fromValues(0,-1,0))),r=new Group(this.makeStickers(v,t,vector_Vector3.fromValues(1,0,0))),o=new Group(this.makeStickers(m,t,vector_Vector3.fromValues(0,1,0))),a=new Group(this.makeStickers(p,t,vector_Vector3.fromValues(0,0,0)));this.U=o,this.R=r,this.F=a,this.L=e,this.B=s,this.D=i,this.faces={top:this.U,front:this.F,right:this.R,back:this.B,left:this.L,bottom:this.D},this.stickers=[r,o,a,e,s,i],this.group=new Group(this.stickers),this.group.translate(-1/4,0,0),this.group.scale(.5,.5,.5)}makeStickers(t,e,s){const i=new Plane(e,e,t);i.translate(s.x,s.y,s.z),i.rotate(Math.PI/4,0,0,1),i.translate(-e/2,e/2,0);const r=[];for(let i=0;i<4;i++){const o=new Triangle(vector_Vector3.fromValues(-e/2,e/2,0),vector_Vector3.fromValues(0,e,0),vector_Vector3.fromValues(e/2,e/2,0),t);o.translate(s.x,s.y,s.z),o.rotate(-Math.PI/2*i,0,0,1),o.rotate(Math.PI/4,0,0,1),r.push(o)}return[i,...r]}setColors(t){let{top:e,right:s,front:i,bottom:r,left:o,back:a}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.D,r),this.setFaceColors(this.L,o),this.setFaceColors(this.B,a)}setFaceColors(t,e=[]){t.objects[0].faces[0].color=e[0]||F,t.objects[1].faces[0].color=e[1]||F,t.objects[2].faces[0].color=e[2]||F,t.objects[3].faces[0].color=e[4]||F,t.objects[4].faces[0].color=e[3]||F}}class Skewb{constructor(){const t=Math.sqrt(2*Math.pow(.625,2)),e=.625,s=new Group(this.makeStickers(v,t)),i=new Group(this.makeStickers(m,t,vector_Vector3.fromValues(1,0,0))),r=new Group(this.makeStickers(p,t,vector_Vector3.fromValues(0,1,0))),o=new Group(this.makeStickers(g,t)),a=new Group(this.makeStickers(w,t,vector_Vector3.fromValues(0,1,0))),h=new Group(this.makeStickers(b,t,vector_Vector3.fromValues(1,0,0)));this.U=i,this.R=s,this.F=r,this.L=o,this.B=a,this.D=h,this.faces={top:this.U,front:this.F,right:this.R,back:this.B,left:this.L,bottom:this.D},s.translate(0,0,e),s.rotate(Math.PI,1,0,0),s.rotate(Math.PI/2,0,0,1),o.rotate(-Math.PI/2,0,0,1),o.translate(0,0,-.625),r.rotate(-Math.PI/2,1,0,0),r.translate(-.625,0,0),a.translate(e,0,0),a.rotate(Math.PI,0,1,0),a.rotate(-Math.PI/2,1,0,0),i.rotate(Math.PI,0,1,0),i.translate(0,e,0),h.translate(0,-.625,0),h.rotate(Math.PI,1,0,0),this.stickers=[s,i,r,o,a,h],this.group=new Group(this.stickers)}makeStickers(t,e,s){const i=new Plane(e,e,t);s&&i.rotate(Math.PI/2,s.x,s.y,s.z),i.rotate(Math.PI/4,0,0,1),i.translate(-e/2,e/2,0);const r=[];for(let i=0;i<4;i++){const o=new Triangle(vector_Vector3.fromValues(-e/2,e/2,0),vector_Vector3.fromValues(0,e,0),vector_Vector3.fromValues(e/2,e/2,0),t);s&&o.rotate(Math.PI/2,s.x,s.y,s.z),o.rotate(Math.PI/2*i,0,0,1),o.rotate(Math.PI/4,0,0,1),r.push(o)}return[i,...r]}setColors(t){let{top:e,right:s,front:i,bottom:r,left:o,back:a}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.D,r),this.setFaceColors(this.L,o),this.setFaceColors(this.B,a)}setFaceColors(t,e=[]){t.objects[0].faces[0].color=e[0]||F,t.objects[1].faces[0].color=e[1]||F,t.objects[2].faces[0].color=e[2]||F,t.objects[3].faces[0].color=e[4]||F,t.objects[4].faces[0].color=e[3]||F}}class TriangleLattice extends Geometry{constructor(t,e,s){const i=t/2,r=t*(xt/2),o=t/e,a=r/e,h=r/3;let n=[],l=[],c=0;for(let t=0;t<=e;t++)for(let r=0,u=e-t;r<=u;r++){const e=o*r+t*o/2+-i,d=a*t+-h;n.push(vector_Vector3.fromValues(e,d,0)),t>0&&(r>0&&l.push(new Face([c,c-1,c-u-2],null,s)),l.push(new Face([c,c-u-2,c-u-1],null,s))),c++}l.forEach((t=>t.calculateCentroid(n))),super(n,l)}}const It=60*Math.PI/180;class PyraminxNet{constructor(t,e=.925){this.size=t;const s=e*(xt/2)/1.5,i=.1*s,r=new TriangleLattice(e,t,m),o=new TriangleLattice(e,t,w),a=new TriangleLattice(e,t,p),h=new TriangleLattice(e,t,v);this.L=a,this.R=o,this.U=r,this.B=h,o.rotate(-It,0,0,1),o.translate(0,s+i,0),o.rotate(2*It,0,0,1),r.rotate(It,0,0,1),r.translate(0,s+i,0),r.rotate(-2*It,0,0,1),h.rotate(3*It,0,0,1),h.translate(0,s+i,0),h.rotate(-2*It,0,0,1),this.faces={top:this.U,right:this.R,left:this.L,back:this.B},this.group=new Group([r,o,a,h])}setColors(t){let{left:e,right:s,top:i,back:r}=t;this.setFaceColors(this.L,e),this.setFaceColors(this.R,s),this.setFaceColors(this.U,i),this.setFaceColors(this.B,r)}setFaceColors(t,e){t.faces.forEach(((t,s)=>{e&&e[s]?t.color=e[s]:t.color=F}))}}const Nt=Math.acos(1/3),_t=120*Math.PI/180,zt=Math.sqrt(24);class Pyraminx{constructor(t,e=1.75){this.size=t;const s=e/zt,i=new TriangleLattice(e,t,m),r=new TriangleLattice(e,t,w),o=new TriangleLattice(e,t,p),a=new TriangleLattice(e,t,v);this.L=o,this.R=r,this.U=i,this.B=a,i.rotate(_t,0,0,1),i.rotate(Nt,1,0,0),i.translate(0,0,s),r.rotate(Nt,1,0,0),r.translate(0,0,s),o.rotate(-_t,0,0,1),o.rotate(Nt,1,0,0),o.translate(0,0,s),a.rotate(Math.PI,0,1,0),a.translate(0,0,s),this.faces={top:this.U,right:this.R,left:this.L,back:this.B},this.group=new Group([i,o,r,a])}setColors(t){let{left:e,right:s,top:i,back:r}=t;this.setFaceColors(this.L,e),this.setFaceColors(this.R,s),this.setFaceColors(this.U,i),this.setFaceColors(this.B,r)}setFaceColors(t,e){t.faces.forEach(((t,s)=>{e&&e[s]?t.color=e[s]:t.color=F}))}}class DividedPentagon extends Geometry{constructor(t,e=2,s=1.6,i=.4){const r=function(t){return t/(2*Math.sin(Math.PI/5))}(s),o=function(t){const e=t*t,s=71*Math.PI/180,i=2*e-2*e*Math.cos(s);return 2*Math.sqrt(Math.abs(e-i))}(i),a=function(t,e,s,i){let r=[];for(let o=0;o0;a--){let s=vector_Vector3.fromValues(t.x+(e.x-t.x)/r*i*a,t.y+(e.y-t.y)/r*i*a,0);o.unshift(s);let h=vector_Vector3.fromValues(e.x+(t.x-e.x)/r*i*a,e.y+(t.y-e.y)/r*i*a,0);o.push(h)}return o.unshift(vector_Vector3.fromValues(t.x,t.y,0)),o.push(vector_Vector3.fromValues(e.x,e.y,0)),o}function Gt(t,e,s){let i=[];for(let r=0;r<5;r++){const o=Rt(e,r*(2*Math.PI)/5-Math.PI/10);if(i.length>0){const e=i[i.length-1],r=Dt(Vector2.fromValues(e.x,e.y),o,t,s);r.shift(),i=i.concat(r)}else i.push(vector_Vector3.fromValues(o.x,o.y,0))}const r=i[0],o=i[i.length-1],a=Dt(Vector2.fromValues(o.x,o.y),Vector2.fromValues(r.x,r.y),t,s);return a.pop(),a.shift(),i=i.concat(a),i}const Ot=36*Math.PI/180,Wt=72*Math.PI/180,jt={2:.3,3:.17,4:.121};class MegaminxNet{constructor(t){this.layers=t;const e=.75,s=function(t,e){return jt[e]||t/(1.9*e)}(length,t);this.U=new DividedPentagon(b,t,e,s),this.F=new DividedPentagon(v,t,e,s),this.R=new DividedPentagon(p,t,e,s),this.L=new DividedPentagon(w,t,e,s),this.dl=new DividedPentagon(k,t,e,s),this.dr=new DividedPentagon(R,t,e,s),this.BL=new DividedPentagon(y,t,e,s),this.BR=new DividedPentagon(m,t,e,s),this.d=new DividedPentagon(E,t,e,s),this.bl=new DividedPentagon(S,t,e,s),this.br=new DividedPentagon(C,t,e,s),this.b=new DividedPentagon(g,t,e,s);const i=2*function(t){return t/(2*Math.tan(Math.PI/5))}(e);this.U.translate(0,i,0),this.U.rotate(5*Ot,0,0,1),this.R.rotate(-Wt,0,0,1),this.R.translate(0,i,0),this.R.rotate(5*Ot,0,0,1),this.L.rotate(Wt,0,0,1),this.L.translate(0,i,0),this.L.rotate(-5*Ot,0,0,1),this.dl.rotate(2*Wt,0,0,1),this.dl.translate(0,i,0),this.dl.rotate(-5*Ot,0,0,1),this.dr.rotate(-2*Wt,0,0,1),this.dr.translate(0,i,0),this.dr.rotate(-5*Ot,0,0,1),this.b.rotate(Math.PI,0,0,1),this.b.rotate(-2*Ot,0,0,1),this.d.rotate(3*Ot,0,0,1),this.d.translate(0,i,0),this.d.rotate(5*Ot,0,0,1),this.br.rotate(Ot,0,0,1),this.br.translate(0,i,0),this.br.rotate(5*Ot,0,0,1),this.BR.rotate(-Ot,0,0,1),this.BR.translate(0,i,0),this.BR.rotate(-5*Ot,0,0,1),this.BL.rotate(-3*Ot,0,0,1),this.BL.translate(0,i,0),this.BL.rotate(5*Ot,0,0,1),this.bl.rotate(5*Ot,0,0,1),this.bl.translate(0,i,0),this.bl.rotate(-5*Ot,0,0,1);let r=new Matrix4;r.rotate(-Wt,0,0,1),r.translate(0,2*i,0),r.rotate(2*Wt,0,0,1),r.translate(0,-i,0),[this.d,this.bl,this.BL,this.BR,this.br,this.b].forEach((t=>{Matrix4.multiply(t.matrix,r,t.matrix)})),this.faces={U:this.U,F:this.F,R:this.R,dr:this.dr,dl:this.dl,L:this.L,d:this.d,br:this.br,BR:this.BR,BL:this.BL,bl:this.bl,b:this.b},this.group=new Group([this.U,this.F,this.L,this.dr,this.dl,this.R,this.d,this.bl,this.BL,this.BR,this.br,this.b]),this.group.scale(.33,.33,.33),this.group.translate(-1.3125,0,0)}setColors(t){let{U:e,R:s,F:i,d:r,L:o,b:a,dr:h,dl:n,br:l,BR:c,BL:u,bl:d}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.d,r),this.setFaceColors(this.L,o),this.setFaceColors(this.b,a),this.setFaceColors(this.dr,h),this.setFaceColors(this.dl,n),this.setFaceColors(this.BR,c),this.setFaceColors(this.BL,u),this.setFaceColors(this.bl,d),this.setFaceColors(this.br,l)}oldSetColors(t){const e=this.layers,s=5*e*e-5*e+1;let[i,r,o,a,h,n,l,c,u,d,f,m]=function(t,e){const s=Math.ceil(t.length/e);return new Array(s).fill(null).map(((s,i)=>t.slice(i*e,(i+1)*e)))}(t,s);this.setFaceColors(this.U,i),this.setFaceColors(this.R,r),this.setFaceColors(this.F,o),this.setFaceColors(this.d,l),this.setFaceColors(this.L,n),this.setFaceColors(this.b,m),this.setFaceColors(this.dr,a),this.setFaceColors(this.dl,h),this.setFaceColors(this.br,c),this.setFaceColors(this.BR,u),this.setFaceColors(this.BL,d),this.setFaceColors(this.bl,f)}setFaceColors(t,e){t.faces.forEach(((t,s)=>{e&&e[s]?t.color=e[s]:t.color=F}))}}const $t={2:.3,3:.17,4:.121};class Megaminx{constructor(t=2){this.layers=t;const e=.75,s=Ft(e),i=function(t,e){return $t[e]||t/(1.9*e)}(e,t);this.U=new DividedPentagon(b,t,e,i),this.F=new DividedPentagon(v,t,e,i),this.R=new DividedPentagon(p,t,e,i),this.dr=new DividedPentagon(R,t,e,i),this.dl=new DividedPentagon(k,t,e,i),this.L=new DividedPentagon(w,t,e,i),this.d=new DividedPentagon(E,t,e,i),this.br=new DividedPentagon(C,t,e,i),this.BR=new DividedPentagon(m,t,e,i),this.BL=new DividedPentagon(y,t,e,i),this.bl=new DividedPentagon(S,t,e,i),this.b=new DividedPentagon(g,t,e,i),this.F.translate(0,0,s),this.b.rotate(Math.PI,0,0,1),this.b.rotate(Math.PI,0,1,0),this.b.translate(0,0,s),this.U.rotate(Math.PI,0,0,1),this.U.rotate((180-116.57)*Math.PI/180,1,0,0),this.U.translate(0,0,s),this.L.rotate(72*Math.PI/180,0,0,1),this.L.rotate(Math.PI,0,0,1),this.L.rotate((180-116.57)*Math.PI/180,1,0,0),this.L.translate(0,0,s),this.R.rotate(72*Math.PI/180,0,0,1),this.R.rotate(Math.PI/5,0,0,1),this.R.rotate((180-116.57)*Math.PI/180,1,0,0),this.R.translate(0,0,s),this.dr.rotate(72*Math.PI/180,0,0,1),this.dr.rotate(-Math.PI/5,0,0,1),this.dr.rotate((180-116.57)*Math.PI/180,1,0,0),this.dr.translate(0,0,s),this.dl.rotate(72*Math.PI/180,0,0,1),this.dl.rotate(-3*Math.PI/5,0,0,1),this.dl.rotate((180-116.57)*Math.PI/180,1,0,0),this.dl.translate(0,0,s),this.BL.rotate(Math.PI/5,0,0,1),this.BL.rotate(-116.57*Math.PI/180,1,0,0),this.BL.translate(0,0,s),this.BR.rotate(-Math.PI/5,0,0,1),this.BR.rotate(-116.57*Math.PI/180,1,0,0),this.BR.translate(0,0,s),this.bl.rotate(3*Math.PI/5,0,0,1),this.bl.rotate(-116.57*Math.PI/180,1,0,0),this.bl.translate(0,0,s),this.d.rotate(5*Math.PI/5,0,0,1),this.d.rotate(-116.57*Math.PI/180,1,0,0),this.d.translate(0,0,s),this.br.rotate(7*Math.PI/5,0,0,1),this.br.rotate(-116.57*Math.PI/180,1,0,0),this.br.translate(0,0,s),this.stickers=[this.U,this.F,this.R,this.dr,this.dl,this.L,this.d,this.br,this.BR,this.BL,this.bl,this.b],this.faces={U:this.U,F:this.F,R:this.R,dr:this.dr,dl:this.dl,L:this.L,d:this.d,br:this.br,BR:this.BR,BL:this.BL,bl:this.bl,b:this.b},this.group=new Group(this.stickers)}setColors(t){let{U:e,R:s,F:i,d:r,L:o,b:a,dr:h,dl:n,br:l,BR:c,BL:u,bl:d}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.d,r),this.setFaceColors(this.L,o),this.setFaceColors(this.b,a),this.setFaceColors(this.dr,h),this.setFaceColors(this.dl,n),this.setFaceColors(this.BR,c),this.setFaceColors(this.BL,u),this.setFaceColors(this.bl,d),this.setFaceColors(this.br,l)}setFaceColors(t,e){t.faces.forEach(((t,s)=>{e&&e[s]?t.color=e[s]:t.color=F}))}}function Xt(t,e,s){const i=t/2,r=t/e,o=r/2;let a=[];for(let h=0;h{e&&e[s]?t.faces[0].color=e[s]:t.faces[0].color=F}))}setColors(t){let{U:e,R:s,F:i,L:r,B:o}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.L,r),this.setFaceColors(this.B,o)}rotateBorder(t,e){t.forEach((t=>{t.vertices=t.vertices.map((t=>t.rotateX(vector_Vector3.fromValues(0,this.halfStickerWidth,0),e))),t.centroid=Mt(t.vertices)}))}}class RubiksCubeNet{constructor(t){this.size=t;const e=Xt(1,t,m),s=Xt(1,t,v),i=Xt(1,t,p),r=Xt(1,t,b),o=Xt(1,t,g),a=Xt(1,t,w);this.U=new Group(e),this.U.translate(0,1,0),this.R=new Group(s),this.R.translate(1,0,0),this.F=new Group(i),this.D=new Group(r),this.D.translate(0,-1,0),this.L=new Group(o),this.L.translate(-1,0,0),this.B=new Group(a),this.B.translate(2,0,0),this.stickers=[this.U,this.R,this.F,this.D,this.L,this.B],this.faces={U:this.U,R:this.R,F:this.F,D:this.D,L:this.L,B:this.B},this.group=new Group(this.stickers),this.group.translate(-1/4,0,0),this.group.scale(.5,.5,.5)}setFaceColors(t,e){t.objects.forEach(((t,s)=>{e&&e[s]?t.faces[0].color=e[s]:t.faces[0].color=F}))}setColors(t){let{U:e,R:s,F:i,D:r,L:o,B:a}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.D,r),this.setFaceColors(this.L,o),this.setFaceColors(this.B,a)}}class RubiksCube{constructor(t){this.size=t;const e=1.25,s=.625;this.U=new Group(Xt(e,t,m)),this.R=new Group(Xt(e,t,v)),this.F=new Group(Xt(e,t,p)),this.D=new Group(Xt(e,t,b)),this.L=new Group(Xt(e,t,g)),this.B=new Group(Xt(e,t,w)),this.U.rotate(-Math.PI/2,0,1,0),this.U.rotate(-Math.PI/2,1,0,0),this.U.translate(0,0,s),this.R.translate(0,0,s),this.F.rotate(-Math.PI/2,0,1,0),this.F.translate(0,0,s),this.D.rotate(-Math.PI/2,0,1,0),this.D.rotate(Math.PI/2,1,0,0),this.D.translate(0,0,s),this.L.rotate(-Math.PI,0,1,0),this.L.translate(0,0,s),this.B.rotate(Math.PI/2,0,1,0),this.B.translate(0,0,s),this.stickers=[this.U,this.R,this.F,this.D,this.L,this.B],this.faces={U:this.U,R:this.R,F:this.F,D:this.D,L:this.L,B:this.B},this.group=new Group(this.stickers)}setFaceColors(t,e){t.objects.forEach(((t,s)=>{e&&e[s]?t.faces[0].color=e[s]:t.faces[0].color=F}))}setColors(t){let{U:e,R:s,F:i,D:r,L:o,B:a}=t;this.setFaceColors(this.U,e),this.setFaceColors(this.R,s),this.setFaceColors(this.F,i),this.setFaceColors(this.D,r),this.setFaceColors(this.L,o),this.setFaceColors(this.B,a)}}class Arrow extends Object3D{constructor(t,e){super(),this.p1=t,this.p2=e,this.centroid=Mt([t,e])}}function Ht(t,e){let s=t.clone();return e.forEach(((t,e)=>{s.transformMat4(t)})),s}class PolygonRenderer{constructor(){this.polygons=[],this.arrows=[]}render(t,e){this.polygons=[],t.objects.forEach((t=>{this.renderObject3D(t,e,[])})),this.onBeforeRender(),this.renderPolygons(),this.renderArrows(),this.onComplete()}renderPolygons(){this.polygons.sort(((t,e)=>t.centroid.z-e.centroid.z)),this.polygons.forEach((t=>this.drawPolygon(t)))}renderArrows(){this.arrows.forEach((({p1:t,p2:e,uid:s})=>{this.drawArrow(t,e,s)}))}renderObject3D(t,e,s){if(t instanceof Geometry)this.renderGeometry(t,e,s);else if(t instanceof Arrow)this.renderArrow(t,e,s);else if(t instanceof Group){let i=t;i.objects.forEach((t=>{this.renderObject3D(t,e,[i.matrix,...s])}))}}renderGeometry(t,e,s){t.faces.forEach((i=>{let r=[];i.indices.map((e=>t.vertices[e])).forEach((i=>{let o=Ht(i,[t.matrix,...s,e.matrix]);o.multiply(1,-1,1),r.push(o)})),this.addPolygon(r,i,t,s)}))}renderArrow(t,e,s){let i=[t.matrix,...s,e.matrix],r=Ht(t.p1,i),o=Ht(t.p2,i);this.arrows.push({p1:r,p2:o,uid:t.uid})}addPolygon(t,e,s,i){this.polygons.push({points:t,face:e,object:s,centroid:Ht(e.centroid,[s.matrix,...i])})}sortObjects(t,e,s){let i=[...t];return i.sort(((t,e)=>{let i=[t.matrix,...s],r=[e.matrix,...s],o=Ht(t.centroid,i),a=Ht(e.centroid,r);return o.z-a.z})),i}}function Yt(t,e,s,i){const r=function(t){return t.reduce(((t,e)=>`${t?t+" ":""}${e.x}, ${e.y}`),"")}(e),o=s?s.value:"black",a=s&&s.stroke||"#000000";t.setAttributeNS(null,"points",r),t.setAttributeNS(null,"fill",o),i&&(t.setAttributeNS(null,"stroke",a),t.setAttributeNS(null,"stroke-width",i)),t.setAttributeNS(null,"stroke-linejoin","round")}class HtmlSvgRenderer extends PolygonRenderer{constructor(t,e,s,i,r,o,a){super(),this.strokeWidth="0.035",this.arrowStrokeWidth="0.03",this.polygons=[],this.lines=[],this.uidToPolygon={},this.uidToLine={},this.arrowColor=a||F,this.domElement=document.createElement("div"),this.domElement.className="svg-renderer",this.svgElement=function(t,e,s,i,r,o){const a=document.createElementNS("http://www.w3.org/2000/svg","svg");return a.setAttributeNS(null,"width",t.toString()),a.setAttributeNS(null,"height",e.toString()),a.setAttributeNS(null,"viewBox",`${s} ${i} ${r} ${o}`),a.setAttributeNS(null,"id","sr-visualizer"),a}(t,e,s,i,r,o);const h=function(t){const e=document.createElementNS("http://www.w3.org/2000/svg","defs"),s=document.createElementNS("http://www.w3.org/2000/svg","marker");s.setAttributeNS(null,"id","arrowhead"),s.setAttributeNS(null,"markerWidth","4"),s.setAttributeNS(null,"markerHeight","3.5"),s.setAttributeNS(null,"refX","3"),s.setAttributeNS(null,"refY","1.75"),s.setAttributeNS(null,"orient","auto");const i=document.createElementNS("http://www.w3.org/2000/svg","polygon");return i.setAttributeNS(null,"points","0 0, 4 1.75, 0 3.5"),i.setAttributeNS(null,"fill",t.value),e.appendChild(s),s.appendChild(i),e}(this.arrowColor);this.svgElement.appendChild(h),this.domElement.appendChild(this.svgElement)}onBeforeRender(){}drawPolygon({points:t,face:e,object:s}){if(this.uidToPolygon[e.uid]){Yt(this.uidToPolygon[e.uid],t,e.color||s.color,this.strokeWidth)}else this.uidToPolygon[e.uid]=function(t,e,s){const i=document.createElementNS("http://www.w3.org/2000/svg","polygon");return Yt(i,t,e,s),i}(t,e.color||s.color,this.strokeWidth);this.svgElement.appendChild(this.uidToPolygon[e.uid])}drawArrow(t,e,s){let i;this.uidToLine[s]?(i=this.uidToLine[s],i.setAttributeNS(null,"x1",t[0].toString()),i.setAttributeNS(null,"y1",(-t[1]).toString()),i.setAttributeNS(null,"x2",e[0].toString()),i.setAttributeNS(null,"y2",(-e[1]).toString())):(i=function(t,e,s,i){const r=document.createElementNS("http://www.w3.org/2000/svg","line");let o=s?s.value:F.value;return r.setAttributeNS(null,"x1",t.x.toString()),r.setAttributeNS(null,"y1",(-t.y).toString()),r.setAttributeNS(null,"x2",e.x.toString()),r.setAttributeNS(null,"y2",(-e.y).toString()),r.setAttributeNS(null,"stroke",o),r.setAttributeNS(null,"marker-end","url(#arrowhead)"),i&&r.setAttributeNS(null,"stroke-width",i),r}(t,e,this.arrowColor,this.arrowStrokeWidth),this.uidToLine[s]=i),this.svgElement.appendChild(this.uidToLine[s])}onComplete(){}}class HtmlCanvasRenderer extends PolygonRenderer{constructor(t,e,s=5,i=F){super(),this.width=t,this.height=e,this.lineWidth=s,this.arrowColor=i,this.domElement=document.createElement("div"),this.domElement.className="canvas-renderer",this.canvasElement=document.createElement("canvas"),this.domElement.appendChild(this.canvasElement),this.canvasElement.width=t,this.canvasElement.height=e,this.ctx=this.canvasElement.getContext("2d")}convertRange(t,e){return(t- -.9)/1.8*e}onBeforeRender(){this.ctx.clearRect(0,0,this.width,this.height)}drawPolygon(t){var e,s;this.ctx.lineWidth=this.lineWidth,this.ctx.lineJoin="round",this.ctx.fillStyle=(null===(s=null===(e=null==t?void 0:t.face)||void 0===e?void 0:e.color)||void 0===s?void 0:s.value)||"#000000",this.ctx.strokeStyle="#000000",this.ctx.moveTo(this.convertRange(t.points[0].x,this.width),this.convertRange(t.points[0].y,this.height)),this.ctx.beginPath();for(let e=0;e<=t.points.length;e++){let s=t.points[(e+1)%t.points.length];this.ctx.lineTo(this.convertRange(s.x,this.width),this.convertRange(s.y,this.height))}this.ctx.closePath(),this.ctx.fill(),this.ctx.stroke()}drawArrow(t,e,s){const i=this.convertRange(e.x,this.width),r=this.convertRange(-e.y,this.height),o=this.convertRange(t.x,this.width),a=this.convertRange(-t.y,this.height),h=i-o,n=r-a,l=Math.atan2(n,h);this.ctx.strokeStyle=this.arrowColor.value,this.ctx.beginPath(),this.ctx.moveTo(o,a),this.ctx.lineTo(i,r),this.ctx.lineTo(i-20*Math.cos(l-Math.PI/6),r-20*Math.sin(l-Math.PI/6)),this.ctx.moveTo(i,r),this.ctx.lineTo(i-20*Math.cos(l+Math.PI/6),r-20*Math.sin(l+Math.PI/6)),this.ctx.stroke()}setLineWidth(t){this.lineWidth=t}onComplete(){}}class Camera{constructor(){this.matrix=Matrix4.perspective(Math.PI/2,1,.1,1e3),this.matrix.translate(0,0,-5),this.matrix.scale(4,4,1)}}class Scene{constructor(){this.objects=[]}add(t){this.objects.push(t)}clear(){this.objects=[]}}var Kt;!function(t){t.CUBE="cube",t.CUBE_NET="cube-net",t.CUBE_TOP="cube-top",t.MEGAMINX="megaminx",t.MEGAMINX_NET="megaminx-net",t.MEGAMINX_TOP="megaminx-top",t.PYRAMINX="pyraminx",t.PYRAMINX_NET="pyraminx-net",t.SKEWB="skewb",t.SKEWB_NET="skewb-net",t.SQUARE1="square1",t.SQUARE1_NET="square1-net"}(Kt||(Kt={}));const Zt={size:3,scheme:{U:m,R:v,F:p,D:b,L:g,B:w},rotations:[{x:0,y:45,z:0},{x:34,y:0,z:0}]},Qt={size:2,scheme:{U:b,F:v,R:p,dr:R,dl:k,L:w,d:E,br:C,BR:m,BL:y,bl:S,b:g}},Jt={size:3,scheme:{left:p,right:w,top:m,back:v},rotations:[{x:0,y:0,z:60},{x:-60,y:0,z:0}]},te={scheme:{top:m,front:p,right:v,back:w,left:g,bottom:b},rotations:[{x:0,y:45,z:0},{x:34,y:0,z:0}]},ee={scheme:H,rotations:[{x:0,y:0,z:-34},{x:-56,y:0,z:0}]};function se(t){if(t.alg&&"string"!=typeof t.alg&&(console.warn(`Inavlid alg ${t.alg}. alg must be a string`),t.alg=""),t.case&&"string"!=typeof t.case&&(console.warn(`Inavlid case ${t.case}. case must be a string`),t.case=""),t.scheme&&("object"!=typeof t.scheme||Array.isArray(t.scheme)?(console.warn(`Invalid scheme ${t.scheme}. scheme must be an object`),t.scheme={}):Object.keys(t.scheme).forEach((e=>{const s=t.scheme[e];null!=s&&"object"==typeof s&&s.value||(console.warn(`Invalid scheme color ${s}. must be an type IColor`),t.scheme[e]=F)}))),t.mask&&("object"!=typeof t.mask||Array.isArray(t.mask)?(console.warn(`Invalid mask ${t.mask}. scheme must be an object`),t.mask={}):Object.keys(t.mask).forEach((e=>{const s=t.mask[e];if(Array.isArray(s)){for(let i=0;i{const s=t.stickerColors[e];if(Array.isArray(s)){for(let i=0;i{e&&e[s]?t.color=e[s]:t.color=F}))}removeHiddenStickers(){this.F.faces=this.F.faces.slice(2,5),this.BL.faces=this.BL.faces.slice(8,11),this.L.faces=this.L.faces.slice(4,7),this.R.faces=[this.R.faces[1],this.R.faces[2],this.R.faces[10]],this.BR.faces=this.BR.faces.slice(6,9)}}const he={[Kt.CUBE]:{},[Kt.CUBE_NET]:{},[Kt.CUBE_TOP]:{},[Kt.MEGAMINX]:{},[Kt.MEGAMINX_NET]:{},[Kt.MEGAMINX_TOP]:{},[Kt.PYRAMINX]:{},[Kt.PYRAMINX_NET]:{},[Kt.SKEWB]:{},[Kt.SKEWB_NET]:{},[Kt.SQUARE1]:{},[Kt.SQUARE1_NET]:{}};function ne(t,e){switch(t){case Kt.CUBE:return function(t={}){he[Kt.CUBE][t.size]||(he[Kt.CUBE][t.size]=new RubiksCube(t.size));return he[Kt.CUBE][t.size]}(e);case Kt.CUBE_NET:return function(t={}){he[Kt.CUBE_NET][t.size]||(he[Kt.CUBE_NET][t.size]=new RubiksCubeNet(t.size));return he[Kt.CUBE_NET][t.size]}(e);case Kt.CUBE_TOP:return function(t={}){he[Kt.CUBE_TOP][t.size]||(he[Kt.CUBE_TOP][t.size]=new RubiksCubeTopLayer(t.size));return he[Kt.CUBE_TOP][t.size]}(e);case Kt.MEGAMINX:return function(t={}){he[Kt.MEGAMINX][t.size]||(he[Kt.MEGAMINX][t.size]=new Megaminx(t.size));return he[Kt.MEGAMINX][t.size]}(e);case Kt.MEGAMINX_NET:return function(t={}){he[Kt.MEGAMINX_NET][t.size]||(he[Kt.MEGAMINX_NET][t.size]=new MegaminxNet(t.size));return he[Kt.MEGAMINX_NET][t.size]}(e);case Kt.MEGAMINX_TOP:return function(t={}){he[Kt.MEGAMINX_TOP][2]||(he[Kt.MEGAMINX_TOP][2]=new MegaminxTop);return he[Kt.MEGAMINX_TOP][2]}(e);case Kt.PYRAMINX:return function(t={}){he[Kt.PYRAMINX][t.size]||(he[Kt.PYRAMINX][t.size]=new Pyraminx(t.size));return he[Kt.PYRAMINX][t.size]}(e);case Kt.PYRAMINX_NET:return function(t={}){he[Kt.PYRAMINX_NET][t.size]||(he[Kt.PYRAMINX_NET][t.size]=new PyraminxNet(t.size));return he[Kt.PYRAMINX_NET][t.size]}(e);case Kt.SKEWB:return function(t={}){he[Kt.SKEWB][1]||(he[Kt.SKEWB][1]=new Skewb);return he[Kt.SKEWB][1]}(e);case Kt.SKEWB_NET:return function(t={}){he[Kt.SKEWB_NET][1]||(he[Kt.SKEWB_NET][1]=new SkewbNet);return he[Kt.SKEWB_NET][1]}(e);case Kt.SQUARE1:return function(t={}){const e=le(t);return new Square1(e.topLayer,e.bottomLayer,e.middleRotated)}(e);case Kt.SQUARE1_NET:return function(t={}){const e=le(t);return new Square1Net(e.topLayer,e.bottomLayer,e.middleRotated)}(e)}}function le(t){const e=new Square1Simualtor(t.scheme);return t.case?e.case(t.case):t.alg&&e.alg(t.alg),e}class Quaternion{constructor(t,e,s,i){this.a=t,this.b=e,this.c=s,this.d=i}static fromEuler(t,e,s){let i=Math.PI/360;t*=i,s*=i,e*=i;let r=Math.sin(t),o=Math.cos(t),a=Math.sin(e),h=Math.cos(e),n=Math.sin(s),l=Math.cos(s);return new Quaternion(r*h*l-o*a*n,o*a*l+r*h*n,o*h*n-r*a*l,o*h*l+r*a*n)}}function ce(t){return t===Kt.SQUARE1||t===Kt.SQUARE1_NET}function ue(t,e){return function(t){return t===Kt.PYRAMINX||t===Kt.PYRAMINX_NET}(t)?3===e:!function(t){return t===Kt.MEGAMINX||t===Kt.MEGAMINX_NET||t===Kt.MEGAMINX_TOP}(t)||2===e}class Visualizer{constructor(t,e,s={}){this.type=e,this.camera=new Camera,this.scene=new Scene,this.group=new Group,this.scene.add(this.group),this.renderer=t,this.initPuzzleOptions(s),this.puzzleGeometry=ne(this.type,this.options),this.simulator=function(t,e){switch(t){case Kt.CUBE:case Kt.CUBE_NET:case Kt.CUBE_TOP:return new RubiksCubeSimulator(e.size);case Kt.MEGAMINX:case Kt.MEGAMINX_NET:case Kt.MEGAMINX_TOP:return new MegaminxSimulator;case Kt.PYRAMINX:case Kt.PYRAMINX_NET:return new PyraminxSimulator;case Kt.SKEWB:case Kt.SKEWB_NET:return new SkewbSimulator;case Kt.SQUARE1:case Kt.SQUARE1_NET:return le(e)}}(this.type,this.options),this.buildGroupMatrix(),this.applyColors(),this.addArrows(),this.group.addObject(this.puzzleGeometry.group),this.render()}applyColors(){const t=this.options.stickerColors&&!ce(this.type),e=ue(this.type,this.options.size);if(t)this.puzzleGeometry.setColors(this.options.stickerColors);else if(e)this.applySimulatorColors();else{const t=this.puzzleGeometry.faces;Object.keys(t).forEach((e=>{const s=t[e],i=this.options.scheme[e];s instanceof Geometry?s.faces.forEach((t=>t.color=i)):s instanceof Group&&s.objects.forEach((t=>t.color=i))}))}}applySimulatorColors(){this.options.mask&&this.applyMask(this.options),(this.options.alg||this.options.case)&&this.applyAlgorithm();const t=function(t,e){return Object.keys(t).reduce(((s,i)=>(s[i]=t[i].map((t=>e[t]||M)),s)),{})}(this.simulator.getValues(),this.options.scheme);this.puzzleGeometry.setColors(t)}applyAlgorithm(){ce(this.type)||(this.options.case?this.simulator.case(this.options.case):this.options.alg&&this.simulator.alg(this.options.alg))}applyMask(t){Object.keys(t.mask).forEach((e=>{t.mask[e].forEach((t=>this.simulator.setValue(e,t,"mask")))}))}buildGroupMatrix(){if(this.group.matrix=new Matrix4,this.options.rotations&&this.options.rotations.forEach((t=>{const{x:e=0,y:s=0,z:i=0}=t;let r=Matrix4.fromQuaternion(Quaternion.fromEuler(e,s,i));Matrix4.multiply(this.group.matrix,r,this.group.matrix)})),this.options.scale){let t=this.options.scale;this.group.matrix.scale(t,t,t)}if(this.options.translation){const{x:t=0,y:e=0,z:s=0}=this.options.translation;let i=Matrix4.fromTranslation(t,e,s);Matrix4.multiply(this.group.matrix,i,this.group.matrix)}}addArrows(){this.options.arrows&&this.options.arrows.forEach((t=>{try{this.scene.add(function(t,e,s){var i,r,o,a,h,n,l,c;let u=e.faces[t.start.face],d=e.faces[t.end.face];if(!u||!d)throw new Error(`Invalid arrow definition ${JSON.stringify(t)}`);let f,m,v=[u.matrix,e.group.matrix,s.matrix],p=[d.matrix,e.group.matrix,s.matrix];if(u instanceof Geometry&&d instanceof Geometry?(f=null===(i=u.faces[t.start.sticker])||void 0===i?void 0:i.centroid,m=null===(r=d.faces[t.end.sticker])||void 0===r?void 0:r.centroid):(e instanceof Square1?(f=null===(o=u.objects[t.start.sticker])||void 0===o?void 0:o.faces[0].centroid,m=null===(a=d.objects[t.end.sticker])||void 0===a?void 0:a.faces[0].centroid):(f=null===(h=u.objects[t.start.sticker])||void 0===h?void 0:h.centroid,m=null===(n=d.objects[t.end.sticker])||void 0===n?void 0:n.centroid),v.unshift(null===(l=u.objects[t.start.sticker])||void 0===l?void 0:l.matrix),p.unshift(null===(c=d.objects[t.end.sticker])||void 0===c?void 0:c.matrix)),!f||!m)throw new Error(`Invalid arrow definition ${JSON.stringify(t)}`);let b=Ht(f,v),g=Ht(m,p);return new Arrow(b,g)}(t,this.puzzleGeometry,this.group))}catch(e){console.error(e),console.warn(`Invalid arrow ${JSON.stringify(t)}`)}}))}initPuzzleOptions(t){this.options=Object.assign(Object.assign({},function(t){switch(t){case Kt.CUBE:return Zt;case Kt.CUBE_NET:case Kt.CUBE_TOP:return Object.assign(Object.assign({},Zt),{rotations:null});case Kt.MEGAMINX:case Kt.MEGAMINX_NET:case Kt.MEGAMINX_TOP:return Qt;case Kt.PYRAMINX:return Jt;case Kt.PYRAMINX_NET:return Object.assign(Object.assign({},Jt),{rotations:null});case Kt.SKEWB:return te;case Kt.SKEWB_NET:return Object.assign(Object.assign({},te),{rotations:null});case Kt.SQUARE1:return ee;case Kt.SQUARE1_NET:return Object.assign(Object.assign({},ee),{rotations:null});default:throw new Error(`Could not get default options for puzzle ${t}`)}}(this.type)),t),se(this.options)}applyOptionsToPuzzle(){this.simulator.reset(),this.buildGroupMatrix(),this.applyColors(),this.addArrows()}setPuzzleOptions(t){this.initPuzzleOptions(t),ce(this.type)&&(this.puzzleGeometry=ne(this.type,this.options),this.group.setObjects([this.puzzleGeometry.group])),this.applyOptionsToPuzzle()}render(){this.renderer.render(this.scene,this.camera)}}const de={width:500,height:500,minx:-.9,miny:-.9,svgWidth:1.8,svgHeight:1.8,strokeWidth:.02,arrowColor:E,arrowStrokeWidth:.03};function fe(t,e,s={}){return new SvgVisualizer(t,e,s)}class SvgVisualizer extends Visualizer{constructor(t,e,s={}){if(s=Object.assign(Object.assign({},de),s),"string"==typeof t&&null===(t=document.querySelector(t)))throw new Error(`Could not find visuzlier element by query selector: ${t}`);const i=new HtmlSvgRenderer(s.width,s.height,s.minx,s.miny,s.svgWidth,s.svgHeight,s.arrowColor);i.strokeWidth=""+s.strokeWidth,t.appendChild(i.domElement),super(i,e,s.puzzle),this.svgOptions=s}setStrokeWidth(t){this.svgOptions.strokeWidth=t,this.renderer.strokeWidth=""+this.svgOptions.strokeWidth,this.render()}setSvgOptions(t){this.svgOptions=Object.assign(Object.assign({},de),t),function(t){Number.isInteger(t.width)||(console.warn(`invalid svg width ${t.width}. Must be a whole number`),t.width=de.width);Number.isInteger(t.height)||(console.warn(`invalid svg height ${t.height}. Must be a whole number`),t.width=de.height);Number.isFinite(t.minx)||(console.warn(`invalid svg minx ${t.minx}`),t.minx=de.minx);Number.isFinite(t.miny)||(console.warn(`invalid svg miny ${t.miny}`),t.minx=de.miny);Number.isFinite(t.svgWidth)||(console.warn(`invalid svgWidth ${t.svgWidth}`),t.minx=de.svgWidth);Number.isFinite(t.svgHeight)||(console.warn(`invalid svgHeight ${t.svgHeight}`),t.minx=de.svgHeight);Number.isFinite(t.strokeWidth)||(console.warn(`invalid strokeWidth ${t.strokeWidth}`),t.minx=de.strokeWidth);Number.isFinite(t.arrowStrokeWidth)||(console.warn(`invalid arrowStrokeWidth ${t.arrowStrokeWidth}`),t.minx=de.arrowStrokeWidth);t.arrowColor&&!ie(t.arrowColor)&&(t.arrowColor=F)}(this.svgOptions);const e=this.renderer,s=e.svgElement;e.strokeWidth=""+this.svgOptions.strokeWidth,e.arrowStrokeWidth=""+this.svgOptions.arrowStrokeWidth,s.setAttributeNS(null,"width",this.svgOptions.width.toString()),s.setAttributeNS(null,"height",this.svgOptions.width.toString()),s.setAttributeNS(null,"viewBox",`${this.svgOptions.minx} ${this.svgOptions.miny} ${this.svgOptions.svgWidth} ${this.svgOptions.svgHeight}`),this.render()}}const me={width:500,height:500,minx:-.9,miny:-.9,svgWidth:1.8,svgHeight:1.8,strokeWidth:.02,arrowColor:E,arrowStrokeWidth:.03};function ve(t,e,s={}){if("string"==typeof t&&null===(t=document.querySelector(t)))throw new Error(`Could not find visuzlier element by query selector: ${t}`);let i=document.createElement("div");s=Object.assign(Object.assign({},me),s),fe(i,e,s),setTimeout((()=>{let e=i.querySelector("svg"),r=document.createElement("img");t.appendChild(r);let o=document.createElement("canvas"),a=o.getContext("2d"),h=new Image;h.width=o.width=r.width=s.width,h.height=o.height=r.height=s.height,h.onload=function(){a.drawImage(h,0,0,h.width,h.height),r.src=o.toDataURL()};var n=(new XMLSerializer).serializeToString(e);h.src=`data:image/svg+xml,${encodeURIComponent(n)}`}))}const pe={width:500,height:500,lineWidth:5,arrowColor:E};function be(t,e,s={}){return new CanvasVisualizer(t,e,s)}class CanvasVisualizer extends Visualizer{constructor(t,e,s){if(s=Object.assign(Object.assign({},pe),s),"string"==typeof t&&null===(t=document.querySelector(t)))throw new Error(`Could not find visuzlier element by query selector: ${t}`);const i=new HtmlCanvasRenderer(s.width,s.height,s.lineWidth,s.arrowColor);t.appendChild(i.domElement),super(i,e,s.puzzle)}}const ge={CUBE_3:{LAST_LAYER:{F:[3,4,5,6,7,8],B:[3,4,5,6,7,8],R:[3,4,5,6,7,8],L:[3,4,5,6,7,8],D:[0,1,2,3,4,5,6,7,8]},F2L:{F:[0,1,2],B:[0,1,2],R:[0,1,2],L:[0,1,2],U:[0,1,2,3,4,5,6,7,8]},FIRST_LAYER:{F:[0,1,2,3,4,5],B:[0,1,2,3,4,5],R:[0,1,2,3,4,5],L:[0,1,2,3,4,5],U:[0,1,2,3,4,5,6,7,8]},OLL:{R:[0,1,2,3,4,5,6,7,8],F:[0,1,2,3,4,5,6,7,8],D:[0,1,2,3,4,5,6,7,8],L:[0,1,2,3,4,5,6,7,8],B:[0,1,2,3,4,5,6,7,8]},CORNERS_LAST_LAYER:{U:[1,3,5,7],F:[1,3,4,5,6,7,8],B:[1,3,4,5,6,7,8],R:[1,3,4,5,6,7,8],L:[1,3,4,5,6,7,8],D:[0,1,2,3,4,5,6,7,8]},EDGES_LAST_LAYER:{U:[0,2,6,8],F:[0,2,3,4,5,6,7,8],B:[0,2,3,4,5,6,7,8],R:[0,2,3,4,5,6,7,8],L:[0,2,3,4,5,6,7,8],D:[0,1,2,3,4,5,6,7,8]}},MEGA_3:{OLL:{F:[0,1,2,3,4,5,6,7,8,9,10],R:[0,1,2,3,4,5,6,7,8,9,10],L:[0,1,2,3,4,5,6,7,8,9,10],BR:[0,1,2,3,4,5,6,7,8,9,10],BL:[0,1,2,3,4,5,6,7,8,9,10],d:[0,1,2,3,4,5,6,7,8,9,10],b:[0,1,2,3,4,5,6,7,8,9,10],dl:[0,1,2,3,4,5,6,7,8,9,10],dr:[0,1,2,3,4,5,6,7,8,9,10],bl:[0,1,2,3,4,5,6,7,8,9,10],br:[0,1,2,3,4,5,6,7,8,9,10]}}},we={Scene,Camera,HtmlSvgRenderer,HtmlCanvasRenderer,PolygonRenderer},ye={RubiksCube,RubiksCubeNet,RubiksCubeTopLayer,Megaminx,MegaminxNet,Pyraminx,PyraminxNet,Skewb,SkewbNet,Square1,Square1Net},Ee={RubiksCubeSimulator,MegaminxSimulator,PyraminxSimulator,SkewbSimulator,Square1Simualtor},Se={TurnType:i,parseCubeAlgorithm:c,parseMegaminxAlgorithm:pt,parsePyraminxAlgorithm:ut,parseSkewbAlgorithm:st,parseSquare1Algorithm:Q}}},e={};function s(i){if(e[i])return e[i].exports;var r=e[i]={exports:{}};return t[i](r,r.exports,s),r.exports}return s.d=(t,e)=>{for(var i in e)s.o(e,i)&&!s.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},s.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),s.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},s(170)})()})); //# sourceMappingURL=puzzleGen.min.js.map \ No newline at end of file diff --git a/dist/bundle/puzzleGen.min.js.map b/dist/bundle/puzzleGen.min.js.map index 418d03f..2e07eb1 100644 --- a/dist/bundle/puzzleGen.min.js.map +++ b/dist/bundle/puzzleGen.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://puzzleGen/webpack/universalModuleDefinition","webpack://puzzleGen/./src/algorithms/algorithm.ts","webpack://puzzleGen/./src/algorithms/cube.ts","webpack://puzzleGen/./src/simulator/simulator.ts","webpack://puzzleGen/./src/puzzles/colors.ts","webpack://puzzleGen/./src/puzzles/square1/enum.ts","webpack://puzzleGen/./src/puzzles/square1/constants.ts","webpack://puzzleGen/./src/algorithms/square1.ts","webpack://puzzleGen/./src/simulator/square1/square1Simulator.ts","webpack://puzzleGen/./src/algorithms/skewb.ts","webpack://puzzleGen/./src/utils/arrays.ts","webpack://puzzleGen/./src/simulator/skewb/skewbSimulator.ts","webpack://puzzleGen/./src/algorithms/pyraminx.ts","webpack://puzzleGen/./src/simulator/pyraminx/pyraminxSimulator.ts","webpack://puzzleGen/./src/simulator/megaminx/constants.ts","webpack://puzzleGen/./src/algorithms/megaminx.ts","webpack://puzzleGen/./src/simulator/megaminx/megaminxSimulator.ts","webpack://puzzleGen/./src/simulator/rubiksCube/constants.ts","webpack://puzzleGen/./node_modules/gl-matrix/esm/common.js","webpack://puzzleGen/./node_modules/gl-matrix/esm/vec3.js","webpack://puzzleGen/./src/math/utils.ts","webpack://puzzleGen/./src/simulator/rubiksCube/rubiksCubeSimulator.ts","webpack://puzzleGen/./node_modules/gl-matrix/esm/mat4.js","webpack://puzzleGen/./src/geometry/uid.ts","webpack://puzzleGen/./src/geometry/object3d.ts","webpack://puzzleGen/./src/geometry/group.ts","webpack://puzzleGen/./src/math/constants.ts","webpack://puzzleGen/./src/puzzles/square1/interface.ts","webpack://puzzleGen/./src/geometry/face.ts","webpack://puzzleGen/./src/geometry/geometry.ts","webpack://puzzleGen/./src/puzzles/square1/square1Net.ts","webpack://puzzleGen/./src/puzzles/square1/square1.ts","webpack://puzzleGen/./src/geometry/plane.ts","webpack://puzzleGen/./src/geometry/triangle.ts","webpack://puzzleGen/./src/puzzles/skewbNet.ts","webpack://puzzleGen/./src/puzzles/skewb.ts","webpack://puzzleGen/./src/geometry/triangleLattice.ts","webpack://puzzleGen/./src/puzzles/pyraminxNet.ts","webpack://puzzleGen/./src/puzzles/pyraminx.ts","webpack://puzzleGen/./src/geometry/dividedPentagon.ts","webpack://puzzleGen/./src/puzzles/megaminxNet.ts","webpack://puzzleGen/./src/puzzles/megaminx.ts","webpack://puzzleGen/./src/geometry/grid.ts","webpack://puzzleGen/./src/puzzles/rubiksCube/rubiksCubeTop.ts","webpack://puzzleGen/./src/puzzles/rubiksCube/rubiksCubeNet.ts","webpack://puzzleGen/./src/puzzles/rubiksCube/rubiksCube.ts","webpack://puzzleGen/./src/geometry/arrow.ts","webpack://puzzleGen/./src/svg/svg.ts","webpack://puzzleGen/./src/rendering/utils.ts","webpack://puzzleGen/./src/rendering/customSvgRenderer.ts","webpack://puzzleGen/./src/rendering/camera.ts","webpack://puzzleGen/./src/rendering/scene.ts","webpack://puzzleGen/./src/visualizer/enum.ts","webpack://puzzleGen/./src/visualizer/options.ts","webpack://puzzleGen/./node_modules/gl-matrix/esm/vec4.js","webpack://puzzleGen/./node_modules/gl-matrix/esm/quat.js","webpack://puzzleGen/./node_modules/gl-matrix/esm/mat3.js","webpack://puzzleGen/./src/visualizer/interface.ts","webpack://puzzleGen/./src/puzzles/megaminxTop.ts","webpack://puzzleGen/./src/visualizer/puzzleCreator.ts","webpack://puzzleGen/./src/visualizer/visualizer.ts","webpack://puzzleGen/./src/visualizer/svg.ts","webpack://puzzleGen/./src/visualizer/png.ts","webpack://puzzleGen/./src/visualizer/mask.ts","webpack://puzzleGen/./src/index.ts","webpack://puzzleGen/webpack/bootstrap","webpack://puzzleGen/webpack/startup","webpack://puzzleGen/webpack/runtime/define property getters","webpack://puzzleGen/webpack/runtime/hasOwnProperty shorthand","webpack://puzzleGen/webpack/runtime/make namespace object"],"names":["root","factory","exports","module","define","amd","this","TurnType","TurnAbbreviation","CubeAlgorithmUnit","possibleMoves","F","U","R","L","D","B","M","E","S","X","Y","Z","cubeRotations","cubeTurnRegex","parseCubeAlgorithm","algorithm","match","turns","exec","rawSlices","rawFace","outerBlockIndicator","rawType","Clockwise","isLowerCaseMove","toLowerCase","indexOf","toUpperCase","turn","unit","getMove","turnType","getTurnType","slices","getSlices","push","Error","parseInt","CounterClockwise","Double","Simulator","stickers","Map","faces","label","has","size","toString","stickerIds","reduce","nextSticker","stickerId","set","faceId","changes","reverse","get","movingSticker","replacedSticker","cached","forEach","change","entries","entry","next","value","id","done","values","key","map","face","index","console","warn","faceStickers","alg","split","doTurn","faceName","YELLOW","RED","BLUE","WHITE","ORANGE","GREEN","PURPLE","GREY","DARK_BLUE","LIGHT_YELLOW","LIGHT_GREEN","PINK","BLACK","MASK_COLOR","YELLOW_STICKERLESS","stroke","RED_STICKERLESS","BLUE_STICKERLESS","WHITE_STICKERLESS","ORANGE_STICKERLESS","GREEN_STICKERLESS","PURPLE_STICKERLESS","GREY_STICKERLESS","DARK_BLUE_STICKERLESS","LIGHT_YELLOW_STICKERLESS","LIGHT_GREEN_STICKERLESS","PINK_STICKERLESS","PIECE_TYPE","ROTATION_VECTOR","TOP_COLOR","BOTTOM_COLOR","FRONT_COLOR","LEFT_COLOR","RIGHT_COLOR","BACK_COLOR","DEFAULT_SQ1_SCHEME","top","front","bottom","left","right","back","SOLVED_TOP_PIECES","type","CORNER","colors","EDGE","SOLVED_BOTTOM_PIECES","square1TurnRegex","parseSquare1Algorithm","slice","pieceValue","Square1Simualtor","scheme","super","topLayer","solvedTop","bottomLayer","solvedBottom","middleRotated","move","rotateTop","rotateBottom","topNum","bottomNum","i","length","topSlice","splice","bottomSlice","concat","piece","shift","Math","abs","pop","unshift","skewbTurnRegex","DirectionToTurnType","parseSkewbAlgorithm","rawUnit","rawDirection","fillArray","Array","fill","SkewbSimulator","addFace","addTurn","center","topLeft","topRight","bottomLeft","bottomRight","doTurns","Object","assign","pyraminxTurnRegex","parsePyraminxAlgorithm","PyraminxSimulator","r","u","l","b","MEGAMINX_FACES","megaminxTurnNotation","PochmannDirections","FaceClockwise","FaceCounter","parseMegaminxAlgorithm","rawNumber","n","MegaminxSimulator","dr","dl","d","br","BR","BL","bl","makeFaceTurnDefinitions","turnFunc","Rxx","bind","Dxx","SIMULATOR_FACE","CUBE_FACES","CUBE_AXIS","CUBE_AXIS_FACES","AXIS_ORIENTATION","AXIS_FACE_ORIENTATION","EPSILON","ARRAY_TYPE","Float32Array","random","PI","create","out","clone","a","fromValues","x","y","z","multiply","cross","ax","ay","az","bx","by","bz","rotateZ","rad","p","cos","sin","hypot","arguments","sqrt","vec","len","degreesToRadians","degrees","polarToCartesian","radius","theta","dodecahedronInRadius","calculateCentroid","vertices","cx","cy","cz","vertex","RubiksCubeSimulator","gridSize","faceChanges","axis","column","layerChanges","nextFaceName","nextFace","currentFace","row","stickerIndex","sticker1","axisAlignedSticker","sticker2","clockwiseSticker","oppositeSticker","counterClockwiseSticker","from","to","error","increment","current","range","layer","layers","turnFace","translate","v","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","rotate","s","c","t","b00","b01","b02","b10","b11","b12","b20","b21","b22","a30","a31","a32","a33","b0","b1","b2","b3","generateUid","Object3D","uid","matrix","centroid","vector","color","Group","objects","setObjects","object","ATAN_15_DEG","atan","DEG_30_RADIANS","DEG_60_RADIANS","Square1Builder","sideLength","halfSide","halfEdgePiece","layerWidth","middleWidth","halfMiddleWidth","borderLayerWidth","outerHalfSide","outerHalfEdgePiece","pieces","buildSquare1","group","geometry","angle","corner","square1Corner","edge","square1Edge","Face","indices","filter","includes","Geometry","Square1Net","side1","side2","points","side","rotated","layerHeight","halfMiddleHeight","cornerLength","makeLayer","m","square1Middle","Square1","m1","m2","Plane","width","height","Triangle","verticies","SkewbNet","centerWidth","pow","cubeWidth","orange","makeStickers","green","white","red","yellow","blue","scale","triangles","triangle","setFaceColors","Skewb","halfWidth","TriangleLattice","base","halfBase","fullHeight","triangleBase","triangleHeight","inradius","count","PyraminxNet","inDiameter","faceSpacing","lattice","f","ARC_COS_THIRD","acos","DEG_120_RADIANS","SQRT_24","Pyraminx","insphereRadius","DividedPentagon","outRadius","pentagonOutRadius","radiusDiff","aSquared","angleRadians","cSquared","layerWidthToRadiusDiff","layerVerticies","faceVerticies","firstLayerFace","totalPoints","currentPoint","layerPoints","downMap","downMapping","prevLayer","layerVertexNumbers","currentLayer","currentLayerPoint","f2isCorner","f1","f2","f3","f4","makeFaces","mapping","previousPoints","vertexNumbers","segmentPoints","p1","p2","segments","lineSegmentLength","lastPoint","first","last","OPTIMAL_LAYER_WIDTH","2","3","4","MegaminxNet","getLayerWidth","ind","tan","pentagonInRadius","bottomTransforms","numStickers","array","chunkSize","newSize","ceil","_","chunkArray","Megaminx","megaminxRadius","makeGrid","halfLength","elementWidth","halfElementWidth","vOffset","makeRow","hOffset","RubiksCubeTopLayer","rotationAngle","stickerWidth","halfStickerWidth","halfCubeWidth","borderOffset","rotateBorder","g","radians","sticker","RubiksCubeNet","RubiksCube","Arrow","updatePolygonElement","polygon","strokeWidth","pointsAttribute","pointString","point","makePointsAttributeValue","colorValue","strokeValue","setAttributeNS","applyTransformations","transforms","w","CustomSVGRenderer","minx","miny","svgWidth","svgHeight","arrowColor","arrowStrokeWidth","polygons","lines","uidToPolygon","uidToLine","domElement","document","createElement","className","svgElement","createElementNS","createSVGElement","markers","defs","arrowHeadMarker","arrowHeadPolygon","appendChild","createMarkers","scene","camera","renderObject3D","renderPolygons","renderLines","sort","line","transformations","createPolygonElement","renderGeometry","renderArrow","sortObjects","screenPoint","addPolygon","arrow","objectToScreen","p1Screen","p2Screen","start","end","strokeColor","createArrowLineElement","aToWorld","bToWorld","aCentroid","bCentroid","Camera","fovy","aspect","near","far","nf","Infinity","Scene","VisualizerType","defaultCubeOptions","rotations","defaultMegaminxOptions","defaultPyraminxOptions","defaultSkewbOptions","defaultSquare1Options","slerp","omega","cosom","sinom","scale0","scale1","aw","bw","tmpvec3","xUnitVec3","yUnitVec3","temp1","temp2","matr","validatePuzzleOptions","options","case","isArray","keys","faceColor","mask","maskValues","Number","isInteger","stickerColors","faceColors","validColor","validRotation","isFinite","translation","validTranslation","arrows","validArrow","MegaminxTop","createFaces","removeHiddenStickers","initSquare1Simulator","simulator","puzzleFactory","CUBE","createCube","CUBE_NET","createCubeNet","CUBE_TOP","createCubeTop","MEGAMINX","createMegaminx","MEGAMINX_NET","createMegaminxNet","MEGAMINX_TOP","PYRAMINX","createPyraminx","PYRAMINX_NET","createPyraminxNet","SKEWB","SKEWB_NET","SQUARE1","createSquare1","SQUARE1_NET","createSquare1Net","isSquare1","canApplySimulatorColors","isPyraminx","isMegaminx","Visualizer","renderer","setPuzzleOptions","render","hasCustomColors","canUseSimulator","puzzleGeometry","setColors","applySimulatorColors","o","applyMask","applyAlgorithm","faceValues","applyColorScheme","getValues","maskedFace","setValue","rotation","q","x2","y2","z2","xx","yx","yy","zx","zy","zz","wx","wy","wz","halfToRad","sx","sy","sz","translationMatrix","add","puzzle","_a","_b","_c","_d","_e","_f","_g","_h","startFace","endFace","JSON","stringify","startTransformations","endTransformations","createArrow","getDefaultOptions","buildGroupMatrix","applyColors","clear","addArrows","defaultOptions","SVG","element","SvgVisualizer","querySelector","svgOptions","validateSvgOptions","PNG","container","setTimeout","targetImage","canvas","ctx","getContext","loader","Image","onload","drawImage","src","toDataURL","svgAsXML","XMLSerializer","serializeToString","encodeURIComponent","Masks","CUBE_3","LAST_LAYER","F2L","FIRST_LAYER","OLL","CORNERS_LAST_LAYER","EDGES_LAST_LAYER","MEGA_3","Rendering","PuzzleGeometry","Algorithm","__webpack_module_cache__","__webpack_require__","moduleId","__webpack_modules__","definition","defineProperty","enumerable","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag"],"mappings":"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","file":"puzzleGen.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"puzzleGen\"] = factory();\n\telse\n\t\troot[\"puzzleGen\"] = factory();\n})(this, function() {\nreturn ","export var TurnType;\n(function (TurnType) {\n TurnType[TurnType[\"Clockwise\"] = 0] = \"Clockwise\";\n TurnType[TurnType[\"CounterClockwise\"] = 1] = \"CounterClockwise\";\n TurnType[TurnType[\"Double\"] = 2] = \"Double\";\n})(TurnType || (TurnType = {}));\n","import { TurnType } from \"./algorithm\";\nvar TurnAbbreviation;\n(function (TurnAbbreviation) {\n TurnAbbreviation[\"Clockwise\"] = \"\";\n TurnAbbreviation[\"CounterClockwise\"] = \"'\";\n TurnAbbreviation[\"Double\"] = \"2\";\n})(TurnAbbreviation || (TurnAbbreviation = {}));\nexport var CubeAlgorithmUnit;\n(function (CubeAlgorithmUnit) {\n CubeAlgorithmUnit[\"F\"] = \"F\";\n CubeAlgorithmUnit[\"U\"] = \"U\";\n CubeAlgorithmUnit[\"R\"] = \"R\";\n CubeAlgorithmUnit[\"L\"] = \"L\";\n CubeAlgorithmUnit[\"D\"] = \"D\";\n CubeAlgorithmUnit[\"B\"] = \"B\";\n CubeAlgorithmUnit[\"M\"] = \"M\";\n CubeAlgorithmUnit[\"E\"] = \"E\";\n CubeAlgorithmUnit[\"S\"] = \"S\";\n CubeAlgorithmUnit[\"X\"] = \"x\";\n CubeAlgorithmUnit[\"Y\"] = \"y\";\n CubeAlgorithmUnit[\"Z\"] = \"z\";\n})(CubeAlgorithmUnit || (CubeAlgorithmUnit = {}));\nexport const possibleMoves = [\n CubeAlgorithmUnit.F,\n CubeAlgorithmUnit.U,\n CubeAlgorithmUnit.R,\n CubeAlgorithmUnit.L,\n CubeAlgorithmUnit.D,\n CubeAlgorithmUnit.B,\n CubeAlgorithmUnit.M,\n CubeAlgorithmUnit.E,\n CubeAlgorithmUnit.S,\n CubeAlgorithmUnit.X,\n CubeAlgorithmUnit.Y,\n CubeAlgorithmUnit.Z,\n];\nconst cubeRotations = [\n CubeAlgorithmUnit.X,\n CubeAlgorithmUnit.Y,\n CubeAlgorithmUnit.Z,\n];\nconst cubeTurnRegex = /([2-9]+)?([UuFfRrDdLlBbMESxyz])(w)?([2\\'])?/g;\n/**\n * Takes in an algorithm string and parses the turns from it\n * algorithm string format should be moves separated by a single space\n * (ex. \"U R2 L' x\")\n *\n * https://www.worldcubeassociation.org/regulations/#article-12-notation\n */\nexport function parseCubeAlgorithm(algorithm) {\n if (!algorithm) {\n return [];\n }\n let turns = [];\n let match;\n while ((match = cubeTurnRegex.exec(algorithm))) {\n let rawSlices = match[1];\n let rawFace = match[2];\n let outerBlockIndicator = match[3];\n let rawType = match[4] || TurnAbbreviation.Clockwise; // Default to clockwise\n let isLowerCaseMove = rawFace === rawFace.toLowerCase() &&\n cubeRotations.indexOf(rawFace) === -1;\n if (isLowerCaseMove) {\n rawFace = rawFace.toUpperCase();\n }\n let turn = {\n unit: getMove(rawFace),\n turnType: getTurnType(rawType),\n slices: isLowerCaseMove ? 2 : getSlices(rawSlices, outerBlockIndicator),\n };\n turns.push(turn);\n }\n return turns;\n}\nfunction getSlices(rawSlices, outerBlockIndicator) {\n if (outerBlockIndicator && !rawSlices) {\n return 2;\n }\n else if (!outerBlockIndicator && rawSlices) {\n throw new Error(`Invalid move: Cannot specify num slices if outer block move indicator 'w' is not present`);\n }\n else if (!outerBlockIndicator && !rawSlices) {\n return 1;\n }\n else {\n return parseInt(rawSlices);\n }\n}\nfunction getMove(rawFace) {\n if (possibleMoves.indexOf(rawFace) < 0) {\n throw new Error(`Invalid move (${rawFace}): Possible turn faces are [U R F L D B M E S x y z]`);\n }\n else\n return rawFace;\n}\nfunction getTurnType(rawType) {\n switch (rawType) {\n case TurnAbbreviation.Clockwise:\n return TurnType.Clockwise;\n case TurnAbbreviation.CounterClockwise:\n return TurnType.CounterClockwise;\n case TurnAbbreviation.Double:\n return TurnType.Double;\n default:\n throw new Error(`Invalid move modifier (${rawType})`);\n }\n}\n","/**\n * Class for simulating turns on symmetric twisty puzzles. This is acheived by\n * defining a set of faces with stickers, and a set of turns.\n *\n * @see {@link SkewbSimulator}\n *\n * @example\n * ```typescript\n * // extend class to create a coin simulator\n * export class CoinSimulator extends Simulator {\n * constructor() {\n * super()\n *\n * // Add a head face with one \"heads\" sticker\n * // Label this face \"top\"\n * const { stickerIds: top } = this.addFace(['heads'], 'top');\n *\n * // Add a tail face with one \"tails\" sticker\n * // Label this face \"bottom\"\n * const { stickerIds: bottom } = this.addface(['tails'], 'bottom');\n *\n * // Define a turn by providing the\n * // sticker id for the top and bottom stickers.\n * // Label this \"turnOver\"\n * this.addTurn([top[0], bottom[0]], \"turnOver\");\n * }\n *\n * // Flip the coin over\n * turnOver() {\n * // Execute the \"turnOver\" turn we created\n * this.doTurn(\"turnOver\")\n * }\n *\n * }\n * ```\n */\nexport class Simulator {\n constructor() {\n this.stickers = new Map();\n this.faces = new Map();\n this.turns = new Map();\n }\n /**\n * Adds a face of stickers to the puzzle.\n *\n * @param stickers - array of sticker values\n * @param label - label to reference the face by\n * @returns object with the faceId and list of sticker ids.\n * faceId will be label if that is present. Otherwise it\n * will be generated.\n * @example\n * ```\n * const stickers = ['red', 'red', 'red', 'red'];\n *\n * // Add the F face\n * addFace(stickers, 'F')\n * ```\n */\n addFace(stickers, label) {\n if (label && this.faces.has(label)) {\n throw `Face ${label} already exists`;\n }\n else if (!label) {\n label = (this.faces.size + 1).toString();\n }\n // Add Stickers\n const stickerIds = stickers.reduce((stickerIds, nextSticker) => {\n const stickerId = (this.stickers.size + 1).toString();\n this.stickers.set(stickerId, nextSticker);\n stickerIds.push(stickerId);\n return stickerIds;\n }, []);\n // Add Face\n this.faces.set(label, stickerIds);\n return {\n faceId: label,\n stickerIds,\n };\n }\n /**\n * Creates a turn definition that tells the simulator\n * what sticker values to change when turning.\n *\n * A change is an array with two sticker ids (ex. ['sticker1', 'sticker2'])\n * this means that when turning 'sticker1' will go to 'sticker2'.\n * Or when doing a reverse turn, `sticker2' will go to 'sticker1'\n *\n * @param changes - list of turn definitions.\n * @param label - label to reference the turn by\n * @returns label of the turn that was created\n */\n addTurn(changes, label) {\n if (label && this.turns.has(label)) {\n throw `Turn ${label} already exists`;\n }\n else if (!label) {\n label = (this.turns.size + 1).toString();\n }\n this.turns.set(label, changes);\n return label;\n }\n /**\n * Executes a turn on the puzzle\n *\n * @param label - label of the turn to execute\n * @param prime - true to do the turn in reverse\n */\n doTurn(label, reverse = false) {\n const changes = this.turns.get(label);\n if (!changes) {\n throw `Unknown turn ${label}`;\n }\n let movingSticker = reverse ? 1 : 0;\n let replacedSticker = reverse ? 0 : 1;\n let cached = {};\n changes.forEach((change) => {\n // Cache value we're replacing\n cached[change[replacedSticker]] = this.stickers.get(change[replacedSticker]);\n // Update sticker with new value\n this.stickers.set(change[replacedSticker], cached[change[movingSticker]] ||\n this.stickers.get(change[movingSticker]));\n });\n }\n /**\n * checks that every sticker on every face\n * is the same value\n */\n isSolved() {\n const faces = this.faces.entries();\n let entry = faces.next();\n do {\n const stickerIds = entry.value[1];\n let value = this.stickers.get(stickerIds[0]);\n for (let id of stickerIds) {\n if (value != this.stickers.get(id))\n return false;\n }\n entry = faces.next();\n } while (!entry.done);\n return true;\n }\n getValues() {\n let values = {};\n this.faces.forEach((stickerIds, key) => {\n values[key] = stickerIds.map((id) => this.stickers.get(id));\n });\n return values;\n }\n /**\n * override value of sticker on a face\n *\n * @param face - label\n * @param index - index of sticker to set value of\n * @param value - value to set the sticker to\n */\n setValue(face, index, value) {\n if (!this.faces.has(face)) {\n console.warn(`attempting to set sticker value on invalid face: ${face}`);\n return;\n }\n let faceStickers = this.faces.get(face);\n let stickerId = faceStickers[index];\n if (!faceStickers) {\n console.warn(`attempting to set sticker value for invalid sticker: ${face} ${index}`);\n return;\n }\n this.stickers.set(stickerId, value);\n }\n /**\n * parse and execute a sequence of moves\n *\n * @example\n * ```typescript\n * // assuming U, R, and F are turn labels\n * simulator.alg(\"U R F\")\n * ```\n *\n * @param alg - algorithm\n */\n alg(alg) {\n // Default implementation\n if (!alg) {\n return;\n }\n alg.split(\" \").forEach((turn) => this.doTurn(turn));\n }\n /**\n * reverses an algorithm then executes it\n */\n case(alg) {\n // No default implementation\n }\n /**\n * resets stickers back to solved position. Uses face name\n * as sticker value by default\n */\n reset() {\n this.faces.forEach((stickerIds, faceName) => {\n stickerIds.forEach((stickerId) => {\n this.stickers.set(stickerId, faceName);\n });\n });\n }\n}\n","// Standard Cube Colors\nexport const YELLOW = { value: \"#FFFF00\" };\nexport const RED = { value: \"#FF0000\" };\nexport const BLUE = { value: \"#0000FF\" };\nexport const WHITE = { value: \"#FFFFFF\" };\nexport const ORANGE = { value: \"#FFA500\" };\nexport const GREEN = { value: \"#00FF00\" };\n// Extra colors for megaminx\nexport const PURPLE = { value: \"#800080\" };\nexport const GREY = { value: \"#808080\" };\nexport const DARK_BLUE = { value: \"#00008B\" };\nexport const LIGHT_YELLOW = { value: \"#ffffb3\" };\nexport const LIGHT_GREEN = { value: \"#32CD32\" };\nexport const PINK = { value: \"#FF69B4\" };\nexport const BLACK = { value: \"#000000\" };\nexport const MASK_COLOR = { value: \"#404040\" };\n// Stickerless\nexport const YELLOW_STICKERLESS = {\n value: \"#FFFF00\",\n stroke: \"#DDDD00\",\n};\nexport const RED_STICKERLESS = { value: \"#FF0000\", stroke: \"#DD0000\" };\nexport const BLUE_STICKERLESS = { value: \"#0000FF\", stroke: \"#0000DD\" };\nexport const WHITE_STICKERLESS = { value: \"#FFFFFF\", stroke: \"#DDD\" };\nexport const ORANGE_STICKERLESS = {\n value: \"#FFA500\",\n stroke: \"#DD8500\",\n};\nexport const GREEN_STICKERLESS = {\n value: \"#00FF00\",\n stroke: \"#00DD00\",\n};\nexport const PURPLE_STICKERLESS = {\n value: \"#800080\",\n stroke: \"#5c005c\",\n};\nexport const GREY_STICKERLESS = { value: \"#808080\", stroke: \"#6b6b6b\" };\nexport const DARK_BLUE_STICKERLESS = {\n value: \"#00008B\",\n stroke: \"#000075\",\n};\nexport const LIGHT_YELLOW_STICKERLESS = {\n value: \"#ffffb3\",\n stroke: \"#e6e6a3\",\n};\nexport const LIGHT_GREEN_STICKERLESS = {\n value: \"#32CD32\",\n stroke: \"#2db32d\",\n};\nexport const PINK_STICKERLESS = { value: \"#FF69B4\", stroke: \"#de5b9c\" };\n","export var PIECE_TYPE;\n(function (PIECE_TYPE) {\n PIECE_TYPE[PIECE_TYPE[\"CORNER\"] = 0] = \"CORNER\";\n PIECE_TYPE[PIECE_TYPE[\"EDGE\"] = 1] = \"EDGE\";\n PIECE_TYPE[PIECE_TYPE[\"MIDDLE\"] = 2] = \"MIDDLE\";\n})(PIECE_TYPE || (PIECE_TYPE = {}));\n","import { WHITE, RED, BLUE, GREEN, ORANGE, YELLOW } from \"./../colors\";\nimport { PIECE_TYPE } from \"./enum\";\nexport const ROTATION_VECTOR = [0.96875, -0.24803, 0];\nexport const TOP_COLOR = YELLOW;\nexport const BOTTOM_COLOR = WHITE;\nexport const FRONT_COLOR = RED;\nexport const LEFT_COLOR = BLUE;\nexport const RIGHT_COLOR = GREEN;\nexport const BACK_COLOR = ORANGE;\nexport const DEFAULT_SQ1_SCHEME = {\n top: TOP_COLOR,\n front: FRONT_COLOR,\n bottom: BOTTOM_COLOR,\n left: LEFT_COLOR,\n right: RIGHT_COLOR,\n back: BACK_COLOR\n};\nexport const SOLVED_TOP_PIECES = [\n { type: PIECE_TYPE.CORNER, colors: [TOP_COLOR, FRONT_COLOR, LEFT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [TOP_COLOR, LEFT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [TOP_COLOR, LEFT_COLOR, BACK_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [TOP_COLOR, BACK_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [TOP_COLOR, BACK_COLOR, RIGHT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [TOP_COLOR, RIGHT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [TOP_COLOR, RIGHT_COLOR, FRONT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [TOP_COLOR, FRONT_COLOR] },\n];\nexport const SOLVED_BOTTOM_PIECES = [\n { type: PIECE_TYPE.EDGE, colors: [BOTTOM_COLOR, BACK_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [BOTTOM_COLOR, BACK_COLOR, LEFT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [BOTTOM_COLOR, LEFT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [BOTTOM_COLOR, LEFT_COLOR, FRONT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [BOTTOM_COLOR, FRONT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [BOTTOM_COLOR, FRONT_COLOR, RIGHT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [BOTTOM_COLOR, RIGHT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [BOTTOM_COLOR, RIGHT_COLOR, BACK_COLOR] },\n];\n","const square1TurnRegex = /(\\/|\\((-?\\d),(-?\\d)\\))/g;\nexport function parseSquare1Algorithm(algorithm) {\n let turns = [];\n let match;\n while ((match = square1TurnRegex.exec(algorithm))) {\n if (match[0] === \"/\") {\n turns.push({ slice: true });\n }\n else {\n turns.push({\n top: parseInt(match[2]),\n bottom: parseInt(match[3]),\n });\n }\n }\n return turns;\n}\n","import { Simulator } from \"./../simulator\";\nimport { BACK_COLOR, BOTTOM_COLOR, DEFAULT_SQ1_SCHEME, FRONT_COLOR, LEFT_COLOR, RIGHT_COLOR, TOP_COLOR } from \"./../../puzzles/square1/constants\";\nimport { PIECE_TYPE } from \"../../puzzles/square1/enum\";\nimport { parseSquare1Algorithm } from \"../../algorithms/square1\";\nconst pieceValue = {\n [PIECE_TYPE.CORNER]: 2,\n [PIECE_TYPE.EDGE]: 1,\n};\nexport class Square1Simualtor extends Simulator {\n constructor(scheme = DEFAULT_SQ1_SCHEME) {\n super();\n this.scheme = scheme;\n this.topLayer = solvedTop(this.scheme);\n this.bottomLayer = solvedBottom(this.scheme);\n this.middleRotated = false;\n }\n alg(alg) {\n parseSquare1Algorithm(alg).forEach((move) => {\n if (\"slice\" in move) {\n this.slice();\n }\n else {\n this.rotateTop(move.top);\n this.rotateBottom(move.bottom);\n }\n });\n }\n case(alg) {\n parseSquare1Algorithm(alg)\n .reverse()\n .forEach((move) => {\n if (\"slice\" in move) {\n this.slice();\n }\n else {\n this.rotateTop(move.top * -1);\n this.rotateBottom(move.bottom * -1);\n }\n });\n }\n slice() {\n let topNum = 0;\n let bottomNum = 0;\n for (let i = this.topLayer.length, value = 0; i > 0 && value < 6; i--) {\n value += pieceValue[this.topLayer[i - 1].type];\n topNum++;\n }\n for (let i = this.bottomLayer.length, value = 0; i > 0 && value < 6; i--) {\n value += pieceValue[this.bottomLayer[i - 1].type];\n bottomNum++;\n }\n const topSlice = this.topLayer.splice(this.topLayer.length - topNum, this.topLayer.length);\n const bottomSlice = this.bottomLayer.splice(this.bottomLayer.length - bottomNum, this.bottomLayer.length);\n this.topLayer = this.topLayer.concat(bottomSlice);\n this.bottomLayer = this.bottomLayer.concat(topSlice);\n this.middleRotated = !this.middleRotated;\n }\n rotateTop(turns) {\n while (turns != 0) {\n if (turns < 0) {\n const piece = this.topLayer.shift();\n const value = pieceValue[piece.type];\n if (Math.abs(turns) < value) {\n throw \"Invalid Square1 Move\";\n }\n this.topLayer.push(piece);\n turns += value;\n }\n else {\n const piece = this.topLayer.pop();\n const value = pieceValue[piece.type];\n if (Math.abs(turns) < value) {\n throw \"Invalid Square1 Move\";\n }\n this.topLayer.unshift(piece);\n turns -= value;\n }\n }\n }\n rotateBottom(turns) {\n while (turns != 0) {\n if (turns < 0) {\n const piece = this.bottomLayer.shift();\n const value = pieceValue[piece.type];\n if (Math.abs(turns) < value) {\n throw \"Invalid Square1 Move\";\n }\n this.bottomLayer.push(piece);\n turns += value;\n }\n else {\n const piece = this.bottomLayer.pop();\n const value = pieceValue[piece.type];\n if (Math.abs(turns) < value) {\n throw \"Invalid Square1 Move\";\n }\n this.bottomLayer.unshift(piece);\n turns -= value;\n }\n }\n }\n}\nfunction solvedTop(scheme) {\n return [\n { type: PIECE_TYPE.CORNER, colors: [scheme.top || TOP_COLOR, scheme.front || FRONT_COLOR, scheme.left || LEFT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [scheme.top || TOP_COLOR, scheme.left || LEFT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [scheme.top || TOP_COLOR, scheme.left || LEFT_COLOR, scheme.back || BACK_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [scheme.top || TOP_COLOR, scheme.back || BACK_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [scheme.top || TOP_COLOR, scheme.back || BACK_COLOR, scheme.right || RIGHT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [scheme.top || TOP_COLOR, scheme.right || RIGHT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [scheme.top || TOP_COLOR, scheme.right || RIGHT_COLOR, scheme.front || FRONT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [scheme.top || TOP_COLOR, scheme.front || FRONT_COLOR] }\n ];\n}\nfunction solvedBottom(scheme) {\n return [\n { type: PIECE_TYPE.EDGE, colors: [scheme.bottom || BOTTOM_COLOR, scheme.back || BACK_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [scheme.bottom || BOTTOM_COLOR, scheme.back || BACK_COLOR, scheme.left || LEFT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [scheme.bottom || BOTTOM_COLOR, scheme.left || LEFT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [scheme.bottom || BOTTOM_COLOR, scheme.left || LEFT_COLOR, scheme.front || FRONT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [scheme.bottom || BOTTOM_COLOR, scheme.front || FRONT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [scheme.bottom || BOTTOM_COLOR, scheme.front || FRONT_COLOR, scheme.right || RIGHT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [scheme.bottom || BOTTOM_COLOR, scheme.right || RIGHT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [scheme.bottom || BOTTOM_COLOR, scheme.right || RIGHT_COLOR, scheme.back || BACK_COLOR] },\n ];\n}\n","import { TurnType } from \"./algorithm\";\nconst skewbTurnRegex = /([LRUB])(\\'?)/g;\nconst DirectionToTurnType = {\n \"\": TurnType.Clockwise,\n \"'\": TurnType.CounterClockwise,\n};\nexport function parseSkewbAlgorithm(algorithm) {\n let turns = [];\n let match;\n while ((match = skewbTurnRegex.exec(algorithm))) {\n const rawUnit = match[1];\n const rawDirection = match[2];\n turns.push({\n unit: rawUnit,\n turnType: DirectionToTurnType[rawDirection],\n slices: 1,\n });\n }\n return turns;\n}\n","/**\n * Splits an array into chunks\n *\n * @param array original array\n * @param chunkSize\n *\n * @example\n * ```\n * chunkArray([1,2,3,4,5,6], 2)\n * // returns [[1,2], [3,4], [5,6]]\n * ```\n */\nexport function chunkArray(array, chunkSize) {\n const newSize = Math.ceil(array.length / chunkSize);\n return new Array(newSize)\n .fill(null)\n .map((_, index) => array.slice(index * chunkSize, (index + 1) * chunkSize));\n}\n/**\n * Generates an array of set size filled with a specific value\n *\n * @param length length of the array\n * @param value value to fill the array with\n */\nexport function fillArray(length, value) {\n return new Array(length).fill(value);\n}\n","import { TurnType } from \"../../algorithms/algorithm\";\nimport { parseSkewbAlgorithm } from \"../../algorithms/skewb\";\nimport { fillArray } from \"../../utils/arrays\";\nimport { Simulator } from \"./../simulator\";\n/**\n * Simulates a standard skewb\n *\n * Imagine the faces like this\n * ```\n * U\n * L F R B\n * D\n * ```\n *\n * each face has 5 sickers (1 center, 4 corners), stored as\n * an array. Each index of the array maps to stickers like\n * so, 0 being the center, 1-4 being the corners from top left\n * to bottom right\n * ```\n * 1 2\n * 0\n * 3 4\n * ```\n *\n * So all together the simulator stores information like\n * this\n * ```\n * U1 U2\n * U0\n * U3 U4\n * L1 L2 F1 F2 R1 R2 B1 B2\n * L0 F0 R0 B0\n * L3 L4 F3 F4 F3 F4 B3 B4\n * D1 D2\n * D0\n * D3 D4\n * ```\n */\nexport class SkewbSimulator extends Simulator {\n constructor() {\n super();\n const { stickerIds: top } = this.addFace(fillArray(5, \"top\"), \"top\");\n const { stickerIds: front } = this.addFace(fillArray(5, \"front\"), \"front\");\n const { stickerIds: right } = this.addFace(fillArray(5, \"right\"), \"right\");\n const { stickerIds: bottom } = this.addFace(fillArray(5, \"bottom\"), \"bottom\");\n const { stickerIds: back } = this.addFace(fillArray(5, \"back\"), \"back\");\n const { stickerIds: left } = this.addFace(fillArray(5, \"left\"), \"left\");\n // Skewb Notation https://www.worldcubeassociation.org/regulations/#12h\n this.addTurn([\n [right[0], back[0]],\n [right[2], back[4]],\n [right[3], back[1]],\n [right[4], back[3]],\n [back[0], bottom[0]],\n [back[4], bottom[2]],\n [back[1], bottom[3]],\n [back[3], bottom[4]],\n [bottom[0], right[0]],\n [bottom[2], right[2]],\n [bottom[3], right[3]],\n [bottom[4], right[4]],\n [front[4], top[2]],\n [top[2], left[3]],\n [left[3], front[4]],\n ], \"R\");\n this.addTurn([\n [center(top), center(left)],\n [topLeft(top), topLeft(left)],\n [topRight(top), topRight(left)],\n [bottomLeft(top), bottomLeft(left)],\n [center(left), center(back)],\n [topLeft(left), topRight(back)],\n [topRight(left), bottomRight(back)],\n [bottomLeft(left), topLeft(back)],\n [center(back), center(top)],\n [topRight(back), topLeft(top)],\n [bottomRight(back), topRight(top)],\n [topLeft(back), bottomLeft(top)],\n [topRight(right), topLeft(front)],\n [topLeft(front), bottomLeft(bottom)],\n [bottomLeft(bottom), topRight(right)],\n ], \"U\");\n this.addTurn([\n [center(left), center(front)],\n [bottomLeft(left), topLeft(front)],\n [topRight(left), bottomRight(front)],\n [bottomRight(left), bottomLeft(front)],\n [center(front), center(bottom)],\n [topLeft(front), topRight(bottom)],\n [bottomRight(front), bottomLeft(bottom)],\n [bottomLeft(front), topLeft(bottom)],\n [center(bottom), center(left)],\n [topRight(bottom), bottomLeft(left)],\n [bottomLeft(bottom), topRight(left)],\n [topLeft(bottom), bottomRight(left)],\n [bottomRight(back), bottomLeft(top)],\n [bottomLeft(top), bottomLeft(right)],\n [bottomLeft(right), bottomRight(back)],\n ], \"L\");\n this.addTurn([\n [center(back), center(left)],\n [topRight(back), bottomRight(left)],\n [bottomLeft(back), topLeft(left)],\n [bottomRight(back), bottomLeft(left)],\n [center(left), center(bottom)],\n [bottomRight(left), bottomRight(bottom)],\n [topLeft(left), topLeft(bottom)],\n [bottomLeft(left), bottomLeft(bottom)],\n [center(bottom), center(back)],\n [bottomRight(bottom), topRight(back)],\n [topLeft(bottom), bottomLeft(back)],\n [bottomLeft(bottom), bottomRight(back)],\n [topLeft(top), bottomLeft(front)],\n [bottomLeft(front), bottomRight(right)],\n [bottomRight(right), topLeft(top)],\n ], \"B\");\n }\n R(reverse) {\n this.doTurn(\"R\", reverse);\n }\n U(reverse) {\n this.doTurn(\"U\", reverse);\n }\n L(reverse) {\n this.doTurn(\"L\", reverse);\n }\n B(reverse) {\n this.doTurn(\"B\", reverse);\n }\n alg(alg) {\n if (!alg) {\n return;\n }\n this.doTurns(parseSkewbAlgorithm(alg));\n }\n case(alg) {\n if (!alg) {\n return;\n }\n let turns = parseSkewbAlgorithm(alg)\n .reverse()\n .map((turn) => (Object.assign(Object.assign({}, turn), { turnType: turn.turnType === TurnType.Clockwise\n ? TurnType.CounterClockwise\n : TurnType.Clockwise })));\n this.doTurns(turns);\n }\n doTurns(turns) {\n turns.forEach((turn) => {\n let reverse = turn.turnType === TurnType.CounterClockwise;\n switch (turn.unit) {\n case \"R\":\n this.R(reverse);\n break;\n case \"U\":\n this.U(reverse);\n break;\n case \"L\":\n this.L(reverse);\n break;\n case \"B\":\n this.B(reverse);\n break;\n }\n });\n }\n}\nconst center = (face) => face[0];\nconst topLeft = (face) => face[1];\nconst topRight = (face) => face[2];\nconst bottomLeft = (face) => face[3];\nconst bottomRight = (face) => face[4];\n","import { TurnType } from \"./algorithm\";\nconst pyraminxTurnRegex = /([LlRrUuBb])(\\'?)/g;\nconst DirectionToTurnType = {\n \"\": TurnType.Clockwise,\n \"'\": TurnType.CounterClockwise,\n};\nexport function parsePyraminxAlgorithm(algorithm) {\n let turns = [];\n let match;\n while ((match = pyraminxTurnRegex.exec(algorithm))) {\n const rawUnit = match[1];\n const rawDirection = match[2];\n turns.push({\n unit: rawUnit,\n turnType: DirectionToTurnType[rawDirection],\n slices: 1,\n });\n }\n return turns;\n}\n","import { TurnType } from \"../../algorithms/algorithm\";\nimport { parsePyraminxAlgorithm } from \"../../algorithms/pyraminx\";\nimport { fillArray } from \"../../utils/arrays\";\nimport { Simulator } from \"./../simulator\";\nexport class PyraminxSimulator extends Simulator {\n constructor() {\n super();\n const { stickerIds: U } = this.addFace(fillArray(9, \"top\"), \"top\");\n const { stickerIds: L } = this.addFace(fillArray(9, \"left\"), \"left\");\n const { stickerIds: R } = this.addFace(fillArray(9, \"right\"), \"right\");\n const { stickerIds: B } = this.addFace(fillArray(9, \"back\"), \"back\");\n // Tip turns\n this.addTurn([\n [U[8], R[8]],\n [R[8], L[8]],\n [L[8], U[8]],\n ], \"u\");\n this.addTurn([\n [L[0], B[8]],\n [B[8], U[4]],\n [U[4], L[0]],\n ], \"l\");\n this.addTurn([\n [L[4], R[0]],\n [R[0], B[4]],\n [B[4], L[4]],\n ], \"r\");\n this.addTurn([\n [R[4], U[0]],\n [U[0], B[0]],\n [B[0], R[4]],\n ], \"b\");\n // Full turns\n this.addTurn([\n [U[5], R[5]],\n [U[6], R[6]],\n [U[7], R[7]],\n [U[8], R[8]],\n [R[5], L[5]],\n [R[6], L[6]],\n [R[7], L[7]],\n [R[8], L[8]],\n [L[5], U[5]],\n [L[6], U[6]],\n [L[7], U[7]],\n [L[8], U[8]],\n ], \"U\");\n this.addTurn([\n [L[0], B[8]],\n [L[1], B[6]],\n [L[2], B[5]],\n [L[5], B[7]],\n [B[8], U[4]],\n [B[6], U[3]],\n [B[5], U[7]],\n [B[7], U[2]],\n [U[4], L[0]],\n [U[3], L[1]],\n [U[7], L[2]],\n [U[2], L[5]],\n ], \"L\");\n this.addTurn([\n [L[2], R[5]],\n [L[3], R[1]],\n [L[4], R[0]],\n [L[7], R[2]],\n [R[5], B[2]],\n [R[1], B[3]],\n [R[0], B[4]],\n [R[2], B[7]],\n [B[2], L[2]],\n [B[3], L[3]],\n [B[4], L[4]],\n [B[7], L[7]],\n ], \"R\");\n this.addTurn([\n [R[2], U[5]],\n [R[3], U[1]],\n [R[4], U[0]],\n [R[7], U[2]],\n [U[5], B[5]],\n [U[1], B[1]],\n [U[0], B[0]],\n [U[2], B[2]],\n [B[5], R[2]],\n [B[1], R[3]],\n [B[0], R[4]],\n [B[2], R[7]],\n ], \"B\");\n }\n U(reverse) {\n this.doTurn(\"U\", reverse);\n }\n R(reverse) {\n this.doTurn(\"R\", reverse);\n }\n L(reverse) {\n this.doTurn(\"L\", reverse);\n }\n B(reverse) {\n this.doTurn(\"B\", reverse);\n }\n u(reverse) {\n this.doTurn(\"u\", reverse);\n }\n r(reverse) {\n this.doTurn(\"r\", reverse);\n }\n l(reverse) {\n this.doTurn(\"l\", reverse);\n }\n b(reverse) {\n this.doTurn(\"b\", reverse);\n }\n alg(alg) {\n if (!alg) {\n return;\n }\n this.doTurns(parsePyraminxAlgorithm(alg));\n }\n case(alg) {\n if (!alg) {\n return;\n }\n let turns = parsePyraminxAlgorithm(alg)\n .reverse()\n .map((turn) => (Object.assign(Object.assign({}, turn), { turnType: turn.turnType === TurnType.Clockwise\n ? TurnType.CounterClockwise\n : TurnType.Clockwise })));\n this.doTurns(turns);\n }\n doTurns(turns) {\n turns.forEach((turn) => {\n let reverse = turn.turnType === TurnType.CounterClockwise;\n switch (turn.unit) {\n case \"R\":\n this.R(reverse);\n break;\n case \"r\":\n this.r(reverse);\n break;\n case \"U\":\n this.U(reverse);\n break;\n case \"u\":\n this.u(reverse);\n break;\n case \"L\":\n this.L(reverse);\n break;\n case \"l\":\n this.l(reverse);\n break;\n case \"B\":\n this.B(reverse);\n break;\n case \"b\":\n this.b(reverse);\n break;\n }\n });\n }\n}\n","export const MEGAMINX_FACES = [\n // Front\n \"U\",\n \"R\",\n \"F\",\n \"dr\",\n \"dl\",\n \"L\",\n // Back\n \"d\",\n \"br\",\n \"BR\",\n \"BL\",\n \"bl\",\n \"b\",\n];\n","import { TurnType } from \"./algorithm\";\nconst megaminxTurnNotation = /([RD])([\\+\\+|\\-\\-]+)|([UFRL]|BR|BL)([2-3]?)(\\'?)/g;\nvar PochmannDirections;\n(function (PochmannDirections) {\n PochmannDirections[\"Clockwise\"] = \"++\";\n PochmannDirections[\"CounterClockwise\"] = \"--\";\n PochmannDirections[\"FaceClockwise\"] = \"\";\n PochmannDirections[\"FaceCounter\"] = \"'\";\n})(PochmannDirections || (PochmannDirections = {}));\nconst DirectionToTurnType = {\n [PochmannDirections.Clockwise]: TurnType.Clockwise,\n [PochmannDirections.CounterClockwise]: TurnType.CounterClockwise,\n [PochmannDirections.FaceClockwise]: TurnType.Clockwise,\n [PochmannDirections.FaceCounter]: TurnType.CounterClockwise,\n};\n/**\n * Takes in a megaminx algorithm in stefan pochmann notation as a string\n * and parses the turns from it\n *\n * Also supports face turns U,F,R,L,BR,BL as i've seen in some algorithms online\n *\n * algorithm string format should be moves separated by a single space\n *\n * @example\n * ```typescript\n * parseMegaminxAlgorithm(\"D++ R-- D-- U\")\n * parseMegaminxAlgorithm(\"R' U2' R2 U R2' U R2 U2' R'\")\n * ```\n *\n * @see https://www.worldcubeassociation.org/regulations/#article-12-notation\n */\nexport function parseMegaminxAlgorithm(algorithm) {\n if (!algorithm) {\n return [];\n }\n let turns = [];\n let match;\n while ((match = megaminxTurnNotation.exec(algorithm))) {\n const rawUnit = match[1] ? `${match[1]}xx` : match[3];\n const rawDirection = match[2] || match[5];\n const rawNumber = match[4];\n turns.push({\n unit: rawUnit,\n turnType: DirectionToTurnType[rawDirection],\n slices: 1,\n n: rawNumber ? parseInt(rawNumber) : 1,\n });\n }\n return turns;\n}\n","import { TurnType } from \"./../../algorithms/algorithm\";\nimport { MEGAMINX_FACES } from \"./constants\";\nimport { Simulator } from \"./../simulator\";\nimport { fillArray } from \"../../utils/arrays\";\nimport { parseMegaminxAlgorithm } from \"../../algorithms/megaminx\";\n/**\n * Simulator to define megaminx type puzzles\n *\n * Currently only standard megaminx size supported.\n */\nexport class MegaminxSimulator extends Simulator {\n constructor() {\n super();\n MEGAMINX_FACES.forEach((faceName) => {\n this.addFace(fillArray(11, faceName), faceName);\n });\n const U = this.faces.get(\"U\"); // White\n const R = this.faces.get(\"R\"); // Blue\n const F = this.faces.get(\"F\"); // Red\n const dr = this.faces.get(\"dr\"); // Pink\n const dl = this.faces.get(\"dl\"); // Light Yellow\n const L = this.faces.get(\"L\"); // Green\n const d = this.faces.get(\"d\"); // Gray\n const br = this.faces.get(\"br\"); // Light Green\n const BR = this.faces.get(\"BR\"); // Yellow\n const BL = this.faces.get(\"BL\"); // Purple\n const bl = this.faces.get(\"bl\"); // Dark Blue\n const b = this.faces.get(\"b\"); // Orange\n // R\n this.addTurn([\n [F[2], U[6]],\n [F[1], U[5]],\n [F[10], U[4]],\n [U[6], BR[10]],\n [U[5], BR[9]],\n [U[4], BR[8]],\n [BR[10], br[8]],\n [BR[9], br[7]],\n [BR[8], br[6]],\n [br[8], dr[2]],\n [br[7], dr[1]],\n [br[6], dr[10]],\n [dr[2], F[2]],\n [dr[1], F[1]],\n [dr[10], F[10]],\n ...makeFaceTurnDefinitions(R),\n ], \"R\");\n // F\n this.addTurn([\n [U[2], R[2]],\n [U[3], R[3]],\n [U[4], R[4]],\n [R[2], dr[2]],\n [R[3], dr[3]],\n [R[4], dr[4]],\n [dr[2], dl[2]],\n [dr[3], dl[3]],\n [dr[4], dl[4]],\n [dl[2], L[2]],\n [dl[3], L[3]],\n [dl[4], L[4]],\n [L[2], U[2]],\n [L[3], U[3]],\n [L[4], U[4]],\n ...makeFaceTurnDefinitions(F),\n ], \"F\");\n // U\n this.addTurn([\n [F[2], L[4]],\n [F[3], L[5]],\n [F[4], L[6]],\n [L[4], BL[8]],\n [L[5], BL[9]],\n [L[6], BL[10]],\n [BL[8], BR[6]],\n [BL[9], BR[7]],\n [BL[10], BR[8]],\n [BR[6], R[10]],\n [BR[7], R[1]],\n [BR[8], R[2]],\n [R[10], F[2]],\n [R[1], F[3]],\n [R[2], F[4]],\n ...makeFaceTurnDefinitions(U),\n ], \"U\");\n // L\n this.addTurn([\n [F[4], dl[4]],\n [F[5], dl[5]],\n [F[6], dl[6]],\n [dl[4], bl[8]],\n [dl[5], bl[9]],\n [dl[6], bl[10]],\n [bl[8], BL[6]],\n [bl[9], BL[7]],\n [bl[10], BL[8]],\n [BL[6], U[10]],\n [BL[7], U[1]],\n [BL[8], U[2]],\n [U[10], F[4]],\n [U[1], F[5]],\n [U[2], F[6]],\n ...makeFaceTurnDefinitions(L),\n ], \"L\");\n // BR\n this.addTurn([\n [U[6], BL[10]],\n [U[7], BL[1]],\n [U[8], BL[2]],\n [BL[10], b[8]],\n [BL[1], b[9]],\n [BL[2], b[10]],\n [b[8], br[4]],\n [b[9], br[5]],\n [b[10], br[6]],\n [br[4], R[8]],\n [br[5], R[9]],\n [br[6], R[10]],\n [R[8], U[6]],\n [R[9], U[7]],\n [R[10], U[8]],\n ...makeFaceTurnDefinitions(BR),\n ], \"BR\");\n // BL\n this.addTurn([\n [U[8], L[6]],\n [U[9], L[7]],\n [U[10], L[8]],\n [L[6], bl[10]],\n [L[7], bl[1]],\n [L[8], bl[2]],\n [bl[10], b[6]],\n [bl[1], b[7]],\n [bl[2], b[8]],\n [b[6], BR[4]],\n [b[7], BR[5]],\n [b[8], BR[6]],\n [BR[4], U[8]],\n [BR[5], U[9]],\n [BR[6], U[10]],\n ...makeFaceTurnDefinitions(BL),\n ], \"BL\");\n // dr\n this.addTurn([\n [F[8], R[4]],\n [F[9], R[5]],\n [F[10], R[6]],\n [R[4], br[8]],\n [R[5], br[9]],\n [R[6], br[10]],\n [br[8], d[6]],\n [br[9], d[7]],\n [br[10], d[8]],\n [d[6], dl[10]],\n [d[7], dl[1]],\n [d[8], dl[2]],\n [dl[10], F[8]],\n [dl[1], F[9]],\n [dl[2], F[10]],\n ...makeFaceTurnDefinitions(dr),\n ], \"dr\");\n // dl\n this.addTurn([\n [F[6], dr[4]],\n [F[7], dr[5]],\n [F[8], dr[6]],\n [dr[4], d[8]],\n [dr[5], d[9]],\n [dr[6], d[10]],\n [d[8], bl[6]],\n [d[9], bl[7]],\n [d[10], bl[8]],\n [bl[6], L[10]],\n [bl[7], L[1]],\n [bl[8], L[2]],\n [L[10], F[6]],\n [L[1], F[7]],\n [L[2], F[8]],\n ...makeFaceTurnDefinitions(dl),\n ], \"dl\");\n // d\n this.addTurn([\n [br[10], b[2]],\n [br[1], b[3]],\n [br[2], b[4]],\n [b[2], bl[4]],\n [b[3], bl[5]],\n [b[4], bl[6]],\n [bl[4], dl[8]],\n [bl[5], dl[9]],\n [bl[6], dl[10]],\n [dl[8], dr[6]],\n [dl[9], dr[7]],\n [dl[10], dr[8]],\n [dr[6], br[10]],\n [dr[7], br[1]],\n [dr[8], br[2]],\n ...makeFaceTurnDefinitions(d),\n ], \"d\");\n // br\n this.addTurn([\n [b[10], d[4]],\n [b[1], d[5]],\n [b[2], d[6]],\n [d[4], dr[8]],\n [d[5], dr[9]],\n [d[6], dr[10]],\n [dr[8], R[6]],\n [dr[9], R[7]],\n [dr[10], R[8]],\n [R[6], BR[10]],\n [R[7], BR[1]],\n [R[8], BR[2]],\n [BR[10], b[10]],\n [BR[1], b[1]],\n [BR[2], b[2]],\n ...makeFaceTurnDefinitions(br),\n ], \"br\");\n // bl\n this.addTurn([\n [BL[4], L[8]],\n [BL[5], L[9]],\n [BL[6], L[10]],\n [L[8], dl[6]],\n [L[9], dl[7]],\n [L[10], dl[8]],\n [dl[6], d[10]],\n [dl[7], d[1]],\n [dl[8], d[2]],\n [d[10], b[4]],\n [d[1], b[5]],\n [d[2], b[6]],\n [b[4], BL[4]],\n [b[5], BL[5]],\n [b[6], BL[6]],\n ...makeFaceTurnDefinitions(bl),\n ], \"bl\");\n // b\n this.addTurn([\n [br[2], BR[2]],\n [br[3], BR[3]],\n [br[4], BR[4]],\n [BR[2], BL[2]],\n [BR[3], BL[3]],\n [BR[4], BL[4]],\n [BL[2], bl[2]],\n [BL[3], bl[3]],\n [BL[4], bl[4]],\n [bl[2], d[2]],\n [bl[3], d[3]],\n [bl[4], d[4]],\n [d[2], br[2]],\n [d[3], br[3]],\n [d[4], br[4]],\n ...makeFaceTurnDefinitions(b),\n ], \"b\");\n // \"Pochmann notation\"\n // D++ / D--\n this.addTurn([\n // Top Layer\n [F[0], R[0]],\n [F[1], R[9]],\n [F[5], R[3]],\n [F[6], R[4]],\n [F[7], R[5]],\n [F[8], R[6]],\n [F[9], R[7]],\n [F[10], R[8]],\n [R[0], BR[0]],\n [R[3], BR[9]],\n [R[4], BR[10]],\n [R[5], BR[1]],\n [R[6], BR[2]],\n [R[7], BR[3]],\n [R[8], BR[4]],\n [R[9], BR[5]],\n [BR[0], BL[0]],\n [BR[9], BL[1]],\n [BR[10], BL[2]],\n [BR[1], BL[3]],\n [BR[2], BL[4]],\n [BR[3], BL[5]],\n [BR[4], BL[6]],\n [BR[5], BL[7]],\n [BL[0], L[0]],\n [BL[1], L[7]],\n [BL[2], L[8]],\n [BL[3], L[9]],\n [BL[4], L[10]],\n [BL[5], L[1]],\n [BL[6], L[2]],\n [BL[7], L[3]],\n [L[0], F[0]],\n [L[7], F[5]],\n [L[8], F[6]],\n [L[9], F[7]],\n [L[10], F[8]],\n [L[1], F[9]],\n [L[2], F[10]],\n [L[3], F[1]],\n // Bottom Layer\n [dr[0], br[0]],\n [dr[1], br[5]],\n [dr[2], br[6]],\n [dr[3], br[7]],\n [dr[4], br[8]],\n [dr[5], br[9]],\n [dr[6], br[10]],\n [dr[7], br[1]],\n [dr[8], br[2]],\n [dr[9], br[3]],\n [dr[10], br[4]],\n [br[0], b[0]],\n [br[1], b[3]],\n [br[2], b[4]],\n [br[3], b[5]],\n [br[4], b[6]],\n [br[5], b[7]],\n [br[6], b[8]],\n [br[7], b[9]],\n [br[8], b[10]],\n [br[9], b[1]],\n [br[10], b[2]],\n [b[0], bl[0]],\n [b[1], bl[3]],\n [b[2], bl[4]],\n [b[3], bl[5]],\n [b[4], bl[6]],\n [b[5], bl[7]],\n [b[6], bl[8]],\n [b[7], bl[9]],\n [b[8], bl[10]],\n [b[9], bl[1]],\n [b[10], bl[2]],\n [bl[0], dl[0]],\n [bl[1], dl[5]],\n [bl[2], dl[6]],\n [bl[3], dl[7]],\n [bl[4], dl[8]],\n [bl[5], dl[9]],\n [bl[6], dl[10]],\n [bl[7], dl[1]],\n [bl[8], dl[2]],\n [bl[9], dl[3]],\n [bl[10], dl[4]],\n [dl[0], dr[0]],\n [dl[1], dr[9]],\n [dl[2], dr[10]],\n [dl[3], dr[1]],\n [dl[4], dr[2]],\n [dl[5], dr[3]],\n [dl[6], dr[4]],\n [dl[7], dr[5]],\n [dl[8], dr[6]],\n [dl[9], dr[7]],\n [dl[10], dr[8]],\n ...makeFaceTurnDefinitions(d),\n ], \"D++\");\n // R++ / R--\n this.addTurn([\n // Top Layer\n [F[0], U[0]],\n [F[7], U[3]],\n [F[8], U[4]],\n [F[9], U[5]],\n [F[10], U[6]],\n [F[1], U[7]],\n [F[2], U[8]],\n [F[3], U[9]],\n [U[0], BL[0]],\n [U[3], BL[9]],\n [U[4], BL[10]],\n [U[5], BL[1]],\n [U[6], BL[2]],\n [U[7], BL[3]],\n [U[8], BL[4]],\n [U[9], BL[5]],\n [BL[0], bl[0]],\n [BL[9], bl[1]],\n [BL[10], bl[2]],\n [BL[1], bl[3]],\n [BL[2], bl[4]],\n [BL[3], bl[5]],\n [BL[4], bl[6]],\n [BL[5], bl[7]],\n [bl[0], dl[0]],\n [bl[1], dl[7]],\n [bl[2], dl[8]],\n [bl[3], dl[9]],\n [bl[4], dl[10]],\n [bl[5], dl[1]],\n [bl[6], dl[2]],\n [bl[7], dl[3]],\n [dl[0], F[0]],\n [dl[7], F[7]],\n [dl[8], F[8]],\n [dl[9], F[9]],\n [dl[10], F[10]],\n [dl[1], F[1]],\n [dl[2], F[2]],\n [dl[3], F[3]],\n // Bottom Layer\n [dr[0], R[0]],\n [dr[1], R[9]],\n [dr[2], R[10]],\n [dr[3], R[1]],\n [dr[4], R[2]],\n [dr[5], R[3]],\n [dr[6], R[4]],\n [dr[7], R[5]],\n [dr[8], R[6]],\n [dr[9], R[7]],\n [dr[10], R[8]],\n [R[0], BR[0]],\n [R[1], BR[5]],\n [R[2], BR[6]],\n [R[3], BR[7]],\n [R[4], BR[8]],\n [R[5], BR[9]],\n [R[6], BR[10]],\n [R[7], BR[1]],\n [R[8], BR[2]],\n [R[9], BR[3]],\n [R[10], BR[4]],\n [BR[0], b[0]],\n [BR[1], b[1]],\n [BR[2], b[2]],\n [BR[3], b[3]],\n [BR[4], b[4]],\n [BR[5], b[5]],\n [BR[6], b[6]],\n [BR[7], b[7]],\n [BR[8], b[8]],\n [BR[9], b[9]],\n [BR[10], b[10]],\n [b[0], d[0]],\n [b[1], d[5]],\n [b[2], d[6]],\n [b[3], d[7]],\n [b[4], d[8]],\n [b[5], d[9]],\n [b[6], d[10]],\n [b[7], d[1]],\n [b[8], d[2]],\n [b[9], d[3]],\n [b[10], d[4]],\n [d[0], dr[0]],\n [d[1], dr[5]],\n [d[2], dr[6]],\n [d[3], dr[7]],\n [d[4], dr[8]],\n [d[5], dr[9]],\n [d[6], dr[10]],\n [d[7], dr[1]],\n [d[8], dr[2]],\n [d[9], dr[3]],\n [d[10], dr[4]],\n ...makeFaceTurnDefinitions(br),\n ], \"R++\");\n }\n U(reverse) {\n this.doTurn(\"U\", reverse);\n }\n R(reverse) {\n this.doTurn(\"R\", reverse);\n }\n F(reverse) {\n this.doTurn(\"F\", reverse);\n }\n dr(reverse) {\n this.doTurn(\"dr\", reverse);\n }\n dl(reverse) {\n this.doTurn(\"dl\", reverse);\n }\n L(reverse) {\n this.doTurn(\"L\", reverse);\n }\n d(reverse) {\n this.doTurn(\"d\", reverse);\n }\n br(reverse) {\n this.doTurn(\"br\", reverse);\n }\n BR(reverse) {\n this.doTurn(\"BR\", reverse);\n }\n BL(reverse) {\n this.doTurn(\"BL\", reverse);\n }\n bl(reverse) {\n this.doTurn(\"bl\", reverse);\n }\n b(reverse) {\n this.doTurn(\"b\", reverse);\n }\n /**\n * D++ for Pochmann notation. D-- if reverse = false\n */\n Dxx(reverse) {\n this.doTurn(\"D++\", reverse);\n }\n /**\n * R++ for Pochmann notation. R-- if reverse = false\n */\n Rxx(reverse) {\n this.doTurn(\"R++\", reverse);\n }\n /**\n * Parses and executes a megaminx algorithm using WCA standard notation\n *\n * @see https://www.stefan-pochmann.info/spocc/other_stuff/tools/scramble_megaminx/)\n * @see https://www.worldcubeassociation.org/regulations/#12d\n *\n * @param alg megaminx algorithm to parse\n * @example\n * ```\n * R-- D++ R++ U'\n * ```\n */\n alg(alg) {\n if (!alg) {\n return;\n }\n // pochmann notation\n this.doTurns(parseMegaminxAlgorithm(alg));\n }\n case(alg) {\n if (!alg) {\n return;\n }\n let turns = parseMegaminxAlgorithm(alg)\n .reverse()\n .map((turn) => (Object.assign(Object.assign({}, turn), { turnType: turn.turnType === TurnType.Clockwise\n ? TurnType.CounterClockwise\n : TurnType.Clockwise })));\n this.doTurns(turns);\n }\n doTurns(turns) {\n turns.forEach((turn) => {\n let reverse = turn.turnType === TurnType.CounterClockwise;\n let turnFunc;\n switch (turn.unit) {\n case \"Rxx\":\n turnFunc = this.Rxx.bind(this);\n break;\n case \"Dxx\":\n turnFunc = this.Dxx.bind(this);\n break;\n case \"U\":\n turnFunc = this.U.bind(this);\n break;\n case \"R\":\n turnFunc = this.R.bind(this);\n break;\n case \"F\":\n turnFunc = this.F.bind(this);\n break;\n case \"L\":\n turnFunc = this.L.bind(this);\n break;\n case \"BL\":\n turnFunc = this.BL.bind(this);\n break;\n case \"BR\":\n turnFunc = this.BR.bind(this);\n break;\n }\n for (let i = turn.n; i > 0; i--) {\n turnFunc(reverse);\n }\n });\n }\n}\n/**\n * Generates turn definitions for rotating a megaminx face clockwise\n * @param face array of sticker ids\n */\nfunction makeFaceTurnDefinitions(face) {\n return [\n // Edges\n [face[1], face[9]],\n [face[9], face[7]],\n [face[7], face[5]],\n [face[5], face[3]],\n [face[3], face[1]],\n // Corners\n [face[2], face[10]],\n [face[10], face[8]],\n [face[8], face[6]],\n [face[6], face[4]],\n [face[4], face[2]],\n ];\n}\n","export var SIMULATOR_FACE;\n(function (SIMULATOR_FACE) {\n SIMULATOR_FACE[\"U\"] = \"U\";\n SIMULATOR_FACE[\"R\"] = \"R\";\n SIMULATOR_FACE[\"F\"] = \"F\";\n SIMULATOR_FACE[\"D\"] = \"D\";\n SIMULATOR_FACE[\"L\"] = \"L\";\n SIMULATOR_FACE[\"B\"] = \"B\";\n})(SIMULATOR_FACE || (SIMULATOR_FACE = {}));\nexport const CUBE_FACES = [\n SIMULATOR_FACE.U,\n SIMULATOR_FACE.R,\n SIMULATOR_FACE.F,\n SIMULATOR_FACE.D,\n SIMULATOR_FACE.L,\n SIMULATOR_FACE.B,\n];\nexport var CUBE_AXIS;\n(function (CUBE_AXIS) {\n CUBE_AXIS[\"X\"] = \"X\";\n CUBE_AXIS[\"Y\"] = \"Y\";\n CUBE_AXIS[\"Z\"] = \"Z\";\n})(CUBE_AXIS || (CUBE_AXIS = {}));\n// Faces that wrap around a given axis\nexport const CUBE_AXIS_FACES = {\n X: [SIMULATOR_FACE.U, SIMULATOR_FACE.B, SIMULATOR_FACE.D, SIMULATOR_FACE.F],\n Y: [SIMULATOR_FACE.L, SIMULATOR_FACE.B, SIMULATOR_FACE.R, SIMULATOR_FACE.F],\n Z: [SIMULATOR_FACE.L, SIMULATOR_FACE.U, SIMULATOR_FACE.R, SIMULATOR_FACE.D],\n};\n// Face's orientation related to other faces on a given axis\n// the number represents the number of turns necessary\n// to orient the face in the same direction\nexport const AXIS_ORIENTATION = {\n X: {\n [SIMULATOR_FACE.U]: 0,\n [SIMULATOR_FACE.B]: 2,\n [SIMULATOR_FACE.F]: 0,\n [SIMULATOR_FACE.D]: 0,\n },\n Y: {\n [SIMULATOR_FACE.B]: -1,\n [SIMULATOR_FACE.F]: -1,\n [SIMULATOR_FACE.L]: -1,\n [SIMULATOR_FACE.R]: -1,\n },\n Z: {\n [SIMULATOR_FACE.U]: -1,\n [SIMULATOR_FACE.D]: 1,\n [SIMULATOR_FACE.L]: 2,\n [SIMULATOR_FACE.R]: 0,\n },\n};\n// True if faces are in reverse orientation\n// from the axis it's on (X, Y, Z).\n// For example D turns on the Y axis, but the\n// y axis layer turns clockwise based on the U\n// face, so D needs to be reversed\nexport const AXIS_FACE_ORIENTATION = {\n [SIMULATOR_FACE.U]: false,\n [SIMULATOR_FACE.R]: false,\n [SIMULATOR_FACE.F]: false,\n [SIMULATOR_FACE.D]: true,\n [SIMULATOR_FACE.L]: true,\n [SIMULATOR_FACE.B]: true,\n};\n","/**\r\n * Common utilities\r\n * @module glMatrix\r\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\r\n * Sets the type of array used when creating new vectors and matrices\r\n *\r\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\r\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\r\n * Convert Degree To Radian\r\n *\r\n * @param {Number} a Angle in Degrees\r\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\r\n * Tests whether or not the arguments have approximately the same value, within an absolute\r\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\r\n * than or equal to 1.0, and a relative tolerance is used for larger values)\r\n *\r\n * @param {Number} a The first number to test.\r\n * @param {Number} b The second number to test.\r\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};","import * as glMatrix from \"./common.js\";\n/**\r\n * 3 Dimensional Vector\r\n * @module vec3\r\n */\n\n/**\r\n * Creates a new, empty vec3\r\n *\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec3 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec3} a vector to clone\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Calculates the length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Creates a new vec3 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Copy the values from one vec3 to another\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the source vector\r\n * @returns {vec3} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Set the components of a vec3 to the given values\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} out\r\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Adds two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\r\n * Multiplies two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\r\n * Divides two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to ceil\r\n * @returns {vec3} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to floor\r\n * @returns {vec3} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\r\n * Math.round the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to round\r\n * @returns {vec3} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\r\n * Scales a vec3 by a scalar number\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec3} out\r\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\r\n * Adds two vec3's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec3} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Calculates the squared length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Negates the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to negate\r\n * @returns {vec3} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to invert\r\n * @returns {vec3} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\r\n * Normalize a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to normalize\r\n * @returns {vec3} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\r\n * Computes the cross product of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\r\n * Performs a hermite interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Performs a bezier interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec3} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat4.\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat3.\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\r\n * Transforms the vec3 with a quat\r\n * Can also be used for dual quaternions. (Multiply it with the real part)\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\r\n * Rotate a 3D vector around the x-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the y-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the z-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Get the angle between two 3D vectors\r\n * @param {ReadonlyVec3} a The first operand\r\n * @param {ReadonlyVec3} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec3 to zero\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @returns {vec3} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec3} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\r\n * Alias for {@link vec3.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec3.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec3.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec3.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec3.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec3.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec3.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec3s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","import { vec3 } from \"gl-matrix\";\nexport function degreesToRadians(degrees) {\n return (Math.PI * degrees) / 180;\n}\nexport function polarToCartesian(radius, theta) {\n const x = radius * Math.cos(theta);\n const y = radius * Math.sin(theta);\n return [x, y];\n}\nexport function lineSegmentLength(p1, p2) {\n return Math.sqrt(Math.pow(p2[1] - p1[1], 2) + Math.pow(p2[0] - p1[0], 2));\n}\n/**\n * Calculates the radius of a circle inscribing a regular\n * pentagon given the side length\n */\nexport function pentagonInRadius(length) {\n return length / (2 * Math.tan(Math.PI / 5));\n}\n/**\n * Calculates the radius of a circle circumscribing a\n * regular pentagon given the side length\n */\nexport function pentagonOutRadius(length) {\n return length / (2 * Math.sin(Math.PI / 5));\n}\n/**\n * Calculates the radius of the sphere that inscribes a\n * regular dodecahedron given the side length\n */\nexport function dodecahedronInRadius(length) {\n return (length / 2) * Math.sqrt(5 / 2 + (11 / 10) * Math.sqrt(5));\n}\nexport function calculateCentroid(vertices) {\n let cx = 0, cy = 0, cz = 0;\n vertices.forEach((vertex) => {\n cx += vertex[0];\n cy += vertex[1];\n cz += vertex[2];\n });\n cx /= vertices.length;\n cy /= vertices.length;\n cz /= vertices.length;\n return vec3.clone([cx, cy, cz]);\n}\n/**\n * generates an array with values in a given range by step\n *\n * ex. range(1, 5) -> [1, 2, 3, 4, 5]\n * ex. range(5, 2) -> [5, 4, 3, 2]\n *\n * @param from start of range\n * @param to end of range\n */\nexport function range(from, to) {\n if (from === to) {\n return [from];\n }\n const increment = from < to ? 1 : -1;\n let values = [];\n for (let current = from; current != to; current += increment) {\n values.push(current);\n }\n values.push(to);\n return values;\n}\n","import { CubeAlgorithmUnit } from \"./../../algorithms/cube\";\nimport { fillArray } from \"../../utils/arrays\";\nimport { CUBE_FACES, CUBE_AXIS, CUBE_AXIS_FACES, AXIS_ORIENTATION, SIMULATOR_FACE, AXIS_FACE_ORIENTATION, } from \"./constants\";\nimport { Simulator } from \"../simulator\";\nimport { range } from \"../../math/utils\";\nimport { parseCubeAlgorithm } from \"../../algorithms/cube\";\nimport { TurnType } from \"../../algorithms/algorithm\";\nexport class RubiksCubeSimulator extends Simulator {\n constructor(size) {\n super();\n this.size = size;\n this.gridSize = size * size;\n CUBE_FACES.forEach((faceName) => {\n // Create stickers for face\n this.addFace(fillArray(this.gridSize, faceName), faceName);\n const faceChanges = this.makeFaceTurnDefinitions(faceName);\n // Create rotation for stickers on face only\n this.addTurn(faceChanges, faceName);\n });\n // Create rotations for stickers on each layer\n // around each turnable axis\n [CUBE_AXIS.X, CUBE_AXIS.Y, CUBE_AXIS.Z].forEach((axis) => {\n for (let column = 0; column < this.size; column++) {\n let layerChanges = [];\n CUBE_AXIS_FACES[axis].forEach((faceName, i) => {\n const nextFaceName = CUBE_AXIS_FACES[axis][(i + 1) % CUBE_AXIS_FACES[axis].length];\n const nextFace = this.faces.get(nextFaceName);\n const currentFace = this.faces.get(faceName);\n for (let row = 0; row < this.size; row++) {\n const stickerIndex = this.size * row + column;\n const sticker1 = currentFace[this.axisAlignedSticker(axis, faceName, stickerIndex)];\n const sticker2 = nextFace[this.axisAlignedSticker(axis, nextFaceName, stickerIndex)];\n layerChanges.push([sticker1, sticker2]);\n }\n });\n this.addTurn(layerChanges, `${axis}-${column}`);\n }\n });\n }\n /**\n * Makes turn definitions for a face of the cube\n *\n * @param faceName the label of the face to make turn definitions\n * @example returning turn definitions for stickers on a 2x2\n * ```\n * addFace(['y', 'y', 'y', 'y'], 'U');\n * // returns { faceId: 'U', stickerIds: ['1','2','3','4'] }\n *\n * makeTurnDefinitions('U');\n * // returns [\n * // ['1','2'],\n * // ['2','4'],\n * // ['3','1'],\n * // ['4','3']\n * // ]\n * ```\n */\n makeFaceTurnDefinitions(faceName) {\n const stickerIds = this.faces.get(faceName);\n return stickerIds.map((stickerId, i) => [\n stickerId,\n stickerIds[this.clockwiseSticker(i)],\n ]);\n }\n /**\n * Given sticker i return the index it will go to\n * after rotating clockwise\n *\n * ex. stickers are stored in an array but represent a grid\n * so, for a 3x3 sticker index 0 will rotate to 2, 1 to 5, etc...\n *\n * ```\n * 0 | 1 | 2\n * ----------\n * 3 | 4 | 5\n * ----------\n * 6 | 7 | 8\n * ```\n */\n clockwiseSticker(stickerIndex) {\n return (((stickerIndex + 1) * this.size) % (this.gridSize + 1)) - 1;\n }\n /**\n * Given sticker i return the index it will go to\n * after rotating counterclockwise\n */\n counterClockwiseSticker(stickerIndex) {\n return this.oppositeSticker(this.clockwiseSticker(stickerIndex));\n }\n /**\n * Given sticker i return the index it will go to\n * after rotating 180 degrees\n */\n oppositeSticker(stickerIndex) {\n return this.gridSize - (stickerIndex + 1);\n }\n axisAlignedSticker(axis, face, stickerIndex) {\n switch (AXIS_ORIENTATION[axis][face]) {\n case 0:\n return stickerIndex;\n case 1:\n return this.clockwiseSticker(stickerIndex);\n case 2:\n return this.oppositeSticker(stickerIndex);\n case -1:\n return this.counterClockwiseSticker(stickerIndex);\n default:\n throw `Invalid axis face orientation value ${AXIS_ORIENTATION[axis][face]}`;\n }\n }\n /**\n * Performs a turn on a given face.\n *\n * @param face the face to turn\n * @param axis axis to perform inner layer turns on\n * @param reverse true if you want to turn the face counter clockwise\n * @param from inner layer to start turning from\n * @param to last inner layer to stop turning\n * @param to last inner layer to stop turning\n */\n turnFace(face, axis, reverse, from, to) {\n if (Math.abs(to - from) >= this.size - 1) {\n console.error(`Invalid number of layers to turn, skipping turn.; face=${face}, layers=${Math.abs(to - from) + 1}`);\n return;\n }\n // Rotate face\n this.doTurn(face, reverse);\n // Turn inner layers\n range(from, to).forEach((layer) => {\n this.doTurn(`${axis}-${layer}`, AXIS_FACE_ORIENTATION[face] ? !reverse : reverse);\n });\n }\n /**\n * Performs a U turn\n * @param reverse true if you want to turn the face counter clockwise (U')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n U(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.U, CUBE_AXIS.Y, reverse, this.size - 1, this.size - layers);\n }\n /**\n * Performs an R turn\n * @param reverse true if you want to turn the face counter clockwise (R')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n R(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.R, CUBE_AXIS.X, reverse, this.size - 1, this.size - layers);\n }\n /**\n * Performs an F turn\n * @param reverse true if you want to turn the face counter clockwise (F')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n F(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.F, CUBE_AXIS.Z, reverse, 0, layers - 1);\n }\n /**\n * Performs a D turn\n * @param reverse true if you want to turn the face counter clockwise (D')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n D(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.D, CUBE_AXIS.Y, reverse, 0, layers - 1);\n }\n /**\n * Performs an L turn\n * @param reverse true if you want to turn the face counter clockwise (L')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n L(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.L, CUBE_AXIS.X, reverse, 0, layers - 1);\n }\n /**\n * Performs a B turn\n * @param reverse true if you want to turn the face counter clockwise (B')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n B(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.B, CUBE_AXIS.Z, reverse, this.size - 1, this.size - layers);\n }\n /**\n * Rotates the middle slice in the direction of an L turn\n * https://ruwix.com/the-rubiks-cube/notation/advanced/\n *\n * Will rotate all middle layers inbetween R and L for larger cubes\n */\n M(reverse = false) {\n for (let layer = 1; layer < this.size - 1; layer++) {\n this.doTurn(`${CUBE_AXIS.X}-${layer}`, !reverse);\n }\n }\n /**\n * Rotates the standing layers in the direction of an F turn\n * https://ruwix.com/the-rubiks-cube/notation/advanced/\n *\n * Will rotate all middle layers inbetween F and B for larger cubes\n */\n S(reverse = false) {\n for (let layer = 1; layer < this.size - 1; layer++) {\n this.doTurn(`${CUBE_AXIS.Z}-${layer}`, reverse);\n }\n }\n /**\n * Rotates the equitorial layers in the direction of a D turn\n * https://ruwix.com/the-rubiks-cube/notation/advanced/\n *\n * Will rotate all middle layers inbetween U and D for larger cubes\n */\n E(reverse = false) {\n for (let layer = 1; layer < this.size - 1; layer++) {\n this.doTurn(`${CUBE_AXIS.Y}-${layer}`, !reverse);\n }\n }\n /**\n * rotates the entire cube on R\n */\n X(reverse = false) {\n this.doTurn(\"R\", reverse);\n this.doTurn(\"L\", !reverse);\n for (let layer = 0; layer < this.size; layer++) {\n this.doTurn(`${CUBE_AXIS.X}-${layer}`, reverse);\n }\n }\n /**\n * rotates the entire cube on U\n */\n Y(reverse = false) {\n this.doTurn(\"U\", reverse);\n this.doTurn(\"D\", !reverse);\n for (let layer = 0; layer < this.size; layer++) {\n this.doTurn(`${CUBE_AXIS.Y}-${layer}`, reverse);\n }\n }\n /**\n * rotates the entire cube on F\n */\n Z(reverse = false) {\n this.doTurn(\"F\", reverse);\n this.doTurn(\"B\", !reverse);\n for (let layer = 0; layer < this.size; layer++) {\n this.doTurn(`${CUBE_AXIS.Z}-${layer}`, reverse);\n }\n }\n alg(alg) {\n if (!alg) {\n return;\n }\n this.doTurns(parseCubeAlgorithm(alg));\n }\n /**\n * reverses an algorithm then executes it\n */\n case(alg) {\n if (!alg) {\n return;\n }\n let turns = parseCubeAlgorithm(alg)\n .reverse()\n .map((turn) => {\n switch (turn.turnType) {\n case TurnType.Clockwise:\n turn.turnType = TurnType.CounterClockwise;\n break;\n case TurnType.CounterClockwise:\n turn.turnType = TurnType.Clockwise;\n break;\n case TurnType.Double:\n break;\n }\n return turn;\n });\n this.doTurns(turns);\n }\n doTurns(turns) {\n turns.forEach((turn) => {\n let turnFunc;\n switch (turn.unit) {\n case CubeAlgorithmUnit.U:\n turnFunc = this.U.bind(this);\n break;\n case CubeAlgorithmUnit.R:\n turnFunc = this.R.bind(this);\n break;\n case CubeAlgorithmUnit.F:\n turnFunc = this.F.bind(this);\n break;\n case CubeAlgorithmUnit.D:\n turnFunc = this.D.bind(this);\n break;\n case CubeAlgorithmUnit.L:\n turnFunc = this.L.bind(this);\n break;\n case CubeAlgorithmUnit.B:\n turnFunc = this.B.bind(this);\n break;\n case CubeAlgorithmUnit.M:\n turnFunc = this.M.bind(this);\n break;\n case CubeAlgorithmUnit.E:\n turnFunc = this.E.bind(this);\n break;\n case CubeAlgorithmUnit.S:\n turnFunc = this.S.bind(this);\n break;\n case CubeAlgorithmUnit.X:\n turnFunc = this.X.bind(this);\n break;\n case CubeAlgorithmUnit.Y:\n turnFunc = this.Y.bind(this);\n break;\n case CubeAlgorithmUnit.Z:\n turnFunc = this.Z.bind(this);\n break;\n default:\n console.warn(`Unsupported cube move`, turn);\n break;\n }\n const reverse = turn.turnType === TurnType.CounterClockwise;\n turnFunc(reverse, turn.slices);\n if (turn.turnType === TurnType.Double) {\n turnFunc(reverse, turn.slices);\n }\n });\n }\n}\n","import * as glMatrix from \"./common.js\";\n/**\r\n * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied.\r\n * @module mat4\r\n */\n\n/**\r\n * Creates a new identity mat4\r\n *\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 initialized with values from an existing matrix\r\n *\r\n * @param {ReadonlyMat4} a matrix to clone\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Copy the values from one mat4 to another\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Create a new mat4 with the given values\r\n *\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} A new mat4\r\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set the components of a mat4 to the given values\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} out\r\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set a mat4 to the identity matrix\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @returns {mat4} out\r\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Transpose the values of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Inverts a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\r\n * Calculates the adjugate of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\r\n * Calculates the determinant of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {Number} determinant of a\r\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\r\n * Multiplies two mat4s\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\r\n * Translate a mat4 by the given vector\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to translate\r\n * @param {ReadonlyVec3} v vector to translate by\r\n * @returns {mat4} out\r\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\r\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\r\n * @returns {mat4} out\r\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Rotates a mat4 by the given angle around the given axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the X axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Y axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Z axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\r\n * Creates a matrix from a vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a vector scaling\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.scale(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a given angle around a given axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotate(dest, dest, rad, axis);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the X axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateX(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Y axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateY(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Z axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateZ(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation and vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 from a dual quat.\r\n *\r\n * @param {mat4} out Matrix\r\n * @param {ReadonlyQuat2} a Dual Quaternion\r\n * @returns {mat4} mat4 receiving operation result\r\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\r\n * Returns the translation vector component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslation,\r\n * the returned vector will be the same as the translation vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive translation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\r\n * Returns the scaling factor component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslationScale\r\n * with a normalized Quaternion paramter, the returned vector will be\r\n * the same as the scaling vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive scaling factor component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\r\n * Returns a quaternion representing the rotational component\r\n * of a transformation matrix. If a matrix is built with\r\n * fromRotationTranslation, the returned quaternion will be the\r\n * same as the quaternion originally supplied.\r\n * @param {quat} out Quaternion to receive the rotation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {quat} out\r\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * mat4.translate(dest, origin);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n * mat4.translate(dest, negativeOrigin);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\r\n * Calculates a 4x4 matrix from the given quaternion\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyQuat} q Quaternion to create matrix from\r\n *\r\n * @returns {mat4} out\r\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a frustum matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Number} left Left bound of the frustum\r\n * @param {Number} right Right bound of the frustum\r\n * @param {Number} bottom Bottom bound of the frustum\r\n * @param {Number} top Top bound of the frustum\r\n * @param {Number} near Near bound of the frustum\r\n * @param {Number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given bounds.\r\n * Passing null/undefined/no value for far will generate infinite projection matrix.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} fovy Vertical field of view in radians\r\n * @param {number} aspect Aspect ratio. typically viewport width/height\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum, can be null or Infinity\r\n * @returns {mat4} out\r\n */\n\nexport function perspective(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given field of view.\r\n * This is primarily useful for generating projection matrices to be used\r\n * with the still experiemental WebVR API.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\r\n * Generates a orthogonal projection matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} left Left bound of the frustum\r\n * @param {number} right Right bound of the frustum\r\n * @param {number} bottom Bottom bound of the frustum\r\n * @param {number} top Top bound of the frustum\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function ortho(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\r\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a matrix that makes something look at something else.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\r\n * Returns a string representation of a mat4\r\n *\r\n * @param {ReadonlyMat4} a matrix to represent as a string\r\n * @returns {String} string representation of the matrix\r\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\r\n * Returns Frobenius norm of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\r\n * @returns {Number} Frobenius norm\r\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\r\n * Adds two mat4's\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\r\n * Subtracts matrix b from matrix a\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\r\n * Multiply each element of the matrix by a scalar.\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {Number} b amount to scale the matrix's elements by\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\r\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\r\n *\r\n * @param {mat4} out the receiving vector\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @param {Number} scale the amount to scale b's elements by before adding\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\r\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\r\n * Returns whether or not the matrices have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\r\n * Alias for {@link mat4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link mat4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;","/**\n * Simple generator that yields a new ID every time\n * its called. Used to give unique IDs to geometry.\n */\nexport const generateUid = (() => {\n let current = 0;\n return function () {\n return current++;\n };\n})();\n","import { mat4 } from \"gl-matrix\";\nimport { generateUid } from \"./uid\";\nexport class Object3D {\n constructor() {\n this.uid = generateUid();\n this.matrix = mat4.create();\n this.centroid = [0, 0, 0];\n }\n translate(vector) {\n mat4.translate(this.matrix, this.matrix, vector);\n }\n rotate(rad, axis) {\n mat4.rotate(this.matrix, this.matrix, rad, axis);\n }\n scale(v) {\n mat4.scale(this.matrix, this.matrix, v);\n }\n setColor(color) {\n this.color = color;\n }\n}\n","import { Object3D } from \"./object3d\";\nexport class Group extends Object3D {\n constructor(objects = []) {\n super();\n this.setObjects(objects);\n }\n setObjects(objects) {\n this.objects = objects;\n }\n addObject(object) {\n this.objects.push(object);\n }\n setCentroid(vector) {\n this.centroid = vector;\n }\n}\n","import { degreesToRadians } from \"./utils\";\nexport const SQRT_3 = Math.sqrt(3);\nexport const ATAN_15_DEG = Math.atan(degreesToRadians(15));\nexport const DEG_30_RADIANS = degreesToRadians(30);\nexport const DEG_36_RADIANS = degreesToRadians(36);\nexport const DEG_60_RADIANS = degreesToRadians(60);\nexport const DEG_72_RADIANS = degreesToRadians(72);\n","import { SOLVED_BOTTOM_PIECES, SOLVED_TOP_PIECES } from \"./constants\";\nimport { Group } from \"./../../geometry/group\";\nimport { ATAN_15_DEG, DEG_30_RADIANS, DEG_60_RADIANS, } from \"./../../math/constants\";\nimport { PIECE_TYPE } from \"./enum\";\nexport class Square1Builder {\n constructor(topLayer = SOLVED_TOP_PIECES, bottomLayer = SOLVED_BOTTOM_PIECES, middleRotated = false, sideLength = 0.7) {\n this.sideLength = sideLength;\n this.halfSide = this.sideLength / 2;\n this.halfEdgePiece = this.halfSide * ATAN_15_DEG;\n this.layerWidth = this.halfSide - this.halfEdgePiece;\n this.middleWidth = this.sideLength - 2 * this.layerWidth;\n this.halfMiddleWidth = this.middleWidth / 2;\n this.borderLayerWidth = this.sideLength * 0.2;\n this.outerHalfSide = (sideLength + this.borderLayerWidth) / 2;\n this.outerHalfEdgePiece = this.outerHalfSide * ATAN_15_DEG;\n this.pieces = this.buildSquare1(topLayer, bottomLayer, middleRotated);\n this.group = new Group(this.pieces);\n }\n makeLayer(pieces) {\n let geometry = [];\n let angle = Math.PI;\n pieces.forEach((piece, index) => {\n switch (piece.type) {\n case PIECE_TYPE.CORNER:\n const corner = this.square1Corner(piece.colors[0], piece.colors[1], piece.colors[2]);\n corner.rotate(angle, [0, 0, 1]);\n geometry.push(corner);\n angle -= DEG_60_RADIANS;\n break;\n case PIECE_TYPE.EDGE:\n const edge = this.square1Edge(piece.colors[0], piece.colors[1]);\n edge.rotate(angle - DEG_60_RADIANS, [0, 0, 1]);\n geometry.push(edge);\n angle -= DEG_30_RADIANS;\n break;\n }\n });\n return geometry;\n }\n /**\n * Not implemented. Just here for {@link Visualizer}'s sake\n */\n setColors(colors) { }\n}\n","import { calculateCentroid } from \"../math/utils\";\nimport { generateUid } from \"./uid\";\n/**\n * Face that will render as a puzzle sticker\n */\nexport class Face {\n /**\n * @param indices indices of vertices that make up a face\n * @param vertices vertices of the geometry to calculate centroid from\n * @param color color of the sticker\n */\n constructor(indices, vertices, color) {\n this.indices = indices;\n this.color = color;\n this.uid = generateUid();\n if (vertices) {\n this.calculateCentroid(vertices);\n }\n }\n /**\n * recalculate the centroid of the face.\n */\n calculateCentroid(vertices) {\n this.centroid = calculateCentroid(\n // Calculate centroid from vertices included in the face\n vertices.filter((v, i) => this.indices.includes(i)));\n }\n}\n","import { Object3D } from \"./object3d\";\nimport { calculateCentroid } from \"../math/utils\";\nexport class Geometry extends Object3D {\n constructor(vertices, faces) {\n super();\n this.vertices = vertices;\n this.faces = faces;\n this.centroid = calculateCentroid(this.vertices);\n }\n}\n","import { Square1Builder } from \"./interface\";\nimport { DEG_30_RADIANS } from \"./../../math/constants\";\nimport { Face } from \"./../../geometry/face\";\nimport { vec3 } from \"gl-matrix\";\nimport { Geometry } from \"./../../geometry/geometry\";\nimport { Group } from \"./../../geometry/group\";\nimport { FRONT_COLOR, RIGHT_COLOR, BACK_COLOR } from \"./constants\";\nexport class Square1Net extends Square1Builder {\n square1Corner(top, side1, side2) {\n const points = [\n // Top\n [0, 0, 0],\n [this.halfSide, this.halfEdgePiece, 0],\n [this.halfSide, this.halfSide, 0],\n [this.halfEdgePiece, this.halfSide, 0],\n // Sides\n [this.outerHalfSide, this.outerHalfEdgePiece, 0],\n [this.outerHalfSide, this.outerHalfSide, 0],\n [this.outerHalfEdgePiece, this.outerHalfSide, 0],\n ];\n const faces = [\n new Face([0, 1, 2, 3], points, top),\n new Face([2, 3, 6, 5], points, side1),\n new Face([1, 2, 5, 4], points, side2),\n ];\n return new Geometry(points, faces);\n }\n square1Edge(top, side) {\n const points = [\n // Top\n vec3.rotateZ(vec3.create(), [0, 0, 0], [0, 0, 0], DEG_30_RADIANS),\n vec3.rotateZ(vec3.create(), [this.halfEdgePiece, this.halfSide, 0], [0, 0, 0], DEG_30_RADIANS),\n vec3.rotateZ(vec3.create(), [-this.halfEdgePiece, this.halfSide, 0], [0, 0, 0], DEG_30_RADIANS),\n // Side\n vec3.rotateZ(vec3.create(), [this.outerHalfEdgePiece, this.outerHalfSide, 0], [0, 0, 0], DEG_30_RADIANS),\n vec3.rotateZ(vec3.create(), [-this.outerHalfEdgePiece, this.outerHalfSide, 0], [0, 0, 0], DEG_30_RADIANS),\n ];\n const faces = [\n new Face([0, 1, 2], points, top),\n new Face([1, 2, 4, 3], points, side),\n ];\n return new Geometry(points, faces);\n }\n square1Middle(front, right, back, rotated) {\n const layerHeight = this.halfSide - this.halfEdgePiece;\n const middleHeight = this.sideLength - 2 * layerHeight;\n const halfMiddleHeight = middleHeight / 2;\n const cornerLength = this.outerHalfSide - this.outerHalfEdgePiece;\n const vertices = [\n [-this.outerHalfSide, halfMiddleHeight, -0.01],\n [-this.outerHalfEdgePiece, halfMiddleHeight, -0.01],\n [this.outerHalfSide, halfMiddleHeight, -0.01],\n [-this.outerHalfSide, -halfMiddleHeight, -0.01],\n [-this.outerHalfEdgePiece, -halfMiddleHeight, -0.01],\n [this.outerHalfSide, -halfMiddleHeight, -0.01],\n // Points for when middle is rotated\n [2 * this.outerHalfEdgePiece, halfMiddleHeight, -0.01],\n [2 * this.outerHalfEdgePiece, -halfMiddleHeight, -0.01],\n [2 * cornerLength, halfMiddleHeight, -0.01],\n [2 * cornerLength, -halfMiddleHeight, -0.01],\n ];\n // Left\n const faces = [new Face([0, 1, 4, 3], vertices, front)];\n // Right\n if (!rotated) {\n faces.push(new Face([1, 2, 5, 4], vertices, front));\n }\n else {\n faces.push(new Face([1, 6, 7, 4], vertices, back));\n faces.push(new Face([6, 8, 9, 7], vertices, right));\n }\n return new Geometry(vertices, faces);\n }\n buildSquare1(top, bottom, middleRotated) {\n const layerHeight = this.halfSide - this.halfEdgePiece;\n const middleHeight = this.sideLength - 2 * layerHeight;\n const halfMiddleHeight = middleHeight / 2;\n let pieces = [];\n const topLayer = new Group(this.makeLayer(top));\n const bottomLayer = new Group(this.makeLayer(bottom));\n topLayer.translate([0, this.outerHalfSide + halfMiddleHeight, 0]);\n bottomLayer.translate([0, -(this.outerHalfSide + halfMiddleHeight), 0]);\n bottomLayer.rotate(DEG_30_RADIANS, [0, 0, 1]);\n pieces = [topLayer, bottomLayer];\n const m = this.square1Middle(FRONT_COLOR, RIGHT_COLOR, BACK_COLOR, middleRotated);\n this.faces = {\n top: topLayer,\n bottom: bottomLayer,\n };\n pieces.push(m);\n return pieces;\n }\n}\n","import { ROTATION_VECTOR, FRONT_COLOR, LEFT_COLOR, BACK_COLOR, RIGHT_COLOR, SOLVED_TOP_PIECES, SOLVED_BOTTOM_PIECES, } from \"./constants\";\nimport { Square1Builder } from \"./interface\";\nimport { DEG_30_RADIANS } from \"./../../math/constants\";\nimport { Geometry } from \"./../../geometry/geometry\";\nimport { Face } from \"./../../geometry/face\";\nimport { vec3 } from \"gl-matrix\";\nimport { Group } from \"../../geometry/group\";\nexport class Square1 extends Square1Builder {\n constructor(topLayer = SOLVED_TOP_PIECES, bottomLayer = SOLVED_BOTTOM_PIECES, middleRotated = false, sideLength = 1.25) {\n super(topLayer, bottomLayer, middleRotated, sideLength);\n }\n square1Corner(top, side1, side2) {\n const points = [\n // Top\n [0, 0, this.halfSide],\n [this.halfSide, this.halfEdgePiece, this.halfSide],\n [this.halfSide, this.halfSide, this.halfSide],\n [this.halfEdgePiece, this.halfSide, this.halfSide],\n // Bottom\n [0, 0, this.halfSide - this.layerWidth],\n [this.halfSide, this.halfEdgePiece, this.halfSide - this.layerWidth],\n [this.halfSide, this.halfSide, this.halfSide - this.layerWidth],\n [this.halfEdgePiece, this.halfSide, this.halfSide - this.layerWidth],\n ];\n const faces = [\n new Face([0, 1, 2, 3], points, top),\n // TODO: the faces commented out here are the underside of the pieces so\n // they show gray when the cube is scrambled. But they are overlapping sometimes\n // with outward sticker faces. removing them for now, but it'd be nice to\n // fix this.\n // new Face([4, 5, 6, 7], points, { value: '#333' }),\n // new Face([0, 1, 5, 4], points, { value: '#333' }),\n new Face([2, 3, 7, 6], points, side1),\n new Face([1, 2, 6, 5], points, side2),\n ];\n return new Geometry(points, faces);\n }\n square1Edge(top, side) {\n const points = [\n // Top\n vec3.rotateZ(vec3.create(), [0, 0, this.halfSide], [0, 0, 0], DEG_30_RADIANS),\n vec3.rotateZ(vec3.create(), [this.halfEdgePiece, this.halfSide, this.halfSide], [0, 0, 0], DEG_30_RADIANS),\n vec3.rotateZ(vec3.create(), [-this.halfEdgePiece, this.halfSide, this.halfSide], [0, 0, 0], DEG_30_RADIANS),\n // Bottom\n vec3.rotateZ(vec3.create(), [0, 0, this.halfSide - this.layerWidth], [0, 0, 0], DEG_30_RADIANS),\n vec3.rotateZ(vec3.create(), [this.halfEdgePiece, this.halfSide, this.halfSide - this.layerWidth], [0, 0, 0], DEG_30_RADIANS),\n vec3.rotateZ(vec3.create(), [-this.halfEdgePiece, this.halfSide, this.halfSide - this.layerWidth], [0, 0, 0], DEG_30_RADIANS),\n ];\n const faces = [\n new Face([0, 1, 2], points, top),\n // new Face([3, 4, 5], points, { value: '#333' }),\n new Face([1, 2, 5, 4], points, side),\n ];\n return new Geometry(points, faces);\n }\n square1Middle(front, side, back) {\n const vertices = [\n [-this.halfSide, -this.halfSide, this.halfMiddleWidth],\n [-this.halfSide, this.halfSide, this.halfMiddleWidth],\n [this.halfEdgePiece, this.halfSide, this.halfMiddleWidth],\n [-this.halfEdgePiece, -this.halfSide, this.halfMiddleWidth],\n [-this.halfSide, -this.halfSide, -this.halfMiddleWidth],\n [-this.halfSide, this.halfSide, -this.halfMiddleWidth],\n [this.halfEdgePiece, this.halfSide, -this.halfMiddleWidth],\n [-this.halfEdgePiece, -this.halfSide, -this.halfMiddleWidth],\n ];\n const faces = [\n new Face([0, 1, 2, 3], vertices, { value: \"#333\" }),\n new Face([4, 5, 6, 7], vertices, { value: \"#333\" }),\n new Face([0, 1, 5, 4], vertices, side),\n new Face([1, 2, 6, 5], vertices, back),\n new Face([2, 3, 7, 6], vertices, { value: \"#333\" }),\n new Face([0, 3, 7, 4], vertices, front),\n ];\n return new Geometry(vertices, faces);\n }\n buildSquare1(top, bottom, middleRotated) {\n const topLayer = new Group(this.makeLayer(top));\n const bottomLayer = new Group(this.makeLayer(bottom));\n // Prevent overlapping faces\n topLayer.translate([0, 0, 0.005]);\n bottomLayer.translate([0, 0, -0.005]);\n bottomLayer.rotate(Math.PI, [1, 0, 0]);\n bottomLayer.rotate(DEG_30_RADIANS, [0, 0, 1]);\n const pieces = [topLayer, bottomLayer];\n const m1 = this.square1Middle(FRONT_COLOR, LEFT_COLOR, BACK_COLOR);\n const m2 = this.square1Middle(BACK_COLOR, RIGHT_COLOR, FRONT_COLOR);\n m2.rotate(Math.PI, [0, 0, 1]);\n if (middleRotated) {\n m2.rotate(Math.PI, ROTATION_VECTOR);\n }\n pieces.push(m1);\n pieces.push(m2);\n this.faces = {\n top: topLayer,\n bottom: bottomLayer,\n };\n return pieces;\n }\n}\n","import { Geometry } from \"./geometry\";\nimport { vec3 } from \"gl-matrix\";\nimport { Face } from \"./face\";\nexport class Plane extends Geometry {\n constructor(width, height, color) {\n let vertices = [\n vec3.clone([0, 0, 0]),\n vec3.clone([width, 0, 0]),\n vec3.clone([width, -height, 0]),\n vec3.clone([0, -height, 0]),\n ];\n let faces = [new Face([0, 1, 2, 3], vertices, color)];\n super(vertices, faces);\n }\n}\n","import { Geometry } from \"./geometry\";\nimport { Face } from \"./face\";\nimport { SQRT_3 } from \"../math/constants\";\nexport class Triangle extends Geometry {\n constructor(a, b, c, color) {\n let verticies = [a, b, c];\n let faces = [new Face([0, 1, 2], verticies, color)];\n super(verticies, faces);\n }\n}\nexport class EquilateralTriangle extends Triangle {\n constructor(base, color) {\n let height = base * (SQRT_3 / 2);\n super([0, 0, 0], [base / 2, height, 0], [base, 0, 0], color);\n }\n}\n","import { RED, YELLOW, BLUE, ORANGE, GREEN, WHITE, BLACK } from \"./colors\";\nimport { Group } from \"../geometry/group\";\nimport { Plane } from \"../geometry/plane\";\nimport { Triangle } from \"../geometry/triangle\";\nexport class SkewbNet {\n constructor() {\n const cubeWidth = 1;\n const centerWidth = Math.sqrt(Math.pow(cubeWidth / 2, 2) * 2);\n const orange = new Group(this.makeStickers(ORANGE, centerWidth, [-cubeWidth, 0, 0]));\n const green = new Group(this.makeStickers(GREEN, centerWidth, [2 * cubeWidth, 0, 0]));\n const white = new Group(this.makeStickers(WHITE, centerWidth, [0, -cubeWidth, 0]));\n const red = new Group(this.makeStickers(RED, centerWidth, [cubeWidth, 0, 0]));\n const yellow = new Group(this.makeStickers(YELLOW, centerWidth, [0, cubeWidth, 0]));\n const blue = new Group(this.makeStickers(BLUE, centerWidth, [0, 0, 0]));\n this.U = yellow;\n this.R = red;\n this.F = blue;\n this.L = orange;\n this.B = green;\n this.D = white;\n this.faces = {\n top: this.U,\n front: this.F,\n right: this.R,\n back: this.B,\n left: this.L,\n bottom: this.D,\n };\n this.stickers = [red, yellow, blue, orange, green, white];\n this.group = new Group(this.stickers);\n this.group.translate([-cubeWidth / 4, 0, 0]);\n this.group.scale([0.5, 0.5, 0.5]);\n }\n makeStickers(color, width, translate) {\n const center = new Plane(width, width, color);\n center.translate(translate);\n center.rotate(Math.PI / 4, [0, 0, 1]);\n center.translate([-width / 2, width / 2, 0]);\n const triangles = [];\n for (let i = 0; i < 4; i++) {\n const triangle = new Triangle([-width / 2, width / 2, 0], [0, width, 0], [width / 2, width / 2, 0], color);\n triangle.translate(translate);\n triangle.rotate((-Math.PI / 2) * i, [0, 0, 1]);\n triangle.rotate(Math.PI / 4, [0, 0, 1]);\n triangles.push(triangle);\n }\n return [center, ...triangles];\n }\n setColors(colors) {\n let { top, right, front, bottom, left, back } = colors;\n this.setFaceColors(this.U, top);\n this.setFaceColors(this.R, right);\n this.setFaceColors(this.F, front);\n this.setFaceColors(this.D, bottom);\n this.setFaceColors(this.L, left);\n this.setFaceColors(this.B, back);\n }\n setFaceColors(faceStickers, colors = []) {\n faceStickers.objects[0].faces[0].color = colors[0] || BLACK;\n faceStickers.objects[1].faces[0].color = colors[1] || BLACK;\n faceStickers.objects[2].faces[0].color = colors[2] || BLACK;\n faceStickers.objects[3].faces[0].color = colors[4] || BLACK; // Setting 3 -> 4 and 4 -> 3 now because 4 and 3 are stored incorrectly in this class.\n faceStickers.objects[4].faces[0].color = colors[3] || BLACK;\n }\n}\n","import { RED, YELLOW, BLUE, ORANGE, GREEN, WHITE, BLACK } from \"./colors\";\nimport { Group } from \"../geometry/group\";\nimport { Plane } from \"../geometry/plane\";\nimport { Triangle } from \"../geometry/triangle\";\nexport class Skewb {\n constructor() {\n const cubeWidth = 1.25;\n const centerWidth = Math.sqrt(Math.pow(cubeWidth / 2, 2) * 2);\n const halfWidth = cubeWidth / 2;\n const red = new Group(this.makeStickers(RED, centerWidth));\n const yellow = new Group(this.makeStickers(YELLOW, centerWidth, [1, 0, 0]));\n const blue = new Group(this.makeStickers(BLUE, centerWidth, [0, 1, 0]));\n const orange = new Group(this.makeStickers(ORANGE, centerWidth));\n const green = new Group(this.makeStickers(GREEN, centerWidth, [0, 1, 0]));\n const white = new Group(this.makeStickers(WHITE, centerWidth, [1, 0, 0]));\n this.U = yellow;\n this.R = red;\n this.F = blue;\n this.L = orange;\n this.B = green;\n this.D = white;\n this.faces = {\n top: this.U,\n front: this.F,\n right: this.R,\n back: this.B,\n left: this.L,\n bottom: this.D,\n };\n red.translate([0, 0, halfWidth]);\n red.rotate(Math.PI, [1, 0, 0]);\n red.rotate(Math.PI / 2, [0, 0, 1]);\n orange.rotate(-Math.PI / 2, [0, 0, 1]);\n orange.translate([0, 0, -halfWidth]);\n blue.rotate(-Math.PI / 2, [1, 0, 0]);\n blue.translate([-halfWidth, 0, 0]);\n green.translate([halfWidth, 0, 0]);\n green.rotate(Math.PI, [0, 1, 0]);\n green.rotate(-Math.PI / 2, [1, 0, 0]);\n yellow.rotate(Math.PI, [0, 1, 0]);\n yellow.translate([0, halfWidth, 0]);\n white.translate([0, -halfWidth, 0]);\n white.rotate(Math.PI, [1, 0, 0]);\n this.stickers = [red, yellow, blue, orange, green, white];\n this.group = new Group(this.stickers);\n }\n makeStickers(color, width, axis) {\n const center = new Plane(width, width, color);\n if (axis) {\n center.rotate(Math.PI / 2, axis);\n }\n center.rotate(Math.PI / 4, [0, 0, 1]);\n center.translate([-width / 2, width / 2, 0]);\n const triangles = [];\n for (let i = 0; i < 4; i++) {\n const triangle = new Triangle([-width / 2, width / 2, 0], [0, width, 0], [width / 2, width / 2, 0], color);\n if (axis) {\n triangle.rotate(Math.PI / 2, axis);\n }\n triangle.rotate((Math.PI / 2) * i, [0, 0, 1]);\n triangle.rotate(Math.PI / 4, [0, 0, 1]);\n triangles.push(triangle);\n }\n return [center, ...triangles];\n }\n setColors(colors) {\n let { top, right, front, bottom, left, back } = colors;\n this.setFaceColors(this.U, top);\n this.setFaceColors(this.R, right);\n this.setFaceColors(this.F, front);\n this.setFaceColors(this.D, bottom);\n this.setFaceColors(this.L, left);\n this.setFaceColors(this.B, back);\n }\n setFaceColors(faceStickers, colors = []) {\n faceStickers.objects[0].faces[0].color = colors[0] || BLACK;\n faceStickers.objects[1].faces[0].color = colors[1] || BLACK;\n faceStickers.objects[2].faces[0].color = colors[2] || BLACK;\n faceStickers.objects[3].faces[0].color = colors[4] || BLACK; // Setting 3 -> 4 and 4 -> 3 now because 4 and 3 are stored incorrectly in this class.\n faceStickers.objects[4].faces[0].color = colors[3] || BLACK;\n }\n}\n","import { Face } from \"./face\";\nimport { Geometry } from \"./geometry\";\nimport { SQRT_3 } from \"../math/constants\";\n/**\n * Geometry to build a triangle lattice for the\n * pyraminx puzzle\n */\nexport class TriangleLattice extends Geometry {\n constructor(base, size, color) {\n const halfBase = base / 2;\n const fullHeight = base * (SQRT_3 / 2);\n const triangleBase = base / size;\n const triangleHeight = fullHeight / size;\n const inradius = fullHeight / 3;\n let vertices = [];\n let faces = [];\n /**\n * Builds one layer of verticies at a time\n * for each layer after the first it constructs\n * faces for the triangles (0,1,4), (1,2,5) etc...\n *\n * 9\n * 7 8\n * 4 5 6\n * 0 1 2 3\n */\n let index = 0;\n for (let layer = 0; layer <= size; layer++) {\n for (let vertex = 0, count = size - layer; vertex <= count; vertex++) {\n const horizontalOffset = -halfBase;\n const verticalOffset = -inradius;\n const x = triangleBase * vertex + (layer * triangleBase) / 2 + horizontalOffset;\n const y = triangleHeight * layer + verticalOffset;\n vertices.push([x, y, 0]);\n if (layer > 0) {\n // down triangle\n if (vertex > 0) {\n faces.push(new Face([index, index - 1, index - count - 2], null, color));\n }\n // up triangle\n faces.push(new Face([index, index - count - 2, index - count - 1], null, color));\n }\n index++;\n }\n }\n faces.forEach((face) => face.calculateCentroid(vertices));\n super(vertices, faces);\n }\n}\n","import { GREEN, RED, BLUE, YELLOW, BLACK } from \"./colors\";\nimport { TriangleLattice } from \"./../geometry/triangleLattice\";\nimport { Group } from \"./../geometry/group\";\nimport { SQRT_3 } from \"../math/constants\";\nconst DEG_60_RADIANS = (60 * Math.PI) / 180;\nexport class PyraminxNet {\n constructor(size, sideLength = 0.925) {\n this.size = size;\n const fullHeight = sideLength * (SQRT_3 / 2);\n const inDiameter = fullHeight / 1.5;\n const faceSpacing = inDiameter * 0.1;\n const U = new TriangleLattice(sideLength, size, YELLOW);\n const R = new TriangleLattice(sideLength, size, GREEN);\n const L = new TriangleLattice(sideLength, size, BLUE);\n const B = new TriangleLattice(sideLength, size, RED);\n this.L = L;\n this.R = R;\n this.U = U;\n this.B = B;\n R.rotate(-DEG_60_RADIANS, [0, 0, 1]);\n R.translate([0, inDiameter + faceSpacing, 0]);\n R.rotate(2 * DEG_60_RADIANS, [0, 0, 1]);\n U.rotate(DEG_60_RADIANS, [0, 0, 1]);\n U.translate([0, inDiameter + faceSpacing, 0]);\n U.rotate(-2 * DEG_60_RADIANS, [0, 0, 1]);\n B.rotate(3 * DEG_60_RADIANS, [0, 0, 1]);\n B.translate([0, inDiameter + faceSpacing, 0]);\n B.rotate(-2 * DEG_60_RADIANS, [0, 0, 1]);\n this.faces = {\n top: this.U,\n right: this.R,\n left: this.L,\n back: this.B,\n };\n this.group = new Group([U, R, L, B]);\n }\n setColors(colors) {\n let { left, right, top, back } = colors;\n this.setFaceColors(this.L, left);\n this.setFaceColors(this.R, right);\n this.setFaceColors(this.U, top);\n this.setFaceColors(this.B, back);\n }\n setFaceColors(lattice, colors) {\n lattice.faces.forEach((f, i) => {\n if (colors && colors[i]) {\n f.color = colors[i];\n }\n else {\n f.color = BLACK;\n }\n });\n }\n}\n","import { GREEN, RED, BLUE, YELLOW, BLACK } from \"./colors\";\nimport { TriangleLattice } from \"./../geometry/triangleLattice\";\nimport { Group } from \"./../geometry/group\";\nconst ARC_COS_THIRD = Math.acos(1 / 3);\nconst DEG_120_RADIANS = (120 * Math.PI) / 180;\nconst SQRT_24 = Math.sqrt(24);\nexport class Pyraminx {\n constructor(size, sideLength = 1.75) {\n this.size = size;\n const insphereRadius = sideLength / SQRT_24;\n const U = new TriangleLattice(sideLength, size, YELLOW);\n const R = new TriangleLattice(sideLength, size, GREEN);\n const L = new TriangleLattice(sideLength, size, BLUE);\n const B = new TriangleLattice(sideLength, size, RED);\n this.L = L;\n this.R = R;\n this.U = U;\n this.B = B;\n U.rotate(DEG_120_RADIANS, [0, 0, 1]);\n U.rotate(ARC_COS_THIRD, [1, 0, 0]);\n U.translate([0, 0, insphereRadius]);\n R.rotate(ARC_COS_THIRD, [1, 0, 0]);\n R.translate([0, 0, insphereRadius]);\n L.rotate(-DEG_120_RADIANS, [0, 0, 1]);\n L.rotate(ARC_COS_THIRD, [1, 0, 0]);\n L.translate([0, 0, insphereRadius]);\n B.rotate(Math.PI, [0, 1, 0]);\n B.translate([0, 0, insphereRadius]);\n this.faces = {\n top: this.U,\n right: this.R,\n left: this.L,\n back: this.B,\n };\n this.group = new Group([U, L, R, B]);\n }\n setColors(colors) {\n let { left, right, top, back } = colors;\n this.setFaceColors(this.L, left);\n this.setFaceColors(this.R, right);\n this.setFaceColors(this.U, top);\n this.setFaceColors(this.B, back);\n }\n setFaceColors(lattice, colors) {\n lattice.faces.forEach((f, i) => {\n if (colors && colors[i]) {\n f.color = colors[i];\n }\n else {\n f.color = BLACK;\n }\n });\n }\n}\n","import { Face } from \"./../geometry/face\";\nimport { Geometry } from \"../geometry/geometry\";\nimport { polarToCartesian, lineSegmentLength, pentagonOutRadius, } from \"../math/utils\";\nexport class DividedPentagon extends Geometry {\n /**\n *\n * @param color\n * @param layers number of layers\n * @param length length of entire edge of the outer pentagon\n */\n constructor(color, layers = 2, length = 1.6, layerWidth = 0.4 // TODO: calculate this somehow\n ) {\n const outRadius = pentagonOutRadius(length);\n const radiusDiff = layerWidthToRadiusDiff(layerWidth);\n const centerOutRadius = outRadius - radiusDiff * (layers - 1);\n const vertices = faceVerticies(layers, centerOutRadius, radiusDiff, layerWidth);\n super(vertices, makeFaces(layers, color, vertices));\n }\n}\n/**\n * Given the the distance between two parallel sides of the\n * dividen pentagon, calculate the difference in pentagon radius\n */\nfunction layerWidthToRadiusDiff(width) {\n const aSquared = width * width;\n const angleRadians = (71 * Math.PI) / 180;\n // Law of cosines\n const cSquared = 2 * aSquared - 2 * aSquared * Math.cos(angleRadians);\n const diff = 2 * Math.sqrt(Math.abs(aSquared - cSquared));\n return diff;\n}\n/**\n * creates mapping for indicies in one layer to another\n * so we can build the geometry for a megaminx face\n */\nfunction downMapping(layer) {\n if (layer < 1) {\n return [];\n }\n let mapping = [];\n const layerPoints = 5 + (layer - 1) * 10;\n let previousPoints = 5 * (layer - 1) * (layer - 1);\n for (let i = 0; i < layerPoints; i++) {\n mapping.push(i + previousPoints);\n if (i % (layerPoints / 5) === 0) {\n mapping.push(i + previousPoints);\n }\n }\n mapping.push(mapping.shift());\n mapping.push(mapping.shift());\n return mapping;\n}\nfunction layerVertexNumbers(layer) {\n let previousPoints = 5 * layer * layer;\n let vertexNumbers = [];\n for (let i = 0, layerPoints = 5 + layer * 10; i < layerPoints; i++) {\n vertexNumbers.push(i + previousPoints);\n }\n return vertexNumbers;\n}\nfunction makeFaces(layers, color, vertices) {\n let faces = [];\n const firstLayerFace = new Face([0, 1, 2, 3, 4], vertices, color);\n faces.push(firstLayerFace);\n let totalPoints = 5;\n let currentPoint = 5;\n for (let i = 1; i < layers; i++) {\n const layerPoints = 5 + i * 10;\n totalPoints += layerPoints;\n const downMap = downMapping(i);\n const prevLayer = layerVertexNumbers(i - 1);\n const currentLayer = layerVertexNumbers(i);\n while (currentPoint < totalPoints) {\n const currentLayerPoint = currentPoint - (prevLayer[prevLayer.length - 1] + 1);\n const f1isCorner = currentLayerPoint % (layerPoints / 5) === 0;\n if (f1isCorner) {\n currentPoint++;\n continue;\n }\n const f2isCorner = (currentLayerPoint + 1) % (layerPoints / 5) === 0;\n let f1 = currentPoint;\n let f2 = currentLayer[(currentLayerPoint + 1) % currentLayer.length];\n let f3 = f2isCorner ? f2 + 1 : downMap.shift();\n let f4 = f2isCorner\n ? downMap.shift()\n : prevLayer[(prevLayer.indexOf(f3) - 1 + prevLayer.length) % prevLayer.length];\n currentPoint++;\n faces.push(new Face([f1, f2, f3, f4], vertices, color));\n }\n }\n return faces;\n}\n/**\n * Takes two points and extrapolates points along the line they make\n *\n * @param p1 point 1\n * @param p2 point 2\n * @param segments how many points to extrapolate from each direction p1 -> p2 and p2 -> p1\n */\nfunction segmentPoints(p1, p2, segments, layerWidth) {\n if (segments === 0) {\n return [\n [p1[0], p1[1], 0],\n [p2[0], p2[1], 0],\n ];\n }\n const length = lineSegmentLength(p1, p2);\n let points = [];\n for (let i = segments; i > 0; i--) {\n // extrapolate from p1\n let a = [\n p1[0] + ((p2[0] - p1[0]) / length) * layerWidth * i,\n p1[1] + ((p2[1] - p1[1]) / length) * layerWidth * i,\n 0,\n ];\n points.unshift(a);\n // extrapolate from p2\n let b = [\n p2[0] + ((p1[0] - p2[0]) / length) * layerWidth * i,\n p2[1] + ((p1[1] - p2[1]) / length) * layerWidth * i,\n 0,\n ];\n points.push(b);\n }\n points.unshift([p1[0], p1[1], 0]);\n points.push([p2[0], p2[1], 0]);\n return points;\n}\nfunction layerVerticies(layer, radius, layerWidth) {\n let verticies = [];\n for (let i = 0; i < 5; i++) {\n const theta = (i * (2 * Math.PI)) / 5 - Math.PI / 10;\n const v = polarToCartesian(radius, theta);\n if (verticies.length > 0) {\n const lastPoint = verticies[verticies.length - 1];\n const points = segmentPoints([lastPoint[0], lastPoint[1]], v, layer, layerWidth);\n points.shift(); // Remove the first, otherwise it's duplicated\n verticies = verticies.concat(points);\n }\n else {\n verticies.push([v[0], v[1], 0]);\n }\n }\n // Insert segments for last and first\n const first = verticies[0];\n const last = verticies[verticies.length - 1];\n const points = segmentPoints([last[0], last[1]], [first[0], first[1]], layer, layerWidth);\n points.pop();\n points.shift();\n verticies = verticies.concat(points);\n return verticies;\n}\nfunction faceVerticies(layers, radius, radiusDiff, layerWidth) {\n let verticies = [];\n for (let i = 0; i < layers; i++) {\n const r = radius + radiusDiff * i;\n verticies = [...verticies, ...layerVerticies(i, r, layerWidth)];\n }\n return verticies;\n}\n","import { mat4 } from \"gl-matrix\";\nimport { WHITE, RED, GREEN, PURPLE, YELLOW, BLUE, GREY, DARK_BLUE, LIGHT_YELLOW, PINK, LIGHT_GREEN, ORANGE, BLACK, } from \"./colors\";\nimport { Group } from \"./../geometry/group\";\nimport { DividedPentagon } from \"./../geometry/dividedPentagon\";\nimport { pentagonInRadius } from \"../math/utils\";\nimport { chunkArray } from \"../utils/arrays\";\nconst DEG_36_RADIANS = (36 * Math.PI) / 180;\nconst DEG_72_RADIANS = (72 * Math.PI) / 180;\n/**\n * for a megaminx with side length 1,\n * layer widths that look good.\n */\nconst OPTIMAL_LAYER_WIDTH = {\n 2: 0.3,\n 3: 0.17,\n 4: 0.121,\n};\nfunction getLayerWidth(length, layers) {\n return OPTIMAL_LAYER_WIDTH[layers] || length / (layers * 1.9);\n}\nexport class MegaminxNet {\n constructor(layers) {\n this.layers = layers;\n const sideLength = 0.75;\n const layerWidth = getLayerWidth(length, layers);\n // Left\n this.U = new DividedPentagon(WHITE, layers, sideLength, layerWidth);\n this.F = new DividedPentagon(RED, layers, sideLength, layerWidth);\n this.R = new DividedPentagon(BLUE, layers, sideLength, layerWidth);\n this.L = new DividedPentagon(GREEN, layers, sideLength, layerWidth);\n this.dl = new DividedPentagon(LIGHT_YELLOW, layers, sideLength, layerWidth);\n this.dr = new DividedPentagon(PINK, layers, sideLength, layerWidth);\n // Right\n this.BL = new DividedPentagon(PURPLE, layers, sideLength, layerWidth);\n this.BR = new DividedPentagon(YELLOW, layers, sideLength, layerWidth);\n this.d = new DividedPentagon(GREY, layers, sideLength, layerWidth);\n this.bl = new DividedPentagon(DARK_BLUE, layers, sideLength, layerWidth);\n this.br = new DividedPentagon(LIGHT_GREEN, layers, sideLength, layerWidth);\n this.b = new DividedPentagon(ORANGE, layers, sideLength, layerWidth);\n const ind = 2 * pentagonInRadius(sideLength);\n // Left\n this.U.translate([0, ind, 0]);\n this.U.rotate(5 * DEG_36_RADIANS, [0, 0, 1]);\n this.R.rotate(-DEG_72_RADIANS, [0, 0, 1]);\n this.R.translate([0, ind, 0]);\n this.R.rotate(5 * DEG_36_RADIANS, [0, 0, 1]);\n this.L.rotate(DEG_72_RADIANS, [0, 0, 1]);\n this.L.translate([0, ind, 0]);\n this.L.rotate(-5 * DEG_36_RADIANS, [0, 0, 1]);\n this.dl.rotate(2 * DEG_72_RADIANS, [0, 0, 1]);\n this.dl.translate([0, ind, 0]);\n this.dl.rotate(-5 * DEG_36_RADIANS, [0, 0, 1]);\n this.dr.rotate(-2 * DEG_72_RADIANS, [0, 0, 1]);\n this.dr.translate([0, ind, 0]);\n this.dr.rotate(-5 * DEG_36_RADIANS, [0, 0, 1]);\n // Right\n this.b.rotate(Math.PI, [0, 0, 1]);\n this.b.rotate(-2 * DEG_36_RADIANS, [0, 0, 1]);\n this.d.rotate(3 * DEG_36_RADIANS, [0, 0, 1]);\n this.d.translate([0, ind, 0]);\n this.d.rotate(5 * DEG_36_RADIANS, [0, 0, 1]);\n this.br.rotate(DEG_36_RADIANS, [0, 0, 1]);\n this.br.translate([0, ind, 0]);\n this.br.rotate(5 * DEG_36_RADIANS, [0, 0, 1]);\n this.BR.rotate(-DEG_36_RADIANS, [0, 0, 1]);\n this.BR.translate([0, ind, 0]);\n this.BR.rotate(-5 * DEG_36_RADIANS, [0, 0, 1]);\n this.BL.rotate(-3 * DEG_36_RADIANS, [0, 0, 1]);\n this.BL.translate([0, ind, 0]);\n this.BL.rotate(5 * DEG_36_RADIANS, [0, 0, 1]);\n this.bl.rotate(5 * DEG_36_RADIANS, [0, 0, 1]);\n this.bl.translate([0, ind, 0]);\n this.bl.rotate(-5 * DEG_36_RADIANS, [0, 0, 1]);\n let bottomTransforms = mat4.create();\n mat4.rotate(bottomTransforms, bottomTransforms, -DEG_72_RADIANS, [0, 0, 1]);\n mat4.translate(bottomTransforms, bottomTransforms, [0, 2 * ind, 0]);\n mat4.rotate(bottomTransforms, bottomTransforms, 2 * DEG_72_RADIANS, [\n 0,\n 0,\n 1,\n ]);\n mat4.translate(bottomTransforms, bottomTransforms, [0, -ind, 0]);\n [this.d, this.bl, this.BL, this.BR, this.br, this.b].forEach((face) => {\n mat4.mul(face.matrix, bottomTransforms, face.matrix);\n });\n this.faces = {\n U: this.U,\n F: this.F,\n R: this.R,\n dr: this.dr,\n dl: this.dl,\n L: this.L,\n d: this.d,\n br: this.br,\n BR: this.BR,\n BL: this.BL,\n bl: this.bl,\n b: this.b,\n };\n this.group = new Group([\n this.U,\n this.F,\n this.L,\n this.dr,\n this.dl,\n this.R,\n this.d,\n this.bl,\n this.BL,\n this.BR,\n this.br,\n this.b,\n ]);\n this.group.scale([0.33, 0.33, 0.33]);\n this.group.translate([-1.75 * sideLength, 0, 0]);\n }\n setColors(colors) {\n let { U, R, F, d, L, b, dr, dl, br, BR, BL, bl } = colors;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.d, d);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.b, b);\n this.setFaceColors(this.dr, dr);\n this.setFaceColors(this.dl, dl);\n this.setFaceColors(this.BR, BR);\n this.setFaceColors(this.BL, BL);\n this.setFaceColors(this.bl, bl);\n this.setFaceColors(this.br, br);\n }\n oldSetColors(colors) {\n const n = this.layers;\n const numStickers = 5 * n * n - 5 * n + 1;\n let [U, R, F, dr, dl, L, d, br, BR, BL, bl, b] = chunkArray(colors, numStickers);\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.d, d);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.b, b);\n this.setFaceColors(this.dr, dr);\n this.setFaceColors(this.dl, dl);\n this.setFaceColors(this.br, br);\n this.setFaceColors(this.BR, BR);\n this.setFaceColors(this.BL, BL);\n this.setFaceColors(this.bl, bl);\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.faces.forEach((f, i) => {\n if (colors && colors[i]) {\n f.color = colors[i];\n }\n else {\n f.color = BLACK;\n }\n });\n }\n}\n","import { WHITE, RED, GREEN, YELLOW, BLUE, ORANGE, LIGHT_GREEN, PINK, LIGHT_YELLOW, DARK_BLUE, GREY, PURPLE, BLACK, } from \"./colors\";\nimport { Group } from \"./../geometry/group\";\nimport { DividedPentagon } from \"../geometry/dividedPentagon\";\nimport { dodecahedronInRadius } from \"../math/utils\";\nconst OPTIMAL_LAYER_WIDTH = {\n 2: 0.3,\n 3: 0.17,\n 4: 0.121,\n};\nfunction getLayerWidth(length, layers) {\n return OPTIMAL_LAYER_WIDTH[layers] || length / (layers * 1.9);\n}\nexport class Megaminx {\n constructor(layers = 2) {\n this.layers = layers;\n const length = 0.75;\n const megaminxRadius = dodecahedronInRadius(length);\n const layerWidth = getLayerWidth(length, layers);\n // Front\n this.U = new DividedPentagon(WHITE, layers, length, layerWidth);\n this.F = new DividedPentagon(RED, layers, length, layerWidth);\n this.R = new DividedPentagon(BLUE, layers, length, layerWidth);\n this.dr = new DividedPentagon(PINK, layers, length, layerWidth);\n this.dl = new DividedPentagon(LIGHT_YELLOW, layers, length, layerWidth);\n this.L = new DividedPentagon(GREEN, layers, length, layerWidth);\n // Back\n this.d = new DividedPentagon(GREY, layers, length, layerWidth);\n this.br = new DividedPentagon(LIGHT_GREEN, layers, length, layerWidth);\n this.BR = new DividedPentagon(YELLOW, layers, length, layerWidth);\n this.BL = new DividedPentagon(PURPLE, layers, length, layerWidth);\n this.bl = new DividedPentagon(DARK_BLUE, layers, length, layerWidth);\n this.b = new DividedPentagon(ORANGE, layers, length, layerWidth);\n this.F.translate([0, 0, megaminxRadius]);\n this.b.rotate(Math.PI, [0, 0, 1]);\n this.b.rotate(Math.PI, [0, 1, 0]);\n this.b.translate([0, 0, megaminxRadius]);\n this.U.rotate(Math.PI, [0, 0, 1]);\n this.U.rotate(((180 - 116.57) * Math.PI) / 180, [1, 0, 0]);\n this.U.translate([0, 0, megaminxRadius]);\n this.L.rotate((72 * Math.PI) / 180, [0, 0, 1]);\n this.L.rotate(Math.PI, [0, 0, 1]);\n this.L.rotate(((180 - 116.57) * Math.PI) / 180, [1, 0, 0]);\n this.L.translate([0, 0, megaminxRadius]);\n this.R.rotate((72 * Math.PI) / 180, [0, 0, 1]);\n this.R.rotate(Math.PI / 5, [0, 0, 1]);\n this.R.rotate(((180 - 116.57) * Math.PI) / 180, [1, 0, 0]);\n this.R.translate([0, 0, megaminxRadius]);\n this.dr.rotate((72 * Math.PI) / 180, [0, 0, 1]);\n this.dr.rotate(-Math.PI / 5, [0, 0, 1]);\n this.dr.rotate(((180 - 116.57) * Math.PI) / 180, [1, 0, 0]);\n this.dr.translate([0, 0, megaminxRadius]);\n this.dl.rotate((72 * Math.PI) / 180, [0, 0, 1]);\n this.dl.rotate((-3 * Math.PI) / 5, [0, 0, 1]);\n this.dl.rotate(((180 - 116.57) * Math.PI) / 180, [1, 0, 0]);\n this.dl.translate([0, 0, megaminxRadius]);\n this.BL.rotate(Math.PI / 5, [0, 0, 1]);\n this.BL.rotate((-116.57 * Math.PI) / 180, [1, 0, 0]);\n this.BL.translate([0, 0, megaminxRadius]);\n this.BR.rotate(-Math.PI / 5, [0, 0, 1]);\n this.BR.rotate((-116.57 * Math.PI) / 180, [1, 0, 0]);\n this.BR.translate([0, 0, megaminxRadius]);\n this.bl.rotate((3 * Math.PI) / 5, [0, 0, 1]);\n this.bl.rotate((-116.57 * Math.PI) / 180, [1, 0, 0]);\n this.bl.translate([0, 0, megaminxRadius]);\n this.d.rotate((5 * Math.PI) / 5, [0, 0, 1]);\n this.d.rotate((-116.57 * Math.PI) / 180, [1, 0, 0]);\n this.d.translate([0, 0, megaminxRadius]);\n this.br.rotate((7 * Math.PI) / 5, [0, 0, 1]);\n this.br.rotate((-116.57 * Math.PI) / 180, [1, 0, 0]);\n this.br.translate([0, 0, megaminxRadius]);\n this.stickers = [\n this.U,\n this.F,\n this.R,\n this.dr,\n this.dl,\n this.L,\n this.d,\n this.br,\n this.BR,\n this.BL,\n this.bl,\n this.b,\n ];\n this.faces = {\n U: this.U,\n F: this.F,\n R: this.R,\n dr: this.dr,\n dl: this.dl,\n L: this.L,\n d: this.d,\n br: this.br,\n BR: this.BR,\n BL: this.BL,\n bl: this.bl,\n b: this.b,\n };\n this.group = new Group(this.stickers);\n }\n setColors(colors) {\n let { U, R, F, d, L, b, dr, dl, br, BR, BL, bl } = colors;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.d, d);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.b, b);\n this.setFaceColors(this.dr, dr);\n this.setFaceColors(this.dl, dl);\n this.setFaceColors(this.BR, BR);\n this.setFaceColors(this.BL, BL);\n this.setFaceColors(this.bl, bl);\n this.setFaceColors(this.br, br);\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.faces.forEach((f, i) => {\n if (colors && colors[i]) {\n f.color = colors[i];\n }\n else {\n f.color = BLACK;\n }\n });\n }\n}\n","import { Face } from \"./face\";\nimport { Geometry } from \"./geometry\";\n/**\n * Makes a (size*size) grid of colored planes for the\n * rubiks cube stickers. Indexed from the top\n * left to bottom right. See Below\n *\n * ```\n * 0 1 2\n * 3 4 5\n * 6 7 8\n * ```\n *\n * @param length length of the grid\n * @param size number of elements to segment grid into\n * @param color\n */\nexport function makeGrid(length, size, color) {\n const halfLength = length / 2;\n const elementWidth = length / size;\n const halfElementWidth = elementWidth / 2;\n let stickers = [];\n for (let i = 0; i < size; i++) {\n let vOffset = -(-halfLength + halfElementWidth + elementWidth * i);\n stickers = stickers.concat(makeRow(length, size, color, vOffset));\n }\n return stickers;\n}\n/**\n * Makes a row of planes for the rubiks cube stickers.\n * indexed from left to right\n *\n * 0 1 2\n *\n * @param length length of the row horizontally\n * @param size number of elements to segment row into\n * @param color color\n * @param vOffset vertical offset. places vertices of row vertically offset by this amount from x axis\n */\nexport function makeRow(length, size, color, vOffset = 0) {\n const halfLength = length / 2;\n const elementWidth = length / size;\n const halfElementWidth = elementWidth / 2;\n let stickers = [];\n for (let i = 0; i < size; i++) {\n let hOffset = -halfLength + halfElementWidth + elementWidth * i;\n let vertices = [\n [-halfElementWidth + hOffset, halfElementWidth + vOffset, 0],\n [halfElementWidth + hOffset, halfElementWidth + vOffset, 0],\n [halfElementWidth + hOffset, -halfElementWidth + vOffset, 0],\n [-halfElementWidth + hOffset, -halfElementWidth + vOffset, 0],\n ];\n let faces = [new Face([0, 1, 2, 3], vertices, color)];\n stickers.push(new Geometry(vertices, faces));\n }\n return stickers;\n}\n","import { vec3 } from \"gl-matrix\";\nimport { YELLOW, RED, BLUE, GREEN, ORANGE, BLACK, } from \"./../colors\";\nimport { Group } from \"./../../geometry/group\";\nimport { makeGrid, makeRow } from \"./../../geometry/grid\";\nimport { calculateCentroid } from \"../../math/utils\";\nexport class RubiksCubeTopLayer {\n constructor(size, rotationAngle = Math.PI / 4) {\n this.size = size;\n this.stickerWidth = 1 / 2;\n this.halfStickerWidth = this.stickerWidth / 2;\n this.cubeWidth = this.stickerWidth * size;\n this.halfCubeWidth = this.cubeWidth / 2;\n this.U = new Group(makeGrid(this.cubeWidth, this.size, YELLOW));\n this.R = new Group(makeRow(this.cubeWidth, this.size, RED));\n this.F = new Group(makeRow(this.cubeWidth, this.size, BLUE));\n this.B = new Group(makeRow(this.cubeWidth, this.size, GREEN));\n this.L = new Group(makeRow(this.cubeWidth, this.size, ORANGE));\n const borderOffset = this.halfCubeWidth + this.halfStickerWidth;\n this.B.translate([0, borderOffset, 0]);\n this.B.rotate(Math.PI, [0, 0, 1]);\n this.F.translate([0, -borderOffset, 0]);\n this.R.translate([borderOffset, 0, 0]);\n this.R.rotate(Math.PI / 2, [0, 0, 1]);\n this.L.translate([-borderOffset, 0, 0]);\n this.L.rotate(-Math.PI / 2, [0, 0, 1]);\n this.rotateBorder(this.F.objects, rotationAngle);\n this.rotateBorder(this.R.objects, rotationAngle);\n this.rotateBorder(this.B.objects, rotationAngle);\n this.rotateBorder(this.L.objects, rotationAngle);\n this.stickers = [this.U, this.R, this.F, this.B, this.L];\n this.group = new Group(this.stickers);\n this.faces = {\n U: this.U,\n R: this.R,\n F: this.F,\n L: this.L,\n B: this.B,\n };\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.objects.forEach((g, i) => {\n if (colors && colors[i]) {\n g.faces[0].color = colors[i];\n }\n else {\n g.faces[0].color = BLACK;\n }\n });\n }\n setColors(colors) {\n let { U, R, F, L, B } = colors;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.B, B);\n }\n /**\n * given a row of stickers centered at 0,0,0\n * rotates each vertex of each sticker around\n * the top of the sticker.\n */\n rotateBorder(stickers, radians) {\n stickers.forEach((sticker) => {\n sticker.vertices = sticker.vertices.map((vertex) => {\n return vec3.rotateX(vertex, vertex, [0, this.halfStickerWidth, 0], radians);\n });\n sticker.centroid = calculateCentroid(sticker.vertices);\n });\n }\n}\n","import { YELLOW, RED, BLUE, WHITE, ORANGE, GREEN, BLACK, } from \"./../colors\";\nimport { Group } from \"./../../geometry/group\";\nimport { makeGrid } from \"../../geometry/grid\";\nexport class RubiksCubeNet {\n constructor(size) {\n const cubeWidth = 1;\n this.size = size;\n const U = makeGrid(cubeWidth, size, YELLOW);\n const R = makeGrid(cubeWidth, size, RED);\n const F = makeGrid(cubeWidth, size, BLUE);\n const D = makeGrid(cubeWidth, size, WHITE);\n const L = makeGrid(cubeWidth, size, ORANGE);\n const B = makeGrid(cubeWidth, size, GREEN);\n this.U = new Group(U);\n this.U.translate([0, cubeWidth, 0]);\n this.R = new Group(R);\n this.R.translate([cubeWidth, 0, 0]);\n this.F = new Group(F);\n this.D = new Group(D);\n this.D.translate([0, -cubeWidth, 0]);\n this.L = new Group(L);\n this.L.translate([-cubeWidth, 0, 0]);\n this.B = new Group(B);\n this.B.translate([2 * cubeWidth, 0, 0]);\n this.stickers = [this.U, this.R, this.F, this.D, this.L, this.B];\n this.faces = {\n U: this.U,\n R: this.R,\n F: this.F,\n D: this.D,\n L: this.L,\n B: this.B,\n };\n this.group = new Group(this.stickers);\n this.group.translate([-cubeWidth / 4, 0, 0]);\n this.group.scale([0.5, 0.5, 0.5]);\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.objects.forEach((g, i) => {\n if (colors && colors[i]) {\n g.faces[0].color = colors[i];\n }\n else {\n g.faces[0].color = BLACK;\n }\n });\n }\n setColors(colors) {\n let { U, R, F, D, L, B } = colors;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.D, D);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.B, B);\n }\n}\n","import { YELLOW, RED, BLUE, WHITE, ORANGE, GREEN, BLACK } from \"./../colors\";\nimport { Group } from \"../../geometry/group\";\nimport { makeGrid } from \"../../geometry/grid\";\nexport class RubiksCube {\n constructor(size) {\n this.size = size;\n const cubeWidth = 1.25;\n const halfWidth = cubeWidth / 2;\n this.U = new Group(makeGrid(cubeWidth, size, YELLOW));\n this.R = new Group(makeGrid(cubeWidth, size, RED));\n this.F = new Group(makeGrid(cubeWidth, size, BLUE));\n this.D = new Group(makeGrid(cubeWidth, size, WHITE));\n this.L = new Group(makeGrid(cubeWidth, size, ORANGE));\n this.B = new Group(makeGrid(cubeWidth, size, GREEN));\n this.U.rotate(-Math.PI / 2, [0, 1, 0]);\n this.U.rotate(-Math.PI / 2, [1, 0, 0]);\n this.U.translate([0, 0, halfWidth]);\n this.R.translate([0, 0, halfWidth]);\n this.F.rotate(-Math.PI / 2, [0, 1, 0]);\n this.F.translate([0, 0, halfWidth]);\n this.D.rotate(-Math.PI / 2, [0, 1, 0]);\n this.D.rotate(Math.PI / 2, [1, 0, 0]);\n this.D.translate([0, 0, halfWidth]);\n this.L.rotate(-Math.PI, [0, 1, 0]);\n this.L.translate([0, 0, halfWidth]);\n this.B.rotate(Math.PI / 2, [0, 1, 0]);\n this.B.translate([0, 0, halfWidth]);\n this.stickers = [this.U, this.R, this.F, this.D, this.L, this.B];\n this.faces = {\n U: this.U,\n R: this.R,\n F: this.F,\n D: this.D,\n L: this.L,\n B: this.B,\n };\n this.group = new Group(this.stickers);\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.objects.forEach((g, i) => {\n if (colors && colors[i]) {\n g.faces[0].color = colors[i];\n }\n else {\n g.faces[0].color = BLACK;\n }\n });\n }\n setColors(colors) {\n let { U, R, F, D, L, B } = colors;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.D, D);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.B, B);\n }\n}\n","import { calculateCentroid } from \"../math/utils\";\nimport { Object3D } from \"./object3d\";\nexport class Arrow extends Object3D {\n constructor(p1, p2) {\n super();\n this.p1 = p1;\n this.p2 = p2;\n this.centroid = calculateCentroid([p1, p2]);\n }\n}\n","import { BLACK } from \"../puzzles/colors\";\nexport function createSVGElement(width, height, minx, miny, svgWidth, svgHeight) {\n const svgElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svgElement.setAttributeNS(null, \"width\", width.toString());\n svgElement.setAttributeNS(null, \"height\", height.toString());\n svgElement.setAttributeNS(null, \"viewBox\", `${minx} ${miny} ${svgWidth} ${svgHeight}`);\n svgElement.setAttributeNS(null, \"id\", \"sr-visualizer\");\n return svgElement;\n}\nexport function createPolygonElement(points, color, strokeWidth) {\n const polygon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n updatePolygonElement(polygon, points, color, strokeWidth);\n return polygon;\n}\nexport function createArrowLineElement(start, end, color, strokeWidth) {\n const line = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n let strokeColor = color ? color.value : BLACK.value;\n line.setAttributeNS(null, \"x1\", start[0].toString());\n line.setAttributeNS(null, \"y1\", (-start[1]).toString());\n line.setAttributeNS(null, \"x2\", end[0].toString());\n line.setAttributeNS(null, \"y2\", (-end[1]).toString());\n line.setAttributeNS(null, \"stroke\", strokeColor);\n line.setAttributeNS(null, \"marker-end\", \"url(#arrowhead)\");\n if (strokeWidth) {\n line.setAttributeNS(null, \"stroke-width\", strokeWidth);\n }\n return line;\n}\nexport function updatePolygonElement(polygon, points, color, strokeWidth) {\n const pointsAttribute = makePointsAttributeValue(points);\n const colorValue = color ? color.value : \"black\";\n const strokeValue = (color && color.stroke) || \"#000000\";\n polygon.setAttributeNS(null, \"points\", pointsAttribute);\n polygon.setAttributeNS(null, \"fill\", colorValue);\n if (strokeWidth) {\n polygon.setAttributeNS(null, \"stroke\", strokeValue);\n polygon.setAttributeNS(null, \"stroke-width\", strokeWidth);\n }\n polygon.setAttributeNS(null, \"stroke-linejoin\", \"round\");\n}\nexport function clearSVG(svg) {\n while (svg.hasChildNodes()) {\n svg.removeChild(svg.lastChild);\n }\n}\nexport function createMarkers(color) {\n const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\n const arrowHeadMarker = document.createElementNS(\"http://www.w3.org/2000/svg\", \"marker\");\n arrowHeadMarker.setAttributeNS(null, \"id\", \"arrowhead\");\n arrowHeadMarker.setAttributeNS(null, \"markerWidth\", \"4\");\n arrowHeadMarker.setAttributeNS(null, \"markerHeight\", \"3.5\");\n arrowHeadMarker.setAttributeNS(null, \"refX\", \"3\");\n arrowHeadMarker.setAttributeNS(null, \"refY\", \"1.75\");\n arrowHeadMarker.setAttributeNS(null, \"orient\", \"auto\");\n const arrowHeadPolygon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n arrowHeadPolygon.setAttributeNS(null, \"points\", \"0 0, 4 1.75, 0 3.5\");\n arrowHeadPolygon.setAttributeNS(null, \"fill\", color.value);\n defs.appendChild(arrowHeadMarker);\n arrowHeadMarker.appendChild(arrowHeadPolygon);\n return defs;\n}\nfunction makePointsAttributeValue(points) {\n return points.reduce((pointString, point) => {\n return `${pointString ? pointString + \" \" : \"\"}${point[0]}, ${point[1]}`;\n }, \"\");\n}\n","import { vec3 } from \"gl-matrix\";\nexport function applyTransformations(vertex, transforms) {\n return transforms.reduce((v, t) => {\n return vec3.transformMat4(v, v, t);\n }, vec3.clone(vertex));\n}\n","import { BLACK } from \"./../puzzles/colors\";\nimport { Arrow } from \"./../geometry/arrow\";\nimport { vec3 } from \"gl-matrix\";\nimport { Geometry } from \"../geometry/geometry\";\nimport { Group } from \"../geometry/group\";\nimport { createSVGElement, createPolygonElement, updatePolygonElement, createArrowLineElement, createMarkers, } from \"../svg/svg\";\nimport { applyTransformations } from \"./utils\";\n/**\n * A renderer that renders a scene viewed by a camera to an svg element.\n */\nexport class CustomSVGRenderer {\n /**\n * Creates an SVG renderer. This will create it's own html `` element. it's\n * the user's job to add this element to the page.\n *\n * @example\n * ```\n * const renderer = new CustomSVGRenderer(width, height, minx, miny, svgWidth, svgHeight)\n * document.getElementById('my-element').appendChild(renderer.domElement);\n * ```\n *\n * @param width svg element width in pixels\n * @param height svg element height in pixels\n * @param minx min x for the svg element viewbox\n * @param miny min x for the svg element viewbox\n * @param svgWidth svg viewbox width\n * @param svgHeight svg viewbox height\n */\n constructor(width, height, minx, miny, svgWidth, svgHeight, arrowColor) {\n this.strokeWidth = \"0.035\";\n this.arrowStrokeWidth = \"0.03\";\n this.polygons = [];\n this.lines = [];\n this.uidToPolygon = {};\n this.uidToLine = {};\n this.arrowColor = arrowColor || BLACK;\n this.domElement = document.createElement(\"div\");\n this.domElement.className = \"svg-renderer\";\n this.svgElement = createSVGElement(width, height, minx, miny, svgWidth, svgHeight);\n const markers = createMarkers(this.arrowColor);\n this.svgElement.appendChild(markers);\n this.domElement.appendChild(this.svgElement);\n }\n render(scene, camera) {\n this.polygons = [];\n this.lines = [];\n // this.sortObjects(scene.objects, camera, []);\n scene.objects.forEach((object) => {\n this.renderObject3D(object, camera, []);\n });\n this.renderPolygons();\n this.renderLines();\n }\n renderPolygons() {\n this.polygons.sort((a, b) => {\n return a.centroid[2] - b.centroid[2];\n });\n this.polygons.forEach((p) => this.svgElement.appendChild(p.polygon));\n }\n renderLines() {\n this.lines.forEach((line) => {\n this.svgElement.appendChild(line);\n });\n }\n addPolygon(points, face, object, transformations) {\n if (!this.uidToPolygon[face.uid]) {\n // Create new polygon for a face that hasn't been rendered\n this.uidToPolygon[face.uid] = createPolygonElement(points, face.color || object.color, this.strokeWidth);\n }\n else {\n // Just update existing polygon element\n const polygon = this.uidToPolygon[face.uid];\n updatePolygonElement(polygon, points, face.color || object.color, this.strokeWidth);\n }\n this.polygons.push({\n polygon: this.uidToPolygon[face.uid],\n centroid: applyTransformations(face.centroid, [\n object.matrix,\n ...transformations,\n ]),\n });\n }\n renderObject3D(object, camera, transformations) {\n if (object instanceof Geometry) {\n this.renderGeometry(object, camera, transformations);\n }\n else if (object instanceof Arrow) {\n this.renderArrow(object, camera, transformations);\n }\n else if (object instanceof Group) {\n let group = object;\n this.sortObjects(group.objects, camera, [\n group.matrix,\n ...transformations,\n ]);\n group.objects.forEach((object) => {\n this.renderObject3D(object, camera, [group.matrix, ...transformations]);\n });\n }\n }\n renderGeometry(object, camera, transformations) {\n // this.sortFaces(object.faces, object, transformations);\n object.faces.forEach((face) => {\n let points = [];\n face.indices\n .map((index) => object.vertices[index])\n .forEach((vertex) => {\n let objectToScreen = [\n object.matrix,\n ...transformations,\n camera.matrix,\n ];\n let v = applyTransformations(vertex, objectToScreen);\n // Need to flip y to look correct on svg viewbox\n let screenPoint = vec3.multiply(v, v, [1, -1, 1]);\n points.push(screenPoint);\n });\n this.addPolygon(points, face, object, transformations);\n });\n }\n renderArrow(object, camera, transformations) {\n let objectToScreen = [object.matrix, ...transformations, camera.matrix];\n let p1Screen = applyTransformations(object.p1, objectToScreen);\n let p2Screen = applyTransformations(object.p2, objectToScreen);\n let arrow;\n if (!this.uidToLine[object.uid]) {\n arrow = createArrowLineElement(p1Screen, p2Screen, this.arrowColor, this.arrowStrokeWidth);\n this.uidToLine[object.uid] = arrow;\n }\n else {\n arrow = this.uidToLine[object.uid];\n arrow.setAttributeNS(null, \"x1\", p1Screen[0].toString());\n arrow.setAttributeNS(null, \"y1\", (-p1Screen[1]).toString());\n arrow.setAttributeNS(null, \"x2\", p2Screen[0].toString());\n arrow.setAttributeNS(null, \"y2\", (-p2Screen[1]).toString());\n }\n this.lines.push(arrow);\n }\n sortFaces(faces, object, transformations) {\n faces.sort((a, b) => {\n let aToWorld = [object.matrix, ...transformations];\n let bToWorld = [object.matrix, ...transformations];\n let aCentroid = applyTransformations(a.centroid, aToWorld);\n let bCentroid = applyTransformations(b.centroid, bToWorld);\n // TODO actually use camera, currently only sorting by Z\n return aCentroid[2] - bCentroid[2];\n });\n }\n sortObjects(objects, camera, transformations) {\n objects.sort((a, b) => {\n let aToWorld = [a.matrix, ...transformations];\n let bToWorld = [b.matrix, ...transformations];\n let aCentroid = applyTransformations(a.centroid, aToWorld);\n let bCentroid = applyTransformations(b.centroid, bToWorld);\n // TODO actually use camera, currently only sorting by Z\n return aCentroid[2] - bCentroid[2];\n });\n }\n}\n","import { mat4 } from \"gl-matrix\";\nexport class Camera {\n constructor() {\n this.matrix = mat4.create();\n mat4.perspective(this.matrix, Math.PI / 2, 1, 0.1, 1000);\n mat4.translate(this.matrix, this.matrix, [0, 0, -5]);\n mat4.scale(this.matrix, this.matrix, [4, 4, 1]);\n }\n}\n","export class Scene {\n constructor() {\n this.objects = [];\n }\n add(geometry) {\n this.objects.push(geometry);\n }\n clear() {\n this.objects = [];\n }\n}\n","export var VisualizerType;\n(function (VisualizerType) {\n VisualizerType[\"CUBE\"] = \"cube\";\n VisualizerType[\"CUBE_NET\"] = \"cube-net\";\n VisualizerType[\"CUBE_TOP\"] = \"cube-top\";\n VisualizerType[\"MEGAMINX\"] = \"megaminx\";\n VisualizerType[\"MEGAMINX_NET\"] = \"megaminx-net\";\n VisualizerType[\"MEGAMINX_TOP\"] = \"megaminx-top\";\n VisualizerType[\"PYRAMINX\"] = \"pyraminx\";\n VisualizerType[\"PYRAMINX_NET\"] = \"pyraminx-net\";\n VisualizerType[\"SKEWB\"] = \"skewb\";\n VisualizerType[\"SKEWB_NET\"] = \"skewb-net\";\n VisualizerType[\"SQUARE1\"] = \"square1\";\n VisualizerType[\"SQUARE1_NET\"] = \"square1-net\";\n})(VisualizerType || (VisualizerType = {}));\n","import { VisualizerType } from \"./enum\";\nimport { RED, YELLOW, BLUE, WHITE, ORANGE, GREEN, PINK, LIGHT_YELLOW, GREY, LIGHT_GREEN, PURPLE, DARK_BLUE, } from \"./../puzzles/colors\";\nimport { DEFAULT_SQ1_SCHEME } from \"../puzzles/square1/constants\";\nexport const defaultCubeOptions = {\n size: 3,\n scheme: {\n U: YELLOW,\n R: RED,\n F: BLUE,\n D: WHITE,\n L: ORANGE,\n B: GREEN,\n },\n rotations: [\n {\n x: 0,\n y: 45,\n z: 0,\n },\n {\n x: 34,\n y: 0,\n z: 0,\n },\n ],\n};\nexport const defaultMegaminxOptions = {\n size: 2,\n scheme: {\n U: WHITE,\n F: RED,\n R: BLUE,\n dr: PINK,\n dl: LIGHT_YELLOW,\n L: GREEN,\n d: GREY,\n br: LIGHT_GREEN,\n BR: YELLOW,\n BL: PURPLE,\n bl: DARK_BLUE,\n b: ORANGE,\n },\n};\nexport const defaultPyraminxOptions = {\n size: 3,\n scheme: {\n left: BLUE,\n right: GREEN,\n top: YELLOW,\n back: RED,\n },\n rotations: [\n {\n x: 0,\n y: 0,\n z: 60,\n },\n {\n x: -60,\n y: 0,\n z: 0,\n },\n ],\n};\nexport const defaultSkewbOptions = {\n scheme: {\n top: YELLOW,\n front: BLUE,\n right: RED,\n back: GREEN,\n left: ORANGE,\n bottom: WHITE,\n },\n rotations: [\n {\n x: 0,\n y: 45,\n z: 0,\n },\n {\n x: 34,\n y: 0,\n z: 0,\n },\n ],\n};\nexport const defaultSquare1Options = {\n scheme: DEFAULT_SQ1_SCHEME,\n rotations: [\n {\n x: 0,\n y: 0,\n z: -34,\n },\n {\n x: -56,\n y: 0,\n z: 0,\n },\n ],\n};\nexport function getDefaultOptions(type) {\n switch (type) {\n case VisualizerType.CUBE:\n return defaultCubeOptions;\n case VisualizerType.CUBE_NET:\n return Object.assign(Object.assign({}, defaultCubeOptions), { rotations: null });\n case VisualizerType.CUBE_TOP:\n return Object.assign(Object.assign({}, defaultCubeOptions), { rotations: null });\n case VisualizerType.MEGAMINX:\n case VisualizerType.MEGAMINX_NET:\n case VisualizerType.MEGAMINX_TOP:\n return defaultMegaminxOptions;\n case VisualizerType.PYRAMINX:\n return defaultPyraminxOptions;\n case VisualizerType.PYRAMINX_NET:\n return Object.assign(Object.assign({}, defaultPyraminxOptions), { rotations: null });\n case VisualizerType.SKEWB:\n return defaultSkewbOptions;\n case VisualizerType.SKEWB_NET:\n return Object.assign(Object.assign({}, defaultSkewbOptions), { rotations: null });\n case VisualizerType.SQUARE1:\n return defaultSquare1Options;\n case VisualizerType.SQUARE1_NET:\n return Object.assign(Object.assign({}, defaultSquare1Options), { rotations: null });\n default:\n throw new Error(`Could not get default options for puzzle ${type}`);\n }\n}\n","import * as glMatrix from \"./common.js\";\n/**\r\n * 4 Dimensional Vector\r\n * @module vec4\r\n */\n\n/**\r\n * Creates a new, empty vec4\r\n *\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec4} a vector to clone\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Copy the values from one vec4 to another\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the source vector\r\n * @returns {vec4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to the given values\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} out\r\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Adds two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\r\n * Multiplies two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\r\n * Divides two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to ceil\r\n * @returns {vec4} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to floor\r\n * @returns {vec4} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\r\n * Math.round the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to round\r\n * @returns {vec4} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\r\n * Scales a vec4 by a scalar number\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec4} out\r\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\r\n * Adds two vec4's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec4} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Calculates the length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Negates the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to negate\r\n * @returns {vec4} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to invert\r\n * @returns {vec4} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\r\n * Normalize a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to normalize\r\n * @returns {vec4} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\r\n * Returns the cross-product of three vectors in a 4-dimensional space\r\n *\r\n * @param {ReadonlyVec4} result the receiving vector\r\n * @param {ReadonlyVec4} U the first vector\r\n * @param {ReadonlyVec4} V the second vector\r\n * @param {ReadonlyVec4} W the third vector\r\n * @returns {vec4} result\r\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec4} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec4} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\r\n * Transforms the vec4 with a mat4.\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec4} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\r\n * Transforms the vec4 with a quat\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec4} out\r\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to zero\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @returns {vec4} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec4} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\r\n * Alias for {@link vec4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec4.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec4.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec4.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec4.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec4.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec4s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\n/**\r\n * Quaternion\r\n * @module quat\r\n */\n\n/**\r\n * Creates a new identity quat\r\n *\r\n * @returns {quat} a new quaternion\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\r\n * Set a quat to the identity quaternion\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @returns {quat} out\r\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\r\n * Sets a quat from the given angle and rotation axis,\r\n * then returns it.\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyVec3} axis the axis around which to rotate\r\n * @param {Number} rad the angle in radians\r\n * @returns {quat} out\r\n **/\n\nexport function setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\r\n * Gets the rotation axis and angle for a given\r\n * quaternion. If a quaternion is created with\r\n * setAxisAngle, this method will return the same\r\n * values as providied in the original parameter list\r\n * OR functionally equivalent values.\r\n * Example: The quaternion formed by axis [0, 0, 1] and\r\n * angle -90 is the same as the quaternion formed by\r\n * [0, 0, 1] and 270. This method favors the latter.\r\n * @param {vec3} out_axis Vector receiving the axis of rotation\r\n * @param {ReadonlyQuat} q Quaternion to be decomposed\r\n * @return {Number} Angle, in radians, of the rotation\r\n */\n\nexport function getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > glMatrix.EPSILON) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\r\n * Gets the angular distance between two unit quaternions\r\n *\r\n * @param {ReadonlyQuat} a Origin unit quaternion\r\n * @param {ReadonlyQuat} b Destination unit quaternion\r\n * @return {Number} Angle, in radians, between the two quaternions\r\n */\n\nexport function getAngle(a, b) {\n var dotproduct = dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\r\n * Multiplies two quat's\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a the first operand\r\n * @param {ReadonlyQuat} b the second operand\r\n * @returns {quat} out\r\n */\n\nexport function multiply(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\r\n * Rotates a quaternion by the given angle about the X axis\r\n *\r\n * @param {quat} out quat receiving operation result\r\n * @param {ReadonlyQuat} a quat to rotate\r\n * @param {number} rad angle (in radians) to rotate\r\n * @returns {quat} out\r\n */\n\nexport function rotateX(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\r\n * Rotates a quaternion by the given angle about the Y axis\r\n *\r\n * @param {quat} out quat receiving operation result\r\n * @param {ReadonlyQuat} a quat to rotate\r\n * @param {number} rad angle (in radians) to rotate\r\n * @returns {quat} out\r\n */\n\nexport function rotateY(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\r\n * Rotates a quaternion by the given angle about the Z axis\r\n *\r\n * @param {quat} out quat receiving operation result\r\n * @param {ReadonlyQuat} a quat to rotate\r\n * @param {number} rad angle (in radians) to rotate\r\n * @returns {quat} out\r\n */\n\nexport function rotateZ(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\r\n * Calculates the W component of a quat from the X, Y, and Z components.\r\n * Assumes that quaternion is 1 unit in length.\r\n * Any existing W component will be ignored.\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a quat to calculate W component of\r\n * @returns {quat} out\r\n */\n\nexport function calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\r\n * Calculate the exponential of a unit quaternion.\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a quat to calculate the exponential of\r\n * @returns {quat} out\r\n */\n\nexport function exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\r\n * Calculate the natural logarithm of a unit quaternion.\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a quat to calculate the exponential of\r\n * @returns {quat} out\r\n */\n\nexport function ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\r\n * Calculate the scalar power of a unit quaternion.\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a quat to calculate the exponential of\r\n * @param {Number} b amount to scale the quaternion by\r\n * @returns {quat} out\r\n */\n\nexport function pow(out, a, b) {\n ln(out, a);\n scale(out, out, b);\n exp(out, out);\n return out;\n}\n/**\r\n * Performs a spherical linear interpolation between two quat\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a the first operand\r\n * @param {ReadonlyQuat} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {quat} out\r\n */\n\nexport function slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > glMatrix.EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\r\n * Generates a random unit quaternion\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @returns {quat} out\r\n */\n\nexport function random(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = glMatrix.RANDOM();\n var u2 = glMatrix.RANDOM();\n var u3 = glMatrix.RANDOM();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\r\n * Calculates the inverse of a quat\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a quat to calculate inverse of\r\n * @returns {quat} out\r\n */\n\nexport function invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\r\n * Calculates the conjugate of a quat\r\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a quat to calculate conjugate of\r\n * @returns {quat} out\r\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Creates a quaternion from the given 3x3 rotation matrix.\r\n *\r\n * NOTE: The resultant quaternion is not normalized, so you should be sure\r\n * to renormalize the quaternion yourself where necessary.\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyMat3} m rotation matrix\r\n * @returns {quat} out\r\n * @function\r\n */\n\nexport function fromMat3(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\r\n * Creates a quaternion from the given euler angle x, y, z.\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {x} Angle to rotate around X axis in degrees.\r\n * @param {y} Angle to rotate around Y axis in degrees.\r\n * @param {z} Angle to rotate around Z axis in degrees.\r\n * @returns {quat} out\r\n * @function\r\n */\n\nexport function fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\r\n * Returns a string representation of a quatenion\r\n *\r\n * @param {ReadonlyQuat} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\r\n * Creates a new quat initialized with values from an existing quaternion\r\n *\r\n * @param {ReadonlyQuat} a quaternion to clone\r\n * @returns {quat} a new quaternion\r\n * @function\r\n */\n\nexport var clone = vec4.clone;\n/**\r\n * Creates a new quat initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {quat} a new quaternion\r\n * @function\r\n */\n\nexport var fromValues = vec4.fromValues;\n/**\r\n * Copy the values from one quat to another\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a the source quaternion\r\n * @returns {quat} out\r\n * @function\r\n */\n\nexport var copy = vec4.copy;\n/**\r\n * Set the components of a quat to the given values\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {quat} out\r\n * @function\r\n */\n\nexport var set = vec4.set;\n/**\r\n * Adds two quat's\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a the first operand\r\n * @param {ReadonlyQuat} b the second operand\r\n * @returns {quat} out\r\n * @function\r\n */\n\nexport var add = vec4.add;\n/**\r\n * Alias for {@link quat.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Scales a quat by a scalar number\r\n *\r\n * @param {quat} out the receiving vector\r\n * @param {ReadonlyQuat} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {quat} out\r\n * @function\r\n */\n\nexport var scale = vec4.scale;\n/**\r\n * Calculates the dot product of two quat's\r\n *\r\n * @param {ReadonlyQuat} a the first operand\r\n * @param {ReadonlyQuat} b the second operand\r\n * @returns {Number} dot product of a and b\r\n * @function\r\n */\n\nexport var dot = vec4.dot;\n/**\r\n * Performs a linear interpolation between two quat's\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a the first operand\r\n * @param {ReadonlyQuat} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {quat} out\r\n * @function\r\n */\n\nexport var lerp = vec4.lerp;\n/**\r\n * Calculates the length of a quat\r\n *\r\n * @param {ReadonlyQuat} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport var length = vec4.length;\n/**\r\n * Alias for {@link quat.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Calculates the squared length of a quat\r\n *\r\n * @param {ReadonlyQuat} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n * @function\r\n */\n\nexport var squaredLength = vec4.squaredLength;\n/**\r\n * Alias for {@link quat.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Normalize a quat\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a quaternion to normalize\r\n * @returns {quat} out\r\n * @function\r\n */\n\nexport var normalize = vec4.normalize;\n/**\r\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyQuat} a The first quaternion.\r\n * @param {ReadonlyQuat} b The second quaternion.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport var exactEquals = vec4.exactEquals;\n/**\r\n * Returns whether or not the quaternions have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyQuat} a The first vector.\r\n * @param {ReadonlyQuat} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport var equals = vec4.equals;\n/**\r\n * Sets a quaternion to represent the shortest rotation from one\r\n * vector to another.\r\n *\r\n * Both vectors are assumed to be unit length.\r\n *\r\n * @param {quat} out the receiving quaternion.\r\n * @param {ReadonlyVec3} a the initial vector\r\n * @param {ReadonlyVec3} b the destination vector\r\n * @returns {quat} out\r\n */\n\nexport var rotationTo = function () {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1, 0, 0);\n var yUnitVec3 = vec3.fromValues(0, 1, 0);\n return function (out, a, b) {\n var dot = vec3.dot(a, b);\n\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return normalize(out, out);\n }\n };\n}();\n/**\r\n * Performs a spherical linear interpolation with two control points\r\n *\r\n * @param {quat} out the receiving quaternion\r\n * @param {ReadonlyQuat} a the first operand\r\n * @param {ReadonlyQuat} b the second operand\r\n * @param {ReadonlyQuat} c the third operand\r\n * @param {ReadonlyQuat} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {quat} out\r\n */\n\nexport var sqlerp = function () {\n var temp1 = create();\n var temp2 = create();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\r\n * Sets the specified quaternion with values corresponding to the given\r\n * axes. Each axis is a vec3 and is expected to be unit length and\r\n * perpendicular to all other specified axes.\r\n *\r\n * @param {ReadonlyVec3} view the vector representing the viewing direction\r\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\r\n * @param {ReadonlyVec3} up the vector representing the local \"up\" direction\r\n * @returns {quat} out\r\n */\n\nexport var setAxes = function () {\n var matr = mat3.create();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return normalize(out, fromMat3(out, matr));\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\r\n * 3x3 Matrix\r\n * @module mat3\r\n */\n\n/**\r\n * Creates a new identity mat3\r\n *\r\n * @returns {mat3} a new 3x3 matrix\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(9);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\r\n * Copies the upper-left 3x3 values into the given mat3.\r\n *\r\n * @param {mat3} out the receiving 3x3 matrix\r\n * @param {ReadonlyMat4} a the source 4x4 matrix\r\n * @returns {mat3} out\r\n */\n\nexport function fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\r\n * Creates a new mat3 initialized with values from an existing matrix\r\n *\r\n * @param {ReadonlyMat3} a matrix to clone\r\n * @returns {mat3} a new 3x3 matrix\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\r\n * Copy the values from one mat3 to another\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the source matrix\r\n * @returns {mat3} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\r\n * Create a new mat3 with the given values\r\n *\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\r\n * @returns {mat3} A new mat3\r\n */\n\nexport function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\r\n * Set the components of a mat3 to the given values\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\r\n * @returns {mat3} out\r\n */\n\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\r\n * Set a mat3 to the identity matrix\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @returns {mat3} out\r\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\r\n * Transpose the values of a mat3\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the source matrix\r\n * @returns {mat3} out\r\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\r\n * Inverts a mat3\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the source matrix\r\n * @returns {mat3} out\r\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\r\n * Calculates the adjugate of a mat3\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the source matrix\r\n * @returns {mat3} out\r\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\r\n * Calculates the determinant of a mat3\r\n *\r\n * @param {ReadonlyMat3} a the source matrix\r\n * @returns {Number} determinant of a\r\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\r\n * Multiplies two mat3's\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the first operand\r\n * @param {ReadonlyMat3} b the second operand\r\n * @returns {mat3} out\r\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\r\n * Translate a mat3 by the given vector\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the matrix to translate\r\n * @param {ReadonlyVec2} v vector to translate by\r\n * @returns {mat3} out\r\n */\n\nexport function translate(out, a, v) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\r\n * Rotates a mat3 by the given angle\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat3} out\r\n */\n\nexport function rotate(out, a, rad) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\r\n * Scales the mat3 by the dimensions in the given vec2\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the matrix to rotate\r\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\r\n * @returns {mat3} out\r\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\r\n * Creates a matrix from a vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat3.identity(dest);\r\n * mat3.translate(dest, dest, vec);\r\n *\r\n * @param {mat3} out mat3 receiving operation result\r\n * @param {ReadonlyVec2} v Translation vector\r\n * @returns {mat3} out\r\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a given angle\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat3.identity(dest);\r\n * mat3.rotate(dest, dest, rad);\r\n *\r\n * @param {mat3} out mat3 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat3} out\r\n */\n\nexport function fromRotation(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a vector scaling\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat3.identity(dest);\r\n * mat3.scale(dest, dest, vec);\r\n *\r\n * @param {mat3} out mat3 receiving operation result\r\n * @param {ReadonlyVec2} v Scaling vector\r\n * @returns {mat3} out\r\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\r\n * Copies the values from a mat2d into a mat3\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat2d} a the matrix to copy\r\n * @returns {mat3} out\r\n **/\n\nexport function fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\r\n * Calculates a 3x3 matrix from the given quaternion\r\n *\r\n * @param {mat3} out mat3 receiving operation result\r\n * @param {ReadonlyQuat} q Quaternion to create matrix from\r\n *\r\n * @returns {mat3} out\r\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\r\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\r\n *\r\n * @param {mat3} out mat3 receiving operation result\r\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\r\n *\r\n * @returns {mat3} out\r\n */\n\nexport function normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\r\n * Generates a 2D projection matrix with the given bounds\r\n *\r\n * @param {mat3} out mat3 frustum matrix will be written into\r\n * @param {number} width Width of your gl context\r\n * @param {number} height Height of gl context\r\n * @returns {mat3} out\r\n */\n\nexport function projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\r\n * Returns a string representation of a mat3\r\n *\r\n * @param {ReadonlyMat3} a matrix to represent as a string\r\n * @returns {String} string representation of the matrix\r\n */\n\nexport function str(a) {\n return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\r\n * Returns Frobenius norm of a mat3\r\n *\r\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\r\n * @returns {Number} Frobenius norm\r\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\r\n * Adds two mat3's\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the first operand\r\n * @param {ReadonlyMat3} b the second operand\r\n * @returns {mat3} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\r\n * Subtracts matrix b from matrix a\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the first operand\r\n * @param {ReadonlyMat3} b the second operand\r\n * @returns {mat3} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\r\n * Multiply each element of the matrix by a scalar.\r\n *\r\n * @param {mat3} out the receiving matrix\r\n * @param {ReadonlyMat3} a the matrix to scale\r\n * @param {Number} b amount to scale the matrix's elements by\r\n * @returns {mat3} out\r\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\r\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\r\n *\r\n * @param {mat3} out the receiving vector\r\n * @param {ReadonlyMat3} a the first operand\r\n * @param {ReadonlyMat3} b the second operand\r\n * @param {Number} scale the amount to scale b's elements by before adding\r\n * @returns {mat3} out\r\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\r\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyMat3} a The first matrix.\r\n * @param {ReadonlyMat3} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\r\n * Returns whether or not the matrices have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyMat3} a The first matrix.\r\n * @param {ReadonlyMat3} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\r\n * Alias for {@link mat3.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link mat3.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;","import { BLACK } from \"../puzzles/colors\";\nexport function validatePuzzleOptions(options) {\n if (options.alg && typeof options.alg !== \"string\") {\n console.warn(`Inavlid alg ${options.alg}. alg must be a string`);\n options.alg = \"\";\n }\n if (options.case && typeof options.case !== \"string\") {\n console.warn(`Inavlid case ${options.case}. case must be a string`);\n options.case = \"\";\n }\n if (options.scheme) {\n if (typeof options.scheme !== \"object\" || Array.isArray(options.scheme)) {\n console.warn(`Invalid scheme ${options.scheme}. scheme must be an object`);\n options.scheme = {};\n }\n else {\n Object.keys(options.scheme).forEach((face) => {\n const faceColor = options.scheme[face];\n if (faceColor == null ||\n typeof faceColor !== \"object\" ||\n !faceColor.value) {\n console.warn(`Invalid scheme color ${faceColor}. must be an type IColor`);\n options.scheme[face] = BLACK;\n }\n });\n }\n }\n if (options.mask) {\n if (typeof options.mask !== \"object\" || Array.isArray(options.mask)) {\n console.warn(`Invalid mask ${options.mask}. scheme must be an object`);\n options.mask = {};\n }\n else {\n Object.keys(options.mask).forEach((face) => {\n const maskValues = options.mask[face];\n if (!Array.isArray(maskValues)) {\n console.warn(`Invalid mask ${maskValues}. must be an array`);\n options.mask[face] = [];\n }\n else {\n for (let i = 0; i < maskValues.length; i++) {\n if (!Number.isInteger(maskValues[i])) {\n console.warn(`Invalid mask value ${maskValues[i]}. must be a number`);\n options.mask[face] = [];\n break;\n }\n }\n }\n });\n }\n }\n if (options.stickerColors) {\n if (typeof options.stickerColors !== \"object\" ||\n Array.isArray(options.stickerColors)) {\n console.warn(`Invalid stickerColors ${options.stickerColors}. stickerColors must be an object`);\n options.stickerColors = {};\n }\n else {\n Object.keys(options.stickerColors).forEach((face) => {\n const faceColors = options.stickerColors[face];\n if (!Array.isArray(faceColors)) {\n console.warn(`Invalid colors ${faceColors}. must be an array`);\n options.stickerColors[face] = [];\n }\n else {\n for (let i = 0; i < faceColors.length; i++) {\n if (!validColor(faceColors[i])) {\n options.stickerColors[face] = [];\n break;\n }\n }\n }\n });\n }\n }\n if (options.rotations) {\n if (!Array.isArray(options.rotations)) {\n console.warn(`invalid rotations ${options.rotations}, must be an array`);\n options.rotations = [];\n }\n else {\n for (let i = 0; i < options.rotations.length; i++) {\n if (!validRotation(options.rotations[i])) {\n options.rotations = [];\n break;\n }\n }\n }\n }\n if (options.scale && !Number.isFinite(options.scale)) {\n console.warn(`invalid scale ${options.scale}, must be a finite number`);\n options.scale = 1;\n }\n if (options.translation && !validTranslation(options.translation)) {\n options.translation = { x: 0, y: 0, z: 0 };\n }\n if (options.arrows) {\n if (!Array.isArray(options.arrows)) {\n console.warn(`invalid arrows, must be an array`);\n options.arrows = [];\n }\n else {\n for (let i = 0; i < options.arrows.length; i++) {\n if (!validArrow(options.arrows[i])) {\n options.arrows = [];\n break;\n }\n }\n }\n }\n}\nexport function validColor(c) {\n if (typeof c !== \"object\") {\n console.warn(`invalid color ${c}, must be type object`);\n return false;\n }\n if (!c.value || typeof c.value !== \"string\") {\n console.warn(`invalid color value ${c.value}, must be type string`);\n return false;\n }\n if (c.stroke && typeof c.stroke !== \"string\") {\n console.warn(`invalid color stroke ${c.stroke}, must be type string`);\n return false;\n }\n return true;\n}\nfunction validRotation(r) {\n if (!r || typeof r !== \"object\") {\n console.warn(`invalid rotation ${r}, must be an object`);\n return false;\n }\n if (r.x && !Number.isFinite(r.x)) {\n console.warn(`invalid x rotation ${r.x}, must be a number`);\n return false;\n }\n if (r.y && !Number.isFinite(r.y)) {\n console.warn(`invalid y rotation ${r.y}, must be a number`);\n return false;\n }\n if (r.z && !Number.isFinite(r.z)) {\n console.warn(`invalid z rotation ${r.z}, must be a number`);\n return false;\n }\n return true;\n}\nfunction validTranslation(r) {\n if (typeof r !== \"object\" || Array.isArray(r)) {\n console.warn(`invalid translation ${r}, must be an object`);\n return false;\n }\n if (r.x && !Number.isFinite(r.x)) {\n console.warn(`invalid x translation ${r.x}, must be a number`);\n return false;\n }\n if (r.y && !Number.isFinite(r.y)) {\n console.warn(`invalid y translation ${r.y}, must be a number`);\n return false;\n }\n if (r.z && !Number.isFinite(r.z)) {\n console.warn(`invalid z translation ${r.z}, must be a number`);\n return false;\n }\n return true;\n}\nfunction validArrow(a) {\n if (typeof a !== \"object\") {\n console.warn(`invalid arrow ${a}, must be an object`);\n return false;\n }\n if (typeof a.end !== \"object\" || typeof a.start !== \"object\") {\n console.warn(`invalid arrow ${a}, must have start and end`);\n return false;\n }\n if (typeof a.start.face !== \"string\" || !Number.isInteger(a.start.sticker)) {\n console.warn(`invalid arrow start ${a.start}`);\n return false;\n }\n if (typeof a.end.face !== \"string\" || !Number.isInteger(a.end.sticker)) {\n console.warn(`invalid arrow end ${a.end}`);\n return false;\n }\n return true;\n}\n","import { WHITE, RED, BLUE, GREEN, BLACK, YELLOW, PURPLE } from \"./colors\";\nimport { DividedPentagon } from \"./../geometry/dividedPentagon\";\nimport { degreesToRadians, dodecahedronInRadius } from \"../math/utils\";\nimport { Group } from \"../geometry/group\";\nconst OPTIMAL_LAYER_WIDTH = {\n 2: 0.3,\n 3: 0.17,\n 4: 0.121,\n};\nfunction getLayerWidth(length, layers) {\n return OPTIMAL_LAYER_WIDTH[layers] || length / (layers * 1.9);\n}\nexport class MegaminxTop {\n constructor() {\n this.createFaces();\n this.removeHiddenStickers();\n }\n createFaces() {\n const layers = 2;\n const length = 0.75;\n const layerWidth = getLayerWidth(length, layers);\n const megaminxRadius = dodecahedronInRadius(length);\n this.U = new DividedPentagon(WHITE, layers, length, layerWidth);\n this.F = new DividedPentagon(RED, layers, length, layerWidth);\n this.R = new DividedPentagon(BLUE, layers, length, layerWidth);\n this.L = new DividedPentagon(GREEN, layers, length, layerWidth);\n this.BR = new DividedPentagon(YELLOW, layers, length, layerWidth);\n this.BL = new DividedPentagon(PURPLE, layers, length, layerWidth);\n this.F.translate([0, 0, megaminxRadius]);\n this.U.rotate(Math.PI, [0, 0, 1]);\n this.U.rotate(((180 - 116.57) * Math.PI) / 180, [1, 0, 0]);\n this.U.translate([0, 0, megaminxRadius]);\n this.L.rotate((72 * Math.PI) / 180, [0, 0, 1]);\n this.L.rotate(Math.PI, [0, 0, 1]);\n this.L.rotate(((180 - 116.57) * Math.PI) / 180, [1, 0, 0]);\n this.L.translate([0, 0, megaminxRadius]);\n this.R.rotate((72 * Math.PI) / 180, [0, 0, 1]);\n this.R.rotate(Math.PI / 5, [0, 0, 1]);\n this.R.rotate(((180 - 116.57) * Math.PI) / 180, [1, 0, 0]);\n this.R.translate([0, 0, megaminxRadius]);\n this.BL.rotate(Math.PI / 5, [0, 0, 1]);\n this.BL.rotate((-116.57 * Math.PI) / 180, [1, 0, 0]);\n this.BL.translate([0, 0, megaminxRadius]);\n this.BR.rotate(-Math.PI / 5, [0, 0, 1]);\n this.BR.rotate((-116.57 * Math.PI) / 180, [1, 0, 0]);\n this.BR.translate([0, 0, megaminxRadius]);\n this.faces = {\n U: this.U,\n F: this.F,\n R: this.R,\n dr: this.BR,\n dl: this.BL,\n L: this.L,\n };\n this.group = new Group([this.U, this.F, this.R, this.BR, this.BL, this.L]);\n this.group.rotate(degreesToRadians(63), [1, 0, 0]);\n }\n setColors(colors) {\n let { U, R, F, L, BR, BL } = colors;\n this.createFaces();\n // If length is larger than we expect for\n // a side of the puzzle, assume we're receiving\n // colors for the entire face of the puzzle. and\n // just take out the the colors for visible stickers\n // if (R.length > 3) {\n // R = R.slice(2, 5);\n // F = F.slice(2, 5);\n // L = L.slice(2, 5);\n // BR = BR.slice(2, 5);\n // BL = BL.slice(2, 5);\n // }\n // this.U.faces[1].color = BLACK;\n // this.R.faces[1].color = BLACK;\n // this.F.faces[1].color = BLACK;\n // this.L.faces[1].color = BLACK;\n // this.BR.faces[1].color = BLACK;\n // this.BL.faces[1].color = BLACK;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.BR, BR);\n this.setFaceColors(this.BL, BL);\n this.removeHiddenStickers();\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.faces.forEach((f, i) => {\n if (colors && colors[i]) {\n f.color = colors[i];\n }\n else {\n f.color = BLACK;\n }\n });\n }\n /**\n * hide stickers that aren't in the top layer\n * so only the top of the megaminx is shown\n */\n removeHiddenStickers() {\n this.F.faces = this.F.faces.slice(2, 5);\n this.BL.faces = this.BL.faces.slice(8, 11);\n this.L.faces = this.L.faces.slice(4, 7);\n this.R.faces = [this.R.faces[1], this.R.faces[2], this.R.faces[10]];\n this.BR.faces = this.BR.faces.slice(6, 9);\n }\n}\n","import { MegaminxTop } from \"./../puzzles/megaminxTop\";\nimport { RubiksCubeTopLayer } from \"./../puzzles/rubiksCube/rubiksCubeTop\";\nimport { Square1Net } from \"./../puzzles/square1/square1Net\";\nimport { Square1Simualtor } from \"./../simulator/square1/square1Simulator\";\nimport { Square1 } from \"./../puzzles/square1/square1\";\nimport { SkewbNet } from \"./../puzzles/skewbNet\";\nimport { SkewbSimulator } from \"./../simulator/skewb/skewbSimulator\";\nimport { Skewb } from \"./../puzzles/skewb\";\nimport { PyraminxSimulator } from \"./../simulator/pyraminx/pyraminxSimulator\";\nimport { PyraminxNet } from \"./../puzzles/pyraminxNet\";\nimport { MegaminxNet } from \"./../puzzles/megaminxNet\";\nimport { Megaminx } from \"./../puzzles/megaminx\";\nimport { MegaminxSimulator } from \"./../simulator/megaminx/megaminxSimulator\";\nimport { RubiksCubeNet } from \"./../puzzles/rubiksCube/rubiksCubeNet\";\nimport { RubiksCube } from \"../puzzles/rubiksCube/rubiksCube\";\nimport { RubiksCubeSimulator } from \"../simulator/rubiksCube/rubiksCubeSimulator\";\nimport { Pyraminx } from \"../puzzles/pyraminx\";\nexport function createCube(options = {}) {\n const geometry = new RubiksCube(options.size);\n const simulator = new RubiksCubeSimulator(options.size);\n return [geometry, simulator];\n}\nexport function createCubeNet(options = {}) {\n const geometry = new RubiksCubeNet(options.size);\n const simulator = new RubiksCubeSimulator(options.size);\n return [geometry, simulator];\n}\nexport function createCubeTop(options = {}) {\n const geometry = new RubiksCubeTopLayer(options.size);\n const simulator = new RubiksCubeSimulator(options.size);\n return [geometry, simulator];\n}\nexport function createMegaminx(options = {}) {\n const geometry = new Megaminx(options.size);\n const simulator = new MegaminxSimulator();\n return [geometry, simulator];\n}\nexport function createMegaminxNet(options = {}) {\n const geometry = new MegaminxNet(options.size);\n const simulator = new MegaminxSimulator();\n return [geometry, simulator];\n}\nexport function createMegaminxTop(options = {}) {\n const geometry = new MegaminxTop();\n const simulator = new MegaminxSimulator();\n return [geometry, simulator];\n}\nexport function createPyraminx(options = {}) {\n const geometry = new Pyraminx(options.size);\n const simulator = new PyraminxSimulator();\n return [geometry, simulator];\n}\nexport function createPyraminxNet(options = {}) {\n const geometry = new PyraminxNet(options.size);\n const simulator = new PyraminxSimulator();\n return [geometry, simulator];\n}\nexport function createSkewb(options = {}) {\n const geometry = new Skewb();\n const simulator = new SkewbSimulator();\n return [geometry, simulator];\n}\nexport function createSkewbNet(options = {}) {\n const geometry = new SkewbNet();\n const simulator = new SkewbSimulator();\n return [geometry, simulator];\n}\nexport function createSquare1(options = {}) {\n const simulator = initSquare1Simulator(options);\n const geometry = new Square1(simulator.topLayer, simulator.bottomLayer, simulator.middleRotated);\n return [geometry, simulator];\n}\nexport function createSquare1Net(options = {}) {\n const simulator = initSquare1Simulator(options);\n const geometry = new Square1Net(simulator.topLayer, simulator.bottomLayer, simulator.middleRotated);\n return [geometry, simulator];\n}\nfunction initSquare1Simulator(options) {\n const simulator = new Square1Simualtor(options.scheme);\n if (options.case) {\n simulator.case(options.case);\n }\n else if (options.alg) {\n simulator.alg(options.alg);\n }\n return simulator;\n}\n","import { Square1 } from \"./../puzzles/square1/square1\";\nimport { Geometry } from \"./../geometry/geometry\";\nimport { Arrow } from \"./../geometry/arrow\";\nimport { getDefaultOptions } from \"./options\";\nimport { mat4, quat, vec3 } from \"gl-matrix\";\nimport { MASK_COLOR } from \"./../puzzles/colors\";\nimport { VisualizerType } from \"./enum\";\nimport { validatePuzzleOptions, } from \"./interface\";\nimport { Scene } from \"../rendering/scene\";\nimport { Camera } from \"./../rendering/camera\";\nimport { createCube, createCubeNet, createCubeTop, createMegaminx, createMegaminxNet, createMegaminxTop, createPyraminx, createPyraminxNet, createSkewb, createSkewbNet, createSquare1, createSquare1Net, } from \"./puzzleCreator\";\nimport { applyTransformations } from \"../rendering/utils\";\nimport { Group } from \"../geometry/group\";\n/**\n * Applies a color scheme to simulator values\n *\n * @param faceValues face values from the simulator\n * @param scheme color scheme to\n */\nfunction applyColorScheme(faceValues, scheme) {\n return Object.keys(faceValues).reduce((colors, face) => {\n colors[face] = faceValues[face].map((value) => scheme[value] || MASK_COLOR);\n return colors;\n }, {});\n}\n/**\n * Creates puzzle geometry and and simulator for a given puzzle type.\n * Will initialize the geometry and simulator based on puzzle options\n * passed in\n *\n * @param type Type of the puzzle {@link VisualizerType} (cube, skewb, etc...)\n * @param options Puzzle options {@link PuzzleOptions}\n */\nfunction puzzleFactory(type, options) {\n switch (type) {\n case VisualizerType.CUBE:\n return createCube(options);\n case VisualizerType.CUBE_NET:\n return createCubeNet(options);\n case VisualizerType.CUBE_TOP:\n return createCubeTop(options);\n case VisualizerType.MEGAMINX:\n return createMegaminx(options);\n case VisualizerType.MEGAMINX_NET:\n return createMegaminxNet(options);\n case VisualizerType.MEGAMINX_TOP:\n return createMegaminxTop(options);\n case VisualizerType.PYRAMINX:\n return createPyraminx(options);\n case VisualizerType.PYRAMINX_NET:\n return createPyraminxNet(options);\n case VisualizerType.SKEWB:\n return createSkewb(options);\n case VisualizerType.SKEWB_NET:\n return createSkewbNet(options);\n case VisualizerType.SQUARE1:\n return createSquare1(options);\n case VisualizerType.SQUARE1_NET:\n return createSquare1Net(options);\n }\n}\nfunction isSquare1(type) {\n return type === VisualizerType.SQUARE1 || type === VisualizerType.SQUARE1_NET;\n}\nfunction isPyraminx(type) {\n return type === VisualizerType.PYRAMINX || type === VisualizerType.PYRAMINX_NET;\n}\nfunction isMegaminx(type) {\n return type === VisualizerType.MEGAMINX ||\n type === VisualizerType.MEGAMINX_NET ||\n type === VisualizerType.MEGAMINX_TOP;\n}\n/**\n * Return true if we can apply simulator colors. Currently\n * we don't simulate n-layered megaminx/pyraminx.\n */\nfunction canApplySimulatorColors(type, size) {\n if (isPyraminx(type)) {\n return size === 3;\n }\n if (isMegaminx(type)) {\n return size === 2;\n }\n return true;\n}\nfunction createArrow(a, puzzle) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n // Get the face the arrow is pointing to\n let startFace = puzzle.faces[a.start.face];\n let endFace = puzzle.faces[a.end.face];\n if (!startFace || !endFace) {\n throw new Error(`Invalid arrow definition ${JSON.stringify(a)}`);\n }\n let startTransformations = [startFace.matrix, puzzle.group.matrix];\n let endTransformations = [endFace.matrix, puzzle.group.matrix];\n let start;\n let end;\n // Get the stickers on the face\n if (startFace instanceof Geometry && endFace instanceof Geometry) {\n start = (_a = startFace.faces[a.start.sticker]) === null || _a === void 0 ? void 0 : _a.centroid;\n end = (_b = endFace.faces[a.end.sticker]) === null || _b === void 0 ? void 0 : _b.centroid;\n }\n else {\n if (puzzle instanceof Square1) {\n start = (_c = startFace.objects[a.start.sticker]) === null || _c === void 0 ? void 0 : _c.faces[0].centroid;\n end = (_d = endFace.objects[a.end.sticker]) === null || _d === void 0 ? void 0 : _d.faces[0].centroid;\n }\n else {\n start = (_e = startFace.objects[a.start.sticker]) === null || _e === void 0 ? void 0 : _e.centroid;\n end = (_f = endFace.objects[a.end.sticker]) === null || _f === void 0 ? void 0 : _f.centroid;\n }\n startTransformations.unshift((_g = startFace.objects[a.start.sticker]) === null || _g === void 0 ? void 0 : _g.matrix);\n endTransformations.unshift((_h = endFace.objects[a.end.sticker]) === null || _h === void 0 ? void 0 : _h.matrix);\n }\n if (!start || !end) {\n throw new Error(`Invalid arrow definition ${JSON.stringify(a)}`);\n }\n let p1 = applyTransformations(start, startTransformations);\n let p2 = applyTransformations(end, endTransformations);\n return new Arrow(p1, p2);\n}\n/**\n * Encapsulates logic for setting up a puzzle environment for rendering\n * images. Sets up puzzle geometry, applies any algorithm or masking\n * if necessary, and renders the puzzle\n */\nexport class Visualizer {\n constructor(renderer, type, options = {}) {\n this.type = type;\n this.camera = new Camera();\n this.scene = new Scene();\n this.renderer = renderer;\n this.setPuzzleOptions(options);\n this.render();\n }\n applyColors() {\n const hasCustomColors = this.options.stickerColors && !isSquare1(this.type);\n const canUseSimulator = canApplySimulatorColors(this.type, this.options.size);\n if (hasCustomColors) {\n this.puzzleGeometry.setColors(this.options.stickerColors);\n }\n else if (canUseSimulator) {\n this.applySimulatorColors();\n }\n else {\n // Apply scheme to puzzle geomety manually, for puzzles\n // not supported by simulators (megaminx != 2 pyraminx != 3)\n const faces = this.puzzleGeometry.faces;\n Object.keys(faces).forEach(face => {\n const stickers = faces[face];\n const faceColor = this.options.scheme[face];\n if (stickers instanceof Geometry) {\n stickers.faces.forEach(f => f.color = faceColor);\n }\n else if (stickers instanceof Group) {\n stickers.objects.forEach(o => o.color = faceColor);\n }\n });\n }\n }\n applySimulatorColors() {\n if (this.options.mask)\n this.applyMask(this.options);\n if (this.options.alg || this.options.case)\n this.applyAlgorithm();\n const faceValues = this.simulator.getValues();\n const faceColors = applyColorScheme(faceValues, this.options.scheme);\n this.puzzleGeometry.setColors(faceColors);\n }\n applyAlgorithm() {\n if (isSquare1(this.type)) {\n // puzzle factory applies algorithm to square 1 when greating the puzzle geometry\n return;\n }\n if (this.options.case) {\n this.simulator.case(this.options.case);\n }\n else if (this.options.alg) {\n this.simulator.alg(this.options.alg);\n }\n }\n applyMask(options) {\n Object.keys(options.mask).forEach((maskedFace) => {\n options.mask[maskedFace].forEach((index) => this.simulator.setValue(maskedFace, index, \"mask\"));\n });\n }\n /**\n * build the group matrix for the puzzle. This sets up the\n * rotation, scale, and translation for the resulting rendered\n * image.\n */\n buildGroupMatrix() {\n // Rotate the group matrix\n if (this.options.rotations) {\n let matrix = mat4.create();\n this.options.rotations.forEach((rotation) => {\n const { x = 0, y = 0, z = 0 } = rotation;\n mat4.mul(matrix, mat4.fromQuat(mat4.create(), quat.fromEuler(quat.create(), x, y, z)), matrix);\n });\n mat4.mul(this.puzzleGeometry.group.matrix, mat4.create(), matrix);\n }\n // Scale the group matrix\n if (this.options.scale) {\n let scale = this.options.scale;\n mat4.scale(this.puzzleGeometry.group.matrix, this.puzzleGeometry.group.matrix, vec3.fromValues(scale, scale, scale));\n }\n // Translate the group matrix\n if (this.options.translation) {\n const { x = 0, y = 0, z = 0 } = this.options.translation;\n let translationMatrix = mat4.fromTranslation(mat4.create(), vec3.fromValues(x, y, z));\n mat4.mul(this.puzzleGeometry.group.matrix, translationMatrix, this.puzzleGeometry.group.matrix);\n }\n }\n addArrows() {\n if (!this.options.arrows) {\n return;\n }\n this.options.arrows.forEach((arrow) => {\n try {\n this.scene.add(createArrow(arrow, this.puzzleGeometry));\n }\n catch (_a) {\n console.warn(`Invalid arrow ${JSON.stringify(arrow)}`);\n }\n });\n }\n setPuzzleOptions(options) {\n this.options = Object.assign(Object.assign({}, getDefaultOptions(this.type)), options);\n validatePuzzleOptions(this.options);\n [this.puzzleGeometry, this.simulator] = puzzleFactory(this.type, this.options);\n this.buildGroupMatrix();\n this.applyColors();\n this.scene.clear();\n this.scene.add(this.puzzleGeometry.group);\n this.addArrows();\n }\n render() {\n this.renderer.render(this.scene, this.camera);\n }\n}\n","import { BLACK, GREY } from \"./../puzzles/colors\";\nimport { CustomSVGRenderer } from \"./../rendering/customSvgRenderer\";\nimport { Visualizer } from \"./visualizer\";\nimport { validColor } from \"./interface\";\nconst defaultOptions = {\n width: 500,\n height: 500,\n minx: -0.9,\n miny: -0.9,\n svgWidth: 1.8,\n svgHeight: 1.8,\n strokeWidth: 0.02,\n arrowColor: GREY,\n arrowStrokeWidth: 0.03,\n};\n/**\n * Visualize puzzles with svg in a DOM\n */\nexport function SVG(element, type, options = {}) {\n return new SvgVisualizer(element, type, options);\n}\nexport class SvgVisualizer extends Visualizer {\n constructor(element, type, options = {}) {\n options = Object.assign(Object.assign({}, defaultOptions), options);\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n if (element === null) {\n throw new Error(`Could not find visuzlier element by query selector: ${element}`);\n }\n }\n const renderer = new CustomSVGRenderer(options.width, options.height, options.minx, options.miny, options.svgWidth, options.svgHeight, options.arrowColor);\n renderer.strokeWidth = \"\" + options.strokeWidth;\n element.appendChild(renderer.domElement);\n super(renderer, type, options.puzzle);\n this.svgOptions = options;\n }\n /**\n * Set the stroke width for the svg elements rendered and re draw the puzzle.\n *\n * @param strokeWidth - value to set the stroke width to. It depends on the svg options and puzzle size,\n * but good values are around .01 - .06\n */\n setStrokeWidth(strokeWidth) {\n this.svgOptions.strokeWidth = strokeWidth;\n this.renderer.strokeWidth =\n \"\" + this.svgOptions.strokeWidth;\n this.render();\n }\n /**\n * Dynamically update the svg element options\n *\n * @param options - options for the svg element that is being rendered to\n */\n setSvgOptions(options) {\n this.svgOptions = Object.assign(Object.assign({}, defaultOptions), options);\n validateSvgOptions(this.svgOptions);\n const renderer = this.renderer;\n const svgElement = renderer.svgElement;\n renderer.strokeWidth = \"\" + this.svgOptions.strokeWidth;\n renderer.arrowStrokeWidth = \"\" + this.svgOptions.arrowStrokeWidth;\n svgElement.setAttributeNS(null, \"width\", this.svgOptions.width.toString());\n svgElement.setAttributeNS(null, \"height\", this.svgOptions.width.toString());\n svgElement.setAttributeNS(null, \"viewBox\", `${this.svgOptions.minx} ${this.svgOptions.miny} ${this.svgOptions.svgWidth} ${this.svgOptions.svgHeight}`);\n this.render();\n }\n}\nfunction validateSvgOptions(options) {\n if (!Number.isInteger(options.width)) {\n console.warn(`invalid svg width ${options.width}. Must be a whole number`);\n options.width = defaultOptions.width;\n }\n if (!Number.isInteger(options.height)) {\n console.warn(`invalid svg height ${options.height}. Must be a whole number`);\n options.width = defaultOptions.height;\n }\n if (!Number.isFinite(options.minx)) {\n console.warn(`invalid svg minx ${options.minx}`);\n options.minx = defaultOptions.minx;\n }\n if (!Number.isFinite(options.miny)) {\n console.warn(`invalid svg miny ${options.miny}`);\n options.minx = defaultOptions.miny;\n }\n if (!Number.isFinite(options.svgWidth)) {\n console.warn(`invalid svgWidth ${options.svgWidth}`);\n options.minx = defaultOptions.svgWidth;\n }\n if (!Number.isFinite(options.svgHeight)) {\n console.warn(`invalid svgHeight ${options.svgHeight}`);\n options.minx = defaultOptions.svgHeight;\n }\n if (!Number.isFinite(options.strokeWidth)) {\n console.warn(`invalid strokeWidth ${options.strokeWidth}`);\n options.minx = defaultOptions.strokeWidth;\n }\n if (!Number.isFinite(options.arrowStrokeWidth)) {\n console.warn(`invalid arrowStrokeWidth ${options.arrowStrokeWidth}`);\n options.minx = defaultOptions.arrowStrokeWidth;\n }\n if (options.arrowColor && !validColor(options.arrowColor)) {\n options.arrowColor = BLACK;\n }\n}\n","import { GREY } from \"./../puzzles/colors\";\nimport { SVG } from \"./svg\";\nconst defaultOptions = {\n width: 500,\n height: 500,\n minx: -0.9,\n miny: -0.9,\n svgWidth: 1.8,\n svgHeight: 1.8,\n strokeWidth: 0.02,\n arrowColor: GREY,\n arrowStrokeWidth: 0.03,\n};\n/**\n * Creates PNG element\n */\nexport function PNG(container, type, options = {}) {\n if (typeof container === \"string\") {\n container = document.querySelector(container);\n if (container === null) {\n throw new Error(`Could not find visuzlier element by query selector: ${container}`);\n }\n }\n let element = document.createElement(\"div\");\n options = Object.assign(Object.assign({}, defaultOptions), options);\n SVG(element, type, options);\n setTimeout(() => {\n let svgElement = element.querySelector(\"svg\");\n let targetImage = document.createElement(\"img\");\n container.appendChild(targetImage);\n let canvas = document.createElement(\"canvas\");\n let ctx = canvas.getContext(\"2d\");\n let loader = new Image();\n loader.width = canvas.width = targetImage.width = options.width;\n loader.height = canvas.height = targetImage.height = options.height;\n loader.onload = function () {\n ctx.drawImage(loader, 0, 0, loader.width, loader.height);\n targetImage.src = canvas.toDataURL();\n };\n var svgAsXML = new XMLSerializer().serializeToString(svgElement);\n loader.src = `data:image/svg+xml,${encodeURIComponent(svgAsXML)}`;\n });\n}\n","export const Masks = {\n CUBE_3: {\n LAST_LAYER: {\n F: [3, 4, 5, 6, 7, 8],\n B: [3, 4, 5, 6, 7, 8],\n R: [3, 4, 5, 6, 7, 8],\n L: [3, 4, 5, 6, 7, 8],\n D: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n F2L: {\n F: [0, 1, 2],\n B: [0, 1, 2],\n R: [0, 1, 2],\n L: [0, 1, 2],\n U: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n FIRST_LAYER: {\n F: [0, 1, 2, 3, 4, 5],\n B: [0, 1, 2, 3, 4, 5],\n R: [0, 1, 2, 3, 4, 5],\n L: [0, 1, 2, 3, 4, 5],\n U: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n OLL: {\n R: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n F: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n D: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n L: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n B: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n CORNERS_LAST_LAYER: {\n U: [1, 3, 5, 7],\n F: [1, 3, 4, 5, 6, 7, 8],\n B: [1, 3, 4, 5, 6, 7, 8],\n R: [1, 3, 4, 5, 6, 7, 8],\n L: [1, 3, 4, 5, 6, 7, 8],\n D: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n EDGES_LAST_LAYER: {\n U: [0, 2, 6, 8],\n F: [0, 2, 3, 4, 5, 6, 7, 8],\n B: [0, 2, 3, 4, 5, 6, 7, 8],\n R: [0, 2, 3, 4, 5, 6, 7, 8],\n L: [0, 2, 3, 4, 5, 6, 7, 8],\n D: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n },\n MEGA_3: {\n OLL: {\n F: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n R: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n L: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n BR: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n BL: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n d: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n b: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n dl: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n dr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n bl: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n br: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n },\n },\n};\n","import { TurnType } from \"./algorithms/algorithm\";\nimport { parseCubeAlgorithm } from \"./algorithms/cube\";\nimport { Square1Simualtor } from \"./simulator/square1/square1Simulator\";\nimport { SkewbSimulator } from \"./simulator/skewb/skewbSimulator\";\nimport { PyraminxSimulator } from \"./simulator/pyraminx/pyraminxSimulator\";\nimport { MegaminxSimulator } from \"./simulator/megaminx/megaminxSimulator\";\nimport { RubiksCubeSimulator } from \"./simulator/rubiksCube/rubiksCubeSimulator\";\nimport { Square1Net } from \"./puzzles/square1/square1Net\";\nimport { Square1 } from \"./puzzles/square1/square1\";\nimport { SkewbNet } from \"./puzzles/skewbNet\";\nimport { Skewb } from \"./puzzles/skewb\";\nimport { PyraminxNet } from \"./puzzles/pyraminxNet\";\nimport { Pyraminx } from \"./puzzles/pyraminx\";\nimport { MegaminxNet } from \"./puzzles/megaminxNet\";\nimport { Megaminx } from \"./puzzles/megaminx\";\nimport { RubiksCubeTopLayer } from \"./puzzles/rubiksCube/rubiksCubeTop\";\nimport { RubiksCubeNet } from \"./puzzles/rubiksCube/rubiksCubeNet\";\nimport { RubiksCube } from \"./puzzles/rubiksCube/rubiksCube\";\nimport { CustomSVGRenderer } from \"./rendering/customSvgRenderer\";\nimport { Camera } from \"./rendering/camera\";\nimport { Scene } from \"./rendering/scene\";\nimport { parseMegaminxAlgorithm } from \"./algorithms/megaminx\";\nimport { parsePyraminxAlgorithm } from \"./algorithms/pyraminx\";\nimport { parseSkewbAlgorithm } from \"./algorithms/skewb\";\nimport { parseSquare1Algorithm } from \"./algorithms/square1\";\nimport * as Colors_1 from \"./puzzles/colors\";\nexport { Colors_1 as Colors };\nexport * from \"./visualizer\";\nexport * from \"./rendering/renderer\";\nexport const Rendering = {\n Scene,\n Camera,\n CustomSVGRenderer,\n};\nexport const PuzzleGeometry = {\n RubiksCube,\n RubiksCubeNet,\n RubiksCubeTopLayer,\n Megaminx,\n MegaminxNet,\n Pyraminx,\n PyraminxNet,\n Skewb,\n SkewbNet,\n Square1,\n Square1Net,\n};\nexport const Simulator = {\n RubiksCubeSimulator,\n MegaminxSimulator,\n PyraminxSimulator,\n SkewbSimulator,\n Square1Simualtor,\n};\nexport const Algorithm = {\n TurnType,\n parseCubeAlgorithm: parseCubeAlgorithm,\n parseMegaminxAlgorithm: parseMegaminxAlgorithm,\n parsePyraminxAlgorithm: parsePyraminxAlgorithm,\n parseSkewbAlgorithm: parseSkewbAlgorithm,\n parseSquare1Algorithm: parseSquare1Algorithm,\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tif(__webpack_module_cache__[moduleId]) {\n\t\treturn __webpack_module_cache__[moduleId].exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// module exports must be returned from runtime so entry inlining is disabled\n// startup\n// Load entry module and return exports\nreturn __webpack_require__(302);\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://puzzleGen/webpack/universalModuleDefinition","webpack://puzzleGen/./src/algorithms/algorithm.ts","webpack://puzzleGen/./src/algorithms/cube.ts","webpack://puzzleGen/./src/simulator/simulator.ts","webpack://puzzleGen/./src/puzzles/colors.ts","webpack://puzzleGen/./src/puzzles/square1/enum.ts","webpack://puzzleGen/./src/math/vector.ts","webpack://puzzleGen/./src/puzzles/square1/constants.ts","webpack://puzzleGen/./src/algorithms/square1.ts","webpack://puzzleGen/./src/simulator/square1/square1Simulator.ts","webpack://puzzleGen/./src/algorithms/skewb.ts","webpack://puzzleGen/./src/utils/arrays.ts","webpack://puzzleGen/./src/simulator/skewb/skewbSimulator.ts","webpack://puzzleGen/./src/algorithms/pyraminx.ts","webpack://puzzleGen/./src/simulator/pyraminx/pyraminxSimulator.ts","webpack://puzzleGen/./src/simulator/megaminx/constants.ts","webpack://puzzleGen/./src/algorithms/megaminx.ts","webpack://puzzleGen/./src/simulator/megaminx/megaminxSimulator.ts","webpack://puzzleGen/./src/simulator/rubiksCube/constants.ts","webpack://puzzleGen/./src/math/utils.ts","webpack://puzzleGen/./src/simulator/rubiksCube/rubiksCubeSimulator.ts","webpack://puzzleGen/./src/geometry/uid.ts","webpack://puzzleGen/./src/math/matrix.ts","webpack://puzzleGen/./src/geometry/object3d.ts","webpack://puzzleGen/./src/geometry/group.ts","webpack://puzzleGen/./src/math/constants.ts","webpack://puzzleGen/./src/puzzles/square1/interface.ts","webpack://puzzleGen/./src/geometry/face.ts","webpack://puzzleGen/./src/geometry/geometry.ts","webpack://puzzleGen/./src/puzzles/square1/square1Net.ts","webpack://puzzleGen/./src/puzzles/square1/square1.ts","webpack://puzzleGen/./src/geometry/plane.ts","webpack://puzzleGen/./src/geometry/triangle.ts","webpack://puzzleGen/./src/puzzles/skewbNet.ts","webpack://puzzleGen/./src/puzzles/skewb.ts","webpack://puzzleGen/./src/geometry/triangleLattice.ts","webpack://puzzleGen/./src/puzzles/pyraminxNet.ts","webpack://puzzleGen/./src/puzzles/pyraminx.ts","webpack://puzzleGen/./src/geometry/dividedPentagon.ts","webpack://puzzleGen/./src/puzzles/megaminxNet.ts","webpack://puzzleGen/./src/puzzles/megaminx.ts","webpack://puzzleGen/./src/geometry/grid.ts","webpack://puzzleGen/./src/puzzles/rubiksCube/rubiksCubeTop.ts","webpack://puzzleGen/./src/puzzles/rubiksCube/rubiksCubeNet.ts","webpack://puzzleGen/./src/puzzles/rubiksCube/rubiksCube.ts","webpack://puzzleGen/./src/geometry/arrow.ts","webpack://puzzleGen/./src/rendering/utils.ts","webpack://puzzleGen/./src/rendering/polygonRenderer.ts","webpack://puzzleGen/./src/svg/svg.ts","webpack://puzzleGen/./src/rendering/htmlSvgRenderer.ts","webpack://puzzleGen/./src/rendering/htmlCanvasRenderer.ts","webpack://puzzleGen/./src/rendering/camera.ts","webpack://puzzleGen/./src/rendering/scene.ts","webpack://puzzleGen/./src/visualizer/enum.ts","webpack://puzzleGen/./src/visualizer/options.ts","webpack://puzzleGen/./src/visualizer/interface.ts","webpack://puzzleGen/./src/puzzles/megaminxTop.ts","webpack://puzzleGen/./src/visualizer/puzzleCreator.ts","webpack://puzzleGen/./src/math/quaternion.ts","webpack://puzzleGen/./src/visualizer/visualizer.ts","webpack://puzzleGen/./src/visualizer/svg.ts","webpack://puzzleGen/./src/visualizer/png.ts","webpack://puzzleGen/./src/visualizer/canvas.ts","webpack://puzzleGen/./src/visualizer/mask.ts","webpack://puzzleGen/./src/index.ts","webpack://puzzleGen/webpack/bootstrap","webpack://puzzleGen/webpack/startup","webpack://puzzleGen/webpack/runtime/define property getters","webpack://puzzleGen/webpack/runtime/hasOwnProperty shorthand","webpack://puzzleGen/webpack/runtime/make namespace object"],"names":["root","factory","exports","module","define","amd","this","TurnType","TurnAbbreviation","CubeAlgorithmUnit","possibleMoves","F","U","R","L","D","B","M","E","S","X","Y","Z","cubeRotations","cubeTurnRegex","parseCubeAlgorithm","algorithm","match","turns","exec","rawSlices","rawFace","outerBlockIndicator","rawType","Clockwise","isLowerCaseMove","toLowerCase","indexOf","toUpperCase","turn","unit","getMove","turnType","getTurnType","slices","getSlices","push","Error","intValue","parseInt","CounterClockwise","Double","Simulator","stickers","Map","faces","label","has","size","toString","stickerIds","reduce","nextSticker","stickerId","set","faceId","changes","reverse","get","movingSticker","replacedSticker","cached","forEach","change","entries","entry","next","value","id","done","values","key","map","face","index","console","warn","faceStickers","alg","split","doTurn","faceName","YELLOW","RED","BLUE","WHITE","ORANGE","GREEN","PURPLE","GREY","DARK_BLUE","LIGHT_YELLOW","LIGHT_GREEN","PINK","BLACK","MASK_COLOR","YELLOW_STICKERLESS","stroke","RED_STICKERLESS","BLUE_STICKERLESS","WHITE_STICKERLESS","ORANGE_STICKERLESS","GREEN_STICKERLESS","PURPLE_STICKERLESS","GREY_STICKERLESS","DARK_BLUE_STICKERLESS","LIGHT_YELLOW_STICKERLESS","LIGHT_GREEN_STICKERLESS","PINK_STICKERLESS","PIECE_TYPE","x","y","z","m","w","origin","radians","Math","cos","sin","fromValues","Vector2","ROTATION_VECTOR","TOP_COLOR","BOTTOM_COLOR","FRONT_COLOR","LEFT_COLOR","RIGHT_COLOR","BACK_COLOR","DEFAULT_SQ1_SCHEME","top","front","bottom","left","right","back","SOLVED_TOP_PIECES","type","CORNER","colors","EDGE","SOLVED_BOTTOM_PIECES","square1TurnRegex","parseSquare1Algorithm","slice","pieceValue","Square1Simualtor","scheme","super","topLayer","solvedTop","bottomLayer","solvedBottom","middleRotated","move","rotateTop","rotateBottom","topNum","bottomNum","i","length","topSlice","splice","bottomSlice","concat","originalTurns","piece","shift","abs","pop","unshift","skewbTurnRegex","DirectionToTurnType","parseSkewbAlgorithm","rawUnit","rawDirection","fillArray","Array","fill","SkewbSimulator","addFace","addTurn","center","topLeft","topRight","bottomLeft","bottomRight","doTurns","Object","assign","pyraminxTurnRegex","parsePyraminxAlgorithm","PyraminxSimulator","r","u","l","b","MEGAMINX_FACES","megaminxTurnNotation","PochmannDirections","FaceClockwise","FaceCounter","parseMegaminxAlgorithm","rawNumber","n","MegaminxSimulator","dr","dl","d","br","BR","BL","bl","makeFaceTurnDefinitions","turnFunc","Rxx","bind","Dxx","SIMULATOR_FACE","CUBE_FACES","CUBE_AXIS","CUBE_AXIS_FACES","AXIS_ORIENTATION","AXIS_FACE_ORIENTATION","degreesToRadians","degrees","PI","polarToCartesian","radius","theta","dodecahedronInRadius","sqrt","calculateCentroid","vertices","cx","cy","cz","vertex","RubiksCubeSimulator","gridSize","faceChanges","axis","column","layerChanges","nextFaceName","nextFace","currentFace","row","stickerIndex","sticker1","axisAlignedSticker","sticker2","clockwiseSticker","oppositeSticker","counterClockwiseSticker","from","to","error","increment","current","range","layer","layers","turnFace","generateUid","Matrix4","isArray","m1","m2","m3","m4","m5","m6","m7","m8","m9","m10","m11","m12","m13","m14","m15","m16","q","a","c","x2","y2","z2","xx","yx","yy","zx","zy","zz","wx","wy","wz","s","out","matrix","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","fovy","aspect","near","far","f","tan","Infinity","nf","len","hypot","b00","b01","b02","b10","b11","b12","b20","b21","b22","t","multiply","Object3D","uid","centroid","translate","rad","rotate","scale","color","Group","objects","setObjects","object","vector","ATAN_15_DEG","atan","DEG_30_RADIANS","DEG_60_RADIANS","Square1Builder","sideLength","halfSide","halfEdgePiece","layerWidth","middleWidth","halfMiddleWidth","borderLayerWidth","outerHalfSide","outerHalfEdgePiece","pieces","buildSquare1","group","geometry","angle","corner","square1Corner","edge","square1Edge","Face","indices","filter","v","includes","Geometry","Square1Net","side1","side2","points","side","rotateZ","rotated","layerHeight","halfMiddleHeight","cornerLength","makeLayer","square1Middle","INNER_FACE_COLOR","Square1","innerCentroid","innerFaceCentroid","Plane","width","height","Triangle","verticies","SkewbNet","centerWidth","pow","cubeWidth","orange","makeStickers","green","white","red","yellow","blue","triangles","triangle","setFaceColors","Skewb","halfWidth","TriangleLattice","base","halfBase","fullHeight","triangleBase","triangleHeight","inradius","count","PyraminxNet","inDiameter","faceSpacing","lattice","ARC_COS_THIRD","acos","DEG_120_RADIANS","SQRT_24","Pyraminx","insphereRadius","DividedPentagon","outRadius","pentagonOutRadius","radiusDiff","aSquared","angleRadians","cSquared","layerWidthToRadiusDiff","layerVerticies","faceVerticies","firstLayerFace","totalPoints","currentPoint","layerPoints","downMap","downMapping","prevLayer","layerVertexNumbers","currentLayer","currentLayerPoint","f2isCorner","f1","f2","f3","f4","makeFaces","mapping","previousPoints","vertexNumbers","segmentPoints","p1","p2","segments","lineSegmentLength","lastPoint","first","last","OPTIMAL_LAYER_WIDTH","2","3","4","MegaminxNet","getLayerWidth","ind","pentagonInRadius","bottomTransforms","numStickers","array","chunkSize","newSize","ceil","_","chunkArray","Megaminx","megaminxRadius","makeGrid","halfLength","elementWidth","halfElementWidth","vOffset","makeRow","hOffset","RubiksCubeTopLayer","rotationAngle","halfCubeWidth","stickerWidth","halfStickerWidth","borderOffset","rotateBorder","g","sticker","rotateX","RubiksCubeNet","RubiksCube","Arrow","applyTransformations","transforms","clone","transformMat4","PolygonRenderer","polygons","arrows","scene","camera","renderObject3D","onBeforeRender","renderPolygons","renderArrows","onComplete","sort","p","drawPolygon","drawArrow","transformations","renderGeometry","renderArrow","screenPoint","addPolygon","objectToScreen","p1Screen","p2Screen","sorted","aToWorld","bToWorld","aCentroid","bCentroid","updatePolygonElement","polygon","strokeWidth","pointsAttribute","pointString","point","makePointsAttributeValue","colorValue","strokeValue","setAttributeNS","HtmlSvgRenderer","minx","miny","svgWidth","svgHeight","arrowColor","arrowStrokeWidth","lines","uidToPolygon","uidToLine","domElement","document","createElement","className","svgElement","createElementNS","createSVGElement","markers","defs","arrowHeadMarker","arrowHeadPolygon","appendChild","createMarkers","createPolygonElement","arrow","start","end","line","strokeColor","createArrowLineElement","HtmlCanvasRenderer","lineWidth","canvasElement","ctx","getContext","clearRect","_a","_b","lineJoin","fillStyle","strokeStyle","moveTo","convertRange","beginPath","lineTo","closePath","toX","toY","fromX","fromY","dx","dy","atan2","Camera","perspective","Scene","VisualizerType","defaultCubeOptions","rotations","defaultMegaminxOptions","defaultPyraminxOptions","defaultSkewbOptions","defaultSquare1Options","validatePuzzleOptions","options","case","keys","faceColor","mask","maskValues","Number","isInteger","stickerColors","faceColors","validColor","validRotation","isFinite","translation","validTranslation","validArrow","MegaminxTop","createFaces","removeHiddenStickers","geometryCache","CUBE","CUBE_NET","CUBE_TOP","MEGAMINX","MEGAMINX_NET","MEGAMINX_TOP","PYRAMINX","PYRAMINX_NET","SKEWB","SKEWB_NET","SQUARE1","SQUARE1_NET","getPuzzleGeometry","createCube","createCubeNet","createCubeTop","createMegaminx","createMegaminxNet","createMegaminxTop","createPyraminx","createPyraminxNet","createSkewb","createSkewbNet","simulator","initSquare1Simulator","createSquare1","createSquare1Net","Quaternion","halfToRad","sx","sy","sz","isSquare1","canApplySimulatorColors","isPyraminx","isMegaminx","Visualizer","renderer","add","initPuzzleOptions","puzzleGeometry","getPuzzleSimulator","buildGroupMatrix","applyColors","addArrows","addObject","render","hasCustomColors","canUseSimulator","setColors","applySimulatorColors","o","applyMask","applyAlgorithm","faceValues","applyColorScheme","getValues","maskedFace","setValue","rotation","rotationMatrix","fromQuaternion","fromEuler","translationMatrix","fromTranslation","puzzle","_c","_d","_e","_f","_g","_h","startFace","endFace","JSON","stringify","startTransformations","endTransformations","createArrow","e","getDefaultOptions","reset","applyOptionsToPuzzle","defaultOptions","SVG","element","SvgVisualizer","querySelector","svgOptions","validateSvgOptions","PNG","container","setTimeout","targetImage","canvas","loader","Image","onload","drawImage","src","toDataURL","svgAsXML","XMLSerializer","serializeToString","encodeURIComponent","Canvas","CanvasVisualizer","Masks","CUBE_3","LAST_LAYER","F2L","FIRST_LAYER","OLL","CORNERS_LAST_LAYER","EDGES_LAST_LAYER","MEGA_3","Rendering","PuzzleGeometry","Algorithm","__webpack_module_cache__","__webpack_require__","moduleId","__webpack_modules__","definition","defineProperty","enumerable","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag"],"mappings":"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","file":"puzzleGen.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"puzzleGen\"] = factory();\n\telse\n\t\troot[\"puzzleGen\"] = factory();\n})(this, function() {\nreturn ","export var TurnType;\n(function (TurnType) {\n TurnType[TurnType[\"Clockwise\"] = 0] = \"Clockwise\";\n TurnType[TurnType[\"CounterClockwise\"] = 1] = \"CounterClockwise\";\n TurnType[TurnType[\"Double\"] = 2] = \"Double\";\n})(TurnType || (TurnType = {}));\n","import { TurnType } from \"./algorithm\";\nvar TurnAbbreviation;\n(function (TurnAbbreviation) {\n TurnAbbreviation[\"Clockwise\"] = \"\";\n TurnAbbreviation[\"CounterClockwise\"] = \"'\";\n TurnAbbreviation[\"Double\"] = \"2\";\n})(TurnAbbreviation || (TurnAbbreviation = {}));\nexport var CubeAlgorithmUnit;\n(function (CubeAlgorithmUnit) {\n CubeAlgorithmUnit[\"F\"] = \"F\";\n CubeAlgorithmUnit[\"U\"] = \"U\";\n CubeAlgorithmUnit[\"R\"] = \"R\";\n CubeAlgorithmUnit[\"L\"] = \"L\";\n CubeAlgorithmUnit[\"D\"] = \"D\";\n CubeAlgorithmUnit[\"B\"] = \"B\";\n CubeAlgorithmUnit[\"M\"] = \"M\";\n CubeAlgorithmUnit[\"E\"] = \"E\";\n CubeAlgorithmUnit[\"S\"] = \"S\";\n CubeAlgorithmUnit[\"X\"] = \"x\";\n CubeAlgorithmUnit[\"Y\"] = \"y\";\n CubeAlgorithmUnit[\"Z\"] = \"z\";\n})(CubeAlgorithmUnit || (CubeAlgorithmUnit = {}));\nexport const possibleMoves = [\n CubeAlgorithmUnit.F,\n CubeAlgorithmUnit.U,\n CubeAlgorithmUnit.R,\n CubeAlgorithmUnit.L,\n CubeAlgorithmUnit.D,\n CubeAlgorithmUnit.B,\n CubeAlgorithmUnit.M,\n CubeAlgorithmUnit.E,\n CubeAlgorithmUnit.S,\n CubeAlgorithmUnit.X,\n CubeAlgorithmUnit.Y,\n CubeAlgorithmUnit.Z,\n];\nconst cubeRotations = [\n CubeAlgorithmUnit.X,\n CubeAlgorithmUnit.Y,\n CubeAlgorithmUnit.Z,\n];\nconst cubeTurnRegex = /([0-9]+)?([UuFfRrDdLlBbMESxyz])(w)?([2\\'])?/g;\n/**\n * Takes in an algorithm string and parses the turns from it\n * algorithm string format should be moves separated by a single space\n * (ex. \"U R2 L' x\")\n *\n * https://www.worldcubeassociation.org/regulations/#article-12-notation\n */\nexport function parseCubeAlgorithm(algorithm) {\n if (!algorithm) {\n return [];\n }\n let turns = [];\n let match;\n while ((match = cubeTurnRegex.exec(algorithm))) {\n let rawSlices = match[1];\n let rawFace = match[2];\n let outerBlockIndicator = match[3];\n let rawType = match[4] || TurnAbbreviation.Clockwise; // Default to clockwise\n let isLowerCaseMove = rawFace === rawFace.toLowerCase() &&\n cubeRotations.indexOf(rawFace) === -1;\n if (isLowerCaseMove) {\n rawFace = rawFace.toUpperCase();\n }\n let turn = {\n unit: getMove(rawFace),\n turnType: getTurnType(rawType),\n slices: isLowerCaseMove ? 2 : getSlices(rawSlices, outerBlockIndicator),\n };\n turns.push(turn);\n }\n return turns;\n}\nfunction getSlices(rawSlices, outerBlockIndicator) {\n if (outerBlockIndicator && !rawSlices) {\n return 2;\n }\n else if (!outerBlockIndicator && rawSlices) {\n throw new Error(`Invalid move: Cannot specify num slices if outer block move indicator 'w' is not present`);\n }\n else if (!outerBlockIndicator && !rawSlices) {\n return 1;\n }\n else {\n const intValue = parseInt(rawSlices);\n if (intValue > 1) {\n return intValue;\n }\n throw new Error(`Invalid outer block move (${intValue}) must be greater than 1`);\n }\n}\nfunction getMove(rawFace) {\n if (possibleMoves.indexOf(rawFace) < 0) {\n throw new Error(`Invalid move (${rawFace}): Possible turn faces are [U R F L D B M E S x y z]`);\n }\n else\n return rawFace;\n}\nfunction getTurnType(rawType) {\n switch (rawType) {\n case TurnAbbreviation.Clockwise:\n return TurnType.Clockwise;\n case TurnAbbreviation.CounterClockwise:\n return TurnType.CounterClockwise;\n case TurnAbbreviation.Double:\n return TurnType.Double;\n default:\n throw new Error(`Invalid move modifier (${rawType})`);\n }\n}\n","/**\n * Class for simulating turns on symmetric twisty puzzles. This is acheived by\n * defining a set of faces with stickers, and a set of turns.\n *\n * @see {@link SkewbSimulator}\n *\n * @example\n * ```typescript\n * // extend class to create a coin simulator\n * export class CoinSimulator extends Simulator {\n * constructor() {\n * super()\n *\n * // Add a head face with one \"heads\" sticker\n * // Label this face \"top\"\n * const { stickerIds: top } = this.addFace(['heads'], 'top');\n *\n * // Add a tail face with one \"tails\" sticker\n * // Label this face \"bottom\"\n * const { stickerIds: bottom } = this.addface(['tails'], 'bottom');\n *\n * // Define a turn by providing the\n * // sticker id for the top and bottom stickers.\n * // Label this \"turnOver\"\n * this.addTurn([top[0], bottom[0]], \"turnOver\");\n * }\n *\n * // Flip the coin over\n * turnOver() {\n * // Execute the \"turnOver\" turn we created\n * this.doTurn(\"turnOver\")\n * }\n *\n * }\n * ```\n */\nexport class Simulator {\n constructor() {\n this.stickers = new Map();\n this.faces = new Map();\n this.turns = new Map();\n }\n /**\n * Adds a face of stickers to the puzzle.\n *\n * @param stickers - array of sticker values\n * @param label - label to reference the face by\n * @returns object with the faceId and list of sticker ids.\n * faceId will be label if that is present. Otherwise it\n * will be generated.\n * @example\n * ```\n * const stickers = ['red', 'red', 'red', 'red'];\n *\n * // Add the F face\n * addFace(stickers, 'F')\n * ```\n */\n addFace(stickers, label) {\n if (label && this.faces.has(label)) {\n throw `Face ${label} already exists`;\n }\n else if (!label) {\n label = (this.faces.size + 1).toString();\n }\n // Add Stickers\n const stickerIds = stickers.reduce((stickerIds, nextSticker) => {\n const stickerId = (this.stickers.size + 1).toString();\n this.stickers.set(stickerId, nextSticker);\n stickerIds.push(stickerId);\n return stickerIds;\n }, []);\n // Add Face\n this.faces.set(label, stickerIds);\n return {\n faceId: label,\n stickerIds,\n };\n }\n /**\n * Creates a turn definition that tells the simulator\n * what sticker values to change when turning.\n *\n * A change is an array with two sticker ids (ex. ['sticker1', 'sticker2'])\n * this means that when turning 'sticker1' will go to 'sticker2'.\n * Or when doing a reverse turn, `sticker2' will go to 'sticker1'\n *\n * @param changes - list of turn definitions.\n * @param label - label to reference the turn by\n * @returns label of the turn that was created\n */\n addTurn(changes, label) {\n if (label && this.turns.has(label)) {\n throw `Turn ${label} already exists`;\n }\n else if (!label) {\n label = (this.turns.size + 1).toString();\n }\n this.turns.set(label, changes);\n return label;\n }\n /**\n * Executes a turn on the puzzle\n *\n * @param label - label of the turn to execute\n * @param prime - true to do the turn in reverse\n */\n doTurn(label, reverse = false) {\n const changes = this.turns.get(label);\n if (!changes) {\n throw `Unknown turn ${label}`;\n }\n let movingSticker = reverse ? 1 : 0;\n let replacedSticker = reverse ? 0 : 1;\n let cached = {};\n changes.forEach((change) => {\n // Cache value we're replacing\n cached[change[replacedSticker]] = this.stickers.get(change[replacedSticker]);\n // Update sticker with new value\n this.stickers.set(change[replacedSticker], cached[change[movingSticker]] ||\n this.stickers.get(change[movingSticker]));\n });\n }\n /**\n * checks that every sticker on every face\n * is the same value\n */\n isSolved() {\n const faces = this.faces.entries();\n let entry = faces.next();\n do {\n const stickerIds = entry.value[1];\n let value = this.stickers.get(stickerIds[0]);\n for (let id of stickerIds) {\n if (value != this.stickers.get(id))\n return false;\n }\n entry = faces.next();\n } while (!entry.done);\n return true;\n }\n getValues() {\n let values = {};\n this.faces.forEach((stickerIds, key) => {\n values[key] = stickerIds.map((id) => this.stickers.get(id));\n });\n return values;\n }\n /**\n * override value of sticker on a face\n *\n * @param face - label\n * @param index - index of sticker to set value of\n * @param value - value to set the sticker to\n */\n setValue(face, index, value) {\n if (!this.faces.has(face)) {\n console.warn(`attempting to set sticker value on invalid face: ${face}`);\n return;\n }\n let faceStickers = this.faces.get(face);\n let stickerId = faceStickers[index];\n if (!faceStickers) {\n console.warn(`attempting to set sticker value for invalid sticker: ${face} ${index}`);\n return;\n }\n this.stickers.set(stickerId, value);\n }\n /**\n * parse and execute a sequence of moves\n *\n * @example\n * ```typescript\n * // assuming U, R, and F are turn labels\n * simulator.alg(\"U R F\")\n * ```\n *\n * @param alg - algorithm\n */\n alg(alg) {\n // Default implementation\n if (!alg) {\n return;\n }\n alg.split(\" \").forEach((turn) => this.doTurn(turn));\n }\n /**\n * reverses an algorithm then executes it\n */\n case(alg) {\n // No default implementation\n }\n /**\n * resets stickers back to solved position. Uses face name\n * as sticker value by default\n */\n reset() {\n this.faces.forEach((stickerIds, faceName) => {\n stickerIds.forEach((stickerId) => {\n this.stickers.set(stickerId, faceName);\n });\n });\n }\n}\n","// Standard Cube Colors\nexport const YELLOW = { value: \"#FFFF00\" };\nexport const RED = { value: \"#FF0000\" };\nexport const BLUE = { value: \"#0000FF\" };\nexport const WHITE = { value: \"#FFFFFF\" };\nexport const ORANGE = { value: \"#FFA500\" };\nexport const GREEN = { value: \"#00FF00\" };\n// Extra colors for megaminx\nexport const PURPLE = { value: \"#800080\" };\nexport const GREY = { value: \"#808080\" };\nexport const DARK_BLUE = { value: \"#00008B\" };\nexport const LIGHT_YELLOW = { value: \"#ffffb3\" };\nexport const LIGHT_GREEN = { value: \"#32CD32\" };\nexport const PINK = { value: \"#FF69B4\" };\nexport const BLACK = { value: \"#000000\" };\nexport const MASK_COLOR = { value: \"#404040\" };\n// Stickerless\nexport const YELLOW_STICKERLESS = {\n value: \"#FFFF00\",\n stroke: \"#DDDD00\",\n};\nexport const RED_STICKERLESS = { value: \"#FF0000\", stroke: \"#DD0000\" };\nexport const BLUE_STICKERLESS = { value: \"#0000FF\", stroke: \"#0000DD\" };\nexport const WHITE_STICKERLESS = { value: \"#FFFFFF\", stroke: \"#DDD\" };\nexport const ORANGE_STICKERLESS = {\n value: \"#FFA500\",\n stroke: \"#DD8500\",\n};\nexport const GREEN_STICKERLESS = {\n value: \"#00FF00\",\n stroke: \"#00DD00\",\n};\nexport const PURPLE_STICKERLESS = {\n value: \"#800080\",\n stroke: \"#5c005c\",\n};\nexport const GREY_STICKERLESS = { value: \"#808080\", stroke: \"#6b6b6b\" };\nexport const DARK_BLUE_STICKERLESS = {\n value: \"#00008B\",\n stroke: \"#000075\",\n};\nexport const LIGHT_YELLOW_STICKERLESS = {\n value: \"#ffffb3\",\n stroke: \"#e6e6a3\",\n};\nexport const LIGHT_GREEN_STICKERLESS = {\n value: \"#32CD32\",\n stroke: \"#2db32d\",\n};\nexport const PINK_STICKERLESS = { value: \"#FF69B4\", stroke: \"#de5b9c\" };\n","export var PIECE_TYPE;\n(function (PIECE_TYPE) {\n PIECE_TYPE[PIECE_TYPE[\"CORNER\"] = 0] = \"CORNER\";\n PIECE_TYPE[PIECE_TYPE[\"EDGE\"] = 1] = \"EDGE\";\n PIECE_TYPE[PIECE_TYPE[\"MIDDLE\"] = 2] = \"MIDDLE\";\n})(PIECE_TYPE || (PIECE_TYPE = {}));\n","export class Vector3 {\n constructor(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n static fromValues(x, y, z) {\n return new Vector3(x, y, z);\n }\n transformMat4(m) {\n let w = m.values[3] * this.x +\n m.values[7] * this.y +\n m.values[11] * this.z +\n m.values[15];\n w = w || 1.0;\n const x = (m.values[0] * this.x +\n m.values[4] * this.y +\n m.values[8] * this.z +\n m.values[12]) /\n w;\n const y = (m.values[1] * this.x +\n m.values[5] * this.y +\n m.values[9] * this.z +\n m.values[13]) /\n w;\n const z = (m.values[2] * this.x +\n m.values[6] * this.y +\n m.values[10] * this.z +\n m.values[14]) /\n w;\n this.x = x;\n this.y = y;\n this.z = z;\n }\n multiply(x, y, z) {\n this.x = this.x * x;\n this.y = this.y * y;\n this.z = this.z * z;\n }\n rotateX(origin, radians) {\n // translate point to origin\n let x = this.x - origin.x;\n let y = this.y - origin.y;\n let z = this.z - origin.z;\n // rotate\n this.x = x;\n this.y = y * Math.cos(radians) - z * Math.sin(radians);\n this.z = y * Math.sin(radians) + z * Math.cos(radians);\n // translate back\n this.x += origin.x;\n this.y += origin.y;\n this.z += origin.z;\n return this;\n }\n rotateZ(origin, radians) {\n // translate point to origin\n let x = this.x - origin.x;\n let y = this.y - origin.y;\n let z = this.z - origin.z;\n // rotate\n this.x = x * Math.cos(radians) - y * Math.sin(radians);\n this.y = x * Math.sin(radians) + y * Math.cos(radians);\n this.z = z;\n // translate back\n this.x += origin.x;\n this.y += origin.y;\n this.z += origin.z;\n return this;\n }\n clone() {\n return Vector3.fromValues(this.x, this.y, this.z);\n }\n}\nexport class Vector2 {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n static fromValues(x, y) {\n return new Vector2(x, y);\n }\n}\n","import { WHITE, RED, BLUE, GREEN, ORANGE, YELLOW } from \"./../colors\";\nimport { PIECE_TYPE } from \"./enum\";\nimport { Vector3 } from \"../../math/vector\";\nexport const ROTATION_VECTOR = Vector3.fromValues(0.92875, -0.24803, 0);\nexport const TOP_COLOR = YELLOW;\nexport const BOTTOM_COLOR = WHITE;\nexport const FRONT_COLOR = RED;\nexport const LEFT_COLOR = BLUE;\nexport const RIGHT_COLOR = GREEN;\nexport const BACK_COLOR = ORANGE;\nexport const DEFAULT_SQ1_SCHEME = {\n top: TOP_COLOR,\n front: FRONT_COLOR,\n bottom: BOTTOM_COLOR,\n left: LEFT_COLOR,\n right: RIGHT_COLOR,\n back: BACK_COLOR,\n};\nexport const SOLVED_TOP_PIECES = [\n { type: PIECE_TYPE.CORNER, colors: [TOP_COLOR, FRONT_COLOR, LEFT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [TOP_COLOR, LEFT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [TOP_COLOR, LEFT_COLOR, BACK_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [TOP_COLOR, BACK_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [TOP_COLOR, BACK_COLOR, RIGHT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [TOP_COLOR, RIGHT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [TOP_COLOR, RIGHT_COLOR, FRONT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [TOP_COLOR, FRONT_COLOR] },\n];\nexport const SOLVED_BOTTOM_PIECES = [\n { type: PIECE_TYPE.EDGE, colors: [BOTTOM_COLOR, BACK_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [BOTTOM_COLOR, BACK_COLOR, LEFT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [BOTTOM_COLOR, LEFT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [BOTTOM_COLOR, LEFT_COLOR, FRONT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [BOTTOM_COLOR, FRONT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [BOTTOM_COLOR, FRONT_COLOR, RIGHT_COLOR] },\n { type: PIECE_TYPE.EDGE, colors: [BOTTOM_COLOR, RIGHT_COLOR] },\n { type: PIECE_TYPE.CORNER, colors: [BOTTOM_COLOR, RIGHT_COLOR, BACK_COLOR] },\n];\n","const square1TurnRegex = /((\\()?(-?\\d)\\s*,\\s*(-?\\d)(\\))?)|(\\/)/g;\nexport function parseSquare1Algorithm(algorithm) {\n let turns = [];\n let match;\n while ((match = square1TurnRegex.exec(algorithm))) {\n if (match[0] === \"/\") {\n turns.push({ slice: true });\n }\n else {\n turns.push({\n top: parseInt(match[3]),\n bottom: parseInt(match[4]),\n });\n }\n }\n return turns;\n}\n","import { Simulator } from \"./../simulator\";\nimport { BACK_COLOR, BOTTOM_COLOR, DEFAULT_SQ1_SCHEME, FRONT_COLOR, LEFT_COLOR, RIGHT_COLOR, TOP_COLOR, } from \"./../../puzzles/square1/constants\";\nimport { PIECE_TYPE } from \"../../puzzles/square1/enum\";\nimport { parseSquare1Algorithm } from \"../../algorithms/square1\";\nconst pieceValue = {\n [PIECE_TYPE.CORNER]: 2,\n [PIECE_TYPE.EDGE]: 1,\n};\nexport class Square1Simualtor extends Simulator {\n constructor(scheme = DEFAULT_SQ1_SCHEME) {\n super();\n this.scheme = scheme;\n this.topLayer = solvedTop(this.scheme);\n this.bottomLayer = solvedBottom(this.scheme);\n this.middleRotated = false;\n }\n alg(alg) {\n parseSquare1Algorithm(alg).forEach((move) => {\n if (\"slice\" in move) {\n this.slice();\n }\n else {\n this.rotateTop(move.top);\n this.rotateBottom(move.bottom);\n }\n });\n }\n case(alg) {\n parseSquare1Algorithm(alg)\n .reverse()\n .forEach((move) => {\n if (\"slice\" in move) {\n this.slice();\n }\n else {\n this.rotateTop(move.top * -1);\n this.rotateBottom(move.bottom * -1);\n }\n });\n }\n slice() {\n let topNum = 0;\n let bottomNum = 0;\n let value = 0;\n for (let i = this.topLayer.length; i > 0 && value < 6; i--) {\n value += pieceValue[this.topLayer[i - 1].type];\n topNum++;\n }\n if (value != 6) {\n throw \"Cannot perform slice move. Top layer misaligned\";\n }\n value = 0;\n for (let i = this.bottomLayer.length; i > 0 && value < 6; i--) {\n value += pieceValue[this.bottomLayer[i - 1].type];\n bottomNum++;\n }\n if (value != 6) {\n throw \"Cannot perform slice move. Bottom layer misaligned\";\n }\n const topSlice = this.topLayer.splice(this.topLayer.length - topNum, this.topLayer.length);\n const bottomSlice = this.bottomLayer.splice(this.bottomLayer.length - bottomNum, this.bottomLayer.length);\n this.topLayer = this.topLayer.concat(bottomSlice);\n this.bottomLayer = this.bottomLayer.concat(topSlice);\n this.middleRotated = !this.middleRotated;\n }\n rotateTop(turns) {\n const originalTurns = turns;\n while (turns != 0) {\n if (turns < 0) {\n const piece = this.topLayer.shift();\n const value = pieceValue[piece.type];\n if (Math.abs(turns) < value) {\n throw `Invalid Square1 Move. Cannot turn top layer ${originalTurns} steps`;\n }\n this.topLayer.push(piece);\n turns += value;\n }\n else {\n const piece = this.topLayer.pop();\n const value = pieceValue[piece.type];\n if (Math.abs(turns) < value) {\n throw `Invalid Square1 Move. Cannot turn top layer ${originalTurns} steps`;\n }\n this.topLayer.unshift(piece);\n turns -= value;\n }\n }\n }\n rotateBottom(turns) {\n const originalTurns = turns;\n while (turns != 0) {\n if (turns < 0) {\n const piece = this.bottomLayer.shift();\n const value = pieceValue[piece.type];\n if (Math.abs(turns) < value) {\n throw `Invalid Square1 Move. Cannot turn top layer ${originalTurns} steps`;\n }\n this.bottomLayer.push(piece);\n turns += value;\n }\n else {\n const piece = this.bottomLayer.pop();\n const value = pieceValue[piece.type];\n if (Math.abs(turns) < value) {\n throw `Invalid Square1 Move. Cannot turn top layer ${originalTurns} steps`;\n }\n this.bottomLayer.unshift(piece);\n turns -= value;\n }\n }\n }\n}\nfunction solvedTop(scheme) {\n return [\n {\n type: PIECE_TYPE.CORNER,\n colors: [\n scheme.top || TOP_COLOR,\n scheme.front || FRONT_COLOR,\n scheme.left || LEFT_COLOR,\n ],\n },\n {\n type: PIECE_TYPE.EDGE,\n colors: [scheme.top || TOP_COLOR, scheme.left || LEFT_COLOR],\n },\n {\n type: PIECE_TYPE.CORNER,\n colors: [\n scheme.top || TOP_COLOR,\n scheme.left || LEFT_COLOR,\n scheme.back || BACK_COLOR,\n ],\n },\n {\n type: PIECE_TYPE.EDGE,\n colors: [scheme.top || TOP_COLOR, scheme.back || BACK_COLOR],\n },\n {\n type: PIECE_TYPE.CORNER,\n colors: [\n scheme.top || TOP_COLOR,\n scheme.back || BACK_COLOR,\n scheme.right || RIGHT_COLOR,\n ],\n },\n {\n type: PIECE_TYPE.EDGE,\n colors: [scheme.top || TOP_COLOR, scheme.right || RIGHT_COLOR],\n },\n {\n type: PIECE_TYPE.CORNER,\n colors: [\n scheme.top || TOP_COLOR,\n scheme.right || RIGHT_COLOR,\n scheme.front || FRONT_COLOR,\n ],\n },\n {\n type: PIECE_TYPE.EDGE,\n colors: [scheme.top || TOP_COLOR, scheme.front || FRONT_COLOR],\n },\n ];\n}\nfunction solvedBottom(scheme) {\n return [\n {\n type: PIECE_TYPE.EDGE,\n colors: [scheme.bottom || BOTTOM_COLOR, scheme.back || BACK_COLOR],\n },\n {\n type: PIECE_TYPE.CORNER,\n colors: [\n scheme.bottom || BOTTOM_COLOR,\n scheme.back || BACK_COLOR,\n scheme.left || LEFT_COLOR,\n ],\n },\n {\n type: PIECE_TYPE.EDGE,\n colors: [scheme.bottom || BOTTOM_COLOR, scheme.left || LEFT_COLOR],\n },\n {\n type: PIECE_TYPE.CORNER,\n colors: [\n scheme.bottom || BOTTOM_COLOR,\n scheme.left || LEFT_COLOR,\n scheme.front || FRONT_COLOR,\n ],\n },\n {\n type: PIECE_TYPE.EDGE,\n colors: [scheme.bottom || BOTTOM_COLOR, scheme.front || FRONT_COLOR],\n },\n {\n type: PIECE_TYPE.CORNER,\n colors: [\n scheme.bottom || BOTTOM_COLOR,\n scheme.front || FRONT_COLOR,\n scheme.right || RIGHT_COLOR,\n ],\n },\n {\n type: PIECE_TYPE.EDGE,\n colors: [scheme.bottom || BOTTOM_COLOR, scheme.right || RIGHT_COLOR],\n },\n {\n type: PIECE_TYPE.CORNER,\n colors: [\n scheme.bottom || BOTTOM_COLOR,\n scheme.right || RIGHT_COLOR,\n scheme.back || BACK_COLOR,\n ],\n },\n ];\n}\n","import { TurnType } from \"./algorithm\";\nconst skewbTurnRegex = /([LRUB])(\\'?)/g;\nconst DirectionToTurnType = {\n \"\": TurnType.Clockwise,\n \"'\": TurnType.CounterClockwise,\n};\nexport function parseSkewbAlgorithm(algorithm) {\n let turns = [];\n let match;\n while ((match = skewbTurnRegex.exec(algorithm))) {\n const rawUnit = match[1];\n const rawDirection = match[2];\n turns.push({\n unit: rawUnit,\n turnType: DirectionToTurnType[rawDirection],\n slices: 1,\n });\n }\n return turns;\n}\n","/**\n * Splits an array into chunks\n *\n * @param array original array\n * @param chunkSize\n *\n * @example\n * ```\n * chunkArray([1,2,3,4,5,6], 2)\n * // returns [[1,2], [3,4], [5,6]]\n * ```\n */\nexport function chunkArray(array, chunkSize) {\n const newSize = Math.ceil(array.length / chunkSize);\n return new Array(newSize)\n .fill(null)\n .map((_, index) => array.slice(index * chunkSize, (index + 1) * chunkSize));\n}\n/**\n * Generates an array of set size filled with a specific value\n *\n * @param length length of the array\n * @param value value to fill the array with\n */\nexport function fillArray(length, value) {\n return new Array(length).fill(value);\n}\n","import { TurnType } from \"../../algorithms/algorithm\";\nimport { parseSkewbAlgorithm } from \"../../algorithms/skewb\";\nimport { fillArray } from \"../../utils/arrays\";\nimport { Simulator } from \"./../simulator\";\n/**\n * Simulates a standard skewb\n *\n * Imagine the faces like this\n * ```\n * U\n * L F R B\n * D\n * ```\n *\n * each face has 5 sickers (1 center, 4 corners), stored as\n * an array. Each index of the array maps to stickers like\n * so, 0 being the center, 1-4 being the corners from top left\n * to bottom right\n * ```\n * 1 2\n * 0\n * 3 4\n * ```\n *\n * So all together the simulator stores information like\n * this\n * ```\n * U1 U2\n * U0\n * U3 U4\n * L1 L2 F1 F2 R1 R2 B1 B2\n * L0 F0 R0 B0\n * L3 L4 F3 F4 F3 F4 B3 B4\n * D1 D2\n * D0\n * D3 D4\n * ```\n */\nexport class SkewbSimulator extends Simulator {\n constructor() {\n super();\n const { stickerIds: top } = this.addFace(fillArray(5, \"top\"), \"top\");\n const { stickerIds: front } = this.addFace(fillArray(5, \"front\"), \"front\");\n const { stickerIds: right } = this.addFace(fillArray(5, \"right\"), \"right\");\n const { stickerIds: bottom } = this.addFace(fillArray(5, \"bottom\"), \"bottom\");\n const { stickerIds: back } = this.addFace(fillArray(5, \"back\"), \"back\");\n const { stickerIds: left } = this.addFace(fillArray(5, \"left\"), \"left\");\n // Skewb Notation https://www.worldcubeassociation.org/regulations/#12h\n this.addTurn([\n [right[0], back[0]],\n [right[2], back[4]],\n [right[3], back[1]],\n [right[4], back[3]],\n [back[0], bottom[0]],\n [back[4], bottom[2]],\n [back[1], bottom[3]],\n [back[3], bottom[4]],\n [bottom[0], right[0]],\n [bottom[2], right[2]],\n [bottom[3], right[3]],\n [bottom[4], right[4]],\n [front[4], top[2]],\n [top[2], left[3]],\n [left[3], front[4]],\n ], \"R\");\n this.addTurn([\n [center(top), center(left)],\n [topLeft(top), topLeft(left)],\n [topRight(top), topRight(left)],\n [bottomLeft(top), bottomLeft(left)],\n [center(left), center(back)],\n [topLeft(left), topRight(back)],\n [topRight(left), bottomRight(back)],\n [bottomLeft(left), topLeft(back)],\n [center(back), center(top)],\n [topRight(back), topLeft(top)],\n [bottomRight(back), topRight(top)],\n [topLeft(back), bottomLeft(top)],\n [topRight(right), topLeft(front)],\n [topLeft(front), bottomLeft(bottom)],\n [bottomLeft(bottom), topRight(right)],\n ], \"U\");\n this.addTurn([\n [center(left), center(front)],\n [bottomLeft(left), topLeft(front)],\n [topRight(left), bottomRight(front)],\n [bottomRight(left), bottomLeft(front)],\n [center(front), center(bottom)],\n [topLeft(front), topRight(bottom)],\n [bottomRight(front), bottomLeft(bottom)],\n [bottomLeft(front), topLeft(bottom)],\n [center(bottom), center(left)],\n [topRight(bottom), bottomLeft(left)],\n [bottomLeft(bottom), topRight(left)],\n [topLeft(bottom), bottomRight(left)],\n [bottomRight(back), bottomLeft(top)],\n [bottomLeft(top), bottomLeft(right)],\n [bottomLeft(right), bottomRight(back)],\n ], \"L\");\n this.addTurn([\n [center(back), center(left)],\n [topRight(back), bottomRight(left)],\n [bottomLeft(back), topLeft(left)],\n [bottomRight(back), bottomLeft(left)],\n [center(left), center(bottom)],\n [bottomRight(left), bottomRight(bottom)],\n [topLeft(left), topLeft(bottom)],\n [bottomLeft(left), bottomLeft(bottom)],\n [center(bottom), center(back)],\n [bottomRight(bottom), topRight(back)],\n [topLeft(bottom), bottomLeft(back)],\n [bottomLeft(bottom), bottomRight(back)],\n [topLeft(top), bottomLeft(front)],\n [bottomLeft(front), bottomRight(right)],\n [bottomRight(right), topLeft(top)],\n ], \"B\");\n }\n R(reverse) {\n this.doTurn(\"R\", reverse);\n }\n U(reverse) {\n this.doTurn(\"U\", reverse);\n }\n L(reverse) {\n this.doTurn(\"L\", reverse);\n }\n B(reverse) {\n this.doTurn(\"B\", reverse);\n }\n alg(alg) {\n if (!alg) {\n return;\n }\n this.doTurns(parseSkewbAlgorithm(alg));\n }\n case(alg) {\n if (!alg) {\n return;\n }\n let turns = parseSkewbAlgorithm(alg)\n .reverse()\n .map((turn) => (Object.assign(Object.assign({}, turn), { turnType: turn.turnType === TurnType.Clockwise\n ? TurnType.CounterClockwise\n : TurnType.Clockwise })));\n this.doTurns(turns);\n }\n doTurns(turns) {\n turns.forEach((turn) => {\n let reverse = turn.turnType === TurnType.CounterClockwise;\n switch (turn.unit) {\n case \"R\":\n this.R(reverse);\n break;\n case \"U\":\n this.U(reverse);\n break;\n case \"L\":\n this.L(reverse);\n break;\n case \"B\":\n this.B(reverse);\n break;\n }\n });\n }\n}\nconst center = (face) => face[0];\nconst topLeft = (face) => face[1];\nconst topRight = (face) => face[2];\nconst bottomLeft = (face) => face[3];\nconst bottomRight = (face) => face[4];\n","import { TurnType } from \"./algorithm\";\nconst pyraminxTurnRegex = /([LlRrUuBb])(\\'?)/g;\nconst DirectionToTurnType = {\n \"\": TurnType.Clockwise,\n \"'\": TurnType.CounterClockwise,\n};\nexport function parsePyraminxAlgorithm(algorithm) {\n let turns = [];\n let match;\n while ((match = pyraminxTurnRegex.exec(algorithm))) {\n const rawUnit = match[1];\n const rawDirection = match[2];\n turns.push({\n unit: rawUnit,\n turnType: DirectionToTurnType[rawDirection],\n slices: 1,\n });\n }\n return turns;\n}\n","import { TurnType } from \"../../algorithms/algorithm\";\nimport { parsePyraminxAlgorithm } from \"../../algorithms/pyraminx\";\nimport { fillArray } from \"../../utils/arrays\";\nimport { Simulator } from \"./../simulator\";\nexport class PyraminxSimulator extends Simulator {\n constructor() {\n super();\n const { stickerIds: U } = this.addFace(fillArray(9, \"top\"), \"top\");\n const { stickerIds: L } = this.addFace(fillArray(9, \"left\"), \"left\");\n const { stickerIds: R } = this.addFace(fillArray(9, \"right\"), \"right\");\n const { stickerIds: B } = this.addFace(fillArray(9, \"back\"), \"back\");\n // Tip turns\n this.addTurn([\n [U[8], R[8]],\n [R[8], L[8]],\n [L[8], U[8]],\n ], \"u\");\n this.addTurn([\n [L[0], B[8]],\n [B[8], U[4]],\n [U[4], L[0]],\n ], \"l\");\n this.addTurn([\n [L[4], R[0]],\n [R[0], B[4]],\n [B[4], L[4]],\n ], \"r\");\n this.addTurn([\n [R[4], U[0]],\n [U[0], B[0]],\n [B[0], R[4]],\n ], \"b\");\n // Full turns\n this.addTurn([\n [U[5], R[5]],\n [U[6], R[6]],\n [U[7], R[7]],\n [U[8], R[8]],\n [R[5], L[5]],\n [R[6], L[6]],\n [R[7], L[7]],\n [R[8], L[8]],\n [L[5], U[5]],\n [L[6], U[6]],\n [L[7], U[7]],\n [L[8], U[8]],\n ], \"U\");\n this.addTurn([\n [L[0], B[8]],\n [L[1], B[6]],\n [L[2], B[5]],\n [L[5], B[7]],\n [B[8], U[4]],\n [B[6], U[3]],\n [B[5], U[7]],\n [B[7], U[2]],\n [U[4], L[0]],\n [U[3], L[1]],\n [U[7], L[2]],\n [U[2], L[5]],\n ], \"L\");\n this.addTurn([\n [L[2], R[5]],\n [L[3], R[1]],\n [L[4], R[0]],\n [L[7], R[2]],\n [R[5], B[2]],\n [R[1], B[3]],\n [R[0], B[4]],\n [R[2], B[7]],\n [B[2], L[2]],\n [B[3], L[3]],\n [B[4], L[4]],\n [B[7], L[7]],\n ], \"R\");\n this.addTurn([\n [R[2], U[5]],\n [R[3], U[1]],\n [R[4], U[0]],\n [R[7], U[2]],\n [U[5], B[5]],\n [U[1], B[1]],\n [U[0], B[0]],\n [U[2], B[2]],\n [B[5], R[2]],\n [B[1], R[3]],\n [B[0], R[4]],\n [B[2], R[7]],\n ], \"B\");\n }\n U(reverse) {\n this.doTurn(\"U\", reverse);\n }\n R(reverse) {\n this.doTurn(\"R\", reverse);\n }\n L(reverse) {\n this.doTurn(\"L\", reverse);\n }\n B(reverse) {\n this.doTurn(\"B\", reverse);\n }\n u(reverse) {\n this.doTurn(\"u\", reverse);\n }\n r(reverse) {\n this.doTurn(\"r\", reverse);\n }\n l(reverse) {\n this.doTurn(\"l\", reverse);\n }\n b(reverse) {\n this.doTurn(\"b\", reverse);\n }\n alg(alg) {\n if (!alg) {\n return;\n }\n this.doTurns(parsePyraminxAlgorithm(alg));\n }\n case(alg) {\n if (!alg) {\n return;\n }\n let turns = parsePyraminxAlgorithm(alg)\n .reverse()\n .map((turn) => (Object.assign(Object.assign({}, turn), { turnType: turn.turnType === TurnType.Clockwise\n ? TurnType.CounterClockwise\n : TurnType.Clockwise })));\n this.doTurns(turns);\n }\n doTurns(turns) {\n turns.forEach((turn) => {\n let reverse = turn.turnType === TurnType.CounterClockwise;\n switch (turn.unit) {\n case \"R\":\n this.R(reverse);\n break;\n case \"r\":\n this.r(reverse);\n break;\n case \"U\":\n this.U(reverse);\n break;\n case \"u\":\n this.u(reverse);\n break;\n case \"L\":\n this.L(reverse);\n break;\n case \"l\":\n this.l(reverse);\n break;\n case \"B\":\n this.B(reverse);\n break;\n case \"b\":\n this.b(reverse);\n break;\n }\n });\n }\n}\n","export const MEGAMINX_FACES = [\n // Front\n \"U\",\n \"R\",\n \"F\",\n \"dr\",\n \"dl\",\n \"L\",\n // Back\n \"d\",\n \"br\",\n \"BR\",\n \"BL\",\n \"bl\",\n \"b\",\n];\n","import { TurnType } from \"./algorithm\";\nconst megaminxTurnNotation = /([RD])([\\+\\+|\\-\\-]+)|([UFRL]|BR|BL)([2-3]?)(\\'?)/g;\nvar PochmannDirections;\n(function (PochmannDirections) {\n PochmannDirections[\"Clockwise\"] = \"++\";\n PochmannDirections[\"CounterClockwise\"] = \"--\";\n PochmannDirections[\"FaceClockwise\"] = \"\";\n PochmannDirections[\"FaceCounter\"] = \"'\";\n})(PochmannDirections || (PochmannDirections = {}));\nconst DirectionToTurnType = {\n [PochmannDirections.Clockwise]: TurnType.Clockwise,\n [PochmannDirections.CounterClockwise]: TurnType.CounterClockwise,\n [PochmannDirections.FaceClockwise]: TurnType.Clockwise,\n [PochmannDirections.FaceCounter]: TurnType.CounterClockwise,\n};\n/**\n * Takes in a megaminx algorithm in stefan pochmann notation as a string\n * and parses the turns from it\n *\n * Also supports face turns U,F,R,L,BR,BL as i've seen in some algorithms online\n *\n * algorithm string format should be moves separated by a single space\n *\n * @example\n * ```typescript\n * parseMegaminxAlgorithm(\"D++ R-- D-- U\")\n * parseMegaminxAlgorithm(\"R' U2' R2 U R2' U R2 U2' R'\")\n * ```\n *\n * @see https://www.worldcubeassociation.org/regulations/#article-12-notation\n */\nexport function parseMegaminxAlgorithm(algorithm) {\n if (!algorithm) {\n return [];\n }\n let turns = [];\n let match;\n while ((match = megaminxTurnNotation.exec(algorithm))) {\n const rawUnit = match[1] ? `${match[1]}xx` : match[3];\n const rawDirection = match[2] || match[5];\n const rawNumber = match[4];\n turns.push({\n unit: rawUnit,\n turnType: DirectionToTurnType[rawDirection],\n slices: 1,\n n: rawNumber ? parseInt(rawNumber) : 1,\n });\n }\n return turns;\n}\n","import { TurnType } from \"./../../algorithms/algorithm\";\nimport { MEGAMINX_FACES } from \"./constants\";\nimport { Simulator } from \"./../simulator\";\nimport { fillArray } from \"../../utils/arrays\";\nimport { parseMegaminxAlgorithm } from \"../../algorithms/megaminx\";\n/**\n * Simulator to define megaminx type puzzles\n *\n * Currently only standard megaminx size supported.\n */\nexport class MegaminxSimulator extends Simulator {\n constructor() {\n super();\n MEGAMINX_FACES.forEach((faceName) => {\n this.addFace(fillArray(11, faceName), faceName);\n });\n const U = this.faces.get(\"U\"); // White\n const R = this.faces.get(\"R\"); // Blue\n const F = this.faces.get(\"F\"); // Red\n const dr = this.faces.get(\"dr\"); // Pink\n const dl = this.faces.get(\"dl\"); // Light Yellow\n const L = this.faces.get(\"L\"); // Green\n const d = this.faces.get(\"d\"); // Gray\n const br = this.faces.get(\"br\"); // Light Green\n const BR = this.faces.get(\"BR\"); // Yellow\n const BL = this.faces.get(\"BL\"); // Purple\n const bl = this.faces.get(\"bl\"); // Dark Blue\n const b = this.faces.get(\"b\"); // Orange\n // R\n this.addTurn([\n [F[2], U[6]],\n [F[1], U[5]],\n [F[10], U[4]],\n [U[6], BR[10]],\n [U[5], BR[9]],\n [U[4], BR[8]],\n [BR[10], br[8]],\n [BR[9], br[7]],\n [BR[8], br[6]],\n [br[8], dr[2]],\n [br[7], dr[1]],\n [br[6], dr[10]],\n [dr[2], F[2]],\n [dr[1], F[1]],\n [dr[10], F[10]],\n ...makeFaceTurnDefinitions(R),\n ], \"R\");\n // F\n this.addTurn([\n [U[2], R[2]],\n [U[3], R[3]],\n [U[4], R[4]],\n [R[2], dr[2]],\n [R[3], dr[3]],\n [R[4], dr[4]],\n [dr[2], dl[2]],\n [dr[3], dl[3]],\n [dr[4], dl[4]],\n [dl[2], L[2]],\n [dl[3], L[3]],\n [dl[4], L[4]],\n [L[2], U[2]],\n [L[3], U[3]],\n [L[4], U[4]],\n ...makeFaceTurnDefinitions(F),\n ], \"F\");\n // U\n this.addTurn([\n [F[2], L[4]],\n [F[3], L[5]],\n [F[4], L[6]],\n [L[4], BL[8]],\n [L[5], BL[9]],\n [L[6], BL[10]],\n [BL[8], BR[6]],\n [BL[9], BR[7]],\n [BL[10], BR[8]],\n [BR[6], R[10]],\n [BR[7], R[1]],\n [BR[8], R[2]],\n [R[10], F[2]],\n [R[1], F[3]],\n [R[2], F[4]],\n ...makeFaceTurnDefinitions(U),\n ], \"U\");\n // L\n this.addTurn([\n [F[4], dl[4]],\n [F[5], dl[5]],\n [F[6], dl[6]],\n [dl[4], bl[8]],\n [dl[5], bl[9]],\n [dl[6], bl[10]],\n [bl[8], BL[6]],\n [bl[9], BL[7]],\n [bl[10], BL[8]],\n [BL[6], U[10]],\n [BL[7], U[1]],\n [BL[8], U[2]],\n [U[10], F[4]],\n [U[1], F[5]],\n [U[2], F[6]],\n ...makeFaceTurnDefinitions(L),\n ], \"L\");\n // BR\n this.addTurn([\n [U[6], BL[10]],\n [U[7], BL[1]],\n [U[8], BL[2]],\n [BL[10], b[8]],\n [BL[1], b[9]],\n [BL[2], b[10]],\n [b[8], br[4]],\n [b[9], br[5]],\n [b[10], br[6]],\n [br[4], R[8]],\n [br[5], R[9]],\n [br[6], R[10]],\n [R[8], U[6]],\n [R[9], U[7]],\n [R[10], U[8]],\n ...makeFaceTurnDefinitions(BR),\n ], \"BR\");\n // BL\n this.addTurn([\n [U[8], L[6]],\n [U[9], L[7]],\n [U[10], L[8]],\n [L[6], bl[10]],\n [L[7], bl[1]],\n [L[8], bl[2]],\n [bl[10], b[6]],\n [bl[1], b[7]],\n [bl[2], b[8]],\n [b[6], BR[4]],\n [b[7], BR[5]],\n [b[8], BR[6]],\n [BR[4], U[8]],\n [BR[5], U[9]],\n [BR[6], U[10]],\n ...makeFaceTurnDefinitions(BL),\n ], \"BL\");\n // dr\n this.addTurn([\n [F[8], R[4]],\n [F[9], R[5]],\n [F[10], R[6]],\n [R[4], br[8]],\n [R[5], br[9]],\n [R[6], br[10]],\n [br[8], d[6]],\n [br[9], d[7]],\n [br[10], d[8]],\n [d[6], dl[10]],\n [d[7], dl[1]],\n [d[8], dl[2]],\n [dl[10], F[8]],\n [dl[1], F[9]],\n [dl[2], F[10]],\n ...makeFaceTurnDefinitions(dr),\n ], \"dr\");\n // dl\n this.addTurn([\n [F[6], dr[4]],\n [F[7], dr[5]],\n [F[8], dr[6]],\n [dr[4], d[8]],\n [dr[5], d[9]],\n [dr[6], d[10]],\n [d[8], bl[6]],\n [d[9], bl[7]],\n [d[10], bl[8]],\n [bl[6], L[10]],\n [bl[7], L[1]],\n [bl[8], L[2]],\n [L[10], F[6]],\n [L[1], F[7]],\n [L[2], F[8]],\n ...makeFaceTurnDefinitions(dl),\n ], \"dl\");\n // d\n this.addTurn([\n [br[10], b[2]],\n [br[1], b[3]],\n [br[2], b[4]],\n [b[2], bl[4]],\n [b[3], bl[5]],\n [b[4], bl[6]],\n [bl[4], dl[8]],\n [bl[5], dl[9]],\n [bl[6], dl[10]],\n [dl[8], dr[6]],\n [dl[9], dr[7]],\n [dl[10], dr[8]],\n [dr[6], br[10]],\n [dr[7], br[1]],\n [dr[8], br[2]],\n ...makeFaceTurnDefinitions(d),\n ], \"d\");\n // br\n this.addTurn([\n [b[10], d[4]],\n [b[1], d[5]],\n [b[2], d[6]],\n [d[4], dr[8]],\n [d[5], dr[9]],\n [d[6], dr[10]],\n [dr[8], R[6]],\n [dr[9], R[7]],\n [dr[10], R[8]],\n [R[6], BR[10]],\n [R[7], BR[1]],\n [R[8], BR[2]],\n [BR[10], b[10]],\n [BR[1], b[1]],\n [BR[2], b[2]],\n ...makeFaceTurnDefinitions(br),\n ], \"br\");\n // bl\n this.addTurn([\n [BL[4], L[8]],\n [BL[5], L[9]],\n [BL[6], L[10]],\n [L[8], dl[6]],\n [L[9], dl[7]],\n [L[10], dl[8]],\n [dl[6], d[10]],\n [dl[7], d[1]],\n [dl[8], d[2]],\n [d[10], b[4]],\n [d[1], b[5]],\n [d[2], b[6]],\n [b[4], BL[4]],\n [b[5], BL[5]],\n [b[6], BL[6]],\n ...makeFaceTurnDefinitions(bl),\n ], \"bl\");\n // b\n this.addTurn([\n [br[2], BR[2]],\n [br[3], BR[3]],\n [br[4], BR[4]],\n [BR[2], BL[2]],\n [BR[3], BL[3]],\n [BR[4], BL[4]],\n [BL[2], bl[2]],\n [BL[3], bl[3]],\n [BL[4], bl[4]],\n [bl[2], d[2]],\n [bl[3], d[3]],\n [bl[4], d[4]],\n [d[2], br[2]],\n [d[3], br[3]],\n [d[4], br[4]],\n ...makeFaceTurnDefinitions(b),\n ], \"b\");\n // \"Pochmann notation\"\n // D++ / D--\n this.addTurn([\n // Top Layer\n [F[0], R[0]],\n [F[1], R[9]],\n [F[5], R[3]],\n [F[6], R[4]],\n [F[7], R[5]],\n [F[8], R[6]],\n [F[9], R[7]],\n [F[10], R[8]],\n [R[0], BR[0]],\n [R[3], BR[9]],\n [R[4], BR[10]],\n [R[5], BR[1]],\n [R[6], BR[2]],\n [R[7], BR[3]],\n [R[8], BR[4]],\n [R[9], BR[5]],\n [BR[0], BL[0]],\n [BR[9], BL[1]],\n [BR[10], BL[2]],\n [BR[1], BL[3]],\n [BR[2], BL[4]],\n [BR[3], BL[5]],\n [BR[4], BL[6]],\n [BR[5], BL[7]],\n [BL[0], L[0]],\n [BL[1], L[7]],\n [BL[2], L[8]],\n [BL[3], L[9]],\n [BL[4], L[10]],\n [BL[5], L[1]],\n [BL[6], L[2]],\n [BL[7], L[3]],\n [L[0], F[0]],\n [L[7], F[5]],\n [L[8], F[6]],\n [L[9], F[7]],\n [L[10], F[8]],\n [L[1], F[9]],\n [L[2], F[10]],\n [L[3], F[1]],\n // Bottom Layer\n [dr[0], br[0]],\n [dr[1], br[5]],\n [dr[2], br[6]],\n [dr[3], br[7]],\n [dr[4], br[8]],\n [dr[5], br[9]],\n [dr[6], br[10]],\n [dr[7], br[1]],\n [dr[8], br[2]],\n [dr[9], br[3]],\n [dr[10], br[4]],\n [br[0], b[0]],\n [br[1], b[3]],\n [br[2], b[4]],\n [br[3], b[5]],\n [br[4], b[6]],\n [br[5], b[7]],\n [br[6], b[8]],\n [br[7], b[9]],\n [br[8], b[10]],\n [br[9], b[1]],\n [br[10], b[2]],\n [b[0], bl[0]],\n [b[1], bl[3]],\n [b[2], bl[4]],\n [b[3], bl[5]],\n [b[4], bl[6]],\n [b[5], bl[7]],\n [b[6], bl[8]],\n [b[7], bl[9]],\n [b[8], bl[10]],\n [b[9], bl[1]],\n [b[10], bl[2]],\n [bl[0], dl[0]],\n [bl[1], dl[5]],\n [bl[2], dl[6]],\n [bl[3], dl[7]],\n [bl[4], dl[8]],\n [bl[5], dl[9]],\n [bl[6], dl[10]],\n [bl[7], dl[1]],\n [bl[8], dl[2]],\n [bl[9], dl[3]],\n [bl[10], dl[4]],\n [dl[0], dr[0]],\n [dl[1], dr[9]],\n [dl[2], dr[10]],\n [dl[3], dr[1]],\n [dl[4], dr[2]],\n [dl[5], dr[3]],\n [dl[6], dr[4]],\n [dl[7], dr[5]],\n [dl[8], dr[6]],\n [dl[9], dr[7]],\n [dl[10], dr[8]],\n ...makeFaceTurnDefinitions(d),\n ], \"D++\");\n // R++ / R--\n this.addTurn([\n // Top Layer\n [F[0], U[0]],\n [F[7], U[3]],\n [F[8], U[4]],\n [F[9], U[5]],\n [F[10], U[6]],\n [F[1], U[7]],\n [F[2], U[8]],\n [F[3], U[9]],\n [U[0], BL[0]],\n [U[3], BL[9]],\n [U[4], BL[10]],\n [U[5], BL[1]],\n [U[6], BL[2]],\n [U[7], BL[3]],\n [U[8], BL[4]],\n [U[9], BL[5]],\n [BL[0], bl[0]],\n [BL[9], bl[1]],\n [BL[10], bl[2]],\n [BL[1], bl[3]],\n [BL[2], bl[4]],\n [BL[3], bl[5]],\n [BL[4], bl[6]],\n [BL[5], bl[7]],\n [bl[0], dl[0]],\n [bl[1], dl[7]],\n [bl[2], dl[8]],\n [bl[3], dl[9]],\n [bl[4], dl[10]],\n [bl[5], dl[1]],\n [bl[6], dl[2]],\n [bl[7], dl[3]],\n [dl[0], F[0]],\n [dl[7], F[7]],\n [dl[8], F[8]],\n [dl[9], F[9]],\n [dl[10], F[10]],\n [dl[1], F[1]],\n [dl[2], F[2]],\n [dl[3], F[3]],\n // Bottom Layer\n [dr[0], R[0]],\n [dr[1], R[9]],\n [dr[2], R[10]],\n [dr[3], R[1]],\n [dr[4], R[2]],\n [dr[5], R[3]],\n [dr[6], R[4]],\n [dr[7], R[5]],\n [dr[8], R[6]],\n [dr[9], R[7]],\n [dr[10], R[8]],\n [R[0], BR[0]],\n [R[1], BR[5]],\n [R[2], BR[6]],\n [R[3], BR[7]],\n [R[4], BR[8]],\n [R[5], BR[9]],\n [R[6], BR[10]],\n [R[7], BR[1]],\n [R[8], BR[2]],\n [R[9], BR[3]],\n [R[10], BR[4]],\n [BR[0], b[0]],\n [BR[1], b[1]],\n [BR[2], b[2]],\n [BR[3], b[3]],\n [BR[4], b[4]],\n [BR[5], b[5]],\n [BR[6], b[6]],\n [BR[7], b[7]],\n [BR[8], b[8]],\n [BR[9], b[9]],\n [BR[10], b[10]],\n [b[0], d[0]],\n [b[1], d[5]],\n [b[2], d[6]],\n [b[3], d[7]],\n [b[4], d[8]],\n [b[5], d[9]],\n [b[6], d[10]],\n [b[7], d[1]],\n [b[8], d[2]],\n [b[9], d[3]],\n [b[10], d[4]],\n [d[0], dr[0]],\n [d[1], dr[5]],\n [d[2], dr[6]],\n [d[3], dr[7]],\n [d[4], dr[8]],\n [d[5], dr[9]],\n [d[6], dr[10]],\n [d[7], dr[1]],\n [d[8], dr[2]],\n [d[9], dr[3]],\n [d[10], dr[4]],\n ...makeFaceTurnDefinitions(br),\n ], \"R++\");\n }\n U(reverse) {\n this.doTurn(\"U\", reverse);\n }\n R(reverse) {\n this.doTurn(\"R\", reverse);\n }\n F(reverse) {\n this.doTurn(\"F\", reverse);\n }\n dr(reverse) {\n this.doTurn(\"dr\", reverse);\n }\n dl(reverse) {\n this.doTurn(\"dl\", reverse);\n }\n L(reverse) {\n this.doTurn(\"L\", reverse);\n }\n d(reverse) {\n this.doTurn(\"d\", reverse);\n }\n br(reverse) {\n this.doTurn(\"br\", reverse);\n }\n BR(reverse) {\n this.doTurn(\"BR\", reverse);\n }\n BL(reverse) {\n this.doTurn(\"BL\", reverse);\n }\n bl(reverse) {\n this.doTurn(\"bl\", reverse);\n }\n b(reverse) {\n this.doTurn(\"b\", reverse);\n }\n /**\n * D++ for Pochmann notation. D-- if reverse = false\n */\n Dxx(reverse) {\n this.doTurn(\"D++\", reverse);\n }\n /**\n * R++ for Pochmann notation. R-- if reverse = false\n */\n Rxx(reverse) {\n this.doTurn(\"R++\", reverse);\n }\n /**\n * Parses and executes a megaminx algorithm using WCA standard notation\n *\n * @see https://www.stefan-pochmann.info/spocc/other_stuff/tools/scramble_megaminx/)\n * @see https://www.worldcubeassociation.org/regulations/#12d\n *\n * @param alg megaminx algorithm to parse\n * @example\n * ```\n * R-- D++ R++ U'\n * ```\n */\n alg(alg) {\n if (!alg) {\n return;\n }\n // pochmann notation\n this.doTurns(parseMegaminxAlgorithm(alg));\n }\n case(alg) {\n if (!alg) {\n return;\n }\n let turns = parseMegaminxAlgorithm(alg)\n .reverse()\n .map((turn) => (Object.assign(Object.assign({}, turn), { turnType: turn.turnType === TurnType.Clockwise\n ? TurnType.CounterClockwise\n : TurnType.Clockwise })));\n this.doTurns(turns);\n }\n doTurns(turns) {\n turns.forEach((turn) => {\n let reverse = turn.turnType === TurnType.CounterClockwise;\n let turnFunc;\n switch (turn.unit) {\n case \"Rxx\":\n turnFunc = this.Rxx.bind(this);\n break;\n case \"Dxx\":\n turnFunc = this.Dxx.bind(this);\n break;\n case \"U\":\n turnFunc = this.U.bind(this);\n break;\n case \"R\":\n turnFunc = this.R.bind(this);\n break;\n case \"F\":\n turnFunc = this.F.bind(this);\n break;\n case \"L\":\n turnFunc = this.L.bind(this);\n break;\n case \"BL\":\n turnFunc = this.BL.bind(this);\n break;\n case \"BR\":\n turnFunc = this.BR.bind(this);\n break;\n }\n for (let i = turn.n; i > 0; i--) {\n turnFunc(reverse);\n }\n });\n }\n}\n/**\n * Generates turn definitions for rotating a megaminx face clockwise\n * @param face array of sticker ids\n */\nfunction makeFaceTurnDefinitions(face) {\n return [\n // Edges\n [face[1], face[9]],\n [face[9], face[7]],\n [face[7], face[5]],\n [face[5], face[3]],\n [face[3], face[1]],\n // Corners\n [face[2], face[10]],\n [face[10], face[8]],\n [face[8], face[6]],\n [face[6], face[4]],\n [face[4], face[2]],\n ];\n}\n","export var SIMULATOR_FACE;\n(function (SIMULATOR_FACE) {\n SIMULATOR_FACE[\"U\"] = \"U\";\n SIMULATOR_FACE[\"R\"] = \"R\";\n SIMULATOR_FACE[\"F\"] = \"F\";\n SIMULATOR_FACE[\"D\"] = \"D\";\n SIMULATOR_FACE[\"L\"] = \"L\";\n SIMULATOR_FACE[\"B\"] = \"B\";\n})(SIMULATOR_FACE || (SIMULATOR_FACE = {}));\nexport const CUBE_FACES = [\n SIMULATOR_FACE.U,\n SIMULATOR_FACE.R,\n SIMULATOR_FACE.F,\n SIMULATOR_FACE.D,\n SIMULATOR_FACE.L,\n SIMULATOR_FACE.B,\n];\nexport var CUBE_AXIS;\n(function (CUBE_AXIS) {\n CUBE_AXIS[\"X\"] = \"X\";\n CUBE_AXIS[\"Y\"] = \"Y\";\n CUBE_AXIS[\"Z\"] = \"Z\";\n})(CUBE_AXIS || (CUBE_AXIS = {}));\n// Faces that wrap around a given axis\nexport const CUBE_AXIS_FACES = {\n X: [SIMULATOR_FACE.U, SIMULATOR_FACE.B, SIMULATOR_FACE.D, SIMULATOR_FACE.F],\n Y: [SIMULATOR_FACE.L, SIMULATOR_FACE.B, SIMULATOR_FACE.R, SIMULATOR_FACE.F],\n Z: [SIMULATOR_FACE.L, SIMULATOR_FACE.U, SIMULATOR_FACE.R, SIMULATOR_FACE.D],\n};\n// Face's orientation related to other faces on a given axis\n// the number represents the number of turns necessary\n// to orient the face in the same direction\nexport const AXIS_ORIENTATION = {\n X: {\n [SIMULATOR_FACE.U]: 0,\n [SIMULATOR_FACE.B]: 2,\n [SIMULATOR_FACE.F]: 0,\n [SIMULATOR_FACE.D]: 0,\n },\n Y: {\n [SIMULATOR_FACE.B]: -1,\n [SIMULATOR_FACE.F]: -1,\n [SIMULATOR_FACE.L]: -1,\n [SIMULATOR_FACE.R]: -1,\n },\n Z: {\n [SIMULATOR_FACE.U]: -1,\n [SIMULATOR_FACE.D]: 1,\n [SIMULATOR_FACE.L]: 2,\n [SIMULATOR_FACE.R]: 0,\n },\n};\n// True if faces are in reverse orientation\n// from the axis it's on (X, Y, Z).\n// For example D turns on the Y axis, but the\n// y axis layer turns clockwise based on the U\n// face, so D needs to be reversed\nexport const AXIS_FACE_ORIENTATION = {\n [SIMULATOR_FACE.U]: false,\n [SIMULATOR_FACE.R]: false,\n [SIMULATOR_FACE.F]: false,\n [SIMULATOR_FACE.D]: true,\n [SIMULATOR_FACE.L]: true,\n [SIMULATOR_FACE.B]: true,\n};\n","import { Vector2, Vector3 } from \"./vector\";\nexport function degreesToRadians(degrees) {\n return (Math.PI * degrees) / 180;\n}\nexport function polarToCartesian(radius, theta) {\n const x = radius * Math.cos(theta);\n const y = radius * Math.sin(theta);\n return Vector2.fromValues(x, y);\n}\nexport function lineSegmentLength(p1, p2) {\n return Math.sqrt(Math.pow(p2.y - p1.y, 2) + Math.pow(p2.x - p1.x, 2));\n}\n/**\n * Calculates the radius of a circle inscribing a regular\n * pentagon given the side length\n */\nexport function pentagonInRadius(length) {\n return length / (2 * Math.tan(Math.PI / 5));\n}\n/**\n * Calculates the radius of a circle circumscribing a\n * regular pentagon given the side length\n */\nexport function pentagonOutRadius(length) {\n return length / (2 * Math.sin(Math.PI / 5));\n}\n/**\n * Calculates the radius of the sphere that inscribes a\n * regular dodecahedron given the side length\n */\nexport function dodecahedronInRadius(length) {\n return (length / 2) * Math.sqrt(5 / 2 + (11 / 10) * Math.sqrt(5));\n}\nexport function calculateCentroid(vertices) {\n let cx = 0, cy = 0, cz = 0;\n vertices.forEach((vertex) => {\n cx += vertex.x;\n cy += vertex.y;\n cz += vertex.z;\n });\n cx /= vertices.length;\n cy /= vertices.length;\n cz /= vertices.length;\n return Vector3.fromValues(cx, cy, cz);\n}\n/**\n * generates an array with values in a given range by step\n *\n * ex. range(1, 5) -> [1, 2, 3, 4, 5]\n * ex. range(5, 2) -> [5, 4, 3, 2]\n *\n * @param from start of range\n * @param to end of range\n */\nexport function range(from, to) {\n if (from === to) {\n return [from];\n }\n const increment = from < to ? 1 : -1;\n let values = [];\n for (let current = from; current != to; current += increment) {\n values.push(current);\n }\n values.push(to);\n return values;\n}\n","import { CubeAlgorithmUnit } from \"./../../algorithms/cube\";\nimport { fillArray } from \"../../utils/arrays\";\nimport { CUBE_FACES, CUBE_AXIS, CUBE_AXIS_FACES, AXIS_ORIENTATION, SIMULATOR_FACE, AXIS_FACE_ORIENTATION, } from \"./constants\";\nimport { Simulator } from \"../simulator\";\nimport { range } from \"../../math/utils\";\nimport { parseCubeAlgorithm } from \"../../algorithms/cube\";\nimport { TurnType } from \"../../algorithms/algorithm\";\nexport class RubiksCubeSimulator extends Simulator {\n constructor(size) {\n super();\n this.size = size;\n this.gridSize = size * size;\n CUBE_FACES.forEach((faceName) => {\n // Create stickers for face\n this.addFace(fillArray(this.gridSize, faceName), faceName);\n const faceChanges = this.makeFaceTurnDefinitions(faceName);\n // Create rotation for stickers on face only\n this.addTurn(faceChanges, faceName);\n });\n // Create rotations for stickers on each layer\n // around each turnable axis\n [CUBE_AXIS.X, CUBE_AXIS.Y, CUBE_AXIS.Z].forEach((axis) => {\n for (let column = 0; column < this.size; column++) {\n let layerChanges = [];\n CUBE_AXIS_FACES[axis].forEach((faceName, i) => {\n const nextFaceName = CUBE_AXIS_FACES[axis][(i + 1) % CUBE_AXIS_FACES[axis].length];\n const nextFace = this.faces.get(nextFaceName);\n const currentFace = this.faces.get(faceName);\n for (let row = 0; row < this.size; row++) {\n const stickerIndex = this.size * row + column;\n const sticker1 = currentFace[this.axisAlignedSticker(axis, faceName, stickerIndex)];\n const sticker2 = nextFace[this.axisAlignedSticker(axis, nextFaceName, stickerIndex)];\n layerChanges.push([sticker1, sticker2]);\n }\n });\n this.addTurn(layerChanges, `${axis}-${column}`);\n }\n });\n }\n /**\n * Makes turn definitions for a face of the cube\n *\n * @param faceName the label of the face to make turn definitions\n * @example returning turn definitions for stickers on a 2x2\n * ```\n * addFace(['y', 'y', 'y', 'y'], 'U');\n * // returns { faceId: 'U', stickerIds: ['1','2','3','4'] }\n *\n * makeTurnDefinitions('U');\n * // returns [\n * // ['1','2'],\n * // ['2','4'],\n * // ['3','1'],\n * // ['4','3']\n * // ]\n * ```\n */\n makeFaceTurnDefinitions(faceName) {\n const stickerIds = this.faces.get(faceName);\n return stickerIds.map((stickerId, i) => [\n stickerId,\n stickerIds[this.clockwiseSticker(i)],\n ]);\n }\n /**\n * Given sticker i return the index it will go to\n * after rotating clockwise\n *\n * ex. stickers are stored in an array but represent a grid\n * so, for a 3x3 sticker index 0 will rotate to 2, 1 to 5, etc...\n *\n * ```\n * 0 | 1 | 2\n * ----------\n * 3 | 4 | 5\n * ----------\n * 6 | 7 | 8\n * ```\n */\n clockwiseSticker(stickerIndex) {\n return (((stickerIndex + 1) * this.size) % (this.gridSize + 1)) - 1;\n }\n /**\n * Given sticker i return the index it will go to\n * after rotating counterclockwise\n */\n counterClockwiseSticker(stickerIndex) {\n return this.oppositeSticker(this.clockwiseSticker(stickerIndex));\n }\n /**\n * Given sticker i return the index it will go to\n * after rotating 180 degrees\n */\n oppositeSticker(stickerIndex) {\n return this.gridSize - (stickerIndex + 1);\n }\n axisAlignedSticker(axis, face, stickerIndex) {\n switch (AXIS_ORIENTATION[axis][face]) {\n case 0:\n return stickerIndex;\n case 1:\n return this.clockwiseSticker(stickerIndex);\n case 2:\n return this.oppositeSticker(stickerIndex);\n case -1:\n return this.counterClockwiseSticker(stickerIndex);\n default:\n throw `Invalid axis face orientation value ${AXIS_ORIENTATION[axis][face]}`;\n }\n }\n /**\n * Performs a turn on a given face.\n *\n * @param face the face to turn\n * @param axis axis to perform inner layer turns on\n * @param reverse true if you want to turn the face counter clockwise\n * @param from inner layer to start turning from\n * @param to last inner layer to stop turning\n * @param to last inner layer to stop turning\n */\n turnFace(face, axis, reverse, from, to) {\n if (Math.abs(to - from) >= this.size - 1) {\n console.error(`Invalid number of layers to turn, skipping turn.; face=${face}, layers=${Math.abs(to - from) + 1}`);\n return;\n }\n // Rotate face\n this.doTurn(face, reverse);\n // Turn inner layers\n range(from, to).forEach((layer) => {\n this.doTurn(`${axis}-${layer}`, AXIS_FACE_ORIENTATION[face] ? !reverse : reverse);\n });\n }\n /**\n * Performs a U turn\n * @param reverse true if you want to turn the face counter clockwise (U')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n U(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.U, CUBE_AXIS.Y, reverse, this.size - 1, this.size - layers);\n }\n /**\n * Performs an R turn\n * @param reverse true if you want to turn the face counter clockwise (R')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n R(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.R, CUBE_AXIS.X, reverse, this.size - 1, this.size - layers);\n }\n /**\n * Performs an F turn\n * @param reverse true if you want to turn the face counter clockwise (F')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n F(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.F, CUBE_AXIS.Z, reverse, 0, layers - 1);\n }\n /**\n * Performs a D turn\n * @param reverse true if you want to turn the face counter clockwise (D')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n D(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.D, CUBE_AXIS.Y, reverse, 0, layers - 1);\n }\n /**\n * Performs an L turn\n * @param reverse true if you want to turn the face counter clockwise (L')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n L(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.L, CUBE_AXIS.X, reverse, 0, layers - 1);\n }\n /**\n * Performs a B turn\n * @param reverse true if you want to turn the face counter clockwise (B')\n * @param layers how many inner layers of the face to turn defaults to 1. Cannot be the cube size or greater\n */\n B(reverse = false, layers = 1) {\n this.turnFace(SIMULATOR_FACE.B, CUBE_AXIS.Z, reverse, this.size - 1, this.size - layers);\n }\n /**\n * Rotates the middle slice in the direction of an L turn\n * https://ruwix.com/the-rubiks-cube/notation/advanced/\n *\n * Will rotate all middle layers inbetween R and L for larger cubes\n */\n M(reverse = false) {\n for (let layer = 1; layer < this.size - 1; layer++) {\n this.doTurn(`${CUBE_AXIS.X}-${layer}`, !reverse);\n }\n }\n /**\n * Rotates the standing layers in the direction of an F turn\n * https://ruwix.com/the-rubiks-cube/notation/advanced/\n *\n * Will rotate all middle layers inbetween F and B for larger cubes\n */\n S(reverse = false) {\n for (let layer = 1; layer < this.size - 1; layer++) {\n this.doTurn(`${CUBE_AXIS.Z}-${layer}`, reverse);\n }\n }\n /**\n * Rotates the equitorial layers in the direction of a D turn\n * https://ruwix.com/the-rubiks-cube/notation/advanced/\n *\n * Will rotate all middle layers inbetween U and D for larger cubes\n */\n E(reverse = false) {\n for (let layer = 1; layer < this.size - 1; layer++) {\n this.doTurn(`${CUBE_AXIS.Y}-${layer}`, !reverse);\n }\n }\n /**\n * rotates the entire cube on R\n */\n X(reverse = false) {\n this.doTurn(\"R\", reverse);\n this.doTurn(\"L\", !reverse);\n for (let layer = 0; layer < this.size; layer++) {\n this.doTurn(`${CUBE_AXIS.X}-${layer}`, reverse);\n }\n }\n /**\n * rotates the entire cube on U\n */\n Y(reverse = false) {\n this.doTurn(\"U\", reverse);\n this.doTurn(\"D\", !reverse);\n for (let layer = 0; layer < this.size; layer++) {\n this.doTurn(`${CUBE_AXIS.Y}-${layer}`, reverse);\n }\n }\n /**\n * rotates the entire cube on F\n */\n Z(reverse = false) {\n this.doTurn(\"F\", reverse);\n this.doTurn(\"B\", !reverse);\n for (let layer = 0; layer < this.size; layer++) {\n this.doTurn(`${CUBE_AXIS.Z}-${layer}`, reverse);\n }\n }\n alg(alg) {\n if (!alg) {\n return;\n }\n this.doTurns(parseCubeAlgorithm(alg));\n }\n /**\n * reverses an algorithm then executes it\n */\n case(alg) {\n if (!alg) {\n return;\n }\n let turns = parseCubeAlgorithm(alg)\n .reverse()\n .map((turn) => {\n switch (turn.turnType) {\n case TurnType.Clockwise:\n turn.turnType = TurnType.CounterClockwise;\n break;\n case TurnType.CounterClockwise:\n turn.turnType = TurnType.Clockwise;\n break;\n case TurnType.Double:\n break;\n }\n return turn;\n });\n this.doTurns(turns);\n }\n doTurns(turns) {\n turns.forEach((turn) => {\n let turnFunc;\n switch (turn.unit) {\n case CubeAlgorithmUnit.U:\n turnFunc = this.U.bind(this);\n break;\n case CubeAlgorithmUnit.R:\n turnFunc = this.R.bind(this);\n break;\n case CubeAlgorithmUnit.F:\n turnFunc = this.F.bind(this);\n break;\n case CubeAlgorithmUnit.D:\n turnFunc = this.D.bind(this);\n break;\n case CubeAlgorithmUnit.L:\n turnFunc = this.L.bind(this);\n break;\n case CubeAlgorithmUnit.B:\n turnFunc = this.B.bind(this);\n break;\n case CubeAlgorithmUnit.M:\n turnFunc = this.M.bind(this);\n break;\n case CubeAlgorithmUnit.E:\n turnFunc = this.E.bind(this);\n break;\n case CubeAlgorithmUnit.S:\n turnFunc = this.S.bind(this);\n break;\n case CubeAlgorithmUnit.X:\n turnFunc = this.X.bind(this);\n break;\n case CubeAlgorithmUnit.Y:\n turnFunc = this.Y.bind(this);\n break;\n case CubeAlgorithmUnit.Z:\n turnFunc = this.Z.bind(this);\n break;\n default:\n console.warn(`Unsupported cube move`, turn);\n break;\n }\n const reverse = turn.turnType === TurnType.CounterClockwise;\n turnFunc(reverse, turn.slices);\n if (turn.turnType === TurnType.Double) {\n turnFunc(reverse, turn.slices);\n }\n });\n }\n}\n","/**\n * Simple generator that yields a new ID every time\n * its called. Used to give unique IDs to geometry.\n */\nexport const generateUid = (() => {\n let current = 0;\n return function () {\n return current++;\n };\n})();\n","/**\n * Credit to logic https://github.com/toji/gl-matrix/blob/master/src/mat4.js\n */\nconst EPSILON = 0.000001;\nexport class Matrix4 {\n constructor(values) {\n if (Array.isArray(values) && values.length == 16) {\n this.values = values;\n }\n else {\n this.values = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n }\n }\n /**\n * Returns a 4x4 matrix with the given values\n */\n static fromValues(m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, m16) {\n return new Matrix4([\n m1,\n m2,\n m3,\n m4,\n m5,\n m6,\n m7,\n m8,\n m9,\n m10,\n m11,\n m12,\n m13,\n m14,\n m15,\n m16,\n ]);\n }\n static fromQuaternion(q) {\n let { a: x, b: y, c: z, d: w } = q;\n let x2 = x + x;\n let y2 = y + y;\n let z2 = z + z;\n let xx = x * x2;\n let yx = y * x2;\n let yy = y * y2;\n let zx = z * x2;\n let zy = z * y2;\n let zz = z * z2;\n let wx = w * x2;\n let wy = w * y2;\n let wz = w * z2;\n return Matrix4.fromValues(1 - yy - zz, yx + wz, zx - wy, 0, yx - wz, 1 - xx - zz, zy + wx, 0, zx + wy, zy - wx, 1 - xx - yy, 0, 0, 0, 0, 1);\n }\n static fromTranslation(x, y, z) {\n return Matrix4.fromValues(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1);\n }\n static fromXRotation(radians) {\n let s = Math.sin(radians);\n let c = Math.cos(radians);\n return Matrix4.fromValues(1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1);\n }\n static fromYRotation(radians) {\n let s = Math.sin(radians);\n let c = Math.cos(radians);\n return Matrix4.fromValues(c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1);\n }\n /**\n * copy values from one matrix to another\n */\n static copy(out, matrix) {\n out.values[0] = matrix.values[0];\n out.values[1] = matrix.values[1];\n out.values[2] = matrix.values[2];\n out.values[3] = matrix.values[3];\n out.values[4] = matrix.values[4];\n out.values[5] = matrix.values[5];\n out.values[6] = matrix.values[6];\n out.values[7] = matrix.values[7];\n out.values[8] = matrix.values[8];\n out.values[9] = matrix.values[9];\n out.values[10] = matrix.values[10];\n out.values[11] = matrix.values[11];\n out.values[12] = matrix.values[12];\n out.values[13] = matrix.values[13];\n out.values[14] = matrix.values[14];\n out.values[15] = matrix.values[15];\n }\n static multiply(out, a, b) {\n let a00 = a.values[0], a01 = a.values[1], a02 = a.values[2], a03 = a.values[3];\n let a10 = a.values[4], a11 = a.values[5], a12 = a.values[6], a13 = a.values[7];\n let a20 = a.values[8], a21 = a.values[9], a22 = a.values[10], a23 = a.values[11];\n let a30 = a.values[12], a31 = a.values[13], a32 = a.values[14], a33 = a.values[15];\n // Cache only the current line of the second matrix\n let b0 = b.values[0], b1 = b.values[1], b2 = b.values[2], b3 = b.values[3];\n out.values[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out.values[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out.values[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out.values[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b.values[4];\n b1 = b.values[5];\n b2 = b.values[6];\n b3 = b.values[7];\n out.values[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out.values[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out.values[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out.values[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b.values[8];\n b1 = b.values[9];\n b2 = b.values[10];\n b3 = b.values[11];\n out.values[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out.values[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out.values[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out.values[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b.values[12];\n b1 = b.values[13];\n b2 = b.values[14];\n b3 = b.values[15];\n out.values[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out.values[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out.values[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out.values[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n }\n /**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n */\n static perspective(fovy, aspect, near, far) {\n const f = 1.0 / Math.tan(fovy / 2);\n const values = [f / aspect, 0, 0, 0, 0, f, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0];\n if (far != null && far !== Infinity) {\n const nf = 1 / (near - far);\n values[10] = (far + near) * nf;\n values[14] = 2 * far * near * nf;\n }\n else {\n values[10] = -1;\n values[14] = -2 * near;\n }\n return new Matrix4(values);\n }\n translate(x, y, z) {\n this.values[12] =\n this.values[0] * x +\n this.values[4] * y +\n this.values[8] * z +\n this.values[12];\n this.values[13] =\n this.values[1] * x +\n this.values[5] * y +\n this.values[9] * z +\n this.values[13];\n this.values[14] =\n this.values[2] * x +\n this.values[6] * y +\n this.values[10] * z +\n this.values[14];\n this.values[15] =\n this.values[3] * x +\n this.values[7] * y +\n this.values[11] * z +\n this.values[15];\n }\n scale(x, y, z) {\n this.values[0] = this.values[0] * x;\n this.values[1] = this.values[1] * x;\n this.values[2] = this.values[2] * x;\n this.values[3] = this.values[3] * x;\n this.values[4] = this.values[4] * y;\n this.values[5] = this.values[5] * y;\n this.values[6] = this.values[6] * y;\n this.values[7] = this.values[7] * y;\n this.values[8] = this.values[8] * z;\n this.values[9] = this.values[9] * z;\n this.values[10] = this.values[10] * z;\n this.values[11] = this.values[11] * z;\n }\n /**\n * Rotates the matrix by the given angle around the axis (x, y, z)\n */\n rotate(radians, x, y, z) {\n let len = Math.hypot(x, y, z);\n if (len < EPSILON) {\n return;\n }\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n let s = Math.sin(radians);\n let c = Math.cos(radians);\n let t = 1 - c;\n let a00, a01, a02, a03;\n let a10, a11, a12, a13;\n let a20, a21, a22, a23;\n let b00, b01, b02;\n let b10, b11, b12;\n let b20, b21, b22;\n a00 = this.values[0];\n a01 = this.values[1];\n a02 = this.values[2];\n a03 = this.values[3];\n a10 = this.values[4];\n a11 = this.values[5];\n a12 = this.values[6];\n a13 = this.values[7];\n a20 = this.values[8];\n a21 = this.values[9];\n a22 = this.values[10];\n a23 = this.values[11];\n // Construct the elements of the rotation matrix\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c;\n // Perform rotation-specific matrix multiplication\n this.values[0] = a00 * b00 + a10 * b01 + a20 * b02;\n this.values[1] = a01 * b00 + a11 * b01 + a21 * b02;\n this.values[2] = a02 * b00 + a12 * b01 + a22 * b02;\n this.values[3] = a03 * b00 + a13 * b01 + a23 * b02;\n this.values[4] = a00 * b10 + a10 * b11 + a20 * b12;\n this.values[5] = a01 * b10 + a11 * b11 + a21 * b12;\n this.values[6] = a02 * b10 + a12 * b11 + a22 * b12;\n this.values[7] = a03 * b10 + a13 * b11 + a23 * b12;\n this.values[8] = a00 * b20 + a10 * b21 + a20 * b22;\n this.values[9] = a01 * b20 + a11 * b21 + a21 * b22;\n this.values[10] = a02 * b20 + a12 * b21 + a22 * b22;\n this.values[11] = a03 * b20 + a13 * b21 + a23 * b22;\n }\n multiply(b) {\n Matrix4.multiply(this, this, b);\n }\n}\n","import { generateUid } from \"./uid\";\nimport { Vector3 } from \"../math/vector\";\nimport { Matrix4 } from \"../math/matrix\";\nexport class Object3D {\n constructor() {\n this.uid = generateUid();\n this.matrix = new Matrix4();\n this.centroid = Vector3.fromValues(0, 0, 0);\n }\n translate(x, y, z) {\n this.matrix.translate(x, y, z);\n }\n rotate(rad, x, y, z) {\n this.matrix.rotate(rad, x, y, z);\n }\n scale(x, y, z) {\n this.matrix.scale(x, y, z);\n }\n setColor(color) {\n this.color = color;\n }\n}\n","import { Object3D } from \"./object3d\";\nexport class Group extends Object3D {\n constructor(objects = []) {\n super();\n this.setObjects(objects);\n }\n setObjects(objects) {\n this.objects = objects;\n }\n addObject(object) {\n this.objects.push(object);\n }\n setCentroid(vector) {\n this.centroid = vector;\n }\n}\n","import { degreesToRadians } from \"./utils\";\nexport const SQRT_3 = Math.sqrt(3);\nexport const ATAN_15_DEG = Math.atan(degreesToRadians(15));\nexport const DEG_30_RADIANS = degreesToRadians(30);\nexport const DEG_36_RADIANS = degreesToRadians(36);\nexport const DEG_60_RADIANS = degreesToRadians(60);\nexport const DEG_72_RADIANS = degreesToRadians(72);\n","import { SOLVED_BOTTOM_PIECES, SOLVED_TOP_PIECES } from \"./constants\";\nimport { Group } from \"./../../geometry/group\";\nimport { ATAN_15_DEG, DEG_30_RADIANS, DEG_60_RADIANS, } from \"./../../math/constants\";\nimport { PIECE_TYPE } from \"./enum\";\nexport class Square1Builder {\n constructor(topLayer = SOLVED_TOP_PIECES, bottomLayer = SOLVED_BOTTOM_PIECES, middleRotated = false, sideLength = 0.7) {\n this.sideLength = sideLength;\n this.halfSide = this.sideLength / 2;\n this.halfEdgePiece = this.halfSide * ATAN_15_DEG;\n this.layerWidth = this.halfSide - this.halfEdgePiece;\n this.middleWidth = this.sideLength - 2 * this.layerWidth;\n this.halfMiddleWidth = this.middleWidth / 2;\n this.borderLayerWidth = this.sideLength * 0.2;\n this.outerHalfSide = (sideLength + this.borderLayerWidth) / 2;\n this.outerHalfEdgePiece = this.outerHalfSide * ATAN_15_DEG;\n this.pieces = this.buildSquare1(topLayer, bottomLayer, middleRotated);\n this.group = new Group(this.pieces);\n }\n makeLayer(pieces) {\n let geometry = [];\n let angle = Math.PI;\n pieces.forEach((piece, index) => {\n switch (piece.type) {\n case PIECE_TYPE.CORNER:\n const corner = this.square1Corner(piece.colors[0], piece.colors[1], piece.colors[2]);\n corner.rotate(angle, 0, 0, 1);\n geometry.push(corner);\n angle -= DEG_60_RADIANS;\n break;\n case PIECE_TYPE.EDGE:\n const edge = this.square1Edge(piece.colors[0], piece.colors[1]);\n edge.rotate(angle - DEG_60_RADIANS, 0, 0, 1);\n geometry.push(edge);\n angle -= DEG_30_RADIANS;\n break;\n }\n });\n return geometry;\n }\n /**\n * Not implemented. Just here for {@link Visualizer}'s sake\n */\n setColors(colors) { }\n}\n","import { calculateCentroid } from \"../math/utils\";\nimport { generateUid } from \"./uid\";\n/**\n * Face that will render as a puzzle sticker\n */\nexport class Face {\n /**\n * @param indices indices of vertices that make up a face\n * @param vertices vertices of the geometry to calculate centroid from\n * @param color color of the sticker\n */\n constructor(indices, vertices, color) {\n this.indices = indices;\n this.color = color;\n this.uid = generateUid();\n if (vertices) {\n this.calculateCentroid(vertices);\n }\n }\n /**\n * recalculate the centroid of the face.\n */\n calculateCentroid(vertices) {\n this.centroid = calculateCentroid(\n // Calculate centroid from vertices included in the face\n vertices.filter((v, i) => this.indices.includes(i)));\n }\n}\n","import { Object3D } from \"./object3d\";\nimport { calculateCentroid } from \"../math/utils\";\nexport class Geometry extends Object3D {\n constructor(vertices, faces) {\n super();\n this.vertices = vertices;\n this.faces = faces;\n this.centroid = calculateCentroid(this.vertices);\n }\n}\n","import { Square1Builder } from \"./interface\";\nimport { DEG_30_RADIANS } from \"./../../math/constants\";\nimport { Face } from \"./../../geometry/face\";\nimport { Geometry } from \"./../../geometry/geometry\";\nimport { Group } from \"./../../geometry/group\";\nimport { FRONT_COLOR, RIGHT_COLOR, BACK_COLOR } from \"./constants\";\nimport { Vector3 } from \"../../math/vector\";\nexport class Square1Net extends Square1Builder {\n square1Corner(top, side1, side2) {\n const points = [\n // Top\n Vector3.fromValues(0, 0, 0),\n Vector3.fromValues(this.halfSide, this.halfEdgePiece, 0),\n Vector3.fromValues(this.halfSide, this.halfSide, 0),\n Vector3.fromValues(this.halfEdgePiece, this.halfSide, 0),\n // Sides\n Vector3.fromValues(this.outerHalfSide, this.outerHalfEdgePiece, 0),\n Vector3.fromValues(this.outerHalfSide, this.outerHalfSide, 0),\n Vector3.fromValues(this.outerHalfEdgePiece, this.outerHalfSide, 0),\n ];\n const faces = [\n new Face([0, 1, 2, 3], points, top),\n new Face([2, 3, 6, 5], points, side1),\n new Face([1, 2, 5, 4], points, side2),\n ];\n return new Geometry(points, faces);\n }\n square1Edge(top, side) {\n const points = [\n // Top\n Vector3.fromValues(0, 0, 0).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n Vector3.fromValues(this.halfEdgePiece, this.halfSide, 0).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n Vector3.fromValues(-this.halfEdgePiece, this.halfSide, 0).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n // Side\n Vector3.fromValues(this.outerHalfEdgePiece, this.outerHalfSide, 0).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n Vector3.fromValues(-this.outerHalfEdgePiece, this.outerHalfSide, 0).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n ];\n const faces = [\n new Face([0, 1, 2], points, top),\n new Face([1, 2, 4, 3], points, side),\n ];\n return new Geometry(points, faces);\n }\n square1Middle(front, right, back, rotated) {\n const layerHeight = this.halfSide - this.halfEdgePiece;\n const middleHeight = this.sideLength - 2 * layerHeight;\n const halfMiddleHeight = middleHeight / 2;\n const cornerLength = this.outerHalfSide - this.outerHalfEdgePiece;\n const vertices = [\n Vector3.fromValues(-this.outerHalfSide, halfMiddleHeight, -0.01),\n Vector3.fromValues(-this.outerHalfEdgePiece, halfMiddleHeight, -0.01),\n Vector3.fromValues(this.outerHalfSide, halfMiddleHeight, -0.01),\n Vector3.fromValues(-this.outerHalfSide, -halfMiddleHeight, -0.01),\n Vector3.fromValues(-this.outerHalfEdgePiece, -halfMiddleHeight, -0.01),\n Vector3.fromValues(this.outerHalfSide, -halfMiddleHeight, -0.01),\n // Points for when middle is rotated\n Vector3.fromValues(2 * this.outerHalfEdgePiece, halfMiddleHeight, -0.01),\n Vector3.fromValues(2 * this.outerHalfEdgePiece, -halfMiddleHeight, -0.01),\n Vector3.fromValues(2 * cornerLength, halfMiddleHeight, -0.01),\n Vector3.fromValues(2 * cornerLength, -halfMiddleHeight, -0.01),\n ];\n // Left\n const faces = [new Face([0, 1, 4, 3], vertices, front)];\n // Right\n if (!rotated) {\n faces.push(new Face([1, 2, 5, 4], vertices, front));\n }\n else {\n faces.push(new Face([1, 6, 7, 4], vertices, back));\n faces.push(new Face([6, 8, 9, 7], vertices, right));\n }\n return new Geometry(vertices, faces);\n }\n buildSquare1(top, bottom, middleRotated) {\n const layerHeight = this.halfSide - this.halfEdgePiece;\n const middleHeight = this.sideLength - 2 * layerHeight;\n const halfMiddleHeight = middleHeight / 2;\n let pieces = [];\n const topLayer = new Group(this.makeLayer(top));\n const bottomLayer = new Group(this.makeLayer(bottom));\n topLayer.translate(0, this.outerHalfSide + halfMiddleHeight, 0);\n bottomLayer.translate(0, -(this.outerHalfSide + halfMiddleHeight), 0);\n bottomLayer.rotate(DEG_30_RADIANS, 0, 0, 1);\n pieces = [topLayer, bottomLayer];\n const m = this.square1Middle(FRONT_COLOR, RIGHT_COLOR, BACK_COLOR, middleRotated);\n this.faces = {\n top: topLayer,\n bottom: bottomLayer,\n };\n pieces.push(m);\n return pieces;\n }\n}\n","import { ROTATION_VECTOR, FRONT_COLOR, LEFT_COLOR, BACK_COLOR, RIGHT_COLOR, SOLVED_TOP_PIECES, SOLVED_BOTTOM_PIECES, } from \"./constants\";\nimport { Square1Builder } from \"./interface\";\nimport { DEG_30_RADIANS } from \"./../../math/constants\";\nimport { Geometry } from \"./../../geometry/geometry\";\nimport { Face } from \"./../../geometry/face\";\nimport { Group } from \"../../geometry/group\";\nimport { Vector3 } from \"../../math/vector\";\nconst INNER_FACE_COLOR = { value: \"#333\", stroke: \"#333\" };\nexport class Square1 extends Square1Builder {\n constructor(topLayer = SOLVED_TOP_PIECES, bottomLayer = SOLVED_BOTTOM_PIECES, middleRotated = false, sideLength = 1.25) {\n super(topLayer, bottomLayer, middleRotated, sideLength);\n }\n square1Corner(top, side1, side2) {\n const points = [\n // Top\n Vector3.fromValues(0, 0, this.halfSide),\n Vector3.fromValues(this.halfSide, this.halfEdgePiece, this.halfSide),\n Vector3.fromValues(this.halfSide, this.halfSide, this.halfSide),\n Vector3.fromValues(this.halfEdgePiece, this.halfSide, this.halfSide),\n // Bottom\n Vector3.fromValues(0, 0, this.halfSide - this.layerWidth),\n Vector3.fromValues(this.halfSide, this.halfEdgePiece, this.halfSide - this.layerWidth),\n Vector3.fromValues(this.halfSide, this.halfSide, this.halfSide - this.layerWidth),\n Vector3.fromValues(this.halfEdgePiece, this.halfSide, this.halfSide - this.layerWidth),\n ];\n const faces = [\n new Face([0, 1, 2, 3], points, top),\n // TODO: the faces commented out here are the underside of the pieces so\n // they show gray when the cube is scrambled. But they are overlapping sometimes\n // with outward sticker faces. removing them for now, but it'd be nice to\n // fix this.\n new Face([4, 5, 6, 7], points, INNER_FACE_COLOR),\n new Face([0, 1, 5, 4], points, INNER_FACE_COLOR),\n new Face([2, 3, 7, 6], points, side1),\n new Face([1, 2, 6, 5], points, side2),\n new Face([0, 3, 7, 4], points, INNER_FACE_COLOR),\n ];\n const innerCentroid = Vector3.fromValues(this.halfSide / 2, this.halfSide / 2, this.halfSide / 2);\n faces[1].centroid = innerCentroid;\n faces[2].centroid = innerCentroid;\n faces[5].centroid = innerCentroid;\n return new Geometry(points, faces);\n }\n square1Edge(top, side) {\n const points = [\n // Top\n Vector3.fromValues(0, 0, this.halfSide).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n Vector3.fromValues(this.halfEdgePiece, this.halfSide, this.halfSide).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n Vector3.fromValues(-this.halfEdgePiece, this.halfSide, this.halfSide).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n // Bottom\n Vector3.fromValues(0, 0, this.halfSide - this.layerWidth).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n Vector3.fromValues(this.halfEdgePiece, this.halfSide, this.halfSide - this.layerWidth).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n Vector3.fromValues(-this.halfEdgePiece, this.halfSide, this.halfSide - this.layerWidth).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS),\n ];\n const faces = [\n new Face([0, 1, 2], points, top),\n new Face([3, 4, 5], points, INNER_FACE_COLOR),\n new Face([1, 2, 5, 4], points, side),\n new Face([0, 1, 4, 3], points, INNER_FACE_COLOR),\n new Face([0, 2, 5, 3], points, INNER_FACE_COLOR),\n ];\n const innerFaceCentroid = Vector3.fromValues(0, this.halfSide / 2, this.halfSide / 2).rotateZ(Vector3.fromValues(0, 0, 0), DEG_30_RADIANS);\n // Override centroid to avoid drawing over outside stickers\n faces[1].centroid = innerFaceCentroid;\n faces[3].centroid = innerFaceCentroid;\n faces[4].centroid = innerFaceCentroid;\n return new Geometry(points, faces);\n }\n square1Middle(front, side, back) {\n const vertices = [\n Vector3.fromValues(-this.halfSide, -this.halfSide, this.halfMiddleWidth),\n Vector3.fromValues(-this.halfSide, this.halfSide, this.halfMiddleWidth),\n Vector3.fromValues(this.halfEdgePiece, this.halfSide, this.halfMiddleWidth),\n Vector3.fromValues(-this.halfEdgePiece, -this.halfSide, this.halfMiddleWidth),\n Vector3.fromValues(-this.halfSide, -this.halfSide, -this.halfMiddleWidth),\n Vector3.fromValues(-this.halfSide, this.halfSide, -this.halfMiddleWidth),\n Vector3.fromValues(this.halfEdgePiece, this.halfSide, -this.halfMiddleWidth),\n Vector3.fromValues(-this.halfEdgePiece, -this.halfSide, -this.halfMiddleWidth),\n ];\n const faces = [\n new Face([0, 1, 2, 3], vertices, { value: \"#333\" }),\n new Face([4, 5, 6, 7], vertices, { value: \"#333\" }),\n new Face([0, 1, 5, 4], vertices, side),\n new Face([1, 2, 6, 5], vertices, back),\n // new Face([2, 3, 7, 6], vertices, { value: \"#333\" }),\n new Face([0, 3, 7, 4], vertices, front),\n ];\n const innerFaceCentroid = Vector3.fromValues(-this.halfSide / 2, 0, 0);\n // Override centroid to avoid drawing over outside stickers\n faces[0].centroid = innerFaceCentroid;\n faces[1].centroid = innerFaceCentroid;\n faces[2].centroid = Vector3.fromValues(-(this.halfSide + this.halfSide * 0.45), 0, 0);\n return new Geometry(vertices, faces);\n }\n buildSquare1(top, bottom, middleRotated) {\n const topLayer = new Group(this.makeLayer(top));\n const bottomLayer = new Group(this.makeLayer(bottom));\n bottomLayer.rotate(Math.PI, 1, 0, 0);\n bottomLayer.rotate(DEG_30_RADIANS, 0, 0, 1);\n const pieces = [topLayer, bottomLayer];\n const m1 = this.square1Middle(FRONT_COLOR, LEFT_COLOR, BACK_COLOR);\n const m2 = this.square1Middle(BACK_COLOR, RIGHT_COLOR, FRONT_COLOR);\n m2.rotate(Math.PI, 0, 0, 1);\n if (middleRotated) {\n m2.rotate(Math.PI, ROTATION_VECTOR.x, ROTATION_VECTOR.y, ROTATION_VECTOR.z);\n }\n pieces.push(m1);\n pieces.push(m2);\n this.faces = {\n top: topLayer,\n bottom: bottomLayer,\n };\n return pieces;\n }\n}\n","import { Geometry } from \"./geometry\";\nimport { Face } from \"./face\";\nimport { Vector3 } from \"../math/vector\";\nexport class Plane extends Geometry {\n constructor(width, height, color) {\n let vertices = [\n Vector3.fromValues(0, 0, 0),\n Vector3.fromValues(width, 0, 0),\n Vector3.fromValues(width, -height, 0),\n Vector3.fromValues(0, -height, 0),\n ];\n let faces = [new Face([0, 1, 2, 3], vertices, color)];\n super(vertices, faces);\n }\n}\n","import { Geometry } from \"./geometry\";\nimport { Face } from \"./face\";\nimport { SQRT_3 } from \"../math/constants\";\nimport { Vector3 } from \"../math/vector\";\nexport class Triangle extends Geometry {\n constructor(a, b, c, color) {\n let verticies = [a, b, c];\n let faces = [new Face([0, 1, 2], verticies, color)];\n super(verticies, faces);\n }\n}\nexport class EquilateralTriangle extends Triangle {\n constructor(base, color) {\n let height = base * (SQRT_3 / 2);\n super(Vector3.fromValues(0, 0, 0), Vector3.fromValues(base / 2, height, 0), Vector3.fromValues(base, 0, 0), color);\n }\n}\n","import { RED, YELLOW, BLUE, ORANGE, GREEN, WHITE, BLACK } from \"./colors\";\nimport { Group } from \"../geometry/group\";\nimport { Plane } from \"../geometry/plane\";\nimport { Triangle } from \"../geometry/triangle\";\nimport { Vector3 } from \"../math/vector\";\nexport class SkewbNet {\n constructor() {\n const cubeWidth = 1;\n const centerWidth = Math.sqrt(Math.pow(cubeWidth / 2, 2) * 2);\n const orange = new Group(this.makeStickers(ORANGE, centerWidth, Vector3.fromValues(-cubeWidth, 0, 0)));\n const green = new Group(this.makeStickers(GREEN, centerWidth, Vector3.fromValues(2 * cubeWidth, 0, 0)));\n const white = new Group(this.makeStickers(WHITE, centerWidth, Vector3.fromValues(0, -cubeWidth, 0)));\n const red = new Group(this.makeStickers(RED, centerWidth, Vector3.fromValues(cubeWidth, 0, 0)));\n const yellow = new Group(this.makeStickers(YELLOW, centerWidth, Vector3.fromValues(0, cubeWidth, 0)));\n const blue = new Group(this.makeStickers(BLUE, centerWidth, Vector3.fromValues(0, 0, 0)));\n this.U = yellow;\n this.R = red;\n this.F = blue;\n this.L = orange;\n this.B = green;\n this.D = white;\n this.faces = {\n top: this.U,\n front: this.F,\n right: this.R,\n back: this.B,\n left: this.L,\n bottom: this.D,\n };\n this.stickers = [red, yellow, blue, orange, green, white];\n this.group = new Group(this.stickers);\n this.group.translate(-cubeWidth / 4, 0, 0);\n this.group.scale(0.5, 0.5, 0.5);\n }\n makeStickers(color, width, translate) {\n const center = new Plane(width, width, color);\n center.translate(translate.x, translate.y, translate.z);\n center.rotate(Math.PI / 4, 0, 0, 1);\n center.translate(-width / 2, width / 2, 0);\n const triangles = [];\n for (let i = 0; i < 4; i++) {\n const triangle = new Triangle(Vector3.fromValues(-width / 2, width / 2, 0), Vector3.fromValues(0, width, 0), Vector3.fromValues(width / 2, width / 2, 0), color);\n triangle.translate(translate.x, translate.y, translate.z);\n triangle.rotate((-Math.PI / 2) * i, 0, 0, 1);\n triangle.rotate(Math.PI / 4, 0, 0, 1);\n triangles.push(triangle);\n }\n return [center, ...triangles];\n }\n setColors(colors) {\n let { top, right, front, bottom, left, back } = colors;\n this.setFaceColors(this.U, top);\n this.setFaceColors(this.R, right);\n this.setFaceColors(this.F, front);\n this.setFaceColors(this.D, bottom);\n this.setFaceColors(this.L, left);\n this.setFaceColors(this.B, back);\n }\n setFaceColors(faceStickers, colors = []) {\n faceStickers.objects[0].faces[0].color = colors[0] || BLACK;\n faceStickers.objects[1].faces[0].color = colors[1] || BLACK;\n faceStickers.objects[2].faces[0].color = colors[2] || BLACK;\n faceStickers.objects[3].faces[0].color = colors[4] || BLACK; // Setting 3 -> 4 and 4 -> 3 now because 4 and 3 are stored incorrectly in this class.\n faceStickers.objects[4].faces[0].color = colors[3] || BLACK;\n }\n}\n","import { RED, YELLOW, BLUE, ORANGE, GREEN, WHITE, BLACK } from \"./colors\";\nimport { Group } from \"../geometry/group\";\nimport { Plane } from \"../geometry/plane\";\nimport { Triangle } from \"../geometry/triangle\";\nimport { Vector3 } from \"../math/vector\";\nexport class Skewb {\n constructor() {\n const cubeWidth = 1.25;\n const centerWidth = Math.sqrt(Math.pow(cubeWidth / 2, 2) * 2);\n const halfWidth = cubeWidth / 2;\n const red = new Group(this.makeStickers(RED, centerWidth));\n const yellow = new Group(this.makeStickers(YELLOW, centerWidth, Vector3.fromValues(1, 0, 0)));\n const blue = new Group(this.makeStickers(BLUE, centerWidth, Vector3.fromValues(0, 1, 0)));\n const orange = new Group(this.makeStickers(ORANGE, centerWidth));\n const green = new Group(this.makeStickers(GREEN, centerWidth, Vector3.fromValues(0, 1, 0)));\n const white = new Group(this.makeStickers(WHITE, centerWidth, Vector3.fromValues(1, 0, 0)));\n this.U = yellow;\n this.R = red;\n this.F = blue;\n this.L = orange;\n this.B = green;\n this.D = white;\n this.faces = {\n top: this.U,\n front: this.F,\n right: this.R,\n back: this.B,\n left: this.L,\n bottom: this.D,\n };\n red.translate(0, 0, halfWidth);\n red.rotate(Math.PI, 1, 0, 0);\n red.rotate(Math.PI / 2, 0, 0, 1);\n orange.rotate(-Math.PI / 2, 0, 0, 1);\n orange.translate(0, 0, -halfWidth);\n blue.rotate(-Math.PI / 2, 1, 0, 0);\n blue.translate(-halfWidth, 0, 0);\n green.translate(halfWidth, 0, 0);\n green.rotate(Math.PI, 0, 1, 0);\n green.rotate(-Math.PI / 2, 1, 0, 0);\n yellow.rotate(Math.PI, 0, 1, 0);\n yellow.translate(0, halfWidth, 0);\n white.translate(0, -halfWidth, 0);\n white.rotate(Math.PI, 1, 0, 0);\n this.stickers = [red, yellow, blue, orange, green, white];\n this.group = new Group(this.stickers);\n }\n makeStickers(color, width, axis) {\n const center = new Plane(width, width, color);\n if (axis) {\n center.rotate(Math.PI / 2, axis.x, axis.y, axis.z);\n }\n center.rotate(Math.PI / 4, 0, 0, 1);\n center.translate(-width / 2, width / 2, 0);\n const triangles = [];\n for (let i = 0; i < 4; i++) {\n const triangle = new Triangle(Vector3.fromValues(-width / 2, width / 2, 0), Vector3.fromValues(0, width, 0), Vector3.fromValues(width / 2, width / 2, 0), color);\n if (axis) {\n triangle.rotate(Math.PI / 2, axis.x, axis.y, axis.z);\n }\n triangle.rotate((Math.PI / 2) * i, 0, 0, 1);\n triangle.rotate(Math.PI / 4, 0, 0, 1);\n triangles.push(triangle);\n }\n return [center, ...triangles];\n }\n setColors(colors) {\n let { top, right, front, bottom, left, back } = colors;\n this.setFaceColors(this.U, top);\n this.setFaceColors(this.R, right);\n this.setFaceColors(this.F, front);\n this.setFaceColors(this.D, bottom);\n this.setFaceColors(this.L, left);\n this.setFaceColors(this.B, back);\n }\n setFaceColors(faceStickers, colors = []) {\n faceStickers.objects[0].faces[0].color = colors[0] || BLACK;\n faceStickers.objects[1].faces[0].color = colors[1] || BLACK;\n faceStickers.objects[2].faces[0].color = colors[2] || BLACK;\n faceStickers.objects[3].faces[0].color = colors[4] || BLACK; // Setting 3 -> 4 and 4 -> 3 now because 4 and 3 are stored incorrectly in this class.\n faceStickers.objects[4].faces[0].color = colors[3] || BLACK;\n }\n}\n","import { Face } from \"./face\";\nimport { Geometry } from \"./geometry\";\nimport { SQRT_3 } from \"../math/constants\";\nimport { Vector3 } from \"../math/vector\";\n/**\n * Geometry to build a triangle lattice for the\n * pyraminx puzzle\n */\nexport class TriangleLattice extends Geometry {\n constructor(base, size, color) {\n const halfBase = base / 2;\n const fullHeight = base * (SQRT_3 / 2);\n const triangleBase = base / size;\n const triangleHeight = fullHeight / size;\n const inradius = fullHeight / 3;\n let vertices = [];\n let faces = [];\n /**\n * Builds one layer of verticies at a time\n * for each layer after the first it constructs\n * faces for the triangles (0,1,4), (1,2,5) etc...\n *\n * 9\n * 7 8\n * 4 5 6\n * 0 1 2 3\n */\n let index = 0;\n for (let layer = 0; layer <= size; layer++) {\n for (let vertex = 0, count = size - layer; vertex <= count; vertex++) {\n const horizontalOffset = -halfBase;\n const verticalOffset = -inradius;\n const x = triangleBase * vertex + (layer * triangleBase) / 2 + horizontalOffset;\n const y = triangleHeight * layer + verticalOffset;\n vertices.push(Vector3.fromValues(x, y, 0));\n if (layer > 0) {\n // down triangle\n if (vertex > 0) {\n faces.push(new Face([index, index - 1, index - count - 2], null, color));\n }\n // up triangle\n faces.push(new Face([index, index - count - 2, index - count - 1], null, color));\n }\n index++;\n }\n }\n faces.forEach((face) => face.calculateCentroid(vertices));\n super(vertices, faces);\n }\n}\n","import { GREEN, RED, BLUE, YELLOW, BLACK } from \"./colors\";\nimport { TriangleLattice } from \"./../geometry/triangleLattice\";\nimport { Group } from \"./../geometry/group\";\nimport { SQRT_3 } from \"../math/constants\";\nconst DEG_60_RADIANS = (60 * Math.PI) / 180;\nexport class PyraminxNet {\n constructor(size, sideLength = 0.925) {\n this.size = size;\n const fullHeight = sideLength * (SQRT_3 / 2);\n const inDiameter = fullHeight / 1.5;\n const faceSpacing = inDiameter * 0.1;\n const U = new TriangleLattice(sideLength, size, YELLOW);\n const R = new TriangleLattice(sideLength, size, GREEN);\n const L = new TriangleLattice(sideLength, size, BLUE);\n const B = new TriangleLattice(sideLength, size, RED);\n this.L = L;\n this.R = R;\n this.U = U;\n this.B = B;\n R.rotate(-DEG_60_RADIANS, 0, 0, 1);\n R.translate(0, inDiameter + faceSpacing, 0);\n R.rotate(2 * DEG_60_RADIANS, 0, 0, 1);\n U.rotate(DEG_60_RADIANS, 0, 0, 1);\n U.translate(0, inDiameter + faceSpacing, 0);\n U.rotate(-2 * DEG_60_RADIANS, 0, 0, 1);\n B.rotate(3 * DEG_60_RADIANS, 0, 0, 1);\n B.translate(0, inDiameter + faceSpacing, 0);\n B.rotate(-2 * DEG_60_RADIANS, 0, 0, 1);\n this.faces = {\n top: this.U,\n right: this.R,\n left: this.L,\n back: this.B,\n };\n this.group = new Group([U, R, L, B]);\n }\n setColors(colors) {\n let { left, right, top, back } = colors;\n this.setFaceColors(this.L, left);\n this.setFaceColors(this.R, right);\n this.setFaceColors(this.U, top);\n this.setFaceColors(this.B, back);\n }\n setFaceColors(lattice, colors) {\n lattice.faces.forEach((f, i) => {\n if (colors && colors[i]) {\n f.color = colors[i];\n }\n else {\n f.color = BLACK;\n }\n });\n }\n}\n","import { GREEN, RED, BLUE, YELLOW, BLACK } from \"./colors\";\nimport { TriangleLattice } from \"./../geometry/triangleLattice\";\nimport { Group } from \"./../geometry/group\";\nconst ARC_COS_THIRD = Math.acos(1 / 3);\nconst DEG_120_RADIANS = (120 * Math.PI) / 180;\nconst SQRT_24 = Math.sqrt(24);\nexport class Pyraminx {\n constructor(size, sideLength = 1.75) {\n this.size = size;\n const insphereRadius = sideLength / SQRT_24;\n const U = new TriangleLattice(sideLength, size, YELLOW);\n const R = new TriangleLattice(sideLength, size, GREEN);\n const L = new TriangleLattice(sideLength, size, BLUE);\n const B = new TriangleLattice(sideLength, size, RED);\n this.L = L;\n this.R = R;\n this.U = U;\n this.B = B;\n U.rotate(DEG_120_RADIANS, 0, 0, 1);\n U.rotate(ARC_COS_THIRD, 1, 0, 0);\n U.translate(0, 0, insphereRadius);\n R.rotate(ARC_COS_THIRD, 1, 0, 0);\n R.translate(0, 0, insphereRadius);\n L.rotate(-DEG_120_RADIANS, 0, 0, 1);\n L.rotate(ARC_COS_THIRD, 1, 0, 0);\n L.translate(0, 0, insphereRadius);\n B.rotate(Math.PI, 0, 1, 0);\n B.translate(0, 0, insphereRadius);\n this.faces = {\n top: this.U,\n right: this.R,\n left: this.L,\n back: this.B,\n };\n this.group = new Group([U, L, R, B]);\n }\n setColors(colors) {\n let { left, right, top, back } = colors;\n this.setFaceColors(this.L, left);\n this.setFaceColors(this.R, right);\n this.setFaceColors(this.U, top);\n this.setFaceColors(this.B, back);\n }\n setFaceColors(lattice, colors) {\n lattice.faces.forEach((f, i) => {\n if (colors && colors[i]) {\n f.color = colors[i];\n }\n else {\n f.color = BLACK;\n }\n });\n }\n}\n","import { Face } from \"./../geometry/face\";\nimport { Geometry } from \"../geometry/geometry\";\nimport { polarToCartesian, lineSegmentLength, pentagonOutRadius, } from \"../math/utils\";\nimport { Vector2, Vector3 } from \"../math/vector\";\nexport class DividedPentagon extends Geometry {\n /**\n *\n * @param color\n * @param layers number of layers\n * @param length length of entire edge of the outer pentagon\n */\n constructor(color, layers = 2, length = 1.6, layerWidth = 0.4 // TODO: calculate this somehow\n ) {\n const outRadius = pentagonOutRadius(length);\n const radiusDiff = layerWidthToRadiusDiff(layerWidth);\n const centerOutRadius = outRadius - radiusDiff * (layers - 1);\n const vertices = faceVerticies(layers, centerOutRadius, radiusDiff, layerWidth);\n super(vertices, makeFaces(layers, color, vertices));\n }\n}\n/**\n * Given the the distance between two parallel sides of the\n * dividen pentagon, calculate the difference in pentagon radius\n */\nfunction layerWidthToRadiusDiff(width) {\n const aSquared = width * width;\n const angleRadians = (71 * Math.PI) / 180;\n // Law of cosines\n const cSquared = 2 * aSquared - 2 * aSquared * Math.cos(angleRadians);\n const diff = 2 * Math.sqrt(Math.abs(aSquared - cSquared));\n return diff;\n}\n/**\n * creates mapping for indicies in one layer to another\n * so we can build the geometry for a megaminx face\n */\nfunction downMapping(layer) {\n if (layer < 1) {\n return [];\n }\n let mapping = [];\n const layerPoints = 5 + (layer - 1) * 10;\n let previousPoints = 5 * (layer - 1) * (layer - 1);\n for (let i = 0; i < layerPoints; i++) {\n mapping.push(i + previousPoints);\n if (i % (layerPoints / 5) === 0) {\n mapping.push(i + previousPoints);\n }\n }\n mapping.push(mapping.shift());\n mapping.push(mapping.shift());\n return mapping;\n}\nfunction layerVertexNumbers(layer) {\n let previousPoints = 5 * layer * layer;\n let vertexNumbers = [];\n for (let i = 0, layerPoints = 5 + layer * 10; i < layerPoints; i++) {\n vertexNumbers.push(i + previousPoints);\n }\n return vertexNumbers;\n}\nfunction makeFaces(layers, color, vertices) {\n let faces = [];\n const firstLayerFace = new Face([0, 1, 2, 3, 4], vertices, color);\n faces.push(firstLayerFace);\n let totalPoints = 5;\n let currentPoint = 5;\n for (let i = 1; i < layers; i++) {\n const layerPoints = 5 + i * 10;\n totalPoints += layerPoints;\n const downMap = downMapping(i);\n const prevLayer = layerVertexNumbers(i - 1);\n const currentLayer = layerVertexNumbers(i);\n while (currentPoint < totalPoints) {\n const currentLayerPoint = currentPoint - (prevLayer[prevLayer.length - 1] + 1);\n const f1isCorner = currentLayerPoint % (layerPoints / 5) === 0;\n if (f1isCorner) {\n currentPoint++;\n continue;\n }\n const f2isCorner = (currentLayerPoint + 1) % (layerPoints / 5) === 0;\n let f1 = currentPoint;\n let f2 = currentLayer[(currentLayerPoint + 1) % currentLayer.length];\n let f3 = f2isCorner ? f2 + 1 : downMap.shift();\n let f4 = f2isCorner\n ? downMap.shift()\n : prevLayer[(prevLayer.indexOf(f3) - 1 + prevLayer.length) % prevLayer.length];\n currentPoint++;\n faces.push(new Face([f1, f2, f3, f4], vertices, color));\n }\n }\n return faces;\n}\n/**\n * Takes two points and extrapolates points along the line they make\n *\n * @param p1 point 1\n * @param p2 point 2\n * @param segments how many points to extrapolate from each direction p1 -> p2 and p2 -> p1\n */\nfunction segmentPoints(p1, p2, segments, layerWidth) {\n if (segments === 0) {\n return [\n Vector3.fromValues(p1.x, p1.y, 0),\n Vector3.fromValues(p2.x, p2.y, 0),\n ];\n }\n const length = lineSegmentLength(p1, p2);\n let points = [];\n for (let i = segments; i > 0; i--) {\n // extrapolate from p1.v\n let a = Vector3.fromValues(p1.x + ((p2.x - p1.x) / length) * layerWidth * i, p1.y + ((p2.y - p1.y) / length) * layerWidth * i, 0);\n points.unshift(a);\n // extrapolate from p2.v\n let b = Vector3.fromValues(p2.x + ((p1.x - p2.x) / length) * layerWidth * i, p2.y + ((p1.y - p2.y) / length) * layerWidth * i, 0);\n points.push(b);\n }\n points.unshift(Vector3.fromValues(p1.x, p1.y, 0));\n points.push(Vector3.fromValues(p2.x, p2.y, 0));\n return points;\n}\nfunction layerVerticies(layer, radius, layerWidth) {\n let verticies = [];\n for (let i = 0; i < 5; i++) {\n const theta = (i * (2 * Math.PI)) / 5 - Math.PI / 10;\n const v = polarToCartesian(radius, theta);\n if (verticies.length > 0) {\n const lastPoint = verticies[verticies.length - 1];\n const points = segmentPoints(Vector2.fromValues(lastPoint.x, lastPoint.y), v, layer, layerWidth);\n points.shift(); // Remove the first, otherwise it's duplicated\n verticies = verticies.concat(points);\n }\n else {\n verticies.push(Vector3.fromValues(v.x, v.y, 0));\n }\n }\n // Insert segments for last and first\n const first = verticies[0];\n const last = verticies[verticies.length - 1];\n const points = segmentPoints(Vector2.fromValues(last.x, last.y), Vector2.fromValues(first.x, first.y), layer, layerWidth);\n points.pop();\n points.shift();\n verticies = verticies.concat(points);\n return verticies;\n}\nfunction faceVerticies(layers, radius, radiusDiff, layerWidth) {\n let verticies = [];\n for (let i = 0; i < layers; i++) {\n const r = radius + radiusDiff * i;\n verticies = [...verticies, ...layerVerticies(i, r, layerWidth)];\n }\n return verticies;\n}\n","import { WHITE, RED, GREEN, PURPLE, YELLOW, BLUE, GREY, DARK_BLUE, LIGHT_YELLOW, PINK, LIGHT_GREEN, ORANGE, BLACK, } from \"./colors\";\nimport { Group } from \"./../geometry/group\";\nimport { DividedPentagon } from \"./../geometry/dividedPentagon\";\nimport { pentagonInRadius } from \"../math/utils\";\nimport { chunkArray } from \"../utils/arrays\";\nimport { Matrix4 } from \"../math/matrix\";\nconst DEG_36_RADIANS = (36 * Math.PI) / 180;\nconst DEG_72_RADIANS = (72 * Math.PI) / 180;\n/**\n * for a megaminx with side length 1,\n * layer widths that look good.\n */\nconst OPTIMAL_LAYER_WIDTH = {\n 2: 0.3,\n 3: 0.17,\n 4: 0.121,\n};\nfunction getLayerWidth(length, layers) {\n return OPTIMAL_LAYER_WIDTH[layers] || length / (layers * 1.9);\n}\nexport class MegaminxNet {\n constructor(layers) {\n this.layers = layers;\n const sideLength = 0.75;\n const layerWidth = getLayerWidth(length, layers);\n // Left\n this.U = new DividedPentagon(WHITE, layers, sideLength, layerWidth);\n this.F = new DividedPentagon(RED, layers, sideLength, layerWidth);\n this.R = new DividedPentagon(BLUE, layers, sideLength, layerWidth);\n this.L = new DividedPentagon(GREEN, layers, sideLength, layerWidth);\n this.dl = new DividedPentagon(LIGHT_YELLOW, layers, sideLength, layerWidth);\n this.dr = new DividedPentagon(PINK, layers, sideLength, layerWidth);\n // Right\n this.BL = new DividedPentagon(PURPLE, layers, sideLength, layerWidth);\n this.BR = new DividedPentagon(YELLOW, layers, sideLength, layerWidth);\n this.d = new DividedPentagon(GREY, layers, sideLength, layerWidth);\n this.bl = new DividedPentagon(DARK_BLUE, layers, sideLength, layerWidth);\n this.br = new DividedPentagon(LIGHT_GREEN, layers, sideLength, layerWidth);\n this.b = new DividedPentagon(ORANGE, layers, sideLength, layerWidth);\n const ind = 2 * pentagonInRadius(sideLength);\n // Left\n this.U.translate(0, ind, 0);\n this.U.rotate(5 * DEG_36_RADIANS, 0, 0, 1);\n this.R.rotate(-DEG_72_RADIANS, 0, 0, 1);\n this.R.translate(0, ind, 0);\n this.R.rotate(5 * DEG_36_RADIANS, 0, 0, 1);\n this.L.rotate(DEG_72_RADIANS, 0, 0, 1);\n this.L.translate(0, ind, 0);\n this.L.rotate(-5 * DEG_36_RADIANS, 0, 0, 1);\n this.dl.rotate(2 * DEG_72_RADIANS, 0, 0, 1);\n this.dl.translate(0, ind, 0);\n this.dl.rotate(-5 * DEG_36_RADIANS, 0, 0, 1);\n this.dr.rotate(-2 * DEG_72_RADIANS, 0, 0, 1);\n this.dr.translate(0, ind, 0);\n this.dr.rotate(-5 * DEG_36_RADIANS, 0, 0, 1);\n // Right\n this.b.rotate(Math.PI, 0, 0, 1);\n this.b.rotate(-2 * DEG_36_RADIANS, 0, 0, 1);\n this.d.rotate(3 * DEG_36_RADIANS, 0, 0, 1);\n this.d.translate(0, ind, 0);\n this.d.rotate(5 * DEG_36_RADIANS, 0, 0, 1);\n this.br.rotate(DEG_36_RADIANS, 0, 0, 1);\n this.br.translate(0, ind, 0);\n this.br.rotate(5 * DEG_36_RADIANS, 0, 0, 1);\n this.BR.rotate(-DEG_36_RADIANS, 0, 0, 1);\n this.BR.translate(0, ind, 0);\n this.BR.rotate(-5 * DEG_36_RADIANS, 0, 0, 1);\n this.BL.rotate(-3 * DEG_36_RADIANS, 0, 0, 1);\n this.BL.translate(0, ind, 0);\n this.BL.rotate(5 * DEG_36_RADIANS, 0, 0, 1);\n this.bl.rotate(5 * DEG_36_RADIANS, 0, 0, 1);\n this.bl.translate(0, ind, 0);\n this.bl.rotate(-5 * DEG_36_RADIANS, 0, 0, 1);\n let bottomTransforms = new Matrix4();\n bottomTransforms.rotate(-DEG_72_RADIANS, 0, 0, 1);\n bottomTransforms.translate(0, 2 * ind, 0);\n bottomTransforms.rotate(2 * DEG_72_RADIANS, 0, 0, 1);\n bottomTransforms.translate(0, -ind, 0);\n [this.d, this.bl, this.BL, this.BR, this.br, this.b].forEach((face) => {\n Matrix4.multiply(face.matrix, bottomTransforms, face.matrix);\n });\n this.faces = {\n U: this.U,\n F: this.F,\n R: this.R,\n dr: this.dr,\n dl: this.dl,\n L: this.L,\n d: this.d,\n br: this.br,\n BR: this.BR,\n BL: this.BL,\n bl: this.bl,\n b: this.b,\n };\n this.group = new Group([\n this.U,\n this.F,\n this.L,\n this.dr,\n this.dl,\n this.R,\n this.d,\n this.bl,\n this.BL,\n this.BR,\n this.br,\n this.b,\n ]);\n this.group.scale(0.33, 0.33, 0.33);\n this.group.translate(-1.75 * sideLength, 0, 0);\n }\n setColors(colors) {\n let { U, R, F, d, L, b, dr, dl, br, BR, BL, bl } = colors;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.d, d);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.b, b);\n this.setFaceColors(this.dr, dr);\n this.setFaceColors(this.dl, dl);\n this.setFaceColors(this.BR, BR);\n this.setFaceColors(this.BL, BL);\n this.setFaceColors(this.bl, bl);\n this.setFaceColors(this.br, br);\n }\n oldSetColors(colors) {\n const n = this.layers;\n const numStickers = 5 * n * n - 5 * n + 1;\n let [U, R, F, dr, dl, L, d, br, BR, BL, bl, b] = chunkArray(colors, numStickers);\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.d, d);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.b, b);\n this.setFaceColors(this.dr, dr);\n this.setFaceColors(this.dl, dl);\n this.setFaceColors(this.br, br);\n this.setFaceColors(this.BR, BR);\n this.setFaceColors(this.BL, BL);\n this.setFaceColors(this.bl, bl);\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.faces.forEach((f, i) => {\n if (colors && colors[i]) {\n f.color = colors[i];\n }\n else {\n f.color = BLACK;\n }\n });\n }\n}\n","import { WHITE, RED, GREEN, YELLOW, BLUE, ORANGE, LIGHT_GREEN, PINK, LIGHT_YELLOW, DARK_BLUE, GREY, PURPLE, BLACK, } from \"./colors\";\nimport { Group } from \"./../geometry/group\";\nimport { DividedPentagon } from \"../geometry/dividedPentagon\";\nimport { dodecahedronInRadius } from \"../math/utils\";\nconst OPTIMAL_LAYER_WIDTH = {\n 2: 0.3,\n 3: 0.17,\n 4: 0.121,\n};\nfunction getLayerWidth(length, layers) {\n return OPTIMAL_LAYER_WIDTH[layers] || length / (layers * 1.9);\n}\nexport class Megaminx {\n constructor(layers = 2) {\n this.layers = layers;\n const length = 0.75;\n const megaminxRadius = dodecahedronInRadius(length);\n const layerWidth = getLayerWidth(length, layers);\n // Front\n this.U = new DividedPentagon(WHITE, layers, length, layerWidth);\n this.F = new DividedPentagon(RED, layers, length, layerWidth);\n this.R = new DividedPentagon(BLUE, layers, length, layerWidth);\n this.dr = new DividedPentagon(PINK, layers, length, layerWidth);\n this.dl = new DividedPentagon(LIGHT_YELLOW, layers, length, layerWidth);\n this.L = new DividedPentagon(GREEN, layers, length, layerWidth);\n // Back\n this.d = new DividedPentagon(GREY, layers, length, layerWidth);\n this.br = new DividedPentagon(LIGHT_GREEN, layers, length, layerWidth);\n this.BR = new DividedPentagon(YELLOW, layers, length, layerWidth);\n this.BL = new DividedPentagon(PURPLE, layers, length, layerWidth);\n this.bl = new DividedPentagon(DARK_BLUE, layers, length, layerWidth);\n this.b = new DividedPentagon(ORANGE, layers, length, layerWidth);\n this.F.translate(0, 0, megaminxRadius);\n this.b.rotate(Math.PI, 0, 0, 1);\n this.b.rotate(Math.PI, 0, 1, 0);\n this.b.translate(0, 0, megaminxRadius);\n this.U.rotate(Math.PI, 0, 0, 1);\n this.U.rotate(((180 - 116.57) * Math.PI) / 180, 1, 0, 0);\n this.U.translate(0, 0, megaminxRadius);\n this.L.rotate((72 * Math.PI) / 180, 0, 0, 1);\n this.L.rotate(Math.PI, 0, 0, 1);\n this.L.rotate(((180 - 116.57) * Math.PI) / 180, 1, 0, 0);\n this.L.translate(0, 0, megaminxRadius);\n this.R.rotate((72 * Math.PI) / 180, 0, 0, 1);\n this.R.rotate(Math.PI / 5, 0, 0, 1);\n this.R.rotate(((180 - 116.57) * Math.PI) / 180, 1, 0, 0);\n this.R.translate(0, 0, megaminxRadius);\n this.dr.rotate((72 * Math.PI) / 180, 0, 0, 1);\n this.dr.rotate(-Math.PI / 5, 0, 0, 1);\n this.dr.rotate(((180 - 116.57) * Math.PI) / 180, 1, 0, 0);\n this.dr.translate(0, 0, megaminxRadius);\n this.dl.rotate((72 * Math.PI) / 180, 0, 0, 1);\n this.dl.rotate((-3 * Math.PI) / 5, 0, 0, 1);\n this.dl.rotate(((180 - 116.57) * Math.PI) / 180, 1, 0, 0);\n this.dl.translate(0, 0, megaminxRadius);\n this.BL.rotate(Math.PI / 5, 0, 0, 1);\n this.BL.rotate((-116.57 * Math.PI) / 180, 1, 0, 0);\n this.BL.translate(0, 0, megaminxRadius);\n this.BR.rotate(-Math.PI / 5, 0, 0, 1);\n this.BR.rotate((-116.57 * Math.PI) / 180, 1, 0, 0);\n this.BR.translate(0, 0, megaminxRadius);\n this.bl.rotate((3 * Math.PI) / 5, 0, 0, 1);\n this.bl.rotate((-116.57 * Math.PI) / 180, 1, 0, 0);\n this.bl.translate(0, 0, megaminxRadius);\n this.d.rotate((5 * Math.PI) / 5, 0, 0, 1);\n this.d.rotate((-116.57 * Math.PI) / 180, 1, 0, 0);\n this.d.translate(0, 0, megaminxRadius);\n this.br.rotate((7 * Math.PI) / 5, 0, 0, 1);\n this.br.rotate((-116.57 * Math.PI) / 180, 1, 0, 0);\n this.br.translate(0, 0, megaminxRadius);\n this.stickers = [\n this.U,\n this.F,\n this.R,\n this.dr,\n this.dl,\n this.L,\n this.d,\n this.br,\n this.BR,\n this.BL,\n this.bl,\n this.b,\n ];\n this.faces = {\n U: this.U,\n F: this.F,\n R: this.R,\n dr: this.dr,\n dl: this.dl,\n L: this.L,\n d: this.d,\n br: this.br,\n BR: this.BR,\n BL: this.BL,\n bl: this.bl,\n b: this.b,\n };\n this.group = new Group(this.stickers);\n }\n setColors(colors) {\n let { U, R, F, d, L, b, dr, dl, br, BR, BL, bl } = colors;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.d, d);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.b, b);\n this.setFaceColors(this.dr, dr);\n this.setFaceColors(this.dl, dl);\n this.setFaceColors(this.BR, BR);\n this.setFaceColors(this.BL, BL);\n this.setFaceColors(this.bl, bl);\n this.setFaceColors(this.br, br);\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.faces.forEach((f, i) => {\n if (colors && colors[i]) {\n f.color = colors[i];\n }\n else {\n f.color = BLACK;\n }\n });\n }\n}\n","import { Face } from \"./face\";\nimport { Geometry } from \"./geometry\";\nimport { Vector3 } from \"../math/vector\";\n/**\n * Makes a (size*size) grid of colored planes for the\n * rubiks cube stickers. Indexed from the top\n * left to bottom right. See Below\n *\n * ```\n * 0 1 2\n * 3 4 5\n * 6 7 8\n * ```\n *\n * @param length length of the grid\n * @param size number of elements to segment grid into\n * @param color\n */\nexport function makeGrid(length, size, color) {\n const halfLength = length / 2;\n const elementWidth = length / size;\n const halfElementWidth = elementWidth / 2;\n let stickers = [];\n for (let i = 0; i < size; i++) {\n let vOffset = -(-halfLength + halfElementWidth + elementWidth * i);\n stickers = stickers.concat(makeRow(length, size, color, vOffset));\n }\n return stickers;\n}\n/**\n * Makes a row of planes for the rubiks cube stickers.\n * indexed from left to right\n *\n * 0 1 2\n *\n * @param length length of the row horizontally\n * @param size number of elements to segment row into\n * @param color color\n * @param vOffset vertical offset. places vertices of row vertically offset by this amount from x axis\n */\nexport function makeRow(length, size, color, vOffset = 0) {\n const halfLength = length / 2;\n const elementWidth = length / size;\n const halfElementWidth = elementWidth / 2;\n let stickers = [];\n for (let i = 0; i < size; i++) {\n let hOffset = -halfLength + halfElementWidth + elementWidth * i;\n let vertices = [\n Vector3.fromValues(-halfElementWidth + hOffset, halfElementWidth + vOffset, 0),\n Vector3.fromValues(halfElementWidth + hOffset, halfElementWidth + vOffset, 0),\n Vector3.fromValues(halfElementWidth + hOffset, -halfElementWidth + vOffset, 0),\n Vector3.fromValues(-halfElementWidth + hOffset, -halfElementWidth + vOffset, 0),\n ];\n let faces = [new Face([0, 1, 2, 3], vertices, color)];\n stickers.push(new Geometry(vertices, faces));\n }\n return stickers;\n}\n","import { YELLOW, RED, BLUE, GREEN, ORANGE, BLACK } from \"./../colors\";\nimport { Group } from \"./../../geometry/group\";\nimport { makeGrid, makeRow } from \"./../../geometry/grid\";\nimport { calculateCentroid } from \"../../math/utils\";\nimport { Vector3 } from \"../../math/vector\";\nexport class RubiksCubeTopLayer {\n constructor(size, rotationAngle = Math.PI / 4) {\n this.size = size;\n this.cubeWidth = 1.45;\n this.halfCubeWidth = this.cubeWidth / 2;\n this.stickerWidth = this.cubeWidth / size;\n this.halfStickerWidth = this.stickerWidth / 2;\n this.cubeWidth = this.stickerWidth * size;\n this.U = new Group(makeGrid(this.cubeWidth, this.size, YELLOW));\n this.R = new Group(makeRow(this.cubeWidth, this.size, RED));\n this.F = new Group(makeRow(this.cubeWidth, this.size, BLUE));\n this.B = new Group(makeRow(this.cubeWidth, this.size, GREEN));\n this.L = new Group(makeRow(this.cubeWidth, this.size, ORANGE));\n const borderOffset = this.halfCubeWidth + this.halfStickerWidth;\n this.B.translate(0, borderOffset, 0);\n this.B.rotate(Math.PI, 0, 0, 1);\n this.F.translate(0, -borderOffset, 0);\n this.R.translate(borderOffset, 0, 0);\n this.R.rotate(Math.PI / 2, 0, 0, 1);\n this.L.translate(-borderOffset, 0, 0);\n this.L.rotate(-Math.PI / 2, 0, 0, 1);\n this.rotateBorder(this.F.objects, rotationAngle);\n this.rotateBorder(this.R.objects, rotationAngle);\n this.rotateBorder(this.B.objects, rotationAngle);\n this.rotateBorder(this.L.objects, rotationAngle);\n this.stickers = [this.U, this.R, this.F, this.B, this.L];\n this.group = new Group(this.stickers);\n this.faces = {\n U: this.U,\n R: this.R,\n F: this.F,\n L: this.L,\n B: this.B,\n };\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.objects.forEach((g, i) => {\n if (colors && colors[i]) {\n g.faces[0].color = colors[i];\n }\n else {\n g.faces[0].color = BLACK;\n }\n });\n }\n setColors(colors) {\n let { U, R, F, L, B } = colors;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.B, B);\n }\n /**\n * given a row of stickers centered at 0,0,0\n * rotates each vertex of each sticker around\n * the top of the sticker.\n */\n rotateBorder(stickers, radians) {\n stickers.forEach((sticker) => {\n sticker.vertices = sticker.vertices.map((vertex) => {\n return vertex.rotateX(Vector3.fromValues(0, this.halfStickerWidth, 0), radians);\n });\n sticker.centroid = calculateCentroid(sticker.vertices);\n });\n }\n}\n","import { YELLOW, RED, BLUE, WHITE, ORANGE, GREEN, BLACK } from \"./../colors\";\nimport { Group } from \"./../../geometry/group\";\nimport { makeGrid } from \"../../geometry/grid\";\nexport class RubiksCubeNet {\n constructor(size) {\n const cubeWidth = 1;\n this.size = size;\n const U = makeGrid(cubeWidth, size, YELLOW);\n const R = makeGrid(cubeWidth, size, RED);\n const F = makeGrid(cubeWidth, size, BLUE);\n const D = makeGrid(cubeWidth, size, WHITE);\n const L = makeGrid(cubeWidth, size, ORANGE);\n const B = makeGrid(cubeWidth, size, GREEN);\n this.U = new Group(U);\n this.U.translate(0, cubeWidth, 0);\n this.R = new Group(R);\n this.R.translate(cubeWidth, 0, 0);\n this.F = new Group(F);\n this.D = new Group(D);\n this.D.translate(0, -cubeWidth, 0);\n this.L = new Group(L);\n this.L.translate(-cubeWidth, 0, 0);\n this.B = new Group(B);\n this.B.translate(2 * cubeWidth, 0, 0);\n this.stickers = [this.U, this.R, this.F, this.D, this.L, this.B];\n this.faces = {\n U: this.U,\n R: this.R,\n F: this.F,\n D: this.D,\n L: this.L,\n B: this.B,\n };\n this.group = new Group(this.stickers);\n this.group.translate(-cubeWidth / 4, 0, 0);\n this.group.scale(0.5, 0.5, 0.5);\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.objects.forEach((g, i) => {\n if (colors && colors[i]) {\n g.faces[0].color = colors[i];\n }\n else {\n g.faces[0].color = BLACK;\n }\n });\n }\n setColors(colors) {\n let { U, R, F, D, L, B } = colors;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.D, D);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.B, B);\n }\n}\n","import { YELLOW, RED, BLUE, WHITE, ORANGE, GREEN, BLACK } from \"./../colors\";\nimport { Group } from \"../../geometry/group\";\nimport { makeGrid } from \"../../geometry/grid\";\nexport class RubiksCube {\n constructor(size) {\n this.size = size;\n const cubeWidth = 1.25;\n const halfWidth = cubeWidth / 2;\n this.U = new Group(makeGrid(cubeWidth, size, YELLOW));\n this.R = new Group(makeGrid(cubeWidth, size, RED));\n this.F = new Group(makeGrid(cubeWidth, size, BLUE));\n this.D = new Group(makeGrid(cubeWidth, size, WHITE));\n this.L = new Group(makeGrid(cubeWidth, size, ORANGE));\n this.B = new Group(makeGrid(cubeWidth, size, GREEN));\n this.U.rotate(-Math.PI / 2, 0, 1, 0);\n this.U.rotate(-Math.PI / 2, 1, 0, 0);\n this.U.translate(0, 0, halfWidth);\n this.R.translate(0, 0, halfWidth);\n this.F.rotate(-Math.PI / 2, 0, 1, 0);\n this.F.translate(0, 0, halfWidth);\n this.D.rotate(-Math.PI / 2, 0, 1, 0);\n this.D.rotate(Math.PI / 2, 1, 0, 0);\n this.D.translate(0, 0, halfWidth);\n this.L.rotate(-Math.PI, 0, 1, 0);\n this.L.translate(0, 0, halfWidth);\n this.B.rotate(Math.PI / 2, 0, 1, 0);\n this.B.translate(0, 0, halfWidth);\n this.stickers = [this.U, this.R, this.F, this.D, this.L, this.B];\n this.faces = {\n U: this.U,\n R: this.R,\n F: this.F,\n D: this.D,\n L: this.L,\n B: this.B,\n };\n this.group = new Group(this.stickers);\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.objects.forEach((g, i) => {\n if (colors && colors[i]) {\n g.faces[0].color = colors[i];\n }\n else {\n g.faces[0].color = BLACK;\n }\n });\n }\n setColors(colors) {\n let { U, R, F, D, L, B } = colors;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.D, D);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.B, B);\n }\n}\n","import { calculateCentroid } from \"../math/utils\";\nimport { Object3D } from \"./object3d\";\nexport class Arrow extends Object3D {\n constructor(p1, p2) {\n super();\n this.p1 = p1;\n this.p2 = p2;\n this.centroid = calculateCentroid([p1, p2]);\n }\n}\n","export function applyTransformations(vertex, transforms) {\n let v = vertex.clone();\n transforms.forEach((m, i) => {\n v.transformMat4(m);\n });\n return v;\n}\n","import { Arrow } from \"./../geometry/arrow\";\nimport { Geometry } from \"../geometry/geometry\";\nimport { Group } from \"../geometry/group\";\nimport { applyTransformations } from \"./utils\";\n/**\n * Renderer class to take scene geometry and render it to 2d\n * polygon coordinates.\n *\n * 1. Takes a scene and camera\n * 2. converts the scene 3d geometry to 2d screen geometry based on the camera\n * 3. tries to render each face in order from furthest from camera to closest\n * 4. finally, draws the lines (arrows) over top of everything\n *\n * Implementers need just implement\n * - drawPolygon - a method that draws polygons on some 2d graphics area\n * - drawArrow - a method that draws an arrow\n * - onBeforeRender - do any prep work necessary before rendering a frame\n * - onComplete - handle any final logic\n */\nexport class PolygonRenderer {\n constructor() {\n this.polygons = [];\n this.arrows = [];\n }\n render(scene, camera) {\n this.polygons = [];\n scene.objects.forEach((object) => {\n this.renderObject3D(object, camera, []);\n });\n this.onBeforeRender();\n this.renderPolygons();\n this.renderArrows();\n this.onComplete();\n }\n renderPolygons() {\n this.polygons.sort((a, b) => {\n return a.centroid.z - b.centroid.z;\n });\n this.polygons.forEach((p) => this.drawPolygon(p));\n }\n renderArrows() {\n this.arrows.forEach(({ p1, p2, uid }) => {\n this.drawArrow(p1, p2, uid);\n });\n }\n renderObject3D(object, camera, transformations) {\n if (object instanceof Geometry) {\n this.renderGeometry(object, camera, transformations);\n }\n else if (object instanceof Arrow) {\n this.renderArrow(object, camera, transformations);\n }\n else if (object instanceof Group) {\n let group = object;\n // let sorted = this.sortObjects(group.objects, camera, [\n // group.matrix,\n // ...transformations,\n // ]);\n group.objects.forEach((object) => {\n this.renderObject3D(object, camera, [group.matrix, ...transformations]);\n });\n }\n }\n renderGeometry(object, camera, transformations) {\n // this.sortFaces(object.faces, object, transformations);\n object.faces.forEach((face) => {\n let points = [];\n face.indices\n .map((index) => object.vertices[index])\n .forEach((vertex) => {\n let objectToScreen = [\n object.matrix,\n ...transformations,\n camera.matrix,\n ];\n let screenPoint = applyTransformations(vertex, objectToScreen);\n // Need to flip y to look correct on svg viewbox\n screenPoint.multiply(1, -1, 1);\n points.push(screenPoint);\n });\n this.addPolygon(points, face, object, transformations);\n });\n }\n renderArrow(object, camera, transformations) {\n let objectToScreen = [object.matrix, ...transformations, camera.matrix];\n let p1Screen = applyTransformations(object.p1, objectToScreen);\n let p2Screen = applyTransformations(object.p2, objectToScreen);\n this.arrows.push({ p1: p1Screen, p2: p2Screen, uid: object.uid });\n }\n addPolygon(points, face, object, transformations) {\n this.polygons.push({\n points,\n face,\n object,\n centroid: applyTransformations(face.centroid, [\n object.matrix,\n ...transformations,\n ]),\n });\n }\n sortObjects(objects, camera, transformations) {\n let sorted = [...objects];\n sorted.sort((a, b) => {\n let aToWorld = [a.matrix, ...transformations];\n let bToWorld = [b.matrix, ...transformations];\n let aCentroid = applyTransformations(a.centroid, aToWorld);\n let bCentroid = applyTransformations(b.centroid, bToWorld);\n // TODO actually use camera, currently only sorting by Z\n return aCentroid.z - bCentroid.z;\n });\n return sorted;\n }\n}\n","import { BLACK } from \"../puzzles/colors\";\nexport function createSVGElement(width, height, minx, miny, svgWidth, svgHeight) {\n const svgElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svgElement.setAttributeNS(null, \"width\", width.toString());\n svgElement.setAttributeNS(null, \"height\", height.toString());\n svgElement.setAttributeNS(null, \"viewBox\", `${minx} ${miny} ${svgWidth} ${svgHeight}`);\n svgElement.setAttributeNS(null, \"id\", \"sr-visualizer\");\n return svgElement;\n}\nexport function createPolygonElement(points, color, strokeWidth) {\n const polygon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n updatePolygonElement(polygon, points, color, strokeWidth);\n return polygon;\n}\nexport function createArrowLineElement(start, end, color, strokeWidth) {\n const line = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n let strokeColor = color ? color.value : BLACK.value;\n line.setAttributeNS(null, \"x1\", start.x.toString());\n line.setAttributeNS(null, \"y1\", (-start.y).toString());\n line.setAttributeNS(null, \"x2\", end.x.toString());\n line.setAttributeNS(null, \"y2\", (-end.y).toString());\n line.setAttributeNS(null, \"stroke\", strokeColor);\n line.setAttributeNS(null, \"marker-end\", \"url(#arrowhead)\");\n if (strokeWidth) {\n line.setAttributeNS(null, \"stroke-width\", strokeWidth);\n }\n return line;\n}\nexport function updatePolygonElement(polygon, points, color, strokeWidth) {\n const pointsAttribute = makePointsAttributeValue(points);\n const colorValue = color ? color.value : \"black\";\n const strokeValue = (color && color.stroke) || \"#000000\";\n polygon.setAttributeNS(null, \"points\", pointsAttribute);\n polygon.setAttributeNS(null, \"fill\", colorValue);\n if (strokeWidth) {\n polygon.setAttributeNS(null, \"stroke\", strokeValue);\n polygon.setAttributeNS(null, \"stroke-width\", strokeWidth);\n }\n polygon.setAttributeNS(null, \"stroke-linejoin\", \"round\");\n}\nexport function clearSVG(svg) {\n while (svg.hasChildNodes()) {\n svg.removeChild(svg.lastChild);\n }\n}\nexport function createMarkers(color) {\n const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\n const arrowHeadMarker = document.createElementNS(\"http://www.w3.org/2000/svg\", \"marker\");\n arrowHeadMarker.setAttributeNS(null, \"id\", \"arrowhead\");\n arrowHeadMarker.setAttributeNS(null, \"markerWidth\", \"4\");\n arrowHeadMarker.setAttributeNS(null, \"markerHeight\", \"3.5\");\n arrowHeadMarker.setAttributeNS(null, \"refX\", \"3\");\n arrowHeadMarker.setAttributeNS(null, \"refY\", \"1.75\");\n arrowHeadMarker.setAttributeNS(null, \"orient\", \"auto\");\n const arrowHeadPolygon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n arrowHeadPolygon.setAttributeNS(null, \"points\", \"0 0, 4 1.75, 0 3.5\");\n arrowHeadPolygon.setAttributeNS(null, \"fill\", color.value);\n defs.appendChild(arrowHeadMarker);\n arrowHeadMarker.appendChild(arrowHeadPolygon);\n return defs;\n}\nfunction makePointsAttributeValue(points) {\n return points.reduce((pointString, point) => {\n return `${pointString ? pointString + \" \" : \"\"}${point.x}, ${point.y}`;\n }, \"\");\n}\n","import { BLACK } from \"./../puzzles/colors\";\nimport { PolygonRenderer } from \"./polygonRenderer\";\nimport { createSVGElement, createPolygonElement, updatePolygonElement, createArrowLineElement, createMarkers, } from \"../svg/svg\";\n/**\n * Renderer to draw puzzles using html svg elements\n */\nexport class HtmlSvgRenderer extends PolygonRenderer {\n /**\n * Creates an SVG renderer. This will create it's own html `` element. it's\n * the user's job to add this element to the page.\n *\n * @example\n * ```\n * const renderer = new HtmlSvgRenderer(width, height, minx, miny, svgWidth, svgHeight)\n * document.getElementById('my-element').appendChild(renderer.domElement);\n * ```\n *\n * @param width svg element width in pixels\n * @param height svg element height in pixels\n * @param minx min x for the svg element viewbox\n * @param miny min x for the svg element viewbox\n * @param svgWidth svg viewbox width\n * @param svgHeight svg viewbox height\n */\n constructor(width, height, minx, miny, svgWidth, svgHeight, arrowColor) {\n super();\n this.strokeWidth = \"0.035\";\n this.arrowStrokeWidth = \"0.03\";\n this.polygons = [];\n this.lines = [];\n this.uidToPolygon = {};\n this.uidToLine = {};\n this.arrowColor = arrowColor || BLACK;\n this.domElement = document.createElement(\"div\");\n this.domElement.className = \"svg-renderer\";\n this.svgElement = createSVGElement(width, height, minx, miny, svgWidth, svgHeight);\n const markers = createMarkers(this.arrowColor);\n this.svgElement.appendChild(markers);\n this.domElement.appendChild(this.svgElement);\n }\n onBeforeRender() { }\n drawPolygon({ points, face, object }) {\n if (!this.uidToPolygon[face.uid]) {\n // Create new polygon for a face that hasn't been rendered\n this.uidToPolygon[face.uid] = createPolygonElement(points, face.color || object.color, this.strokeWidth);\n }\n else {\n // Just update existing polygon element\n const polygon = this.uidToPolygon[face.uid];\n updatePolygonElement(polygon, points, face.color || object.color, this.strokeWidth);\n }\n this.svgElement.appendChild(this.uidToPolygon[face.uid]);\n }\n drawArrow(p1Screen, p2Screen, uid) {\n let arrow;\n if (!this.uidToLine[uid]) {\n arrow = createArrowLineElement(p1Screen, p2Screen, this.arrowColor, this.arrowStrokeWidth);\n this.uidToLine[uid] = arrow;\n }\n else {\n arrow = this.uidToLine[uid];\n arrow.setAttributeNS(null, \"x1\", p1Screen[0].toString());\n arrow.setAttributeNS(null, \"y1\", (-p1Screen[1]).toString());\n arrow.setAttributeNS(null, \"x2\", p2Screen[0].toString());\n arrow.setAttributeNS(null, \"y2\", (-p2Screen[1]).toString());\n }\n this.svgElement.appendChild(this.uidToLine[uid]);\n }\n onComplete() { }\n}\n","import { BLACK } from \"../puzzles/colors\";\nimport { PolygonRenderer } from \"./polygonRenderer\";\nexport class HtmlCanvasRenderer extends PolygonRenderer {\n constructor(width, height, lineWidth = 5, arrowColor = BLACK) {\n super();\n this.width = width;\n this.height = height;\n this.lineWidth = lineWidth;\n this.arrowColor = arrowColor;\n this.domElement = document.createElement(\"div\");\n this.domElement.className = \"canvas-renderer\";\n this.canvasElement = document.createElement(\"canvas\");\n this.domElement.appendChild(this.canvasElement);\n this.canvasElement.width = width;\n this.canvasElement.height = height;\n this.ctx = this.canvasElement.getContext(\"2d\");\n }\n /**\n * Visualizer point values will be in range (-.9, .9)\n * Convert these values to canvas points (0, imgSize)\n * using linear interpolation\n *\n * really the camera matrix should be set up properly\n * so we don't have to do this...\n */\n convertRange(n, range) {\n return ((n - -0.9) / (0.9 - -0.9)) * range;\n }\n onBeforeRender() {\n this.ctx.clearRect(0, 0, this.width, this.height);\n }\n drawPolygon(polygon) {\n var _a, _b;\n this.ctx.lineWidth = this.lineWidth;\n this.ctx.lineJoin = \"round\";\n this.ctx.fillStyle = ((_b = (_a = polygon === null || polygon === void 0 ? void 0 : polygon.face) === null || _a === void 0 ? void 0 : _a.color) === null || _b === void 0 ? void 0 : _b.value) || \"#000000\";\n this.ctx.strokeStyle = \"#000000\";\n this.ctx.moveTo(this.convertRange(polygon.points[0].x, this.width), this.convertRange(polygon.points[0].y, this.height));\n this.ctx.beginPath();\n for (let i = 0; i <= polygon.points.length; i++) {\n let point = polygon.points[(i + 1) % polygon.points.length];\n this.ctx.lineTo(this.convertRange(point.x, this.width), this.convertRange(point.y, this.height));\n }\n this.ctx.closePath();\n this.ctx.fill();\n this.ctx.stroke();\n }\n drawArrow(p1, p2, uid) {\n const toX = this.convertRange(p2.x, this.width);\n const toY = this.convertRange(-p2.y, this.height);\n const fromX = this.convertRange(p1.x, this.width);\n const fromY = this.convertRange(-p1.y, this.height);\n const headlen = 20; // length of head in pixels\n const dx = toX - fromX;\n const dy = toY - fromY;\n const angle = Math.atan2(dy, dx);\n this.ctx.strokeStyle = this.arrowColor.value;\n this.ctx.beginPath();\n this.ctx.moveTo(fromX, fromY);\n this.ctx.lineTo(toX, toY);\n this.ctx.lineTo(toX - headlen * Math.cos(angle - Math.PI / 6), toY - headlen * Math.sin(angle - Math.PI / 6));\n this.ctx.moveTo(toX, toY);\n this.ctx.lineTo(toX - headlen * Math.cos(angle + Math.PI / 6), toY - headlen * Math.sin(angle + Math.PI / 6));\n this.ctx.stroke();\n }\n setLineWidth(lineWidth) {\n this.lineWidth = lineWidth;\n }\n onComplete() { }\n}\n","import { Matrix4 } from \"../math/matrix\";\nexport class Camera {\n constructor() {\n this.matrix = Matrix4.perspective(Math.PI / 2, 1, 0.1, 1000);\n this.matrix.translate(0, 0, -5);\n this.matrix.scale(4, 4, 1);\n }\n}\n","export class Scene {\n constructor() {\n this.objects = [];\n }\n add(geometry) {\n this.objects.push(geometry);\n }\n clear() {\n this.objects = [];\n }\n}\n","export var VisualizerType;\n(function (VisualizerType) {\n VisualizerType[\"CUBE\"] = \"cube\";\n VisualizerType[\"CUBE_NET\"] = \"cube-net\";\n VisualizerType[\"CUBE_TOP\"] = \"cube-top\";\n VisualizerType[\"MEGAMINX\"] = \"megaminx\";\n VisualizerType[\"MEGAMINX_NET\"] = \"megaminx-net\";\n VisualizerType[\"MEGAMINX_TOP\"] = \"megaminx-top\";\n VisualizerType[\"PYRAMINX\"] = \"pyraminx\";\n VisualizerType[\"PYRAMINX_NET\"] = \"pyraminx-net\";\n VisualizerType[\"SKEWB\"] = \"skewb\";\n VisualizerType[\"SKEWB_NET\"] = \"skewb-net\";\n VisualizerType[\"SQUARE1\"] = \"square1\";\n VisualizerType[\"SQUARE1_NET\"] = \"square1-net\";\n})(VisualizerType || (VisualizerType = {}));\n","import { VisualizerType } from \"./enum\";\nimport { RED, YELLOW, BLUE, WHITE, ORANGE, GREEN, PINK, LIGHT_YELLOW, GREY, LIGHT_GREEN, PURPLE, DARK_BLUE, } from \"./../puzzles/colors\";\nimport { DEFAULT_SQ1_SCHEME } from \"../puzzles/square1/constants\";\nexport const defaultCubeOptions = {\n size: 3,\n scheme: {\n U: YELLOW,\n R: RED,\n F: BLUE,\n D: WHITE,\n L: ORANGE,\n B: GREEN,\n },\n rotations: [\n {\n x: 0,\n y: 45,\n z: 0,\n },\n {\n x: 34,\n y: 0,\n z: 0,\n },\n ],\n};\nexport const defaultMegaminxOptions = {\n size: 2,\n scheme: {\n U: WHITE,\n F: RED,\n R: BLUE,\n dr: PINK,\n dl: LIGHT_YELLOW,\n L: GREEN,\n d: GREY,\n br: LIGHT_GREEN,\n BR: YELLOW,\n BL: PURPLE,\n bl: DARK_BLUE,\n b: ORANGE,\n },\n};\nexport const defaultPyraminxOptions = {\n size: 3,\n scheme: {\n left: BLUE,\n right: GREEN,\n top: YELLOW,\n back: RED,\n },\n rotations: [\n {\n x: 0,\n y: 0,\n z: 60,\n },\n {\n x: -60,\n y: 0,\n z: 0,\n },\n ],\n};\nexport const defaultSkewbOptions = {\n scheme: {\n top: YELLOW,\n front: BLUE,\n right: RED,\n back: GREEN,\n left: ORANGE,\n bottom: WHITE,\n },\n rotations: [\n {\n x: 0,\n y: 45,\n z: 0,\n },\n {\n x: 34,\n y: 0,\n z: 0,\n },\n ],\n};\nexport const defaultSquare1Options = {\n scheme: DEFAULT_SQ1_SCHEME,\n rotations: [\n {\n x: 0,\n y: 0,\n z: -34,\n },\n {\n x: -56,\n y: 0,\n z: 0,\n },\n ],\n};\nexport function getDefaultOptions(type) {\n switch (type) {\n case VisualizerType.CUBE:\n return defaultCubeOptions;\n case VisualizerType.CUBE_NET:\n return Object.assign(Object.assign({}, defaultCubeOptions), { rotations: null });\n case VisualizerType.CUBE_TOP:\n return Object.assign(Object.assign({}, defaultCubeOptions), { rotations: null });\n case VisualizerType.MEGAMINX:\n case VisualizerType.MEGAMINX_NET:\n case VisualizerType.MEGAMINX_TOP:\n return defaultMegaminxOptions;\n case VisualizerType.PYRAMINX:\n return defaultPyraminxOptions;\n case VisualizerType.PYRAMINX_NET:\n return Object.assign(Object.assign({}, defaultPyraminxOptions), { rotations: null });\n case VisualizerType.SKEWB:\n return defaultSkewbOptions;\n case VisualizerType.SKEWB_NET:\n return Object.assign(Object.assign({}, defaultSkewbOptions), { rotations: null });\n case VisualizerType.SQUARE1:\n return defaultSquare1Options;\n case VisualizerType.SQUARE1_NET:\n return Object.assign(Object.assign({}, defaultSquare1Options), { rotations: null });\n default:\n throw new Error(`Could not get default options for puzzle ${type}`);\n }\n}\n","import { BLACK } from \"../puzzles/colors\";\nexport function validatePuzzleOptions(options) {\n if (options.alg && typeof options.alg !== \"string\") {\n console.warn(`Inavlid alg ${options.alg}. alg must be a string`);\n options.alg = \"\";\n }\n if (options.case && typeof options.case !== \"string\") {\n console.warn(`Inavlid case ${options.case}. case must be a string`);\n options.case = \"\";\n }\n if (options.scheme) {\n if (typeof options.scheme !== \"object\" || Array.isArray(options.scheme)) {\n console.warn(`Invalid scheme ${options.scheme}. scheme must be an object`);\n options.scheme = {};\n }\n else {\n Object.keys(options.scheme).forEach((face) => {\n const faceColor = options.scheme[face];\n if (faceColor == null ||\n typeof faceColor !== \"object\" ||\n !faceColor.value) {\n console.warn(`Invalid scheme color ${faceColor}. must be an type IColor`);\n options.scheme[face] = BLACK;\n }\n });\n }\n }\n if (options.mask) {\n if (typeof options.mask !== \"object\" || Array.isArray(options.mask)) {\n console.warn(`Invalid mask ${options.mask}. scheme must be an object`);\n options.mask = {};\n }\n else {\n Object.keys(options.mask).forEach((face) => {\n const maskValues = options.mask[face];\n if (!Array.isArray(maskValues)) {\n console.warn(`Invalid mask ${maskValues}. must be an array`);\n options.mask[face] = [];\n }\n else {\n for (let i = 0; i < maskValues.length; i++) {\n if (!Number.isInteger(maskValues[i])) {\n console.warn(`Invalid mask value ${maskValues[i]}. must be a number`);\n options.mask[face] = [];\n break;\n }\n }\n }\n });\n }\n }\n if (options.stickerColors) {\n if (typeof options.stickerColors !== \"object\" ||\n Array.isArray(options.stickerColors)) {\n console.warn(`Invalid stickerColors ${options.stickerColors}. stickerColors must be an object`);\n options.stickerColors = {};\n }\n else {\n Object.keys(options.stickerColors).forEach((face) => {\n const faceColors = options.stickerColors[face];\n if (!Array.isArray(faceColors)) {\n console.warn(`Invalid colors ${faceColors}. must be an array`);\n options.stickerColors[face] = [];\n }\n else {\n for (let i = 0; i < faceColors.length; i++) {\n if (!validColor(faceColors[i])) {\n options.stickerColors[face] = [];\n break;\n }\n }\n }\n });\n }\n }\n if (options.rotations) {\n if (!Array.isArray(options.rotations)) {\n console.warn(`invalid rotations ${options.rotations}, must be an array`);\n options.rotations = [];\n }\n else {\n for (let i = 0; i < options.rotations.length; i++) {\n if (!validRotation(options.rotations[i])) {\n options.rotations = [];\n break;\n }\n }\n }\n }\n if (options.scale && !Number.isFinite(options.scale)) {\n console.warn(`invalid scale ${options.scale}, must be a finite number`);\n options.scale = 1;\n }\n if (options.translation && !validTranslation(options.translation)) {\n options.translation = { x: 0, y: 0, z: 0 };\n }\n if (options.arrows) {\n if (!Array.isArray(options.arrows)) {\n console.warn(`invalid arrows, must be an array`);\n options.arrows = [];\n }\n else {\n for (let i = 0; i < options.arrows.length; i++) {\n if (!validArrow(options.arrows[i])) {\n options.arrows = [];\n break;\n }\n }\n }\n }\n}\nexport function validColor(c) {\n if (typeof c !== \"object\") {\n console.warn(`invalid color ${c}, must be type object`);\n return false;\n }\n if (!c.value || typeof c.value !== \"string\") {\n console.warn(`invalid color value ${c.value}, must be type string`);\n return false;\n }\n if (c.stroke && typeof c.stroke !== \"string\") {\n console.warn(`invalid color stroke ${c.stroke}, must be type string`);\n return false;\n }\n return true;\n}\nfunction validRotation(r) {\n if (!r || typeof r !== \"object\") {\n console.warn(`invalid rotation ${r}, must be an object`);\n return false;\n }\n if (r.x && !Number.isFinite(r.x)) {\n console.warn(`invalid x rotation ${r.x}, must be a number`);\n return false;\n }\n if (r.y && !Number.isFinite(r.y)) {\n console.warn(`invalid y rotation ${r.y}, must be a number`);\n return false;\n }\n if (r.z && !Number.isFinite(r.z)) {\n console.warn(`invalid z rotation ${r.z}, must be a number`);\n return false;\n }\n return true;\n}\nfunction validTranslation(r) {\n if (typeof r !== \"object\" || Array.isArray(r)) {\n console.warn(`invalid translation ${r}, must be an object`);\n return false;\n }\n if (r.x && !Number.isFinite(r.x)) {\n console.warn(`invalid x translation ${r.x}, must be a number`);\n return false;\n }\n if (r.y && !Number.isFinite(r.y)) {\n console.warn(`invalid y translation ${r.y}, must be a number`);\n return false;\n }\n if (r.z && !Number.isFinite(r.z)) {\n console.warn(`invalid z translation ${r.z}, must be a number`);\n return false;\n }\n return true;\n}\nfunction validArrow(a) {\n if (typeof a !== \"object\") {\n console.warn(`invalid arrow ${a}, must be an object`);\n return false;\n }\n if (typeof a.end !== \"object\" || typeof a.start !== \"object\") {\n console.warn(`invalid arrow ${a}, must have start and end`);\n return false;\n }\n if (typeof a.start.face !== \"string\" || !Number.isInteger(a.start.sticker)) {\n console.warn(`invalid arrow start ${a.start}`);\n return false;\n }\n if (typeof a.end.face !== \"string\" || !Number.isInteger(a.end.sticker)) {\n console.warn(`invalid arrow end ${a.end}`);\n return false;\n }\n return true;\n}\n","import { WHITE, RED, BLUE, GREEN, BLACK, YELLOW, PURPLE } from \"./colors\";\nimport { DividedPentagon } from \"./../geometry/dividedPentagon\";\nimport { degreesToRadians, dodecahedronInRadius } from \"../math/utils\";\nimport { Group } from \"../geometry/group\";\nconst OPTIMAL_LAYER_WIDTH = {\n 2: 0.3,\n 3: 0.17,\n 4: 0.121,\n};\nfunction getLayerWidth(length, layers) {\n return OPTIMAL_LAYER_WIDTH[layers] || length / (layers * 1.9);\n}\nexport class MegaminxTop {\n constructor() {\n this.createFaces();\n this.removeHiddenStickers();\n }\n createFaces() {\n const layers = 2;\n const length = 0.75;\n const layerWidth = getLayerWidth(length, layers);\n const megaminxRadius = dodecahedronInRadius(length);\n this.U = new DividedPentagon(WHITE, layers, length, layerWidth);\n this.F = new DividedPentagon(RED, layers, length, layerWidth);\n this.R = new DividedPentagon(BLUE, layers, length, layerWidth);\n this.L = new DividedPentagon(GREEN, layers, length, layerWidth);\n this.BR = new DividedPentagon(YELLOW, layers, length, layerWidth);\n this.BL = new DividedPentagon(PURPLE, layers, length, layerWidth);\n this.F.translate(0, 0, megaminxRadius);\n this.U.rotate(Math.PI, 0, 0, 1);\n this.U.rotate(((180 - 116.57) * Math.PI) / 180, 1, 0, 0);\n this.U.translate(0, 0, megaminxRadius);\n this.L.rotate((72 * Math.PI) / 180, 0, 0, 1);\n this.L.rotate(Math.PI, 0, 0, 1);\n this.L.rotate(((180 - 116.57) * Math.PI) / 180, 1, 0, 0);\n this.L.translate(0, 0, megaminxRadius);\n this.R.rotate((72 * Math.PI) / 180, 0, 0, 1);\n this.R.rotate(Math.PI / 5, 0, 0, 1);\n this.R.rotate(((180 - 116.57) * Math.PI) / 180, 1, 0, 0);\n this.R.translate(0, 0, megaminxRadius);\n this.BL.rotate(Math.PI / 5, 0, 0, 1);\n this.BL.rotate((-116.57 * Math.PI) / 180, 1, 0, 0);\n this.BL.translate(0, 0, megaminxRadius);\n this.BR.rotate(-Math.PI / 5, 0, 0, 1);\n this.BR.rotate((-116.57 * Math.PI) / 180, 1, 0, 0);\n this.BR.translate(0, 0, megaminxRadius);\n this.faces = {\n U: this.U,\n F: this.F,\n R: this.R,\n dr: this.BR,\n dl: this.BL,\n L: this.L,\n };\n this.group = new Group([this.U, this.F, this.R, this.BR, this.BL, this.L]);\n this.group.rotate(degreesToRadians(63), 1, 0, 0);\n }\n setColors(colors) {\n let { U, R, F, L, BR, BL } = colors;\n this.createFaces();\n // If length is larger than we expect for\n // a side of the puzzle, assume we're receiving\n // colors for the entire face of the puzzle. and\n // just take out the the colors for visible stickers\n // if (R.length > 3) {\n // R = R.slice(2, 5);\n // F = F.slice(2, 5);\n // L = L.slice(2, 5);\n // BR = BR.slice(2, 5);\n // BL = BL.slice(2, 5);\n // }\n // this.U.faces[1].color = BLACK;\n // this.R.faces[1].color = BLACK;\n // this.F.faces[1].color = BLACK;\n // this.L.faces[1].color = BLACK;\n // this.BR.faces[1].color = BLACK;\n // this.BL.faces[1].color = BLACK;\n this.setFaceColors(this.U, U);\n this.setFaceColors(this.R, R);\n this.setFaceColors(this.F, F);\n this.setFaceColors(this.L, L);\n this.setFaceColors(this.BR, BR);\n this.setFaceColors(this.BL, BL);\n this.removeHiddenStickers();\n }\n setFaceColors(faceStickers, colors) {\n faceStickers.faces.forEach((f, i) => {\n if (colors && colors[i]) {\n f.color = colors[i];\n }\n else {\n f.color = BLACK;\n }\n });\n }\n /**\n * hide stickers that aren't in the top layer\n * so only the top of the megaminx is shown\n */\n removeHiddenStickers() {\n this.F.faces = this.F.faces.slice(2, 5);\n this.BL.faces = this.BL.faces.slice(8, 11);\n this.L.faces = this.L.faces.slice(4, 7);\n this.R.faces = [this.R.faces[1], this.R.faces[2], this.R.faces[10]];\n this.BR.faces = this.BR.faces.slice(6, 9);\n }\n}\n","import { MegaminxTop } from \"./../puzzles/megaminxTop\";\nimport { RubiksCubeTopLayer } from \"./../puzzles/rubiksCube/rubiksCubeTop\";\nimport { Square1Net } from \"./../puzzles/square1/square1Net\";\nimport { Square1Simualtor } from \"./../simulator/square1/square1Simulator\";\nimport { Square1 } from \"./../puzzles/square1/square1\";\nimport { SkewbNet } from \"./../puzzles/skewbNet\";\nimport { SkewbSimulator } from \"./../simulator/skewb/skewbSimulator\";\nimport { Skewb } from \"./../puzzles/skewb\";\nimport { PyraminxSimulator } from \"./../simulator/pyraminx/pyraminxSimulator\";\nimport { PyraminxNet } from \"./../puzzles/pyraminxNet\";\nimport { MegaminxNet } from \"./../puzzles/megaminxNet\";\nimport { Megaminx } from \"./../puzzles/megaminx\";\nimport { MegaminxSimulator } from \"./../simulator/megaminx/megaminxSimulator\";\nimport { RubiksCubeNet } from \"./../puzzles/rubiksCube/rubiksCubeNet\";\nimport { RubiksCube } from \"../puzzles/rubiksCube/rubiksCube\";\nimport { RubiksCubeSimulator } from \"../simulator/rubiksCube/rubiksCubeSimulator\";\nimport { Pyraminx } from \"../puzzles/pyraminx\";\nimport { VisualizerType } from \"./enum\";\n/**\n * Since puzzle geometry doesn't change for any instance of \"Visuzlier\"\n * we can cache the geometry generated to avoid generating it on each time\n * we render a puzzle\n */\nconst geometryCache = {\n [VisualizerType.CUBE]: {},\n [VisualizerType.CUBE_NET]: {},\n [VisualizerType.CUBE_TOP]: {},\n [VisualizerType.MEGAMINX]: {},\n [VisualizerType.MEGAMINX_NET]: {},\n [VisualizerType.MEGAMINX_TOP]: {},\n [VisualizerType.PYRAMINX]: {},\n [VisualizerType.PYRAMINX_NET]: {},\n [VisualizerType.SKEWB]: {},\n [VisualizerType.SKEWB_NET]: {},\n [VisualizerType.SQUARE1]: {},\n [VisualizerType.SQUARE1_NET]: {},\n};\n/**\n * Creates puzzle geometry for a given puzzle type.\n * Will initialize the geometry on puzzle options\n * passed in\n *\n * @param type Type of the puzzle {@link VisualizerType} (cube, skewb, etc...)\n * @param options Puzzle options {@link PuzzleOptions}\n */\nexport function getPuzzleGeometry(type, options) {\n switch (type) {\n case VisualizerType.CUBE:\n return createCube(options);\n case VisualizerType.CUBE_NET:\n return createCubeNet(options);\n case VisualizerType.CUBE_TOP:\n return createCubeTop(options);\n case VisualizerType.MEGAMINX:\n return createMegaminx(options);\n case VisualizerType.MEGAMINX_NET:\n return createMegaminxNet(options);\n case VisualizerType.MEGAMINX_TOP:\n return createMegaminxTop(options);\n case VisualizerType.PYRAMINX:\n return createPyraminx(options);\n case VisualizerType.PYRAMINX_NET:\n return createPyraminxNet(options);\n case VisualizerType.SKEWB:\n return createSkewb(options);\n case VisualizerType.SKEWB_NET:\n return createSkewbNet(options);\n case VisualizerType.SQUARE1:\n return createSquare1(options);\n case VisualizerType.SQUARE1_NET:\n return createSquare1Net(options);\n }\n}\n/**\n * Returns a puzzle simulator for the type of puzzle\n *\n * @param type\n * @param options\n */\nexport function getPuzzleSimulator(type, options) {\n switch (type) {\n case VisualizerType.CUBE:\n case VisualizerType.CUBE_NET:\n case VisualizerType.CUBE_TOP:\n return new RubiksCubeSimulator(options.size);\n case VisualizerType.MEGAMINX:\n case VisualizerType.MEGAMINX_NET:\n case VisualizerType.MEGAMINX_TOP:\n return new MegaminxSimulator();\n case VisualizerType.PYRAMINX:\n case VisualizerType.PYRAMINX_NET:\n return new PyraminxSimulator();\n case VisualizerType.SKEWB:\n case VisualizerType.SKEWB_NET:\n return new SkewbSimulator();\n case VisualizerType.SQUARE1:\n case VisualizerType.SQUARE1_NET:\n return initSquare1Simulator(options);\n }\n}\nexport function createCube(options = {}) {\n if (!geometryCache[VisualizerType.CUBE][options.size]) {\n geometryCache[VisualizerType.CUBE][options.size] = new RubiksCube(options.size);\n }\n return geometryCache[VisualizerType.CUBE][options.size];\n}\nexport function createCubeNet(options = {}) {\n if (!geometryCache[VisualizerType.CUBE_NET][options.size]) {\n geometryCache[VisualizerType.CUBE_NET][options.size] = new RubiksCubeNet(options.size);\n }\n return geometryCache[VisualizerType.CUBE_NET][options.size];\n}\nexport function createCubeTop(options = {}) {\n if (!geometryCache[VisualizerType.CUBE_TOP][options.size]) {\n geometryCache[VisualizerType.CUBE_TOP][options.size] = new RubiksCubeTopLayer(options.size);\n }\n return geometryCache[VisualizerType.CUBE_TOP][options.size];\n}\nexport function createMegaminx(options = {}) {\n if (!geometryCache[VisualizerType.MEGAMINX][options.size]) {\n geometryCache[VisualizerType.MEGAMINX][options.size] = new Megaminx(options.size);\n }\n return geometryCache[VisualizerType.MEGAMINX][options.size];\n}\nexport function createMegaminxNet(options = {}) {\n if (!geometryCache[VisualizerType.MEGAMINX_NET][options.size]) {\n geometryCache[VisualizerType.MEGAMINX_NET][options.size] = new MegaminxNet(options.size);\n }\n return geometryCache[VisualizerType.MEGAMINX_NET][options.size];\n}\nexport function createMegaminxTop(options = {}) {\n if (!geometryCache[VisualizerType.MEGAMINX_TOP][2]) {\n // megaminx top size not supported, so just cache by size 2\n geometryCache[VisualizerType.MEGAMINX_TOP][2] = new MegaminxTop();\n }\n return geometryCache[VisualizerType.MEGAMINX_TOP][2];\n}\nexport function createPyraminx(options = {}) {\n if (!geometryCache[VisualizerType.PYRAMINX][options.size]) {\n geometryCache[VisualizerType.PYRAMINX][options.size] = new Pyraminx(options.size);\n }\n return geometryCache[VisualizerType.PYRAMINX][options.size];\n}\nexport function createPyraminxNet(options = {}) {\n if (!geometryCache[VisualizerType.PYRAMINX_NET][options.size]) {\n geometryCache[VisualizerType.PYRAMINX_NET][options.size] = new PyraminxNet(options.size);\n }\n return geometryCache[VisualizerType.PYRAMINX_NET][options.size];\n}\nexport function createSkewb(options = {}) {\n if (!geometryCache[VisualizerType.SKEWB][1]) {\n // Skewb size not supported, so just cache by size 1\n geometryCache[VisualizerType.SKEWB][1] = new Skewb();\n }\n return geometryCache[VisualizerType.SKEWB][1];\n}\nexport function createSkewbNet(options = {}) {\n if (!geometryCache[VisualizerType.SKEWB_NET][1]) {\n // Skewb size not supported, so just cache by size 1\n geometryCache[VisualizerType.SKEWB_NET][1] = new SkewbNet();\n }\n return geometryCache[VisualizerType.SKEWB_NET][1];\n}\nexport function createSquare1(options = {}) {\n const simulator = initSquare1Simulator(options);\n const geometry = new Square1(simulator.topLayer, simulator.bottomLayer, simulator.middleRotated);\n return geometry;\n}\nexport function createSquare1Net(options = {}) {\n const simulator = initSquare1Simulator(options);\n const geometry = new Square1Net(simulator.topLayer, simulator.bottomLayer, simulator.middleRotated);\n return geometry;\n}\nfunction initSquare1Simulator(options) {\n const simulator = new Square1Simualtor(options.scheme);\n if (options.case) {\n simulator.case(options.case);\n }\n else if (options.alg) {\n simulator.alg(options.alg);\n }\n return simulator;\n}\n","/**\n * Credit to logic https://github.com/toji/gl-matrix/blob/master/src/quat.js\n */\nexport class Quaternion {\n constructor(a, b, c, d) {\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n }\n static fromEuler(x, y, z) {\n let halfToRad = Math.PI / 360;\n x *= halfToRad;\n z *= halfToRad;\n y *= halfToRad;\n let sx = Math.sin(x);\n let cx = Math.cos(x);\n let sy = Math.sin(y);\n let cy = Math.cos(y);\n let sz = Math.sin(z);\n let cz = Math.cos(z);\n let a = sx * cy * cz - cx * sy * sz;\n let b = cx * sy * cz + sx * cy * sz;\n let c = cx * cy * sz - sx * sy * cz;\n let d = cx * cy * cz + sx * sy * sz;\n return new Quaternion(a, b, c, d);\n }\n}\n","import { Square1 } from \"./../puzzles/square1/square1\";\nimport { Geometry } from \"./../geometry/geometry\";\nimport { Arrow } from \"./../geometry/arrow\";\nimport { getDefaultOptions } from \"./options\";\nimport { MASK_COLOR } from \"./../puzzles/colors\";\nimport { VisualizerType } from \"./enum\";\nimport { validatePuzzleOptions, } from \"./interface\";\nimport { Scene } from \"../rendering/scene\";\nimport { Camera } from \"./../rendering/camera\";\nimport { applyTransformations } from \"../rendering/utils\";\nimport { Group } from \"../geometry/group\";\nimport { getPuzzleGeometry, getPuzzleSimulator } from \"./puzzleCreator\";\nimport { Matrix4 } from \"../math/matrix\";\nimport { Quaternion } from \"../math/quaternion\";\n/**\n * Applies a color scheme to simulator values\n *\n * @param faceValues face values from the simulator\n * @param scheme color scheme to\n */\nfunction applyColorScheme(faceValues, scheme) {\n return Object.keys(faceValues).reduce((colors, face) => {\n colors[face] = faceValues[face].map((value) => scheme[value] || MASK_COLOR);\n return colors;\n }, {});\n}\nfunction isSquare1(type) {\n return type === VisualizerType.SQUARE1 || type === VisualizerType.SQUARE1_NET;\n}\nfunction isPyraminx(type) {\n return (type === VisualizerType.PYRAMINX || type === VisualizerType.PYRAMINX_NET);\n}\nfunction isMegaminx(type) {\n return (type === VisualizerType.MEGAMINX ||\n type === VisualizerType.MEGAMINX_NET ||\n type === VisualizerType.MEGAMINX_TOP);\n}\n/**\n * Return true if we can apply simulator colors. Currently\n * we don't simulate n-layered megaminx/pyraminx.\n */\nfunction canApplySimulatorColors(type, size) {\n if (isPyraminx(type)) {\n return size === 3;\n }\n if (isMegaminx(type)) {\n return size === 2;\n }\n return true;\n}\nfunction createArrow(a, puzzle, group) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n // Get the face the arrow is pointing to\n let startFace = puzzle.faces[a.start.face];\n let endFace = puzzle.faces[a.end.face];\n if (!startFace || !endFace) {\n throw new Error(`Invalid arrow definition ${JSON.stringify(a)}`);\n }\n // Transform from sticker coordinates to group coordinates\n let startTransformations = [\n startFace.matrix,\n puzzle.group.matrix,\n group.matrix,\n ];\n let endTransformations = [endFace.matrix, puzzle.group.matrix, group.matrix];\n let start;\n let end;\n // Get the stickers on the face\n if (startFace instanceof Geometry && endFace instanceof Geometry) {\n start = (_a = startFace.faces[a.start.sticker]) === null || _a === void 0 ? void 0 : _a.centroid;\n end = (_b = endFace.faces[a.end.sticker]) === null || _b === void 0 ? void 0 : _b.centroid;\n }\n else {\n if (puzzle instanceof Square1) {\n start = (_c = startFace.objects[a.start.sticker]) === null || _c === void 0 ? void 0 : _c.faces[0].centroid;\n end = (_d = endFace.objects[a.end.sticker]) === null || _d === void 0 ? void 0 : _d.faces[0].centroid;\n }\n else {\n start = (_e = startFace.objects[a.start.sticker]) === null || _e === void 0 ? void 0 : _e.centroid;\n end = (_f = endFace.objects[a.end.sticker]) === null || _f === void 0 ? void 0 : _f.centroid;\n }\n startTransformations.unshift((_g = startFace.objects[a.start.sticker]) === null || _g === void 0 ? void 0 : _g.matrix);\n endTransformations.unshift((_h = endFace.objects[a.end.sticker]) === null || _h === void 0 ? void 0 : _h.matrix);\n }\n if (!start || !end) {\n throw new Error(`Invalid arrow definition ${JSON.stringify(a)}`);\n }\n let p1 = applyTransformations(start, startTransformations);\n let p2 = applyTransformations(end, endTransformations);\n return new Arrow(p1, p2);\n}\n/**\n * Encapsulates logic for setting up a puzzle environment for rendering\n * images. Sets up puzzle geometry, applies any algorithm or masking\n * if necessary, and renders the puzzle\n */\nexport class Visualizer {\n constructor(renderer, type, options = {}) {\n this.type = type;\n this.camera = new Camera();\n this.scene = new Scene();\n this.group = new Group();\n this.scene.add(this.group);\n this.renderer = renderer;\n this.initPuzzleOptions(options);\n this.puzzleGeometry = getPuzzleGeometry(this.type, this.options);\n this.simulator = getPuzzleSimulator(this.type, this.options);\n this.buildGroupMatrix();\n this.applyColors();\n this.addArrows();\n this.group.addObject(this.puzzleGeometry.group);\n this.render();\n }\n applyColors() {\n const hasCustomColors = this.options.stickerColors && !isSquare1(this.type);\n const canUseSimulator = canApplySimulatorColors(this.type, this.options.size);\n if (hasCustomColors) {\n this.puzzleGeometry.setColors(this.options.stickerColors);\n }\n else if (canUseSimulator) {\n this.applySimulatorColors();\n }\n else {\n // Apply scheme to puzzle geomety manually, for puzzles\n // not supported by simulators (megaminx != 2 pyraminx != 3)\n const faces = this.puzzleGeometry.faces;\n Object.keys(faces).forEach((face) => {\n const stickers = faces[face];\n const faceColor = this.options.scheme[face];\n if (stickers instanceof Geometry) {\n stickers.faces.forEach((f) => (f.color = faceColor));\n }\n else if (stickers instanceof Group) {\n stickers.objects.forEach((o) => (o.color = faceColor));\n }\n });\n }\n }\n applySimulatorColors() {\n if (this.options.mask)\n this.applyMask(this.options);\n if (this.options.alg || this.options.case)\n this.applyAlgorithm();\n const faceValues = this.simulator.getValues();\n const faceColors = applyColorScheme(faceValues, this.options.scheme);\n this.puzzleGeometry.setColors(faceColors);\n }\n applyAlgorithm() {\n if (isSquare1(this.type)) {\n // puzzle factory applies algorithm to square 1 when greating the puzzle geometry\n return;\n }\n if (this.options.case) {\n this.simulator.case(this.options.case);\n }\n else if (this.options.alg) {\n this.simulator.alg(this.options.alg);\n }\n }\n applyMask(options) {\n Object.keys(options.mask).forEach((maskedFace) => {\n options.mask[maskedFace].forEach((index) => this.simulator.setValue(maskedFace, index, \"mask\"));\n });\n }\n /**\n * build the group matrix for the puzzle. This sets up the\n * rotation, scale, and translation for the resulting rendered\n * image.\n */\n buildGroupMatrix() {\n this.group.matrix = new Matrix4();\n // Rotate the group matrix\n if (this.options.rotations) {\n this.options.rotations.forEach((rotation) => {\n const { x = 0, y = 0, z = 0 } = rotation;\n let rotationMatrix = Matrix4.fromQuaternion(Quaternion.fromEuler(x, y, z));\n Matrix4.multiply(this.group.matrix, rotationMatrix, this.group.matrix);\n });\n }\n // Scale the group matrix\n if (this.options.scale) {\n let scale = this.options.scale;\n this.group.matrix.scale(scale, scale, scale);\n }\n // Translate the group matrix\n if (this.options.translation) {\n const { x = 0, y = 0, z = 0 } = this.options.translation;\n let translationMatrix = Matrix4.fromTranslation(x, y, z);\n Matrix4.multiply(this.group.matrix, translationMatrix, this.group.matrix);\n }\n }\n addArrows() {\n if (!this.options.arrows) {\n return;\n }\n this.options.arrows.forEach((arrow) => {\n try {\n this.scene.add(createArrow(arrow, this.puzzleGeometry, this.group));\n }\n catch (e) {\n console.error(e);\n console.warn(`Invalid arrow ${JSON.stringify(arrow)}`);\n }\n });\n }\n initPuzzleOptions(options) {\n this.options = Object.assign(Object.assign({}, getDefaultOptions(this.type)), options);\n validatePuzzleOptions(this.options);\n }\n applyOptionsToPuzzle() {\n this.simulator.reset();\n this.buildGroupMatrix();\n this.applyColors();\n this.addArrows();\n }\n setPuzzleOptions(options) {\n this.initPuzzleOptions(options);\n // Handle square1 geometry separately, since it\n // changes, unlike the other puzzles\n if (isSquare1(this.type)) {\n this.puzzleGeometry = getPuzzleGeometry(this.type, this.options);\n this.group.setObjects([this.puzzleGeometry.group]);\n }\n this.applyOptionsToPuzzle();\n }\n render() {\n this.renderer.render(this.scene, this.camera);\n }\n}\n","import { BLACK, GREY } from \"./../puzzles/colors\";\nimport { Visualizer } from \"./visualizer\";\nimport { HtmlSvgRenderer } from \"../rendering/htmlSvgRenderer\";\nimport { validColor } from \"./interface\";\nconst defaultOptions = {\n width: 500,\n height: 500,\n minx: -0.9,\n miny: -0.9,\n svgWidth: 1.8,\n svgHeight: 1.8,\n strokeWidth: 0.02,\n arrowColor: GREY,\n arrowStrokeWidth: 0.03,\n};\n/**\n * Visualize puzzles with svg in a DOM\n */\nexport function SVG(element, type, options = {}) {\n return new SvgVisualizer(element, type, options);\n}\nexport class SvgVisualizer extends Visualizer {\n constructor(element, type, options = {}) {\n options = Object.assign(Object.assign({}, defaultOptions), options);\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n if (element === null) {\n throw new Error(`Could not find visuzlier element by query selector: ${element}`);\n }\n }\n const renderer = new HtmlSvgRenderer(options.width, options.height, options.minx, options.miny, options.svgWidth, options.svgHeight, options.arrowColor);\n renderer.strokeWidth = \"\" + options.strokeWidth;\n element.appendChild(renderer.domElement);\n super(renderer, type, options.puzzle);\n this.svgOptions = options;\n }\n /**\n * Set the stroke width for the svg elements rendered and re draw the puzzle.\n *\n * @param strokeWidth - value to set the stroke width to. It depends on the svg options and puzzle size,\n * but good values are around .01 - .06\n */\n setStrokeWidth(strokeWidth) {\n this.svgOptions.strokeWidth = strokeWidth;\n this.renderer.strokeWidth =\n \"\" + this.svgOptions.strokeWidth;\n this.render();\n }\n /**\n * Dynamically update the svg element options\n *\n * @param options - options for the svg element that is being rendered to\n */\n setSvgOptions(options) {\n this.svgOptions = Object.assign(Object.assign({}, defaultOptions), options);\n validateSvgOptions(this.svgOptions);\n const renderer = this.renderer;\n const svgElement = renderer.svgElement;\n renderer.strokeWidth = \"\" + this.svgOptions.strokeWidth;\n renderer.arrowStrokeWidth = \"\" + this.svgOptions.arrowStrokeWidth;\n svgElement.setAttributeNS(null, \"width\", this.svgOptions.width.toString());\n svgElement.setAttributeNS(null, \"height\", this.svgOptions.width.toString());\n svgElement.setAttributeNS(null, \"viewBox\", `${this.svgOptions.minx} ${this.svgOptions.miny} ${this.svgOptions.svgWidth} ${this.svgOptions.svgHeight}`);\n this.render();\n }\n}\nfunction validateSvgOptions(options) {\n if (!Number.isInteger(options.width)) {\n console.warn(`invalid svg width ${options.width}. Must be a whole number`);\n options.width = defaultOptions.width;\n }\n if (!Number.isInteger(options.height)) {\n console.warn(`invalid svg height ${options.height}. Must be a whole number`);\n options.width = defaultOptions.height;\n }\n if (!Number.isFinite(options.minx)) {\n console.warn(`invalid svg minx ${options.minx}`);\n options.minx = defaultOptions.minx;\n }\n if (!Number.isFinite(options.miny)) {\n console.warn(`invalid svg miny ${options.miny}`);\n options.minx = defaultOptions.miny;\n }\n if (!Number.isFinite(options.svgWidth)) {\n console.warn(`invalid svgWidth ${options.svgWidth}`);\n options.minx = defaultOptions.svgWidth;\n }\n if (!Number.isFinite(options.svgHeight)) {\n console.warn(`invalid svgHeight ${options.svgHeight}`);\n options.minx = defaultOptions.svgHeight;\n }\n if (!Number.isFinite(options.strokeWidth)) {\n console.warn(`invalid strokeWidth ${options.strokeWidth}`);\n options.minx = defaultOptions.strokeWidth;\n }\n if (!Number.isFinite(options.arrowStrokeWidth)) {\n console.warn(`invalid arrowStrokeWidth ${options.arrowStrokeWidth}`);\n options.minx = defaultOptions.arrowStrokeWidth;\n }\n if (options.arrowColor && !validColor(options.arrowColor)) {\n options.arrowColor = BLACK;\n }\n}\n","import { GREY } from \"./../puzzles/colors\";\nimport { SVG } from \"./svg\";\nconst defaultOptions = {\n width: 500,\n height: 500,\n minx: -0.9,\n miny: -0.9,\n svgWidth: 1.8,\n svgHeight: 1.8,\n strokeWidth: 0.02,\n arrowColor: GREY,\n arrowStrokeWidth: 0.03,\n};\n/**\n * Creates PNG element\n */\nexport function PNG(container, type, options = {}) {\n if (typeof container === \"string\") {\n container = document.querySelector(container);\n if (container === null) {\n throw new Error(`Could not find visuzlier element by query selector: ${container}`);\n }\n }\n let element = document.createElement(\"div\");\n options = Object.assign(Object.assign({}, defaultOptions), options);\n SVG(element, type, options);\n setTimeout(() => {\n let svgElement = element.querySelector(\"svg\");\n let targetImage = document.createElement(\"img\");\n container.appendChild(targetImage);\n let canvas = document.createElement(\"canvas\");\n let ctx = canvas.getContext(\"2d\");\n let loader = new Image();\n loader.width = canvas.width = targetImage.width = options.width;\n loader.height = canvas.height = targetImage.height = options.height;\n loader.onload = function () {\n ctx.drawImage(loader, 0, 0, loader.width, loader.height);\n targetImage.src = canvas.toDataURL();\n };\n var svgAsXML = new XMLSerializer().serializeToString(svgElement);\n loader.src = `data:image/svg+xml,${encodeURIComponent(svgAsXML)}`;\n });\n}\n","import { Visualizer } from \".\";\nimport { HtmlCanvasRenderer } from \"../rendering/htmlCanvasRenderer\";\nimport { GREY } from \"../puzzles/colors\";\nconst defaultOptions = {\n width: 500,\n height: 500,\n lineWidth: 5,\n arrowColor: GREY,\n};\n/**\n * Visualize puzzles with canvas\n */\nexport function Canvas(element, type, options = {}) {\n return new CanvasVisualizer(element, type, options);\n}\nexport class CanvasVisualizer extends Visualizer {\n constructor(element, type, options) {\n options = Object.assign(Object.assign({}, defaultOptions), options);\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n if (element === null) {\n throw new Error(`Could not find visuzlier element by query selector: ${element}`);\n }\n }\n const renderer = new HtmlCanvasRenderer(options.width, options.height, options.lineWidth, options.arrowColor);\n element.appendChild(renderer.domElement);\n super(renderer, type, options.puzzle);\n }\n}\n","export const Masks = {\n CUBE_3: {\n LAST_LAYER: {\n F: [3, 4, 5, 6, 7, 8],\n B: [3, 4, 5, 6, 7, 8],\n R: [3, 4, 5, 6, 7, 8],\n L: [3, 4, 5, 6, 7, 8],\n D: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n F2L: {\n F: [0, 1, 2],\n B: [0, 1, 2],\n R: [0, 1, 2],\n L: [0, 1, 2],\n U: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n FIRST_LAYER: {\n F: [0, 1, 2, 3, 4, 5],\n B: [0, 1, 2, 3, 4, 5],\n R: [0, 1, 2, 3, 4, 5],\n L: [0, 1, 2, 3, 4, 5],\n U: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n OLL: {\n R: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n F: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n D: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n L: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n B: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n CORNERS_LAST_LAYER: {\n U: [1, 3, 5, 7],\n F: [1, 3, 4, 5, 6, 7, 8],\n B: [1, 3, 4, 5, 6, 7, 8],\n R: [1, 3, 4, 5, 6, 7, 8],\n L: [1, 3, 4, 5, 6, 7, 8],\n D: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n EDGES_LAST_LAYER: {\n U: [0, 2, 6, 8],\n F: [0, 2, 3, 4, 5, 6, 7, 8],\n B: [0, 2, 3, 4, 5, 6, 7, 8],\n R: [0, 2, 3, 4, 5, 6, 7, 8],\n L: [0, 2, 3, 4, 5, 6, 7, 8],\n D: [0, 1, 2, 3, 4, 5, 6, 7, 8],\n },\n },\n MEGA_3: {\n OLL: {\n F: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n R: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n L: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n BR: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n BL: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n d: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n b: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n dl: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n dr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n bl: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n br: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n },\n },\n};\n","import { TurnType } from \"./algorithms/algorithm\";\nimport { parseCubeAlgorithm } from \"./algorithms/cube\";\nimport { Square1Simualtor } from \"./simulator/square1/square1Simulator\";\nimport { SkewbSimulator } from \"./simulator/skewb/skewbSimulator\";\nimport { PyraminxSimulator } from \"./simulator/pyraminx/pyraminxSimulator\";\nimport { MegaminxSimulator } from \"./simulator/megaminx/megaminxSimulator\";\nimport { RubiksCubeSimulator } from \"./simulator/rubiksCube/rubiksCubeSimulator\";\nimport { Square1Net } from \"./puzzles/square1/square1Net\";\nimport { Square1 } from \"./puzzles/square1/square1\";\nimport { SkewbNet } from \"./puzzles/skewbNet\";\nimport { Skewb } from \"./puzzles/skewb\";\nimport { PyraminxNet } from \"./puzzles/pyraminxNet\";\nimport { Pyraminx } from \"./puzzles/pyraminx\";\nimport { MegaminxNet } from \"./puzzles/megaminxNet\";\nimport { Megaminx } from \"./puzzles/megaminx\";\nimport { RubiksCubeTopLayer } from \"./puzzles/rubiksCube/rubiksCubeTop\";\nimport { RubiksCubeNet } from \"./puzzles/rubiksCube/rubiksCubeNet\";\nimport { RubiksCube } from \"./puzzles/rubiksCube/rubiksCube\";\nimport { HtmlSvgRenderer } from \"./rendering/htmlSvgRenderer\";\nimport { HtmlCanvasRenderer } from \"./rendering/htmlCanvasRenderer\";\nimport { PolygonRenderer } from \"./rendering/polygonRenderer\";\nimport { Camera } from \"./rendering/camera\";\nimport { Scene } from \"./rendering/scene\";\nimport { parseMegaminxAlgorithm } from \"./algorithms/megaminx\";\nimport { parsePyraminxAlgorithm } from \"./algorithms/pyraminx\";\nimport { parseSkewbAlgorithm } from \"./algorithms/skewb\";\nimport { parseSquare1Algorithm } from \"./algorithms/square1\";\nimport * as Colors_1 from \"./puzzles/colors\";\nexport { Colors_1 as Colors };\nexport * from \"./visualizer\";\nexport * from \"./rendering/renderer\";\nexport const Rendering = {\n Scene,\n Camera,\n HtmlSvgRenderer,\n HtmlCanvasRenderer,\n PolygonRenderer,\n};\nexport const PuzzleGeometry = {\n RubiksCube,\n RubiksCubeNet,\n RubiksCubeTopLayer,\n Megaminx,\n MegaminxNet,\n Pyraminx,\n PyraminxNet,\n Skewb,\n SkewbNet,\n Square1,\n Square1Net,\n};\nexport const Simulator = {\n RubiksCubeSimulator,\n MegaminxSimulator,\n PyraminxSimulator,\n SkewbSimulator,\n Square1Simualtor,\n};\nexport const Algorithm = {\n TurnType,\n parseCubeAlgorithm: parseCubeAlgorithm,\n parseMegaminxAlgorithm: parseMegaminxAlgorithm,\n parsePyraminxAlgorithm: parsePyraminxAlgorithm,\n parseSkewbAlgorithm: parseSkewbAlgorithm,\n parseSquare1Algorithm: parseSquare1Algorithm,\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tif(__webpack_module_cache__[moduleId]) {\n\t\treturn __webpack_module_cache__[moduleId].exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// module exports must be returned from runtime so entry inlining is disabled\n// startup\n// Load entry module and return exports\nreturn __webpack_require__(170);\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index 8b50835..f6bea4a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sr-puzzlegen", - "version": "1.0.3-beta.23", + "version": "1.0.3", "description": "", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts",