let nIndex=6,lIndex=3,mIndex=0,brightnessIndex=1337,speedIndex=50,sampleIndex=32;var buffers,projectionMatrix,viewMatrix,atomProgramInfo,colorPlainProgramInfo,glCanvas,stoppedCheck,cubicCheck,dragging,dragStop,nChooser,mChooser,lChooser,viewChooser,sampleCount,selectText,sliceChooser,animating=!1,zoom3d=.023,sqrt12=Math.sqrt(.5);const SLICE_NONE=0,SLICE_X=1,SLICE_Y=2,SLICE_Z=3;var sliceNormal,selectedSlice,gl,phaseTexture,compiledStates,compiledSliced,sliceval=0,sliceFaces=[];const pi=Math.PI,pi2=2*pi,root2=1.4142135623730951,root2inv=.7071067811865476,root6by4=.6123724356957945,baseEnergy=.155;var autopilotText,distScalar,deltaTimeWithoutSpeed,viewAnimationTimer,autoZooming,rotating,vertexCountWF,explosion,states,stateCount,realBasis,n2l1xBasis,n2l1yBasis,n3l1xBasis,n3l1yBasis,n3l2xBasis,n3l2yBasis,n4l1xBasis,n4l1yBasis,n4l2xBasis,n4l2yBasis,n4l3xBasis,n4l3yBasis,n4l3CubicBasis,spHybridBasis,sp2HybridBasis,sp3HybridBasis,basisList,basisCount,phasorCount,phasors,textCount,textBoxes,selectedState,selectedPhasor,manualScale,changingDerivedStates,bestBrightness,brightnessBar,refresh,deltaV=0,success=!1,zoomRate=0,lastViewFrame="",rotationMatrix=mat4.create(),inverseRotationMatrix=mat4.create(),userBrightMult=1975e-7,time=0;const MODE_ANGLE=0,MODE_ROTATE_X=1,MODE_ROTATE_Y=2,MODE_ROTATE_Z=3,MODE_SLICE=5,VIEW_REAL=0,VIEW_COMPLEX=1,VIEW_COMBO_REAL=2,VIEW_COMBO_COMP=3,VIEW_COMBO_N2L1=4,VIEW_COMBO_N3L1=5,VIEW_COMBO_N3L2=6,VIEW_COMBO_N4L1=7,VIEW_COMBO_N4L2=8,VIEW_COMBO_N4L3=9,VIEW_COMBO_HYBRID=10;var mouseX,mouseY,mouseDown=0,lastOrbitAngle=50;const siderealDay=23.9344696;function vecLength(t){return Math.hypot(t[0],t[1],t[2])}function roundCoef(t){if(Math.abs(t-root2inv)<.001)return"1/&radic;2";if(Math.abs(t+root2inv)<.001)return"-1/&radic;2";if(Math.abs(t-root6by4)<.001)return"&radic;6/4";if(Math.abs(t+root6by4)<.001)return"-&radic;6/4";var e=Math.round(1e3*t)/1e3;return 0==e&&t<0?"-0":e}function round(t){return Math.round(1e3*t)/1e3}function timeString(t){var e="";return t>24&&(e=Math.floor(t/24)+"d ",t%=24),e+=Math.floor(t)+"h "+Math.floor(60*t%60)+"m "+Math.floor(3600*t%60)+"s"}function csInRange(t,e,a){return e<a?t>=e-5&&t<=a+5:t>=a-5&&t<=e+5}function unmap3d(t,e,a,r,o){var i=mat4.create();mat4.invert(i,projectionMatrix);var n,s=[(e-glCanvas.width/2)/(glCanvas.width/2),-(a-glCanvas.height/2)/(glCanvas.height/2),-1,1];for(vec4.transformMat4(s,s,i),n=0;4!=n;n++)s[n]/=s[3];var l=mat4.create();mat4.invert(l,viewMatrix);var c=[0,0,0,1];vec4.transformMat4(c,c,l),vec4.transformMat4(s,s,l);var u=s[0]-c[0],h=s[1]-c[1],m=s[2]-c[2],g=((o[0]-c[0])*r[0]+(o[1]-c[1])*r[1]+(o[2]-c[2])*r[2])/(r[0]*u+r[1]*h+r[2]*m);t[0]=c[0]+u*g,t[1]=c[1]+h*g,t[2]=c[2]+m*g}function addFunctionMouseEvents(t){t.onmousemove=function(e){t.mouseX=e.clientX},t.onmouseout=t.onmouseup=function(e){t.mouseX=0,refresh()}}var lastClick,dragStartTime;function addStatesMouseEvents(t){t.onmousemove=function(e){t.getBoundingClientRect();lastClick=dragStartTime=0},t.onmousedown=function(e){t.getBoundingClientRect();dragging=!0,dragStartTime=(new Date).getTime(),null!=selectedState&&selectedState.set(0)},t.onmouseup=function(t){dragging=changingDerivedStates=dragStop=!1,refresh();var e=(new Date).getTime(),a=e-lastClick;a<500&&a>0&&null!=selectedState&&enterSelectedState(),e-dragStartTime<200&&(lastClick=e)},t.onmouseout=function(t){dragging=changingDerivedStates=dragStop=!1,refresh()},convertTouchEvents(t)}function enterSelectedState(){var t;for(t=0;t!=stateCount;t++)states[t]!=selectedState&&states[t].set(0);selectedState.convertBasisToDerived(),selectedState.set(1),selectedState.convertDerivedToBasis(),createOrbitals(),refresh()}const ST_CHOOSER=1,ST_CHECK=2,ST_SLIDER=3,ST_INPUT=4,stateArgs=["vc",1,"n",1,"l",1,"m",1,"sl",1,"mod",1,"sc",2,"cub",2,"en",2,"lc",2,"rc",2,"pcc",2,"axc",2,"compc",2,"asc",2,"anc",2,"sp",3,"sam",4,"pos",2];function addMouseEvents(t){t.onmousedown=function(t){glCanvas.getBoundingClientRect();mouseDown=1,mouseX=t.clientX,mouseY=t.clientY},t.onmouseup=function(t){mouseDown=0},t.onmousemove=function(t){glCanvas.getBoundingClientRect();if(mouseDown){var e=t.clientX-mouseX,a=t.clientY-mouseY;switch(mouseX=t.clientX,mouseY=t.clientY,MODE_ANGLE){case MODE_ANGLE:var r=mat4.create();mat4.rotate(r,r,.01*e,[0,1,0]),mat4.rotate(r,r,.01*a,[1,0,0]),mat4.multiply(rotationMatrix,r,rotationMatrix);break;case MODE_ROTATE_X:rotateXY((e+a)/40,!0);break;case MODE_ROTATE_Y:rotateXY((e+a)/40,!1);break;case MODE_ROTATE_Z:rotateZ((e+a)/40)}}refresh()},t.addEventListener("wheel",(function(t){zoom3d*=Math.exp(.001*-t.deltaY),zoom3d=Math.min(Math.max(zoom3d,.005),500),manualScale=!0,refresh()})),convertTouchEvents(t)}function convertTouchEvents(t){t.addEventListener("touchstart",(function(e){var a=e.touches[0];e.timeStamp;var r=new MouseEvent("mousedown",{clientX:a.clientX,clientY:a.clientY});e.preventDefault(),t.dispatchEvent(r)}),!1),t.addEventListener("touchend",(function(e){var a=new MouseEvent("mouseup",{});e.preventDefault(),t.dispatchEvent(a)}),!1),t.addEventListener("touchmove",(function(e){var a=e.touches[0],r=new MouseEvent("mousemove",{clientX:a.clientX,clientY:a.clientY});e.preventDefault(),t.dispatchEvent(r)}),!1)}function resizeCanvas(t){var e=t.clientWidth,a=t.clientHeight;return(t.width!=e||t.height!=a)&&(t.width=e,t.height=a,!0)}function radialNorm(t,e){factorial(t+e);return Math.sqrt(4*factorial(t+e)/(t*t*t*t*factorial(t-e-1)))/factorial(2*e+1)}function sphericalNorm(t,e){return Math.sqrt((2*t+1)*factorial(t-e)/(4*pi*factorial(t+e)))}function factorial(t){for(var e=1;t>1;)e*=t--;return e}function confluentHypergeometricFunction(t,e,a){for(var r=1,o=1,i=1;i<=1e3;i++){if(0==(r*=t*a/(i*e)))return o;o+=r,t++,e++}}function confluentHypergeometricFunctionExp(t,e){for(var a=1,r="1.0",o=(a="1.0",1);o<=1e3;o++){if(0==t)return r;r+=" + "+(a+="*"+makeFloatStr(t/(o*e))+"*rho"),t++,e++}}function confluentHypergeometricFunctionExpForNL(t,e){return confluentHypergeometricFunctionExp(e+1-t,2*e+2)}function binomial(t,e){var a,r=1;for(a=0;a!=e;a++)r*=t,t-=1;return r/factorial(e)}function chebyCoef(t){if(0==t)return[1];if(1==t)return[0,1];var e,a=chebyCoef(t-1),r=chebyCoef(t-2),o=[];for(e=0;e<=t;e++){var i=e>=r.length?0:-r[e];e>0&&(i+=2*a[e-1]),o[e]=i}return o}function cheby2Coef(t){var e=t%2==1,a=chebyCoef(t);for(t-=2;t>=0;){var r,o=chebyCoef(t);for(r=0;r!=o.length;r++)a[r]+=o[r];t-=2}for(r=0;r!=a.length;r++)a[r]*=2;return e||(a[0]-=1),a}function getPoly(t,e){var a,r=makeFloatStr(t[0]),o="";for(a=1;a<t.length;a++)0!=t[a]&&(r+=(1==a?"+"+e+"*(":"+"+e+"*"+e+"*(")+makeFloatStr(t[a]),o+=")");return r+o}function makeFloatStr(t){var e=t.toString();return e.indexOf(".")<0&&(e+=".0"),e}function associatedLegendrePolynomial(t,e){var a,r=Math.pow(2,t)+".0*"+evenOddPowExpr("sinth",e)+"*(0.0";for(a=e;a<=t;a++){var o=factorial(a)/factorial(a-e);0!=(o*=binomial(t,a)*binomial((t+a-1)/2,t))&&(r+="+ "+makeFloatStr(o)+"*"+evenOddPowExpr("costh",a-e))}return r+")"}function powExpr(t,e){return 0==e?"(1.0)":1==e?"("+t+")":2==e?"("+t+")*("+t+")":"pow("+t+", "+e+".0)"}function evenOddPowExpr(t,e){return e<3?powExpr(t,e):(e%2==0?"evenpow":"oddpow")+"("+t+", "+e+".0)"}function createPhaseTexture(){phaseTexture=gl.createTexture(),gl.bindTexture(gl.TEXTURE_2D,phaseTexture);const t=gl.RGBA,e=gl.RGBA,a=gl.FLOAT,r=512;var o,i,n=[];for(i=0;512!=i;i++)for(o=0;o!=r;o++){var s=o-256,l=i-256,c=Math.hypot(s,l),u=Math.atan2(l,s);(u*=4/pi)<0&&(u+=6);var h=Math.floor(u),m=u%1,g=1-m,f=Math.hypot(s,l)/c;const t=.4;switch(h){case 6:case 0:n.push(f,f*m,t/2,0);break;case 1:n.push(f*g,f,t/3,0);break;case 2:n.push(t,f,f*m,0);break;case-3:case 3:n.push(t,f*g,f,0);break;case 4:n.push(f*m,t,f,0);break;case 5:n.push(f,t,f*g,0);break;default:console.log("bad hsec "+h)}}const v=new Float32Array(n);gl.texImage2D(gl.TEXTURE_2D,0,t,r,512,0,e,a,v)}function createWhiteTexture(){phaseTexture=gl.createTexture(),gl.bindTexture(gl.TEXTURE_2D,phaseTexture);const t=gl.RGBA,e=gl.RGBA,a=gl.FLOAT,r=512;var o,i,n=[];for(i=0;512!=i;i++)for(o=0;o!=r;o++){var s=o-256,l=i-256,c=Math.hypot(s,l),u=Math.hypot(s,l)/c;n.push(u,u,u,1)}const h=new Float32Array(n);gl.texImage2D(gl.TEXTURE_2D,0,t,r,512,0,e,a,h)}function createAtomProgram(t){var e,a="\n    varying highp vec3 vPosition;\n    uniform highp float uZoom;\n    uniform highp float uBrightness;\n    uniform sampler2D uPhaseTexture;\n    uniform highp vec2 uPhases[PHASECOUNT];\n\n    highp float oddpow(highp float a, highp float b) {\n      return (a < 0.) ? -pow(-a, b) : pow(a, b);\n    }\n\n    highp float evenpow(highp float a, highp float b) {\n      return pow(abs(a), b);\n    }\n  ",r="\n        highp float r = length(v.xyz);\n        highp float xylen = length(vec2(v.x, v.y));\n        highp float cosph = v.x/xylen;\n        highp float sinph = v.y/xylen;\n        highp float sinth = xylen/r;\n        highp float costh = v.z/r;\n        highp vec2 val = vec2(0., 0.);\n        highp float rho = 0.0;\n        // code to calculate orbital(s) is inserted here\nCALCVAL\n        highp float valr = length(val.st);\n        col += vec4(texture2D(uPhaseTexture, vec2(.5, .5)+.4*val/valr).rgb, 1.0)*valr*valr;\n  ",o="\n      col *= uBrightness;\n      col /= max(1.0, max(col.r, max(col.g, col.b)));\n      gl_FragColor = col;\n    }\n  ",i="\n    uniform highp mat4 uRotationMatrix;\n    uniform highp mat4 uAspectMatrix;\n  "+a+"\n\n    void main(void) {\n      highp vec4 col = vec4(0., 0., 0., 1.);\n      highp vec4 pos = uAspectMatrix * vec4(vPosition, 1.);\n      for (highp float z = -1.0; z < 1.0; z += 2./SAMPLECOUNT.) {\n        highp vec4 v = uRotationMatrix * vec4(pos.xy, z, 1.);\n   "+r+"}"+o,n="",s=-1;for(e=0;e!=t.length;e++){var l=t[e],c=l.n,u=l.l,h=l.m;n+="// "+c+","+u+",+/-"+h+"\n",c!=s&&(n+="rho = r*uZoom*"+makeFloatStr(1/c)+";\n",s=c),n+="val += "+radialNorm(c,u)*sphericalNorm(u,h)+"*"+powExpr("rho",u)+"*(",n+=confluentHypergeometricFunctionExpForNL(c,u)+")*exp(-rho/2.)*(",n+=associatedLegendrePolynomial(u,Math.abs(h))+")*(",n+="("+getPoly(chebyCoef(h),"cosph")+")*uPhases["+2*e+"] + ("+(0==h?"0.0":"sinph*("+getPoly(cheby2Coef(h-1),"cosph")+")")+")*uPhases["+(2*e+1)+"]);\n"}var m=i;sampleIndex>0&&(sampleCount=sampleIndex),m=(m=(m=m.replace("CALCVAL",n)).replace("PHASECOUNT",2*t.length)).replace("SAMPLECOUNT",sampleCount);const g=initShaderProgram(gl,"\n    attribute vec4 aVertexPosition;\n    varying highp vec3 vPosition;\n\n    void main(void) {\n      gl_Position = aVertexPosition;\n      vPosition = aVertexPosition.xyz;\n    }\n  ",m);atomProgramInfo={program:g,attribLocations:{vertexPosition:gl.getAttribLocation(g,"aVertexPosition")},uniformLocations:{projectionMatrix:gl.getUniformLocation(g,"uProjectionMatrix"),modelViewMatrix:gl.getUniformLocation(g,"uModelViewMatrix"),rotationMatrix:gl.getUniformLocation(g,"uRotationMatrix"),aspectMatrix:gl.getUniformLocation(g,"uAspectMatrix"),zoom:gl.getUniformLocation(g,"uZoom"),brightness:gl.getUniformLocation(g,"uBrightness"),phaseTexture:gl.getUniformLocation(g,"uPhaseTexture"),phases:gl.getUniformLocation(g,"uPhases")}}}function createShaders(){const t=initShaderProgram(gl,"\n    attribute vec4 aVertexPosition;\n    uniform mat4 uModelViewMatrix;\n    uniform mat4 uProjectionMatrix;\n\n    void main(void) {\n      gl_Position = uProjectionMatrix * uModelViewMatrix * aVertexPosition;\n    }\n  ","\n    uniform highp vec4 uColor;\n\n    void main(void) {\n      gl_FragColor = uColor;\n    }\n  ");colorPlainProgramInfo={program:t,attribLocations:{vertexPosition:gl.getAttribLocation(t,"aVertexPosition")},uniformLocations:{projectionMatrix:gl.getUniformLocation(t,"uProjectionMatrix"),modelViewMatrix:gl.getUniformLocation(t,"uModelViewMatrix"),color:gl.getUniformLocation(t,"uColor")}}}var restarting=!1;function maing(t,e,a,r,o,i){nIndex=t,lIndex=e,mIndex=a,brightnessIndex=r,speedIndex=o,sampleIndex=i,refresh=function(){};const n=glCanvas=document.querySelector("#atomCanvas");if(gl=n.getContext("webgl")){gl.getExtension("OES_texture_float");createShaders(),addMouseEvents(n),createPhaseTexture(),mat4.rotate(rotationMatrix,rotationMatrix,-pi/2,[1,0,0]),setupStates(),setupDisplay(),createOrbitals(),nIndex=6,nChooserChanged(),lIndex=3,lChooserChanged(),buffers=initBuffers(gl);var s=0;requestAnimationFrame(l),animating=!0,refresh=function(){animating||requestAnimationFrame(l)};(function(t){return t.preventDefault(),zoom(-1),!1})}else alert("Unable to initialize WebGL. Your browser or machine may not support it.");function l(t){t*=2e-4;var e=s?t-s:0;s=t,mIndex<0&&!restarting&&(window.location.reload(),restarting=!0),e=Math.min(e,.03),deltaTimeWithoutSpeed=e;var a=speedIndex;e*=a=Math.exp(a/10-5),resizeCanvas(n),gl.viewport(0,0,n.width,n.height);var r=runPhysics(e);drawAtomScene(gl,buffers,e,r),selectText=null,animating?requestAnimationFrame(l):s=0}}function initBuffers(t){return{extra:t.createBuffer()}}function getN(){return nIndex+1}function getL(){return lIndex}function getM(){return mIndex-getL()}function doClear(){var t;for(t=0;t!=stateCount;t++)states[t].set(0)}function normalize(){var t,e=0;for(t=0;t!=stateCount;t++)e+=states[t].magSquared();if(0!=e){var a=1/Math.sqrt(e);for(t=0;t!=stateCount;t++)states[t].mult(a);refresh()}}function maximize(){var t,e=0;for(t=0;t!=stateCount;t++)states[t].mag>e&&(e=states[t].mag);if(0!=e){for(t=0;t!=stateCount;t++)states[t].mult(1/e);refresh()}}function setupDisplay(){var t=[],e=["#potentialView","#statesView","#lView","#l2View","#radialView"],a=t.length;for(t.push("#atomView"),o=0;2!=o;o++)var r=["l","radial"][o];var o,i=[];for(o=0;o!=t.length-1;o++)i.push(15);for(i.splice(a,0,100-15*i.length),o=0;o!=e.length;o++){r=e[o];var n=document.querySelector(r);n&&(n.style.display=t.includes(r)?"block":"none")}}function higherStatesPresent(){var t;for(t=realBasis.altStateCount;t!=stateCount;t++)if(states[t].mag>0)return!0;return!1}function setInitialOrbital(){if(0!=phasorCount){var t;for(t=0;t!=stateCount;t++)if(states[t].mag>0)return;phasors[0].state.set(1),createOrbitals()}}function createBasisPhasors(t,e,a,r,o,i){var n;for(n=0;n!=2*i+1;n++){(phasors[r]=new Phasor(t,e,a,a)).state=getState(o,i,n-i),t+=a,r++}return r}function createAltPhasors(t,e,a,r,o,i,n){var s;for(s=0;s!=i;s++){(phasors[r]=new Phasor(t,e,a,a)).state=o.altStates[s+n],t+=a,r++}return r}const codeLetter=["s","p","d","f","g","h"];function nChooserChanged(){lIndex<nIndex+1&&lIndex>=0&&(lIndex=lIndex),orbitalChanged()}function lChooserChanged(){orbitalChanged()}function viewChanged(){orbitalChanged(),setupDisplay(),setInitialOrbital()}function orbitalChanged(){refresh(),doClear();var t=mIndex;if(0==t)getState(getN(),getL(),0).set(1,0);else{getL(),t--;var e=Math.floor(t/2)+1,a=Math.pow(-1,e);0==(1&t)?(getState(getN(),getL(),e).set(a*root2inv),getState(getN(),getL(),-e).set(root2inv)):(getState(getN(),getL(),e).set(0,-a*root2inv),getState(getN(),getL(),-e).set(0,root2inv))}createOrbitals(),manualScale=!1}function calcLxy(t,e,a,r,o,i){var n,s=Math.floor(e/2);for(n=0;n!=e;n++)t[n]=0;for(i&&(s=1),n=0;n!=basisCount;n++){var l,c=basisList[n];if(0!=c.n&&c.xAxis==o)for(c.convertBasisToDerived(),l=0;l!=c.altStateCount;l++){var u=c.altStates[l];i?t[s+u.m*u.m*r]+=u.magSquared():t[s+u.m*r]+=u.magSquared()}}for(n=0;n!=stateCount;n++)0==states[n].l&&(t[s]+=states[n].magSquared());for(n=0;n!=e;n++)t[n]=Math.sqrt(t[n])}function calcLz(t,e,a,r,o){var i,n=Math.floor(e/2);for(i=0;i!=e;i++)t[i]=0;for(o&&(n=1),i=0;i!=stateCount;i++){var s=states[i];s.l<=a&&(o?t[n+s.m*s.m*r]+=s.magSquared():t[n+s.m*r]+=s.magSquared())}for(i=0;i!=e;i++)t[i]=Math.sqrt(t[i])}function rotateXY(t,e){var a;for(a=0;a!=basisCount;a++){var r;if(0!=(i=basisList[a]).n&&i.xAxis==e)for(i.convertBasisToDerived(),r=0;r!=i.altStateCount;r++){var o=i.altStates[r];o.rotate(t*o.m)}}for(a=0;a!=stateCount;a++)states[a].l>0&&states[a].set(0);for(a=0;a!=basisCount;a++){var i;0!=(i=basisList[a]).n&&i.xAxis==e&&i.convertDerivedToBasis(!1)}createOrbitals(),refresh()}function rotateZ(t){var e;for(e=0;e!=stateCount;e++){var a=states[e];a.rotate(t*a.m)}refresh()}function samplesChanged(){compiledStates=void 0,createOrbitals()}function createOrbitals(){var t,e=!1,a=[];for(t=0;t!=stateCount;t++){var r=states[t];0==r.m?0!=r.mag&&(a.push(r),r.compiled||(e=!0)):r.m>0&&(0==r.mag&&0==getState(r.n,r.l,-r.m).mag||(a.push(r),r.compiled||(e=!0)))}0==a.length&&(a=[getState(1,0,0)]);if(e||null==compiledStates||false!=compiledSliced){for(createAtomProgram(a),compiledStates=a,compiledSliced=false,t=0;t!=stateCount;t++)states[t].compiled=!1;for(t=0;t!=a.length;t++)compiledStates[t].compiled=!0}}function getState(t,e,a){Number.isInteger(t)&&Number.isInteger(e)&&Number.isInteger(a)||console.log("bad arguments to getState: "+t+" "+e+" "+a);var r=t-1;return states[r*(r+1)*(2*r+1)/6+e*e+e+a]}function setupStates(){var t;stateCount=1496,states=[];var e=1,a=0,r=0;for(t=0;t!=stateCount;t++){var o=states[t]=new BasisState;o.elevel=-1/(2*e*e),o.n=e,o.l=a,o.m=r,r<a?r++:++a<e?r=-a:(e++,a=r=0)}basisList=[],basisCount=0;var i=(realBasis=new AlternateBasis).altStateCount=30;for(realBasis.altStates=[],e=1,a=r=0,t=0;t!=i;t++){var n=realBasis.altStates[t]=new DerivedState;if(n.basis=realBasis,0==r)n.count=1,n.bstates=[getState(e,a,0)],n.coefs=[new Complex(1,0)];else{var s=r-1,l=Math.floor(s/2)+1;n.count=2,n.bstates=[],n.bstates[0]=getState(e,a,l),n.bstates[1]=getState(e,a,-l),n.coefs=[];var c=Math.pow(-1,l);0==(1&s)?(n.coefs[0]=new Complex(c*root2inv,0),n.coefs[1]=new Complex(root2inv,0)):(n.coefs[0]=new Complex(0,c*root2inv),n.coefs[1]=new Complex(0,-root2inv))}switch(n.elevel=n.bstates[0].elevel,a){case 0:n.text=e+"s";break;case 1:n.text=e+l1RealText[r];break;case 2:n.text=e+l2RealText[r];break;case 3:n.text=e+l3RealText[r]}r<2*a?r++:++a<e?r=0:(e++,a=r=0)}n2l1xBasis=setupLBasis(2,1,!0,l1xArray),n2l1yBasis=setupLBasis(2,1,!1,l1yArray),n3l1xBasis=setupLBasis(3,1,!0,l1xArray),n3l1yBasis=setupLBasis(3,1,!1,l1yArray),n3l2xBasis=setupLBasis(3,2,!0,l2xArray),n3l2yBasis=setupLBasis(3,2,!1,l2yArray),n4l1xBasis=setupLBasis(4,1,!0,l1xArray),n4l1yBasis=setupLBasis(4,1,!1,l1yArray),n4l2xBasis=setupLBasis(4,2,!0,l2xArray),n4l2yBasis=setupLBasis(4,2,!1,l2yArray),n4l3xBasis=setupLBasis(4,3,!0,l3xArray),n4l3yBasis=setupLBasis(4,3,!1,l3yArray),(n4l3CubicBasis=setupLBasis(4,3,!1,l3CubicArray)).n=0,spHybridBasis=setupHybridBasis(spHybridArray,spHybridText),sp2HybridBasis=setupHybridBasis(sp2HybridArray,sp2HybridText),sp3HybridBasis=setupHybridBasis(sp3HybridArray,sp3HybridText)}function setupLBasis(t,e,a,r){var o=2*e+1,i=new AlternateBasis;i.n=t,i.l=e,i.xAxis=a;var n,s=a?"m<sub>x</sub>":"m<sub>y</sub>";for(i.altStates=[],i.altStateCount=o,n=0;n!=o;n++){var l=i.altStates[n]=new DerivedState;for(l.basis=i,l.count=o,l.bstates=[],l.coefs=[],l.m=n-e,u=0;u!=o;u++)l.bstates[u]=getState(t,e,u-e),l.coefs[u]=new Complex;l.elevel=l.bstates[0].elevel,l.text=r==l3CubicArray?"4"+l3CubicRealText[n]:"n = "+t+", l = "+e+", "+s+" = "+l.m}var c=0;for(n=0;n!=o;n++){var u;for(u=0;u!=o;u++)i.altStates[n].coefs[u].set(r[c],r[c+1]),c+=2}return i}function setupHybridBasis(t,e){var a,r=new AlternateBasis;for(r.altStates=[],r.altStateCount=4,a=0;4!=a;a++){var o=r.altStates[a]=new DerivedState;for(o.basis=r,o.count=4,o.bstates=[],o.coefs=[],o.text=e[a],o.bstates[0]=getState(2,0,0),o.coefs[0]=new Complex,n=0;3!=n;n++)o.bstates[n+1]=getState(2,1,n-1),o.coefs[n+1]=new Complex;o.elevel=o.bstates[0].elevel}var i=0;for(a=0;4!=a;a++){var n;for(n=0;4!=n;n++)r.altStates[a].coefs[n].set(t[i],t[i+1]),i+=2}return r}const l1xArray=[.5,0,-root2inv,0,.5,0,root2inv,0,0,0,-root2inv,0,.5,0,root2inv,0,.5,0],l1yArray=[.5,0,0,-root2inv,-.5,0,0,-root2inv,0,0,0,-root2inv,.5,0,0,root2inv,-.5,0],l2xArray=[1/4,0,-.5,0,root6by4,0,-.5,0,1/4,0,-.5,0,.5,0,0,0,-.5,0,.5,0,root6by4,0,0,0,-.5,0,0,0,root6by4,0,-.5,0,-.5,0,0,0,.5,0,.5,0,1/4,0,.5,0,root6by4,0,.5,0,1/4,0],l2yArray=[1/4,0,0,-.5,-root6by4,0,0,.5,1/4,0,-.5,0,0,.5,0,0,0,.5,.5,0,-root6by4,0,0,0,-.5,0,0,0,-root6by4,0,-.5,0,0,-.5,0,0,0,-.5,.5,0,1/4,0,0,.5,-root6by4,0,0,-.5,1/4,0],l3xArray=[.125,0,-.306186,0,.484123,0,-.559017,0,.484123,0,-.306186,0,.125,0,-.306186,0,.5,0,-.395285,0,0,0,.395285,0,-.5,0,.306186,0,.484123,0,-.395285,0,-.125,0,.433013,0,-.125,0,-.395285,0,.484123,0,.559017,0,0,0,-.433013,0,0,0,.433013,0,0,0,-.559017,0,.484123,0,.395285,0,-.125,0,-.433013,0,-.125,0,.395285,0,.484123,0,-.306186,0,-.5,0,-.395285,0,0,0,.395285,0,.5,0,.306186,0,.125,0,.306186,0,.484123,0,.559017,0,.484123,0,.306186,0,.125,0],l3yArray=[-.125,0,0,.306186,.484123,0,0,-.559017,-.484123,0,0,.306186,.125,0,.306186,0,0,-.5,-.395285,0,0,0,-.395285,0,0,.5,.306186,0,-.484123,0,0,.395285,-.125,0,0,.433013,.125,0,0,.395285,.484123,0,0,.559017,0,0,0,.433013,0,0,0,.433013,0,0,0,.559017,-.484123,0,0,-.395285,-.125,0,0,-.433013,.125,0,0,-.395285,.484123,0,.306186,0,0,.5,-.395285,0,0,0,-.395285,0,0,-.5,.306186,0,-.125,0,0,-.306186,.484123,0,0,.559017,-.484123,0,0,-.306186,.125,0],l3CubicArray=[0,0,0,0,0,0,1,0,0,0,0,0,0,0,.559017,0,0,0,-.433013,0,0,0,.433013,0,0,0,-.559017,0,0,.559017,0,0,0,.433013,0,0,0,.433013,0,0,0,.559017,0,0,root2inv,0,0,0,0,0,0,0,root2inv,0,0,0,0,0,0,-root2inv,0,0,0,0,0,0,0,root2inv,0,0,.433013,0,0,0,.559017,0,0,0,-.559017,0,0,0,-.433013,0,0,.433013,0,0,0,-.559017,0,0,0,-.559017,0,0,0,.433013],spHybridArray=[-root2inv,0,0,0,-root2inv,0,0,0,-root2inv,0,0,0,root2inv,0,0,0,0,0,root2inv,0,0,0,-root2inv,0,0,0,0,-root2inv,0,0,0,-root2inv],sp2HybridArray=[-.57735,0,.57735,0,0,0,-.57735,0,-.57735,0,-.288675,-.5,0,0,.288675,-.5,-.57735,0,-.288675,.5,0,0,.288675,.5,0,0,0,0,1,0,0,0],sp3HybridArray=[-.5,0,-root2inv/2,root2inv/2,-.5,0,root2inv/2,root2inv/2,-.5,0,root2inv/2,-root2inv/2,-.5,0,-root2inv/2,-root2inv/2,-.5,0,root2inv/2,root2inv/2,.5,0,-root2inv/2,root2inv/2,-.5,0,-root2inv/2,-root2inv/2,.5,0,root2inv/2,-root2inv/2],spHybridText=["2sp (1)","2sp (2)","2px","2py"],sp2HybridText=["2sp2 (1)","2sp2 (2)","2sp2 (3)","2pz"],sp3HybridText=["2sp3 (1)","2sp3 (2)","2sp3 (3)","2sp3 (4)"],l1RealText=["pz","px","py"],l2RealText=["dz2","dxz","dyz","d(x2-y2)","dxy"],l3RealText=["fz3","fxz2","fyz2","fz(x2-y2)","fxyz","fx(x2-3y2)","fy(3x2-y2)"],l3CubicRealText=["fz3","fx3","fy3","fz(x2-y2)","fxyz","fx(z2-y2)","fy(z2-x2)"];function isPowerOf2(t){return 0==(t&t-1)}function runPhysics(t){var e;time+=t,zoom3d*=Math.exp(deltaTimeWithoutSpeed*zoomRate);var a=0,r=baseEnergy;for(e=0;e!=stateCount;e++){var o=states[e];o.mag<1e-4?o.set(0):(t>0&&o.rotate(-(o.elevel+r)*t),a+=o.magSquared())}var i=1/a;0==a&&(i=0);var n=Math.sqrt(i),s=changingDerivedStates?selectedState.basis:null;for(e=0;e!=basisCount;e++){var l=basisList[e];l!=s&&l.active&&l.convertBasisToDerived()}return{norm:a,normmult:n,normmult2:i}}function angleDiff(t,e){return t>e&&(t-=2*Math.PI),e-t}function minimumAngleDiff(t,e){var a=Math.abs(t-e)%(2*Math.PI);return a>Math.PI&&(a=2*Math.PI-a),a}function orbitAngle(t){return t.meanAnomaly-t.argumentOfPeriapsis}const minDeltaTime=1e-6;function checkInRange(t,e,a){return t<=e&&e<=a||a<=e&&e<=t}function vectorPerpendicularToPlane(t){var e=mat4.create();mat4.rotate(e,e,-t.longitudeAscendingNode,[0,1,0]),mat4.rotate(e,e,t.inclination,[1,0,0]);var a=[0,1,0];return vec3.transformMat4(a,a,e),a}function drawAtomScene(t,e,a,r){t.clearColor(0,0,0,1),t.clear(t.COLOR_BUFFER_BIT),projectionMatrix=mat4.create();var o=t.canvas.clientWidth/t.canvas.clientHeight,i=Math.atan(o>1?1:1/o);mat4.perspective(projectionMatrix,i,o,.1,100),setScale(),setBrightness(r.normmult2),viewMatrix=mat4.create(),mat4.translate(viewMatrix,viewMatrix,[0,0,-6]),mat4.multiply(viewMatrix,viewMatrix,rotationMatrix);mat4.scale(viewMatrix,viewMatrix,[1.5,1.5,1.5]),mat4.invert(inverseRotationMatrix,rotationMatrix),drawFullAtom(r.normmult)}function setScale(){var t;autoZooming=!1;var e=0;for(t=0;t!=compiledStates.length;t++){var a=compiledStates[t].getScaleRadius();a>e&&(e=a)}var r=27.35/e,o=r-zoom3d,i=Math.exp(3*deltaTimeWithoutSpeed),n=o>0?zoom3d*i:zoom3d/i;Math.sign(o)!=Math.sign(r-n)?zoom3d=r:(zoom3d=n,autoZooming=!0)}function setBrightness(t){var e,a=0,r=1e30;for(e=0;e!=compiledStates.length;e++){var o=compiledStates[e],i=o.getBrightness();i<r&&(r=i);var n=o.magSquared()*t;0!=o.m&&(n+=getState(o.n,o.l,-o.m).magSquared()*t),a+=n,n*i}var s=(bestBrightness=113.9/(Math.sqrt(r)*a))*userBrightMult,l=Math.round(100*Math.log(s));brightnessIndex=l}function getScaler(){var t=gl.canvas.clientWidth/gl.canvas.clientHeight,e=Math.max(1,t);return 20/zoom3d*e/gl.canvas.width}function setupCanvas(t){resizeCanvas(t);var e=t.getContext("2d");return e.fillStyle="black",e.fillRect(0,0,t.width,t.height),e}function drawFullAtom(t){var e,a=[];for(e=0;e!=compiledStates.length;e++){var r=compiledStates[e];if(0==r.m)a.push(r.re,r.im,0,0);else{var o=Math.pow(-1,r.m),i=getState(r.n,r.l,-r.m);a.push(r.re*o+i.re,r.im*o+i.im,-r.im*o+i.im,r.re*o-i.re)}}for(e=0;e!=a.length;e++)a[e]*=t;drawAtom(a)}function drawAtom(t,e){var a=atomProgramInfo;gl.useProgram(a.program);gl.bindBuffer(gl.ARRAY_BUFFER,buffers.extra);const r=mat4.create();var o=gl.canvas.clientWidth/gl.canvas.clientHeight;null!=e&&(o=1,gl.viewport(100*e,0,100,100)),mat4.scale(r,r,[Math.max(1,o),Math.max(1,1/o),1]),gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,0,-1,1,0,1,-1,0,1,1,0]),gl.DYNAMIC_DRAW),gl.vertexAttribPointer(a.attribLocations.vertexPosition,3,gl.FLOAT,!1,0,0),gl.enableVertexAttribArray(a.attribLocations.vertexPosition),gl.uniformMatrix4fv(a.uniformLocations.rotationMatrix,!1,inverseRotationMatrix),gl.uniformMatrix4fv(a.uniformLocations.aspectMatrix,!1,r),gl.uniformMatrix4fv(a.uniformLocations.projectionMatrix,!1,projectionMatrix),gl.uniformMatrix4fv(a.uniformLocations.modelViewMatrix,!1,viewMatrix),gl.uniform1f(a.uniformLocations.zoom,20/zoom3d);var i=brightnessIndex;gl.uniform1f(a.uniformLocations.brightness,Math.exp(i/100)),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,phaseTexture),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST),gl.uniform1i(a.uniformLocations.phaseTexture,0),gl.uniform2fv(a.uniformLocations.phases,t),gl.drawArrays(gl.TRIANGLE_STRIP,0,4),gl.disableVertexAttribArray(a.attribLocations.vertexPosition),gl.disable(gl.BLEND)}function projectCoords(t){var e=vec4.create();return vec3.copy(e,t),e[3]=1,vec4.transformMat4(e,e,viewMatrix),vec4.transformMat4(e,e,projectionMatrix),[glCanvas.width*(.5+.5*e[0]/e[3]),glCanvas.height*(.5-.5*e[1]/e[3])]}function isFrontFacing(t,e,a){var r=[0,0,6,0];return vec4.transformMat4(r,r,inverseRotationMatrix),(t-r[0])*t+(e-r[1])*e+(a-r[2])*a<0}function initShaderProgram(t,e,a){const r=loadShader(t,t.VERTEX_SHADER,e),o=loadShader(t,t.FRAGMENT_SHADER,a),i=t.createProgram();return t.attachShader(i,r),t.attachShader(i,o),t.linkProgram(i),t.getProgramParameter(i,t.LINK_STATUS)?i:(alert("Unable to initialize the shader program: "+t.getProgramInfoLog(i)),null)}function loadShader(t,e,a){const r=t.createShader(e);return t.shaderSource(r,a),t.compileShader(r),t.getShaderParameter(r,t.COMPILE_STATUS)?r:(alert("An error occurred compiling the shaders: "+t.getShaderInfoLog(r)),t.deleteShader(r),null)}function zoom(t){zoomRate=t,0!=t&&(manualScale=!0),refresh()}class Complex{constructor(t,e){null==t?this.re=this.im=this.mag=this.phase=0:this.set(t,e)}magSquared(){return this.mag*this.mag}set(t,e){null==e?isNaN(t)?(this.re=t.re,this.im=t.im,this.mag=t.mag,this.phase=t.phase):(this.re=t,this.im=0,this.updateMagPhase()):(this.re=t,this.im=e,this.updateMagPhase())}add(t,e){if(isNaN(t))return this.re+=t.re,this.im+=t.im,void this.updateMagPhase();this.re+=t,null!=e&&(this.im+=e),this.updateMagPhase()}square(){this.set(this.re*this.re-this.im*this.im,2*this.re*this.im)}mult2(t,e){this.set(this.re*t-this.im*e,this.re*e+this.im*t)}mult(t){isNaN(t)?this.mult2(t.re,t.im):(this.re*=t,this.im*=t,this.mag*=t)}conjugate(){this.im=-this.im,this.phase=-this.phase}updateMagPhase(){this.mag=Math.sqrt(this.re*this.re+this.im*this.im),this.phase=Math.atan2(this.im,this.re)}setMagPhase(t,e){this.mag=t,this.phase=e,this.re=t*Math.cos(e),this.im=t*Math.sin(e)}rotate(t){this.setMagPhase(this.mag,(this.phase+t)%(2*pi))}}class State extends Complex{getScaleRadius(){const t=this.n,e=this.l,a=-t*t*2,r=e*(e+1)*t*t;return.5*(-a+Math.sqrt(a*a-4*r))}getBrightness(){if(0!=this.brightnessCache&&this.brightnessCacheZoom==zoom3d)return this.brightnessCache;var t,e=0,a=0,r=radialNorm(this.n,this.l);const o=20/zoom3d/200,i=this.n,n=this.l;for(t=0;200!=t;t++){var s=2*(t*o)/i,l=Math.pow(s,n)*r,c=confluentHypergeometricFunction(n+1-i,2*n+2,s)*l*Math.exp(-s/2);e+=(c*=c)*c*t*t,a+=t*t}return this.brightnessCache=e/a,this.brightnessCacheZoom=zoom3d,this.brightnessCache}}class BasisState extends State{getText(){return"n = "+this.n+", l = "+this.l+", m = "+this.m}setBasisActive(){}convertDerivedToBasis(){}convertBasisToDerived(){}}class DerivedState extends State{convertDerivedToBasis(){this.basis.convertDerivedToBasis()}convertBasisToDerived(){this.basis.convertBasisToDerived()}setBasisActive(){this.basis.active=!0}getText(){return this.text}}class AlternateBasis{constructor(){basisList[basisCount++]=this}convertDerivedToBasis(t){var e,a;if(0!=t)for(e=0;e!=stateCount;e++)states[e].set(0);var r=new Complex;for(e=0;e!=this.altStateCount;e++){var o=this.altStates[e];for(a=0;a!=o.count;a++)r.set(o.coefs[a]),r.conjugate(),r.mult(o),o.bstates[a].add(r)}var i=0;for(e=0;e!=stateCount;e++)states[e].mag>i&&(i=states[e].mag);if(i>1){var n=1/i;for(e=0;e!=stateCount;e++)states[e].mult(n)}}convertBasisToDerived(){var t,e,a=new Complex,r=new Complex,o=0;for(t=0;t!=this.altStateCount;t++){var i=this.altStates[t];for(a.set(0),e=0;e!=i.count;e++)r.set(i.coefs[e]),r.mult(i.bstates[e]),a.add(r);a.mag<1e-8&&a.set(0),i.set(a),a.mag>o&&(o=i.mag)}if(o>1){var n=1/o;for(t=0;t!=this.altStateCount;t++)this.altStates[t].mult(n)}}}class Phasor{constructor(t,e,a,r){this.x=t,this.y=e,this.width=a,this.height=r}inside(t,e){return t>=this.x&&e>=this.y&&t<this.x+this.width&&e<this.y+this.height}}